spear320.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. /*
  2. * arch/arm/mach-spear3xx/spear320.c
  3. *
  4. * SPEAr320 machine source file
  5. *
  6. * Copyright (C) 2009 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. #include <linux/ptrace.h>
  14. #include <asm/irq.h>
  15. #include <plat/shirq.h>
  16. #include <mach/generic.h>
  17. #include <mach/hardware.h>
  18. /* pad multiplexing support */
  19. /* muxing registers */
  20. #define PAD_MUX_CONFIG_REG 0x0C
  21. #define MODE_CONFIG_REG 0x10
  22. /* modes */
  23. #define AUTO_NET_SMII_MODE (1 << 0)
  24. #define AUTO_NET_MII_MODE (1 << 1)
  25. #define AUTO_EXP_MODE (1 << 2)
  26. #define SMALL_PRINTERS_MODE (1 << 3)
  27. #define ALL_MODES 0xF
  28. struct pmx_mode auto_net_smii_mode = {
  29. .id = AUTO_NET_SMII_MODE,
  30. .name = "Automation Networking SMII Mode",
  31. .mask = 0x00,
  32. };
  33. struct pmx_mode auto_net_mii_mode = {
  34. .id = AUTO_NET_MII_MODE,
  35. .name = "Automation Networking MII Mode",
  36. .mask = 0x01,
  37. };
  38. struct pmx_mode auto_exp_mode = {
  39. .id = AUTO_EXP_MODE,
  40. .name = "Automation Expanded Mode",
  41. .mask = 0x02,
  42. };
  43. struct pmx_mode small_printers_mode = {
  44. .id = SMALL_PRINTERS_MODE,
  45. .name = "Small Printers Mode",
  46. .mask = 0x03,
  47. };
  48. /* devices */
  49. struct pmx_dev_mode pmx_clcd_modes[] = {
  50. {
  51. .ids = AUTO_NET_SMII_MODE,
  52. .mask = 0x0,
  53. },
  54. };
  55. struct pmx_dev pmx_clcd = {
  56. .name = "clcd",
  57. .modes = pmx_clcd_modes,
  58. .mode_count = ARRAY_SIZE(pmx_clcd_modes),
  59. .enb_on_reset = 1,
  60. };
  61. struct pmx_dev_mode pmx_emi_modes[] = {
  62. {
  63. .ids = AUTO_EXP_MODE,
  64. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
  65. },
  66. };
  67. struct pmx_dev pmx_emi = {
  68. .name = "emi",
  69. .modes = pmx_emi_modes,
  70. .mode_count = ARRAY_SIZE(pmx_emi_modes),
  71. .enb_on_reset = 1,
  72. };
  73. struct pmx_dev_mode pmx_fsmc_modes[] = {
  74. {
  75. .ids = ALL_MODES,
  76. .mask = 0x0,
  77. },
  78. };
  79. struct pmx_dev pmx_fsmc = {
  80. .name = "fsmc",
  81. .modes = pmx_fsmc_modes,
  82. .mode_count = ARRAY_SIZE(pmx_fsmc_modes),
  83. .enb_on_reset = 1,
  84. };
  85. struct pmx_dev_mode pmx_spp_modes[] = {
  86. {
  87. .ids = SMALL_PRINTERS_MODE,
  88. .mask = 0x0,
  89. },
  90. };
  91. struct pmx_dev pmx_spp = {
  92. .name = "spp",
  93. .modes = pmx_spp_modes,
  94. .mode_count = ARRAY_SIZE(pmx_spp_modes),
  95. .enb_on_reset = 1,
  96. };
  97. struct pmx_dev_mode pmx_sdhci_modes[] = {
  98. {
  99. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE |
  100. SMALL_PRINTERS_MODE,
  101. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
  102. },
  103. };
  104. struct pmx_dev pmx_sdhci = {
  105. .name = "sdhci",
  106. .modes = pmx_sdhci_modes,
  107. .mode_count = ARRAY_SIZE(pmx_sdhci_modes),
  108. .enb_on_reset = 1,
  109. };
  110. struct pmx_dev_mode pmx_i2s_modes[] = {
  111. {
  112. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  113. .mask = PMX_UART0_MODEM_MASK,
  114. },
  115. };
  116. struct pmx_dev pmx_i2s = {
  117. .name = "i2s",
  118. .modes = pmx_i2s_modes,
  119. .mode_count = ARRAY_SIZE(pmx_i2s_modes),
  120. .enb_on_reset = 1,
  121. };
  122. struct pmx_dev_mode pmx_uart1_modes[] = {
  123. {
  124. .ids = ALL_MODES,
  125. .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK,
  126. },
  127. };
  128. struct pmx_dev pmx_uart1 = {
  129. .name = "uart1",
  130. .modes = pmx_uart1_modes,
  131. .mode_count = ARRAY_SIZE(pmx_uart1_modes),
  132. .enb_on_reset = 1,
  133. };
  134. struct pmx_dev_mode pmx_uart1_modem_modes[] = {
  135. {
  136. .ids = AUTO_EXP_MODE,
  137. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK |
  138. PMX_SSP_CS_MASK,
  139. }, {
  140. .ids = SMALL_PRINTERS_MODE,
  141. .mask = PMX_GPIO_PIN3_MASK | PMX_GPIO_PIN4_MASK |
  142. PMX_GPIO_PIN5_MASK | PMX_SSP_CS_MASK,
  143. },
  144. };
  145. struct pmx_dev pmx_uart1_modem = {
  146. .name = "uart1_modem",
  147. .modes = pmx_uart1_modem_modes,
  148. .mode_count = ARRAY_SIZE(pmx_uart1_modem_modes),
  149. .enb_on_reset = 1,
  150. };
  151. struct pmx_dev_mode pmx_uart2_modes[] = {
  152. {
  153. .ids = ALL_MODES,
  154. .mask = PMX_FIRDA_MASK,
  155. },
  156. };
  157. struct pmx_dev pmx_uart2 = {
  158. .name = "uart2",
  159. .modes = pmx_uart2_modes,
  160. .mode_count = ARRAY_SIZE(pmx_uart2_modes),
  161. .enb_on_reset = 1,
  162. };
  163. struct pmx_dev_mode pmx_touchscreen_modes[] = {
  164. {
  165. .ids = AUTO_NET_SMII_MODE,
  166. .mask = PMX_SSP_CS_MASK,
  167. },
  168. };
  169. struct pmx_dev pmx_touchscreen = {
  170. .name = "touchscreen",
  171. .modes = pmx_touchscreen_modes,
  172. .mode_count = ARRAY_SIZE(pmx_touchscreen_modes),
  173. .enb_on_reset = 1,
  174. };
  175. struct pmx_dev_mode pmx_can_modes[] = {
  176. {
  177. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | AUTO_EXP_MODE,
  178. .mask = PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
  179. PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK,
  180. },
  181. };
  182. struct pmx_dev pmx_can = {
  183. .name = "can",
  184. .modes = pmx_can_modes,
  185. .mode_count = ARRAY_SIZE(pmx_can_modes),
  186. .enb_on_reset = 1,
  187. };
  188. struct pmx_dev_mode pmx_sdhci_led_modes[] = {
  189. {
  190. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  191. .mask = PMX_SSP_CS_MASK,
  192. },
  193. };
  194. struct pmx_dev pmx_sdhci_led = {
  195. .name = "sdhci_led",
  196. .modes = pmx_sdhci_led_modes,
  197. .mode_count = ARRAY_SIZE(pmx_sdhci_led_modes),
  198. .enb_on_reset = 1,
  199. };
  200. struct pmx_dev_mode pmx_pwm0_modes[] = {
  201. {
  202. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  203. .mask = PMX_UART0_MODEM_MASK,
  204. }, {
  205. .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
  206. .mask = PMX_MII_MASK,
  207. },
  208. };
  209. struct pmx_dev pmx_pwm0 = {
  210. .name = "pwm0",
  211. .modes = pmx_pwm0_modes,
  212. .mode_count = ARRAY_SIZE(pmx_pwm0_modes),
  213. .enb_on_reset = 1,
  214. };
  215. struct pmx_dev_mode pmx_pwm1_modes[] = {
  216. {
  217. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  218. .mask = PMX_UART0_MODEM_MASK,
  219. }, {
  220. .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
  221. .mask = PMX_MII_MASK,
  222. },
  223. };
  224. struct pmx_dev pmx_pwm1 = {
  225. .name = "pwm1",
  226. .modes = pmx_pwm1_modes,
  227. .mode_count = ARRAY_SIZE(pmx_pwm1_modes),
  228. .enb_on_reset = 1,
  229. };
  230. struct pmx_dev_mode pmx_pwm2_modes[] = {
  231. {
  232. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  233. .mask = PMX_SSP_CS_MASK,
  234. }, {
  235. .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
  236. .mask = PMX_MII_MASK,
  237. },
  238. };
  239. struct pmx_dev pmx_pwm2 = {
  240. .name = "pwm2",
  241. .modes = pmx_pwm2_modes,
  242. .mode_count = ARRAY_SIZE(pmx_pwm2_modes),
  243. .enb_on_reset = 1,
  244. };
  245. struct pmx_dev_mode pmx_pwm3_modes[] = {
  246. {
  247. .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE,
  248. .mask = PMX_MII_MASK,
  249. },
  250. };
  251. struct pmx_dev pmx_pwm3 = {
  252. .name = "pwm3",
  253. .modes = pmx_pwm3_modes,
  254. .mode_count = ARRAY_SIZE(pmx_pwm3_modes),
  255. .enb_on_reset = 1,
  256. };
  257. struct pmx_dev_mode pmx_ssp1_modes[] = {
  258. {
  259. .ids = SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE,
  260. .mask = PMX_MII_MASK,
  261. },
  262. };
  263. struct pmx_dev pmx_ssp1 = {
  264. .name = "ssp1",
  265. .modes = pmx_ssp1_modes,
  266. .mode_count = ARRAY_SIZE(pmx_ssp1_modes),
  267. .enb_on_reset = 1,
  268. };
  269. struct pmx_dev_mode pmx_ssp2_modes[] = {
  270. {
  271. .ids = AUTO_NET_SMII_MODE,
  272. .mask = PMX_MII_MASK,
  273. },
  274. };
  275. struct pmx_dev pmx_ssp2 = {
  276. .name = "ssp2",
  277. .modes = pmx_ssp2_modes,
  278. .mode_count = ARRAY_SIZE(pmx_ssp2_modes),
  279. .enb_on_reset = 1,
  280. };
  281. struct pmx_dev_mode pmx_mii1_modes[] = {
  282. {
  283. .ids = AUTO_NET_MII_MODE,
  284. .mask = 0x0,
  285. },
  286. };
  287. struct pmx_dev pmx_mii1 = {
  288. .name = "mii1",
  289. .modes = pmx_mii1_modes,
  290. .mode_count = ARRAY_SIZE(pmx_mii1_modes),
  291. .enb_on_reset = 1,
  292. };
  293. struct pmx_dev_mode pmx_smii0_modes[] = {
  294. {
  295. .ids = AUTO_NET_SMII_MODE | AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
  296. .mask = PMX_MII_MASK,
  297. },
  298. };
  299. struct pmx_dev pmx_smii0 = {
  300. .name = "smii0",
  301. .modes = pmx_smii0_modes,
  302. .mode_count = ARRAY_SIZE(pmx_smii0_modes),
  303. .enb_on_reset = 1,
  304. };
  305. struct pmx_dev_mode pmx_smii1_modes[] = {
  306. {
  307. .ids = AUTO_NET_SMII_MODE | SMALL_PRINTERS_MODE,
  308. .mask = PMX_MII_MASK,
  309. },
  310. };
  311. struct pmx_dev pmx_smii1 = {
  312. .name = "smii1",
  313. .modes = pmx_smii1_modes,
  314. .mode_count = ARRAY_SIZE(pmx_smii1_modes),
  315. .enb_on_reset = 1,
  316. };
  317. struct pmx_dev_mode pmx_i2c1_modes[] = {
  318. {
  319. .ids = AUTO_EXP_MODE,
  320. .mask = 0x0,
  321. },
  322. };
  323. struct pmx_dev pmx_i2c1 = {
  324. .name = "i2c1",
  325. .modes = pmx_i2c1_modes,
  326. .mode_count = ARRAY_SIZE(pmx_i2c1_modes),
  327. .enb_on_reset = 1,
  328. };
  329. /* pmx driver structure */
  330. struct pmx_driver pmx_driver = {
  331. .mode_reg = {.offset = MODE_CONFIG_REG, .mask = 0x00000007},
  332. .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
  333. };
  334. /* spear3xx shared irq */
  335. struct shirq_dev_config shirq_ras1_config[] = {
  336. {
  337. .virq = VIRQ_EMI,
  338. .status_mask = EMI_IRQ_MASK,
  339. .clear_mask = EMI_IRQ_MASK,
  340. }, {
  341. .virq = VIRQ_CLCD,
  342. .status_mask = CLCD_IRQ_MASK,
  343. .clear_mask = CLCD_IRQ_MASK,
  344. }, {
  345. .virq = VIRQ_SPP,
  346. .status_mask = SPP_IRQ_MASK,
  347. .clear_mask = SPP_IRQ_MASK,
  348. },
  349. };
  350. struct spear_shirq shirq_ras1 = {
  351. .irq = IRQ_GEN_RAS_1,
  352. .dev_config = shirq_ras1_config,
  353. .dev_count = ARRAY_SIZE(shirq_ras1_config),
  354. .regs = {
  355. .enb_reg = -1,
  356. .status_reg = INT_STS_MASK_REG,
  357. .status_reg_mask = SHIRQ_RAS1_MASK,
  358. .clear_reg = INT_CLR_MASK_REG,
  359. .reset_to_clear = 1,
  360. },
  361. };
  362. struct shirq_dev_config shirq_ras3_config[] = {
  363. {
  364. .virq = VIRQ_PLGPIO,
  365. .enb_mask = GPIO_IRQ_MASK,
  366. .status_mask = GPIO_IRQ_MASK,
  367. .clear_mask = GPIO_IRQ_MASK,
  368. }, {
  369. .virq = VIRQ_I2S_PLAY,
  370. .enb_mask = I2S_PLAY_IRQ_MASK,
  371. .status_mask = I2S_PLAY_IRQ_MASK,
  372. .clear_mask = I2S_PLAY_IRQ_MASK,
  373. }, {
  374. .virq = VIRQ_I2S_REC,
  375. .enb_mask = I2S_REC_IRQ_MASK,
  376. .status_mask = I2S_REC_IRQ_MASK,
  377. .clear_mask = I2S_REC_IRQ_MASK,
  378. },
  379. };
  380. struct spear_shirq shirq_ras3 = {
  381. .irq = IRQ_GEN_RAS_3,
  382. .dev_config = shirq_ras3_config,
  383. .dev_count = ARRAY_SIZE(shirq_ras3_config),
  384. .regs = {
  385. .enb_reg = INT_ENB_MASK_REG,
  386. .reset_to_enb = 1,
  387. .status_reg = INT_STS_MASK_REG,
  388. .status_reg_mask = SHIRQ_RAS3_MASK,
  389. .clear_reg = INT_CLR_MASK_REG,
  390. .reset_to_clear = 1,
  391. },
  392. };
  393. struct shirq_dev_config shirq_intrcomm_ras_config[] = {
  394. {
  395. .virq = VIRQ_CANU,
  396. .status_mask = CAN_U_IRQ_MASK,
  397. .clear_mask = CAN_U_IRQ_MASK,
  398. }, {
  399. .virq = VIRQ_CANL,
  400. .status_mask = CAN_L_IRQ_MASK,
  401. .clear_mask = CAN_L_IRQ_MASK,
  402. }, {
  403. .virq = VIRQ_UART1,
  404. .status_mask = UART1_IRQ_MASK,
  405. .clear_mask = UART1_IRQ_MASK,
  406. }, {
  407. .virq = VIRQ_UART2,
  408. .status_mask = UART2_IRQ_MASK,
  409. .clear_mask = UART2_IRQ_MASK,
  410. }, {
  411. .virq = VIRQ_SSP1,
  412. .status_mask = SSP1_IRQ_MASK,
  413. .clear_mask = SSP1_IRQ_MASK,
  414. }, {
  415. .virq = VIRQ_SSP2,
  416. .status_mask = SSP2_IRQ_MASK,
  417. .clear_mask = SSP2_IRQ_MASK,
  418. }, {
  419. .virq = VIRQ_SMII0,
  420. .status_mask = SMII0_IRQ_MASK,
  421. .clear_mask = SMII0_IRQ_MASK,
  422. }, {
  423. .virq = VIRQ_MII1_SMII1,
  424. .status_mask = MII1_SMII1_IRQ_MASK,
  425. .clear_mask = MII1_SMII1_IRQ_MASK,
  426. }, {
  427. .virq = VIRQ_WAKEUP_SMII0,
  428. .status_mask = WAKEUP_SMII0_IRQ_MASK,
  429. .clear_mask = WAKEUP_SMII0_IRQ_MASK,
  430. }, {
  431. .virq = VIRQ_WAKEUP_MII1_SMII1,
  432. .status_mask = WAKEUP_MII1_SMII1_IRQ_MASK,
  433. .clear_mask = WAKEUP_MII1_SMII1_IRQ_MASK,
  434. }, {
  435. .virq = VIRQ_I2C,
  436. .status_mask = I2C1_IRQ_MASK,
  437. .clear_mask = I2C1_IRQ_MASK,
  438. },
  439. };
  440. struct spear_shirq shirq_intrcomm_ras = {
  441. .irq = IRQ_INTRCOMM_RAS_ARM,
  442. .dev_config = shirq_intrcomm_ras_config,
  443. .dev_count = ARRAY_SIZE(shirq_intrcomm_ras_config),
  444. .regs = {
  445. .enb_reg = -1,
  446. .status_reg = INT_STS_MASK_REG,
  447. .status_reg_mask = SHIRQ_INTRCOMM_RAS_MASK,
  448. .clear_reg = INT_CLR_MASK_REG,
  449. .reset_to_clear = 1,
  450. },
  451. };
  452. /* Add spear320 specific devices here */
  453. /* spear320 routines */
  454. void __init spear320_init(void)
  455. {
  456. void __iomem *base;
  457. int ret = 0;
  458. /* call spear3xx family common init function */
  459. spear3xx_init();
  460. /* shared irq registration */
  461. base = ioremap(SPEAR320_SOC_CONFIG_BASE, SZ_4K);
  462. if (base) {
  463. /* shirq 1 */
  464. shirq_ras1.regs.base = base;
  465. ret = spear_shirq_register(&shirq_ras1);
  466. if (ret)
  467. printk(KERN_ERR "Error registering Shared IRQ 1\n");
  468. /* shirq 3 */
  469. shirq_ras3.regs.base = base;
  470. ret = spear_shirq_register(&shirq_ras3);
  471. if (ret)
  472. printk(KERN_ERR "Error registering Shared IRQ 3\n");
  473. /* shirq 4 */
  474. shirq_intrcomm_ras.regs.base = base;
  475. ret = spear_shirq_register(&shirq_intrcomm_ras);
  476. if (ret)
  477. printk(KERN_ERR "Error registering Shared IRQ 4\n");
  478. }
  479. /* pmx initialization */
  480. pmx_driver.base = base;
  481. ret = pmx_register(&pmx_driver);
  482. if (ret)
  483. printk(KERN_ERR "padmux: registeration failed. err no: %d\n",
  484. ret);
  485. }