devices-da8xx.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029
  1. /*
  2. * DA8XX/OMAP L1XX platform device data
  3. *
  4. * Copyright (c) 2007-2009, MontaVista Software, Inc. <source@mvista.com>
  5. * Derived from code that was:
  6. * Copyright (C) 2006 Komal Shah <komal_shah802003@yahoo.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. */
  13. #include <linux/init.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/dma-contiguous.h>
  16. #include <linux/serial_8250.h>
  17. #include <linux/ahci_platform.h>
  18. #include <linux/clk.h>
  19. #include <linux/reboot.h>
  20. #include <mach/cputype.h>
  21. #include <mach/common.h>
  22. #include <mach/time.h>
  23. #include <mach/da8xx.h>
  24. #include <mach/cpuidle.h>
  25. #include <mach/sram.h>
  26. #include "clock.h"
  27. #include "asp.h"
  28. #define DA8XX_TPCC_BASE 0x01c00000
  29. #define DA8XX_TPTC0_BASE 0x01c08000
  30. #define DA8XX_TPTC1_BASE 0x01c08400
  31. #define DA8XX_WDOG_BASE 0x01c21000 /* DA8XX_TIMER64P1_BASE */
  32. #define DA8XX_I2C0_BASE 0x01c22000
  33. #define DA8XX_RTC_BASE 0x01c23000
  34. #define DA8XX_PRUSS_MEM_BASE 0x01c30000
  35. #define DA8XX_MMCSD0_BASE 0x01c40000
  36. #define DA8XX_SPI0_BASE 0x01c41000
  37. #define DA830_SPI1_BASE 0x01e12000
  38. #define DA8XX_LCD_CNTRL_BASE 0x01e13000
  39. #define DA850_SATA_BASE 0x01e18000
  40. #define DA850_MMCSD1_BASE 0x01e1b000
  41. #define DA8XX_EMAC_CPPI_PORT_BASE 0x01e20000
  42. #define DA8XX_EMAC_CPGMACSS_BASE 0x01e22000
  43. #define DA8XX_EMAC_CPGMAC_BASE 0x01e23000
  44. #define DA8XX_EMAC_MDIO_BASE 0x01e24000
  45. #define DA8XX_I2C1_BASE 0x01e28000
  46. #define DA850_TPCC1_BASE 0x01e30000
  47. #define DA850_TPTC2_BASE 0x01e38000
  48. #define DA850_SPI1_BASE 0x01f0e000
  49. #define DA8XX_DDR2_CTL_BASE 0xb0000000
  50. #define DA8XX_EMAC_CTRL_REG_OFFSET 0x3000
  51. #define DA8XX_EMAC_MOD_REG_OFFSET 0x2000
  52. #define DA8XX_EMAC_RAM_OFFSET 0x0000
  53. #define DA8XX_EMAC_CTRL_RAM_SIZE SZ_8K
  54. #define DA8XX_DMA_SPI0_RX EDMA_CTLR_CHAN(0, 14)
  55. #define DA8XX_DMA_SPI0_TX EDMA_CTLR_CHAN(0, 15)
  56. #define DA8XX_DMA_MMCSD0_RX EDMA_CTLR_CHAN(0, 16)
  57. #define DA8XX_DMA_MMCSD0_TX EDMA_CTLR_CHAN(0, 17)
  58. #define DA8XX_DMA_SPI1_RX EDMA_CTLR_CHAN(0, 18)
  59. #define DA8XX_DMA_SPI1_TX EDMA_CTLR_CHAN(0, 19)
  60. #define DA850_DMA_MMCSD1_RX EDMA_CTLR_CHAN(1, 28)
  61. #define DA850_DMA_MMCSD1_TX EDMA_CTLR_CHAN(1, 29)
  62. void __iomem *da8xx_syscfg0_base;
  63. void __iomem *da8xx_syscfg1_base;
  64. static struct plat_serial8250_port da8xx_serial0_pdata[] = {
  65. {
  66. .mapbase = DA8XX_UART0_BASE,
  67. .irq = IRQ_DA8XX_UARTINT0,
  68. .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
  69. UPF_IOREMAP,
  70. .iotype = UPIO_MEM,
  71. .regshift = 2,
  72. },
  73. {
  74. .flags = 0,
  75. }
  76. };
  77. static struct plat_serial8250_port da8xx_serial1_pdata[] = {
  78. {
  79. .mapbase = DA8XX_UART1_BASE,
  80. .irq = IRQ_DA8XX_UARTINT1,
  81. .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
  82. UPF_IOREMAP,
  83. .iotype = UPIO_MEM,
  84. .regshift = 2,
  85. },
  86. {
  87. .flags = 0,
  88. }
  89. };
  90. static struct plat_serial8250_port da8xx_serial2_pdata[] = {
  91. {
  92. .mapbase = DA8XX_UART2_BASE,
  93. .irq = IRQ_DA8XX_UARTINT2,
  94. .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
  95. UPF_IOREMAP,
  96. .iotype = UPIO_MEM,
  97. .regshift = 2,
  98. },
  99. {
  100. .flags = 0,
  101. }
  102. };
  103. struct platform_device da8xx_serial_device[] = {
  104. {
  105. .name = "serial8250",
  106. .id = PLAT8250_DEV_PLATFORM,
  107. .dev = {
  108. .platform_data = da8xx_serial0_pdata,
  109. }
  110. },
  111. {
  112. .name = "serial8250",
  113. .id = PLAT8250_DEV_PLATFORM1,
  114. .dev = {
  115. .platform_data = da8xx_serial1_pdata,
  116. }
  117. },
  118. {
  119. .name = "serial8250",
  120. .id = PLAT8250_DEV_PLATFORM2,
  121. .dev = {
  122. .platform_data = da8xx_serial2_pdata,
  123. }
  124. },
  125. {
  126. }
  127. };
  128. static s8 da8xx_queue_priority_mapping[][2] = {
  129. /* {event queue no, Priority} */
  130. {0, 3},
  131. {1, 7},
  132. {-1, -1}
  133. };
  134. static s8 da850_queue_priority_mapping[][2] = {
  135. /* {event queue no, Priority} */
  136. {0, 3},
  137. {-1, -1}
  138. };
  139. static struct edma_soc_info da830_edma_cc0_info = {
  140. .queue_priority_mapping = da8xx_queue_priority_mapping,
  141. .default_queue = EVENTQ_1,
  142. };
  143. static struct edma_soc_info *da830_edma_info[EDMA_MAX_CC] = {
  144. &da830_edma_cc0_info,
  145. };
  146. static struct edma_soc_info da850_edma_cc_info[] = {
  147. {
  148. .queue_priority_mapping = da8xx_queue_priority_mapping,
  149. .default_queue = EVENTQ_1,
  150. },
  151. {
  152. .queue_priority_mapping = da850_queue_priority_mapping,
  153. .default_queue = EVENTQ_0,
  154. },
  155. };
  156. static struct edma_soc_info *da850_edma_info[EDMA_MAX_CC] = {
  157. &da850_edma_cc_info[0],
  158. &da850_edma_cc_info[1],
  159. };
  160. static struct resource da830_edma_resources[] = {
  161. {
  162. .name = "edma_cc0",
  163. .start = DA8XX_TPCC_BASE,
  164. .end = DA8XX_TPCC_BASE + SZ_32K - 1,
  165. .flags = IORESOURCE_MEM,
  166. },
  167. {
  168. .name = "edma_tc0",
  169. .start = DA8XX_TPTC0_BASE,
  170. .end = DA8XX_TPTC0_BASE + SZ_1K - 1,
  171. .flags = IORESOURCE_MEM,
  172. },
  173. {
  174. .name = "edma_tc1",
  175. .start = DA8XX_TPTC1_BASE,
  176. .end = DA8XX_TPTC1_BASE + SZ_1K - 1,
  177. .flags = IORESOURCE_MEM,
  178. },
  179. {
  180. .name = "edma0",
  181. .start = IRQ_DA8XX_CCINT0,
  182. .flags = IORESOURCE_IRQ,
  183. },
  184. {
  185. .name = "edma0_err",
  186. .start = IRQ_DA8XX_CCERRINT,
  187. .flags = IORESOURCE_IRQ,
  188. },
  189. };
  190. static struct resource da850_edma_resources[] = {
  191. {
  192. .name = "edma_cc0",
  193. .start = DA8XX_TPCC_BASE,
  194. .end = DA8XX_TPCC_BASE + SZ_32K - 1,
  195. .flags = IORESOURCE_MEM,
  196. },
  197. {
  198. .name = "edma_tc0",
  199. .start = DA8XX_TPTC0_BASE,
  200. .end = DA8XX_TPTC0_BASE + SZ_1K - 1,
  201. .flags = IORESOURCE_MEM,
  202. },
  203. {
  204. .name = "edma_tc1",
  205. .start = DA8XX_TPTC1_BASE,
  206. .end = DA8XX_TPTC1_BASE + SZ_1K - 1,
  207. .flags = IORESOURCE_MEM,
  208. },
  209. {
  210. .name = "edma_cc1",
  211. .start = DA850_TPCC1_BASE,
  212. .end = DA850_TPCC1_BASE + SZ_32K - 1,
  213. .flags = IORESOURCE_MEM,
  214. },
  215. {
  216. .name = "edma_tc2",
  217. .start = DA850_TPTC2_BASE,
  218. .end = DA850_TPTC2_BASE + SZ_1K - 1,
  219. .flags = IORESOURCE_MEM,
  220. },
  221. {
  222. .name = "edma0",
  223. .start = IRQ_DA8XX_CCINT0,
  224. .flags = IORESOURCE_IRQ,
  225. },
  226. {
  227. .name = "edma0_err",
  228. .start = IRQ_DA8XX_CCERRINT,
  229. .flags = IORESOURCE_IRQ,
  230. },
  231. {
  232. .name = "edma1",
  233. .start = IRQ_DA850_CCINT1,
  234. .flags = IORESOURCE_IRQ,
  235. },
  236. {
  237. .name = "edma1_err",
  238. .start = IRQ_DA850_CCERRINT1,
  239. .flags = IORESOURCE_IRQ,
  240. },
  241. };
  242. static struct platform_device da830_edma_device = {
  243. .name = "edma",
  244. .id = -1,
  245. .dev = {
  246. .platform_data = da830_edma_info,
  247. },
  248. .num_resources = ARRAY_SIZE(da830_edma_resources),
  249. .resource = da830_edma_resources,
  250. };
  251. static struct platform_device da850_edma_device = {
  252. .name = "edma",
  253. .id = -1,
  254. .dev = {
  255. .platform_data = da850_edma_info,
  256. },
  257. .num_resources = ARRAY_SIZE(da850_edma_resources),
  258. .resource = da850_edma_resources,
  259. };
  260. int __init da830_register_edma(struct edma_rsv_info *rsv)
  261. {
  262. da830_edma_cc0_info.rsv = rsv;
  263. return platform_device_register(&da830_edma_device);
  264. }
  265. int __init da850_register_edma(struct edma_rsv_info *rsv[2])
  266. {
  267. if (rsv) {
  268. da850_edma_cc_info[0].rsv = rsv[0];
  269. da850_edma_cc_info[1].rsv = rsv[1];
  270. }
  271. return platform_device_register(&da850_edma_device);
  272. }
  273. static struct resource da8xx_i2c_resources0[] = {
  274. {
  275. .start = DA8XX_I2C0_BASE,
  276. .end = DA8XX_I2C0_BASE + SZ_4K - 1,
  277. .flags = IORESOURCE_MEM,
  278. },
  279. {
  280. .start = IRQ_DA8XX_I2CINT0,
  281. .end = IRQ_DA8XX_I2CINT0,
  282. .flags = IORESOURCE_IRQ,
  283. },
  284. };
  285. static struct platform_device da8xx_i2c_device0 = {
  286. .name = "i2c_davinci",
  287. .id = 1,
  288. .num_resources = ARRAY_SIZE(da8xx_i2c_resources0),
  289. .resource = da8xx_i2c_resources0,
  290. };
  291. static struct resource da8xx_i2c_resources1[] = {
  292. {
  293. .start = DA8XX_I2C1_BASE,
  294. .end = DA8XX_I2C1_BASE + SZ_4K - 1,
  295. .flags = IORESOURCE_MEM,
  296. },
  297. {
  298. .start = IRQ_DA8XX_I2CINT1,
  299. .end = IRQ_DA8XX_I2CINT1,
  300. .flags = IORESOURCE_IRQ,
  301. },
  302. };
  303. static struct platform_device da8xx_i2c_device1 = {
  304. .name = "i2c_davinci",
  305. .id = 2,
  306. .num_resources = ARRAY_SIZE(da8xx_i2c_resources1),
  307. .resource = da8xx_i2c_resources1,
  308. };
  309. int __init da8xx_register_i2c(int instance,
  310. struct davinci_i2c_platform_data *pdata)
  311. {
  312. struct platform_device *pdev;
  313. if (instance == 0)
  314. pdev = &da8xx_i2c_device0;
  315. else if (instance == 1)
  316. pdev = &da8xx_i2c_device1;
  317. else
  318. return -EINVAL;
  319. pdev->dev.platform_data = pdata;
  320. return platform_device_register(pdev);
  321. }
  322. static struct resource da8xx_watchdog_resources[] = {
  323. {
  324. .start = DA8XX_WDOG_BASE,
  325. .end = DA8XX_WDOG_BASE + SZ_4K - 1,
  326. .flags = IORESOURCE_MEM,
  327. },
  328. };
  329. static struct platform_device da8xx_wdt_device = {
  330. .name = "davinci-wdt",
  331. .id = -1,
  332. .num_resources = ARRAY_SIZE(da8xx_watchdog_resources),
  333. .resource = da8xx_watchdog_resources,
  334. };
  335. void da8xx_restart(enum reboot_mode mode, const char *cmd)
  336. {
  337. struct device *dev;
  338. dev = bus_find_device_by_name(&platform_bus_type, NULL, "davinci-wdt");
  339. if (!dev) {
  340. pr_err("%s: failed to find watchdog device\n", __func__);
  341. return;
  342. }
  343. davinci_watchdog_reset(to_platform_device(dev));
  344. }
  345. int __init da8xx_register_watchdog(void)
  346. {
  347. return platform_device_register(&da8xx_wdt_device);
  348. }
  349. static struct resource da8xx_emac_resources[] = {
  350. {
  351. .start = DA8XX_EMAC_CPPI_PORT_BASE,
  352. .end = DA8XX_EMAC_CPPI_PORT_BASE + SZ_16K - 1,
  353. .flags = IORESOURCE_MEM,
  354. },
  355. {
  356. .start = IRQ_DA8XX_C0_RX_THRESH_PULSE,
  357. .end = IRQ_DA8XX_C0_RX_THRESH_PULSE,
  358. .flags = IORESOURCE_IRQ,
  359. },
  360. {
  361. .start = IRQ_DA8XX_C0_RX_PULSE,
  362. .end = IRQ_DA8XX_C0_RX_PULSE,
  363. .flags = IORESOURCE_IRQ,
  364. },
  365. {
  366. .start = IRQ_DA8XX_C0_TX_PULSE,
  367. .end = IRQ_DA8XX_C0_TX_PULSE,
  368. .flags = IORESOURCE_IRQ,
  369. },
  370. {
  371. .start = IRQ_DA8XX_C0_MISC_PULSE,
  372. .end = IRQ_DA8XX_C0_MISC_PULSE,
  373. .flags = IORESOURCE_IRQ,
  374. },
  375. };
  376. struct emac_platform_data da8xx_emac_pdata = {
  377. .ctrl_reg_offset = DA8XX_EMAC_CTRL_REG_OFFSET,
  378. .ctrl_mod_reg_offset = DA8XX_EMAC_MOD_REG_OFFSET,
  379. .ctrl_ram_offset = DA8XX_EMAC_RAM_OFFSET,
  380. .ctrl_ram_size = DA8XX_EMAC_CTRL_RAM_SIZE,
  381. .version = EMAC_VERSION_2,
  382. };
  383. static struct platform_device da8xx_emac_device = {
  384. .name = "davinci_emac",
  385. .id = 1,
  386. .dev = {
  387. .platform_data = &da8xx_emac_pdata,
  388. },
  389. .num_resources = ARRAY_SIZE(da8xx_emac_resources),
  390. .resource = da8xx_emac_resources,
  391. };
  392. static struct resource da8xx_mdio_resources[] = {
  393. {
  394. .start = DA8XX_EMAC_MDIO_BASE,
  395. .end = DA8XX_EMAC_MDIO_BASE + SZ_4K - 1,
  396. .flags = IORESOURCE_MEM,
  397. },
  398. };
  399. static struct platform_device da8xx_mdio_device = {
  400. .name = "davinci_mdio",
  401. .id = 0,
  402. .num_resources = ARRAY_SIZE(da8xx_mdio_resources),
  403. .resource = da8xx_mdio_resources,
  404. };
  405. int __init da8xx_register_emac(void)
  406. {
  407. int ret;
  408. ret = platform_device_register(&da8xx_mdio_device);
  409. if (ret < 0)
  410. return ret;
  411. return platform_device_register(&da8xx_emac_device);
  412. }
  413. static struct resource da830_mcasp1_resources[] = {
  414. {
  415. .name = "mpu",
  416. .start = DAVINCI_DA830_MCASP1_REG_BASE,
  417. .end = DAVINCI_DA830_MCASP1_REG_BASE + (SZ_1K * 12) - 1,
  418. .flags = IORESOURCE_MEM,
  419. },
  420. /* TX event */
  421. {
  422. .start = DAVINCI_DA830_DMA_MCASP1_AXEVT,
  423. .end = DAVINCI_DA830_DMA_MCASP1_AXEVT,
  424. .flags = IORESOURCE_DMA,
  425. },
  426. /* RX event */
  427. {
  428. .start = DAVINCI_DA830_DMA_MCASP1_AREVT,
  429. .end = DAVINCI_DA830_DMA_MCASP1_AREVT,
  430. .flags = IORESOURCE_DMA,
  431. },
  432. };
  433. static struct platform_device da830_mcasp1_device = {
  434. .name = "davinci-mcasp",
  435. .id = 1,
  436. .num_resources = ARRAY_SIZE(da830_mcasp1_resources),
  437. .resource = da830_mcasp1_resources,
  438. };
  439. static struct resource da850_mcasp_resources[] = {
  440. {
  441. .name = "mpu",
  442. .start = DAVINCI_DA8XX_MCASP0_REG_BASE,
  443. .end = DAVINCI_DA8XX_MCASP0_REG_BASE + (SZ_1K * 12) - 1,
  444. .flags = IORESOURCE_MEM,
  445. },
  446. /* TX event */
  447. {
  448. .start = DAVINCI_DA8XX_DMA_MCASP0_AXEVT,
  449. .end = DAVINCI_DA8XX_DMA_MCASP0_AXEVT,
  450. .flags = IORESOURCE_DMA,
  451. },
  452. /* RX event */
  453. {
  454. .start = DAVINCI_DA8XX_DMA_MCASP0_AREVT,
  455. .end = DAVINCI_DA8XX_DMA_MCASP0_AREVT,
  456. .flags = IORESOURCE_DMA,
  457. },
  458. };
  459. static struct platform_device da850_mcasp_device = {
  460. .name = "davinci-mcasp",
  461. .id = 0,
  462. .num_resources = ARRAY_SIZE(da850_mcasp_resources),
  463. .resource = da850_mcasp_resources,
  464. };
  465. void __init da8xx_register_mcasp(int id, struct snd_platform_data *pdata)
  466. {
  467. /* DA830/OMAP-L137 has 3 instances of McASP */
  468. if (cpu_is_davinci_da830() && id == 1) {
  469. da830_mcasp1_device.dev.platform_data = pdata;
  470. platform_device_register(&da830_mcasp1_device);
  471. } else if (cpu_is_davinci_da850()) {
  472. da850_mcasp_device.dev.platform_data = pdata;
  473. platform_device_register(&da850_mcasp_device);
  474. }
  475. }
  476. static struct resource da8xx_pruss_resources[] = {
  477. {
  478. .start = DA8XX_PRUSS_MEM_BASE,
  479. .end = DA8XX_PRUSS_MEM_BASE + 0xFFFF,
  480. .flags = IORESOURCE_MEM,
  481. },
  482. {
  483. .start = IRQ_DA8XX_EVTOUT0,
  484. .end = IRQ_DA8XX_EVTOUT0,
  485. .flags = IORESOURCE_IRQ,
  486. },
  487. {
  488. .start = IRQ_DA8XX_EVTOUT1,
  489. .end = IRQ_DA8XX_EVTOUT1,
  490. .flags = IORESOURCE_IRQ,
  491. },
  492. {
  493. .start = IRQ_DA8XX_EVTOUT2,
  494. .end = IRQ_DA8XX_EVTOUT2,
  495. .flags = IORESOURCE_IRQ,
  496. },
  497. {
  498. .start = IRQ_DA8XX_EVTOUT3,
  499. .end = IRQ_DA8XX_EVTOUT3,
  500. .flags = IORESOURCE_IRQ,
  501. },
  502. {
  503. .start = IRQ_DA8XX_EVTOUT4,
  504. .end = IRQ_DA8XX_EVTOUT4,
  505. .flags = IORESOURCE_IRQ,
  506. },
  507. {
  508. .start = IRQ_DA8XX_EVTOUT5,
  509. .end = IRQ_DA8XX_EVTOUT5,
  510. .flags = IORESOURCE_IRQ,
  511. },
  512. {
  513. .start = IRQ_DA8XX_EVTOUT6,
  514. .end = IRQ_DA8XX_EVTOUT6,
  515. .flags = IORESOURCE_IRQ,
  516. },
  517. {
  518. .start = IRQ_DA8XX_EVTOUT7,
  519. .end = IRQ_DA8XX_EVTOUT7,
  520. .flags = IORESOURCE_IRQ,
  521. },
  522. };
  523. static struct uio_pruss_pdata da8xx_uio_pruss_pdata = {
  524. .pintc_base = 0x4000,
  525. };
  526. static struct platform_device da8xx_uio_pruss_dev = {
  527. .name = "pruss_uio",
  528. .id = -1,
  529. .num_resources = ARRAY_SIZE(da8xx_pruss_resources),
  530. .resource = da8xx_pruss_resources,
  531. .dev = {
  532. .coherent_dma_mask = DMA_BIT_MASK(32),
  533. .platform_data = &da8xx_uio_pruss_pdata,
  534. }
  535. };
  536. int __init da8xx_register_uio_pruss(void)
  537. {
  538. da8xx_uio_pruss_pdata.sram_pool = sram_get_gen_pool();
  539. return platform_device_register(&da8xx_uio_pruss_dev);
  540. }
  541. static struct lcd_ctrl_config lcd_cfg = {
  542. .panel_shade = COLOR_ACTIVE,
  543. .bpp = 16,
  544. };
  545. struct da8xx_lcdc_platform_data sharp_lcd035q3dg01_pdata = {
  546. .manu_name = "sharp",
  547. .controller_data = &lcd_cfg,
  548. .type = "Sharp_LCD035Q3DG01",
  549. };
  550. struct da8xx_lcdc_platform_data sharp_lk043t1dg01_pdata = {
  551. .manu_name = "sharp",
  552. .controller_data = &lcd_cfg,
  553. .type = "Sharp_LK043T1DG01",
  554. };
  555. static struct resource da8xx_lcdc_resources[] = {
  556. [0] = { /* registers */
  557. .start = DA8XX_LCD_CNTRL_BASE,
  558. .end = DA8XX_LCD_CNTRL_BASE + SZ_4K - 1,
  559. .flags = IORESOURCE_MEM,
  560. },
  561. [1] = { /* interrupt */
  562. .start = IRQ_DA8XX_LCDINT,
  563. .end = IRQ_DA8XX_LCDINT,
  564. .flags = IORESOURCE_IRQ,
  565. },
  566. };
  567. static struct platform_device da8xx_lcdc_device = {
  568. .name = "da8xx_lcdc",
  569. .id = 0,
  570. .num_resources = ARRAY_SIZE(da8xx_lcdc_resources),
  571. .resource = da8xx_lcdc_resources,
  572. };
  573. int __init da8xx_register_lcdc(struct da8xx_lcdc_platform_data *pdata)
  574. {
  575. da8xx_lcdc_device.dev.platform_data = pdata;
  576. return platform_device_register(&da8xx_lcdc_device);
  577. }
  578. static struct resource da8xx_gpio_resources[] = {
  579. { /* registers */
  580. .start = DA8XX_GPIO_BASE,
  581. .end = DA8XX_GPIO_BASE + SZ_4K - 1,
  582. .flags = IORESOURCE_MEM,
  583. },
  584. { /* interrupt */
  585. .start = IRQ_DA8XX_GPIO0,
  586. .end = IRQ_DA8XX_GPIO8,
  587. .flags = IORESOURCE_IRQ,
  588. },
  589. };
  590. static struct platform_device da8xx_gpio_device = {
  591. .name = "davinci_gpio",
  592. .id = -1,
  593. .num_resources = ARRAY_SIZE(da8xx_gpio_resources),
  594. .resource = da8xx_gpio_resources,
  595. };
  596. int __init da8xx_register_gpio(void *pdata)
  597. {
  598. da8xx_gpio_device.dev.platform_data = pdata;
  599. return platform_device_register(&da8xx_gpio_device);
  600. }
  601. static struct resource da8xx_mmcsd0_resources[] = {
  602. { /* registers */
  603. .start = DA8XX_MMCSD0_BASE,
  604. .end = DA8XX_MMCSD0_BASE + SZ_4K - 1,
  605. .flags = IORESOURCE_MEM,
  606. },
  607. { /* interrupt */
  608. .start = IRQ_DA8XX_MMCSDINT0,
  609. .end = IRQ_DA8XX_MMCSDINT0,
  610. .flags = IORESOURCE_IRQ,
  611. },
  612. { /* DMA RX */
  613. .start = DA8XX_DMA_MMCSD0_RX,
  614. .end = DA8XX_DMA_MMCSD0_RX,
  615. .flags = IORESOURCE_DMA,
  616. },
  617. { /* DMA TX */
  618. .start = DA8XX_DMA_MMCSD0_TX,
  619. .end = DA8XX_DMA_MMCSD0_TX,
  620. .flags = IORESOURCE_DMA,
  621. },
  622. };
  623. static struct platform_device da8xx_mmcsd0_device = {
  624. .name = "da830-mmc",
  625. .id = 0,
  626. .num_resources = ARRAY_SIZE(da8xx_mmcsd0_resources),
  627. .resource = da8xx_mmcsd0_resources,
  628. };
  629. int __init da8xx_register_mmcsd0(struct davinci_mmc_config *config)
  630. {
  631. da8xx_mmcsd0_device.dev.platform_data = config;
  632. return platform_device_register(&da8xx_mmcsd0_device);
  633. }
  634. #ifdef CONFIG_ARCH_DAVINCI_DA850
  635. static struct resource da850_mmcsd1_resources[] = {
  636. { /* registers */
  637. .start = DA850_MMCSD1_BASE,
  638. .end = DA850_MMCSD1_BASE + SZ_4K - 1,
  639. .flags = IORESOURCE_MEM,
  640. },
  641. { /* interrupt */
  642. .start = IRQ_DA850_MMCSDINT0_1,
  643. .end = IRQ_DA850_MMCSDINT0_1,
  644. .flags = IORESOURCE_IRQ,
  645. },
  646. { /* DMA RX */
  647. .start = DA850_DMA_MMCSD1_RX,
  648. .end = DA850_DMA_MMCSD1_RX,
  649. .flags = IORESOURCE_DMA,
  650. },
  651. { /* DMA TX */
  652. .start = DA850_DMA_MMCSD1_TX,
  653. .end = DA850_DMA_MMCSD1_TX,
  654. .flags = IORESOURCE_DMA,
  655. },
  656. };
  657. static struct platform_device da850_mmcsd1_device = {
  658. .name = "da830-mmc",
  659. .id = 1,
  660. .num_resources = ARRAY_SIZE(da850_mmcsd1_resources),
  661. .resource = da850_mmcsd1_resources,
  662. };
  663. int __init da850_register_mmcsd1(struct davinci_mmc_config *config)
  664. {
  665. da850_mmcsd1_device.dev.platform_data = config;
  666. return platform_device_register(&da850_mmcsd1_device);
  667. }
  668. #endif
  669. static struct resource da8xx_rproc_resources[] = {
  670. { /* DSP boot address */
  671. .start = DA8XX_SYSCFG0_BASE + DA8XX_HOST1CFG_REG,
  672. .end = DA8XX_SYSCFG0_BASE + DA8XX_HOST1CFG_REG + 3,
  673. .flags = IORESOURCE_MEM,
  674. },
  675. { /* DSP interrupt registers */
  676. .start = DA8XX_SYSCFG0_BASE + DA8XX_CHIPSIG_REG,
  677. .end = DA8XX_SYSCFG0_BASE + DA8XX_CHIPSIG_REG + 7,
  678. .flags = IORESOURCE_MEM,
  679. },
  680. { /* dsp irq */
  681. .start = IRQ_DA8XX_CHIPINT0,
  682. .end = IRQ_DA8XX_CHIPINT0,
  683. .flags = IORESOURCE_IRQ,
  684. },
  685. };
  686. static struct platform_device da8xx_dsp = {
  687. .name = "davinci-rproc",
  688. .dev = {
  689. .coherent_dma_mask = DMA_BIT_MASK(32),
  690. },
  691. .num_resources = ARRAY_SIZE(da8xx_rproc_resources),
  692. .resource = da8xx_rproc_resources,
  693. };
  694. #if IS_ENABLED(CONFIG_DA8XX_REMOTEPROC)
  695. static phys_addr_t rproc_base __initdata;
  696. static unsigned long rproc_size __initdata;
  697. static int __init early_rproc_mem(char *p)
  698. {
  699. char *endp;
  700. if (p == NULL)
  701. return 0;
  702. rproc_size = memparse(p, &endp);
  703. if (*endp == '@')
  704. rproc_base = memparse(endp + 1, NULL);
  705. return 0;
  706. }
  707. early_param("rproc_mem", early_rproc_mem);
  708. void __init da8xx_rproc_reserve_cma(void)
  709. {
  710. int ret;
  711. if (!rproc_base || !rproc_size) {
  712. pr_err("%s: 'rproc_mem=nn@address' badly specified\n"
  713. " 'nn' and 'address' must both be non-zero\n",
  714. __func__);
  715. return;
  716. }
  717. pr_info("%s: reserving 0x%lx @ 0x%lx...\n",
  718. __func__, rproc_size, (unsigned long)rproc_base);
  719. ret = dma_declare_contiguous(&da8xx_dsp.dev, rproc_size, rproc_base, 0);
  720. if (ret)
  721. pr_err("%s: dma_declare_contiguous failed %d\n", __func__, ret);
  722. }
  723. #else
  724. void __init da8xx_rproc_reserve_cma(void)
  725. {
  726. }
  727. #endif
  728. int __init da8xx_register_rproc(void)
  729. {
  730. int ret;
  731. ret = platform_device_register(&da8xx_dsp);
  732. if (ret)
  733. pr_err("%s: can't register DSP device: %d\n", __func__, ret);
  734. return ret;
  735. };
  736. static struct resource da8xx_rtc_resources[] = {
  737. {
  738. .start = DA8XX_RTC_BASE,
  739. .end = DA8XX_RTC_BASE + SZ_4K - 1,
  740. .flags = IORESOURCE_MEM,
  741. },
  742. { /* timer irq */
  743. .start = IRQ_DA8XX_RTC,
  744. .end = IRQ_DA8XX_RTC,
  745. .flags = IORESOURCE_IRQ,
  746. },
  747. { /* alarm irq */
  748. .start = IRQ_DA8XX_RTC,
  749. .end = IRQ_DA8XX_RTC,
  750. .flags = IORESOURCE_IRQ,
  751. },
  752. };
  753. static struct platform_device da8xx_rtc_device = {
  754. .name = "da830-rtc",
  755. .id = -1,
  756. .num_resources = ARRAY_SIZE(da8xx_rtc_resources),
  757. .resource = da8xx_rtc_resources,
  758. };
  759. int da8xx_register_rtc(void)
  760. {
  761. return platform_device_register(&da8xx_rtc_device);
  762. }
  763. static void __iomem *da8xx_ddr2_ctlr_base;
  764. void __iomem * __init da8xx_get_mem_ctlr(void)
  765. {
  766. if (da8xx_ddr2_ctlr_base)
  767. return da8xx_ddr2_ctlr_base;
  768. da8xx_ddr2_ctlr_base = ioremap(DA8XX_DDR2_CTL_BASE, SZ_32K);
  769. if (!da8xx_ddr2_ctlr_base)
  770. pr_warn("%s: Unable to map DDR2 controller", __func__);
  771. return da8xx_ddr2_ctlr_base;
  772. }
  773. static struct resource da8xx_cpuidle_resources[] = {
  774. {
  775. .start = DA8XX_DDR2_CTL_BASE,
  776. .end = DA8XX_DDR2_CTL_BASE + SZ_32K - 1,
  777. .flags = IORESOURCE_MEM,
  778. },
  779. };
  780. /* DA8XX devices support DDR2 power down */
  781. static struct davinci_cpuidle_config da8xx_cpuidle_pdata = {
  782. .ddr2_pdown = 1,
  783. };
  784. static struct platform_device da8xx_cpuidle_device = {
  785. .name = "cpuidle-davinci",
  786. .num_resources = ARRAY_SIZE(da8xx_cpuidle_resources),
  787. .resource = da8xx_cpuidle_resources,
  788. .dev = {
  789. .platform_data = &da8xx_cpuidle_pdata,
  790. },
  791. };
  792. int __init da8xx_register_cpuidle(void)
  793. {
  794. da8xx_cpuidle_pdata.ddr2_ctlr_base = da8xx_get_mem_ctlr();
  795. return platform_device_register(&da8xx_cpuidle_device);
  796. }
  797. static struct resource da8xx_spi0_resources[] = {
  798. [0] = {
  799. .start = DA8XX_SPI0_BASE,
  800. .end = DA8XX_SPI0_BASE + SZ_4K - 1,
  801. .flags = IORESOURCE_MEM,
  802. },
  803. [1] = {
  804. .start = IRQ_DA8XX_SPINT0,
  805. .end = IRQ_DA8XX_SPINT0,
  806. .flags = IORESOURCE_IRQ,
  807. },
  808. [2] = {
  809. .start = DA8XX_DMA_SPI0_RX,
  810. .end = DA8XX_DMA_SPI0_RX,
  811. .flags = IORESOURCE_DMA,
  812. },
  813. [3] = {
  814. .start = DA8XX_DMA_SPI0_TX,
  815. .end = DA8XX_DMA_SPI0_TX,
  816. .flags = IORESOURCE_DMA,
  817. },
  818. };
  819. static struct resource da8xx_spi1_resources[] = {
  820. [0] = {
  821. .start = DA830_SPI1_BASE,
  822. .end = DA830_SPI1_BASE + SZ_4K - 1,
  823. .flags = IORESOURCE_MEM,
  824. },
  825. [1] = {
  826. .start = IRQ_DA8XX_SPINT1,
  827. .end = IRQ_DA8XX_SPINT1,
  828. .flags = IORESOURCE_IRQ,
  829. },
  830. [2] = {
  831. .start = DA8XX_DMA_SPI1_RX,
  832. .end = DA8XX_DMA_SPI1_RX,
  833. .flags = IORESOURCE_DMA,
  834. },
  835. [3] = {
  836. .start = DA8XX_DMA_SPI1_TX,
  837. .end = DA8XX_DMA_SPI1_TX,
  838. .flags = IORESOURCE_DMA,
  839. },
  840. };
  841. static struct davinci_spi_platform_data da8xx_spi_pdata[] = {
  842. [0] = {
  843. .version = SPI_VERSION_2,
  844. .intr_line = 1,
  845. .dma_event_q = EVENTQ_0,
  846. },
  847. [1] = {
  848. .version = SPI_VERSION_2,
  849. .intr_line = 1,
  850. .dma_event_q = EVENTQ_0,
  851. },
  852. };
  853. static struct platform_device da8xx_spi_device[] = {
  854. [0] = {
  855. .name = "spi_davinci",
  856. .id = 0,
  857. .num_resources = ARRAY_SIZE(da8xx_spi0_resources),
  858. .resource = da8xx_spi0_resources,
  859. .dev = {
  860. .platform_data = &da8xx_spi_pdata[0],
  861. },
  862. },
  863. [1] = {
  864. .name = "spi_davinci",
  865. .id = 1,
  866. .num_resources = ARRAY_SIZE(da8xx_spi1_resources),
  867. .resource = da8xx_spi1_resources,
  868. .dev = {
  869. .platform_data = &da8xx_spi_pdata[1],
  870. },
  871. },
  872. };
  873. int __init da8xx_register_spi_bus(int instance, unsigned num_chipselect)
  874. {
  875. if (instance < 0 || instance > 1)
  876. return -EINVAL;
  877. da8xx_spi_pdata[instance].num_chipselect = num_chipselect;
  878. if (instance == 1 && cpu_is_davinci_da850()) {
  879. da8xx_spi1_resources[0].start = DA850_SPI1_BASE;
  880. da8xx_spi1_resources[0].end = DA850_SPI1_BASE + SZ_4K - 1;
  881. }
  882. return platform_device_register(&da8xx_spi_device[instance]);
  883. }
  884. #ifdef CONFIG_ARCH_DAVINCI_DA850
  885. static struct resource da850_sata_resources[] = {
  886. {
  887. .start = DA850_SATA_BASE,
  888. .end = DA850_SATA_BASE + 0x1fff,
  889. .flags = IORESOURCE_MEM,
  890. },
  891. {
  892. .start = DA8XX_SYSCFG1_BASE + DA8XX_PWRDN_REG,
  893. .end = DA8XX_SYSCFG1_BASE + DA8XX_PWRDN_REG + 0x3,
  894. .flags = IORESOURCE_MEM,
  895. },
  896. {
  897. .start = IRQ_DA850_SATAINT,
  898. .flags = IORESOURCE_IRQ,
  899. },
  900. };
  901. static u64 da850_sata_dmamask = DMA_BIT_MASK(32);
  902. static struct platform_device da850_sata_device = {
  903. .name = "ahci_da850",
  904. .id = -1,
  905. .dev = {
  906. .dma_mask = &da850_sata_dmamask,
  907. .coherent_dma_mask = DMA_BIT_MASK(32),
  908. },
  909. .num_resources = ARRAY_SIZE(da850_sata_resources),
  910. .resource = da850_sata_resources,
  911. };
  912. int __init da850_register_sata(unsigned long refclkpn)
  913. {
  914. /* please see comment in drivers/ata/ahci_da850.c */
  915. BUG_ON(refclkpn != 100 * 1000 * 1000);
  916. return platform_device_register(&da850_sata_device);
  917. }
  918. #endif