devices-9615.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603
  1. /* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. */
  13. #include <linux/err.h>
  14. #include <linux/kernel.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/irq.h>
  17. #include <linux/io.h>
  18. #include <linux/platform_data/qcom_crypto_device.h>
  19. #include <linux/dma-mapping.h>
  20. #include <sound/msm-dai-q6.h>
  21. #include <sound/apr_audio.h>
  22. #include <linux/usb/android.h>
  23. #include <asm/hardware/gic.h>
  24. #include <asm/mach/flash.h>
  25. #include <mach/board.h>
  26. #include <mach/msm_iomap.h>
  27. #include <mach/msm_hsusb.h>
  28. #include <mach/irqs.h>
  29. #include <mach/socinfo.h>
  30. #include <mach/rpm.h>
  31. #include <mach/msm_bus_board.h>
  32. #include <asm/hardware/cache-l2x0.h>
  33. #include <mach/msm_sps.h>
  34. #include <mach/dma.h>
  35. #include "pm.h"
  36. #include "devices.h"
  37. #include <mach/gpio.h>
  38. #include <mach/mpm.h>
  39. #include "spm.h"
  40. #include "rpm_resources.h"
  41. #include "msm_watchdog.h"
  42. #include "rpm_stats.h"
  43. #include "rpm_log.h"
  44. /* Address of GSBI blocks */
  45. #define MSM_GSBI1_PHYS 0x16000000
  46. #define MSM_GSBI2_PHYS 0x16100000
  47. #define MSM_GSBI3_PHYS 0x16200000
  48. #define MSM_GSBI4_PHYS 0x16300000
  49. #define MSM_GSBI5_PHYS 0x16400000
  50. #define MSM_UART4DM_PHYS (MSM_GSBI4_PHYS + 0x40000)
  51. /* GSBI QUP devices */
  52. #define MSM_GSBI1_QUP_PHYS (MSM_GSBI1_PHYS + 0x80000)
  53. #define MSM_GSBI2_QUP_PHYS (MSM_GSBI2_PHYS + 0x80000)
  54. #define MSM_GSBI3_QUP_PHYS (MSM_GSBI3_PHYS + 0x80000)
  55. #define MSM_GSBI4_QUP_PHYS (MSM_GSBI4_PHYS + 0x80000)
  56. #define MSM_GSBI5_QUP_PHYS (MSM_GSBI5_PHYS + 0x80000)
  57. #define MSM_QUP_SIZE SZ_4K
  58. /* Address of SSBI CMD */
  59. #define MSM_PMIC1_SSBI_CMD_PHYS 0x00500000
  60. #define MSM_PMIC_SSBI_SIZE SZ_4K
  61. #define MSM_GPIO_I2C_CLK 16
  62. #define MSM_GPIO_I2C_SDA 17
  63. #define MSM9615_RPM_MASTER_STATS_BASE 0x10A700
  64. static struct msm_watchdog_pdata msm_watchdog_pdata = {
  65. .pet_time = 10000,
  66. .bark_time = 11000,
  67. .has_secure = false,
  68. .use_kernel_fiq = true,
  69. .base = MSM_TMR_BASE + WDT0_OFFSET,
  70. };
  71. static struct resource msm_watchdog_resources[] = {
  72. {
  73. .start = WDT0_ACCSCSSNBARK_INT,
  74. .end = WDT0_ACCSCSSNBARK_INT,
  75. .flags = IORESOURCE_IRQ,
  76. },
  77. };
  78. struct platform_device msm9615_device_watchdog = {
  79. .name = "msm_watchdog",
  80. .id = -1,
  81. .dev = {
  82. .platform_data = &msm_watchdog_pdata,
  83. },
  84. .num_resources = ARRAY_SIZE(msm_watchdog_resources),
  85. .resource = msm_watchdog_resources,
  86. };
  87. static struct resource msm_dmov_resource[] = {
  88. {
  89. .start = ADM_0_SCSS_1_IRQ,
  90. .flags = IORESOURCE_IRQ,
  91. },
  92. {
  93. .start = 0x18320000,
  94. .end = 0x18320000 + SZ_1M - 1,
  95. .flags = IORESOURCE_MEM,
  96. },
  97. };
  98. static struct msm_dmov_pdata msm_dmov_pdata = {
  99. .sd = 1,
  100. .sd_size = 0x800,
  101. };
  102. struct platform_device msm9615_device_dmov = {
  103. .name = "msm_dmov",
  104. .id = -1,
  105. .resource = msm_dmov_resource,
  106. .num_resources = ARRAY_SIZE(msm_dmov_resource),
  107. .dev = {
  108. .platform_data = &msm_dmov_pdata,
  109. },
  110. };
  111. struct platform_device msm9615_device_acpuclk = {
  112. .name = "acpuclk-9615",
  113. .id = -1,
  114. };
  115. #define MSM_USB_BAM_BASE 0x12502000
  116. #define MSM_USB_BAM_SIZE SZ_16K
  117. #define MSM_HSIC_BAM_BASE 0x12542000
  118. #define MSM_HSIC_BAM_SIZE SZ_16K
  119. static struct resource resources_otg[] = {
  120. {
  121. .start = MSM9615_HSUSB_PHYS,
  122. .end = MSM9615_HSUSB_PHYS + MSM9615_HSUSB_SIZE - 1,
  123. .flags = IORESOURCE_MEM,
  124. },
  125. {
  126. .start = USB1_HS_IRQ,
  127. .end = USB1_HS_IRQ,
  128. .flags = IORESOURCE_IRQ,
  129. },
  130. };
  131. struct platform_device msm_device_otg = {
  132. .name = "msm_otg",
  133. .id = -1,
  134. .num_resources = ARRAY_SIZE(resources_otg),
  135. .resource = resources_otg,
  136. .dev = {
  137. .coherent_dma_mask = DMA_BIT_MASK(32),
  138. },
  139. };
  140. #define MSM_HSUSB_RESUME_GPIO 79
  141. static struct resource resources_hsusb[] = {
  142. {
  143. .start = MSM9615_HSUSB_PHYS,
  144. .end = MSM9615_HSUSB_PHYS + MSM9615_HSUSB_SIZE - 1,
  145. .flags = IORESOURCE_MEM,
  146. },
  147. {
  148. .start = USB1_HS_IRQ,
  149. .end = USB1_HS_IRQ,
  150. .flags = IORESOURCE_IRQ,
  151. },
  152. {
  153. .start = MSM_HSUSB_RESUME_GPIO,
  154. .end = MSM_HSUSB_RESUME_GPIO,
  155. .name = "USB_RESUME",
  156. .flags = IORESOURCE_IO,
  157. },
  158. };
  159. static struct resource resources_usb_bam[] = {
  160. {
  161. .name = "hsusb",
  162. .start = MSM_USB_BAM_BASE,
  163. .end = MSM_USB_BAM_BASE + MSM_USB_BAM_SIZE - 1,
  164. .flags = IORESOURCE_MEM,
  165. },
  166. {
  167. .name = "hsusb",
  168. .start = USB1_HS_BAM_IRQ,
  169. .end = USB1_HS_BAM_IRQ,
  170. .flags = IORESOURCE_IRQ,
  171. },
  172. {
  173. .name = "hsic",
  174. .start = MSM_HSIC_BAM_BASE,
  175. .end = MSM_HSIC_BAM_BASE + MSM_HSIC_BAM_SIZE - 1,
  176. .flags = IORESOURCE_MEM,
  177. },
  178. {
  179. .name = "hsic",
  180. .start = USB_HSIC_BAM_IRQ,
  181. .end = USB_HSIC_BAM_IRQ,
  182. .flags = IORESOURCE_IRQ,
  183. },
  184. };
  185. struct platform_device msm_device_usb_bam = {
  186. .name = "usb_bam",
  187. .id = -1,
  188. .num_resources = ARRAY_SIZE(resources_usb_bam),
  189. .resource = resources_usb_bam,
  190. };
  191. struct platform_device msm_device_gadget_peripheral = {
  192. .name = "msm_hsusb",
  193. .id = -1,
  194. .num_resources = ARRAY_SIZE(resources_hsusb),
  195. .resource = resources_hsusb,
  196. .dev = {
  197. .coherent_dma_mask = DMA_BIT_MASK(32),
  198. },
  199. };
  200. static struct resource resources_hsic_peripheral[] = {
  201. {
  202. .start = MSM9615_HSIC_PHYS,
  203. .end = MSM9615_HSIC_PHYS + MSM9615_HSIC_SIZE - 1,
  204. .flags = IORESOURCE_MEM,
  205. },
  206. {
  207. .start = USB_HSIC_IRQ,
  208. .end = USB_HSIC_IRQ,
  209. .flags = IORESOURCE_IRQ,
  210. },
  211. };
  212. struct platform_device msm_device_hsic_peripheral = {
  213. .name = "msm_hsic_peripheral",
  214. .id = -1,
  215. .num_resources = ARRAY_SIZE(resources_hsic_peripheral),
  216. .resource = resources_hsic_peripheral,
  217. .dev = {
  218. .coherent_dma_mask = DMA_BIT_MASK(32),
  219. },
  220. };
  221. static struct resource resources_hsusb_host[] = {
  222. {
  223. .start = MSM9615_HSUSB_PHYS,
  224. .end = MSM9615_HSUSB_PHYS + MSM9615_HSUSB_PHYS - 1,
  225. .flags = IORESOURCE_MEM,
  226. },
  227. {
  228. .start = USB1_HS_IRQ,
  229. .end = USB1_HS_IRQ,
  230. .flags = IORESOURCE_IRQ,
  231. },
  232. };
  233. static u64 dma_mask = DMA_BIT_MASK(32);
  234. struct platform_device msm_device_hsusb_host = {
  235. .name = "msm_hsusb_host",
  236. .id = -1,
  237. .num_resources = ARRAY_SIZE(resources_hsusb_host),
  238. .resource = resources_hsusb_host,
  239. .dev = {
  240. .dma_mask = &dma_mask,
  241. .coherent_dma_mask = 0xffffffff,
  242. },
  243. };
  244. static struct resource resources_hsic_host[] = {
  245. {
  246. .start = MSM9615_HSIC_PHYS,
  247. .end = MSM9615_HSIC_PHYS + MSM9615_HSIC_SIZE - 1,
  248. .flags = IORESOURCE_MEM,
  249. },
  250. {
  251. .start = USB_HSIC_IRQ,
  252. .end = USB_HSIC_IRQ,
  253. .flags = IORESOURCE_IRQ,
  254. },
  255. };
  256. struct platform_device msm_device_hsic_host = {
  257. .name = "msm_hsic_host",
  258. .id = -1,
  259. .num_resources = ARRAY_SIZE(resources_hsic_host),
  260. .resource = resources_hsic_host,
  261. .dev = {
  262. .dma_mask = &dma_mask,
  263. .coherent_dma_mask = 0xffffffff,
  264. },
  265. };
  266. static struct resource resources_uart_gsbi4[] = {
  267. {
  268. .start = GSBI4_UARTDM_IRQ,
  269. .end = GSBI4_UARTDM_IRQ,
  270. .flags = IORESOURCE_IRQ,
  271. },
  272. {
  273. .start = MSM_UART4DM_PHYS,
  274. .end = MSM_UART4DM_PHYS + PAGE_SIZE - 1,
  275. .name = "uartdm_resource",
  276. .flags = IORESOURCE_MEM,
  277. },
  278. {
  279. .start = MSM_GSBI4_PHYS,
  280. .end = MSM_GSBI4_PHYS + PAGE_SIZE - 1,
  281. .name = "gsbi_resource",
  282. .flags = IORESOURCE_MEM,
  283. },
  284. };
  285. struct platform_device msm9615_device_uart_gsbi4 = {
  286. .name = "msm_serial_hsl",
  287. .id = 0,
  288. .num_resources = ARRAY_SIZE(resources_uart_gsbi4),
  289. .resource = resources_uart_gsbi4,
  290. };
  291. static struct resource resources_qup_i2c_gsbi5[] = {
  292. {
  293. .name = "gsbi_qup_i2c_addr",
  294. .start = MSM_GSBI5_PHYS,
  295. .end = MSM_GSBI5_PHYS + 4 - 1,
  296. .flags = IORESOURCE_MEM,
  297. },
  298. {
  299. .name = "qup_phys_addr",
  300. .start = MSM_GSBI5_QUP_PHYS,
  301. .end = MSM_GSBI5_QUP_PHYS + MSM_QUP_SIZE - 1,
  302. .flags = IORESOURCE_MEM,
  303. },
  304. {
  305. .name = "qup_err_intr",
  306. .start = GSBI5_QUP_IRQ,
  307. .end = GSBI5_QUP_IRQ,
  308. .flags = IORESOURCE_IRQ,
  309. },
  310. {
  311. .name = "i2c_clk",
  312. .start = MSM_GPIO_I2C_CLK,
  313. .end = MSM_GPIO_I2C_CLK,
  314. .flags = IORESOURCE_IO,
  315. },
  316. {
  317. .name = "i2c_sda",
  318. .start = MSM_GPIO_I2C_SDA,
  319. .end = MSM_GPIO_I2C_SDA,
  320. .flags = IORESOURCE_IO,
  321. },
  322. };
  323. struct platform_device msm9615_device_qup_i2c_gsbi5 = {
  324. .name = "qup_i2c",
  325. .id = 0,
  326. .num_resources = ARRAY_SIZE(resources_qup_i2c_gsbi5),
  327. .resource = resources_qup_i2c_gsbi5,
  328. };
  329. static struct resource resources_qup_spi_gsbi3[] = {
  330. {
  331. .name = "spi_base",
  332. .start = MSM_GSBI3_QUP_PHYS,
  333. .end = MSM_GSBI3_QUP_PHYS + SZ_4K - 1,
  334. .flags = IORESOURCE_MEM,
  335. },
  336. {
  337. .name = "gsbi_base",
  338. .start = MSM_GSBI3_PHYS,
  339. .end = MSM_GSBI3_PHYS + 4 - 1,
  340. .flags = IORESOURCE_MEM,
  341. },
  342. {
  343. .name = "spi_irq_in",
  344. .start = GSBI3_QUP_IRQ,
  345. .end = GSBI3_QUP_IRQ,
  346. .flags = IORESOURCE_IRQ,
  347. },
  348. };
  349. struct platform_device msm9615_device_qup_spi_gsbi3 = {
  350. .name = "spi_qsd",
  351. .id = 0,
  352. .num_resources = ARRAY_SIZE(resources_qup_spi_gsbi3),
  353. .resource = resources_qup_spi_gsbi3,
  354. };
  355. #define LPASS_SLIMBUS_PHYS 0x28080000
  356. #define LPASS_SLIMBUS_BAM_PHYS 0x28084000
  357. #define LPASS_SLIMBUS_SLEW (MSM9615_TLMM_PHYS + 0x207C)
  358. /* Board info for the slimbus slave device */
  359. static struct resource slimbus_res[] = {
  360. {
  361. .start = LPASS_SLIMBUS_PHYS,
  362. .end = LPASS_SLIMBUS_PHYS + 8191,
  363. .flags = IORESOURCE_MEM,
  364. .name = "slimbus_physical",
  365. },
  366. {
  367. .start = LPASS_SLIMBUS_BAM_PHYS,
  368. .end = LPASS_SLIMBUS_BAM_PHYS + 8191,
  369. .flags = IORESOURCE_MEM,
  370. .name = "slimbus_bam_physical",
  371. },
  372. {
  373. .start = LPASS_SLIMBUS_SLEW,
  374. .end = LPASS_SLIMBUS_SLEW + 4 - 1,
  375. .flags = IORESOURCE_MEM,
  376. .name = "slimbus_slew_reg",
  377. },
  378. {
  379. .start = SLIMBUS0_CORE_EE1_IRQ,
  380. .end = SLIMBUS0_CORE_EE1_IRQ,
  381. .flags = IORESOURCE_IRQ,
  382. .name = "slimbus_irq",
  383. },
  384. {
  385. .start = SLIMBUS0_BAM_EE1_IRQ,
  386. .end = SLIMBUS0_BAM_EE1_IRQ,
  387. .flags = IORESOURCE_IRQ,
  388. .name = "slimbus_bam_irq",
  389. },
  390. };
  391. struct platform_device msm9615_slim_ctrl = {
  392. .name = "msm_slim_ctrl",
  393. .id = 1,
  394. .num_resources = ARRAY_SIZE(slimbus_res),
  395. .resource = slimbus_res,
  396. .dev = {
  397. .coherent_dma_mask = 0xffffffffULL,
  398. },
  399. };
  400. struct platform_device msm_pcm = {
  401. .name = "msm-pcm-dsp",
  402. .id = -1,
  403. };
  404. struct platform_device msm_multi_ch_pcm = {
  405. .name = "msm-multi-ch-pcm-dsp",
  406. .id = -1,
  407. };
  408. struct platform_device msm_pcm_routing = {
  409. .name = "msm-pcm-routing",
  410. .id = -1,
  411. };
  412. struct platform_device msm_cpudai0 = {
  413. .name = "msm-dai-q6",
  414. .id = 0x4000,
  415. };
  416. struct platform_device msm_cpudai1 = {
  417. .name = "msm-dai-q6",
  418. .id = 0x4001,
  419. };
  420. struct platform_device msm_cpudai_bt_rx = {
  421. .name = "msm-dai-q6",
  422. .id = 0x3000,
  423. };
  424. struct platform_device msm_cpudai_bt_tx = {
  425. .name = "msm-dai-q6",
  426. .id = 0x3001,
  427. };
  428. /*
  429. * Machine specific data for AUX PCM Interface
  430. * which the driver will be unware of.
  431. */
  432. struct msm_dai_auxpcm_pdata auxpcm_pdata = {
  433. .clk = "pcm_clk",
  434. .mode_8k = {
  435. .mode = AFE_PCM_CFG_MODE_PCM,
  436. .sync = AFE_PCM_CFG_SYNC_INT,
  437. .frame = AFE_PCM_CFG_FRM_256BPF,
  438. .quant = AFE_PCM_CFG_QUANT_LINEAR_NOPAD,
  439. .slot = 0,
  440. .data = AFE_PCM_CFG_CDATAOE_MASTER,
  441. .pcm_clk_rate = 2048000,
  442. },
  443. .mode_16k = {
  444. .mode = AFE_PCM_CFG_MODE_PCM,
  445. .sync = AFE_PCM_CFG_SYNC_INT,
  446. .frame = AFE_PCM_CFG_FRM_256BPF,
  447. .quant = AFE_PCM_CFG_QUANT_LINEAR_NOPAD,
  448. .slot = 0,
  449. .data = AFE_PCM_CFG_CDATAOE_MASTER,
  450. .pcm_clk_rate = 4096000,
  451. }
  452. };
  453. struct platform_device msm_cpudai_auxpcm_rx = {
  454. .name = "msm-dai-q6",
  455. .id = 2,
  456. .dev = {
  457. .platform_data = &auxpcm_pdata,
  458. },
  459. };
  460. struct platform_device msm_cpudai_auxpcm_tx = {
  461. .name = "msm-dai-q6",
  462. .id = 3,
  463. .dev = {
  464. .platform_data = &auxpcm_pdata,
  465. },
  466. };
  467. struct msm_dai_auxpcm_pdata sec_auxpcm_pdata = {
  468. .clk = "sec_pcm_clk",
  469. .mode_8k = {
  470. .mode = AFE_PCM_CFG_MODE_PCM,
  471. .sync = AFE_PCM_CFG_SYNC_INT,
  472. .frame = AFE_PCM_CFG_FRM_256BPF,
  473. .quant = AFE_PCM_CFG_QUANT_LINEAR_NOPAD,
  474. .slot = 0,
  475. .data = AFE_PCM_CFG_CDATAOE_MASTER,
  476. .pcm_clk_rate = 2048000,
  477. },
  478. .mode_16k = {
  479. .mode = AFE_PCM_CFG_MODE_PCM,
  480. .sync = AFE_PCM_CFG_SYNC_INT,
  481. .frame = AFE_PCM_CFG_FRM_256BPF,
  482. .quant = AFE_PCM_CFG_QUANT_LINEAR_NOPAD,
  483. .slot = 0,
  484. .data = AFE_PCM_CFG_CDATAOE_MASTER,
  485. .pcm_clk_rate = 4096000,
  486. }
  487. };
  488. struct platform_device msm_cpudai_sec_auxpcm_rx = {
  489. .name = "msm-dai-q6",
  490. .id = 12,
  491. .dev = {
  492. .platform_data = &sec_auxpcm_pdata,
  493. },
  494. };
  495. struct platform_device msm_cpudai_sec_auxpcm_tx = {
  496. .name = "msm-dai-q6",
  497. .id = 13,
  498. .dev = {
  499. .platform_data = &sec_auxpcm_pdata,
  500. },
  501. };
  502. struct platform_device msm_cpu_fe = {
  503. .name = "msm-dai-fe",
  504. .id = -1,
  505. };
  506. struct platform_device msm_stub_codec = {
  507. .name = "msm-stub-codec",
  508. .id = 1,
  509. };
  510. struct platform_device msm_voice = {
  511. .name = "msm-pcm-voice",
  512. .id = -1,
  513. };
  514. struct platform_device msm_cpudai_incall_music_rx = {
  515. .name = "msm-dai-q6",
  516. .id = 0x8005,
  517. };
  518. struct platform_device msm_cpudai_incall_record_rx = {
  519. .name = "msm-dai-q6",
  520. .id = 0x8004,
  521. };
  522. struct platform_device msm_cpudai_incall_record_tx = {
  523. .name = "msm-dai-q6",
  524. .id = 0x8003,
  525. };
  526. struct platform_device msm_i2s_cpudai0 = {
  527. .name = "msm-dai-q6",
  528. .id = PRIMARY_I2S_RX,
  529. };
  530. struct platform_device msm_i2s_cpudai1 = {
  531. .name = "msm-dai-q6",
  532. .id = PRIMARY_I2S_TX,
  533. };
  534. struct platform_device msm_i2s_cpudai4 = {
  535. .name = "msm-dai-q6",
  536. .id = SECONDARY_I2S_RX,
  537. };
  538. struct platform_device msm_i2s_cpudai5 = {
  539. .name = "msm-dai-q6",
  540. .id = SECONDARY_I2S_TX,
  541. };
  542. struct platform_device msm_voip = {
  543. .name = "msm-voip-dsp",
  544. .id = -1,
  545. };
  546. struct platform_device msm_cpudai_stub = {
  547. .name = "msm-dai-stub",
  548. .id = -1,
  549. };
  550. struct platform_device msm_dtmf = {
  551. .name = "msm-pcm-dtmf",
  552. .id = -1,
  553. };
  554. struct platform_device msm_host_pcm_voice = {
  555. .name = "msm-host-pcm-voice",
  556. .id = -1,
  557. };
  558. struct platform_device msm_compr_dsp = {
  559. .name = "msm-compr-dsp",
  560. .id = -1,
  561. };
  562. struct platform_device msm_pcm_hostless = {
  563. .name = "msm-pcm-hostless",
  564. .id = -1,
  565. };
  566. struct platform_device msm_cpudai_afe_01_rx = {
  567. .name = "msm-dai-q6",
  568. .id = 0xE0,
  569. };
  570. struct platform_device msm_cpudai_afe_01_tx = {
  571. .name = "msm-dai-q6",
  572. .id = 0xF0,
  573. };
  574. struct platform_device msm_cpudai_afe_02_rx = {
  575. .name = "msm-dai-q6",
  576. .id = 0xF1,
  577. };
  578. struct platform_device msm_cpudai_afe_02_tx = {
  579. .name = "msm-dai-q6",
  580. .id = 0xE1,
  581. };
  582. struct platform_device msm_pcm_afe = {
  583. .name = "msm-pcm-afe",
  584. .id = -1,
  585. };
  586. static struct resource resources_ssbi_pmic1[] = {
  587. {
  588. .start = MSM_PMIC1_SSBI_CMD_PHYS,
  589. .end = MSM_PMIC1_SSBI_CMD_PHYS + MSM_PMIC_SSBI_SIZE - 1,
  590. .flags = IORESOURCE_MEM,
  591. },
  592. };
  593. struct platform_device msm9615_device_ssbi_pmic1 = {
  594. .name = "msm_ssbi",
  595. .id = 0,
  596. .resource = resources_ssbi_pmic1,
  597. .num_resources = ARRAY_SIZE(resources_ssbi_pmic1),
  598. };
  599. static struct resource resources_sps[] = {
  600. {
  601. .name = "pipe_mem",
  602. .start = 0x12800000,
  603. .end = 0x12800000 + 0x4000 - 1,
  604. .flags = IORESOURCE_MEM,
  605. },
  606. {
  607. .name = "bamdma_dma",
  608. .start = 0x12240000,
  609. .end = 0x12240000 + 0x1000 - 1,
  610. .flags = IORESOURCE_MEM,
  611. },
  612. {
  613. .name = "bamdma_bam",
  614. .start = 0x12244000,
  615. .end = 0x12244000 + 0x4000 - 1,
  616. .flags = IORESOURCE_MEM,
  617. },
  618. {
  619. .name = "bamdma_irq",
  620. .start = SPS_BAM_DMA_IRQ,
  621. .end = SPS_BAM_DMA_IRQ,
  622. .flags = IORESOURCE_IRQ,
  623. },
  624. };
  625. struct msm_sps_platform_data msm_sps_pdata = {
  626. .bamdma_restricted_pipes = 0x06,
  627. };
  628. struct platform_device msm_device_sps = {
  629. .name = "msm_sps",
  630. .id = -1,
  631. .num_resources = ARRAY_SIZE(resources_sps),
  632. .resource = resources_sps,
  633. .dev.platform_data = &msm_sps_pdata,
  634. };
  635. #define MSM_NAND_PHYS 0x1B400000
  636. static struct resource resources_nand[] = {
  637. [0] = {
  638. .name = "msm_nand_dmac",
  639. .start = DMOV_NAND_CHAN,
  640. .end = DMOV_NAND_CHAN,
  641. .flags = IORESOURCE_DMA,
  642. },
  643. [1] = {
  644. .name = "msm_nand_phys",
  645. .start = MSM_NAND_PHYS,
  646. .end = MSM_NAND_PHYS + 0x7FF,
  647. .flags = IORESOURCE_MEM,
  648. },
  649. };
  650. struct flash_platform_data msm_nand_data = {
  651. .version = VERSION_2,
  652. };
  653. struct platform_device msm_device_nand = {
  654. .name = "msm_nand",
  655. .id = -1,
  656. .num_resources = ARRAY_SIZE(resources_nand),
  657. .resource = resources_nand,
  658. .dev = {
  659. .platform_data = &msm_nand_data,
  660. },
  661. };
  662. struct platform_device msm_device_smd = {
  663. .name = "msm_smd",
  664. .id = -1,
  665. };
  666. struct platform_device msm_device_bam_dmux = {
  667. .name = "BAM_RMNT",
  668. .id = -1,
  669. };
  670. static struct resource msm_9615_q6_lpass_resources[] = {
  671. {
  672. .start = LPASS_Q6SS_WDOG_EXPIRED,
  673. .end = LPASS_Q6SS_WDOG_EXPIRED,
  674. .flags = IORESOURCE_IRQ,
  675. },
  676. };
  677. struct platform_device msm_9615_q6_lpass = {
  678. .name = "pil-q6v4-lpass",
  679. .id = -1,
  680. .num_resources = ARRAY_SIZE(msm_9615_q6_lpass_resources),
  681. .resource = msm_9615_q6_lpass_resources,
  682. };
  683. static struct resource msm_9615_q6_mss_resources[] = {
  684. {
  685. .start = Q6FW_WDOG_EXPIRED_IRQ,
  686. .end = Q6FW_WDOG_EXPIRED_IRQ,
  687. .flags = IORESOURCE_IRQ,
  688. },
  689. {
  690. .start = Q6SW_WDOG_EXPIRED_IRQ,
  691. .end = Q6SW_WDOG_EXPIRED_IRQ,
  692. .flags = IORESOURCE_IRQ,
  693. },
  694. };
  695. struct platform_device msm_9615_q6_mss = {
  696. .name = "pil-q6v4-modem",
  697. .id = -1,
  698. .num_resources = ARRAY_SIZE(msm_9615_q6_mss_resources),
  699. .resource = msm_9615_q6_mss_resources,
  700. };
  701. #ifdef CONFIG_HW_RANDOM_MSM
  702. /* PRNG device */
  703. #define MSM_PRNG_PHYS 0x1A500000
  704. static struct resource rng_resources = {
  705. .flags = IORESOURCE_MEM,
  706. .start = MSM_PRNG_PHYS,
  707. .end = MSM_PRNG_PHYS + SZ_512 - 1,
  708. };
  709. struct platform_device msm_device_rng = {
  710. .name = "msm_rng",
  711. .id = 0,
  712. .num_resources = 1,
  713. .resource = &rng_resources,
  714. };
  715. #endif
  716. #if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
  717. defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) || \
  718. defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
  719. defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
  720. #define QCE_SIZE 0x10000
  721. #define QCE_0_BASE 0x18500000
  722. #define QCE_HW_KEY_SUPPORT 0
  723. #define QCE_SHA_HMAC_SUPPORT 1
  724. #define QCE_SHARE_CE_RESOURCE 1
  725. #define QCE_CE_SHARED 0
  726. static struct resource qcrypto_resources[] = {
  727. [0] = {
  728. .start = QCE_0_BASE,
  729. .end = QCE_0_BASE + QCE_SIZE - 1,
  730. .flags = IORESOURCE_MEM,
  731. },
  732. [1] = {
  733. .name = "crypto_channels",
  734. .start = DMOV_CE_IN_CHAN,
  735. .end = DMOV_CE_OUT_CHAN,
  736. .flags = IORESOURCE_DMA,
  737. },
  738. [2] = {
  739. .name = "crypto_crci_in",
  740. .start = DMOV_CE_IN_CRCI,
  741. .end = DMOV_CE_IN_CRCI,
  742. .flags = IORESOURCE_DMA,
  743. },
  744. [3] = {
  745. .name = "crypto_crci_out",
  746. .start = DMOV_CE_OUT_CRCI,
  747. .end = DMOV_CE_OUT_CRCI,
  748. .flags = IORESOURCE_DMA,
  749. },
  750. };
  751. static struct resource qcedev_resources[] = {
  752. [0] = {
  753. .start = QCE_0_BASE,
  754. .end = QCE_0_BASE + QCE_SIZE - 1,
  755. .flags = IORESOURCE_MEM,
  756. },
  757. [1] = {
  758. .name = "crypto_channels",
  759. .start = DMOV_CE_IN_CHAN,
  760. .end = DMOV_CE_OUT_CHAN,
  761. .flags = IORESOURCE_DMA,
  762. },
  763. [2] = {
  764. .name = "crypto_crci_in",
  765. .start = DMOV_CE_IN_CRCI,
  766. .end = DMOV_CE_IN_CRCI,
  767. .flags = IORESOURCE_DMA,
  768. },
  769. [3] = {
  770. .name = "crypto_crci_out",
  771. .start = DMOV_CE_OUT_CRCI,
  772. .end = DMOV_CE_OUT_CRCI,
  773. .flags = IORESOURCE_DMA,
  774. },
  775. };
  776. #endif
  777. #if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
  778. defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE)
  779. static struct msm_ce_hw_support qcrypto_ce_hw_suppport = {
  780. .ce_shared = QCE_CE_SHARED,
  781. .shared_ce_resource = QCE_SHARE_CE_RESOURCE,
  782. .hw_key_support = QCE_HW_KEY_SUPPORT,
  783. .sha_hmac = QCE_SHA_HMAC_SUPPORT,
  784. .bus_scale_table = NULL,
  785. };
  786. struct platform_device msm9615_qcrypto_device = {
  787. .name = "qcrypto",
  788. .id = 0,
  789. .num_resources = ARRAY_SIZE(qcrypto_resources),
  790. .resource = qcrypto_resources,
  791. .dev = {
  792. .coherent_dma_mask = DMA_BIT_MASK(32),
  793. .platform_data = &qcrypto_ce_hw_suppport,
  794. },
  795. };
  796. #endif
  797. #if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
  798. defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
  799. static struct msm_ce_hw_support qcedev_ce_hw_suppport = {
  800. .ce_shared = QCE_CE_SHARED,
  801. .shared_ce_resource = QCE_SHARE_CE_RESOURCE,
  802. .hw_key_support = QCE_HW_KEY_SUPPORT,
  803. .sha_hmac = QCE_SHA_HMAC_SUPPORT,
  804. .bus_scale_table = NULL,
  805. };
  806. struct platform_device msm9615_qcedev_device = {
  807. .name = "qce",
  808. .id = 0,
  809. .num_resources = ARRAY_SIZE(qcedev_resources),
  810. .resource = qcedev_resources,
  811. .dev = {
  812. .coherent_dma_mask = DMA_BIT_MASK(32),
  813. .platform_data = &qcedev_ce_hw_suppport,
  814. },
  815. };
  816. #endif
  817. #define MSM_SDC1_BASE 0x12180000
  818. #define MSM_SDC1_DML_BASE (MSM_SDC1_BASE + 0x800)
  819. #define MSM_SDC1_BAM_BASE (MSM_SDC1_BASE + 0x2000)
  820. #define MSM_SDC2_BASE 0x12140000
  821. #define MSM_SDC2_DML_BASE (MSM_SDC2_BASE + 0x800)
  822. #define MSM_SDC2_BAM_BASE (MSM_SDC2_BASE + 0x2000)
  823. static struct resource resources_sdc1[] = {
  824. {
  825. .name = "core_mem",
  826. .flags = IORESOURCE_MEM,
  827. .start = MSM_SDC1_BASE,
  828. .end = MSM_SDC1_DML_BASE - 1,
  829. },
  830. {
  831. .name = "core_irq",
  832. .flags = IORESOURCE_IRQ,
  833. .start = SDC1_IRQ_0,
  834. .end = SDC1_IRQ_0
  835. },
  836. #ifdef CONFIG_MMC_MSM_SPS_SUPPORT
  837. {
  838. .name = "dml_mem",
  839. .start = MSM_SDC1_DML_BASE,
  840. .end = MSM_SDC1_BAM_BASE - 1,
  841. .flags = IORESOURCE_MEM,
  842. },
  843. {
  844. .name = "bam_mem",
  845. .start = MSM_SDC1_BAM_BASE,
  846. .end = MSM_SDC1_BAM_BASE + (2 * SZ_4K) - 1,
  847. .flags = IORESOURCE_MEM,
  848. },
  849. {
  850. .name = "bam_irq",
  851. .start = SDC1_BAM_IRQ,
  852. .end = SDC1_BAM_IRQ,
  853. .flags = IORESOURCE_IRQ,
  854. },
  855. #endif
  856. };
  857. static struct resource resources_sdc2[] = {
  858. {
  859. .name = "core_mem",
  860. .flags = IORESOURCE_MEM,
  861. .start = MSM_SDC2_BASE,
  862. .end = MSM_SDC2_DML_BASE - 1,
  863. },
  864. {
  865. .name = "core_irq",
  866. .flags = IORESOURCE_IRQ,
  867. .start = SDC2_IRQ_0,
  868. .end = SDC2_IRQ_0
  869. },
  870. #ifdef CONFIG_MMC_MSM_SPS_SUPPORT
  871. {
  872. .name = "dml_mem",
  873. .start = MSM_SDC2_DML_BASE,
  874. .end = MSM_SDC2_BAM_BASE - 1,
  875. .flags = IORESOURCE_MEM,
  876. },
  877. {
  878. .name = "bam_mem",
  879. .start = MSM_SDC2_BAM_BASE,
  880. .end = MSM_SDC2_BAM_BASE + (2 * SZ_4K) - 1,
  881. .flags = IORESOURCE_MEM,
  882. },
  883. {
  884. .name = "bam_irq",
  885. .start = SDC2_BAM_IRQ,
  886. .end = SDC2_BAM_IRQ,
  887. .flags = IORESOURCE_IRQ,
  888. },
  889. #endif
  890. };
  891. struct platform_device msm_device_sdc1 = {
  892. .name = "msm_sdcc",
  893. .id = 1,
  894. .num_resources = ARRAY_SIZE(resources_sdc1),
  895. .resource = resources_sdc1,
  896. .dev = {
  897. .coherent_dma_mask = 0xffffffff,
  898. },
  899. };
  900. struct platform_device msm_device_sdc2 = {
  901. .name = "msm_sdcc",
  902. .id = 2,
  903. .num_resources = ARRAY_SIZE(resources_sdc2),
  904. .resource = resources_sdc2,
  905. .dev = {
  906. .coherent_dma_mask = 0xffffffff,
  907. },
  908. };
  909. static struct platform_device *msm_sdcc_devices[] __initdata = {
  910. &msm_device_sdc1,
  911. &msm_device_sdc2,
  912. };
  913. int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat)
  914. {
  915. struct platform_device *pdev;
  916. if (controller < 1 || controller > 2)
  917. return -EINVAL;
  918. pdev = msm_sdcc_devices[controller - 1];
  919. pdev->dev.platform_data = plat;
  920. return platform_device_register(pdev);
  921. }
  922. #ifdef CONFIG_FB_MSM_EBI2
  923. static struct resource msm_ebi2_lcdc_resources[] = {
  924. {
  925. .name = "base",
  926. .start = 0x1B300000,
  927. .end = 0x1B300000 + PAGE_SIZE - 1,
  928. .flags = IORESOURCE_MEM,
  929. },
  930. {
  931. .name = "lcd01",
  932. .start = 0x1FC00000,
  933. .end = 0x1FC00000 + 0x80000 - 1,
  934. .flags = IORESOURCE_MEM,
  935. },
  936. };
  937. struct platform_device msm_ebi2_lcdc_device = {
  938. .name = "ebi2_lcd",
  939. .id = 0,
  940. .num_resources = ARRAY_SIZE(msm_ebi2_lcdc_resources),
  941. .resource = msm_ebi2_lcdc_resources,
  942. };
  943. #endif
  944. #ifdef CONFIG_CACHE_L2X0
  945. static int __init l2x0_cache_init(void)
  946. {
  947. int aux_ctrl = 0;
  948. /* Way Size 010(0x2) 32KB */
  949. aux_ctrl = (0x1 << L2X0_AUX_CTRL_SHARE_OVERRIDE_SHIFT) | \
  950. (0x2 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT) | \
  951. (0x1 << L2X0_AUX_CTRL_EVNT_MON_BUS_EN_SHIFT);
  952. /* L2 Latency setting required by hardware. Default is 0x20
  953. which is no good.
  954. */
  955. writel_relaxed(0x220, MSM_L2CC_BASE + L2X0_DATA_LATENCY_CTRL);
  956. l2x0_init(MSM_L2CC_BASE, aux_ctrl, L2X0_AUX_CTRL_MASK);
  957. return 0;
  958. }
  959. #else
  960. static int __init l2x0_cache_init(void){ return 0; }
  961. #endif
  962. struct msm_rpm_platform_data msm9615_rpm_data __initdata = {
  963. .reg_base_addrs = {
  964. [MSM_RPM_PAGE_STATUS] = MSM_RPM_BASE,
  965. [MSM_RPM_PAGE_CTRL] = MSM_RPM_BASE + 0x400,
  966. [MSM_RPM_PAGE_REQ] = MSM_RPM_BASE + 0x600,
  967. [MSM_RPM_PAGE_ACK] = MSM_RPM_BASE + 0xa00,
  968. },
  969. .irq_ack = RPM_APCC_CPU0_GP_HIGH_IRQ,
  970. .irq_err = RPM_APCC_CPU0_GP_LOW_IRQ,
  971. .irq_wakeup = RPM_APCC_CPU0_WAKE_UP_IRQ,
  972. .ipc_rpm_reg = MSM_APCS_GCC_BASE + 0x008,
  973. .ipc_rpm_val = 4,
  974. .target_id = {
  975. MSM_RPM_MAP(9615, NOTIFICATION_CONFIGURED_0, NOTIFICATION, 4),
  976. MSM_RPM_MAP(9615, NOTIFICATION_REGISTERED_0, NOTIFICATION, 4),
  977. MSM_RPM_MAP(9615, INVALIDATE_0, INVALIDATE, 8),
  978. MSM_RPM_MAP(9615, TRIGGER_TIMED_TO, TRIGGER_TIMED, 1),
  979. MSM_RPM_MAP(9615, TRIGGER_TIMED_SCLK_COUNT, TRIGGER_TIMED, 1),
  980. MSM_RPM_MAP(9615, RPM_CTL, RPM_CTL, 1),
  981. MSM_RPM_MAP(9615, CXO_CLK, CXO_CLK, 1),
  982. MSM_RPM_MAP(9615, SYSTEM_FABRIC_CLK, SYSTEM_FABRIC_CLK, 1),
  983. MSM_RPM_MAP(9615, DAYTONA_FABRIC_CLK, DAYTONA_FABRIC_CLK, 1),
  984. MSM_RPM_MAP(9615, SFPB_CLK, SFPB_CLK, 1),
  985. MSM_RPM_MAP(9615, CFPB_CLK, CFPB_CLK, 1),
  986. MSM_RPM_MAP(9615, EBI1_CLK, EBI1_CLK, 1),
  987. MSM_RPM_MAP(9615, SYS_FABRIC_CFG_HALT_0,
  988. SYS_FABRIC_CFG_HALT, 2),
  989. MSM_RPM_MAP(9615, SYS_FABRIC_CFG_CLKMOD_0,
  990. SYS_FABRIC_CFG_CLKMOD, 3),
  991. MSM_RPM_MAP(9615, SYS_FABRIC_CFG_IOCTL,
  992. SYS_FABRIC_CFG_IOCTL, 1),
  993. MSM_RPM_MAP(9615, SYSTEM_FABRIC_ARB_0,
  994. SYSTEM_FABRIC_ARB, 27),
  995. MSM_RPM_MAP(9615, PM8018_S1_0, PM8018_S1, 2),
  996. MSM_RPM_MAP(9615, PM8018_S2_0, PM8018_S2, 2),
  997. MSM_RPM_MAP(9615, PM8018_S3_0, PM8018_S3, 2),
  998. MSM_RPM_MAP(9615, PM8018_S4_0, PM8018_S4, 2),
  999. MSM_RPM_MAP(9615, PM8018_S5_0, PM8018_S5, 2),
  1000. MSM_RPM_MAP(9615, PM8018_L1_0, PM8018_L1, 2),
  1001. MSM_RPM_MAP(9615, PM8018_L2_0, PM8018_L2, 2),
  1002. MSM_RPM_MAP(9615, PM8018_L3_0, PM8018_L3, 2),
  1003. MSM_RPM_MAP(9615, PM8018_L4_0, PM8018_L4, 2),
  1004. MSM_RPM_MAP(9615, PM8018_L5_0, PM8018_L5, 2),
  1005. MSM_RPM_MAP(9615, PM8018_L6_0, PM8018_L6, 2),
  1006. MSM_RPM_MAP(9615, PM8018_L7_0, PM8018_L7, 2),
  1007. MSM_RPM_MAP(9615, PM8018_L8_0, PM8018_L8, 2),
  1008. MSM_RPM_MAP(9615, PM8018_L9_0, PM8018_L9, 2),
  1009. MSM_RPM_MAP(9615, PM8018_L10_0, PM8018_L10, 2),
  1010. MSM_RPM_MAP(9615, PM8018_L11_0, PM8018_L11, 2),
  1011. MSM_RPM_MAP(9615, PM8018_L12_0, PM8018_L12, 2),
  1012. MSM_RPM_MAP(9615, PM8018_L13_0, PM8018_L13, 2),
  1013. MSM_RPM_MAP(9615, PM8018_L14_0, PM8018_L14, 2),
  1014. MSM_RPM_MAP(9615, PM8018_LVS1, PM8018_LVS1, 1),
  1015. MSM_RPM_MAP(9615, NCP_0, NCP, 2),
  1016. MSM_RPM_MAP(9615, CXO_BUFFERS, CXO_BUFFERS, 1),
  1017. MSM_RPM_MAP(9615, USB_OTG_SWITCH, USB_OTG_SWITCH, 1),
  1018. MSM_RPM_MAP(9615, HDMI_SWITCH, HDMI_SWITCH, 1),
  1019. MSM_RPM_MAP(9615, VOLTAGE_CORNER, VOLTAGE_CORNER, 1),
  1020. },
  1021. .target_status = {
  1022. MSM_RPM_STATUS_ID_MAP(9615, VERSION_MAJOR),
  1023. MSM_RPM_STATUS_ID_MAP(9615, VERSION_MINOR),
  1024. MSM_RPM_STATUS_ID_MAP(9615, VERSION_BUILD),
  1025. MSM_RPM_STATUS_ID_MAP(9615, SUPPORTED_RESOURCES_0),
  1026. MSM_RPM_STATUS_ID_MAP(9615, SUPPORTED_RESOURCES_1),
  1027. MSM_RPM_STATUS_ID_MAP(9615, SUPPORTED_RESOURCES_2),
  1028. MSM_RPM_STATUS_ID_MAP(9615, RESERVED_SUPPORTED_RESOURCES_0),
  1029. MSM_RPM_STATUS_ID_MAP(9615, SEQUENCE),
  1030. MSM_RPM_STATUS_ID_MAP(9615, RPM_CTL),
  1031. MSM_RPM_STATUS_ID_MAP(9615, CXO_CLK),
  1032. MSM_RPM_STATUS_ID_MAP(9615, SYSTEM_FABRIC_CLK),
  1033. MSM_RPM_STATUS_ID_MAP(9615, DAYTONA_FABRIC_CLK),
  1034. MSM_RPM_STATUS_ID_MAP(9615, SFPB_CLK),
  1035. MSM_RPM_STATUS_ID_MAP(9615, CFPB_CLK),
  1036. MSM_RPM_STATUS_ID_MAP(9615, EBI1_CLK),
  1037. MSM_RPM_STATUS_ID_MAP(9615, SYS_FABRIC_CFG_HALT),
  1038. MSM_RPM_STATUS_ID_MAP(9615, SYS_FABRIC_CFG_CLKMOD),
  1039. MSM_RPM_STATUS_ID_MAP(9615, SYS_FABRIC_CFG_IOCTL),
  1040. MSM_RPM_STATUS_ID_MAP(9615, SYSTEM_FABRIC_ARB),
  1041. MSM_RPM_STATUS_ID_MAP(9615, PM8018_S1_0),
  1042. MSM_RPM_STATUS_ID_MAP(9615, PM8018_S1_1),
  1043. MSM_RPM_STATUS_ID_MAP(9615, PM8018_S2_0),
  1044. MSM_RPM_STATUS_ID_MAP(9615, PM8018_S2_1),
  1045. MSM_RPM_STATUS_ID_MAP(9615, PM8018_S3_0),
  1046. MSM_RPM_STATUS_ID_MAP(9615, PM8018_S3_1),
  1047. MSM_RPM_STATUS_ID_MAP(9615, PM8018_S4_0),
  1048. MSM_RPM_STATUS_ID_MAP(9615, PM8018_S4_1),
  1049. MSM_RPM_STATUS_ID_MAP(9615, PM8018_S5_0),
  1050. MSM_RPM_STATUS_ID_MAP(9615, PM8018_S5_1),
  1051. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L1_0),
  1052. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L1_1),
  1053. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L2_0),
  1054. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L2_1),
  1055. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L3_0),
  1056. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L3_1),
  1057. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L4_0),
  1058. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L4_1),
  1059. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L5_0),
  1060. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L5_1),
  1061. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L6_0),
  1062. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L6_1),
  1063. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L7_0),
  1064. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L7_1),
  1065. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L8_0),
  1066. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L8_1),
  1067. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L9_0),
  1068. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L9_1),
  1069. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L10_0),
  1070. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L10_1),
  1071. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L11_0),
  1072. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L11_1),
  1073. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L12_0),
  1074. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L12_1),
  1075. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L13_0),
  1076. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L13_1),
  1077. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L14_0),
  1078. MSM_RPM_STATUS_ID_MAP(9615, PM8018_L14_1),
  1079. MSM_RPM_STATUS_ID_MAP(9615, PM8018_LVS1),
  1080. MSM_RPM_STATUS_ID_MAP(9615, NCP_0),
  1081. MSM_RPM_STATUS_ID_MAP(9615, NCP_1),
  1082. MSM_RPM_STATUS_ID_MAP(9615, CXO_BUFFERS),
  1083. MSM_RPM_STATUS_ID_MAP(9615, USB_OTG_SWITCH),
  1084. MSM_RPM_STATUS_ID_MAP(9615, HDMI_SWITCH),
  1085. MSM_RPM_STATUS_ID_MAP(9615, VOLTAGE_CORNER),
  1086. },
  1087. .target_ctrl_id = {
  1088. MSM_RPM_CTRL_MAP(9615, VERSION_MAJOR),
  1089. MSM_RPM_CTRL_MAP(9615, VERSION_MINOR),
  1090. MSM_RPM_CTRL_MAP(9615, VERSION_BUILD),
  1091. MSM_RPM_CTRL_MAP(9615, REQ_CTX_0),
  1092. MSM_RPM_CTRL_MAP(9615, REQ_SEL_0),
  1093. MSM_RPM_CTRL_MAP(9615, ACK_CTX_0),
  1094. MSM_RPM_CTRL_MAP(9615, ACK_SEL_0),
  1095. },
  1096. .sel_invalidate = MSM_RPM_9615_SEL_INVALIDATE,
  1097. .sel_notification = MSM_RPM_9615_SEL_NOTIFICATION,
  1098. .sel_last = MSM_RPM_9615_SEL_LAST,
  1099. .ver = {3, 0, 0},
  1100. };
  1101. struct platform_device msm9615_rpm_device = {
  1102. .name = "msm_rpm",
  1103. .id = -1,
  1104. };
  1105. static uint16_t msm_mpm_irqs_m2a[MSM_MPM_NR_MPM_IRQS] __initdata = {
  1106. [4] = MSM_GPIO_TO_INT(30),
  1107. [5] = MSM_GPIO_TO_INT(59),
  1108. [6] = MSM_GPIO_TO_INT(81),
  1109. [7] = MSM_GPIO_TO_INT(87),
  1110. [8] = MSM_GPIO_TO_INT(86),
  1111. [9] = MSM_GPIO_TO_INT(2),
  1112. [10] = MSM_GPIO_TO_INT(6),
  1113. [11] = MSM_GPIO_TO_INT(10),
  1114. [12] = MSM_GPIO_TO_INT(14),
  1115. [13] = MSM_GPIO_TO_INT(18),
  1116. [14] = MSM_GPIO_TO_INT(7),
  1117. [15] = MSM_GPIO_TO_INT(11),
  1118. [16] = MSM_GPIO_TO_INT(15),
  1119. [19] = MSM_GPIO_TO_INT(26),
  1120. [20] = MSM_GPIO_TO_INT(28),
  1121. [22] = USB_HSIC_IRQ,
  1122. [23] = MSM_GPIO_TO_INT(19),
  1123. [24] = MSM_GPIO_TO_INT(23),
  1124. [26] = MSM_GPIO_TO_INT(3),
  1125. [27] = MSM_GPIO_TO_INT(68),
  1126. [29] = MSM_GPIO_TO_INT(78),
  1127. [31] = MSM_GPIO_TO_INT(0),
  1128. [32] = MSM_GPIO_TO_INT(4),
  1129. [33] = MSM_GPIO_TO_INT(22),
  1130. [34] = MSM_GPIO_TO_INT(17),
  1131. [37] = MSM_GPIO_TO_INT(20),
  1132. [39] = MSM_GPIO_TO_INT(84),
  1133. [40] = USB1_HS_IRQ,
  1134. [42] = MSM_GPIO_TO_INT(24),
  1135. [43] = MSM_GPIO_TO_INT(79),
  1136. [44] = MSM_GPIO_TO_INT(80),
  1137. [45] = MSM_GPIO_TO_INT(82),
  1138. [46] = MSM_GPIO_TO_INT(85),
  1139. [47] = MSM_GPIO_TO_INT(45),
  1140. [48] = MSM_GPIO_TO_INT(50),
  1141. [49] = MSM_GPIO_TO_INT(51),
  1142. [50] = MSM_GPIO_TO_INT(69),
  1143. [51] = MSM_GPIO_TO_INT(77),
  1144. [52] = MSM_GPIO_TO_INT(1),
  1145. [53] = MSM_GPIO_TO_INT(5),
  1146. [54] = MSM_GPIO_TO_INT(40),
  1147. [55] = MSM_GPIO_TO_INT(27),
  1148. };
  1149. static uint16_t msm_mpm_bypassed_apps_irqs[] __initdata = {
  1150. TLMM_MSM_SUMMARY_IRQ,
  1151. RPM_APCC_CPU0_GP_HIGH_IRQ,
  1152. RPM_APCC_CPU0_GP_MEDIUM_IRQ,
  1153. RPM_APCC_CPU0_GP_LOW_IRQ,
  1154. RPM_APCC_CPU0_WAKE_UP_IRQ,
  1155. MSS_TO_APPS_IRQ_0,
  1156. MSS_TO_APPS_IRQ_1,
  1157. LPASS_SCSS_GP_LOW_IRQ,
  1158. LPASS_SCSS_GP_MEDIUM_IRQ,
  1159. LPASS_SCSS_GP_HIGH_IRQ,
  1160. SPS_MTI_31,
  1161. A2_BAM_IRQ,
  1162. USB1_HS_BAM_IRQ,
  1163. };
  1164. struct msm_mpm_device_data msm9615_mpm_dev_data __initdata = {
  1165. .irqs_m2a = msm_mpm_irqs_m2a,
  1166. .irqs_m2a_size = ARRAY_SIZE(msm_mpm_irqs_m2a),
  1167. .bypassed_apps_irqs = msm_mpm_bypassed_apps_irqs,
  1168. .bypassed_apps_irqs_size = ARRAY_SIZE(msm_mpm_bypassed_apps_irqs),
  1169. .mpm_request_reg_base = MSM_RPM_BASE + 0x9d8,
  1170. .mpm_status_reg_base = MSM_RPM_BASE + 0xdf8,
  1171. .mpm_apps_ipc_reg = MSM_APCS_GCC_BASE + 0x008,
  1172. .mpm_apps_ipc_val = BIT(1),
  1173. .mpm_ipc_irq = RPM_APCC_CPU0_GP_MEDIUM_IRQ,
  1174. };
  1175. static uint8_t spm_wfi_cmd_sequence[] __initdata = {
  1176. 0x00, 0x03, 0x00, 0x0f,
  1177. };
  1178. static uint8_t spm_power_collapse_without_rpm[] __initdata = {
  1179. 0x34, 0x24, 0x14, 0x04,
  1180. 0x54, 0x03, 0x54, 0x04,
  1181. 0x14, 0x24, 0x3e, 0x0f,
  1182. };
  1183. static uint8_t spm_power_collapse_with_rpm[] __initdata = {
  1184. 0x34, 0x24, 0x14, 0x04,
  1185. 0x54, 0x07, 0x54, 0x04,
  1186. 0x14, 0x24, 0x3e, 0x0f,
  1187. };
  1188. static struct msm_spm_seq_entry msm_spm_seq_list[] __initdata = {
  1189. [0] = {
  1190. .mode = MSM_SPM_MODE_CLOCK_GATING,
  1191. .notify_rpm = false,
  1192. .cmd = spm_wfi_cmd_sequence,
  1193. },
  1194. [1] = {
  1195. .mode = MSM_SPM_MODE_POWER_COLLAPSE,
  1196. .notify_rpm = false,
  1197. .cmd = spm_power_collapse_without_rpm,
  1198. },
  1199. [2] = {
  1200. .mode = MSM_SPM_MODE_POWER_COLLAPSE,
  1201. .notify_rpm = true,
  1202. .cmd = spm_power_collapse_with_rpm,
  1203. },
  1204. };
  1205. static struct msm_spm_platform_data msm_spm_data[] __initdata = {
  1206. [0] = {
  1207. .reg_base_addr = MSM_SAW0_BASE,
  1208. .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01,
  1209. .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1001,
  1210. .num_modes = ARRAY_SIZE(msm_spm_seq_list),
  1211. .modes = msm_spm_seq_list,
  1212. },
  1213. };
  1214. static struct msm_rpmrs_level msm_rpmrs_levels[] __initdata = {
  1215. {
  1216. MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT,
  1217. MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE),
  1218. true,
  1219. 100, 8000, 100000, 1,
  1220. },
  1221. {
  1222. MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE,
  1223. MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE),
  1224. true,
  1225. 2000, 5000, 60100000, 3000,
  1226. },
  1227. {
  1228. MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
  1229. MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE),
  1230. false,
  1231. 6300, 5000, 60350000, 3500,
  1232. },
  1233. {
  1234. MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
  1235. MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, MAX, ACTIVE),
  1236. false,
  1237. 13300, 2000, 71850000, 6800,
  1238. },
  1239. {
  1240. MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
  1241. MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, RET_HIGH, RET_LOW),
  1242. false,
  1243. 28300, 0, 76350000, 9800,
  1244. },
  1245. };
  1246. static struct msm_rpmrs_platform_data msm_rpmrs_data __initdata = {
  1247. .levels = &msm_rpmrs_levels[0],
  1248. .num_levels = ARRAY_SIZE(msm_rpmrs_levels),
  1249. .vdd_mem_levels = {
  1250. [MSM_RPMRS_VDD_MEM_RET_LOW] = 750000,
  1251. [MSM_RPMRS_VDD_MEM_RET_HIGH] = 750000,
  1252. [MSM_RPMRS_VDD_MEM_ACTIVE] = 1050000,
  1253. [MSM_RPMRS_VDD_MEM_MAX] = 1150000,
  1254. },
  1255. .vdd_dig_levels = {
  1256. [MSM_RPMRS_VDD_DIG_RET_LOW] = 0,
  1257. [MSM_RPMRS_VDD_DIG_RET_HIGH] = 0,
  1258. [MSM_RPMRS_VDD_DIG_ACTIVE] = 1,
  1259. [MSM_RPMRS_VDD_DIG_MAX] = 3,
  1260. },
  1261. .vdd_mask = 0x7FFFFF,
  1262. .rpmrs_target_id = {
  1263. [MSM_RPMRS_ID_PXO_CLK] = MSM_RPM_ID_CXO_CLK,
  1264. [MSM_RPMRS_ID_L2_CACHE_CTL] = MSM_RPM_ID_LAST,
  1265. [MSM_RPMRS_ID_VDD_DIG_0] = MSM_RPM_ID_VOLTAGE_CORNER,
  1266. [MSM_RPMRS_ID_VDD_DIG_1] = MSM_RPM_ID_LAST,
  1267. [MSM_RPMRS_ID_VDD_MEM_0] = MSM_RPM_ID_PM8018_L9_0,
  1268. [MSM_RPMRS_ID_VDD_MEM_1] = MSM_RPM_ID_PM8018_L9_1,
  1269. [MSM_RPMRS_ID_RPM_CTL] = MSM_RPM_ID_RPM_CTL,
  1270. },
  1271. };
  1272. static struct msm_rpmstats_platform_data msm_rpm_stat_pdata = {
  1273. .version = 1,
  1274. };
  1275. static struct resource msm_rpm_stat_resource[] = {
  1276. {
  1277. .start = 0x0010D204,
  1278. .end = 0x0010D204 + SZ_8K,
  1279. .flags = IORESOURCE_MEM,
  1280. .name = "phys_addr_base"
  1281. },
  1282. };
  1283. struct platform_device msm9615_rpm_stat_device = {
  1284. .name = "msm_rpm_stat",
  1285. .id = -1,
  1286. .resource = msm_rpm_stat_resource,
  1287. .num_resources = ARRAY_SIZE(msm_rpm_stat_resource),
  1288. .dev = {
  1289. .platform_data = &msm_rpm_stat_pdata,
  1290. }
  1291. };
  1292. static struct resource resources_rpm_master_stats[] = {
  1293. {
  1294. .start = MSM9615_RPM_MASTER_STATS_BASE,
  1295. .end = MSM9615_RPM_MASTER_STATS_BASE + SZ_256,
  1296. .flags = IORESOURCE_MEM,
  1297. },
  1298. };
  1299. static char *master_names[] = {
  1300. "KPSS",
  1301. "MPSS",
  1302. "LPASS",
  1303. };
  1304. static struct msm_rpm_master_stats_platform_data msm_rpm_master_stat_pdata = {
  1305. .masters = master_names,
  1306. .num_masters = ARRAY_SIZE(master_names),
  1307. .master_offset = 32,
  1308. };
  1309. struct platform_device msm9615_rpm_master_stat_device = {
  1310. .name = "msm_rpm_master_stats",
  1311. .id = -1,
  1312. .num_resources = ARRAY_SIZE(resources_rpm_master_stats),
  1313. .resource = resources_rpm_master_stats,
  1314. .dev = {
  1315. .platform_data = &msm_rpm_master_stat_pdata,
  1316. },
  1317. };
  1318. static struct msm_rpm_log_platform_data msm_rpm_log_pdata = {
  1319. .phys_addr_base = 0x0010AC00,
  1320. .reg_offsets = {
  1321. [MSM_RPM_LOG_PAGE_INDICES] = 0x00000080,
  1322. [MSM_RPM_LOG_PAGE_BUFFER] = 0x000000A0,
  1323. },
  1324. .phys_size = SZ_8K,
  1325. .log_len = 4096, /* log's buffer length in bytes */
  1326. .log_len_mask = (4096 >> 2) - 1, /* length mask in units of u32 */
  1327. };
  1328. struct platform_device msm9615_rpm_log_device = {
  1329. .name = "msm_rpm_log",
  1330. .id = -1,
  1331. .dev = {
  1332. .platform_data = &msm_rpm_log_pdata,
  1333. },
  1334. };
  1335. static struct msm_pm_init_data_type msm_pm_data = {
  1336. .use_sync_timer = false,
  1337. .pc_mode = MSM_PM_PC_NOTZ_L2_EXT,
  1338. };
  1339. struct platform_device msm9615_pm_8x60 = {
  1340. .name = "pm-8x60",
  1341. .id = -1,
  1342. .dev = {
  1343. .platform_data = &msm_pm_data,
  1344. },
  1345. };
  1346. uint32_t __init msm9615_rpm_get_swfi_latency(void)
  1347. {
  1348. int i;
  1349. for (i = 0; i < ARRAY_SIZE(msm_rpmrs_levels); i++) {
  1350. if (msm_rpmrs_levels[i].sleep_mode ==
  1351. MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)
  1352. return msm_rpmrs_levels[i].latency_us;
  1353. }
  1354. return 0;
  1355. }
  1356. struct android_usb_platform_data msm_android_usb_pdata = {
  1357. .usb_core_id = 0,
  1358. };
  1359. struct platform_device msm_android_usb_device = {
  1360. .name = "android_usb",
  1361. .id = -1,
  1362. .dev = {
  1363. .platform_data = &msm_android_usb_pdata,
  1364. },
  1365. };
  1366. struct android_usb_platform_data msm_android_usb_hsic_pdata = {
  1367. .usb_core_id = 1,
  1368. };
  1369. struct platform_device msm_android_usb_hsic_device = {
  1370. .name = "android_usb_hsic",
  1371. .id = -1,
  1372. .dev = {
  1373. .platform_data = &msm_android_usb_hsic_pdata,
  1374. },
  1375. };
  1376. static struct resource msm_gpio_resources[] = {
  1377. {
  1378. .start = TLMM_MSM_SUMMARY_IRQ,
  1379. .end = TLMM_MSM_SUMMARY_IRQ,
  1380. .flags = IORESOURCE_IRQ,
  1381. },
  1382. };
  1383. static struct msm_gpio_pdata msm9615_gpio_pdata = {
  1384. .ngpio = 88,
  1385. .direct_connect_irqs = 8,
  1386. };
  1387. struct platform_device msm_gpio_device = {
  1388. .name = "msmgpio",
  1389. .id = -1,
  1390. .num_resources = ARRAY_SIZE(msm_gpio_resources),
  1391. .resource = msm_gpio_resources,
  1392. .dev.platform_data = &msm9615_gpio_pdata,
  1393. };
  1394. void __init msm9615_device_init(void)
  1395. {
  1396. msm_spm_init(msm_spm_data, ARRAY_SIZE(msm_spm_data));
  1397. BUG_ON(msm_rpm_init(&msm9615_rpm_data));
  1398. BUG_ON(msm_rpmrs_levels_init(&msm_rpmrs_data));
  1399. msm_android_usb_pdata.swfi_latency =
  1400. msm_rpmrs_levels[0].latency_us;
  1401. msm_android_usb_hsic_pdata.swfi_latency =
  1402. msm_rpmrs_levels[0].latency_us;
  1403. }
  1404. #define MSM_SHARED_RAM_PHYS 0x40000000
  1405. void __init msm9615_map_io(void)
  1406. {
  1407. msm_shared_ram_phys = MSM_SHARED_RAM_PHYS;
  1408. msm_map_msm9615_io();
  1409. l2x0_cache_init();
  1410. if (socinfo_init() < 0)
  1411. pr_err("socinfo_init() failed!\n");
  1412. }
  1413. void __init msm9615_init_irq(void)
  1414. {
  1415. struct msm_mpm_device_data *data = NULL;
  1416. #ifdef CONFIG_MSM_MPM
  1417. data = &msm9615_mpm_dev_data;
  1418. #endif
  1419. msm_mpm_irq_extn_init(data);
  1420. gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE,
  1421. (void *)MSM_QGIC_CPU_BASE);
  1422. }
  1423. struct platform_device msm_bus_9615_sys_fabric = {
  1424. .name = "msm_bus_fabric",
  1425. .id = MSM_BUS_FAB_SYSTEM,
  1426. };
  1427. struct platform_device msm_bus_def_fab = {
  1428. .name = "msm_bus_fabric",
  1429. .id = MSM_BUS_FAB_DEFAULT,
  1430. };
  1431. #ifdef CONFIG_FB_MSM_EBI2
  1432. static void __init msm_register_device(struct platform_device *pdev, void *data)
  1433. {
  1434. int ret;
  1435. pdev->dev.platform_data = data;
  1436. ret = platform_device_register(pdev);
  1437. if (ret)
  1438. dev_err(&pdev->dev,
  1439. "%s: platform_device_register() failed = %d\n",
  1440. __func__, ret);
  1441. }
  1442. void __init msm_fb_register_device(char *name, void *data)
  1443. {
  1444. if (!strncmp(name, "ebi2", 4))
  1445. msm_register_device(&msm_ebi2_lcdc_device, data);
  1446. else
  1447. pr_err("%s: unknown device! %s\n", __func__, name);
  1448. }
  1449. #endif