spear310.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  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. #include <linux/ptrace.h>
  14. #include <asm/irq.h>
  15. #include <mach/generic.h>
  16. #include <mach/spear.h>
  17. #include <plat/shirq.h>
  18. /* pad multiplexing support */
  19. /* muxing registers */
  20. #define PAD_MUX_CONFIG_REG 0x08
  21. /* devices */
  22. struct pmx_dev_mode pmx_emi_cs_0_1_4_5_modes[] = {
  23. {
  24. .ids = 0x00,
  25. .mask = PMX_TIMER_3_4_MASK,
  26. },
  27. };
  28. struct pmx_dev pmx_emi_cs_0_1_4_5 = {
  29. .name = "emi_cs_0_1_4_5",
  30. .modes = pmx_emi_cs_0_1_4_5_modes,
  31. .mode_count = ARRAY_SIZE(pmx_emi_cs_0_1_4_5_modes),
  32. .enb_on_reset = 1,
  33. };
  34. struct pmx_dev_mode pmx_emi_cs_2_3_modes[] = {
  35. {
  36. .ids = 0x00,
  37. .mask = PMX_TIMER_1_2_MASK,
  38. },
  39. };
  40. struct pmx_dev pmx_emi_cs_2_3 = {
  41. .name = "emi_cs_2_3",
  42. .modes = pmx_emi_cs_2_3_modes,
  43. .mode_count = ARRAY_SIZE(pmx_emi_cs_2_3_modes),
  44. .enb_on_reset = 1,
  45. };
  46. struct pmx_dev_mode pmx_uart1_modes[] = {
  47. {
  48. .ids = 0x00,
  49. .mask = PMX_FIRDA_MASK,
  50. },
  51. };
  52. struct pmx_dev pmx_uart1 = {
  53. .name = "uart1",
  54. .modes = pmx_uart1_modes,
  55. .mode_count = ARRAY_SIZE(pmx_uart1_modes),
  56. .enb_on_reset = 1,
  57. };
  58. struct pmx_dev_mode pmx_uart2_modes[] = {
  59. {
  60. .ids = 0x00,
  61. .mask = PMX_TIMER_1_2_MASK,
  62. },
  63. };
  64. struct pmx_dev pmx_uart2 = {
  65. .name = "uart2",
  66. .modes = pmx_uart2_modes,
  67. .mode_count = ARRAY_SIZE(pmx_uart2_modes),
  68. .enb_on_reset = 1,
  69. };
  70. struct pmx_dev_mode pmx_uart3_4_5_modes[] = {
  71. {
  72. .ids = 0x00,
  73. .mask = PMX_UART0_MODEM_MASK,
  74. },
  75. };
  76. struct pmx_dev pmx_uart3_4_5 = {
  77. .name = "uart3_4_5",
  78. .modes = pmx_uart3_4_5_modes,
  79. .mode_count = ARRAY_SIZE(pmx_uart3_4_5_modes),
  80. .enb_on_reset = 1,
  81. };
  82. struct pmx_dev_mode pmx_fsmc_modes[] = {
  83. {
  84. .ids = 0x00,
  85. .mask = PMX_SSP_CS_MASK,
  86. },
  87. };
  88. struct pmx_dev pmx_fsmc = {
  89. .name = "fsmc",
  90. .modes = pmx_fsmc_modes,
  91. .mode_count = ARRAY_SIZE(pmx_fsmc_modes),
  92. .enb_on_reset = 1,
  93. };
  94. struct pmx_dev_mode pmx_rs485_0_1_modes[] = {
  95. {
  96. .ids = 0x00,
  97. .mask = PMX_MII_MASK,
  98. },
  99. };
  100. struct pmx_dev pmx_rs485_0_1 = {
  101. .name = "rs485_0_1",
  102. .modes = pmx_rs485_0_1_modes,
  103. .mode_count = ARRAY_SIZE(pmx_rs485_0_1_modes),
  104. .enb_on_reset = 1,
  105. };
  106. struct pmx_dev_mode pmx_tdm0_modes[] = {
  107. {
  108. .ids = 0x00,
  109. .mask = PMX_MII_MASK,
  110. },
  111. };
  112. struct pmx_dev pmx_tdm0 = {
  113. .name = "tdm0",
  114. .modes = pmx_tdm0_modes,
  115. .mode_count = ARRAY_SIZE(pmx_tdm0_modes),
  116. .enb_on_reset = 1,
  117. };
  118. /* pmx driver structure */
  119. struct pmx_driver pmx_driver = {
  120. .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
  121. };
  122. /* Add spear310 specific devices here */
  123. /* spear3xx shared irq */
  124. struct shirq_dev_config shirq_ras1_config[] = {
  125. {
  126. .virq = VIRQ_SMII0,
  127. .status_mask = SMII0_IRQ_MASK,
  128. }, {
  129. .virq = VIRQ_SMII1,
  130. .status_mask = SMII1_IRQ_MASK,
  131. }, {
  132. .virq = VIRQ_SMII2,
  133. .status_mask = SMII2_IRQ_MASK,
  134. }, {
  135. .virq = VIRQ_SMII3,
  136. .status_mask = SMII3_IRQ_MASK,
  137. }, {
  138. .virq = VIRQ_WAKEUP_SMII0,
  139. .status_mask = WAKEUP_SMII0_IRQ_MASK,
  140. }, {
  141. .virq = VIRQ_WAKEUP_SMII1,
  142. .status_mask = WAKEUP_SMII1_IRQ_MASK,
  143. }, {
  144. .virq = VIRQ_WAKEUP_SMII2,
  145. .status_mask = WAKEUP_SMII2_IRQ_MASK,
  146. }, {
  147. .virq = VIRQ_WAKEUP_SMII3,
  148. .status_mask = WAKEUP_SMII3_IRQ_MASK,
  149. },
  150. };
  151. struct spear_shirq shirq_ras1 = {
  152. .irq = 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 = INT_STS_MASK_REG,
  158. .status_reg_mask = SHIRQ_RAS1_MASK,
  159. .clear_reg = -1,
  160. },
  161. };
  162. struct shirq_dev_config shirq_ras2_config[] = {
  163. {
  164. .virq = VIRQ_UART1,
  165. .status_mask = UART1_IRQ_MASK,
  166. }, {
  167. .virq = VIRQ_UART2,
  168. .status_mask = UART2_IRQ_MASK,
  169. }, {
  170. .virq = VIRQ_UART3,
  171. .status_mask = UART3_IRQ_MASK,
  172. }, {
  173. .virq = VIRQ_UART4,
  174. .status_mask = UART4_IRQ_MASK,
  175. }, {
  176. .virq = VIRQ_UART5,
  177. .status_mask = UART5_IRQ_MASK,
  178. },
  179. };
  180. struct spear_shirq shirq_ras2 = {
  181. .irq = 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 = INT_STS_MASK_REG,
  187. .status_reg_mask = SHIRQ_RAS2_MASK,
  188. .clear_reg = -1,
  189. },
  190. };
  191. struct shirq_dev_config shirq_ras3_config[] = {
  192. {
  193. .virq = VIRQ_EMI,
  194. .status_mask = EMI_IRQ_MASK,
  195. },
  196. };
  197. struct spear_shirq shirq_ras3 = {
  198. .irq = 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 = INT_STS_MASK_REG,
  204. .status_reg_mask = SHIRQ_RAS3_MASK,
  205. .clear_reg = -1,
  206. },
  207. };
  208. struct shirq_dev_config shirq_intrcomm_ras_config[] = {
  209. {
  210. .virq = VIRQ_TDM_HDLC,
  211. .status_mask = TDM_HDLC_IRQ_MASK,
  212. }, {
  213. .virq = VIRQ_RS485_0,
  214. .status_mask = RS485_0_IRQ_MASK,
  215. }, {
  216. .virq = VIRQ_RS485_1,
  217. .status_mask = RS485_1_IRQ_MASK,
  218. },
  219. };
  220. struct spear_shirq shirq_intrcomm_ras = {
  221. .irq = 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 = INT_STS_MASK_REG,
  227. .status_reg_mask = SHIRQ_INTRCOMM_RAS_MASK,
  228. .clear_reg = -1,
  229. },
  230. };
  231. /* spear310 routines */
  232. void __init spear310_init(void)
  233. {
  234. void __iomem *base;
  235. int ret = 0;
  236. /* call spear3xx family common init function */
  237. spear3xx_init();
  238. /* shared irq registeration */
  239. base = ioremap(SPEAR310_SOC_CONFIG_BASE, SPEAR310_SOC_CONFIG_SIZE);
  240. if (base) {
  241. /* shirq 1 */
  242. shirq_ras1.regs.base = base;
  243. ret = spear_shirq_register(&shirq_ras1);
  244. if (ret)
  245. printk(KERN_ERR "Error registering Shared IRQ 1\n");
  246. /* shirq 2 */
  247. shirq_ras2.regs.base = base;
  248. ret = spear_shirq_register(&shirq_ras2);
  249. if (ret)
  250. printk(KERN_ERR "Error registering Shared IRQ 2\n");
  251. /* shirq 3 */
  252. shirq_ras3.regs.base = base;
  253. ret = spear_shirq_register(&shirq_ras3);
  254. if (ret)
  255. printk(KERN_ERR "Error registering Shared IRQ 3\n");
  256. /* shirq 4 */
  257. shirq_intrcomm_ras.regs.base = base;
  258. ret = spear_shirq_register(&shirq_intrcomm_ras);
  259. if (ret)
  260. printk(KERN_ERR "Error registering Shared IRQ 4\n");
  261. }
  262. }
  263. void spear310_pmx_init(void)
  264. {
  265. spear_pmx_init(&pmx_driver, SPEAR310_SOC_CONFIG_BASE,
  266. SPEAR310_SOC_CONFIG_SIZE);
  267. }