platform.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. /*
  2. * Pb1200/DBAu1200 board platform device registration
  3. *
  4. * Copyright (C) 2008 MontaVista Software Inc. <source@mvista.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #include <linux/dma-mapping.h>
  21. #include <linux/init.h>
  22. #include <linux/leds.h>
  23. #include <linux/platform_device.h>
  24. #include <linux/smc91x.h>
  25. #include <asm/mach-au1x00/au1000.h>
  26. #include <asm/mach-au1x00/au1100_mmc.h>
  27. #include <asm/mach-au1x00/au1xxx_dbdma.h>
  28. #include <asm/mach-db1x00/bcsr.h>
  29. #include <asm/mach-pb1x00/pb1200.h>
  30. #include "../platform.h"
  31. static int mmc_activity;
  32. static void pb1200mmc0_set_power(void *mmc_host, int state)
  33. {
  34. if (state)
  35. bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD0PWR);
  36. else
  37. bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD0PWR, 0);
  38. msleep(1);
  39. }
  40. static int pb1200mmc0_card_readonly(void *mmc_host)
  41. {
  42. return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD0WP) ? 1 : 0;
  43. }
  44. static int pb1200mmc0_card_inserted(void *mmc_host)
  45. {
  46. return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD0INSERT) ? 1 : 0;
  47. }
  48. static void pb1200_mmcled_set(struct led_classdev *led,
  49. enum led_brightness brightness)
  50. {
  51. if (brightness != LED_OFF) {
  52. if (++mmc_activity == 1)
  53. bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED0, 0);
  54. } else {
  55. if (--mmc_activity == 0)
  56. bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED0);
  57. }
  58. }
  59. static struct led_classdev pb1200mmc_led = {
  60. .brightness_set = pb1200_mmcled_set,
  61. };
  62. static void pb1200mmc1_set_power(void *mmc_host, int state)
  63. {
  64. if (state)
  65. bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD1PWR);
  66. else
  67. bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD1PWR, 0);
  68. msleep(1);
  69. }
  70. static int pb1200mmc1_card_readonly(void *mmc_host)
  71. {
  72. return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD1WP) ? 1 : 0;
  73. }
  74. static int pb1200mmc1_card_inserted(void *mmc_host)
  75. {
  76. return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD1INSERT) ? 1 : 0;
  77. }
  78. static struct au1xmmc_platform_data pb1200mmc_platdata[2] = {
  79. [0] = {
  80. .set_power = pb1200mmc0_set_power,
  81. .card_inserted = pb1200mmc0_card_inserted,
  82. .card_readonly = pb1200mmc0_card_readonly,
  83. .cd_setup = NULL, /* use poll-timer in driver */
  84. .led = &pb1200mmc_led,
  85. },
  86. [1] = {
  87. .set_power = pb1200mmc1_set_power,
  88. .card_inserted = pb1200mmc1_card_inserted,
  89. .card_readonly = pb1200mmc1_card_readonly,
  90. .cd_setup = NULL, /* use poll-timer in driver */
  91. .led = &pb1200mmc_led,
  92. },
  93. };
  94. static u64 au1xxx_mmc_dmamask = DMA_BIT_MASK(32);
  95. static struct resource au1200_mmc0_res[] = {
  96. [0] = {
  97. .start = AU1100_SD0_PHYS_ADDR,
  98. .end = AU1100_SD0_PHYS_ADDR + 0xfff,
  99. .flags = IORESOURCE_MEM,
  100. },
  101. [1] = {
  102. .start = AU1200_SD_INT,
  103. .end = AU1200_SD_INT,
  104. .flags = IORESOURCE_IRQ,
  105. },
  106. [2] = {
  107. .start = AU1200_DSCR_CMD0_SDMS_TX0,
  108. .end = AU1200_DSCR_CMD0_SDMS_TX0,
  109. .flags = IORESOURCE_DMA,
  110. },
  111. [3] = {
  112. .start = AU1200_DSCR_CMD0_SDMS_RX0,
  113. .end = AU1200_DSCR_CMD0_SDMS_RX0,
  114. .flags = IORESOURCE_DMA,
  115. }
  116. };
  117. static struct platform_device pb1200_mmc0_dev = {
  118. .name = "au1xxx-mmc",
  119. .id = 0,
  120. .dev = {
  121. .dma_mask = &au1xxx_mmc_dmamask,
  122. .coherent_dma_mask = DMA_BIT_MASK(32),
  123. .platform_data = &pb1200mmc_platdata[0],
  124. },
  125. .num_resources = ARRAY_SIZE(au1200_mmc0_res),
  126. .resource = au1200_mmc0_res,
  127. };
  128. static struct resource au1200_mmc1_res[] = {
  129. [0] = {
  130. .start = AU1100_SD1_PHYS_ADDR,
  131. .end = AU1100_SD1_PHYS_ADDR + 0xfff,
  132. .flags = IORESOURCE_MEM,
  133. },
  134. [1] = {
  135. .start = AU1200_SD_INT,
  136. .end = AU1200_SD_INT,
  137. .flags = IORESOURCE_IRQ,
  138. },
  139. [2] = {
  140. .start = AU1200_DSCR_CMD0_SDMS_TX1,
  141. .end = AU1200_DSCR_CMD0_SDMS_TX1,
  142. .flags = IORESOURCE_DMA,
  143. },
  144. [3] = {
  145. .start = AU1200_DSCR_CMD0_SDMS_RX1,
  146. .end = AU1200_DSCR_CMD0_SDMS_RX1,
  147. .flags = IORESOURCE_DMA,
  148. }
  149. };
  150. static struct platform_device pb1200_mmc1_dev = {
  151. .name = "au1xxx-mmc",
  152. .id = 1,
  153. .dev = {
  154. .dma_mask = &au1xxx_mmc_dmamask,
  155. .coherent_dma_mask = DMA_BIT_MASK(32),
  156. .platform_data = &pb1200mmc_platdata[1],
  157. },
  158. .num_resources = ARRAY_SIZE(au1200_mmc1_res),
  159. .resource = au1200_mmc1_res,
  160. };
  161. static struct resource ide_resources[] = {
  162. [0] = {
  163. .start = IDE_PHYS_ADDR,
  164. .end = IDE_PHYS_ADDR + IDE_PHYS_LEN - 1,
  165. .flags = IORESOURCE_MEM
  166. },
  167. [1] = {
  168. .start = IDE_INT,
  169. .end = IDE_INT,
  170. .flags = IORESOURCE_IRQ
  171. },
  172. [2] = {
  173. .start = AU1200_DSCR_CMD0_DMA_REQ1,
  174. .end = AU1200_DSCR_CMD0_DMA_REQ1,
  175. .flags = IORESOURCE_DMA,
  176. },
  177. };
  178. static u64 ide_dmamask = DMA_BIT_MASK(32);
  179. static struct platform_device ide_device = {
  180. .name = "au1200-ide",
  181. .id = 0,
  182. .dev = {
  183. .dma_mask = &ide_dmamask,
  184. .coherent_dma_mask = DMA_BIT_MASK(32),
  185. },
  186. .num_resources = ARRAY_SIZE(ide_resources),
  187. .resource = ide_resources
  188. };
  189. static struct smc91x_platdata smc_data = {
  190. .flags = SMC91X_NOWAIT | SMC91X_USE_16BIT,
  191. .leda = RPC_LED_100_10,
  192. .ledb = RPC_LED_TX_RX,
  193. };
  194. static struct resource smc91c111_resources[] = {
  195. [0] = {
  196. .name = "smc91x-regs",
  197. .start = SMC91C111_PHYS_ADDR,
  198. .end = SMC91C111_PHYS_ADDR + 0xf,
  199. .flags = IORESOURCE_MEM
  200. },
  201. [1] = {
  202. .start = SMC91C111_INT,
  203. .end = SMC91C111_INT,
  204. .flags = IORESOURCE_IRQ
  205. },
  206. };
  207. static struct platform_device smc91c111_device = {
  208. .dev = {
  209. .platform_data = &smc_data,
  210. },
  211. .name = "smc91x",
  212. .id = -1,
  213. .num_resources = ARRAY_SIZE(smc91c111_resources),
  214. .resource = smc91c111_resources
  215. };
  216. static struct resource au1200_psc0_res[] = {
  217. [0] = {
  218. .start = AU1550_PSC0_PHYS_ADDR,
  219. .end = AU1550_PSC0_PHYS_ADDR + 0xfff,
  220. .flags = IORESOURCE_MEM,
  221. },
  222. [1] = {
  223. .start = AU1200_PSC0_INT,
  224. .end = AU1200_PSC0_INT,
  225. .flags = IORESOURCE_IRQ,
  226. },
  227. [2] = {
  228. .start = AU1200_DSCR_CMD0_PSC0_TX,
  229. .end = AU1200_DSCR_CMD0_PSC0_TX,
  230. .flags = IORESOURCE_DMA,
  231. },
  232. [3] = {
  233. .start = AU1200_DSCR_CMD0_PSC0_RX,
  234. .end = AU1200_DSCR_CMD0_PSC0_RX,
  235. .flags = IORESOURCE_DMA,
  236. },
  237. };
  238. static struct platform_device pb1200_i2c_dev = {
  239. .name = "au1xpsc_smbus",
  240. .id = 0, /* bus number */
  241. .num_resources = ARRAY_SIZE(au1200_psc0_res),
  242. .resource = au1200_psc0_res,
  243. };
  244. static struct resource au1200_lcd_res[] = {
  245. [0] = {
  246. .start = AU1200_LCD_PHYS_ADDR,
  247. .end = AU1200_LCD_PHYS_ADDR + 0x800 - 1,
  248. .flags = IORESOURCE_MEM,
  249. },
  250. [1] = {
  251. .start = AU1200_LCD_INT,
  252. .end = AU1200_LCD_INT,
  253. .flags = IORESOURCE_IRQ,
  254. }
  255. };
  256. static u64 au1200_lcd_dmamask = DMA_BIT_MASK(32);
  257. static struct platform_device au1200_lcd_dev = {
  258. .name = "au1200-lcd",
  259. .id = 0,
  260. .dev = {
  261. .dma_mask = &au1200_lcd_dmamask,
  262. .coherent_dma_mask = DMA_BIT_MASK(32),
  263. },
  264. .num_resources = ARRAY_SIZE(au1200_lcd_res),
  265. .resource = au1200_lcd_res,
  266. };
  267. static struct platform_device *board_platform_devices[] __initdata = {
  268. &ide_device,
  269. &smc91c111_device,
  270. &pb1200_i2c_dev,
  271. &pb1200_mmc0_dev,
  272. &pb1200_mmc1_dev,
  273. &au1200_lcd_dev,
  274. };
  275. static int __init board_register_devices(void)
  276. {
  277. int swapped;
  278. db1x_register_pcmcia_socket(
  279. AU1000_PCMCIA_ATTR_PHYS_ADDR,
  280. AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
  281. AU1000_PCMCIA_MEM_PHYS_ADDR,
  282. AU1000_PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1,
  283. AU1000_PCMCIA_IO_PHYS_ADDR,
  284. AU1000_PCMCIA_IO_PHYS_ADDR + 0x000010000 - 1,
  285. PB1200_PC0_INT, PB1200_PC0_INSERT_INT,
  286. /*PB1200_PC0_STSCHG_INT*/0, PB1200_PC0_EJECT_INT, 0);
  287. db1x_register_pcmcia_socket(
  288. AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x008000000,
  289. AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x008400000 - 1,
  290. AU1000_PCMCIA_MEM_PHYS_ADDR + 0x008000000,
  291. AU1000_PCMCIA_MEM_PHYS_ADDR + 0x008400000 - 1,
  292. AU1000_PCMCIA_IO_PHYS_ADDR + 0x008000000,
  293. AU1000_PCMCIA_IO_PHYS_ADDR + 0x008010000 - 1,
  294. PB1200_PC1_INT, PB1200_PC1_INSERT_INT,
  295. /*PB1200_PC1_STSCHG_INT*/0, PB1200_PC1_EJECT_INT, 1);
  296. swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1200_SWAPBOOT;
  297. db1x_register_norflash(128 * 1024 * 1024, 2, swapped);
  298. return platform_add_devices(board_platform_devices,
  299. ARRAY_SIZE(board_platform_devices));
  300. }
  301. device_initcall(board_register_devices);