spear320.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899
  1. /*
  2. * arch/arm/mach-spear3xx/spear320.c
  3. *
  4. * SPEAr320 machine 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) "SPEAr320: " fmt
  14. #include <linux/amba/pl022.h>
  15. #include <linux/amba/pl08x.h>
  16. #include <linux/amba/serial.h>
  17. #include <linux/of_platform.h>
  18. #include <asm/hardware/vic.h>
  19. #include <asm/mach/arch.h>
  20. #include <plat/shirq.h>
  21. #include <mach/generic.h>
  22. #include <mach/spear.h>
  23. #define SPEAR320_UART1_BASE UL(0xA3000000)
  24. #define SPEAR320_UART2_BASE UL(0xA4000000)
  25. #define SPEAR320_SSP0_BASE UL(0xA5000000)
  26. #define SPEAR320_SSP1_BASE UL(0xA6000000)
  27. #define SPEAR320_SOC_CONFIG_BASE UL(0xB3000000)
  28. /* Interrupt registers offsets and masks */
  29. #define SPEAR320_INT_STS_MASK_REG 0x04
  30. #define SPEAR320_INT_CLR_MASK_REG 0x04
  31. #define SPEAR320_INT_ENB_MASK_REG 0x08
  32. #define SPEAR320_GPIO_IRQ_MASK (1 << 0)
  33. #define SPEAR320_I2S_PLAY_IRQ_MASK (1 << 1)
  34. #define SPEAR320_I2S_REC_IRQ_MASK (1 << 2)
  35. #define SPEAR320_EMI_IRQ_MASK (1 << 7)
  36. #define SPEAR320_CLCD_IRQ_MASK (1 << 8)
  37. #define SPEAR320_SPP_IRQ_MASK (1 << 9)
  38. #define SPEAR320_SDHCI_IRQ_MASK (1 << 10)
  39. #define SPEAR320_CAN_U_IRQ_MASK (1 << 11)
  40. #define SPEAR320_CAN_L_IRQ_MASK (1 << 12)
  41. #define SPEAR320_UART1_IRQ_MASK (1 << 13)
  42. #define SPEAR320_UART2_IRQ_MASK (1 << 14)
  43. #define SPEAR320_SSP1_IRQ_MASK (1 << 15)
  44. #define SPEAR320_SSP2_IRQ_MASK (1 << 16)
  45. #define SPEAR320_SMII0_IRQ_MASK (1 << 17)
  46. #define SPEAR320_MII1_SMII1_IRQ_MASK (1 << 18)
  47. #define SPEAR320_WAKEUP_SMII0_IRQ_MASK (1 << 19)
  48. #define SPEAR320_WAKEUP_MII1_SMII1_IRQ_MASK (1 << 20)
  49. #define SPEAR320_I2C1_IRQ_MASK (1 << 21)
  50. #define SPEAR320_SHIRQ_RAS1_MASK 0x000380
  51. #define SPEAR320_SHIRQ_RAS3_MASK 0x000007
  52. #define SPEAR320_SHIRQ_INTRCOMM_RAS_MASK 0x3FF800
  53. /* SPEAr320 Virtual irq definitions */
  54. /* IRQs sharing IRQ_GEN_RAS_1 */
  55. #define SPEAR320_VIRQ_EMI (SPEAR3XX_VIRQ_START + 0)
  56. #define SPEAR320_VIRQ_CLCD (SPEAR3XX_VIRQ_START + 1)
  57. #define SPEAR320_VIRQ_SPP (SPEAR3XX_VIRQ_START + 2)
  58. /* IRQs sharing IRQ_GEN_RAS_2 */
  59. #define SPEAR320_IRQ_SDHCI SPEAR3XX_IRQ_GEN_RAS_2
  60. /* IRQs sharing IRQ_GEN_RAS_3 */
  61. #define SPEAR320_VIRQ_PLGPIO (SPEAR3XX_VIRQ_START + 3)
  62. #define SPEAR320_VIRQ_I2S_PLAY (SPEAR3XX_VIRQ_START + 4)
  63. #define SPEAR320_VIRQ_I2S_REC (SPEAR3XX_VIRQ_START + 5)
  64. /* IRQs sharing IRQ_INTRCOMM_RAS_ARM */
  65. #define SPEAR320_VIRQ_CANU (SPEAR3XX_VIRQ_START + 6)
  66. #define SPEAR320_VIRQ_CANL (SPEAR3XX_VIRQ_START + 7)
  67. #define SPEAR320_VIRQ_UART1 (SPEAR3XX_VIRQ_START + 8)
  68. #define SPEAR320_VIRQ_UART2 (SPEAR3XX_VIRQ_START + 9)
  69. #define SPEAR320_VIRQ_SSP1 (SPEAR3XX_VIRQ_START + 10)
  70. #define SPEAR320_VIRQ_SSP2 (SPEAR3XX_VIRQ_START + 11)
  71. #define SPEAR320_VIRQ_SMII0 (SPEAR3XX_VIRQ_START + 12)
  72. #define SPEAR320_VIRQ_MII1_SMII1 (SPEAR3XX_VIRQ_START + 13)
  73. #define SPEAR320_VIRQ_WAKEUP_SMII0 (SPEAR3XX_VIRQ_START + 14)
  74. #define SPEAR320_VIRQ_WAKEUP_MII1_SMII1 (SPEAR3XX_VIRQ_START + 15)
  75. #define SPEAR320_VIRQ_I2C1 (SPEAR3XX_VIRQ_START + 16)
  76. /* pad multiplexing support */
  77. /* muxing registers */
  78. #define PAD_MUX_CONFIG_REG 0x0C
  79. #define MODE_CONFIG_REG 0x10
  80. /* modes */
  81. #define AUTO_NET_SMII_MODE (1 << 0)
  82. #define AUTO_NET_MII_MODE (1 << 1)
  83. #define AUTO_EXP_MODE (1 << 2)
  84. #define SMALL_PRINTERS_MODE (1 << 3)
  85. #define ALL_MODES 0xF
  86. struct pmx_mode spear320_auto_net_smii_mode = {
  87. .id = AUTO_NET_SMII_MODE,
  88. .name = "Automation Networking SMII Mode",
  89. .mask = 0x00,
  90. };
  91. struct pmx_mode spear320_auto_net_mii_mode = {
  92. .id = AUTO_NET_MII_MODE,
  93. .name = "Automation Networking MII Mode",
  94. .mask = 0x01,
  95. };
  96. struct pmx_mode spear320_auto_exp_mode = {
  97. .id = AUTO_EXP_MODE,
  98. .name = "Automation Expanded Mode",
  99. .mask = 0x02,
  100. };
  101. struct pmx_mode spear320_small_printers_mode = {
  102. .id = SMALL_PRINTERS_MODE,
  103. .name = "Small Printers Mode",
  104. .mask = 0x03,
  105. };
  106. /* devices */
  107. static struct pmx_dev_mode pmx_clcd_modes[] = {
  108. {
  109. .ids = AUTO_NET_SMII_MODE,
  110. .mask = 0x0,
  111. },
  112. };
  113. struct pmx_dev spear320_pmx_clcd = {
  114. .name = "clcd",
  115. .modes = pmx_clcd_modes,
  116. .mode_count = ARRAY_SIZE(pmx_clcd_modes),
  117. .enb_on_reset = 1,
  118. };
  119. static struct pmx_dev_mode pmx_emi_modes[] = {
  120. {
  121. .ids = AUTO_EXP_MODE,
  122. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
  123. },
  124. };
  125. struct pmx_dev spear320_pmx_emi = {
  126. .name = "emi",
  127. .modes = pmx_emi_modes,
  128. .mode_count = ARRAY_SIZE(pmx_emi_modes),
  129. .enb_on_reset = 1,
  130. };
  131. static struct pmx_dev_mode pmx_fsmc_modes[] = {
  132. {
  133. .ids = ALL_MODES,
  134. .mask = 0x0,
  135. },
  136. };
  137. struct pmx_dev spear320_pmx_fsmc = {
  138. .name = "fsmc",
  139. .modes = pmx_fsmc_modes,
  140. .mode_count = ARRAY_SIZE(pmx_fsmc_modes),
  141. .enb_on_reset = 1,
  142. };
  143. static struct pmx_dev_mode pmx_spp_modes[] = {
  144. {
  145. .ids = SMALL_PRINTERS_MODE,
  146. .mask = 0x0,
  147. },
  148. };
  149. struct pmx_dev spear320_pmx_spp = {
  150. .name = "spp",
  151. .modes = pmx_spp_modes,
  152. .mode_count = ARRAY_SIZE(pmx_spp_modes),
  153. .enb_on_reset = 1,
  154. };
  155. static struct pmx_dev_mode pmx_sdhci_modes[] = {
  156. {
  157. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE |
  158. SMALL_PRINTERS_MODE,
  159. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
  160. },
  161. };
  162. struct pmx_dev spear320_pmx_sdhci = {
  163. .name = "sdhci",
  164. .modes = pmx_sdhci_modes,
  165. .mode_count = ARRAY_SIZE(pmx_sdhci_modes),
  166. .enb_on_reset = 1,
  167. };
  168. static struct pmx_dev_mode pmx_i2s_modes[] = {
  169. {
  170. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  171. .mask = PMX_UART0_MODEM_MASK,
  172. },
  173. };
  174. struct pmx_dev spear320_pmx_i2s = {
  175. .name = "i2s",
  176. .modes = pmx_i2s_modes,
  177. .mode_count = ARRAY_SIZE(pmx_i2s_modes),
  178. .enb_on_reset = 1,
  179. };
  180. static struct pmx_dev_mode pmx_uart1_modes[] = {
  181. {
  182. .ids = ALL_MODES,
  183. .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK,
  184. },
  185. };
  186. struct pmx_dev spear320_pmx_uart1 = {
  187. .name = "uart1",
  188. .modes = pmx_uart1_modes,
  189. .mode_count = ARRAY_SIZE(pmx_uart1_modes),
  190. .enb_on_reset = 1,
  191. };
  192. static struct pmx_dev_mode pmx_uart1_modem_modes[] = {
  193. {
  194. .ids = AUTO_EXP_MODE,
  195. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK |
  196. PMX_SSP_CS_MASK,
  197. }, {
  198. .ids = SMALL_PRINTERS_MODE,
  199. .mask = PMX_GPIO_PIN3_MASK | PMX_GPIO_PIN4_MASK |
  200. PMX_GPIO_PIN5_MASK | PMX_SSP_CS_MASK,
  201. },
  202. };
  203. struct pmx_dev spear320_pmx_uart1_modem = {
  204. .name = "uart1_modem",
  205. .modes = pmx_uart1_modem_modes,
  206. .mode_count = ARRAY_SIZE(pmx_uart1_modem_modes),
  207. .enb_on_reset = 1,
  208. };
  209. static struct pmx_dev_mode pmx_uart2_modes[] = {
  210. {
  211. .ids = ALL_MODES,
  212. .mask = PMX_FIRDA_MASK,
  213. },
  214. };
  215. struct pmx_dev spear320_pmx_uart2 = {
  216. .name = "uart2",
  217. .modes = pmx_uart2_modes,
  218. .mode_count = ARRAY_SIZE(pmx_uart2_modes),
  219. .enb_on_reset = 1,
  220. };
  221. static struct pmx_dev_mode pmx_touchscreen_modes[] = {
  222. {
  223. .ids = AUTO_NET_SMII_MODE,
  224. .mask = PMX_SSP_CS_MASK,
  225. },
  226. };
  227. struct pmx_dev spear320_pmx_touchscreen = {
  228. .name = "touchscreen",
  229. .modes = pmx_touchscreen_modes,
  230. .mode_count = ARRAY_SIZE(pmx_touchscreen_modes),
  231. .enb_on_reset = 1,
  232. };
  233. static struct pmx_dev_mode pmx_can_modes[] = {
  234. {
  235. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | AUTO_EXP_MODE,
  236. .mask = PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
  237. PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK,
  238. },
  239. };
  240. struct pmx_dev spear320_pmx_can = {
  241. .name = "can",
  242. .modes = pmx_can_modes,
  243. .mode_count = ARRAY_SIZE(pmx_can_modes),
  244. .enb_on_reset = 1,
  245. };
  246. static struct pmx_dev_mode pmx_sdhci_led_modes[] = {
  247. {
  248. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  249. .mask = PMX_SSP_CS_MASK,
  250. },
  251. };
  252. struct pmx_dev spear320_pmx_sdhci_led = {
  253. .name = "sdhci_led",
  254. .modes = pmx_sdhci_led_modes,
  255. .mode_count = ARRAY_SIZE(pmx_sdhci_led_modes),
  256. .enb_on_reset = 1,
  257. };
  258. static struct pmx_dev_mode pmx_pwm0_modes[] = {
  259. {
  260. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  261. .mask = PMX_UART0_MODEM_MASK,
  262. }, {
  263. .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
  264. .mask = PMX_MII_MASK,
  265. },
  266. };
  267. struct pmx_dev spear320_pmx_pwm0 = {
  268. .name = "pwm0",
  269. .modes = pmx_pwm0_modes,
  270. .mode_count = ARRAY_SIZE(pmx_pwm0_modes),
  271. .enb_on_reset = 1,
  272. };
  273. static struct pmx_dev_mode pmx_pwm1_modes[] = {
  274. {
  275. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  276. .mask = PMX_UART0_MODEM_MASK,
  277. }, {
  278. .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
  279. .mask = PMX_MII_MASK,
  280. },
  281. };
  282. struct pmx_dev spear320_pmx_pwm1 = {
  283. .name = "pwm1",
  284. .modes = pmx_pwm1_modes,
  285. .mode_count = ARRAY_SIZE(pmx_pwm1_modes),
  286. .enb_on_reset = 1,
  287. };
  288. static struct pmx_dev_mode pmx_pwm2_modes[] = {
  289. {
  290. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  291. .mask = PMX_SSP_CS_MASK,
  292. }, {
  293. .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
  294. .mask = PMX_MII_MASK,
  295. },
  296. };
  297. struct pmx_dev spear320_pmx_pwm2 = {
  298. .name = "pwm2",
  299. .modes = pmx_pwm2_modes,
  300. .mode_count = ARRAY_SIZE(pmx_pwm2_modes),
  301. .enb_on_reset = 1,
  302. };
  303. static struct pmx_dev_mode pmx_pwm3_modes[] = {
  304. {
  305. .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE,
  306. .mask = PMX_MII_MASK,
  307. },
  308. };
  309. struct pmx_dev spear320_pmx_pwm3 = {
  310. .name = "pwm3",
  311. .modes = pmx_pwm3_modes,
  312. .mode_count = ARRAY_SIZE(pmx_pwm3_modes),
  313. .enb_on_reset = 1,
  314. };
  315. static struct pmx_dev_mode pmx_ssp1_modes[] = {
  316. {
  317. .ids = SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE,
  318. .mask = PMX_MII_MASK,
  319. },
  320. };
  321. struct pmx_dev spear320_pmx_ssp1 = {
  322. .name = "ssp1",
  323. .modes = pmx_ssp1_modes,
  324. .mode_count = ARRAY_SIZE(pmx_ssp1_modes),
  325. .enb_on_reset = 1,
  326. };
  327. static struct pmx_dev_mode pmx_ssp2_modes[] = {
  328. {
  329. .ids = AUTO_NET_SMII_MODE,
  330. .mask = PMX_MII_MASK,
  331. },
  332. };
  333. struct pmx_dev spear320_pmx_ssp2 = {
  334. .name = "ssp2",
  335. .modes = pmx_ssp2_modes,
  336. .mode_count = ARRAY_SIZE(pmx_ssp2_modes),
  337. .enb_on_reset = 1,
  338. };
  339. static struct pmx_dev_mode pmx_mii1_modes[] = {
  340. {
  341. .ids = AUTO_NET_MII_MODE,
  342. .mask = 0x0,
  343. },
  344. };
  345. struct pmx_dev spear320_pmx_mii1 = {
  346. .name = "mii1",
  347. .modes = pmx_mii1_modes,
  348. .mode_count = ARRAY_SIZE(pmx_mii1_modes),
  349. .enb_on_reset = 1,
  350. };
  351. static struct pmx_dev_mode pmx_smii0_modes[] = {
  352. {
  353. .ids = AUTO_NET_SMII_MODE | AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
  354. .mask = PMX_MII_MASK,
  355. },
  356. };
  357. struct pmx_dev spear320_pmx_smii0 = {
  358. .name = "smii0",
  359. .modes = pmx_smii0_modes,
  360. .mode_count = ARRAY_SIZE(pmx_smii0_modes),
  361. .enb_on_reset = 1,
  362. };
  363. static struct pmx_dev_mode pmx_smii1_modes[] = {
  364. {
  365. .ids = AUTO_NET_SMII_MODE | SMALL_PRINTERS_MODE,
  366. .mask = PMX_MII_MASK,
  367. },
  368. };
  369. struct pmx_dev spear320_pmx_smii1 = {
  370. .name = "smii1",
  371. .modes = pmx_smii1_modes,
  372. .mode_count = ARRAY_SIZE(pmx_smii1_modes),
  373. .enb_on_reset = 1,
  374. };
  375. static struct pmx_dev_mode pmx_i2c1_modes[] = {
  376. {
  377. .ids = AUTO_EXP_MODE,
  378. .mask = 0x0,
  379. },
  380. };
  381. struct pmx_dev spear320_pmx_i2c1 = {
  382. .name = "i2c1",
  383. .modes = pmx_i2c1_modes,
  384. .mode_count = ARRAY_SIZE(pmx_i2c1_modes),
  385. .enb_on_reset = 1,
  386. };
  387. /* pmx driver structure */
  388. static struct pmx_driver pmx_driver = {
  389. .mode_reg = {.offset = MODE_CONFIG_REG, .mask = 0x00000007},
  390. .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
  391. };
  392. /* spear3xx shared irq */
  393. static struct shirq_dev_config shirq_ras1_config[] = {
  394. {
  395. .virq = SPEAR320_VIRQ_EMI,
  396. .status_mask = SPEAR320_EMI_IRQ_MASK,
  397. .clear_mask = SPEAR320_EMI_IRQ_MASK,
  398. }, {
  399. .virq = SPEAR320_VIRQ_CLCD,
  400. .status_mask = SPEAR320_CLCD_IRQ_MASK,
  401. .clear_mask = SPEAR320_CLCD_IRQ_MASK,
  402. }, {
  403. .virq = SPEAR320_VIRQ_SPP,
  404. .status_mask = SPEAR320_SPP_IRQ_MASK,
  405. .clear_mask = SPEAR320_SPP_IRQ_MASK,
  406. },
  407. };
  408. static struct spear_shirq shirq_ras1 = {
  409. .irq = SPEAR3XX_IRQ_GEN_RAS_1,
  410. .dev_config = shirq_ras1_config,
  411. .dev_count = ARRAY_SIZE(shirq_ras1_config),
  412. .regs = {
  413. .enb_reg = -1,
  414. .status_reg = SPEAR320_INT_STS_MASK_REG,
  415. .status_reg_mask = SPEAR320_SHIRQ_RAS1_MASK,
  416. .clear_reg = SPEAR320_INT_CLR_MASK_REG,
  417. .reset_to_clear = 1,
  418. },
  419. };
  420. static struct shirq_dev_config shirq_ras3_config[] = {
  421. {
  422. .virq = SPEAR320_VIRQ_PLGPIO,
  423. .enb_mask = SPEAR320_GPIO_IRQ_MASK,
  424. .status_mask = SPEAR320_GPIO_IRQ_MASK,
  425. .clear_mask = SPEAR320_GPIO_IRQ_MASK,
  426. }, {
  427. .virq = SPEAR320_VIRQ_I2S_PLAY,
  428. .enb_mask = SPEAR320_I2S_PLAY_IRQ_MASK,
  429. .status_mask = SPEAR320_I2S_PLAY_IRQ_MASK,
  430. .clear_mask = SPEAR320_I2S_PLAY_IRQ_MASK,
  431. }, {
  432. .virq = SPEAR320_VIRQ_I2S_REC,
  433. .enb_mask = SPEAR320_I2S_REC_IRQ_MASK,
  434. .status_mask = SPEAR320_I2S_REC_IRQ_MASK,
  435. .clear_mask = SPEAR320_I2S_REC_IRQ_MASK,
  436. },
  437. };
  438. static struct spear_shirq shirq_ras3 = {
  439. .irq = SPEAR3XX_IRQ_GEN_RAS_3,
  440. .dev_config = shirq_ras3_config,
  441. .dev_count = ARRAY_SIZE(shirq_ras3_config),
  442. .regs = {
  443. .enb_reg = SPEAR320_INT_ENB_MASK_REG,
  444. .reset_to_enb = 1,
  445. .status_reg = SPEAR320_INT_STS_MASK_REG,
  446. .status_reg_mask = SPEAR320_SHIRQ_RAS3_MASK,
  447. .clear_reg = SPEAR320_INT_CLR_MASK_REG,
  448. .reset_to_clear = 1,
  449. },
  450. };
  451. static struct shirq_dev_config shirq_intrcomm_ras_config[] = {
  452. {
  453. .virq = SPEAR320_VIRQ_CANU,
  454. .status_mask = SPEAR320_CAN_U_IRQ_MASK,
  455. .clear_mask = SPEAR320_CAN_U_IRQ_MASK,
  456. }, {
  457. .virq = SPEAR320_VIRQ_CANL,
  458. .status_mask = SPEAR320_CAN_L_IRQ_MASK,
  459. .clear_mask = SPEAR320_CAN_L_IRQ_MASK,
  460. }, {
  461. .virq = SPEAR320_VIRQ_UART1,
  462. .status_mask = SPEAR320_UART1_IRQ_MASK,
  463. .clear_mask = SPEAR320_UART1_IRQ_MASK,
  464. }, {
  465. .virq = SPEAR320_VIRQ_UART2,
  466. .status_mask = SPEAR320_UART2_IRQ_MASK,
  467. .clear_mask = SPEAR320_UART2_IRQ_MASK,
  468. }, {
  469. .virq = SPEAR320_VIRQ_SSP1,
  470. .status_mask = SPEAR320_SSP1_IRQ_MASK,
  471. .clear_mask = SPEAR320_SSP1_IRQ_MASK,
  472. }, {
  473. .virq = SPEAR320_VIRQ_SSP2,
  474. .status_mask = SPEAR320_SSP2_IRQ_MASK,
  475. .clear_mask = SPEAR320_SSP2_IRQ_MASK,
  476. }, {
  477. .virq = SPEAR320_VIRQ_SMII0,
  478. .status_mask = SPEAR320_SMII0_IRQ_MASK,
  479. .clear_mask = SPEAR320_SMII0_IRQ_MASK,
  480. }, {
  481. .virq = SPEAR320_VIRQ_MII1_SMII1,
  482. .status_mask = SPEAR320_MII1_SMII1_IRQ_MASK,
  483. .clear_mask = SPEAR320_MII1_SMII1_IRQ_MASK,
  484. }, {
  485. .virq = SPEAR320_VIRQ_WAKEUP_SMII0,
  486. .status_mask = SPEAR320_WAKEUP_SMII0_IRQ_MASK,
  487. .clear_mask = SPEAR320_WAKEUP_SMII0_IRQ_MASK,
  488. }, {
  489. .virq = SPEAR320_VIRQ_WAKEUP_MII1_SMII1,
  490. .status_mask = SPEAR320_WAKEUP_MII1_SMII1_IRQ_MASK,
  491. .clear_mask = SPEAR320_WAKEUP_MII1_SMII1_IRQ_MASK,
  492. }, {
  493. .virq = SPEAR320_VIRQ_I2C1,
  494. .status_mask = SPEAR320_I2C1_IRQ_MASK,
  495. .clear_mask = SPEAR320_I2C1_IRQ_MASK,
  496. },
  497. };
  498. static struct spear_shirq shirq_intrcomm_ras = {
  499. .irq = SPEAR3XX_IRQ_INTRCOMM_RAS_ARM,
  500. .dev_config = shirq_intrcomm_ras_config,
  501. .dev_count = ARRAY_SIZE(shirq_intrcomm_ras_config),
  502. .regs = {
  503. .enb_reg = -1,
  504. .status_reg = SPEAR320_INT_STS_MASK_REG,
  505. .status_reg_mask = SPEAR320_SHIRQ_INTRCOMM_RAS_MASK,
  506. .clear_reg = SPEAR320_INT_CLR_MASK_REG,
  507. .reset_to_clear = 1,
  508. },
  509. };
  510. /* padmux devices to enable */
  511. static struct pmx_dev *spear320_evb_pmx_devs[] = {
  512. /* spear3xx specific devices */
  513. &spear3xx_pmx_i2c,
  514. &spear3xx_pmx_ssp,
  515. &spear3xx_pmx_mii,
  516. &spear3xx_pmx_uart0,
  517. /* spear320 specific devices */
  518. &spear320_pmx_fsmc,
  519. &spear320_pmx_sdhci,
  520. &spear320_pmx_i2s,
  521. &spear320_pmx_uart1,
  522. &spear320_pmx_uart2,
  523. &spear320_pmx_can,
  524. &spear320_pmx_pwm0,
  525. &spear320_pmx_pwm1,
  526. &spear320_pmx_pwm2,
  527. &spear320_pmx_mii1,
  528. };
  529. /* DMAC platform data's slave info */
  530. struct pl08x_channel_data spear320_dma_info[] = {
  531. {
  532. .bus_id = "uart0_rx",
  533. .min_signal = 2,
  534. .max_signal = 2,
  535. .muxval = 0,
  536. .cctl = 0,
  537. .periph_buses = PL08X_AHB1,
  538. }, {
  539. .bus_id = "uart0_tx",
  540. .min_signal = 3,
  541. .max_signal = 3,
  542. .muxval = 0,
  543. .cctl = 0,
  544. .periph_buses = PL08X_AHB1,
  545. }, {
  546. .bus_id = "ssp0_rx",
  547. .min_signal = 8,
  548. .max_signal = 8,
  549. .muxval = 0,
  550. .cctl = 0,
  551. .periph_buses = PL08X_AHB1,
  552. }, {
  553. .bus_id = "ssp0_tx",
  554. .min_signal = 9,
  555. .max_signal = 9,
  556. .muxval = 0,
  557. .cctl = 0,
  558. .periph_buses = PL08X_AHB1,
  559. }, {
  560. .bus_id = "i2c0_rx",
  561. .min_signal = 10,
  562. .max_signal = 10,
  563. .muxval = 0,
  564. .cctl = 0,
  565. .periph_buses = PL08X_AHB1,
  566. }, {
  567. .bus_id = "i2c0_tx",
  568. .min_signal = 11,
  569. .max_signal = 11,
  570. .muxval = 0,
  571. .cctl = 0,
  572. .periph_buses = PL08X_AHB1,
  573. }, {
  574. .bus_id = "irda",
  575. .min_signal = 12,
  576. .max_signal = 12,
  577. .muxval = 0,
  578. .cctl = 0,
  579. .periph_buses = PL08X_AHB1,
  580. }, {
  581. .bus_id = "adc",
  582. .min_signal = 13,
  583. .max_signal = 13,
  584. .muxval = 0,
  585. .cctl = 0,
  586. .periph_buses = PL08X_AHB1,
  587. }, {
  588. .bus_id = "to_jpeg",
  589. .min_signal = 14,
  590. .max_signal = 14,
  591. .muxval = 0,
  592. .cctl = 0,
  593. .periph_buses = PL08X_AHB1,
  594. }, {
  595. .bus_id = "from_jpeg",
  596. .min_signal = 15,
  597. .max_signal = 15,
  598. .muxval = 0,
  599. .cctl = 0,
  600. .periph_buses = PL08X_AHB1,
  601. }, {
  602. .bus_id = "ssp1_rx",
  603. .min_signal = 0,
  604. .max_signal = 0,
  605. .muxval = 1,
  606. .cctl = 0,
  607. .periph_buses = PL08X_AHB2,
  608. }, {
  609. .bus_id = "ssp1_tx",
  610. .min_signal = 1,
  611. .max_signal = 1,
  612. .muxval = 1,
  613. .cctl = 0,
  614. .periph_buses = PL08X_AHB2,
  615. }, {
  616. .bus_id = "ssp2_rx",
  617. .min_signal = 2,
  618. .max_signal = 2,
  619. .muxval = 1,
  620. .cctl = 0,
  621. .periph_buses = PL08X_AHB2,
  622. }, {
  623. .bus_id = "ssp2_tx",
  624. .min_signal = 3,
  625. .max_signal = 3,
  626. .muxval = 1,
  627. .cctl = 0,
  628. .periph_buses = PL08X_AHB2,
  629. }, {
  630. .bus_id = "uart1_rx",
  631. .min_signal = 4,
  632. .max_signal = 4,
  633. .muxval = 1,
  634. .cctl = 0,
  635. .periph_buses = PL08X_AHB2,
  636. }, {
  637. .bus_id = "uart1_tx",
  638. .min_signal = 5,
  639. .max_signal = 5,
  640. .muxval = 1,
  641. .cctl = 0,
  642. .periph_buses = PL08X_AHB2,
  643. }, {
  644. .bus_id = "uart2_rx",
  645. .min_signal = 6,
  646. .max_signal = 6,
  647. .muxval = 1,
  648. .cctl = 0,
  649. .periph_buses = PL08X_AHB2,
  650. }, {
  651. .bus_id = "uart2_tx",
  652. .min_signal = 7,
  653. .max_signal = 7,
  654. .muxval = 1,
  655. .cctl = 0,
  656. .periph_buses = PL08X_AHB2,
  657. }, {
  658. .bus_id = "i2c1_rx",
  659. .min_signal = 8,
  660. .max_signal = 8,
  661. .muxval = 1,
  662. .cctl = 0,
  663. .periph_buses = PL08X_AHB2,
  664. }, {
  665. .bus_id = "i2c1_tx",
  666. .min_signal = 9,
  667. .max_signal = 9,
  668. .muxval = 1,
  669. .cctl = 0,
  670. .periph_buses = PL08X_AHB2,
  671. }, {
  672. .bus_id = "i2c2_rx",
  673. .min_signal = 10,
  674. .max_signal = 10,
  675. .muxval = 1,
  676. .cctl = 0,
  677. .periph_buses = PL08X_AHB2,
  678. }, {
  679. .bus_id = "i2c2_tx",
  680. .min_signal = 11,
  681. .max_signal = 11,
  682. .muxval = 1,
  683. .cctl = 0,
  684. .periph_buses = PL08X_AHB2,
  685. }, {
  686. .bus_id = "i2s_rx",
  687. .min_signal = 12,
  688. .max_signal = 12,
  689. .muxval = 1,
  690. .cctl = 0,
  691. .periph_buses = PL08X_AHB2,
  692. }, {
  693. .bus_id = "i2s_tx",
  694. .min_signal = 13,
  695. .max_signal = 13,
  696. .muxval = 1,
  697. .cctl = 0,
  698. .periph_buses = PL08X_AHB2,
  699. }, {
  700. .bus_id = "rs485_rx",
  701. .min_signal = 14,
  702. .max_signal = 14,
  703. .muxval = 1,
  704. .cctl = 0,
  705. .periph_buses = PL08X_AHB2,
  706. }, {
  707. .bus_id = "rs485_tx",
  708. .min_signal = 15,
  709. .max_signal = 15,
  710. .muxval = 1,
  711. .cctl = 0,
  712. .periph_buses = PL08X_AHB2,
  713. },
  714. };
  715. static struct pl022_ssp_controller spear320_ssp_data[] = {
  716. {
  717. .bus_id = 1,
  718. .enable_dma = 1,
  719. .dma_filter = pl08x_filter_id,
  720. .dma_tx_param = "ssp1_tx",
  721. .dma_rx_param = "ssp1_rx",
  722. .num_chipselect = 2,
  723. }, {
  724. .bus_id = 2,
  725. .enable_dma = 1,
  726. .dma_filter = pl08x_filter_id,
  727. .dma_tx_param = "ssp2_tx",
  728. .dma_rx_param = "ssp2_rx",
  729. .num_chipselect = 2,
  730. }
  731. };
  732. static struct amba_pl011_data spear320_uart_data[] = {
  733. {
  734. .dma_filter = pl08x_filter_id,
  735. .dma_tx_param = "uart1_tx",
  736. .dma_rx_param = "uart1_rx",
  737. }, {
  738. .dma_filter = pl08x_filter_id,
  739. .dma_tx_param = "uart2_tx",
  740. .dma_rx_param = "uart2_rx",
  741. },
  742. };
  743. /* Add SPEAr310 auxdata to pass platform data */
  744. static struct of_dev_auxdata spear320_auxdata_lookup[] __initdata = {
  745. OF_DEV_AUXDATA("arm,pl022", SPEAR3XX_ICM1_SSP_BASE, NULL,
  746. &pl022_plat_data),
  747. OF_DEV_AUXDATA("arm,pl080", SPEAR3XX_ICM3_DMA_BASE, NULL,
  748. &pl080_plat_data),
  749. OF_DEV_AUXDATA("arm,pl022", SPEAR320_SSP0_BASE, NULL,
  750. &spear320_ssp_data[0]),
  751. OF_DEV_AUXDATA("arm,pl022", SPEAR320_SSP1_BASE, NULL,
  752. &spear320_ssp_data[1]),
  753. OF_DEV_AUXDATA("arm,pl011", SPEAR320_UART1_BASE, NULL,
  754. &spear320_uart_data[0]),
  755. OF_DEV_AUXDATA("arm,pl011", SPEAR320_UART2_BASE, NULL,
  756. &spear320_uart_data[1]),
  757. {}
  758. };
  759. static void __init spear320_dt_init(void)
  760. {
  761. void __iomem *base;
  762. int ret = 0;
  763. pl080_plat_data.slave_channels = spear320_dma_info;
  764. pl080_plat_data.num_slave_channels = ARRAY_SIZE(spear320_dma_info);
  765. of_platform_populate(NULL, of_default_bus_match_table,
  766. spear320_auxdata_lookup, NULL);
  767. /* shared irq registration */
  768. base = ioremap(SPEAR320_SOC_CONFIG_BASE, SZ_4K);
  769. if (base) {
  770. /* shirq 1 */
  771. shirq_ras1.regs.base = base;
  772. ret = spear_shirq_register(&shirq_ras1);
  773. if (ret)
  774. pr_err("Error registering Shared IRQ 1\n");
  775. /* shirq 3 */
  776. shirq_ras3.regs.base = base;
  777. ret = spear_shirq_register(&shirq_ras3);
  778. if (ret)
  779. pr_err("Error registering Shared IRQ 3\n");
  780. /* shirq 4 */
  781. shirq_intrcomm_ras.regs.base = base;
  782. ret = spear_shirq_register(&shirq_intrcomm_ras);
  783. if (ret)
  784. pr_err("Error registering Shared IRQ 4\n");
  785. }
  786. if (of_machine_is_compatible("st,spear320-evb")) {
  787. /* pmx initialization */
  788. pmx_driver.base = base;
  789. pmx_driver.mode = &spear320_auto_net_mii_mode;
  790. pmx_driver.devs = spear320_evb_pmx_devs;
  791. pmx_driver.devs_count = ARRAY_SIZE(spear320_evb_pmx_devs);
  792. ret = pmx_register(&pmx_driver);
  793. if (ret)
  794. pr_err("padmux: registration failed. err no: %d\n",
  795. ret);
  796. }
  797. }
  798. static const char * const spear320_dt_board_compat[] = {
  799. "st,spear320",
  800. "st,spear320-evb",
  801. NULL,
  802. };
  803. static void __init spear320_map_io(void)
  804. {
  805. spear3xx_map_io();
  806. spear320_clk_init();
  807. }
  808. DT_MACHINE_START(SPEAR320_DT, "ST SPEAr320 SoC with Flattened Device Tree")
  809. .map_io = spear320_map_io,
  810. .init_irq = spear3xx_dt_init_irq,
  811. .handle_irq = vic_handle_irq,
  812. .timer = &spear3xx_timer,
  813. .init_machine = spear320_dt_init,
  814. .restart = spear_restart,
  815. .dt_compat = spear320_dt_board_compat,
  816. MACHINE_END