spear310.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. /*
  2. * arch/arm/mach-spear3xx/spear310.c
  3. *
  4. * SPEAr310 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. #define pr_fmt(fmt) "SPEAr310: " fmt
  14. #include <linux/ptrace.h>
  15. #include <asm/irq.h>
  16. #include <plat/shirq.h>
  17. #include <mach/generic.h>
  18. #include <mach/hardware.h>
  19. /* pad multiplexing support */
  20. /* muxing registers */
  21. #define PAD_MUX_CONFIG_REG 0x08
  22. /* devices */
  23. static struct pmx_dev_mode pmx_emi_cs_0_1_4_5_modes[] = {
  24. {
  25. .ids = 0x00,
  26. .mask = PMX_TIMER_3_4_MASK,
  27. },
  28. };
  29. struct pmx_dev spear310_pmx_emi_cs_0_1_4_5 = {
  30. .name = "emi_cs_0_1_4_5",
  31. .modes = pmx_emi_cs_0_1_4_5_modes,
  32. .mode_count = ARRAY_SIZE(pmx_emi_cs_0_1_4_5_modes),
  33. .enb_on_reset = 1,
  34. };
  35. static struct pmx_dev_mode pmx_emi_cs_2_3_modes[] = {
  36. {
  37. .ids = 0x00,
  38. .mask = PMX_TIMER_1_2_MASK,
  39. },
  40. };
  41. struct pmx_dev spear310_pmx_emi_cs_2_3 = {
  42. .name = "emi_cs_2_3",
  43. .modes = pmx_emi_cs_2_3_modes,
  44. .mode_count = ARRAY_SIZE(pmx_emi_cs_2_3_modes),
  45. .enb_on_reset = 1,
  46. };
  47. static struct pmx_dev_mode pmx_uart1_modes[] = {
  48. {
  49. .ids = 0x00,
  50. .mask = PMX_FIRDA_MASK,
  51. },
  52. };
  53. struct pmx_dev spear310_pmx_uart1 = {
  54. .name = "uart1",
  55. .modes = pmx_uart1_modes,
  56. .mode_count = ARRAY_SIZE(pmx_uart1_modes),
  57. .enb_on_reset = 1,
  58. };
  59. static struct pmx_dev_mode pmx_uart2_modes[] = {
  60. {
  61. .ids = 0x00,
  62. .mask = PMX_TIMER_1_2_MASK,
  63. },
  64. };
  65. struct pmx_dev spear310_pmx_uart2 = {
  66. .name = "uart2",
  67. .modes = pmx_uart2_modes,
  68. .mode_count = ARRAY_SIZE(pmx_uart2_modes),
  69. .enb_on_reset = 1,
  70. };
  71. static struct pmx_dev_mode pmx_uart3_4_5_modes[] = {
  72. {
  73. .ids = 0x00,
  74. .mask = PMX_UART0_MODEM_MASK,
  75. },
  76. };
  77. struct pmx_dev spear310_pmx_uart3_4_5 = {
  78. .name = "uart3_4_5",
  79. .modes = pmx_uart3_4_5_modes,
  80. .mode_count = ARRAY_SIZE(pmx_uart3_4_5_modes),
  81. .enb_on_reset = 1,
  82. };
  83. static struct pmx_dev_mode pmx_fsmc_modes[] = {
  84. {
  85. .ids = 0x00,
  86. .mask = PMX_SSP_CS_MASK,
  87. },
  88. };
  89. struct pmx_dev spear310_pmx_fsmc = {
  90. .name = "fsmc",
  91. .modes = pmx_fsmc_modes,
  92. .mode_count = ARRAY_SIZE(pmx_fsmc_modes),
  93. .enb_on_reset = 1,
  94. };
  95. static struct pmx_dev_mode pmx_rs485_0_1_modes[] = {
  96. {
  97. .ids = 0x00,
  98. .mask = PMX_MII_MASK,
  99. },
  100. };
  101. struct pmx_dev spear310_pmx_rs485_0_1 = {
  102. .name = "rs485_0_1",
  103. .modes = pmx_rs485_0_1_modes,
  104. .mode_count = ARRAY_SIZE(pmx_rs485_0_1_modes),
  105. .enb_on_reset = 1,
  106. };
  107. static struct pmx_dev_mode pmx_tdm0_modes[] = {
  108. {
  109. .ids = 0x00,
  110. .mask = PMX_MII_MASK,
  111. },
  112. };
  113. struct pmx_dev spear310_pmx_tdm0 = {
  114. .name = "tdm0",
  115. .modes = pmx_tdm0_modes,
  116. .mode_count = ARRAY_SIZE(pmx_tdm0_modes),
  117. .enb_on_reset = 1,
  118. };
  119. /* pmx driver structure */
  120. static struct pmx_driver pmx_driver = {
  121. .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
  122. };
  123. /* spear3xx shared irq */
  124. static struct shirq_dev_config shirq_ras1_config[] = {
  125. {
  126. .virq = SPEAR310_VIRQ_SMII0,
  127. .status_mask = SPEAR310_SMII0_IRQ_MASK,
  128. }, {
  129. .virq = SPEAR310_VIRQ_SMII1,
  130. .status_mask = SPEAR310_SMII1_IRQ_MASK,
  131. }, {
  132. .virq = SPEAR310_VIRQ_SMII2,
  133. .status_mask = SPEAR310_SMII2_IRQ_MASK,
  134. }, {
  135. .virq = SPEAR310_VIRQ_SMII3,
  136. .status_mask = SPEAR310_SMII3_IRQ_MASK,
  137. }, {
  138. .virq = SPEAR310_VIRQ_WAKEUP_SMII0,
  139. .status_mask = SPEAR310_WAKEUP_SMII0_IRQ_MASK,
  140. }, {
  141. .virq = SPEAR310_VIRQ_WAKEUP_SMII1,
  142. .status_mask = SPEAR310_WAKEUP_SMII1_IRQ_MASK,
  143. }, {
  144. .virq = SPEAR310_VIRQ_WAKEUP_SMII2,
  145. .status_mask = SPEAR310_WAKEUP_SMII2_IRQ_MASK,
  146. }, {
  147. .virq = SPEAR310_VIRQ_WAKEUP_SMII3,
  148. .status_mask = SPEAR310_WAKEUP_SMII3_IRQ_MASK,
  149. },
  150. };
  151. static struct spear_shirq shirq_ras1 = {
  152. .irq = SPEAR3XX_IRQ_GEN_RAS_1,
  153. .dev_config = shirq_ras1_config,
  154. .dev_count = ARRAY_SIZE(shirq_ras1_config),
  155. .regs = {
  156. .enb_reg = -1,
  157. .status_reg = SPEAR310_INT_STS_MASK_REG,
  158. .status_reg_mask = SPEAR310_SHIRQ_RAS1_MASK,
  159. .clear_reg = -1,
  160. },
  161. };
  162. static struct shirq_dev_config shirq_ras2_config[] = {
  163. {
  164. .virq = SPEAR310_VIRQ_UART1,
  165. .status_mask = SPEAR310_UART1_IRQ_MASK,
  166. }, {
  167. .virq = SPEAR310_VIRQ_UART2,
  168. .status_mask = SPEAR310_UART2_IRQ_MASK,
  169. }, {
  170. .virq = SPEAR310_VIRQ_UART3,
  171. .status_mask = SPEAR310_UART3_IRQ_MASK,
  172. }, {
  173. .virq = SPEAR310_VIRQ_UART4,
  174. .status_mask = SPEAR310_UART4_IRQ_MASK,
  175. }, {
  176. .virq = SPEAR310_VIRQ_UART5,
  177. .status_mask = SPEAR310_UART5_IRQ_MASK,
  178. },
  179. };
  180. static struct spear_shirq shirq_ras2 = {
  181. .irq = SPEAR3XX_IRQ_GEN_RAS_2,
  182. .dev_config = shirq_ras2_config,
  183. .dev_count = ARRAY_SIZE(shirq_ras2_config),
  184. .regs = {
  185. .enb_reg = -1,
  186. .status_reg = SPEAR310_INT_STS_MASK_REG,
  187. .status_reg_mask = SPEAR310_SHIRQ_RAS2_MASK,
  188. .clear_reg = -1,
  189. },
  190. };
  191. static struct shirq_dev_config shirq_ras3_config[] = {
  192. {
  193. .virq = SPEAR310_VIRQ_EMI,
  194. .status_mask = SPEAR310_EMI_IRQ_MASK,
  195. },
  196. };
  197. static struct spear_shirq shirq_ras3 = {
  198. .irq = SPEAR3XX_IRQ_GEN_RAS_3,
  199. .dev_config = shirq_ras3_config,
  200. .dev_count = ARRAY_SIZE(shirq_ras3_config),
  201. .regs = {
  202. .enb_reg = -1,
  203. .status_reg = SPEAR310_INT_STS_MASK_REG,
  204. .status_reg_mask = SPEAR310_SHIRQ_RAS3_MASK,
  205. .clear_reg = -1,
  206. },
  207. };
  208. static struct shirq_dev_config shirq_intrcomm_ras_config[] = {
  209. {
  210. .virq = SPEAR310_VIRQ_TDM_HDLC,
  211. .status_mask = SPEAR310_TDM_HDLC_IRQ_MASK,
  212. }, {
  213. .virq = SPEAR310_VIRQ_RS485_0,
  214. .status_mask = SPEAR310_RS485_0_IRQ_MASK,
  215. }, {
  216. .virq = SPEAR310_VIRQ_RS485_1,
  217. .status_mask = SPEAR310_RS485_1_IRQ_MASK,
  218. },
  219. };
  220. static struct spear_shirq shirq_intrcomm_ras = {
  221. .irq = SPEAR3XX_IRQ_INTRCOMM_RAS_ARM,
  222. .dev_config = shirq_intrcomm_ras_config,
  223. .dev_count = ARRAY_SIZE(shirq_intrcomm_ras_config),
  224. .regs = {
  225. .enb_reg = -1,
  226. .status_reg = SPEAR310_INT_STS_MASK_REG,
  227. .status_reg_mask = SPEAR310_SHIRQ_INTRCOMM_RAS_MASK,
  228. .clear_reg = -1,
  229. },
  230. };
  231. /* Add spear310 specific devices here */
  232. /* spear310 routines */
  233. void __init spear310_init(struct pmx_mode *pmx_mode, struct pmx_dev **pmx_devs,
  234. u8 pmx_dev_count)
  235. {
  236. void __iomem *base;
  237. int ret = 0;
  238. /* call spear3xx family common init function */
  239. spear3xx_init();
  240. /* shared irq registration */
  241. base = ioremap(SPEAR310_SOC_CONFIG_BASE, SZ_4K);
  242. if (base) {
  243. /* shirq 1 */
  244. shirq_ras1.regs.base = base;
  245. ret = spear_shirq_register(&shirq_ras1);
  246. if (ret)
  247. pr_err("Error registering Shared IRQ 1\n");
  248. /* shirq 2 */
  249. shirq_ras2.regs.base = base;
  250. ret = spear_shirq_register(&shirq_ras2);
  251. if (ret)
  252. pr_err("Error registering Shared IRQ 2\n");
  253. /* shirq 3 */
  254. shirq_ras3.regs.base = base;
  255. ret = spear_shirq_register(&shirq_ras3);
  256. if (ret)
  257. pr_err("Error registering Shared IRQ 3\n");
  258. /* shirq 4 */
  259. shirq_intrcomm_ras.regs.base = base;
  260. ret = spear_shirq_register(&shirq_intrcomm_ras);
  261. if (ret)
  262. pr_err("Error registering Shared IRQ 4\n");
  263. }
  264. /* pmx initialization */
  265. pmx_driver.base = base;
  266. pmx_driver.mode = pmx_mode;
  267. pmx_driver.devs = pmx_devs;
  268. pmx_driver.devs_count = pmx_dev_count;
  269. ret = pmx_register(&pmx_driver);
  270. if (ret)
  271. pr_err("padmux: registration failed. err no: %d\n", ret);
  272. }