spear300.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  1. /*
  2. * arch/arm/mach-spear3xx/spear300.c
  3. *
  4. * SPEAr300 machine source file
  5. *
  6. * Copyright (C) 2009-2012 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) "SPEAr300: " fmt
  14. #include <linux/amba/pl08x.h>
  15. #include <linux/of_platform.h>
  16. #include <asm/hardware/vic.h>
  17. #include <asm/mach/arch.h>
  18. #include <plat/shirq.h>
  19. #include <mach/generic.h>
  20. #include <mach/spear.h>
  21. /* Base address of various IPs */
  22. #define SPEAR300_TELECOM_BASE UL(0x50000000)
  23. /* Interrupt registers offsets and masks */
  24. #define SPEAR300_INT_ENB_MASK_REG 0x54
  25. #define SPEAR300_INT_STS_MASK_REG 0x58
  26. #define SPEAR300_IT_PERS_S_IRQ_MASK (1 << 0)
  27. #define SPEAR300_IT_CHANGE_S_IRQ_MASK (1 << 1)
  28. #define SPEAR300_I2S_IRQ_MASK (1 << 2)
  29. #define SPEAR300_TDM_IRQ_MASK (1 << 3)
  30. #define SPEAR300_CAMERA_L_IRQ_MASK (1 << 4)
  31. #define SPEAR300_CAMERA_F_IRQ_MASK (1 << 5)
  32. #define SPEAR300_CAMERA_V_IRQ_MASK (1 << 6)
  33. #define SPEAR300_KEYBOARD_IRQ_MASK (1 << 7)
  34. #define SPEAR300_GPIO1_IRQ_MASK (1 << 8)
  35. #define SPEAR300_SHIRQ_RAS1_MASK 0x1FF
  36. #define SPEAR300_SOC_CONFIG_BASE UL(0x99000000)
  37. /* SPEAr300 Virtual irq definitions */
  38. /* IRQs sharing IRQ_GEN_RAS_1 */
  39. #define SPEAR300_VIRQ_IT_PERS_S (SPEAR3XX_VIRQ_START + 0)
  40. #define SPEAR300_VIRQ_IT_CHANGE_S (SPEAR3XX_VIRQ_START + 1)
  41. #define SPEAR300_VIRQ_I2S (SPEAR3XX_VIRQ_START + 2)
  42. #define SPEAR300_VIRQ_TDM (SPEAR3XX_VIRQ_START + 3)
  43. #define SPEAR300_VIRQ_CAMERA_L (SPEAR3XX_VIRQ_START + 4)
  44. #define SPEAR300_VIRQ_CAMERA_F (SPEAR3XX_VIRQ_START + 5)
  45. #define SPEAR300_VIRQ_CAMERA_V (SPEAR3XX_VIRQ_START + 6)
  46. #define SPEAR300_VIRQ_KEYBOARD (SPEAR3XX_VIRQ_START + 7)
  47. #define SPEAR300_VIRQ_GPIO1 (SPEAR3XX_VIRQ_START + 8)
  48. /* IRQs sharing IRQ_GEN_RAS_3 */
  49. #define SPEAR300_IRQ_CLCD SPEAR3XX_IRQ_GEN_RAS_3
  50. /* IRQs sharing IRQ_INTRCOMM_RAS_ARM */
  51. #define SPEAR300_IRQ_SDHCI SPEAR3XX_IRQ_INTRCOMM_RAS_ARM
  52. /* pad multiplexing support */
  53. /* muxing registers */
  54. #define PAD_MUX_CONFIG_REG 0x00
  55. #define MODE_CONFIG_REG 0x04
  56. /* modes */
  57. #define NAND_MODE (1 << 0)
  58. #define NOR_MODE (1 << 1)
  59. #define PHOTO_FRAME_MODE (1 << 2)
  60. #define LEND_IP_PHONE_MODE (1 << 3)
  61. #define HEND_IP_PHONE_MODE (1 << 4)
  62. #define LEND_WIFI_PHONE_MODE (1 << 5)
  63. #define HEND_WIFI_PHONE_MODE (1 << 6)
  64. #define ATA_PABX_WI2S_MODE (1 << 7)
  65. #define ATA_PABX_I2S_MODE (1 << 8)
  66. #define CAML_LCDW_MODE (1 << 9)
  67. #define CAMU_LCD_MODE (1 << 10)
  68. #define CAMU_WLCD_MODE (1 << 11)
  69. #define CAML_LCD_MODE (1 << 12)
  70. #define ALL_MODES 0x1FFF
  71. struct pmx_mode spear300_nand_mode = {
  72. .id = NAND_MODE,
  73. .name = "nand mode",
  74. .mask = 0x00,
  75. };
  76. struct pmx_mode spear300_nor_mode = {
  77. .id = NOR_MODE,
  78. .name = "nor mode",
  79. .mask = 0x01,
  80. };
  81. struct pmx_mode spear300_photo_frame_mode = {
  82. .id = PHOTO_FRAME_MODE,
  83. .name = "photo frame mode",
  84. .mask = 0x02,
  85. };
  86. struct pmx_mode spear300_lend_ip_phone_mode = {
  87. .id = LEND_IP_PHONE_MODE,
  88. .name = "lend ip phone mode",
  89. .mask = 0x03,
  90. };
  91. struct pmx_mode spear300_hend_ip_phone_mode = {
  92. .id = HEND_IP_PHONE_MODE,
  93. .name = "hend ip phone mode",
  94. .mask = 0x04,
  95. };
  96. struct pmx_mode spear300_lend_wifi_phone_mode = {
  97. .id = LEND_WIFI_PHONE_MODE,
  98. .name = "lend wifi phone mode",
  99. .mask = 0x05,
  100. };
  101. struct pmx_mode spear300_hend_wifi_phone_mode = {
  102. .id = HEND_WIFI_PHONE_MODE,
  103. .name = "hend wifi phone mode",
  104. .mask = 0x06,
  105. };
  106. struct pmx_mode spear300_ata_pabx_wi2s_mode = {
  107. .id = ATA_PABX_WI2S_MODE,
  108. .name = "ata pabx wi2s mode",
  109. .mask = 0x07,
  110. };
  111. struct pmx_mode spear300_ata_pabx_i2s_mode = {
  112. .id = ATA_PABX_I2S_MODE,
  113. .name = "ata pabx i2s mode",
  114. .mask = 0x08,
  115. };
  116. struct pmx_mode spear300_caml_lcdw_mode = {
  117. .id = CAML_LCDW_MODE,
  118. .name = "caml lcdw mode",
  119. .mask = 0x0C,
  120. };
  121. struct pmx_mode spear300_camu_lcd_mode = {
  122. .id = CAMU_LCD_MODE,
  123. .name = "camu lcd mode",
  124. .mask = 0x0D,
  125. };
  126. struct pmx_mode spear300_camu_wlcd_mode = {
  127. .id = CAMU_WLCD_MODE,
  128. .name = "camu wlcd mode",
  129. .mask = 0x0E,
  130. };
  131. struct pmx_mode spear300_caml_lcd_mode = {
  132. .id = CAML_LCD_MODE,
  133. .name = "caml lcd mode",
  134. .mask = 0x0F,
  135. };
  136. /* devices */
  137. static struct pmx_dev_mode pmx_fsmc_2_chips_modes[] = {
  138. {
  139. .ids = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE |
  140. ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE,
  141. .mask = PMX_FIRDA_MASK,
  142. },
  143. };
  144. struct pmx_dev spear300_pmx_fsmc_2_chips = {
  145. .name = "fsmc_2_chips",
  146. .modes = pmx_fsmc_2_chips_modes,
  147. .mode_count = ARRAY_SIZE(pmx_fsmc_2_chips_modes),
  148. .enb_on_reset = 1,
  149. };
  150. static struct pmx_dev_mode pmx_fsmc_4_chips_modes[] = {
  151. {
  152. .ids = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE |
  153. ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE,
  154. .mask = PMX_FIRDA_MASK | PMX_UART0_MASK,
  155. },
  156. };
  157. struct pmx_dev spear300_pmx_fsmc_4_chips = {
  158. .name = "fsmc_4_chips",
  159. .modes = pmx_fsmc_4_chips_modes,
  160. .mode_count = ARRAY_SIZE(pmx_fsmc_4_chips_modes),
  161. .enb_on_reset = 1,
  162. };
  163. static struct pmx_dev_mode pmx_keyboard_modes[] = {
  164. {
  165. .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE |
  166. LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE |
  167. CAML_LCDW_MODE | CAMU_LCD_MODE | CAMU_WLCD_MODE |
  168. CAML_LCD_MODE,
  169. .mask = 0x0,
  170. },
  171. };
  172. struct pmx_dev spear300_pmx_keyboard = {
  173. .name = "keyboard",
  174. .modes = pmx_keyboard_modes,
  175. .mode_count = ARRAY_SIZE(pmx_keyboard_modes),
  176. .enb_on_reset = 1,
  177. };
  178. static struct pmx_dev_mode pmx_clcd_modes[] = {
  179. {
  180. .ids = PHOTO_FRAME_MODE,
  181. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK ,
  182. }, {
  183. .ids = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE |
  184. CAMU_LCD_MODE | CAML_LCD_MODE,
  185. .mask = PMX_TIMER_3_4_MASK,
  186. },
  187. };
  188. struct pmx_dev spear300_pmx_clcd = {
  189. .name = "clcd",
  190. .modes = pmx_clcd_modes,
  191. .mode_count = ARRAY_SIZE(pmx_clcd_modes),
  192. .enb_on_reset = 1,
  193. };
  194. static struct pmx_dev_mode pmx_telecom_gpio_modes[] = {
  195. {
  196. .ids = PHOTO_FRAME_MODE | CAMU_LCD_MODE | CAML_LCD_MODE,
  197. .mask = PMX_MII_MASK,
  198. }, {
  199. .ids = LEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE,
  200. .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
  201. }, {
  202. .ids = ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_WLCD_MODE,
  203. .mask = PMX_MII_MASK | PMX_TIMER_3_4_MASK,
  204. }, {
  205. .ids = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE,
  206. .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK,
  207. }, {
  208. .ids = ATA_PABX_WI2S_MODE,
  209. .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK
  210. | PMX_UART0_MODEM_MASK,
  211. },
  212. };
  213. struct pmx_dev spear300_pmx_telecom_gpio = {
  214. .name = "telecom_gpio",
  215. .modes = pmx_telecom_gpio_modes,
  216. .mode_count = ARRAY_SIZE(pmx_telecom_gpio_modes),
  217. .enb_on_reset = 1,
  218. };
  219. static struct pmx_dev_mode pmx_telecom_tdm_modes[] = {
  220. {
  221. .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
  222. HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE
  223. | HEND_WIFI_PHONE_MODE | ATA_PABX_WI2S_MODE
  224. | ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
  225. | CAMU_WLCD_MODE | CAML_LCD_MODE,
  226. .mask = PMX_UART0_MODEM_MASK | PMX_SSP_CS_MASK,
  227. },
  228. };
  229. struct pmx_dev spear300_pmx_telecom_tdm = {
  230. .name = "telecom_tdm",
  231. .modes = pmx_telecom_tdm_modes,
  232. .mode_count = ARRAY_SIZE(pmx_telecom_tdm_modes),
  233. .enb_on_reset = 1,
  234. };
  235. static struct pmx_dev_mode pmx_telecom_spi_cs_i2c_clk_modes[] = {
  236. {
  237. .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE |
  238. LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE
  239. | ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE |
  240. CAML_LCDW_MODE | CAML_LCD_MODE,
  241. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
  242. },
  243. };
  244. struct pmx_dev spear300_pmx_telecom_spi_cs_i2c_clk = {
  245. .name = "telecom_spi_cs_i2c_clk",
  246. .modes = pmx_telecom_spi_cs_i2c_clk_modes,
  247. .mode_count = ARRAY_SIZE(pmx_telecom_spi_cs_i2c_clk_modes),
  248. .enb_on_reset = 1,
  249. };
  250. static struct pmx_dev_mode pmx_telecom_camera_modes[] = {
  251. {
  252. .ids = CAML_LCDW_MODE | CAML_LCD_MODE,
  253. .mask = PMX_MII_MASK,
  254. }, {
  255. .ids = CAMU_LCD_MODE | CAMU_WLCD_MODE,
  256. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK | PMX_MII_MASK,
  257. },
  258. };
  259. struct pmx_dev spear300_pmx_telecom_camera = {
  260. .name = "telecom_camera",
  261. .modes = pmx_telecom_camera_modes,
  262. .mode_count = ARRAY_SIZE(pmx_telecom_camera_modes),
  263. .enb_on_reset = 1,
  264. };
  265. static struct pmx_dev_mode pmx_telecom_dac_modes[] = {
  266. {
  267. .ids = ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
  268. | CAMU_WLCD_MODE | CAML_LCD_MODE,
  269. .mask = PMX_TIMER_1_2_MASK,
  270. },
  271. };
  272. struct pmx_dev spear300_pmx_telecom_dac = {
  273. .name = "telecom_dac",
  274. .modes = pmx_telecom_dac_modes,
  275. .mode_count = ARRAY_SIZE(pmx_telecom_dac_modes),
  276. .enb_on_reset = 1,
  277. };
  278. static struct pmx_dev_mode pmx_telecom_i2s_modes[] = {
  279. {
  280. .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE
  281. | LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE |
  282. ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
  283. | CAMU_WLCD_MODE | CAML_LCD_MODE,
  284. .mask = PMX_UART0_MODEM_MASK,
  285. },
  286. };
  287. struct pmx_dev spear300_pmx_telecom_i2s = {
  288. .name = "telecom_i2s",
  289. .modes = pmx_telecom_i2s_modes,
  290. .mode_count = ARRAY_SIZE(pmx_telecom_i2s_modes),
  291. .enb_on_reset = 1,
  292. };
  293. static struct pmx_dev_mode pmx_telecom_boot_pins_modes[] = {
  294. {
  295. .ids = NAND_MODE | NOR_MODE,
  296. .mask = PMX_UART0_MODEM_MASK | PMX_TIMER_1_2_MASK |
  297. PMX_TIMER_3_4_MASK,
  298. },
  299. };
  300. struct pmx_dev spear300_pmx_telecom_boot_pins = {
  301. .name = "telecom_boot_pins",
  302. .modes = pmx_telecom_boot_pins_modes,
  303. .mode_count = ARRAY_SIZE(pmx_telecom_boot_pins_modes),
  304. .enb_on_reset = 1,
  305. };
  306. static struct pmx_dev_mode pmx_telecom_sdhci_4bit_modes[] = {
  307. {
  308. .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
  309. HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE |
  310. HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE |
  311. CAMU_WLCD_MODE | CAML_LCD_MODE | ATA_PABX_WI2S_MODE |
  312. ATA_PABX_I2S_MODE,
  313. .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK |
  314. PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
  315. PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK,
  316. },
  317. };
  318. struct pmx_dev spear300_pmx_telecom_sdhci_4bit = {
  319. .name = "telecom_sdhci_4bit",
  320. .modes = pmx_telecom_sdhci_4bit_modes,
  321. .mode_count = ARRAY_SIZE(pmx_telecom_sdhci_4bit_modes),
  322. .enb_on_reset = 1,
  323. };
  324. static struct pmx_dev_mode pmx_telecom_sdhci_8bit_modes[] = {
  325. {
  326. .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
  327. HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE |
  328. HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE |
  329. CAMU_WLCD_MODE | CAML_LCD_MODE,
  330. .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK |
  331. PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
  332. PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK | PMX_MII_MASK,
  333. },
  334. };
  335. struct pmx_dev spear300_pmx_telecom_sdhci_8bit = {
  336. .name = "telecom_sdhci_8bit",
  337. .modes = pmx_telecom_sdhci_8bit_modes,
  338. .mode_count = ARRAY_SIZE(pmx_telecom_sdhci_8bit_modes),
  339. .enb_on_reset = 1,
  340. };
  341. static struct pmx_dev_mode pmx_gpio1_modes[] = {
  342. {
  343. .ids = PHOTO_FRAME_MODE,
  344. .mask = PMX_UART0_MODEM_MASK | PMX_TIMER_1_2_MASK |
  345. PMX_TIMER_3_4_MASK,
  346. },
  347. };
  348. struct pmx_dev spear300_pmx_gpio1 = {
  349. .name = "arm gpio1",
  350. .modes = pmx_gpio1_modes,
  351. .mode_count = ARRAY_SIZE(pmx_gpio1_modes),
  352. .enb_on_reset = 1,
  353. };
  354. /* pmx driver structure */
  355. static struct pmx_driver pmx_driver = {
  356. .mode_reg = {.offset = MODE_CONFIG_REG, .mask = 0x0000000f},
  357. .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
  358. };
  359. /* spear3xx shared irq */
  360. static struct shirq_dev_config shirq_ras1_config[] = {
  361. {
  362. .virq = SPEAR300_VIRQ_IT_PERS_S,
  363. .enb_mask = SPEAR300_IT_PERS_S_IRQ_MASK,
  364. .status_mask = SPEAR300_IT_PERS_S_IRQ_MASK,
  365. }, {
  366. .virq = SPEAR300_VIRQ_IT_CHANGE_S,
  367. .enb_mask = SPEAR300_IT_CHANGE_S_IRQ_MASK,
  368. .status_mask = SPEAR300_IT_CHANGE_S_IRQ_MASK,
  369. }, {
  370. .virq = SPEAR300_VIRQ_I2S,
  371. .enb_mask = SPEAR300_I2S_IRQ_MASK,
  372. .status_mask = SPEAR300_I2S_IRQ_MASK,
  373. }, {
  374. .virq = SPEAR300_VIRQ_TDM,
  375. .enb_mask = SPEAR300_TDM_IRQ_MASK,
  376. .status_mask = SPEAR300_TDM_IRQ_MASK,
  377. }, {
  378. .virq = SPEAR300_VIRQ_CAMERA_L,
  379. .enb_mask = SPEAR300_CAMERA_L_IRQ_MASK,
  380. .status_mask = SPEAR300_CAMERA_L_IRQ_MASK,
  381. }, {
  382. .virq = SPEAR300_VIRQ_CAMERA_F,
  383. .enb_mask = SPEAR300_CAMERA_F_IRQ_MASK,
  384. .status_mask = SPEAR300_CAMERA_F_IRQ_MASK,
  385. }, {
  386. .virq = SPEAR300_VIRQ_CAMERA_V,
  387. .enb_mask = SPEAR300_CAMERA_V_IRQ_MASK,
  388. .status_mask = SPEAR300_CAMERA_V_IRQ_MASK,
  389. }, {
  390. .virq = SPEAR300_VIRQ_KEYBOARD,
  391. .enb_mask = SPEAR300_KEYBOARD_IRQ_MASK,
  392. .status_mask = SPEAR300_KEYBOARD_IRQ_MASK,
  393. }, {
  394. .virq = SPEAR300_VIRQ_GPIO1,
  395. .enb_mask = SPEAR300_GPIO1_IRQ_MASK,
  396. .status_mask = SPEAR300_GPIO1_IRQ_MASK,
  397. },
  398. };
  399. static struct spear_shirq shirq_ras1 = {
  400. .irq = SPEAR3XX_IRQ_GEN_RAS_1,
  401. .dev_config = shirq_ras1_config,
  402. .dev_count = ARRAY_SIZE(shirq_ras1_config),
  403. .regs = {
  404. .enb_reg = SPEAR300_INT_ENB_MASK_REG,
  405. .status_reg = SPEAR300_INT_STS_MASK_REG,
  406. .status_reg_mask = SPEAR300_SHIRQ_RAS1_MASK,
  407. .clear_reg = -1,
  408. },
  409. };
  410. /* padmux devices to enable */
  411. static struct pmx_dev *spear300_evb_pmx_devs[] = {
  412. /* spear3xx specific devices */
  413. &spear3xx_pmx_i2c,
  414. &spear3xx_pmx_ssp_cs,
  415. &spear3xx_pmx_ssp,
  416. &spear3xx_pmx_mii,
  417. &spear3xx_pmx_uart0,
  418. /* spear300 specific devices */
  419. &spear300_pmx_fsmc_2_chips,
  420. &spear300_pmx_clcd,
  421. &spear300_pmx_telecom_sdhci_4bit,
  422. &spear300_pmx_gpio1,
  423. };
  424. /* DMAC platform data's slave info */
  425. struct pl08x_channel_data spear300_dma_info[] = {
  426. {
  427. .bus_id = "uart0_rx",
  428. .min_signal = 2,
  429. .max_signal = 2,
  430. .muxval = 0,
  431. .cctl = 0,
  432. .periph_buses = PL08X_AHB1,
  433. }, {
  434. .bus_id = "uart0_tx",
  435. .min_signal = 3,
  436. .max_signal = 3,
  437. .muxval = 0,
  438. .cctl = 0,
  439. .periph_buses = PL08X_AHB1,
  440. }, {
  441. .bus_id = "ssp0_rx",
  442. .min_signal = 8,
  443. .max_signal = 8,
  444. .muxval = 0,
  445. .cctl = 0,
  446. .periph_buses = PL08X_AHB1,
  447. }, {
  448. .bus_id = "ssp0_tx",
  449. .min_signal = 9,
  450. .max_signal = 9,
  451. .muxval = 0,
  452. .cctl = 0,
  453. .periph_buses = PL08X_AHB1,
  454. }, {
  455. .bus_id = "i2c_rx",
  456. .min_signal = 10,
  457. .max_signal = 10,
  458. .muxval = 0,
  459. .cctl = 0,
  460. .periph_buses = PL08X_AHB1,
  461. }, {
  462. .bus_id = "i2c_tx",
  463. .min_signal = 11,
  464. .max_signal = 11,
  465. .muxval = 0,
  466. .cctl = 0,
  467. .periph_buses = PL08X_AHB1,
  468. }, {
  469. .bus_id = "irda",
  470. .min_signal = 12,
  471. .max_signal = 12,
  472. .muxval = 0,
  473. .cctl = 0,
  474. .periph_buses = PL08X_AHB1,
  475. }, {
  476. .bus_id = "adc",
  477. .min_signal = 13,
  478. .max_signal = 13,
  479. .muxval = 0,
  480. .cctl = 0,
  481. .periph_buses = PL08X_AHB1,
  482. }, {
  483. .bus_id = "to_jpeg",
  484. .min_signal = 14,
  485. .max_signal = 14,
  486. .muxval = 0,
  487. .cctl = 0,
  488. .periph_buses = PL08X_AHB1,
  489. }, {
  490. .bus_id = "from_jpeg",
  491. .min_signal = 15,
  492. .max_signal = 15,
  493. .muxval = 0,
  494. .cctl = 0,
  495. .periph_buses = PL08X_AHB1,
  496. }, {
  497. .bus_id = "ras0_rx",
  498. .min_signal = 0,
  499. .max_signal = 0,
  500. .muxval = 1,
  501. .cctl = 0,
  502. .periph_buses = PL08X_AHB1,
  503. }, {
  504. .bus_id = "ras0_tx",
  505. .min_signal = 1,
  506. .max_signal = 1,
  507. .muxval = 1,
  508. .cctl = 0,
  509. .periph_buses = PL08X_AHB1,
  510. }, {
  511. .bus_id = "ras1_rx",
  512. .min_signal = 2,
  513. .max_signal = 2,
  514. .muxval = 1,
  515. .cctl = 0,
  516. .periph_buses = PL08X_AHB1,
  517. }, {
  518. .bus_id = "ras1_tx",
  519. .min_signal = 3,
  520. .max_signal = 3,
  521. .muxval = 1,
  522. .cctl = 0,
  523. .periph_buses = PL08X_AHB1,
  524. }, {
  525. .bus_id = "ras2_rx",
  526. .min_signal = 4,
  527. .max_signal = 4,
  528. .muxval = 1,
  529. .cctl = 0,
  530. .periph_buses = PL08X_AHB1,
  531. }, {
  532. .bus_id = "ras2_tx",
  533. .min_signal = 5,
  534. .max_signal = 5,
  535. .muxval = 1,
  536. .cctl = 0,
  537. .periph_buses = PL08X_AHB1,
  538. }, {
  539. .bus_id = "ras3_rx",
  540. .min_signal = 6,
  541. .max_signal = 6,
  542. .muxval = 1,
  543. .cctl = 0,
  544. .periph_buses = PL08X_AHB1,
  545. }, {
  546. .bus_id = "ras3_tx",
  547. .min_signal = 7,
  548. .max_signal = 7,
  549. .muxval = 1,
  550. .cctl = 0,
  551. .periph_buses = PL08X_AHB1,
  552. }, {
  553. .bus_id = "ras4_rx",
  554. .min_signal = 8,
  555. .max_signal = 8,
  556. .muxval = 1,
  557. .cctl = 0,
  558. .periph_buses = PL08X_AHB1,
  559. }, {
  560. .bus_id = "ras4_tx",
  561. .min_signal = 9,
  562. .max_signal = 9,
  563. .muxval = 1,
  564. .cctl = 0,
  565. .periph_buses = PL08X_AHB1,
  566. }, {
  567. .bus_id = "ras5_rx",
  568. .min_signal = 10,
  569. .max_signal = 10,
  570. .muxval = 1,
  571. .cctl = 0,
  572. .periph_buses = PL08X_AHB1,
  573. }, {
  574. .bus_id = "ras5_tx",
  575. .min_signal = 11,
  576. .max_signal = 11,
  577. .muxval = 1,
  578. .cctl = 0,
  579. .periph_buses = PL08X_AHB1,
  580. }, {
  581. .bus_id = "ras6_rx",
  582. .min_signal = 12,
  583. .max_signal = 12,
  584. .muxval = 1,
  585. .cctl = 0,
  586. .periph_buses = PL08X_AHB1,
  587. }, {
  588. .bus_id = "ras6_tx",
  589. .min_signal = 13,
  590. .max_signal = 13,
  591. .muxval = 1,
  592. .cctl = 0,
  593. .periph_buses = PL08X_AHB1,
  594. }, {
  595. .bus_id = "ras7_rx",
  596. .min_signal = 14,
  597. .max_signal = 14,
  598. .muxval = 1,
  599. .cctl = 0,
  600. .periph_buses = PL08X_AHB1,
  601. }, {
  602. .bus_id = "ras7_tx",
  603. .min_signal = 15,
  604. .max_signal = 15,
  605. .muxval = 1,
  606. .cctl = 0,
  607. .periph_buses = PL08X_AHB1,
  608. },
  609. };
  610. /* Add SPEAr300 auxdata to pass platform data */
  611. static struct of_dev_auxdata spear300_auxdata_lookup[] __initdata = {
  612. OF_DEV_AUXDATA("arm,pl022", SPEAR3XX_ICM1_SSP_BASE, NULL,
  613. &pl022_plat_data),
  614. OF_DEV_AUXDATA("arm,pl080", SPEAR3XX_ICM3_DMA_BASE, NULL,
  615. &pl080_plat_data),
  616. {}
  617. };
  618. static void __init spear300_dt_init(void)
  619. {
  620. int ret = -EINVAL;
  621. pl080_plat_data.slave_channels = spear300_dma_info;
  622. pl080_plat_data.num_slave_channels = ARRAY_SIZE(spear300_dma_info);
  623. of_platform_populate(NULL, of_default_bus_match_table,
  624. spear300_auxdata_lookup, NULL);
  625. /* shared irq registration */
  626. shirq_ras1.regs.base = ioremap(SPEAR300_TELECOM_BASE, SZ_4K);
  627. if (shirq_ras1.regs.base) {
  628. ret = spear_shirq_register(&shirq_ras1);
  629. if (ret)
  630. pr_err("Error registering Shared IRQ\n");
  631. }
  632. if (of_machine_is_compatible("st,spear300-evb")) {
  633. /* pmx initialization */
  634. pmx_driver.mode = &spear300_photo_frame_mode;
  635. pmx_driver.devs = spear300_evb_pmx_devs;
  636. pmx_driver.devs_count = ARRAY_SIZE(spear300_evb_pmx_devs);
  637. pmx_driver.base = ioremap(SPEAR300_SOC_CONFIG_BASE, SZ_4K);
  638. if (pmx_driver.base) {
  639. ret = pmx_register(&pmx_driver);
  640. if (ret)
  641. pr_err("padmux: registration failed. err no: %d\n",
  642. ret);
  643. /* Free Mapping, device selection already done */
  644. iounmap(pmx_driver.base);
  645. }
  646. if (ret)
  647. pr_err("Initialization Failed");
  648. }
  649. }
  650. static const char * const spear300_dt_board_compat[] = {
  651. "st,spear300",
  652. "st,spear300-evb",
  653. NULL,
  654. };
  655. static void __init spear300_map_io(void)
  656. {
  657. spear3xx_map_io();
  658. spear300_clk_init();
  659. }
  660. DT_MACHINE_START(SPEAR300_DT, "ST SPEAr300 SoC with Flattened Device Tree")
  661. .map_io = spear300_map_io,
  662. .init_irq = spear3xx_dt_init_irq,
  663. .handle_irq = vic_handle_irq,
  664. .timer = &spear3xx_timer,
  665. .init_machine = spear300_dt_init,
  666. .restart = spear_restart,
  667. .dt_compat = spear300_dt_board_compat,
  668. MACHINE_END