devices-da8xx.c 25 KB

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