spear300.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. /*
  2. * arch/arm/mach-spear3xx/spear300.c
  3. *
  4. * SPEAr300 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/types.h>
  14. #include <linux/amba/pl061.h>
  15. #include <linux/ptrace.h>
  16. #include <asm/irq.h>
  17. #include <plat/shirq.h>
  18. #include <mach/generic.h>
  19. #include <mach/hardware.h>
  20. /* pad multiplexing support */
  21. /* muxing registers */
  22. #define PAD_MUX_CONFIG_REG 0x00
  23. #define MODE_CONFIG_REG 0x04
  24. /* modes */
  25. #define NAND_MODE (1 << 0)
  26. #define NOR_MODE (1 << 1)
  27. #define PHOTO_FRAME_MODE (1 << 2)
  28. #define LEND_IP_PHONE_MODE (1 << 3)
  29. #define HEND_IP_PHONE_MODE (1 << 4)
  30. #define LEND_WIFI_PHONE_MODE (1 << 5)
  31. #define HEND_WIFI_PHONE_MODE (1 << 6)
  32. #define ATA_PABX_WI2S_MODE (1 << 7)
  33. #define ATA_PABX_I2S_MODE (1 << 8)
  34. #define CAML_LCDW_MODE (1 << 9)
  35. #define CAMU_LCD_MODE (1 << 10)
  36. #define CAMU_WLCD_MODE (1 << 11)
  37. #define CAML_LCD_MODE (1 << 12)
  38. #define ALL_MODES 0x1FFF
  39. struct pmx_mode spear300_nand_mode = {
  40. .id = NAND_MODE,
  41. .name = "nand mode",
  42. .mask = 0x00,
  43. };
  44. struct pmx_mode spear300_nor_mode = {
  45. .id = NOR_MODE,
  46. .name = "nor mode",
  47. .mask = 0x01,
  48. };
  49. struct pmx_mode spear300_photo_frame_mode = {
  50. .id = PHOTO_FRAME_MODE,
  51. .name = "photo frame mode",
  52. .mask = 0x02,
  53. };
  54. struct pmx_mode spear300_lend_ip_phone_mode = {
  55. .id = LEND_IP_PHONE_MODE,
  56. .name = "lend ip phone mode",
  57. .mask = 0x03,
  58. };
  59. struct pmx_mode spear300_hend_ip_phone_mode = {
  60. .id = HEND_IP_PHONE_MODE,
  61. .name = "hend ip phone mode",
  62. .mask = 0x04,
  63. };
  64. struct pmx_mode spear300_lend_wifi_phone_mode = {
  65. .id = LEND_WIFI_PHONE_MODE,
  66. .name = "lend wifi phone mode",
  67. .mask = 0x05,
  68. };
  69. struct pmx_mode spear300_hend_wifi_phone_mode = {
  70. .id = HEND_WIFI_PHONE_MODE,
  71. .name = "hend wifi phone mode",
  72. .mask = 0x06,
  73. };
  74. struct pmx_mode spear300_ata_pabx_wi2s_mode = {
  75. .id = ATA_PABX_WI2S_MODE,
  76. .name = "ata pabx wi2s mode",
  77. .mask = 0x07,
  78. };
  79. struct pmx_mode spear300_ata_pabx_i2s_mode = {
  80. .id = ATA_PABX_I2S_MODE,
  81. .name = "ata pabx i2s mode",
  82. .mask = 0x08,
  83. };
  84. struct pmx_mode spear300_caml_lcdw_mode = {
  85. .id = CAML_LCDW_MODE,
  86. .name = "caml lcdw mode",
  87. .mask = 0x0C,
  88. };
  89. struct pmx_mode spear300_camu_lcd_mode = {
  90. .id = CAMU_LCD_MODE,
  91. .name = "camu lcd mode",
  92. .mask = 0x0D,
  93. };
  94. struct pmx_mode spear300_camu_wlcd_mode = {
  95. .id = CAMU_WLCD_MODE,
  96. .name = "camu wlcd mode",
  97. .mask = 0x0E,
  98. };
  99. struct pmx_mode spear300_caml_lcd_mode = {
  100. .id = CAML_LCD_MODE,
  101. .name = "caml lcd mode",
  102. .mask = 0x0F,
  103. };
  104. /* devices */
  105. static struct pmx_dev_mode pmx_fsmc_2_chips_modes[] = {
  106. {
  107. .ids = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE |
  108. ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE,
  109. .mask = PMX_FIRDA_MASK,
  110. },
  111. };
  112. struct pmx_dev spear300_pmx_fsmc_2_chips = {
  113. .name = "fsmc_2_chips",
  114. .modes = pmx_fsmc_2_chips_modes,
  115. .mode_count = ARRAY_SIZE(pmx_fsmc_2_chips_modes),
  116. .enb_on_reset = 1,
  117. };
  118. static struct pmx_dev_mode pmx_fsmc_4_chips_modes[] = {
  119. {
  120. .ids = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE |
  121. ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE,
  122. .mask = PMX_FIRDA_MASK | PMX_UART0_MASK,
  123. },
  124. };
  125. struct pmx_dev spear300_pmx_fsmc_4_chips = {
  126. .name = "fsmc_4_chips",
  127. .modes = pmx_fsmc_4_chips_modes,
  128. .mode_count = ARRAY_SIZE(pmx_fsmc_4_chips_modes),
  129. .enb_on_reset = 1,
  130. };
  131. static struct pmx_dev_mode pmx_keyboard_modes[] = {
  132. {
  133. .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE |
  134. LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE |
  135. CAML_LCDW_MODE | CAMU_LCD_MODE | CAMU_WLCD_MODE |
  136. CAML_LCD_MODE,
  137. .mask = 0x0,
  138. },
  139. };
  140. struct pmx_dev spear300_pmx_keyboard = {
  141. .name = "keyboard",
  142. .modes = pmx_keyboard_modes,
  143. .mode_count = ARRAY_SIZE(pmx_keyboard_modes),
  144. .enb_on_reset = 1,
  145. };
  146. static struct pmx_dev_mode pmx_clcd_modes[] = {
  147. {
  148. .ids = PHOTO_FRAME_MODE,
  149. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK ,
  150. }, {
  151. .ids = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE |
  152. CAMU_LCD_MODE | CAML_LCD_MODE,
  153. .mask = PMX_TIMER_3_4_MASK,
  154. },
  155. };
  156. struct pmx_dev spear300_pmx_clcd = {
  157. .name = "clcd",
  158. .modes = pmx_clcd_modes,
  159. .mode_count = ARRAY_SIZE(pmx_clcd_modes),
  160. .enb_on_reset = 1,
  161. };
  162. static struct pmx_dev_mode pmx_telecom_gpio_modes[] = {
  163. {
  164. .ids = PHOTO_FRAME_MODE | CAMU_LCD_MODE | CAML_LCD_MODE,
  165. .mask = PMX_MII_MASK,
  166. }, {
  167. .ids = LEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE,
  168. .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
  169. }, {
  170. .ids = ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_WLCD_MODE,
  171. .mask = PMX_MII_MASK | PMX_TIMER_3_4_MASK,
  172. }, {
  173. .ids = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE,
  174. .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK,
  175. }, {
  176. .ids = ATA_PABX_WI2S_MODE,
  177. .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK
  178. | PMX_UART0_MODEM_MASK,
  179. },
  180. };
  181. struct pmx_dev spear300_pmx_telecom_gpio = {
  182. .name = "telecom_gpio",
  183. .modes = pmx_telecom_gpio_modes,
  184. .mode_count = ARRAY_SIZE(pmx_telecom_gpio_modes),
  185. .enb_on_reset = 1,
  186. };
  187. static struct pmx_dev_mode pmx_telecom_tdm_modes[] = {
  188. {
  189. .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
  190. HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE
  191. | HEND_WIFI_PHONE_MODE | ATA_PABX_WI2S_MODE
  192. | ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
  193. | CAMU_WLCD_MODE | CAML_LCD_MODE,
  194. .mask = PMX_UART0_MODEM_MASK | PMX_SSP_CS_MASK,
  195. },
  196. };
  197. struct pmx_dev spear300_pmx_telecom_tdm = {
  198. .name = "telecom_tdm",
  199. .modes = pmx_telecom_tdm_modes,
  200. .mode_count = ARRAY_SIZE(pmx_telecom_tdm_modes),
  201. .enb_on_reset = 1,
  202. };
  203. static struct pmx_dev_mode pmx_telecom_spi_cs_i2c_clk_modes[] = {
  204. {
  205. .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE |
  206. LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE
  207. | ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE |
  208. CAML_LCDW_MODE | CAML_LCD_MODE,
  209. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
  210. },
  211. };
  212. struct pmx_dev spear300_pmx_telecom_spi_cs_i2c_clk = {
  213. .name = "telecom_spi_cs_i2c_clk",
  214. .modes = pmx_telecom_spi_cs_i2c_clk_modes,
  215. .mode_count = ARRAY_SIZE(pmx_telecom_spi_cs_i2c_clk_modes),
  216. .enb_on_reset = 1,
  217. };
  218. static struct pmx_dev_mode pmx_telecom_camera_modes[] = {
  219. {
  220. .ids = CAML_LCDW_MODE | CAML_LCD_MODE,
  221. .mask = PMX_MII_MASK,
  222. }, {
  223. .ids = CAMU_LCD_MODE | CAMU_WLCD_MODE,
  224. .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK | PMX_MII_MASK,
  225. },
  226. };
  227. struct pmx_dev spear300_pmx_telecom_camera = {
  228. .name = "telecom_camera",
  229. .modes = pmx_telecom_camera_modes,
  230. .mode_count = ARRAY_SIZE(pmx_telecom_camera_modes),
  231. .enb_on_reset = 1,
  232. };
  233. static struct pmx_dev_mode pmx_telecom_dac_modes[] = {
  234. {
  235. .ids = ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
  236. | CAMU_WLCD_MODE | CAML_LCD_MODE,
  237. .mask = PMX_TIMER_1_2_MASK,
  238. },
  239. };
  240. struct pmx_dev spear300_pmx_telecom_dac = {
  241. .name = "telecom_dac",
  242. .modes = pmx_telecom_dac_modes,
  243. .mode_count = ARRAY_SIZE(pmx_telecom_dac_modes),
  244. .enb_on_reset = 1,
  245. };
  246. static struct pmx_dev_mode pmx_telecom_i2s_modes[] = {
  247. {
  248. .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE
  249. | LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE |
  250. ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
  251. | CAMU_WLCD_MODE | CAML_LCD_MODE,
  252. .mask = PMX_UART0_MODEM_MASK,
  253. },
  254. };
  255. struct pmx_dev spear300_pmx_telecom_i2s = {
  256. .name = "telecom_i2s",
  257. .modes = pmx_telecom_i2s_modes,
  258. .mode_count = ARRAY_SIZE(pmx_telecom_i2s_modes),
  259. .enb_on_reset = 1,
  260. };
  261. static struct pmx_dev_mode pmx_telecom_boot_pins_modes[] = {
  262. {
  263. .ids = NAND_MODE | NOR_MODE,
  264. .mask = PMX_UART0_MODEM_MASK | PMX_TIMER_1_2_MASK |
  265. PMX_TIMER_3_4_MASK,
  266. },
  267. };
  268. struct pmx_dev spear300_pmx_telecom_boot_pins = {
  269. .name = "telecom_boot_pins",
  270. .modes = pmx_telecom_boot_pins_modes,
  271. .mode_count = ARRAY_SIZE(pmx_telecom_boot_pins_modes),
  272. .enb_on_reset = 1,
  273. };
  274. static struct pmx_dev_mode pmx_telecom_sdhci_4bit_modes[] = {
  275. {
  276. .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
  277. HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE |
  278. HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE |
  279. CAMU_WLCD_MODE | CAML_LCD_MODE | ATA_PABX_WI2S_MODE |
  280. ATA_PABX_I2S_MODE,
  281. .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK |
  282. PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
  283. PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK,
  284. },
  285. };
  286. struct pmx_dev spear300_pmx_telecom_sdhci_4bit = {
  287. .name = "telecom_sdhci_4bit",
  288. .modes = pmx_telecom_sdhci_4bit_modes,
  289. .mode_count = ARRAY_SIZE(pmx_telecom_sdhci_4bit_modes),
  290. .enb_on_reset = 1,
  291. };
  292. static struct pmx_dev_mode pmx_telecom_sdhci_8bit_modes[] = {
  293. {
  294. .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
  295. HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE |
  296. HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE |
  297. CAMU_WLCD_MODE | CAML_LCD_MODE,
  298. .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK |
  299. PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
  300. PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK | PMX_MII_MASK,
  301. },
  302. };
  303. struct pmx_dev spear300_pmx_telecom_sdhci_8bit = {
  304. .name = "telecom_sdhci_8bit",
  305. .modes = pmx_telecom_sdhci_8bit_modes,
  306. .mode_count = ARRAY_SIZE(pmx_telecom_sdhci_8bit_modes),
  307. .enb_on_reset = 1,
  308. };
  309. static struct pmx_dev_mode pmx_gpio1_modes[] = {
  310. {
  311. .ids = PHOTO_FRAME_MODE,
  312. .mask = PMX_UART0_MODEM_MASK | PMX_TIMER_1_2_MASK |
  313. PMX_TIMER_3_4_MASK,
  314. },
  315. };
  316. struct pmx_dev spear300_pmx_gpio1 = {
  317. .name = "arm gpio1",
  318. .modes = pmx_gpio1_modes,
  319. .mode_count = ARRAY_SIZE(pmx_gpio1_modes),
  320. .enb_on_reset = 1,
  321. };
  322. /* pmx driver structure */
  323. static struct pmx_driver pmx_driver = {
  324. .mode_reg = {.offset = MODE_CONFIG_REG, .mask = 0x0000000f},
  325. .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
  326. };
  327. /* spear3xx shared irq */
  328. static struct shirq_dev_config shirq_ras1_config[] = {
  329. {
  330. .virq = SPEAR300_VIRQ_IT_PERS_S,
  331. .enb_mask = SPEAR300_IT_PERS_S_IRQ_MASK,
  332. .status_mask = SPEAR300_IT_PERS_S_IRQ_MASK,
  333. }, {
  334. .virq = SPEAR300_VIRQ_IT_CHANGE_S,
  335. .enb_mask = SPEAR300_IT_CHANGE_S_IRQ_MASK,
  336. .status_mask = SPEAR300_IT_CHANGE_S_IRQ_MASK,
  337. }, {
  338. .virq = SPEAR300_VIRQ_I2S,
  339. .enb_mask = SPEAR300_I2S_IRQ_MASK,
  340. .status_mask = SPEAR300_I2S_IRQ_MASK,
  341. }, {
  342. .virq = SPEAR300_VIRQ_TDM,
  343. .enb_mask = SPEAR300_TDM_IRQ_MASK,
  344. .status_mask = SPEAR300_TDM_IRQ_MASK,
  345. }, {
  346. .virq = SPEAR300_VIRQ_CAMERA_L,
  347. .enb_mask = SPEAR300_CAMERA_L_IRQ_MASK,
  348. .status_mask = SPEAR300_CAMERA_L_IRQ_MASK,
  349. }, {
  350. .virq = SPEAR300_VIRQ_CAMERA_F,
  351. .enb_mask = SPEAR300_CAMERA_F_IRQ_MASK,
  352. .status_mask = SPEAR300_CAMERA_F_IRQ_MASK,
  353. }, {
  354. .virq = SPEAR300_VIRQ_CAMERA_V,
  355. .enb_mask = SPEAR300_CAMERA_V_IRQ_MASK,
  356. .status_mask = SPEAR300_CAMERA_V_IRQ_MASK,
  357. }, {
  358. .virq = SPEAR300_VIRQ_KEYBOARD,
  359. .enb_mask = SPEAR300_KEYBOARD_IRQ_MASK,
  360. .status_mask = SPEAR300_KEYBOARD_IRQ_MASK,
  361. }, {
  362. .virq = SPEAR300_VIRQ_GPIO1,
  363. .enb_mask = SPEAR300_GPIO1_IRQ_MASK,
  364. .status_mask = SPEAR300_GPIO1_IRQ_MASK,
  365. },
  366. };
  367. static struct spear_shirq shirq_ras1 = {
  368. .irq = SPEAR3XX_IRQ_GEN_RAS_1,
  369. .dev_config = shirq_ras1_config,
  370. .dev_count = ARRAY_SIZE(shirq_ras1_config),
  371. .regs = {
  372. .enb_reg = SPEAR300_INT_ENB_MASK_REG,
  373. .status_reg = SPEAR300_INT_STS_MASK_REG,
  374. .status_reg_mask = SPEAR300_SHIRQ_RAS1_MASK,
  375. .clear_reg = -1,
  376. },
  377. };
  378. /* Add spear300 specific devices here */
  379. /* arm gpio1 device registration */
  380. static struct pl061_platform_data gpio1_plat_data = {
  381. .gpio_base = 8,
  382. .irq_base = SPEAR300_GPIO1_INT_BASE,
  383. };
  384. AMBA_APB_DEVICE(spear300_gpio1, "gpio1", 0, SPEAR300_GPIO_BASE,
  385. {SPEAR300_VIRQ_GPIO1}, &gpio1_plat_data);
  386. /* spear300 routines */
  387. void __init spear300_init(struct pmx_mode *pmx_mode, struct pmx_dev **pmx_devs,
  388. u8 pmx_dev_count)
  389. {
  390. int ret = 0;
  391. /* call spear3xx family common init function */
  392. spear3xx_init();
  393. /* shared irq registration */
  394. shirq_ras1.regs.base = ioremap(SPEAR300_TELECOM_BASE, SZ_4K);
  395. if (shirq_ras1.regs.base) {
  396. ret = spear_shirq_register(&shirq_ras1);
  397. if (ret)
  398. printk(KERN_ERR "Error registering Shared IRQ\n");
  399. }
  400. /* pmx initialization */
  401. pmx_driver.mode = pmx_mode;
  402. pmx_driver.devs = pmx_devs;
  403. pmx_driver.devs_count = pmx_dev_count;
  404. pmx_driver.base = ioremap(SPEAR300_SOC_CONFIG_BASE, SZ_4K);
  405. if (pmx_driver.base) {
  406. ret = pmx_register(&pmx_driver);
  407. if (ret)
  408. printk(KERN_ERR "padmux: registration failed. err no"
  409. ": %d\n", ret);
  410. /* Free Mapping, device selection already done */
  411. iounmap(pmx_driver.base);
  412. }
  413. }