db1300.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782
  1. /*
  2. * DBAu1300 init and platform device setup.
  3. *
  4. * (c) 2009 Manuel Lauss <manuel.lauss@googlemail.com>
  5. */
  6. #include <linux/dma-mapping.h>
  7. #include <linux/gpio.h>
  8. #include <linux/gpio_keys.h>
  9. #include <linux/init.h>
  10. #include <linux/input.h> /* KEY_* codes */
  11. #include <linux/i2c.h>
  12. #include <linux/io.h>
  13. #include <linux/leds.h>
  14. #include <linux/ata_platform.h>
  15. #include <linux/mmc/host.h>
  16. #include <linux/module.h>
  17. #include <linux/mtd/mtd.h>
  18. #include <linux/mtd/nand.h>
  19. #include <linux/mtd/partitions.h>
  20. #include <linux/platform_device.h>
  21. #include <linux/smsc911x.h>
  22. #include <asm/mach-au1x00/au1000.h>
  23. #include <asm/mach-au1x00/au1100_mmc.h>
  24. #include <asm/mach-au1x00/au1200fb.h>
  25. #include <asm/mach-au1x00/au1xxx_dbdma.h>
  26. #include <asm/mach-au1x00/au1xxx_psc.h>
  27. #include <asm/mach-db1x00/db1300.h>
  28. #include <asm/mach-db1x00/bcsr.h>
  29. #include <asm/mach-au1x00/prom.h>
  30. #include "platform.h"
  31. static struct i2c_board_info db1300_i2c_devs[] __initdata = {
  32. { I2C_BOARD_INFO("wm8731", 0x1b), }, /* I2S audio codec */
  33. { I2C_BOARD_INFO("ne1619", 0x2d), }, /* adm1025-compat hwmon */
  34. };
  35. /* multifunction pins to assign to GPIO controller */
  36. static int db1300_gpio_pins[] __initdata = {
  37. AU1300_PIN_LCDPWM0, AU1300_PIN_PSC2SYNC1, AU1300_PIN_WAKE1,
  38. AU1300_PIN_WAKE2, AU1300_PIN_WAKE3, AU1300_PIN_FG3AUX,
  39. AU1300_PIN_EXTCLK1,
  40. -1, /* terminator */
  41. };
  42. /* multifunction pins to assign to device functions */
  43. static int db1300_dev_pins[] __initdata = {
  44. /* wake-from-str pins 0-3 */
  45. AU1300_PIN_WAKE0,
  46. /* external clock sources for PSC0 */
  47. AU1300_PIN_EXTCLK0,
  48. /* 8bit MMC interface on SD0: 6-9 */
  49. AU1300_PIN_SD0DAT4, AU1300_PIN_SD0DAT5, AU1300_PIN_SD0DAT6,
  50. AU1300_PIN_SD0DAT7,
  51. /* UART1 pins: 11-18 */
  52. AU1300_PIN_U1RI, AU1300_PIN_U1DCD, AU1300_PIN_U1DSR,
  53. AU1300_PIN_U1CTS, AU1300_PIN_U1RTS, AU1300_PIN_U1DTR,
  54. AU1300_PIN_U1RX, AU1300_PIN_U1TX,
  55. /* UART0 pins: 19-24 */
  56. AU1300_PIN_U0RI, AU1300_PIN_U0DCD, AU1300_PIN_U0DSR,
  57. AU1300_PIN_U0CTS, AU1300_PIN_U0RTS, AU1300_PIN_U0DTR,
  58. /* UART2: 25-26 */
  59. AU1300_PIN_U2RX, AU1300_PIN_U2TX,
  60. /* UART3: 27-28 */
  61. AU1300_PIN_U3RX, AU1300_PIN_U3TX,
  62. /* LCD controller PWMs, ext pixclock: 30-31 */
  63. AU1300_PIN_LCDPWM1, AU1300_PIN_LCDCLKIN,
  64. /* SD1 interface: 32-37 */
  65. AU1300_PIN_SD1DAT0, AU1300_PIN_SD1DAT1, AU1300_PIN_SD1DAT2,
  66. AU1300_PIN_SD1DAT3, AU1300_PIN_SD1CMD, AU1300_PIN_SD1CLK,
  67. /* SD2 interface: 38-43 */
  68. AU1300_PIN_SD2DAT0, AU1300_PIN_SD2DAT1, AU1300_PIN_SD2DAT2,
  69. AU1300_PIN_SD2DAT3, AU1300_PIN_SD2CMD, AU1300_PIN_SD2CLK,
  70. /* PSC0/1 clocks: 44-45 */
  71. AU1300_PIN_PSC0CLK, AU1300_PIN_PSC1CLK,
  72. /* PSCs: 46-49/50-53/54-57/58-61 */
  73. AU1300_PIN_PSC0SYNC0, AU1300_PIN_PSC0SYNC1, AU1300_PIN_PSC0D0,
  74. AU1300_PIN_PSC0D1,
  75. AU1300_PIN_PSC1SYNC0, AU1300_PIN_PSC1SYNC1, AU1300_PIN_PSC1D0,
  76. AU1300_PIN_PSC1D1,
  77. AU1300_PIN_PSC2SYNC0, AU1300_PIN_PSC2D0,
  78. AU1300_PIN_PSC2D1,
  79. AU1300_PIN_PSC3SYNC0, AU1300_PIN_PSC3SYNC1, AU1300_PIN_PSC3D0,
  80. AU1300_PIN_PSC3D1,
  81. /* PCMCIA interface: 62-70 */
  82. AU1300_PIN_PCE2, AU1300_PIN_PCE1, AU1300_PIN_PIOS16,
  83. AU1300_PIN_PIOR, AU1300_PIN_PWE, AU1300_PIN_PWAIT,
  84. AU1300_PIN_PREG, AU1300_PIN_POE, AU1300_PIN_PIOW,
  85. /* camera interface H/V sync inputs: 71-72 */
  86. AU1300_PIN_CIMLS, AU1300_PIN_CIMFS,
  87. /* PSC2/3 clocks: 73-74 */
  88. AU1300_PIN_PSC2CLK, AU1300_PIN_PSC3CLK,
  89. -1, /* terminator */
  90. };
  91. static void __init db1300_gpio_config(void)
  92. {
  93. int *i;
  94. i = &db1300_dev_pins[0];
  95. while (*i != -1)
  96. au1300_pinfunc_to_dev(*i++);
  97. i = &db1300_gpio_pins[0];
  98. while (*i != -1)
  99. au1300_gpio_direction_input(*i++);/* implies pin_to_gpio */
  100. au1300_set_dbdma_gpio(1, AU1300_PIN_FG3AUX);
  101. }
  102. char *get_system_type(void)
  103. {
  104. return "DB1300";
  105. }
  106. /**********************************************************************/
  107. static void au1300_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,
  108. unsigned int ctrl)
  109. {
  110. struct nand_chip *this = mtd->priv;
  111. unsigned long ioaddr = (unsigned long)this->IO_ADDR_W;
  112. ioaddr &= 0xffffff00;
  113. if (ctrl & NAND_CLE) {
  114. ioaddr += MEM_STNAND_CMD;
  115. } else if (ctrl & NAND_ALE) {
  116. ioaddr += MEM_STNAND_ADDR;
  117. } else {
  118. /* assume we want to r/w real data by default */
  119. ioaddr += MEM_STNAND_DATA;
  120. }
  121. this->IO_ADDR_R = this->IO_ADDR_W = (void __iomem *)ioaddr;
  122. if (cmd != NAND_CMD_NONE) {
  123. __raw_writeb(cmd, this->IO_ADDR_W);
  124. wmb();
  125. }
  126. }
  127. static int au1300_nand_device_ready(struct mtd_info *mtd)
  128. {
  129. return __raw_readl((void __iomem *)MEM_STSTAT) & 1;
  130. }
  131. static struct mtd_partition db1300_nand_parts[] = {
  132. {
  133. .name = "NAND FS 0",
  134. .offset = 0,
  135. .size = 8 * 1024 * 1024,
  136. },
  137. {
  138. .name = "NAND FS 1",
  139. .offset = MTDPART_OFS_APPEND,
  140. .size = MTDPART_SIZ_FULL
  141. },
  142. };
  143. struct platform_nand_data db1300_nand_platdata = {
  144. .chip = {
  145. .nr_chips = 1,
  146. .chip_offset = 0,
  147. .nr_partitions = ARRAY_SIZE(db1300_nand_parts),
  148. .partitions = db1300_nand_parts,
  149. .chip_delay = 20,
  150. },
  151. .ctrl = {
  152. .dev_ready = au1300_nand_device_ready,
  153. .cmd_ctrl = au1300_nand_cmd_ctrl,
  154. },
  155. };
  156. static struct resource db1300_nand_res[] = {
  157. [0] = {
  158. .start = DB1300_NAND_PHYS_ADDR,
  159. .end = DB1300_NAND_PHYS_ADDR + 0xff,
  160. .flags = IORESOURCE_MEM,
  161. },
  162. };
  163. static struct platform_device db1300_nand_dev = {
  164. .name = "gen_nand",
  165. .num_resources = ARRAY_SIZE(db1300_nand_res),
  166. .resource = db1300_nand_res,
  167. .id = -1,
  168. .dev = {
  169. .platform_data = &db1300_nand_platdata,
  170. }
  171. };
  172. /**********************************************************************/
  173. static struct resource db1300_eth_res[] = {
  174. [0] = {
  175. .start = DB1300_ETH_PHYS_ADDR,
  176. .end = DB1300_ETH_PHYS_END,
  177. .flags = IORESOURCE_MEM,
  178. },
  179. [1] = {
  180. .start = DB1300_ETH_INT,
  181. .end = DB1300_ETH_INT,
  182. .flags = IORESOURCE_IRQ,
  183. },
  184. };
  185. static struct smsc911x_platform_config db1300_eth_config = {
  186. .phy_interface = PHY_INTERFACE_MODE_MII,
  187. .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
  188. .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
  189. .flags = SMSC911X_USE_32BIT,
  190. };
  191. static struct platform_device db1300_eth_dev = {
  192. .name = "smsc911x",
  193. .id = -1,
  194. .num_resources = ARRAY_SIZE(db1300_eth_res),
  195. .resource = db1300_eth_res,
  196. .dev = {
  197. .platform_data = &db1300_eth_config,
  198. },
  199. };
  200. /**********************************************************************/
  201. static struct resource au1300_psc1_res[] = {
  202. [0] = {
  203. .start = AU1300_PSC1_PHYS_ADDR,
  204. .end = AU1300_PSC1_PHYS_ADDR + 0x0fff,
  205. .flags = IORESOURCE_MEM,
  206. },
  207. [1] = {
  208. .start = AU1300_PSC1_INT,
  209. .end = AU1300_PSC1_INT,
  210. .flags = IORESOURCE_IRQ,
  211. },
  212. [2] = {
  213. .start = AU1300_DSCR_CMD0_PSC1_TX,
  214. .end = AU1300_DSCR_CMD0_PSC1_TX,
  215. .flags = IORESOURCE_DMA,
  216. },
  217. [3] = {
  218. .start = AU1300_DSCR_CMD0_PSC1_RX,
  219. .end = AU1300_DSCR_CMD0_PSC1_RX,
  220. .flags = IORESOURCE_DMA,
  221. },
  222. };
  223. static struct platform_device db1300_ac97_dev = {
  224. .name = "au1xpsc_ac97",
  225. .id = 1, /* PSC ID. match with AC97 codec ID! */
  226. .num_resources = ARRAY_SIZE(au1300_psc1_res),
  227. .resource = au1300_psc1_res,
  228. };
  229. /**********************************************************************/
  230. static struct resource au1300_psc2_res[] = {
  231. [0] = {
  232. .start = AU1300_PSC2_PHYS_ADDR,
  233. .end = AU1300_PSC2_PHYS_ADDR + 0x0fff,
  234. .flags = IORESOURCE_MEM,
  235. },
  236. [1] = {
  237. .start = AU1300_PSC2_INT,
  238. .end = AU1300_PSC2_INT,
  239. .flags = IORESOURCE_IRQ,
  240. },
  241. [2] = {
  242. .start = AU1300_DSCR_CMD0_PSC2_TX,
  243. .end = AU1300_DSCR_CMD0_PSC2_TX,
  244. .flags = IORESOURCE_DMA,
  245. },
  246. [3] = {
  247. .start = AU1300_DSCR_CMD0_PSC2_RX,
  248. .end = AU1300_DSCR_CMD0_PSC2_RX,
  249. .flags = IORESOURCE_DMA,
  250. },
  251. };
  252. static struct platform_device db1300_i2s_dev = {
  253. .name = "au1xpsc_i2s",
  254. .id = 2, /* PSC ID */
  255. .num_resources = ARRAY_SIZE(au1300_psc2_res),
  256. .resource = au1300_psc2_res,
  257. };
  258. /**********************************************************************/
  259. static struct resource au1300_psc3_res[] = {
  260. [0] = {
  261. .start = AU1300_PSC3_PHYS_ADDR,
  262. .end = AU1300_PSC3_PHYS_ADDR + 0x0fff,
  263. .flags = IORESOURCE_MEM,
  264. },
  265. [1] = {
  266. .start = AU1300_PSC3_INT,
  267. .end = AU1300_PSC3_INT,
  268. .flags = IORESOURCE_IRQ,
  269. },
  270. [2] = {
  271. .start = AU1300_DSCR_CMD0_PSC3_TX,
  272. .end = AU1300_DSCR_CMD0_PSC3_TX,
  273. .flags = IORESOURCE_DMA,
  274. },
  275. [3] = {
  276. .start = AU1300_DSCR_CMD0_PSC3_RX,
  277. .end = AU1300_DSCR_CMD0_PSC3_RX,
  278. .flags = IORESOURCE_DMA,
  279. },
  280. };
  281. static struct platform_device db1300_i2c_dev = {
  282. .name = "au1xpsc_smbus",
  283. .id = 0, /* bus number */
  284. .num_resources = ARRAY_SIZE(au1300_psc3_res),
  285. .resource = au1300_psc3_res,
  286. };
  287. /**********************************************************************/
  288. /* proper key assignments when facing the LCD panel. For key assignments
  289. * according to the schematics swap up with down and left with right.
  290. * I chose to use it to emulate the arrow keys of a keyboard.
  291. */
  292. static struct gpio_keys_button db1300_5waysw_arrowkeys[] = {
  293. {
  294. .code = KEY_DOWN,
  295. .gpio = AU1300_PIN_LCDPWM0,
  296. .type = EV_KEY,
  297. .debounce_interval = 1,
  298. .active_low = 1,
  299. .desc = "5waysw-down",
  300. },
  301. {
  302. .code = KEY_UP,
  303. .gpio = AU1300_PIN_PSC2SYNC1,
  304. .type = EV_KEY,
  305. .debounce_interval = 1,
  306. .active_low = 1,
  307. .desc = "5waysw-up",
  308. },
  309. {
  310. .code = KEY_RIGHT,
  311. .gpio = AU1300_PIN_WAKE3,
  312. .type = EV_KEY,
  313. .debounce_interval = 1,
  314. .active_low = 1,
  315. .desc = "5waysw-right",
  316. },
  317. {
  318. .code = KEY_LEFT,
  319. .gpio = AU1300_PIN_WAKE2,
  320. .type = EV_KEY,
  321. .debounce_interval = 1,
  322. .active_low = 1,
  323. .desc = "5waysw-left",
  324. },
  325. {
  326. .code = KEY_ENTER,
  327. .gpio = AU1300_PIN_WAKE1,
  328. .type = EV_KEY,
  329. .debounce_interval = 1,
  330. .active_low = 1,
  331. .desc = "5waysw-push",
  332. },
  333. };
  334. static struct gpio_keys_platform_data db1300_5waysw_data = {
  335. .buttons = db1300_5waysw_arrowkeys,
  336. .nbuttons = ARRAY_SIZE(db1300_5waysw_arrowkeys),
  337. .rep = 1,
  338. .name = "db1300-5wayswitch",
  339. };
  340. static struct platform_device db1300_5waysw_dev = {
  341. .name = "gpio-keys",
  342. .dev = {
  343. .platform_data = &db1300_5waysw_data,
  344. },
  345. };
  346. /**********************************************************************/
  347. static struct pata_platform_info db1300_ide_info = {
  348. .ioport_shift = DB1300_IDE_REG_SHIFT,
  349. };
  350. #define IDE_ALT_START (14 << DB1300_IDE_REG_SHIFT)
  351. static struct resource db1300_ide_res[] = {
  352. [0] = {
  353. .start = DB1300_IDE_PHYS_ADDR,
  354. .end = DB1300_IDE_PHYS_ADDR + IDE_ALT_START - 1,
  355. .flags = IORESOURCE_MEM,
  356. },
  357. [1] = {
  358. .start = DB1300_IDE_PHYS_ADDR + IDE_ALT_START,
  359. .end = DB1300_IDE_PHYS_ADDR + DB1300_IDE_PHYS_LEN - 1,
  360. .flags = IORESOURCE_MEM,
  361. },
  362. [2] = {
  363. .start = DB1300_IDE_INT,
  364. .end = DB1300_IDE_INT,
  365. .flags = IORESOURCE_IRQ,
  366. },
  367. };
  368. static struct platform_device db1300_ide_dev = {
  369. .dev = {
  370. .platform_data = &db1300_ide_info,
  371. },
  372. .name = "pata_platform",
  373. .resource = db1300_ide_res,
  374. .num_resources = ARRAY_SIZE(db1300_ide_res),
  375. };
  376. /**********************************************************************/
  377. static irqreturn_t db1300_mmc_cd(int irq, void *ptr)
  378. {
  379. void(*mmc_cd)(struct mmc_host *, unsigned long);
  380. /* disable the one currently screaming. No other way to shut it up */
  381. if (irq == DB1300_SD1_INSERT_INT) {
  382. disable_irq_nosync(DB1300_SD1_INSERT_INT);
  383. enable_irq(DB1300_SD1_EJECT_INT);
  384. } else {
  385. disable_irq_nosync(DB1300_SD1_EJECT_INT);
  386. enable_irq(DB1300_SD1_INSERT_INT);
  387. }
  388. /* link against CONFIG_MMC=m. We can only be called once MMC core has
  389. * initialized the controller, so symbol_get() should always succeed.
  390. */
  391. mmc_cd = symbol_get(mmc_detect_change);
  392. mmc_cd(ptr, msecs_to_jiffies(500));
  393. symbol_put(mmc_detect_change);
  394. return IRQ_HANDLED;
  395. }
  396. static int db1300_mmc_card_readonly(void *mmc_host)
  397. {
  398. /* it uses SD1 interface, but the DB1200's SD0 bit in the CPLD */
  399. return bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD0WP;
  400. }
  401. static int db1300_mmc_card_inserted(void *mmc_host)
  402. {
  403. return bcsr_read(BCSR_SIGSTAT) & (1 << 12); /* insertion irq signal */
  404. }
  405. static int db1300_mmc_cd_setup(void *mmc_host, int en)
  406. {
  407. int ret;
  408. if (en) {
  409. ret = request_irq(DB1300_SD1_INSERT_INT, db1300_mmc_cd, 0,
  410. "sd_insert", mmc_host);
  411. if (ret)
  412. goto out;
  413. ret = request_irq(DB1300_SD1_EJECT_INT, db1300_mmc_cd, 0,
  414. "sd_eject", mmc_host);
  415. if (ret) {
  416. free_irq(DB1300_SD1_INSERT_INT, mmc_host);
  417. goto out;
  418. }
  419. if (db1300_mmc_card_inserted(mmc_host))
  420. enable_irq(DB1300_SD1_EJECT_INT);
  421. else
  422. enable_irq(DB1300_SD1_INSERT_INT);
  423. } else {
  424. free_irq(DB1300_SD1_INSERT_INT, mmc_host);
  425. free_irq(DB1300_SD1_EJECT_INT, mmc_host);
  426. }
  427. ret = 0;
  428. out:
  429. return ret;
  430. }
  431. static void db1300_mmcled_set(struct led_classdev *led,
  432. enum led_brightness brightness)
  433. {
  434. if (brightness != LED_OFF)
  435. bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED0, 0);
  436. else
  437. bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED0);
  438. }
  439. static struct led_classdev db1300_mmc_led = {
  440. .brightness_set = db1300_mmcled_set,
  441. };
  442. struct au1xmmc_platform_data db1300_sd1_platdata = {
  443. .cd_setup = db1300_mmc_cd_setup,
  444. .card_inserted = db1300_mmc_card_inserted,
  445. .card_readonly = db1300_mmc_card_readonly,
  446. .led = &db1300_mmc_led,
  447. };
  448. static struct resource au1300_sd1_res[] = {
  449. [0] = {
  450. .start = AU1300_SD1_PHYS_ADDR,
  451. .end = AU1300_SD1_PHYS_ADDR,
  452. .flags = IORESOURCE_MEM,
  453. },
  454. [1] = {
  455. .start = AU1300_SD1_INT,
  456. .end = AU1300_SD1_INT,
  457. .flags = IORESOURCE_IRQ,
  458. },
  459. [2] = {
  460. .start = AU1300_DSCR_CMD0_SDMS_TX1,
  461. .end = AU1300_DSCR_CMD0_SDMS_TX1,
  462. .flags = IORESOURCE_DMA,
  463. },
  464. [3] = {
  465. .start = AU1300_DSCR_CMD0_SDMS_RX1,
  466. .end = AU1300_DSCR_CMD0_SDMS_RX1,
  467. .flags = IORESOURCE_DMA,
  468. },
  469. };
  470. static struct platform_device db1300_sd1_dev = {
  471. .dev = {
  472. .platform_data = &db1300_sd1_platdata,
  473. },
  474. .name = "au1xxx-mmc",
  475. .id = 1,
  476. .resource = au1300_sd1_res,
  477. .num_resources = ARRAY_SIZE(au1300_sd1_res),
  478. };
  479. /**********************************************************************/
  480. static int db1300_movinand_inserted(void *mmc_host)
  481. {
  482. return 0; /* disable for now, it doesn't work yet */
  483. }
  484. static int db1300_movinand_readonly(void *mmc_host)
  485. {
  486. return 0;
  487. }
  488. static void db1300_movinand_led_set(struct led_classdev *led,
  489. enum led_brightness brightness)
  490. {
  491. if (brightness != LED_OFF)
  492. bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED1, 0);
  493. else
  494. bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED1);
  495. }
  496. static struct led_classdev db1300_movinand_led = {
  497. .brightness_set = db1300_movinand_led_set,
  498. };
  499. struct au1xmmc_platform_data db1300_sd0_platdata = {
  500. .card_inserted = db1300_movinand_inserted,
  501. .card_readonly = db1300_movinand_readonly,
  502. .led = &db1300_movinand_led,
  503. .mask_host_caps = MMC_CAP_NEEDS_POLL,
  504. };
  505. static struct resource au1300_sd0_res[] = {
  506. [0] = {
  507. .start = AU1100_SD0_PHYS_ADDR,
  508. .end = AU1100_SD0_PHYS_ADDR,
  509. .flags = IORESOURCE_MEM,
  510. },
  511. [1] = {
  512. .start = AU1300_SD0_INT,
  513. .end = AU1300_SD0_INT,
  514. .flags = IORESOURCE_IRQ,
  515. },
  516. [2] = {
  517. .start = AU1300_DSCR_CMD0_SDMS_TX0,
  518. .end = AU1300_DSCR_CMD0_SDMS_TX0,
  519. .flags = IORESOURCE_DMA,
  520. },
  521. [3] = {
  522. .start = AU1300_DSCR_CMD0_SDMS_RX0,
  523. .end = AU1300_DSCR_CMD0_SDMS_RX0,
  524. .flags = IORESOURCE_DMA,
  525. },
  526. };
  527. static struct platform_device db1300_sd0_dev = {
  528. .dev = {
  529. .platform_data = &db1300_sd0_platdata,
  530. },
  531. .name = "au1xxx-mmc",
  532. .id = 0,
  533. .resource = au1300_sd0_res,
  534. .num_resources = ARRAY_SIZE(au1300_sd0_res),
  535. };
  536. /**********************************************************************/
  537. static struct platform_device db1300_wm9715_dev = {
  538. .name = "wm9712-codec",
  539. .id = 1, /* ID of PSC for AC97 audio, see asoc glue! */
  540. };
  541. static struct platform_device db1300_ac97dma_dev = {
  542. .name = "au1xpsc-pcm",
  543. .id = 1, /* PSC ID */
  544. };
  545. static struct platform_device db1300_i2sdma_dev = {
  546. .name = "au1xpsc-pcm",
  547. .id = 2, /* PSC ID */
  548. };
  549. static struct platform_device db1300_sndac97_dev = {
  550. .name = "db1300-ac97",
  551. };
  552. static struct platform_device db1300_sndi2s_dev = {
  553. .name = "db1300-i2s",
  554. };
  555. /**********************************************************************/
  556. static int db1300fb_panel_index(void)
  557. {
  558. return 9; /* DB1300_800x480 */
  559. }
  560. static int db1300fb_panel_init(void)
  561. {
  562. /* Apply power (Vee/Vdd logic is inverted on Panel DB1300_800x480) */
  563. bcsr_mod(BCSR_BOARD, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD,
  564. BCSR_BOARD_LCDBL);
  565. return 0;
  566. }
  567. static int db1300fb_panel_shutdown(void)
  568. {
  569. /* Remove power (Vee/Vdd logic is inverted on Panel DB1300_800x480) */
  570. bcsr_mod(BCSR_BOARD, BCSR_BOARD_LCDBL,
  571. BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD);
  572. return 0;
  573. }
  574. static struct au1200fb_platdata db1300fb_pd = {
  575. .panel_index = db1300fb_panel_index,
  576. .panel_init = db1300fb_panel_init,
  577. .panel_shutdown = db1300fb_panel_shutdown,
  578. };
  579. static struct resource au1300_lcd_res[] = {
  580. [0] = {
  581. .start = AU1200_LCD_PHYS_ADDR,
  582. .end = AU1200_LCD_PHYS_ADDR + 0x800 - 1,
  583. .flags = IORESOURCE_MEM,
  584. },
  585. [1] = {
  586. .start = AU1300_LCD_INT,
  587. .end = AU1300_LCD_INT,
  588. .flags = IORESOURCE_IRQ,
  589. }
  590. };
  591. static u64 au1300_lcd_dmamask = DMA_BIT_MASK(32);
  592. static struct platform_device db1300_lcd_dev = {
  593. .name = "au1200-lcd",
  594. .id = 0,
  595. .dev = {
  596. .dma_mask = &au1300_lcd_dmamask,
  597. .coherent_dma_mask = DMA_BIT_MASK(32),
  598. .platform_data = &db1300fb_pd,
  599. },
  600. .num_resources = ARRAY_SIZE(au1300_lcd_res),
  601. .resource = au1300_lcd_res,
  602. };
  603. /**********************************************************************/
  604. static struct platform_device *db1300_dev[] __initdata = {
  605. &db1300_eth_dev,
  606. &db1300_i2c_dev,
  607. &db1300_5waysw_dev,
  608. &db1300_nand_dev,
  609. &db1300_ide_dev,
  610. &db1300_sd0_dev,
  611. &db1300_sd1_dev,
  612. &db1300_lcd_dev,
  613. &db1300_ac97_dev,
  614. &db1300_i2s_dev,
  615. &db1300_wm9715_dev,
  616. &db1300_ac97dma_dev,
  617. &db1300_i2sdma_dev,
  618. &db1300_sndac97_dev,
  619. &db1300_sndi2s_dev,
  620. };
  621. static int __init db1300_device_init(void)
  622. {
  623. int swapped, cpldirq;
  624. /* setup CPLD IRQ muxer */
  625. cpldirq = au1300_gpio_to_irq(AU1300_PIN_EXTCLK1);
  626. irq_set_irq_type(cpldirq, IRQ_TYPE_LEVEL_HIGH);
  627. bcsr_init_irq(DB1300_FIRST_INT, DB1300_LAST_INT, cpldirq);
  628. /* insert/eject IRQs: one always triggers so don't enable them
  629. * when doing request_irq() on them. DB1200 has this bug too.
  630. */
  631. irq_set_status_flags(DB1300_SD1_INSERT_INT, IRQ_NOAUTOEN);
  632. irq_set_status_flags(DB1300_SD1_EJECT_INT, IRQ_NOAUTOEN);
  633. irq_set_status_flags(DB1300_CF_INSERT_INT, IRQ_NOAUTOEN);
  634. irq_set_status_flags(DB1300_CF_EJECT_INT, IRQ_NOAUTOEN);
  635. /*
  636. * setup board
  637. */
  638. prom_get_ethernet_addr(&db1300_eth_config.mac[0]);
  639. i2c_register_board_info(0, db1300_i2c_devs,
  640. ARRAY_SIZE(db1300_i2c_devs));
  641. /* Audio PSC clock is supplied by codecs (PSC1, 2) */
  642. __raw_writel(PSC_SEL_CLK_SERCLK,
  643. (void __iomem *)KSEG1ADDR(AU1300_PSC1_PHYS_ADDR) + PSC_SEL_OFFSET);
  644. wmb();
  645. __raw_writel(PSC_SEL_CLK_SERCLK,
  646. (void __iomem *)KSEG1ADDR(AU1300_PSC2_PHYS_ADDR) + PSC_SEL_OFFSET);
  647. wmb();
  648. /* I2C uses internal 48MHz EXTCLK1 */
  649. __raw_writel(PSC_SEL_CLK_INTCLK,
  650. (void __iomem *)KSEG1ADDR(AU1300_PSC3_PHYS_ADDR) + PSC_SEL_OFFSET);
  651. wmb();
  652. /* enable power to USB ports */
  653. bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_USBHPWR | BCSR_RESETS_OTGPWR);
  654. /* although it is socket #0, it uses the CPLD bits which previous boards
  655. * have used for socket #1.
  656. */
  657. db1x_register_pcmcia_socket(
  658. AU1000_PCMCIA_ATTR_PHYS_ADDR,
  659. AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x00400000 - 1,
  660. AU1000_PCMCIA_MEM_PHYS_ADDR,
  661. AU1000_PCMCIA_MEM_PHYS_ADDR + 0x00400000 - 1,
  662. AU1000_PCMCIA_IO_PHYS_ADDR,
  663. AU1000_PCMCIA_IO_PHYS_ADDR + 0x00010000 - 1,
  664. DB1300_CF_INT, DB1300_CF_INSERT_INT, 0, DB1300_CF_EJECT_INT, 1);
  665. swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1200_SWAPBOOT;
  666. db1x_register_norflash(64 << 20, 2, swapped);
  667. return platform_add_devices(db1300_dev, ARRAY_SIZE(db1300_dev));
  668. }
  669. device_initcall(db1300_device_init);
  670. void __init board_setup(void)
  671. {
  672. unsigned short whoami;
  673. db1300_gpio_config();
  674. bcsr_init(DB1300_BCSR_PHYS_ADDR,
  675. DB1300_BCSR_PHYS_ADDR + DB1300_BCSR_HEXLED_OFS);
  676. whoami = bcsr_read(BCSR_WHOAMI);
  677. printk(KERN_INFO "NetLogic DBAu1300 Development Platform.\n\t"
  678. "BoardID %d CPLD Rev %d DaughtercardID %d\n",
  679. BCSR_WHOAMI_BOARD(whoami), BCSR_WHOAMI_CPLD(whoami),
  680. BCSR_WHOAMI_DCID(whoami));
  681. /* enable UARTs, YAMON only enables #2 */
  682. alchemy_uart_enable(AU1300_UART0_PHYS_ADDR);
  683. alchemy_uart_enable(AU1300_UART1_PHYS_ADDR);
  684. alchemy_uart_enable(AU1300_UART3_PHYS_ADDR);
  685. }