devices-da8xx.c 24 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100
  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_serial_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. .mapbase = DA8XX_UART1_BASE,
  75. .irq = IRQ_DA8XX_UARTINT1,
  76. .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
  77. UPF_IOREMAP,
  78. .iotype = UPIO_MEM,
  79. .regshift = 2,
  80. },
  81. {
  82. .mapbase = DA8XX_UART2_BASE,
  83. .irq = IRQ_DA8XX_UARTINT2,
  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. struct platform_device da8xx_serial_device = {
  94. .name = "serial8250",
  95. .id = PLAT8250_DEV_PLATFORM,
  96. .dev = {
  97. .platform_data = da8xx_serial_pdata,
  98. },
  99. };
  100. static s8 da8xx_queue_tc_mapping[][2] = {
  101. /* {event queue no, TC no} */
  102. {0, 0},
  103. {1, 1},
  104. {-1, -1}
  105. };
  106. static s8 da8xx_queue_priority_mapping[][2] = {
  107. /* {event queue no, Priority} */
  108. {0, 3},
  109. {1, 7},
  110. {-1, -1}
  111. };
  112. static s8 da850_queue_tc_mapping[][2] = {
  113. /* {event queue no, TC no} */
  114. {0, 0},
  115. {-1, -1}
  116. };
  117. static s8 da850_queue_priority_mapping[][2] = {
  118. /* {event queue no, Priority} */
  119. {0, 3},
  120. {-1, -1}
  121. };
  122. static struct edma_soc_info da830_edma_cc0_info = {
  123. .n_channel = 32,
  124. .n_region = 4,
  125. .n_slot = 128,
  126. .n_tc = 2,
  127. .n_cc = 1,
  128. .queue_tc_mapping = da8xx_queue_tc_mapping,
  129. .queue_priority_mapping = da8xx_queue_priority_mapping,
  130. .default_queue = EVENTQ_1,
  131. };
  132. static struct edma_soc_info *da830_edma_info[EDMA_MAX_CC] = {
  133. &da830_edma_cc0_info,
  134. };
  135. static struct edma_soc_info da850_edma_cc_info[] = {
  136. {
  137. .n_channel = 32,
  138. .n_region = 4,
  139. .n_slot = 128,
  140. .n_tc = 2,
  141. .n_cc = 1,
  142. .queue_tc_mapping = da8xx_queue_tc_mapping,
  143. .queue_priority_mapping = da8xx_queue_priority_mapping,
  144. .default_queue = EVENTQ_1,
  145. },
  146. {
  147. .n_channel = 32,
  148. .n_region = 4,
  149. .n_slot = 128,
  150. .n_tc = 1,
  151. .n_cc = 1,
  152. .queue_tc_mapping = da850_queue_tc_mapping,
  153. .queue_priority_mapping = da850_queue_priority_mapping,
  154. .default_queue = EVENTQ_0,
  155. },
  156. };
  157. static struct edma_soc_info *da850_edma_info[EDMA_MAX_CC] = {
  158. &da850_edma_cc_info[0],
  159. &da850_edma_cc_info[1],
  160. };
  161. static struct resource da830_edma_resources[] = {
  162. {
  163. .name = "edma_cc0",
  164. .start = DA8XX_TPCC_BASE,
  165. .end = DA8XX_TPCC_BASE + SZ_32K - 1,
  166. .flags = IORESOURCE_MEM,
  167. },
  168. {
  169. .name = "edma_tc0",
  170. .start = DA8XX_TPTC0_BASE,
  171. .end = DA8XX_TPTC0_BASE + SZ_1K - 1,
  172. .flags = IORESOURCE_MEM,
  173. },
  174. {
  175. .name = "edma_tc1",
  176. .start = DA8XX_TPTC1_BASE,
  177. .end = DA8XX_TPTC1_BASE + SZ_1K - 1,
  178. .flags = IORESOURCE_MEM,
  179. },
  180. {
  181. .name = "edma0",
  182. .start = IRQ_DA8XX_CCINT0,
  183. .flags = IORESOURCE_IRQ,
  184. },
  185. {
  186. .name = "edma0_err",
  187. .start = IRQ_DA8XX_CCERRINT,
  188. .flags = IORESOURCE_IRQ,
  189. },
  190. };
  191. static struct resource da850_edma_resources[] = {
  192. {
  193. .name = "edma_cc0",
  194. .start = DA8XX_TPCC_BASE,
  195. .end = DA8XX_TPCC_BASE + SZ_32K - 1,
  196. .flags = IORESOURCE_MEM,
  197. },
  198. {
  199. .name = "edma_tc0",
  200. .start = DA8XX_TPTC0_BASE,
  201. .end = DA8XX_TPTC0_BASE + SZ_1K - 1,
  202. .flags = IORESOURCE_MEM,
  203. },
  204. {
  205. .name = "edma_tc1",
  206. .start = DA8XX_TPTC1_BASE,
  207. .end = DA8XX_TPTC1_BASE + SZ_1K - 1,
  208. .flags = IORESOURCE_MEM,
  209. },
  210. {
  211. .name = "edma_cc1",
  212. .start = DA850_TPCC1_BASE,
  213. .end = DA850_TPCC1_BASE + SZ_32K - 1,
  214. .flags = IORESOURCE_MEM,
  215. },
  216. {
  217. .name = "edma_tc2",
  218. .start = DA850_TPTC2_BASE,
  219. .end = DA850_TPTC2_BASE + SZ_1K - 1,
  220. .flags = IORESOURCE_MEM,
  221. },
  222. {
  223. .name = "edma0",
  224. .start = IRQ_DA8XX_CCINT0,
  225. .flags = IORESOURCE_IRQ,
  226. },
  227. {
  228. .name = "edma0_err",
  229. .start = IRQ_DA8XX_CCERRINT,
  230. .flags = IORESOURCE_IRQ,
  231. },
  232. {
  233. .name = "edma1",
  234. .start = IRQ_DA850_CCINT1,
  235. .flags = IORESOURCE_IRQ,
  236. },
  237. {
  238. .name = "edma1_err",
  239. .start = IRQ_DA850_CCERRINT1,
  240. .flags = IORESOURCE_IRQ,
  241. },
  242. };
  243. static struct platform_device da830_edma_device = {
  244. .name = "edma",
  245. .id = -1,
  246. .dev = {
  247. .platform_data = da830_edma_info,
  248. },
  249. .num_resources = ARRAY_SIZE(da830_edma_resources),
  250. .resource = da830_edma_resources,
  251. };
  252. static struct platform_device da850_edma_device = {
  253. .name = "edma",
  254. .id = -1,
  255. .dev = {
  256. .platform_data = da850_edma_info,
  257. },
  258. .num_resources = ARRAY_SIZE(da850_edma_resources),
  259. .resource = da850_edma_resources,
  260. };
  261. int __init da830_register_edma(struct edma_rsv_info *rsv)
  262. {
  263. da830_edma_cc0_info.rsv = rsv;
  264. return platform_device_register(&da830_edma_device);
  265. }
  266. int __init da850_register_edma(struct edma_rsv_info *rsv[2])
  267. {
  268. if (rsv) {
  269. da850_edma_cc_info[0].rsv = rsv[0];
  270. da850_edma_cc_info[1].rsv = rsv[1];
  271. }
  272. return platform_device_register(&da850_edma_device);
  273. }
  274. static struct resource da8xx_i2c_resources0[] = {
  275. {
  276. .start = DA8XX_I2C0_BASE,
  277. .end = DA8XX_I2C0_BASE + SZ_4K - 1,
  278. .flags = IORESOURCE_MEM,
  279. },
  280. {
  281. .start = IRQ_DA8XX_I2CINT0,
  282. .end = IRQ_DA8XX_I2CINT0,
  283. .flags = IORESOURCE_IRQ,
  284. },
  285. };
  286. static struct platform_device da8xx_i2c_device0 = {
  287. .name = "i2c_davinci",
  288. .id = 1,
  289. .num_resources = ARRAY_SIZE(da8xx_i2c_resources0),
  290. .resource = da8xx_i2c_resources0,
  291. };
  292. static struct resource da8xx_i2c_resources1[] = {
  293. {
  294. .start = DA8XX_I2C1_BASE,
  295. .end = DA8XX_I2C1_BASE + SZ_4K - 1,
  296. .flags = IORESOURCE_MEM,
  297. },
  298. {
  299. .start = IRQ_DA8XX_I2CINT1,
  300. .end = IRQ_DA8XX_I2CINT1,
  301. .flags = IORESOURCE_IRQ,
  302. },
  303. };
  304. static struct platform_device da8xx_i2c_device1 = {
  305. .name = "i2c_davinci",
  306. .id = 2,
  307. .num_resources = ARRAY_SIZE(da8xx_i2c_resources1),
  308. .resource = da8xx_i2c_resources1,
  309. };
  310. int __init da8xx_register_i2c(int instance,
  311. struct davinci_i2c_platform_data *pdata)
  312. {
  313. struct platform_device *pdev;
  314. if (instance == 0)
  315. pdev = &da8xx_i2c_device0;
  316. else if (instance == 1)
  317. pdev = &da8xx_i2c_device1;
  318. else
  319. return -EINVAL;
  320. pdev->dev.platform_data = pdata;
  321. return platform_device_register(pdev);
  322. }
  323. static struct resource da8xx_watchdog_resources[] = {
  324. {
  325. .start = DA8XX_WDOG_BASE,
  326. .end = DA8XX_WDOG_BASE + SZ_4K - 1,
  327. .flags = IORESOURCE_MEM,
  328. },
  329. };
  330. static struct platform_device da8xx_wdt_device = {
  331. .name = "watchdog",
  332. .id = -1,
  333. .num_resources = ARRAY_SIZE(da8xx_watchdog_resources),
  334. .resource = da8xx_watchdog_resources,
  335. };
  336. void da8xx_restart(enum reboot_mode mode, const char *cmd)
  337. {
  338. struct device *dev;
  339. dev = bus_find_device_by_name(&platform_bus_type, NULL, "watchdog");
  340. if (!dev) {
  341. pr_err("%s: failed to find watchdog device\n", __func__);
  342. return;
  343. }
  344. davinci_watchdog_reset(to_platform_device(dev));
  345. }
  346. int __init da8xx_register_watchdog(void)
  347. {
  348. return platform_device_register(&da8xx_wdt_device);
  349. }
  350. static struct resource da8xx_emac_resources[] = {
  351. {
  352. .start = DA8XX_EMAC_CPPI_PORT_BASE,
  353. .end = DA8XX_EMAC_CPPI_PORT_BASE + SZ_16K - 1,
  354. .flags = IORESOURCE_MEM,
  355. },
  356. {
  357. .start = IRQ_DA8XX_C0_RX_THRESH_PULSE,
  358. .end = IRQ_DA8XX_C0_RX_THRESH_PULSE,
  359. .flags = IORESOURCE_IRQ,
  360. },
  361. {
  362. .start = IRQ_DA8XX_C0_RX_PULSE,
  363. .end = IRQ_DA8XX_C0_RX_PULSE,
  364. .flags = IORESOURCE_IRQ,
  365. },
  366. {
  367. .start = IRQ_DA8XX_C0_TX_PULSE,
  368. .end = IRQ_DA8XX_C0_TX_PULSE,
  369. .flags = IORESOURCE_IRQ,
  370. },
  371. {
  372. .start = IRQ_DA8XX_C0_MISC_PULSE,
  373. .end = IRQ_DA8XX_C0_MISC_PULSE,
  374. .flags = IORESOURCE_IRQ,
  375. },
  376. };
  377. struct emac_platform_data da8xx_emac_pdata = {
  378. .ctrl_reg_offset = DA8XX_EMAC_CTRL_REG_OFFSET,
  379. .ctrl_mod_reg_offset = DA8XX_EMAC_MOD_REG_OFFSET,
  380. .ctrl_ram_offset = DA8XX_EMAC_RAM_OFFSET,
  381. .ctrl_ram_size = DA8XX_EMAC_CTRL_RAM_SIZE,
  382. .version = EMAC_VERSION_2,
  383. };
  384. static struct platform_device da8xx_emac_device = {
  385. .name = "davinci_emac",
  386. .id = 1,
  387. .dev = {
  388. .platform_data = &da8xx_emac_pdata,
  389. },
  390. .num_resources = ARRAY_SIZE(da8xx_emac_resources),
  391. .resource = da8xx_emac_resources,
  392. };
  393. static struct resource da8xx_mdio_resources[] = {
  394. {
  395. .start = DA8XX_EMAC_MDIO_BASE,
  396. .end = DA8XX_EMAC_MDIO_BASE + SZ_4K - 1,
  397. .flags = IORESOURCE_MEM,
  398. },
  399. };
  400. static struct platform_device da8xx_mdio_device = {
  401. .name = "davinci_mdio",
  402. .id = 0,
  403. .num_resources = ARRAY_SIZE(da8xx_mdio_resources),
  404. .resource = da8xx_mdio_resources,
  405. };
  406. int __init da8xx_register_emac(void)
  407. {
  408. int ret;
  409. ret = platform_device_register(&da8xx_mdio_device);
  410. if (ret < 0)
  411. return ret;
  412. ret = platform_device_register(&da8xx_emac_device);
  413. if (ret < 0)
  414. return ret;
  415. ret = clk_add_alias(NULL, dev_name(&da8xx_mdio_device.dev),
  416. NULL, &da8xx_emac_device.dev);
  417. return ret;
  418. }
  419. static struct resource da830_mcasp1_resources[] = {
  420. {
  421. .name = "mcasp1",
  422. .start = DAVINCI_DA830_MCASP1_REG_BASE,
  423. .end = DAVINCI_DA830_MCASP1_REG_BASE + (SZ_1K * 12) - 1,
  424. .flags = IORESOURCE_MEM,
  425. },
  426. /* TX event */
  427. {
  428. .start = DAVINCI_DA830_DMA_MCASP1_AXEVT,
  429. .end = DAVINCI_DA830_DMA_MCASP1_AXEVT,
  430. .flags = IORESOURCE_DMA,
  431. },
  432. /* RX event */
  433. {
  434. .start = DAVINCI_DA830_DMA_MCASP1_AREVT,
  435. .end = DAVINCI_DA830_DMA_MCASP1_AREVT,
  436. .flags = IORESOURCE_DMA,
  437. },
  438. };
  439. static struct platform_device da830_mcasp1_device = {
  440. .name = "davinci-mcasp",
  441. .id = 1,
  442. .num_resources = ARRAY_SIZE(da830_mcasp1_resources),
  443. .resource = da830_mcasp1_resources,
  444. };
  445. static struct resource da850_mcasp_resources[] = {
  446. {
  447. .name = "mcasp",
  448. .start = DAVINCI_DA8XX_MCASP0_REG_BASE,
  449. .end = DAVINCI_DA8XX_MCASP0_REG_BASE + (SZ_1K * 12) - 1,
  450. .flags = IORESOURCE_MEM,
  451. },
  452. /* TX event */
  453. {
  454. .start = DAVINCI_DA8XX_DMA_MCASP0_AXEVT,
  455. .end = DAVINCI_DA8XX_DMA_MCASP0_AXEVT,
  456. .flags = IORESOURCE_DMA,
  457. },
  458. /* RX event */
  459. {
  460. .start = DAVINCI_DA8XX_DMA_MCASP0_AREVT,
  461. .end = DAVINCI_DA8XX_DMA_MCASP0_AREVT,
  462. .flags = IORESOURCE_DMA,
  463. },
  464. };
  465. static struct platform_device da850_mcasp_device = {
  466. .name = "davinci-mcasp",
  467. .id = 0,
  468. .num_resources = ARRAY_SIZE(da850_mcasp_resources),
  469. .resource = da850_mcasp_resources,
  470. };
  471. void __init da8xx_register_mcasp(int id, struct snd_platform_data *pdata)
  472. {
  473. /* DA830/OMAP-L137 has 3 instances of McASP */
  474. if (cpu_is_davinci_da830() && id == 1) {
  475. da830_mcasp1_device.dev.platform_data = pdata;
  476. platform_device_register(&da830_mcasp1_device);
  477. } else if (cpu_is_davinci_da850()) {
  478. da850_mcasp_device.dev.platform_data = pdata;
  479. platform_device_register(&da850_mcasp_device);
  480. }
  481. }
  482. static struct resource da8xx_pruss_resources[] = {
  483. {
  484. .start = DA8XX_PRUSS_MEM_BASE,
  485. .end = DA8XX_PRUSS_MEM_BASE + 0xFFFF,
  486. .flags = IORESOURCE_MEM,
  487. },
  488. {
  489. .start = IRQ_DA8XX_EVTOUT0,
  490. .end = IRQ_DA8XX_EVTOUT0,
  491. .flags = IORESOURCE_IRQ,
  492. },
  493. {
  494. .start = IRQ_DA8XX_EVTOUT1,
  495. .end = IRQ_DA8XX_EVTOUT1,
  496. .flags = IORESOURCE_IRQ,
  497. },
  498. {
  499. .start = IRQ_DA8XX_EVTOUT2,
  500. .end = IRQ_DA8XX_EVTOUT2,
  501. .flags = IORESOURCE_IRQ,
  502. },
  503. {
  504. .start = IRQ_DA8XX_EVTOUT3,
  505. .end = IRQ_DA8XX_EVTOUT3,
  506. .flags = IORESOURCE_IRQ,
  507. },
  508. {
  509. .start = IRQ_DA8XX_EVTOUT4,
  510. .end = IRQ_DA8XX_EVTOUT4,
  511. .flags = IORESOURCE_IRQ,
  512. },
  513. {
  514. .start = IRQ_DA8XX_EVTOUT5,
  515. .end = IRQ_DA8XX_EVTOUT5,
  516. .flags = IORESOURCE_IRQ,
  517. },
  518. {
  519. .start = IRQ_DA8XX_EVTOUT6,
  520. .end = IRQ_DA8XX_EVTOUT6,
  521. .flags = IORESOURCE_IRQ,
  522. },
  523. {
  524. .start = IRQ_DA8XX_EVTOUT7,
  525. .end = IRQ_DA8XX_EVTOUT7,
  526. .flags = IORESOURCE_IRQ,
  527. },
  528. };
  529. static struct uio_pruss_pdata da8xx_uio_pruss_pdata = {
  530. .pintc_base = 0x4000,
  531. };
  532. static struct platform_device da8xx_uio_pruss_dev = {
  533. .name = "pruss_uio",
  534. .id = -1,
  535. .num_resources = ARRAY_SIZE(da8xx_pruss_resources),
  536. .resource = da8xx_pruss_resources,
  537. .dev = {
  538. .coherent_dma_mask = DMA_BIT_MASK(32),
  539. .platform_data = &da8xx_uio_pruss_pdata,
  540. }
  541. };
  542. int __init da8xx_register_uio_pruss(void)
  543. {
  544. da8xx_uio_pruss_pdata.sram_pool = sram_get_gen_pool();
  545. return platform_device_register(&da8xx_uio_pruss_dev);
  546. }
  547. static struct lcd_ctrl_config lcd_cfg = {
  548. .panel_shade = COLOR_ACTIVE,
  549. .bpp = 16,
  550. };
  551. struct da8xx_lcdc_platform_data sharp_lcd035q3dg01_pdata = {
  552. .manu_name = "sharp",
  553. .controller_data = &lcd_cfg,
  554. .type = "Sharp_LCD035Q3DG01",
  555. };
  556. struct da8xx_lcdc_platform_data sharp_lk043t1dg01_pdata = {
  557. .manu_name = "sharp",
  558. .controller_data = &lcd_cfg,
  559. .type = "Sharp_LK043T1DG01",
  560. };
  561. static struct resource da8xx_lcdc_resources[] = {
  562. [0] = { /* registers */
  563. .start = DA8XX_LCD_CNTRL_BASE,
  564. .end = DA8XX_LCD_CNTRL_BASE + SZ_4K - 1,
  565. .flags = IORESOURCE_MEM,
  566. },
  567. [1] = { /* interrupt */
  568. .start = IRQ_DA8XX_LCDINT,
  569. .end = IRQ_DA8XX_LCDINT,
  570. .flags = IORESOURCE_IRQ,
  571. },
  572. };
  573. static struct platform_device da8xx_lcdc_device = {
  574. .name = "da8xx_lcdc",
  575. .id = 0,
  576. .num_resources = ARRAY_SIZE(da8xx_lcdc_resources),
  577. .resource = da8xx_lcdc_resources,
  578. };
  579. int __init da8xx_register_lcdc(struct da8xx_lcdc_platform_data *pdata)
  580. {
  581. da8xx_lcdc_device.dev.platform_data = pdata;
  582. return platform_device_register(&da8xx_lcdc_device);
  583. }
  584. static struct resource da8xx_mmcsd0_resources[] = {
  585. { /* registers */
  586. .start = DA8XX_MMCSD0_BASE,
  587. .end = DA8XX_MMCSD0_BASE + SZ_4K - 1,
  588. .flags = IORESOURCE_MEM,
  589. },
  590. { /* interrupt */
  591. .start = IRQ_DA8XX_MMCSDINT0,
  592. .end = IRQ_DA8XX_MMCSDINT0,
  593. .flags = IORESOURCE_IRQ,
  594. },
  595. { /* DMA RX */
  596. .start = DA8XX_DMA_MMCSD0_RX,
  597. .end = DA8XX_DMA_MMCSD0_RX,
  598. .flags = IORESOURCE_DMA,
  599. },
  600. { /* DMA TX */
  601. .start = DA8XX_DMA_MMCSD0_TX,
  602. .end = DA8XX_DMA_MMCSD0_TX,
  603. .flags = IORESOURCE_DMA,
  604. },
  605. };
  606. static struct platform_device da8xx_mmcsd0_device = {
  607. .name = "da830-mmc",
  608. .id = 0,
  609. .num_resources = ARRAY_SIZE(da8xx_mmcsd0_resources),
  610. .resource = da8xx_mmcsd0_resources,
  611. };
  612. int __init da8xx_register_mmcsd0(struct davinci_mmc_config *config)
  613. {
  614. da8xx_mmcsd0_device.dev.platform_data = config;
  615. return platform_device_register(&da8xx_mmcsd0_device);
  616. }
  617. #ifdef CONFIG_ARCH_DAVINCI_DA850
  618. static struct resource da850_mmcsd1_resources[] = {
  619. { /* registers */
  620. .start = DA850_MMCSD1_BASE,
  621. .end = DA850_MMCSD1_BASE + SZ_4K - 1,
  622. .flags = IORESOURCE_MEM,
  623. },
  624. { /* interrupt */
  625. .start = IRQ_DA850_MMCSDINT0_1,
  626. .end = IRQ_DA850_MMCSDINT0_1,
  627. .flags = IORESOURCE_IRQ,
  628. },
  629. { /* DMA RX */
  630. .start = DA850_DMA_MMCSD1_RX,
  631. .end = DA850_DMA_MMCSD1_RX,
  632. .flags = IORESOURCE_DMA,
  633. },
  634. { /* DMA TX */
  635. .start = DA850_DMA_MMCSD1_TX,
  636. .end = DA850_DMA_MMCSD1_TX,
  637. .flags = IORESOURCE_DMA,
  638. },
  639. };
  640. static struct platform_device da850_mmcsd1_device = {
  641. .name = "da830-mmc",
  642. .id = 1,
  643. .num_resources = ARRAY_SIZE(da850_mmcsd1_resources),
  644. .resource = da850_mmcsd1_resources,
  645. };
  646. int __init da850_register_mmcsd1(struct davinci_mmc_config *config)
  647. {
  648. da850_mmcsd1_device.dev.platform_data = config;
  649. return platform_device_register(&da850_mmcsd1_device);
  650. }
  651. #endif
  652. static struct resource da8xx_rproc_resources[] = {
  653. { /* DSP boot address */
  654. .start = DA8XX_SYSCFG0_BASE + DA8XX_HOST1CFG_REG,
  655. .end = DA8XX_SYSCFG0_BASE + DA8XX_HOST1CFG_REG + 3,
  656. .flags = IORESOURCE_MEM,
  657. },
  658. { /* DSP interrupt registers */
  659. .start = DA8XX_SYSCFG0_BASE + DA8XX_CHIPSIG_REG,
  660. .end = DA8XX_SYSCFG0_BASE + DA8XX_CHIPSIG_REG + 7,
  661. .flags = IORESOURCE_MEM,
  662. },
  663. { /* dsp irq */
  664. .start = IRQ_DA8XX_CHIPINT0,
  665. .end = IRQ_DA8XX_CHIPINT0,
  666. .flags = IORESOURCE_IRQ,
  667. },
  668. };
  669. static struct platform_device da8xx_dsp = {
  670. .name = "davinci-rproc",
  671. .dev = {
  672. .coherent_dma_mask = DMA_BIT_MASK(32),
  673. },
  674. .num_resources = ARRAY_SIZE(da8xx_rproc_resources),
  675. .resource = da8xx_rproc_resources,
  676. };
  677. #if IS_ENABLED(CONFIG_DA8XX_REMOTEPROC)
  678. static phys_addr_t rproc_base __initdata;
  679. static unsigned long rproc_size __initdata;
  680. static int __init early_rproc_mem(char *p)
  681. {
  682. char *endp;
  683. if (p == NULL)
  684. return 0;
  685. rproc_size = memparse(p, &endp);
  686. if (*endp == '@')
  687. rproc_base = memparse(endp + 1, NULL);
  688. return 0;
  689. }
  690. early_param("rproc_mem", early_rproc_mem);
  691. void __init da8xx_rproc_reserve_cma(void)
  692. {
  693. int ret;
  694. if (!rproc_base || !rproc_size) {
  695. pr_err("%s: 'rproc_mem=nn@address' badly specified\n"
  696. " 'nn' and 'address' must both be non-zero\n",
  697. __func__);
  698. return;
  699. }
  700. pr_info("%s: reserving 0x%lx @ 0x%lx...\n",
  701. __func__, rproc_size, (unsigned long)rproc_base);
  702. ret = dma_declare_contiguous(&da8xx_dsp.dev, rproc_size, rproc_base, 0);
  703. if (ret)
  704. pr_err("%s: dma_declare_contiguous failed %d\n", __func__, ret);
  705. }
  706. #else
  707. void __init da8xx_rproc_reserve_cma(void)
  708. {
  709. }
  710. #endif
  711. int __init da8xx_register_rproc(void)
  712. {
  713. int ret;
  714. ret = platform_device_register(&da8xx_dsp);
  715. if (ret)
  716. pr_err("%s: can't register DSP device: %d\n", __func__, ret);
  717. return ret;
  718. };
  719. static struct resource da8xx_rtc_resources[] = {
  720. {
  721. .start = DA8XX_RTC_BASE,
  722. .end = DA8XX_RTC_BASE + SZ_4K - 1,
  723. .flags = IORESOURCE_MEM,
  724. },
  725. { /* timer irq */
  726. .start = IRQ_DA8XX_RTC,
  727. .end = IRQ_DA8XX_RTC,
  728. .flags = IORESOURCE_IRQ,
  729. },
  730. { /* alarm irq */
  731. .start = IRQ_DA8XX_RTC,
  732. .end = IRQ_DA8XX_RTC,
  733. .flags = IORESOURCE_IRQ,
  734. },
  735. };
  736. static struct platform_device da8xx_rtc_device = {
  737. .name = "da830-rtc",
  738. .id = -1,
  739. .num_resources = ARRAY_SIZE(da8xx_rtc_resources),
  740. .resource = da8xx_rtc_resources,
  741. };
  742. int da8xx_register_rtc(void)
  743. {
  744. int ret;
  745. ret = platform_device_register(&da8xx_rtc_device);
  746. if (!ret)
  747. /* Atleast on DA850, RTC is a wakeup source */
  748. device_init_wakeup(&da8xx_rtc_device.dev, true);
  749. return ret;
  750. }
  751. static void __iomem *da8xx_ddr2_ctlr_base;
  752. void __iomem * __init da8xx_get_mem_ctlr(void)
  753. {
  754. if (da8xx_ddr2_ctlr_base)
  755. return da8xx_ddr2_ctlr_base;
  756. da8xx_ddr2_ctlr_base = ioremap(DA8XX_DDR2_CTL_BASE, SZ_32K);
  757. if (!da8xx_ddr2_ctlr_base)
  758. pr_warn("%s: Unable to map DDR2 controller", __func__);
  759. return da8xx_ddr2_ctlr_base;
  760. }
  761. static struct resource da8xx_cpuidle_resources[] = {
  762. {
  763. .start = DA8XX_DDR2_CTL_BASE,
  764. .end = DA8XX_DDR2_CTL_BASE + SZ_32K - 1,
  765. .flags = IORESOURCE_MEM,
  766. },
  767. };
  768. /* DA8XX devices support DDR2 power down */
  769. static struct davinci_cpuidle_config da8xx_cpuidle_pdata = {
  770. .ddr2_pdown = 1,
  771. };
  772. static struct platform_device da8xx_cpuidle_device = {
  773. .name = "cpuidle-davinci",
  774. .num_resources = ARRAY_SIZE(da8xx_cpuidle_resources),
  775. .resource = da8xx_cpuidle_resources,
  776. .dev = {
  777. .platform_data = &da8xx_cpuidle_pdata,
  778. },
  779. };
  780. int __init da8xx_register_cpuidle(void)
  781. {
  782. da8xx_cpuidle_pdata.ddr2_ctlr_base = da8xx_get_mem_ctlr();
  783. return platform_device_register(&da8xx_cpuidle_device);
  784. }
  785. static struct resource da8xx_spi0_resources[] = {
  786. [0] = {
  787. .start = DA8XX_SPI0_BASE,
  788. .end = DA8XX_SPI0_BASE + SZ_4K - 1,
  789. .flags = IORESOURCE_MEM,
  790. },
  791. [1] = {
  792. .start = IRQ_DA8XX_SPINT0,
  793. .end = IRQ_DA8XX_SPINT0,
  794. .flags = IORESOURCE_IRQ,
  795. },
  796. [2] = {
  797. .start = DA8XX_DMA_SPI0_RX,
  798. .end = DA8XX_DMA_SPI0_RX,
  799. .flags = IORESOURCE_DMA,
  800. },
  801. [3] = {
  802. .start = DA8XX_DMA_SPI0_TX,
  803. .end = DA8XX_DMA_SPI0_TX,
  804. .flags = IORESOURCE_DMA,
  805. },
  806. };
  807. static struct resource da8xx_spi1_resources[] = {
  808. [0] = {
  809. .start = DA830_SPI1_BASE,
  810. .end = DA830_SPI1_BASE + SZ_4K - 1,
  811. .flags = IORESOURCE_MEM,
  812. },
  813. [1] = {
  814. .start = IRQ_DA8XX_SPINT1,
  815. .end = IRQ_DA8XX_SPINT1,
  816. .flags = IORESOURCE_IRQ,
  817. },
  818. [2] = {
  819. .start = DA8XX_DMA_SPI1_RX,
  820. .end = DA8XX_DMA_SPI1_RX,
  821. .flags = IORESOURCE_DMA,
  822. },
  823. [3] = {
  824. .start = DA8XX_DMA_SPI1_TX,
  825. .end = DA8XX_DMA_SPI1_TX,
  826. .flags = IORESOURCE_DMA,
  827. },
  828. };
  829. static struct davinci_spi_platform_data da8xx_spi_pdata[] = {
  830. [0] = {
  831. .version = SPI_VERSION_2,
  832. .intr_line = 1,
  833. .dma_event_q = EVENTQ_0,
  834. },
  835. [1] = {
  836. .version = SPI_VERSION_2,
  837. .intr_line = 1,
  838. .dma_event_q = EVENTQ_0,
  839. },
  840. };
  841. static struct platform_device da8xx_spi_device[] = {
  842. [0] = {
  843. .name = "spi_davinci",
  844. .id = 0,
  845. .num_resources = ARRAY_SIZE(da8xx_spi0_resources),
  846. .resource = da8xx_spi0_resources,
  847. .dev = {
  848. .platform_data = &da8xx_spi_pdata[0],
  849. },
  850. },
  851. [1] = {
  852. .name = "spi_davinci",
  853. .id = 1,
  854. .num_resources = ARRAY_SIZE(da8xx_spi1_resources),
  855. .resource = da8xx_spi1_resources,
  856. .dev = {
  857. .platform_data = &da8xx_spi_pdata[1],
  858. },
  859. },
  860. };
  861. int __init da8xx_register_spi_bus(int instance, unsigned num_chipselect)
  862. {
  863. if (instance < 0 || instance > 1)
  864. return -EINVAL;
  865. da8xx_spi_pdata[instance].num_chipselect = num_chipselect;
  866. if (instance == 1 && cpu_is_davinci_da850()) {
  867. da8xx_spi1_resources[0].start = DA850_SPI1_BASE;
  868. da8xx_spi1_resources[0].end = DA850_SPI1_BASE + SZ_4K - 1;
  869. }
  870. return platform_device_register(&da8xx_spi_device[instance]);
  871. }
  872. #ifdef CONFIG_ARCH_DAVINCI_DA850
  873. static struct resource da850_sata_resources[] = {
  874. {
  875. .start = DA850_SATA_BASE,
  876. .end = DA850_SATA_BASE + 0x1fff,
  877. .flags = IORESOURCE_MEM,
  878. },
  879. {
  880. .start = IRQ_DA850_SATAINT,
  881. .flags = IORESOURCE_IRQ,
  882. },
  883. };
  884. /* SATA PHY Control Register offset from AHCI base */
  885. #define SATA_P0PHYCR_REG 0x178
  886. #define SATA_PHY_MPY(x) ((x) << 0)
  887. #define SATA_PHY_LOS(x) ((x) << 6)
  888. #define SATA_PHY_RXCDR(x) ((x) << 10)
  889. #define SATA_PHY_RXEQ(x) ((x) << 13)
  890. #define SATA_PHY_TXSWING(x) ((x) << 19)
  891. #define SATA_PHY_ENPLL(x) ((x) << 31)
  892. static struct clk *da850_sata_clk;
  893. static unsigned long da850_sata_refclkpn;
  894. /* Supported DA850 SATA crystal frequencies */
  895. #define KHZ_TO_HZ(freq) ((freq) * 1000)
  896. static unsigned long da850_sata_xtal[] = {
  897. KHZ_TO_HZ(300000),
  898. KHZ_TO_HZ(250000),
  899. 0, /* Reserved */
  900. KHZ_TO_HZ(187500),
  901. KHZ_TO_HZ(150000),
  902. KHZ_TO_HZ(125000),
  903. KHZ_TO_HZ(120000),
  904. KHZ_TO_HZ(100000),
  905. KHZ_TO_HZ(75000),
  906. KHZ_TO_HZ(60000),
  907. };
  908. static int da850_sata_init(struct device *dev, void __iomem *addr)
  909. {
  910. int i, ret;
  911. unsigned int val;
  912. da850_sata_clk = clk_get(dev, NULL);
  913. if (IS_ERR(da850_sata_clk))
  914. return PTR_ERR(da850_sata_clk);
  915. ret = clk_prepare_enable(da850_sata_clk);
  916. if (ret)
  917. goto err0;
  918. /* Enable SATA clock receiver */
  919. val = __raw_readl(DA8XX_SYSCFG1_VIRT(DA8XX_PWRDN_REG));
  920. val &= ~BIT(0);
  921. __raw_writel(val, DA8XX_SYSCFG1_VIRT(DA8XX_PWRDN_REG));
  922. /* Get the multiplier needed for 1.5GHz PLL output */
  923. for (i = 0; i < ARRAY_SIZE(da850_sata_xtal); i++)
  924. if (da850_sata_xtal[i] == da850_sata_refclkpn)
  925. break;
  926. if (i == ARRAY_SIZE(da850_sata_xtal)) {
  927. ret = -EINVAL;
  928. goto err1;
  929. }
  930. val = SATA_PHY_MPY(i + 1) |
  931. SATA_PHY_LOS(1) |
  932. SATA_PHY_RXCDR(4) |
  933. SATA_PHY_RXEQ(1) |
  934. SATA_PHY_TXSWING(3) |
  935. SATA_PHY_ENPLL(1);
  936. __raw_writel(val, addr + SATA_P0PHYCR_REG);
  937. return 0;
  938. err1:
  939. clk_disable_unprepare(da850_sata_clk);
  940. err0:
  941. clk_put(da850_sata_clk);
  942. return ret;
  943. }
  944. static void da850_sata_exit(struct device *dev)
  945. {
  946. clk_disable_unprepare(da850_sata_clk);
  947. clk_put(da850_sata_clk);
  948. }
  949. static struct ahci_platform_data da850_sata_pdata = {
  950. .init = da850_sata_init,
  951. .exit = da850_sata_exit,
  952. };
  953. static u64 da850_sata_dmamask = DMA_BIT_MASK(32);
  954. static struct platform_device da850_sata_device = {
  955. .name = "ahci",
  956. .id = -1,
  957. .dev = {
  958. .platform_data = &da850_sata_pdata,
  959. .dma_mask = &da850_sata_dmamask,
  960. .coherent_dma_mask = DMA_BIT_MASK(32),
  961. },
  962. .num_resources = ARRAY_SIZE(da850_sata_resources),
  963. .resource = da850_sata_resources,
  964. };
  965. int __init da850_register_sata(unsigned long refclkpn)
  966. {
  967. da850_sata_refclkpn = refclkpn;
  968. if (!da850_sata_refclkpn)
  969. return -EINVAL;
  970. return platform_device_register(&da850_sata_device);
  971. }
  972. #endif