spear320.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  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. #include <mach/spear.h>
  19. /* pad multiplexing support */
  20. /* muxing registers */
  21. #define PAD_MUX_CONFIG_REG 0x0C
  22. #define MODE_CONFIG_REG 0x10
  23. /* modes */
  24. #define AUTO_NET_SMII_MODE (1 << 0)
  25. #define AUTO_NET_MII_MODE (1 << 1)
  26. #define AUTO_EXP_MODE (1 << 2)
  27. #define SMALL_PRINTERS_MODE (1 << 3)
  28. #define ALL_MODES 0xF
  29. struct pmx_mode spear320_auto_net_smii_mode = {
  30. .id = AUTO_NET_SMII_MODE,
  31. .name = "Automation Networking SMII Mode",
  32. .mask = 0x00,
  33. };
  34. struct pmx_mode spear320_auto_net_mii_mode = {
  35. .id = AUTO_NET_MII_MODE,
  36. .name = "Automation Networking MII Mode",
  37. .mask = 0x01,
  38. };
  39. struct pmx_mode spear320_auto_exp_mode = {
  40. .id = AUTO_EXP_MODE,
  41. .name = "Automation Expanded Mode",
  42. .mask = 0x02,
  43. };
  44. struct pmx_mode spear320_small_printers_mode = {
  45. .id = SMALL_PRINTERS_MODE,
  46. .name = "Small Printers Mode",
  47. .mask = 0x03,
  48. };
  49. /* devices */
  50. static struct pmx_dev_mode pmx_clcd_modes[] = {
  51. {
  52. .ids = AUTO_NET_SMII_MODE,
  53. .mask = 0x0,
  54. },
  55. };
  56. struct pmx_dev spear320_pmx_clcd = {
  57. .name = "clcd",
  58. .modes = pmx_clcd_modes,
  59. .mode_count = ARRAY_SIZE(pmx_clcd_modes),
  60. .enb_on_reset = 1,
  61. };
  62. static struct pmx_dev_mode pmx_emi_modes[] = {
  63. {
  64. .ids = AUTO_EXP_MODE,
  65. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
  66. },
  67. };
  68. struct pmx_dev spear320_pmx_emi = {
  69. .name = "emi",
  70. .modes = pmx_emi_modes,
  71. .mode_count = ARRAY_SIZE(pmx_emi_modes),
  72. .enb_on_reset = 1,
  73. };
  74. static struct pmx_dev_mode pmx_fsmc_modes[] = {
  75. {
  76. .ids = ALL_MODES,
  77. .mask = 0x0,
  78. },
  79. };
  80. struct pmx_dev spear320_pmx_fsmc = {
  81. .name = "fsmc",
  82. .modes = pmx_fsmc_modes,
  83. .mode_count = ARRAY_SIZE(pmx_fsmc_modes),
  84. .enb_on_reset = 1,
  85. };
  86. static struct pmx_dev_mode pmx_spp_modes[] = {
  87. {
  88. .ids = SMALL_PRINTERS_MODE,
  89. .mask = 0x0,
  90. },
  91. };
  92. struct pmx_dev spear320_pmx_spp = {
  93. .name = "spp",
  94. .modes = pmx_spp_modes,
  95. .mode_count = ARRAY_SIZE(pmx_spp_modes),
  96. .enb_on_reset = 1,
  97. };
  98. static struct pmx_dev_mode pmx_sdhci_modes[] = {
  99. {
  100. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE |
  101. SMALL_PRINTERS_MODE,
  102. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
  103. },
  104. };
  105. struct pmx_dev spear320_pmx_sdhci = {
  106. .name = "sdhci",
  107. .modes = pmx_sdhci_modes,
  108. .mode_count = ARRAY_SIZE(pmx_sdhci_modes),
  109. .enb_on_reset = 1,
  110. };
  111. static struct pmx_dev_mode pmx_i2s_modes[] = {
  112. {
  113. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  114. .mask = PMX_UART0_MODEM_MASK,
  115. },
  116. };
  117. struct pmx_dev spear320_pmx_i2s = {
  118. .name = "i2s",
  119. .modes = pmx_i2s_modes,
  120. .mode_count = ARRAY_SIZE(pmx_i2s_modes),
  121. .enb_on_reset = 1,
  122. };
  123. static struct pmx_dev_mode pmx_uart1_modes[] = {
  124. {
  125. .ids = ALL_MODES,
  126. .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK,
  127. },
  128. };
  129. struct pmx_dev spear320_pmx_uart1 = {
  130. .name = "uart1",
  131. .modes = pmx_uart1_modes,
  132. .mode_count = ARRAY_SIZE(pmx_uart1_modes),
  133. .enb_on_reset = 1,
  134. };
  135. static struct pmx_dev_mode pmx_uart1_modem_modes[] = {
  136. {
  137. .ids = AUTO_EXP_MODE,
  138. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK |
  139. PMX_SSP_CS_MASK,
  140. }, {
  141. .ids = SMALL_PRINTERS_MODE,
  142. .mask = PMX_GPIO_PIN3_MASK | PMX_GPIO_PIN4_MASK |
  143. PMX_GPIO_PIN5_MASK | PMX_SSP_CS_MASK,
  144. },
  145. };
  146. struct pmx_dev spear320_pmx_uart1_modem = {
  147. .name = "uart1_modem",
  148. .modes = pmx_uart1_modem_modes,
  149. .mode_count = ARRAY_SIZE(pmx_uart1_modem_modes),
  150. .enb_on_reset = 1,
  151. };
  152. static struct pmx_dev_mode pmx_uart2_modes[] = {
  153. {
  154. .ids = ALL_MODES,
  155. .mask = PMX_FIRDA_MASK,
  156. },
  157. };
  158. struct pmx_dev spear320_pmx_uart2 = {
  159. .name = "uart2",
  160. .modes = pmx_uart2_modes,
  161. .mode_count = ARRAY_SIZE(pmx_uart2_modes),
  162. .enb_on_reset = 1,
  163. };
  164. static struct pmx_dev_mode pmx_touchscreen_modes[] = {
  165. {
  166. .ids = AUTO_NET_SMII_MODE,
  167. .mask = PMX_SSP_CS_MASK,
  168. },
  169. };
  170. struct pmx_dev spear320_pmx_touchscreen = {
  171. .name = "touchscreen",
  172. .modes = pmx_touchscreen_modes,
  173. .mode_count = ARRAY_SIZE(pmx_touchscreen_modes),
  174. .enb_on_reset = 1,
  175. };
  176. static struct pmx_dev_mode pmx_can_modes[] = {
  177. {
  178. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | AUTO_EXP_MODE,
  179. .mask = PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
  180. PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK,
  181. },
  182. };
  183. struct pmx_dev spear320_pmx_can = {
  184. .name = "can",
  185. .modes = pmx_can_modes,
  186. .mode_count = ARRAY_SIZE(pmx_can_modes),
  187. .enb_on_reset = 1,
  188. };
  189. static struct pmx_dev_mode pmx_sdhci_led_modes[] = {
  190. {
  191. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  192. .mask = PMX_SSP_CS_MASK,
  193. },
  194. };
  195. struct pmx_dev spear320_pmx_sdhci_led = {
  196. .name = "sdhci_led",
  197. .modes = pmx_sdhci_led_modes,
  198. .mode_count = ARRAY_SIZE(pmx_sdhci_led_modes),
  199. .enb_on_reset = 1,
  200. };
  201. static struct pmx_dev_mode pmx_pwm0_modes[] = {
  202. {
  203. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  204. .mask = PMX_UART0_MODEM_MASK,
  205. }, {
  206. .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
  207. .mask = PMX_MII_MASK,
  208. },
  209. };
  210. struct pmx_dev spear320_pmx_pwm0 = {
  211. .name = "pwm0",
  212. .modes = pmx_pwm0_modes,
  213. .mode_count = ARRAY_SIZE(pmx_pwm0_modes),
  214. .enb_on_reset = 1,
  215. };
  216. static struct pmx_dev_mode pmx_pwm1_modes[] = {
  217. {
  218. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  219. .mask = PMX_UART0_MODEM_MASK,
  220. }, {
  221. .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
  222. .mask = PMX_MII_MASK,
  223. },
  224. };
  225. struct pmx_dev spear320_pmx_pwm1 = {
  226. .name = "pwm1",
  227. .modes = pmx_pwm1_modes,
  228. .mode_count = ARRAY_SIZE(pmx_pwm1_modes),
  229. .enb_on_reset = 1,
  230. };
  231. static struct pmx_dev_mode pmx_pwm2_modes[] = {
  232. {
  233. .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
  234. .mask = PMX_SSP_CS_MASK,
  235. }, {
  236. .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
  237. .mask = PMX_MII_MASK,
  238. },
  239. };
  240. struct pmx_dev spear320_pmx_pwm2 = {
  241. .name = "pwm2",
  242. .modes = pmx_pwm2_modes,
  243. .mode_count = ARRAY_SIZE(pmx_pwm2_modes),
  244. .enb_on_reset = 1,
  245. };
  246. static struct pmx_dev_mode pmx_pwm3_modes[] = {
  247. {
  248. .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE,
  249. .mask = PMX_MII_MASK,
  250. },
  251. };
  252. struct pmx_dev spear320_pmx_pwm3 = {
  253. .name = "pwm3",
  254. .modes = pmx_pwm3_modes,
  255. .mode_count = ARRAY_SIZE(pmx_pwm3_modes),
  256. .enb_on_reset = 1,
  257. };
  258. static struct pmx_dev_mode pmx_ssp1_modes[] = {
  259. {
  260. .ids = SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE,
  261. .mask = PMX_MII_MASK,
  262. },
  263. };
  264. struct pmx_dev spear320_pmx_ssp1 = {
  265. .name = "ssp1",
  266. .modes = pmx_ssp1_modes,
  267. .mode_count = ARRAY_SIZE(pmx_ssp1_modes),
  268. .enb_on_reset = 1,
  269. };
  270. static struct pmx_dev_mode pmx_ssp2_modes[] = {
  271. {
  272. .ids = AUTO_NET_SMII_MODE,
  273. .mask = PMX_MII_MASK,
  274. },
  275. };
  276. struct pmx_dev spear320_pmx_ssp2 = {
  277. .name = "ssp2",
  278. .modes = pmx_ssp2_modes,
  279. .mode_count = ARRAY_SIZE(pmx_ssp2_modes),
  280. .enb_on_reset = 1,
  281. };
  282. static struct pmx_dev_mode pmx_mii1_modes[] = {
  283. {
  284. .ids = AUTO_NET_MII_MODE,
  285. .mask = 0x0,
  286. },
  287. };
  288. struct pmx_dev spear320_pmx_mii1 = {
  289. .name = "mii1",
  290. .modes = pmx_mii1_modes,
  291. .mode_count = ARRAY_SIZE(pmx_mii1_modes),
  292. .enb_on_reset = 1,
  293. };
  294. static struct pmx_dev_mode pmx_smii0_modes[] = {
  295. {
  296. .ids = AUTO_NET_SMII_MODE | AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
  297. .mask = PMX_MII_MASK,
  298. },
  299. };
  300. struct pmx_dev spear320_pmx_smii0 = {
  301. .name = "smii0",
  302. .modes = pmx_smii0_modes,
  303. .mode_count = ARRAY_SIZE(pmx_smii0_modes),
  304. .enb_on_reset = 1,
  305. };
  306. static struct pmx_dev_mode pmx_smii1_modes[] = {
  307. {
  308. .ids = AUTO_NET_SMII_MODE | SMALL_PRINTERS_MODE,
  309. .mask = PMX_MII_MASK,
  310. },
  311. };
  312. struct pmx_dev spear320_pmx_smii1 = {
  313. .name = "smii1",
  314. .modes = pmx_smii1_modes,
  315. .mode_count = ARRAY_SIZE(pmx_smii1_modes),
  316. .enb_on_reset = 1,
  317. };
  318. static struct pmx_dev_mode pmx_i2c1_modes[] = {
  319. {
  320. .ids = AUTO_EXP_MODE,
  321. .mask = 0x0,
  322. },
  323. };
  324. struct pmx_dev spear320_pmx_i2c1 = {
  325. .name = "i2c1",
  326. .modes = pmx_i2c1_modes,
  327. .mode_count = ARRAY_SIZE(pmx_i2c1_modes),
  328. .enb_on_reset = 1,
  329. };
  330. /* pmx driver structure */
  331. static struct pmx_driver pmx_driver = {
  332. .mode_reg = {.offset = MODE_CONFIG_REG, .mask = 0x00000007},
  333. .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
  334. };
  335. /* spear3xx shared irq */
  336. static struct shirq_dev_config shirq_ras1_config[] = {
  337. {
  338. .virq = SPEAR320_VIRQ_EMI,
  339. .status_mask = SPEAR320_EMI_IRQ_MASK,
  340. .clear_mask = SPEAR320_EMI_IRQ_MASK,
  341. }, {
  342. .virq = SPEAR320_VIRQ_CLCD,
  343. .status_mask = SPEAR320_CLCD_IRQ_MASK,
  344. .clear_mask = SPEAR320_CLCD_IRQ_MASK,
  345. }, {
  346. .virq = SPEAR320_VIRQ_SPP,
  347. .status_mask = SPEAR320_SPP_IRQ_MASK,
  348. .clear_mask = SPEAR320_SPP_IRQ_MASK,
  349. },
  350. };
  351. static struct spear_shirq shirq_ras1 = {
  352. .irq = SPEAR3XX_IRQ_GEN_RAS_1,
  353. .dev_config = shirq_ras1_config,
  354. .dev_count = ARRAY_SIZE(shirq_ras1_config),
  355. .regs = {
  356. .enb_reg = -1,
  357. .status_reg = SPEAR320_INT_STS_MASK_REG,
  358. .status_reg_mask = SPEAR320_SHIRQ_RAS1_MASK,
  359. .clear_reg = SPEAR320_INT_CLR_MASK_REG,
  360. .reset_to_clear = 1,
  361. },
  362. };
  363. static struct shirq_dev_config shirq_ras3_config[] = {
  364. {
  365. .virq = SPEAR320_VIRQ_PLGPIO,
  366. .enb_mask = SPEAR320_GPIO_IRQ_MASK,
  367. .status_mask = SPEAR320_GPIO_IRQ_MASK,
  368. .clear_mask = SPEAR320_GPIO_IRQ_MASK,
  369. }, {
  370. .virq = SPEAR320_VIRQ_I2S_PLAY,
  371. .enb_mask = SPEAR320_I2S_PLAY_IRQ_MASK,
  372. .status_mask = SPEAR320_I2S_PLAY_IRQ_MASK,
  373. .clear_mask = SPEAR320_I2S_PLAY_IRQ_MASK,
  374. }, {
  375. .virq = SPEAR320_VIRQ_I2S_REC,
  376. .enb_mask = SPEAR320_I2S_REC_IRQ_MASK,
  377. .status_mask = SPEAR320_I2S_REC_IRQ_MASK,
  378. .clear_mask = SPEAR320_I2S_REC_IRQ_MASK,
  379. },
  380. };
  381. static struct spear_shirq shirq_ras3 = {
  382. .irq = SPEAR3XX_IRQ_GEN_RAS_3,
  383. .dev_config = shirq_ras3_config,
  384. .dev_count = ARRAY_SIZE(shirq_ras3_config),
  385. .regs = {
  386. .enb_reg = SPEAR320_INT_ENB_MASK_REG,
  387. .reset_to_enb = 1,
  388. .status_reg = SPEAR320_INT_STS_MASK_REG,
  389. .status_reg_mask = SPEAR320_SHIRQ_RAS3_MASK,
  390. .clear_reg = SPEAR320_INT_CLR_MASK_REG,
  391. .reset_to_clear = 1,
  392. },
  393. };
  394. static struct shirq_dev_config shirq_intrcomm_ras_config[] = {
  395. {
  396. .virq = SPEAR320_VIRQ_CANU,
  397. .status_mask = SPEAR320_CAN_U_IRQ_MASK,
  398. .clear_mask = SPEAR320_CAN_U_IRQ_MASK,
  399. }, {
  400. .virq = SPEAR320_VIRQ_CANL,
  401. .status_mask = SPEAR320_CAN_L_IRQ_MASK,
  402. .clear_mask = SPEAR320_CAN_L_IRQ_MASK,
  403. }, {
  404. .virq = SPEAR320_VIRQ_UART1,
  405. .status_mask = SPEAR320_UART1_IRQ_MASK,
  406. .clear_mask = SPEAR320_UART1_IRQ_MASK,
  407. }, {
  408. .virq = SPEAR320_VIRQ_UART2,
  409. .status_mask = SPEAR320_UART2_IRQ_MASK,
  410. .clear_mask = SPEAR320_UART2_IRQ_MASK,
  411. }, {
  412. .virq = SPEAR320_VIRQ_SSP1,
  413. .status_mask = SPEAR320_SSP1_IRQ_MASK,
  414. .clear_mask = SPEAR320_SSP1_IRQ_MASK,
  415. }, {
  416. .virq = SPEAR320_VIRQ_SSP2,
  417. .status_mask = SPEAR320_SSP2_IRQ_MASK,
  418. .clear_mask = SPEAR320_SSP2_IRQ_MASK,
  419. }, {
  420. .virq = SPEAR320_VIRQ_SMII0,
  421. .status_mask = SPEAR320_SMII0_IRQ_MASK,
  422. .clear_mask = SPEAR320_SMII0_IRQ_MASK,
  423. }, {
  424. .virq = SPEAR320_VIRQ_MII1_SMII1,
  425. .status_mask = SPEAR320_MII1_SMII1_IRQ_MASK,
  426. .clear_mask = SPEAR320_MII1_SMII1_IRQ_MASK,
  427. }, {
  428. .virq = SPEAR320_VIRQ_WAKEUP_SMII0,
  429. .status_mask = SPEAR320_WAKEUP_SMII0_IRQ_MASK,
  430. .clear_mask = SPEAR320_WAKEUP_SMII0_IRQ_MASK,
  431. }, {
  432. .virq = SPEAR320_VIRQ_WAKEUP_MII1_SMII1,
  433. .status_mask = SPEAR320_WAKEUP_MII1_SMII1_IRQ_MASK,
  434. .clear_mask = SPEAR320_WAKEUP_MII1_SMII1_IRQ_MASK,
  435. }, {
  436. .virq = SPEAR320_VIRQ_I2C1,
  437. .status_mask = SPEAR320_I2C1_IRQ_MASK,
  438. .clear_mask = SPEAR320_I2C1_IRQ_MASK,
  439. },
  440. };
  441. static struct spear_shirq shirq_intrcomm_ras = {
  442. .irq = SPEAR3XX_IRQ_INTRCOMM_RAS_ARM,
  443. .dev_config = shirq_intrcomm_ras_config,
  444. .dev_count = ARRAY_SIZE(shirq_intrcomm_ras_config),
  445. .regs = {
  446. .enb_reg = -1,
  447. .status_reg = SPEAR320_INT_STS_MASK_REG,
  448. .status_reg_mask = SPEAR320_SHIRQ_INTRCOMM_RAS_MASK,
  449. .clear_reg = SPEAR320_INT_CLR_MASK_REG,
  450. .reset_to_clear = 1,
  451. },
  452. };
  453. /* Add spear320 specific devices here */
  454. /* spear320 routines */
  455. void __init spear320_init(struct pmx_mode *pmx_mode, struct pmx_dev **pmx_devs,
  456. u8 pmx_dev_count)
  457. {
  458. void __iomem *base;
  459. int ret = 0;
  460. /* call spear3xx family common init function */
  461. spear3xx_init();
  462. /* shared irq registration */
  463. base = ioremap(SPEAR320_SOC_CONFIG_BASE, SZ_4K);
  464. if (base) {
  465. /* shirq 1 */
  466. shirq_ras1.regs.base = base;
  467. ret = spear_shirq_register(&shirq_ras1);
  468. if (ret)
  469. printk(KERN_ERR "Error registering Shared IRQ 1\n");
  470. /* shirq 3 */
  471. shirq_ras3.regs.base = base;
  472. ret = spear_shirq_register(&shirq_ras3);
  473. if (ret)
  474. printk(KERN_ERR "Error registering Shared IRQ 3\n");
  475. /* shirq 4 */
  476. shirq_intrcomm_ras.regs.base = base;
  477. ret = spear_shirq_register(&shirq_intrcomm_ras);
  478. if (ret)
  479. printk(KERN_ERR "Error registering Shared IRQ 4\n");
  480. }
  481. /* pmx initialization */
  482. pmx_driver.base = base;
  483. pmx_driver.mode = pmx_mode;
  484. pmx_driver.devs = pmx_devs;
  485. pmx_driver.devs_count = pmx_dev_count;
  486. ret = pmx_register(&pmx_driver);
  487. if (ret)
  488. printk(KERN_ERR "padmux: registration failed. err no: %d\n",
  489. ret);
  490. }