devices-da8xx.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117
  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. return platform_device_register(&da8xx_emac_device);
  441. }
  442. static struct resource da830_mcasp1_resources[] = {
  443. {
  444. .name = "mcasp1",
  445. .start = DAVINCI_DA830_MCASP1_REG_BASE,
  446. .end = DAVINCI_DA830_MCASP1_REG_BASE + (SZ_1K * 12) - 1,
  447. .flags = IORESOURCE_MEM,
  448. },
  449. /* TX event */
  450. {
  451. .start = DAVINCI_DA830_DMA_MCASP1_AXEVT,
  452. .end = DAVINCI_DA830_DMA_MCASP1_AXEVT,
  453. .flags = IORESOURCE_DMA,
  454. },
  455. /* RX event */
  456. {
  457. .start = DAVINCI_DA830_DMA_MCASP1_AREVT,
  458. .end = DAVINCI_DA830_DMA_MCASP1_AREVT,
  459. .flags = IORESOURCE_DMA,
  460. },
  461. };
  462. static struct platform_device da830_mcasp1_device = {
  463. .name = "davinci-mcasp",
  464. .id = 1,
  465. .num_resources = ARRAY_SIZE(da830_mcasp1_resources),
  466. .resource = da830_mcasp1_resources,
  467. };
  468. static struct resource da850_mcasp_resources[] = {
  469. {
  470. .name = "mcasp",
  471. .start = DAVINCI_DA8XX_MCASP0_REG_BASE,
  472. .end = DAVINCI_DA8XX_MCASP0_REG_BASE + (SZ_1K * 12) - 1,
  473. .flags = IORESOURCE_MEM,
  474. },
  475. /* TX event */
  476. {
  477. .start = DAVINCI_DA8XX_DMA_MCASP0_AXEVT,
  478. .end = DAVINCI_DA8XX_DMA_MCASP0_AXEVT,
  479. .flags = IORESOURCE_DMA,
  480. },
  481. /* RX event */
  482. {
  483. .start = DAVINCI_DA8XX_DMA_MCASP0_AREVT,
  484. .end = DAVINCI_DA8XX_DMA_MCASP0_AREVT,
  485. .flags = IORESOURCE_DMA,
  486. },
  487. };
  488. static struct platform_device da850_mcasp_device = {
  489. .name = "davinci-mcasp",
  490. .id = 0,
  491. .num_resources = ARRAY_SIZE(da850_mcasp_resources),
  492. .resource = da850_mcasp_resources,
  493. };
  494. void __init da8xx_register_mcasp(int id, struct snd_platform_data *pdata)
  495. {
  496. /* DA830/OMAP-L137 has 3 instances of McASP */
  497. if (cpu_is_davinci_da830() && id == 1) {
  498. da830_mcasp1_device.dev.platform_data = pdata;
  499. platform_device_register(&da830_mcasp1_device);
  500. } else if (cpu_is_davinci_da850()) {
  501. da850_mcasp_device.dev.platform_data = pdata;
  502. platform_device_register(&da850_mcasp_device);
  503. }
  504. }
  505. static struct resource da8xx_pruss_resources[] = {
  506. {
  507. .start = DA8XX_PRUSS_MEM_BASE,
  508. .end = DA8XX_PRUSS_MEM_BASE + 0xFFFF,
  509. .flags = IORESOURCE_MEM,
  510. },
  511. {
  512. .start = IRQ_DA8XX_EVTOUT0,
  513. .end = IRQ_DA8XX_EVTOUT0,
  514. .flags = IORESOURCE_IRQ,
  515. },
  516. {
  517. .start = IRQ_DA8XX_EVTOUT1,
  518. .end = IRQ_DA8XX_EVTOUT1,
  519. .flags = IORESOURCE_IRQ,
  520. },
  521. {
  522. .start = IRQ_DA8XX_EVTOUT2,
  523. .end = IRQ_DA8XX_EVTOUT2,
  524. .flags = IORESOURCE_IRQ,
  525. },
  526. {
  527. .start = IRQ_DA8XX_EVTOUT3,
  528. .end = IRQ_DA8XX_EVTOUT3,
  529. .flags = IORESOURCE_IRQ,
  530. },
  531. {
  532. .start = IRQ_DA8XX_EVTOUT4,
  533. .end = IRQ_DA8XX_EVTOUT4,
  534. .flags = IORESOURCE_IRQ,
  535. },
  536. {
  537. .start = IRQ_DA8XX_EVTOUT5,
  538. .end = IRQ_DA8XX_EVTOUT5,
  539. .flags = IORESOURCE_IRQ,
  540. },
  541. {
  542. .start = IRQ_DA8XX_EVTOUT6,
  543. .end = IRQ_DA8XX_EVTOUT6,
  544. .flags = IORESOURCE_IRQ,
  545. },
  546. {
  547. .start = IRQ_DA8XX_EVTOUT7,
  548. .end = IRQ_DA8XX_EVTOUT7,
  549. .flags = IORESOURCE_IRQ,
  550. },
  551. };
  552. static struct uio_pruss_pdata da8xx_uio_pruss_pdata = {
  553. .pintc_base = 0x4000,
  554. };
  555. static struct platform_device da8xx_uio_pruss_dev = {
  556. .name = "pruss_uio",
  557. .id = -1,
  558. .num_resources = ARRAY_SIZE(da8xx_pruss_resources),
  559. .resource = da8xx_pruss_resources,
  560. .dev = {
  561. .coherent_dma_mask = DMA_BIT_MASK(32),
  562. .platform_data = &da8xx_uio_pruss_pdata,
  563. }
  564. };
  565. int __init da8xx_register_uio_pruss(void)
  566. {
  567. da8xx_uio_pruss_pdata.sram_pool = sram_get_gen_pool();
  568. return platform_device_register(&da8xx_uio_pruss_dev);
  569. }
  570. static struct lcd_ctrl_config lcd_cfg = {
  571. .panel_shade = COLOR_ACTIVE,
  572. .bpp = 16,
  573. };
  574. struct da8xx_lcdc_platform_data sharp_lcd035q3dg01_pdata = {
  575. .manu_name = "sharp",
  576. .controller_data = &lcd_cfg,
  577. .type = "Sharp_LCD035Q3DG01",
  578. };
  579. struct da8xx_lcdc_platform_data sharp_lk043t1dg01_pdata = {
  580. .manu_name = "sharp",
  581. .controller_data = &lcd_cfg,
  582. .type = "Sharp_LK043T1DG01",
  583. };
  584. static struct resource da8xx_lcdc_resources[] = {
  585. [0] = { /* registers */
  586. .start = DA8XX_LCD_CNTRL_BASE,
  587. .end = DA8XX_LCD_CNTRL_BASE + SZ_4K - 1,
  588. .flags = IORESOURCE_MEM,
  589. },
  590. [1] = { /* interrupt */
  591. .start = IRQ_DA8XX_LCDINT,
  592. .end = IRQ_DA8XX_LCDINT,
  593. .flags = IORESOURCE_IRQ,
  594. },
  595. };
  596. static struct platform_device da8xx_lcdc_device = {
  597. .name = "da8xx_lcdc",
  598. .id = 0,
  599. .num_resources = ARRAY_SIZE(da8xx_lcdc_resources),
  600. .resource = da8xx_lcdc_resources,
  601. };
  602. int __init da8xx_register_lcdc(struct da8xx_lcdc_platform_data *pdata)
  603. {
  604. da8xx_lcdc_device.dev.platform_data = pdata;
  605. return platform_device_register(&da8xx_lcdc_device);
  606. }
  607. static struct resource da8xx_mmcsd0_resources[] = {
  608. { /* registers */
  609. .start = DA8XX_MMCSD0_BASE,
  610. .end = DA8XX_MMCSD0_BASE + SZ_4K - 1,
  611. .flags = IORESOURCE_MEM,
  612. },
  613. { /* interrupt */
  614. .start = IRQ_DA8XX_MMCSDINT0,
  615. .end = IRQ_DA8XX_MMCSDINT0,
  616. .flags = IORESOURCE_IRQ,
  617. },
  618. { /* DMA RX */
  619. .start = DA8XX_DMA_MMCSD0_RX,
  620. .end = DA8XX_DMA_MMCSD0_RX,
  621. .flags = IORESOURCE_DMA,
  622. },
  623. { /* DMA TX */
  624. .start = DA8XX_DMA_MMCSD0_TX,
  625. .end = DA8XX_DMA_MMCSD0_TX,
  626. .flags = IORESOURCE_DMA,
  627. },
  628. };
  629. static struct platform_device da8xx_mmcsd0_device = {
  630. .name = "da830-mmc",
  631. .id = 0,
  632. .num_resources = ARRAY_SIZE(da8xx_mmcsd0_resources),
  633. .resource = da8xx_mmcsd0_resources,
  634. };
  635. int __init da8xx_register_mmcsd0(struct davinci_mmc_config *config)
  636. {
  637. da8xx_mmcsd0_device.dev.platform_data = config;
  638. return platform_device_register(&da8xx_mmcsd0_device);
  639. }
  640. #ifdef CONFIG_ARCH_DAVINCI_DA850
  641. static struct resource da850_mmcsd1_resources[] = {
  642. { /* registers */
  643. .start = DA850_MMCSD1_BASE,
  644. .end = DA850_MMCSD1_BASE + SZ_4K - 1,
  645. .flags = IORESOURCE_MEM,
  646. },
  647. { /* interrupt */
  648. .start = IRQ_DA850_MMCSDINT0_1,
  649. .end = IRQ_DA850_MMCSDINT0_1,
  650. .flags = IORESOURCE_IRQ,
  651. },
  652. { /* DMA RX */
  653. .start = DA850_DMA_MMCSD1_RX,
  654. .end = DA850_DMA_MMCSD1_RX,
  655. .flags = IORESOURCE_DMA,
  656. },
  657. { /* DMA TX */
  658. .start = DA850_DMA_MMCSD1_TX,
  659. .end = DA850_DMA_MMCSD1_TX,
  660. .flags = IORESOURCE_DMA,
  661. },
  662. };
  663. static struct platform_device da850_mmcsd1_device = {
  664. .name = "da830-mmc",
  665. .id = 1,
  666. .num_resources = ARRAY_SIZE(da850_mmcsd1_resources),
  667. .resource = da850_mmcsd1_resources,
  668. };
  669. int __init da850_register_mmcsd1(struct davinci_mmc_config *config)
  670. {
  671. da850_mmcsd1_device.dev.platform_data = config;
  672. return platform_device_register(&da850_mmcsd1_device);
  673. }
  674. #endif
  675. static struct resource da8xx_rproc_resources[] = {
  676. { /* DSP boot address */
  677. .start = DA8XX_SYSCFG0_BASE + DA8XX_HOST1CFG_REG,
  678. .end = DA8XX_SYSCFG0_BASE + DA8XX_HOST1CFG_REG + 3,
  679. .flags = IORESOURCE_MEM,
  680. },
  681. { /* DSP interrupt registers */
  682. .start = DA8XX_SYSCFG0_BASE + DA8XX_CHIPSIG_REG,
  683. .end = DA8XX_SYSCFG0_BASE + DA8XX_CHIPSIG_REG + 7,
  684. .flags = IORESOURCE_MEM,
  685. },
  686. { /* dsp irq */
  687. .start = IRQ_DA8XX_CHIPINT0,
  688. .end = IRQ_DA8XX_CHIPINT0,
  689. .flags = IORESOURCE_IRQ,
  690. },
  691. };
  692. static struct platform_device da8xx_dsp = {
  693. .name = "davinci-rproc",
  694. .dev = {
  695. .coherent_dma_mask = DMA_BIT_MASK(32),
  696. },
  697. .num_resources = ARRAY_SIZE(da8xx_rproc_resources),
  698. .resource = da8xx_rproc_resources,
  699. };
  700. #if IS_ENABLED(CONFIG_DA8XX_REMOTEPROC)
  701. static phys_addr_t rproc_base __initdata;
  702. static unsigned long rproc_size __initdata;
  703. static int __init early_rproc_mem(char *p)
  704. {
  705. char *endp;
  706. if (p == NULL)
  707. return 0;
  708. rproc_size = memparse(p, &endp);
  709. if (*endp == '@')
  710. rproc_base = memparse(endp + 1, NULL);
  711. return 0;
  712. }
  713. early_param("rproc_mem", early_rproc_mem);
  714. void __init da8xx_rproc_reserve_cma(void)
  715. {
  716. int ret;
  717. if (!rproc_base || !rproc_size) {
  718. pr_err("%s: 'rproc_mem=nn@address' badly specified\n"
  719. " 'nn' and 'address' must both be non-zero\n",
  720. __func__);
  721. return;
  722. }
  723. pr_info("%s: reserving 0x%lx @ 0x%lx...\n",
  724. __func__, rproc_size, (unsigned long)rproc_base);
  725. ret = dma_declare_contiguous(&da8xx_dsp.dev, rproc_size, rproc_base, 0);
  726. if (ret)
  727. pr_err("%s: dma_declare_contiguous failed %d\n", __func__, ret);
  728. }
  729. #else
  730. void __init da8xx_rproc_reserve_cma(void)
  731. {
  732. }
  733. #endif
  734. int __init da8xx_register_rproc(void)
  735. {
  736. int ret;
  737. ret = platform_device_register(&da8xx_dsp);
  738. if (ret)
  739. pr_err("%s: can't register DSP device: %d\n", __func__, ret);
  740. return ret;
  741. };
  742. static struct resource da8xx_rtc_resources[] = {
  743. {
  744. .start = DA8XX_RTC_BASE,
  745. .end = DA8XX_RTC_BASE + SZ_4K - 1,
  746. .flags = IORESOURCE_MEM,
  747. },
  748. { /* timer irq */
  749. .start = IRQ_DA8XX_RTC,
  750. .end = IRQ_DA8XX_RTC,
  751. .flags = IORESOURCE_IRQ,
  752. },
  753. { /* alarm irq */
  754. .start = IRQ_DA8XX_RTC,
  755. .end = IRQ_DA8XX_RTC,
  756. .flags = IORESOURCE_IRQ,
  757. },
  758. };
  759. static struct platform_device da8xx_rtc_device = {
  760. .name = "da830-rtc",
  761. .id = -1,
  762. .num_resources = ARRAY_SIZE(da8xx_rtc_resources),
  763. .resource = da8xx_rtc_resources,
  764. };
  765. int da8xx_register_rtc(void)
  766. {
  767. return platform_device_register(&da8xx_rtc_device);
  768. }
  769. static void __iomem *da8xx_ddr2_ctlr_base;
  770. void __iomem * __init da8xx_get_mem_ctlr(void)
  771. {
  772. if (da8xx_ddr2_ctlr_base)
  773. return da8xx_ddr2_ctlr_base;
  774. da8xx_ddr2_ctlr_base = ioremap(DA8XX_DDR2_CTL_BASE, SZ_32K);
  775. if (!da8xx_ddr2_ctlr_base)
  776. pr_warn("%s: Unable to map DDR2 controller", __func__);
  777. return da8xx_ddr2_ctlr_base;
  778. }
  779. static struct resource da8xx_cpuidle_resources[] = {
  780. {
  781. .start = DA8XX_DDR2_CTL_BASE,
  782. .end = DA8XX_DDR2_CTL_BASE + SZ_32K - 1,
  783. .flags = IORESOURCE_MEM,
  784. },
  785. };
  786. /* DA8XX devices support DDR2 power down */
  787. static struct davinci_cpuidle_config da8xx_cpuidle_pdata = {
  788. .ddr2_pdown = 1,
  789. };
  790. static struct platform_device da8xx_cpuidle_device = {
  791. .name = "cpuidle-davinci",
  792. .num_resources = ARRAY_SIZE(da8xx_cpuidle_resources),
  793. .resource = da8xx_cpuidle_resources,
  794. .dev = {
  795. .platform_data = &da8xx_cpuidle_pdata,
  796. },
  797. };
  798. int __init da8xx_register_cpuidle(void)
  799. {
  800. da8xx_cpuidle_pdata.ddr2_ctlr_base = da8xx_get_mem_ctlr();
  801. return platform_device_register(&da8xx_cpuidle_device);
  802. }
  803. static struct resource da8xx_spi0_resources[] = {
  804. [0] = {
  805. .start = DA8XX_SPI0_BASE,
  806. .end = DA8XX_SPI0_BASE + SZ_4K - 1,
  807. .flags = IORESOURCE_MEM,
  808. },
  809. [1] = {
  810. .start = IRQ_DA8XX_SPINT0,
  811. .end = IRQ_DA8XX_SPINT0,
  812. .flags = IORESOURCE_IRQ,
  813. },
  814. [2] = {
  815. .start = DA8XX_DMA_SPI0_RX,
  816. .end = DA8XX_DMA_SPI0_RX,
  817. .flags = IORESOURCE_DMA,
  818. },
  819. [3] = {
  820. .start = DA8XX_DMA_SPI0_TX,
  821. .end = DA8XX_DMA_SPI0_TX,
  822. .flags = IORESOURCE_DMA,
  823. },
  824. };
  825. static struct resource da8xx_spi1_resources[] = {
  826. [0] = {
  827. .start = DA830_SPI1_BASE,
  828. .end = DA830_SPI1_BASE + SZ_4K - 1,
  829. .flags = IORESOURCE_MEM,
  830. },
  831. [1] = {
  832. .start = IRQ_DA8XX_SPINT1,
  833. .end = IRQ_DA8XX_SPINT1,
  834. .flags = IORESOURCE_IRQ,
  835. },
  836. [2] = {
  837. .start = DA8XX_DMA_SPI1_RX,
  838. .end = DA8XX_DMA_SPI1_RX,
  839. .flags = IORESOURCE_DMA,
  840. },
  841. [3] = {
  842. .start = DA8XX_DMA_SPI1_TX,
  843. .end = DA8XX_DMA_SPI1_TX,
  844. .flags = IORESOURCE_DMA,
  845. },
  846. };
  847. static struct davinci_spi_platform_data da8xx_spi_pdata[] = {
  848. [0] = {
  849. .version = SPI_VERSION_2,
  850. .intr_line = 1,
  851. .dma_event_q = EVENTQ_0,
  852. },
  853. [1] = {
  854. .version = SPI_VERSION_2,
  855. .intr_line = 1,
  856. .dma_event_q = EVENTQ_0,
  857. },
  858. };
  859. static struct platform_device da8xx_spi_device[] = {
  860. [0] = {
  861. .name = "spi_davinci",
  862. .id = 0,
  863. .num_resources = ARRAY_SIZE(da8xx_spi0_resources),
  864. .resource = da8xx_spi0_resources,
  865. .dev = {
  866. .platform_data = &da8xx_spi_pdata[0],
  867. },
  868. },
  869. [1] = {
  870. .name = "spi_davinci",
  871. .id = 1,
  872. .num_resources = ARRAY_SIZE(da8xx_spi1_resources),
  873. .resource = da8xx_spi1_resources,
  874. .dev = {
  875. .platform_data = &da8xx_spi_pdata[1],
  876. },
  877. },
  878. };
  879. int __init da8xx_register_spi_bus(int instance, unsigned num_chipselect)
  880. {
  881. if (instance < 0 || instance > 1)
  882. return -EINVAL;
  883. da8xx_spi_pdata[instance].num_chipselect = num_chipselect;
  884. if (instance == 1 && cpu_is_davinci_da850()) {
  885. da8xx_spi1_resources[0].start = DA850_SPI1_BASE;
  886. da8xx_spi1_resources[0].end = DA850_SPI1_BASE + SZ_4K - 1;
  887. }
  888. return platform_device_register(&da8xx_spi_device[instance]);
  889. }
  890. #ifdef CONFIG_ARCH_DAVINCI_DA850
  891. static struct resource da850_sata_resources[] = {
  892. {
  893. .start = DA850_SATA_BASE,
  894. .end = DA850_SATA_BASE + 0x1fff,
  895. .flags = IORESOURCE_MEM,
  896. },
  897. {
  898. .start = IRQ_DA850_SATAINT,
  899. .flags = IORESOURCE_IRQ,
  900. },
  901. };
  902. /* SATA PHY Control Register offset from AHCI base */
  903. #define SATA_P0PHYCR_REG 0x178
  904. #define SATA_PHY_MPY(x) ((x) << 0)
  905. #define SATA_PHY_LOS(x) ((x) << 6)
  906. #define SATA_PHY_RXCDR(x) ((x) << 10)
  907. #define SATA_PHY_RXEQ(x) ((x) << 13)
  908. #define SATA_PHY_TXSWING(x) ((x) << 19)
  909. #define SATA_PHY_ENPLL(x) ((x) << 31)
  910. static struct clk *da850_sata_clk;
  911. static unsigned long da850_sata_refclkpn;
  912. /* Supported DA850 SATA crystal frequencies */
  913. #define KHZ_TO_HZ(freq) ((freq) * 1000)
  914. static unsigned long da850_sata_xtal[] = {
  915. KHZ_TO_HZ(300000),
  916. KHZ_TO_HZ(250000),
  917. 0, /* Reserved */
  918. KHZ_TO_HZ(187500),
  919. KHZ_TO_HZ(150000),
  920. KHZ_TO_HZ(125000),
  921. KHZ_TO_HZ(120000),
  922. KHZ_TO_HZ(100000),
  923. KHZ_TO_HZ(75000),
  924. KHZ_TO_HZ(60000),
  925. };
  926. static int da850_sata_init(struct device *dev, void __iomem *addr)
  927. {
  928. int i, ret;
  929. unsigned int val;
  930. da850_sata_clk = clk_get(dev, NULL);
  931. if (IS_ERR(da850_sata_clk))
  932. return PTR_ERR(da850_sata_clk);
  933. ret = clk_prepare_enable(da850_sata_clk);
  934. if (ret)
  935. goto err0;
  936. /* Enable SATA clock receiver */
  937. val = __raw_readl(DA8XX_SYSCFG1_VIRT(DA8XX_PWRDN_REG));
  938. val &= ~BIT(0);
  939. __raw_writel(val, DA8XX_SYSCFG1_VIRT(DA8XX_PWRDN_REG));
  940. /* Get the multiplier needed for 1.5GHz PLL output */
  941. for (i = 0; i < ARRAY_SIZE(da850_sata_xtal); i++)
  942. if (da850_sata_xtal[i] == da850_sata_refclkpn)
  943. break;
  944. if (i == ARRAY_SIZE(da850_sata_xtal)) {
  945. ret = -EINVAL;
  946. goto err1;
  947. }
  948. val = SATA_PHY_MPY(i + 1) |
  949. SATA_PHY_LOS(1) |
  950. SATA_PHY_RXCDR(4) |
  951. SATA_PHY_RXEQ(1) |
  952. SATA_PHY_TXSWING(3) |
  953. SATA_PHY_ENPLL(1);
  954. __raw_writel(val, addr + SATA_P0PHYCR_REG);
  955. return 0;
  956. err1:
  957. clk_disable_unprepare(da850_sata_clk);
  958. err0:
  959. clk_put(da850_sata_clk);
  960. return ret;
  961. }
  962. static void da850_sata_exit(struct device *dev)
  963. {
  964. clk_disable_unprepare(da850_sata_clk);
  965. clk_put(da850_sata_clk);
  966. }
  967. static struct ahci_platform_data da850_sata_pdata = {
  968. .init = da850_sata_init,
  969. .exit = da850_sata_exit,
  970. };
  971. static u64 da850_sata_dmamask = DMA_BIT_MASK(32);
  972. static struct platform_device da850_sata_device = {
  973. .name = "ahci",
  974. .id = -1,
  975. .dev = {
  976. .platform_data = &da850_sata_pdata,
  977. .dma_mask = &da850_sata_dmamask,
  978. .coherent_dma_mask = DMA_BIT_MASK(32),
  979. },
  980. .num_resources = ARRAY_SIZE(da850_sata_resources),
  981. .resource = da850_sata_resources,
  982. };
  983. int __init da850_register_sata(unsigned long refclkpn)
  984. {
  985. da850_sata_refclkpn = refclkpn;
  986. if (!da850_sata_refclkpn)
  987. return -EINVAL;
  988. return platform_device_register(&da850_sata_device);
  989. }
  990. #endif