spear3xx.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. /*
  2. * arch/arm/mach-spear3xx/spear3xx.c
  3. *
  4. * SPEAr3XX machines common source file
  5. *
  6. * Copyright (C) 2009-2012 ST Microelectronics
  7. * Viresh Kumar <viresh.kumar@st.com>
  8. *
  9. * This file is licensed under the terms of the GNU General Public
  10. * License version 2. This program is licensed "as is" without any
  11. * warranty of any kind, whether express or implied.
  12. */
  13. #define pr_fmt(fmt) "SPEAr3xx: " fmt
  14. #include <linux/amba/pl022.h>
  15. #include <linux/amba/pl08x.h>
  16. #include <linux/of_irq.h>
  17. #include <linux/io.h>
  18. #include <asm/hardware/vic.h>
  19. #include <mach/generic.h>
  20. #include <mach/hardware.h>
  21. /* pad multiplexing support */
  22. /* devices */
  23. static struct pmx_dev_mode pmx_firda_modes[] = {
  24. {
  25. .ids = 0xffffffff,
  26. .mask = PMX_FIRDA_MASK,
  27. },
  28. };
  29. struct pmx_dev spear3xx_pmx_firda = {
  30. .name = "firda",
  31. .modes = pmx_firda_modes,
  32. .mode_count = ARRAY_SIZE(pmx_firda_modes),
  33. .enb_on_reset = 0,
  34. };
  35. static struct pmx_dev_mode pmx_i2c_modes[] = {
  36. {
  37. .ids = 0xffffffff,
  38. .mask = PMX_I2C_MASK,
  39. },
  40. };
  41. struct pmx_dev spear3xx_pmx_i2c = {
  42. .name = "i2c",
  43. .modes = pmx_i2c_modes,
  44. .mode_count = ARRAY_SIZE(pmx_i2c_modes),
  45. .enb_on_reset = 0,
  46. };
  47. static struct pmx_dev_mode pmx_ssp_cs_modes[] = {
  48. {
  49. .ids = 0xffffffff,
  50. .mask = PMX_SSP_CS_MASK,
  51. },
  52. };
  53. struct pmx_dev spear3xx_pmx_ssp_cs = {
  54. .name = "ssp_chip_selects",
  55. .modes = pmx_ssp_cs_modes,
  56. .mode_count = ARRAY_SIZE(pmx_ssp_cs_modes),
  57. .enb_on_reset = 0,
  58. };
  59. static struct pmx_dev_mode pmx_ssp_modes[] = {
  60. {
  61. .ids = 0xffffffff,
  62. .mask = PMX_SSP_MASK,
  63. },
  64. };
  65. struct pmx_dev spear3xx_pmx_ssp = {
  66. .name = "ssp",
  67. .modes = pmx_ssp_modes,
  68. .mode_count = ARRAY_SIZE(pmx_ssp_modes),
  69. .enb_on_reset = 0,
  70. };
  71. static struct pmx_dev_mode pmx_mii_modes[] = {
  72. {
  73. .ids = 0xffffffff,
  74. .mask = PMX_MII_MASK,
  75. },
  76. };
  77. struct pmx_dev spear3xx_pmx_mii = {
  78. .name = "mii",
  79. .modes = pmx_mii_modes,
  80. .mode_count = ARRAY_SIZE(pmx_mii_modes),
  81. .enb_on_reset = 0,
  82. };
  83. static struct pmx_dev_mode pmx_gpio_pin0_modes[] = {
  84. {
  85. .ids = 0xffffffff,
  86. .mask = PMX_GPIO_PIN0_MASK,
  87. },
  88. };
  89. struct pmx_dev spear3xx_pmx_gpio_pin0 = {
  90. .name = "gpio_pin0",
  91. .modes = pmx_gpio_pin0_modes,
  92. .mode_count = ARRAY_SIZE(pmx_gpio_pin0_modes),
  93. .enb_on_reset = 0,
  94. };
  95. static struct pmx_dev_mode pmx_gpio_pin1_modes[] = {
  96. {
  97. .ids = 0xffffffff,
  98. .mask = PMX_GPIO_PIN1_MASK,
  99. },
  100. };
  101. struct pmx_dev spear3xx_pmx_gpio_pin1 = {
  102. .name = "gpio_pin1",
  103. .modes = pmx_gpio_pin1_modes,
  104. .mode_count = ARRAY_SIZE(pmx_gpio_pin1_modes),
  105. .enb_on_reset = 0,
  106. };
  107. static struct pmx_dev_mode pmx_gpio_pin2_modes[] = {
  108. {
  109. .ids = 0xffffffff,
  110. .mask = PMX_GPIO_PIN2_MASK,
  111. },
  112. };
  113. struct pmx_dev spear3xx_pmx_gpio_pin2 = {
  114. .name = "gpio_pin2",
  115. .modes = pmx_gpio_pin2_modes,
  116. .mode_count = ARRAY_SIZE(pmx_gpio_pin2_modes),
  117. .enb_on_reset = 0,
  118. };
  119. static struct pmx_dev_mode pmx_gpio_pin3_modes[] = {
  120. {
  121. .ids = 0xffffffff,
  122. .mask = PMX_GPIO_PIN3_MASK,
  123. },
  124. };
  125. struct pmx_dev spear3xx_pmx_gpio_pin3 = {
  126. .name = "gpio_pin3",
  127. .modes = pmx_gpio_pin3_modes,
  128. .mode_count = ARRAY_SIZE(pmx_gpio_pin3_modes),
  129. .enb_on_reset = 0,
  130. };
  131. static struct pmx_dev_mode pmx_gpio_pin4_modes[] = {
  132. {
  133. .ids = 0xffffffff,
  134. .mask = PMX_GPIO_PIN4_MASK,
  135. },
  136. };
  137. struct pmx_dev spear3xx_pmx_gpio_pin4 = {
  138. .name = "gpio_pin4",
  139. .modes = pmx_gpio_pin4_modes,
  140. .mode_count = ARRAY_SIZE(pmx_gpio_pin4_modes),
  141. .enb_on_reset = 0,
  142. };
  143. static struct pmx_dev_mode pmx_gpio_pin5_modes[] = {
  144. {
  145. .ids = 0xffffffff,
  146. .mask = PMX_GPIO_PIN5_MASK,
  147. },
  148. };
  149. struct pmx_dev spear3xx_pmx_gpio_pin5 = {
  150. .name = "gpio_pin5",
  151. .modes = pmx_gpio_pin5_modes,
  152. .mode_count = ARRAY_SIZE(pmx_gpio_pin5_modes),
  153. .enb_on_reset = 0,
  154. };
  155. static struct pmx_dev_mode pmx_uart0_modem_modes[] = {
  156. {
  157. .ids = 0xffffffff,
  158. .mask = PMX_UART0_MODEM_MASK,
  159. },
  160. };
  161. struct pmx_dev spear3xx_pmx_uart0_modem = {
  162. .name = "uart0_modem",
  163. .modes = pmx_uart0_modem_modes,
  164. .mode_count = ARRAY_SIZE(pmx_uart0_modem_modes),
  165. .enb_on_reset = 0,
  166. };
  167. static struct pmx_dev_mode pmx_uart0_modes[] = {
  168. {
  169. .ids = 0xffffffff,
  170. .mask = PMX_UART0_MASK,
  171. },
  172. };
  173. struct pmx_dev spear3xx_pmx_uart0 = {
  174. .name = "uart0",
  175. .modes = pmx_uart0_modes,
  176. .mode_count = ARRAY_SIZE(pmx_uart0_modes),
  177. .enb_on_reset = 0,
  178. };
  179. static struct pmx_dev_mode pmx_timer_3_4_modes[] = {
  180. {
  181. .ids = 0xffffffff,
  182. .mask = PMX_TIMER_3_4_MASK,
  183. },
  184. };
  185. struct pmx_dev spear3xx_pmx_timer_3_4 = {
  186. .name = "timer_3_4",
  187. .modes = pmx_timer_3_4_modes,
  188. .mode_count = ARRAY_SIZE(pmx_timer_3_4_modes),
  189. .enb_on_reset = 0,
  190. };
  191. static struct pmx_dev_mode pmx_timer_1_2_modes[] = {
  192. {
  193. .ids = 0xffffffff,
  194. .mask = PMX_TIMER_1_2_MASK,
  195. },
  196. };
  197. struct pmx_dev spear3xx_pmx_timer_1_2 = {
  198. .name = "timer_1_2",
  199. .modes = pmx_timer_1_2_modes,
  200. .mode_count = ARRAY_SIZE(pmx_timer_1_2_modes),
  201. .enb_on_reset = 0,
  202. };
  203. #if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320)
  204. /* plgpios devices */
  205. static struct pmx_dev_mode pmx_plgpio_0_1_modes[] = {
  206. {
  207. .ids = 0x00,
  208. .mask = PMX_FIRDA_MASK,
  209. },
  210. };
  211. struct pmx_dev spear3xx_pmx_plgpio_0_1 = {
  212. .name = "plgpio 0 and 1",
  213. .modes = pmx_plgpio_0_1_modes,
  214. .mode_count = ARRAY_SIZE(pmx_plgpio_0_1_modes),
  215. .enb_on_reset = 1,
  216. };
  217. static struct pmx_dev_mode pmx_plgpio_2_3_modes[] = {
  218. {
  219. .ids = 0x00,
  220. .mask = PMX_UART0_MASK,
  221. },
  222. };
  223. struct pmx_dev spear3xx_pmx_plgpio_2_3 = {
  224. .name = "plgpio 2 and 3",
  225. .modes = pmx_plgpio_2_3_modes,
  226. .mode_count = ARRAY_SIZE(pmx_plgpio_2_3_modes),
  227. .enb_on_reset = 1,
  228. };
  229. static struct pmx_dev_mode pmx_plgpio_4_5_modes[] = {
  230. {
  231. .ids = 0x00,
  232. .mask = PMX_I2C_MASK,
  233. },
  234. };
  235. struct pmx_dev spear3xx_pmx_plgpio_4_5 = {
  236. .name = "plgpio 4 and 5",
  237. .modes = pmx_plgpio_4_5_modes,
  238. .mode_count = ARRAY_SIZE(pmx_plgpio_4_5_modes),
  239. .enb_on_reset = 1,
  240. };
  241. static struct pmx_dev_mode pmx_plgpio_6_9_modes[] = {
  242. {
  243. .ids = 0x00,
  244. .mask = PMX_SSP_MASK,
  245. },
  246. };
  247. struct pmx_dev spear3xx_pmx_plgpio_6_9 = {
  248. .name = "plgpio 6 to 9",
  249. .modes = pmx_plgpio_6_9_modes,
  250. .mode_count = ARRAY_SIZE(pmx_plgpio_6_9_modes),
  251. .enb_on_reset = 1,
  252. };
  253. static struct pmx_dev_mode pmx_plgpio_10_27_modes[] = {
  254. {
  255. .ids = 0x00,
  256. .mask = PMX_MII_MASK,
  257. },
  258. };
  259. struct pmx_dev spear3xx_pmx_plgpio_10_27 = {
  260. .name = "plgpio 10 to 27",
  261. .modes = pmx_plgpio_10_27_modes,
  262. .mode_count = ARRAY_SIZE(pmx_plgpio_10_27_modes),
  263. .enb_on_reset = 1,
  264. };
  265. static struct pmx_dev_mode pmx_plgpio_28_modes[] = {
  266. {
  267. .ids = 0x00,
  268. .mask = PMX_GPIO_PIN0_MASK,
  269. },
  270. };
  271. struct pmx_dev spear3xx_pmx_plgpio_28 = {
  272. .name = "plgpio 28",
  273. .modes = pmx_plgpio_28_modes,
  274. .mode_count = ARRAY_SIZE(pmx_plgpio_28_modes),
  275. .enb_on_reset = 1,
  276. };
  277. static struct pmx_dev_mode pmx_plgpio_29_modes[] = {
  278. {
  279. .ids = 0x00,
  280. .mask = PMX_GPIO_PIN1_MASK,
  281. },
  282. };
  283. struct pmx_dev spear3xx_pmx_plgpio_29 = {
  284. .name = "plgpio 29",
  285. .modes = pmx_plgpio_29_modes,
  286. .mode_count = ARRAY_SIZE(pmx_plgpio_29_modes),
  287. .enb_on_reset = 1,
  288. };
  289. static struct pmx_dev_mode pmx_plgpio_30_modes[] = {
  290. {
  291. .ids = 0x00,
  292. .mask = PMX_GPIO_PIN2_MASK,
  293. },
  294. };
  295. struct pmx_dev spear3xx_pmx_plgpio_30 = {
  296. .name = "plgpio 30",
  297. .modes = pmx_plgpio_30_modes,
  298. .mode_count = ARRAY_SIZE(pmx_plgpio_30_modes),
  299. .enb_on_reset = 1,
  300. };
  301. static struct pmx_dev_mode pmx_plgpio_31_modes[] = {
  302. {
  303. .ids = 0x00,
  304. .mask = PMX_GPIO_PIN3_MASK,
  305. },
  306. };
  307. struct pmx_dev spear3xx_pmx_plgpio_31 = {
  308. .name = "plgpio 31",
  309. .modes = pmx_plgpio_31_modes,
  310. .mode_count = ARRAY_SIZE(pmx_plgpio_31_modes),
  311. .enb_on_reset = 1,
  312. };
  313. static struct pmx_dev_mode pmx_plgpio_32_modes[] = {
  314. {
  315. .ids = 0x00,
  316. .mask = PMX_GPIO_PIN4_MASK,
  317. },
  318. };
  319. struct pmx_dev spear3xx_pmx_plgpio_32 = {
  320. .name = "plgpio 32",
  321. .modes = pmx_plgpio_32_modes,
  322. .mode_count = ARRAY_SIZE(pmx_plgpio_32_modes),
  323. .enb_on_reset = 1,
  324. };
  325. static struct pmx_dev_mode pmx_plgpio_33_modes[] = {
  326. {
  327. .ids = 0x00,
  328. .mask = PMX_GPIO_PIN5_MASK,
  329. },
  330. };
  331. struct pmx_dev spear3xx_pmx_plgpio_33 = {
  332. .name = "plgpio 33",
  333. .modes = pmx_plgpio_33_modes,
  334. .mode_count = ARRAY_SIZE(pmx_plgpio_33_modes),
  335. .enb_on_reset = 1,
  336. };
  337. static struct pmx_dev_mode pmx_plgpio_34_36_modes[] = {
  338. {
  339. .ids = 0x00,
  340. .mask = PMX_SSP_CS_MASK,
  341. },
  342. };
  343. struct pmx_dev spear3xx_pmx_plgpio_34_36 = {
  344. .name = "plgpio 34 to 36",
  345. .modes = pmx_plgpio_34_36_modes,
  346. .mode_count = ARRAY_SIZE(pmx_plgpio_34_36_modes),
  347. .enb_on_reset = 1,
  348. };
  349. static struct pmx_dev_mode pmx_plgpio_37_42_modes[] = {
  350. {
  351. .ids = 0x00,
  352. .mask = PMX_UART0_MODEM_MASK,
  353. },
  354. };
  355. struct pmx_dev spear3xx_pmx_plgpio_37_42 = {
  356. .name = "plgpio 37 to 42",
  357. .modes = pmx_plgpio_37_42_modes,
  358. .mode_count = ARRAY_SIZE(pmx_plgpio_37_42_modes),
  359. .enb_on_reset = 1,
  360. };
  361. static struct pmx_dev_mode pmx_plgpio_43_44_47_48_modes[] = {
  362. {
  363. .ids = 0x00,
  364. .mask = PMX_TIMER_1_2_MASK,
  365. },
  366. };
  367. struct pmx_dev spear3xx_pmx_plgpio_43_44_47_48 = {
  368. .name = "plgpio 43, 44, 47 and 48",
  369. .modes = pmx_plgpio_43_44_47_48_modes,
  370. .mode_count = ARRAY_SIZE(pmx_plgpio_43_44_47_48_modes),
  371. .enb_on_reset = 1,
  372. };
  373. static struct pmx_dev_mode pmx_plgpio_45_46_49_50_modes[] = {
  374. {
  375. .ids = 0x00,
  376. .mask = PMX_TIMER_3_4_MASK,
  377. },
  378. };
  379. struct pmx_dev spear3xx_pmx_plgpio_45_46_49_50 = {
  380. .name = "plgpio 45, 46, 49 and 50",
  381. .modes = pmx_plgpio_45_46_49_50_modes,
  382. .mode_count = ARRAY_SIZE(pmx_plgpio_45_46_49_50_modes),
  383. .enb_on_reset = 1,
  384. };
  385. #endif /* CONFIG_MACH_SPEAR310 || CONFIG_MACH_SPEAR320 */
  386. /* ssp device registration */
  387. struct pl022_ssp_controller pl022_plat_data = {
  388. .bus_id = 0,
  389. .enable_dma = 1,
  390. .dma_filter = pl08x_filter_id,
  391. .dma_tx_param = "ssp0_tx",
  392. .dma_rx_param = "ssp0_rx",
  393. /*
  394. * This is number of spi devices that can be connected to spi. There are
  395. * two type of chipselects on which slave devices can work. One is chip
  396. * select provided by spi masters other is controlled through external
  397. * gpio's. We can't use chipselect provided from spi master (because as
  398. * soon as FIFO becomes empty, CS is disabled and transfer ends). So
  399. * this number now depends on number of gpios available for spi. each
  400. * slave on each master requires a separate gpio pin.
  401. */
  402. .num_chipselect = 2,
  403. };
  404. /*
  405. * Following will create 16MB static virtual/physical mappings
  406. * PHYSICAL VIRTUAL
  407. * 0xD0000000 0xFD000000
  408. * 0xFC000000 0xFC000000
  409. */
  410. struct map_desc spear3xx_io_desc[] __initdata = {
  411. {
  412. .virtual = VA_SPEAR3XX_ICM1_2_BASE,
  413. .pfn = __phys_to_pfn(SPEAR3XX_ICM1_2_BASE),
  414. .length = SZ_16M,
  415. .type = MT_DEVICE
  416. }, {
  417. .virtual = VA_SPEAR3XX_ICM3_SMI_CTRL_BASE,
  418. .pfn = __phys_to_pfn(SPEAR3XX_ICM3_SMI_CTRL_BASE),
  419. .length = SZ_16M,
  420. .type = MT_DEVICE
  421. },
  422. };
  423. /* This will create static memory mapping for selected devices */
  424. void __init spear3xx_map_io(void)
  425. {
  426. iotable_init(spear3xx_io_desc, ARRAY_SIZE(spear3xx_io_desc));
  427. }
  428. static void __init spear3xx_timer_init(void)
  429. {
  430. char pclk_name[] = "pll3_48m_clk";
  431. struct clk *gpt_clk, *pclk;
  432. /* get the system timer clock */
  433. gpt_clk = clk_get_sys("gpt0", NULL);
  434. if (IS_ERR(gpt_clk)) {
  435. pr_err("%s:couldn't get clk for gpt\n", __func__);
  436. BUG();
  437. }
  438. /* get the suitable parent clock for timer*/
  439. pclk = clk_get(NULL, pclk_name);
  440. if (IS_ERR(pclk)) {
  441. pr_err("%s:couldn't get %s as parent for gpt\n",
  442. __func__, pclk_name);
  443. BUG();
  444. }
  445. clk_set_parent(gpt_clk, pclk);
  446. clk_put(gpt_clk);
  447. clk_put(pclk);
  448. spear_setup_timer();
  449. }
  450. struct sys_timer spear3xx_timer = {
  451. .init = spear3xx_timer_init,
  452. };
  453. static const struct of_device_id vic_of_match[] __initconst = {
  454. { .compatible = "arm,pl190-vic", .data = vic_of_init, },
  455. { /* Sentinel */ }
  456. };
  457. void __init spear3xx_dt_init_irq(void)
  458. {
  459. of_irq_init(vic_of_match);
  460. }