sama5d3.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. /*
  2. * Chip-specific setup code for the SAMA5D3 family
  3. *
  4. * Copyright (C) 2013 Atmel,
  5. * 2013 Ludovic Desroches <ludovic.desroches@atmel.com>
  6. *
  7. * Licensed under GPLv2 or later.
  8. */
  9. #include <linux/module.h>
  10. #include <linux/dma-mapping.h>
  11. #include <asm/irq.h>
  12. #include <asm/mach/arch.h>
  13. #include <asm/mach/map.h>
  14. #include <mach/sama5d3.h>
  15. #include <mach/at91_pmc.h>
  16. #include <mach/cpu.h>
  17. #include "soc.h"
  18. #include "generic.h"
  19. #include "clock.h"
  20. #include "sam9_smc.h"
  21. /* --------------------------------------------------------------------
  22. * Clocks
  23. * -------------------------------------------------------------------- */
  24. /*
  25. * The peripheral clocks.
  26. */
  27. static struct clk pioA_clk = {
  28. .name = "pioA_clk",
  29. .pid = SAMA5D3_ID_PIOA,
  30. .type = CLK_TYPE_PERIPHERAL,
  31. };
  32. static struct clk pioB_clk = {
  33. .name = "pioB_clk",
  34. .pid = SAMA5D3_ID_PIOB,
  35. .type = CLK_TYPE_PERIPHERAL,
  36. };
  37. static struct clk pioC_clk = {
  38. .name = "pioC_clk",
  39. .pid = SAMA5D3_ID_PIOC,
  40. .type = CLK_TYPE_PERIPHERAL,
  41. };
  42. static struct clk pioD_clk = {
  43. .name = "pioD_clk",
  44. .pid = SAMA5D3_ID_PIOD,
  45. .type = CLK_TYPE_PERIPHERAL,
  46. };
  47. static struct clk pioE_clk = {
  48. .name = "pioE_clk",
  49. .pid = SAMA5D3_ID_PIOE,
  50. .type = CLK_TYPE_PERIPHERAL,
  51. };
  52. static struct clk usart0_clk = {
  53. .name = "usart0_clk",
  54. .pid = SAMA5D3_ID_USART0,
  55. .type = CLK_TYPE_PERIPHERAL,
  56. .div = AT91_PMC_PCR_DIV2,
  57. };
  58. static struct clk usart1_clk = {
  59. .name = "usart1_clk",
  60. .pid = SAMA5D3_ID_USART1,
  61. .type = CLK_TYPE_PERIPHERAL,
  62. .div = AT91_PMC_PCR_DIV2,
  63. };
  64. static struct clk usart2_clk = {
  65. .name = "usart2_clk",
  66. .pid = SAMA5D3_ID_USART2,
  67. .type = CLK_TYPE_PERIPHERAL,
  68. .div = AT91_PMC_PCR_DIV2,
  69. };
  70. static struct clk usart3_clk = {
  71. .name = "usart3_clk",
  72. .pid = SAMA5D3_ID_USART3,
  73. .type = CLK_TYPE_PERIPHERAL,
  74. .div = AT91_PMC_PCR_DIV2,
  75. };
  76. static struct clk uart0_clk = {
  77. .name = "uart0_clk",
  78. .pid = SAMA5D3_ID_UART0,
  79. .type = CLK_TYPE_PERIPHERAL,
  80. .div = AT91_PMC_PCR_DIV2,
  81. };
  82. static struct clk uart1_clk = {
  83. .name = "uart1_clk",
  84. .pid = SAMA5D3_ID_UART1,
  85. .type = CLK_TYPE_PERIPHERAL,
  86. .div = AT91_PMC_PCR_DIV2,
  87. };
  88. static struct clk twi0_clk = {
  89. .name = "twi0_clk",
  90. .pid = SAMA5D3_ID_TWI0,
  91. .type = CLK_TYPE_PERIPHERAL,
  92. .div = AT91_PMC_PCR_DIV2,
  93. };
  94. static struct clk twi1_clk = {
  95. .name = "twi1_clk",
  96. .pid = SAMA5D3_ID_TWI1,
  97. .type = CLK_TYPE_PERIPHERAL,
  98. .div = AT91_PMC_PCR_DIV2,
  99. };
  100. static struct clk twi2_clk = {
  101. .name = "twi2_clk",
  102. .pid = SAMA5D3_ID_TWI2,
  103. .type = CLK_TYPE_PERIPHERAL,
  104. .div = AT91_PMC_PCR_DIV2,
  105. };
  106. static struct clk mmc0_clk = {
  107. .name = "mci0_clk",
  108. .pid = SAMA5D3_ID_HSMCI0,
  109. .type = CLK_TYPE_PERIPHERAL,
  110. };
  111. static struct clk mmc1_clk = {
  112. .name = "mci1_clk",
  113. .pid = SAMA5D3_ID_HSMCI1,
  114. .type = CLK_TYPE_PERIPHERAL,
  115. };
  116. static struct clk mmc2_clk = {
  117. .name = "mci2_clk",
  118. .pid = SAMA5D3_ID_HSMCI2,
  119. .type = CLK_TYPE_PERIPHERAL,
  120. };
  121. static struct clk spi0_clk = {
  122. .name = "spi0_clk",
  123. .pid = SAMA5D3_ID_SPI0,
  124. .type = CLK_TYPE_PERIPHERAL,
  125. };
  126. static struct clk spi1_clk = {
  127. .name = "spi1_clk",
  128. .pid = SAMA5D3_ID_SPI1,
  129. .type = CLK_TYPE_PERIPHERAL,
  130. };
  131. static struct clk tcb0_clk = {
  132. .name = "tcb0_clk",
  133. .pid = SAMA5D3_ID_TC0,
  134. .type = CLK_TYPE_PERIPHERAL,
  135. .div = AT91_PMC_PCR_DIV2,
  136. };
  137. static struct clk tcb1_clk = {
  138. .name = "tcb1_clk",
  139. .pid = SAMA5D3_ID_TC1,
  140. .type = CLK_TYPE_PERIPHERAL,
  141. .div = AT91_PMC_PCR_DIV2,
  142. };
  143. static struct clk adc_clk = {
  144. .name = "adc_clk",
  145. .pid = SAMA5D3_ID_ADC,
  146. .type = CLK_TYPE_PERIPHERAL,
  147. .div = AT91_PMC_PCR_DIV2,
  148. };
  149. static struct clk adc_op_clk = {
  150. .name = "adc_op_clk",
  151. .type = CLK_TYPE_PERIPHERAL,
  152. .rate_hz = 5000000,
  153. };
  154. static struct clk dma0_clk = {
  155. .name = "dma0_clk",
  156. .pid = SAMA5D3_ID_DMA0,
  157. .type = CLK_TYPE_PERIPHERAL,
  158. };
  159. static struct clk dma1_clk = {
  160. .name = "dma1_clk",
  161. .pid = SAMA5D3_ID_DMA1,
  162. .type = CLK_TYPE_PERIPHERAL,
  163. };
  164. static struct clk uhphs_clk = {
  165. .name = "uhphs",
  166. .pid = SAMA5D3_ID_UHPHS,
  167. .type = CLK_TYPE_PERIPHERAL,
  168. };
  169. static struct clk udphs_clk = {
  170. .name = "udphs_clk",
  171. .pid = SAMA5D3_ID_UDPHS,
  172. .type = CLK_TYPE_PERIPHERAL,
  173. };
  174. /* gmac only for sama5d33, sama5d34, sama5d35 */
  175. static struct clk macb0_clk = {
  176. .name = "macb0_clk",
  177. .pid = SAMA5D3_ID_GMAC,
  178. .type = CLK_TYPE_PERIPHERAL,
  179. };
  180. /* emac only for sama5d31, sama5d35 */
  181. static struct clk macb1_clk = {
  182. .name = "macb1_clk",
  183. .pid = SAMA5D3_ID_EMAC,
  184. .type = CLK_TYPE_PERIPHERAL,
  185. };
  186. /* lcd only for sama5d31, sama5d33, sama5d34 */
  187. static struct clk lcdc_clk = {
  188. .name = "lcdc_clk",
  189. .pid = SAMA5D3_ID_LCDC,
  190. .type = CLK_TYPE_PERIPHERAL,
  191. };
  192. /* isi only for sama5d33, sama5d35 */
  193. static struct clk isi_clk = {
  194. .name = "isi_clk",
  195. .pid = SAMA5D3_ID_ISI,
  196. .type = CLK_TYPE_PERIPHERAL,
  197. };
  198. static struct clk can0_clk = {
  199. .name = "can0_clk",
  200. .pid = SAMA5D3_ID_CAN0,
  201. .type = CLK_TYPE_PERIPHERAL,
  202. .div = AT91_PMC_PCR_DIV2,
  203. };
  204. static struct clk can1_clk = {
  205. .name = "can1_clk",
  206. .pid = SAMA5D3_ID_CAN1,
  207. .type = CLK_TYPE_PERIPHERAL,
  208. .div = AT91_PMC_PCR_DIV2,
  209. };
  210. static struct clk ssc0_clk = {
  211. .name = "ssc0_clk",
  212. .pid = SAMA5D3_ID_SSC0,
  213. .type = CLK_TYPE_PERIPHERAL,
  214. .div = AT91_PMC_PCR_DIV2,
  215. };
  216. static struct clk ssc1_clk = {
  217. .name = "ssc1_clk",
  218. .pid = SAMA5D3_ID_SSC1,
  219. .type = CLK_TYPE_PERIPHERAL,
  220. .div = AT91_PMC_PCR_DIV2,
  221. };
  222. static struct clk sha_clk = {
  223. .name = "sha_clk",
  224. .pid = SAMA5D3_ID_SHA,
  225. .type = CLK_TYPE_PERIPHERAL,
  226. .div = AT91_PMC_PCR_DIV8,
  227. };
  228. static struct clk aes_clk = {
  229. .name = "aes_clk",
  230. .pid = SAMA5D3_ID_AES,
  231. .type = CLK_TYPE_PERIPHERAL,
  232. };
  233. static struct clk tdes_clk = {
  234. .name = "tdes_clk",
  235. .pid = SAMA5D3_ID_TDES,
  236. .type = CLK_TYPE_PERIPHERAL,
  237. };
  238. static struct clk *periph_clocks[] __initdata = {
  239. &pioA_clk,
  240. &pioB_clk,
  241. &pioC_clk,
  242. &pioD_clk,
  243. &pioE_clk,
  244. &usart0_clk,
  245. &usart1_clk,
  246. &usart2_clk,
  247. &usart3_clk,
  248. &uart0_clk,
  249. &uart1_clk,
  250. &twi0_clk,
  251. &twi1_clk,
  252. &twi2_clk,
  253. &mmc0_clk,
  254. &mmc1_clk,
  255. &mmc2_clk,
  256. &spi0_clk,
  257. &spi1_clk,
  258. &tcb0_clk,
  259. &tcb1_clk,
  260. &adc_clk,
  261. &adc_op_clk,
  262. &dma0_clk,
  263. &dma1_clk,
  264. &uhphs_clk,
  265. &udphs_clk,
  266. &macb0_clk,
  267. &macb1_clk,
  268. &lcdc_clk,
  269. &isi_clk,
  270. &can0_clk,
  271. &can1_clk,
  272. &ssc0_clk,
  273. &ssc1_clk,
  274. &sha_clk,
  275. &aes_clk,
  276. &tdes_clk,
  277. };
  278. static struct clk pck0 = {
  279. .name = "pck0",
  280. .pmc_mask = AT91_PMC_PCK0,
  281. .type = CLK_TYPE_PROGRAMMABLE,
  282. .id = 0,
  283. };
  284. static struct clk pck1 = {
  285. .name = "pck1",
  286. .pmc_mask = AT91_PMC_PCK1,
  287. .type = CLK_TYPE_PROGRAMMABLE,
  288. .id = 1,
  289. };
  290. static struct clk pck2 = {
  291. .name = "pck2",
  292. .pmc_mask = AT91_PMC_PCK2,
  293. .type = CLK_TYPE_PROGRAMMABLE,
  294. .id = 2,
  295. };
  296. static struct clk_lookup periph_clocks_lookups[] = {
  297. /* lookup table for DT entries */
  298. CLKDEV_CON_DEV_ID("usart", "ffffee00.serial", &mck),
  299. CLKDEV_CON_DEV_ID(NULL, "fffff200.gpio", &pioA_clk),
  300. CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioB_clk),
  301. CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioC_clk),
  302. CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioD_clk),
  303. CLKDEV_CON_DEV_ID(NULL, "fffffa00.gpio", &pioE_clk),
  304. CLKDEV_CON_DEV_ID("usart", "f001c000.serial", &usart0_clk),
  305. CLKDEV_CON_DEV_ID("usart", "f0020000.serial", &usart1_clk),
  306. CLKDEV_CON_DEV_ID("usart", "f8020000.serial", &usart2_clk),
  307. CLKDEV_CON_DEV_ID("usart", "f8024000.serial", &usart3_clk),
  308. CLKDEV_CON_DEV_ID(NULL, "f0014000.i2c", &twi0_clk),
  309. CLKDEV_CON_DEV_ID(NULL, "f0018000.i2c", &twi1_clk),
  310. CLKDEV_CON_DEV_ID(NULL, "f801c000.i2c", &twi2_clk),
  311. CLKDEV_CON_DEV_ID("mci_clk", "f0000000.mmc", &mmc0_clk),
  312. CLKDEV_CON_DEV_ID("mci_clk", "f8000000.mmc", &mmc1_clk),
  313. CLKDEV_CON_DEV_ID("mci_clk", "f8004000.mmc", &mmc2_clk),
  314. CLKDEV_CON_DEV_ID("spi_clk", "f0004000.spi", &spi0_clk),
  315. CLKDEV_CON_DEV_ID("spi_clk", "f8008000.spi", &spi1_clk),
  316. CLKDEV_CON_DEV_ID("t0_clk", "f0010000.timer", &tcb0_clk),
  317. CLKDEV_CON_DEV_ID("t0_clk", "f8014000.timer", &tcb1_clk),
  318. CLKDEV_CON_DEV_ID("tsc_clk", "f8018000.tsadcc", &adc_clk),
  319. CLKDEV_CON_DEV_ID("dma_clk", "ffffe600.dma-controller", &dma0_clk),
  320. CLKDEV_CON_DEV_ID("dma_clk", "ffffe800.dma-controller", &dma1_clk),
  321. CLKDEV_CON_DEV_ID("hclk", "600000.ohci", &uhphs_clk),
  322. CLKDEV_CON_DEV_ID("ohci_clk", "600000.ohci", &uhphs_clk),
  323. CLKDEV_CON_DEV_ID("ehci_clk", "700000.ehci", &uhphs_clk),
  324. CLKDEV_CON_DEV_ID("pclk", "500000.gadget", &udphs_clk),
  325. CLKDEV_CON_DEV_ID("hclk", "500000.gadget", &utmi_clk),
  326. CLKDEV_CON_DEV_ID("hclk", "f0028000.ethernet", &macb0_clk),
  327. CLKDEV_CON_DEV_ID("pclk", "f0028000.ethernet", &macb0_clk),
  328. CLKDEV_CON_DEV_ID("hclk", "f802c000.ethernet", &macb1_clk),
  329. CLKDEV_CON_DEV_ID("pclk", "f802c000.ethernet", &macb1_clk),
  330. CLKDEV_CON_DEV_ID("pclk", "f0008000.ssc", &ssc0_clk),
  331. CLKDEV_CON_DEV_ID("pclk", "f000c000.ssc", &ssc1_clk),
  332. CLKDEV_CON_DEV_ID("can_clk", "f000c000.can", &can0_clk),
  333. CLKDEV_CON_DEV_ID("can_clk", "f8010000.can", &can1_clk),
  334. CLKDEV_CON_DEV_ID("sha_clk", "f8034000.sha", &sha_clk),
  335. CLKDEV_CON_DEV_ID("aes_clk", "f8038000.aes", &aes_clk),
  336. CLKDEV_CON_DEV_ID("tdes_clk", "f803c000.tdes", &tdes_clk),
  337. };
  338. static void __init sama5d3_register_clocks(void)
  339. {
  340. int i;
  341. for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
  342. clk_register(periph_clocks[i]);
  343. clkdev_add_table(periph_clocks_lookups,
  344. ARRAY_SIZE(periph_clocks_lookups));
  345. clk_register(&pck0);
  346. clk_register(&pck1);
  347. clk_register(&pck2);
  348. }
  349. /* --------------------------------------------------------------------
  350. * AT91SAM9x5 processor initialization
  351. * -------------------------------------------------------------------- */
  352. static void __init sama5d3_map_io(void)
  353. {
  354. at91_init_sram(0, SAMA5D3_SRAM_BASE, SAMA5D3_SRAM_SIZE);
  355. }
  356. AT91_SOC_START(sama5d3)
  357. .map_io = sama5d3_map_io,
  358. .register_clocks = sama5d3_register_clocks,
  359. AT91_SOC_END