devices-da8xx.c 27 KB

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