spear310.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  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 <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 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. /* spear3xx shared irq */
  123. struct shirq_dev_config shirq_ras1_config[] = {
  124. {
  125. .virq = VIRQ_SMII0,
  126. .status_mask = SMII0_IRQ_MASK,
  127. }, {
  128. .virq = VIRQ_SMII1,
  129. .status_mask = SMII1_IRQ_MASK,
  130. }, {
  131. .virq = VIRQ_SMII2,
  132. .status_mask = SMII2_IRQ_MASK,
  133. }, {
  134. .virq = VIRQ_SMII3,
  135. .status_mask = SMII3_IRQ_MASK,
  136. }, {
  137. .virq = VIRQ_WAKEUP_SMII0,
  138. .status_mask = WAKEUP_SMII0_IRQ_MASK,
  139. }, {
  140. .virq = VIRQ_WAKEUP_SMII1,
  141. .status_mask = WAKEUP_SMII1_IRQ_MASK,
  142. }, {
  143. .virq = VIRQ_WAKEUP_SMII2,
  144. .status_mask = WAKEUP_SMII2_IRQ_MASK,
  145. }, {
  146. .virq = VIRQ_WAKEUP_SMII3,
  147. .status_mask = WAKEUP_SMII3_IRQ_MASK,
  148. },
  149. };
  150. struct spear_shirq shirq_ras1 = {
  151. .irq = IRQ_GEN_RAS_1,
  152. .dev_config = shirq_ras1_config,
  153. .dev_count = ARRAY_SIZE(shirq_ras1_config),
  154. .regs = {
  155. .enb_reg = -1,
  156. .status_reg = INT_STS_MASK_REG,
  157. .status_reg_mask = SHIRQ_RAS1_MASK,
  158. .clear_reg = -1,
  159. },
  160. };
  161. struct shirq_dev_config shirq_ras2_config[] = {
  162. {
  163. .virq = VIRQ_UART1,
  164. .status_mask = UART1_IRQ_MASK,
  165. }, {
  166. .virq = VIRQ_UART2,
  167. .status_mask = UART2_IRQ_MASK,
  168. }, {
  169. .virq = VIRQ_UART3,
  170. .status_mask = UART3_IRQ_MASK,
  171. }, {
  172. .virq = VIRQ_UART4,
  173. .status_mask = UART4_IRQ_MASK,
  174. }, {
  175. .virq = VIRQ_UART5,
  176. .status_mask = UART5_IRQ_MASK,
  177. },
  178. };
  179. struct spear_shirq shirq_ras2 = {
  180. .irq = IRQ_GEN_RAS_2,
  181. .dev_config = shirq_ras2_config,
  182. .dev_count = ARRAY_SIZE(shirq_ras2_config),
  183. .regs = {
  184. .enb_reg = -1,
  185. .status_reg = INT_STS_MASK_REG,
  186. .status_reg_mask = SHIRQ_RAS2_MASK,
  187. .clear_reg = -1,
  188. },
  189. };
  190. struct shirq_dev_config shirq_ras3_config[] = {
  191. {
  192. .virq = VIRQ_EMI,
  193. .status_mask = EMI_IRQ_MASK,
  194. },
  195. };
  196. struct spear_shirq shirq_ras3 = {
  197. .irq = IRQ_GEN_RAS_3,
  198. .dev_config = shirq_ras3_config,
  199. .dev_count = ARRAY_SIZE(shirq_ras3_config),
  200. .regs = {
  201. .enb_reg = -1,
  202. .status_reg = INT_STS_MASK_REG,
  203. .status_reg_mask = SHIRQ_RAS3_MASK,
  204. .clear_reg = -1,
  205. },
  206. };
  207. struct shirq_dev_config shirq_intrcomm_ras_config[] = {
  208. {
  209. .virq = VIRQ_TDM_HDLC,
  210. .status_mask = TDM_HDLC_IRQ_MASK,
  211. }, {
  212. .virq = VIRQ_RS485_0,
  213. .status_mask = RS485_0_IRQ_MASK,
  214. }, {
  215. .virq = VIRQ_RS485_1,
  216. .status_mask = RS485_1_IRQ_MASK,
  217. },
  218. };
  219. struct spear_shirq shirq_intrcomm_ras = {
  220. .irq = IRQ_INTRCOMM_RAS_ARM,
  221. .dev_config = shirq_intrcomm_ras_config,
  222. .dev_count = ARRAY_SIZE(shirq_intrcomm_ras_config),
  223. .regs = {
  224. .enb_reg = -1,
  225. .status_reg = INT_STS_MASK_REG,
  226. .status_reg_mask = SHIRQ_INTRCOMM_RAS_MASK,
  227. .clear_reg = -1,
  228. },
  229. };
  230. /* Add spear310 specific devices here */
  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 registration */
  239. base = ioremap(SPEAR310_SOC_CONFIG_BASE, SZ_4K);
  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. /* pmx initialization */
  263. pmx_driver.base = base;
  264. ret = pmx_register(&pmx_driver);
  265. if (ret)
  266. printk(KERN_ERR "padmux: registeration failed. err no: %d\n",
  267. ret);
  268. }