blob: f52d312ffbaaf45c32843b61a8dcce71b3ab6ce4 [file] [log] [blame]
David Collinsb4558422012-01-05 10:50:49 -08001/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002 *
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/kernel.h>
14#include <linux/platform_device.h>
15#include <linux/io.h>
16#include <linux/irq.h>
17#include <linux/i2c.h>
18#include <linux/i2c/sx150x.h>
19#include <linux/i2c/isl9519.h>
20#include <linux/gpio.h>
21#include <linux/msm_ssbi.h>
22#include <linux/regulator/gpio-regulator.h>
23#include <linux/mfd/pm8xxx/pm8921.h>
24#include <linux/mfd/pm8xxx/pm8xxx-adc.h>
25#include <linux/regulator/consumer.h>
26#include <linux/spi/spi.h>
27#include <linux/slimbus/slimbus.h>
28#include <linux/bootmem.h>
29#include <linux/msm_kgsl.h>
30#ifdef CONFIG_ANDROID_PMEM
31#include <linux/android_pmem.h>
32#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080033#include <linux/dma-mapping.h>
34#include <linux/platform_data/qcom_crypto_device.h>
35#include <linux/platform_data/qcom_wcnss_device.h>
36#include <linux/leds.h>
37#include <linux/leds-pm8xxx.h>
38#include <linux/i2c/atmel_mxt_ts.h>
39#include <linux/msm_tsens.h>
40#include <linux/ks8851.h>
41#include <linux/i2c/isa1200.h>
Anirudh Ghayaleb3af972011-12-13 17:29:06 +053042#include <linux/gpio_keys.h>
Jack Cheung6ce8f682012-01-17 10:35:42 -080043#include <linux/memory.h>
Hanumant Singheea62562012-05-14 11:32:45 -070044#include <linux/memblock.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080045
Asish Bhattacharyab86c3472012-02-15 08:31:52 +053046#include <linux/slimbus/slimbus.h>
47#include <linux/mfd/wcd9xxx/core.h>
48#include <linux/mfd/wcd9xxx/pdata.h>
49
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080050#include <asm/mach-types.h>
51#include <asm/mach/arch.h>
52#include <asm/setup.h>
53#include <asm/hardware/gic.h>
54#include <asm/mach/mmc.h>
55
56#include <mach/board.h>
57#include <mach/msm_iomap.h>
58#include <mach/msm_spi.h>
59#ifdef CONFIG_USB_MSM_OTG_72K
60#include <mach/msm_hsusb.h>
61#else
62#include <linux/usb/msm_hsusb.h>
63#endif
64#include <linux/usb/android.h>
65#include <mach/usbdiag.h>
66#include <mach/socinfo.h>
67#include <mach/rpm.h>
68#include <mach/gpio.h>
69#include <mach/gpiomux.h>
70#include <mach/msm_bus_board.h>
71#include <mach/msm_memtypes.h>
72#include <mach/dma.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080073#include <mach/msm_xo.h>
74#include <mach/restart.h>
75
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080076#include <linux/ion.h>
77#include <mach/ion.h>
78#include <mach/mdm2.h>
Laura Abbottf8c03b92012-02-16 14:57:58 -080079#include <mach/msm_rtb.h>
Hanumant Singheea62562012-05-14 11:32:45 -070080#include <linux/fmem.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080081
82#include "timer.h"
83#include "devices.h"
84#include "devices-msm8x60.h"
85#include "spm.h"
Matt Wagantall7cca4642012-02-01 16:43:24 -080086#include "pm.h"
Abhijeet Dharmapurikarefaca4f2011-12-27 16:24:07 -080087#include <mach/cpuidle.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080088#include "rpm_resources.h"
Subhash Jadavani909e04f2012-04-12 10:52:50 +053089#include <mach/mpm.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080090#include "acpuclock.h"
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080091#include "smd_private.h"
92#include "pm-boot.h"
93#include "msm_watchdog.h"
Jay Chokshi06fa7542011-12-07 13:09:17 -080094#include "board-8930.h"
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080095
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080096static struct platform_device msm_fm_platform_init = {
97 .name = "iris_fm",
98 .id = -1,
99};
100
101#define KS8851_RST_GPIO 89
102#define KS8851_IRQ_GPIO 90
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800103#define HAP_SHIFT_LVL_OE_GPIO 47
104
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800105#if defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE)
106
107struct sx150x_platform_data msm8930_sx150x_data[] = {
108 [SX150X_CAM] = {
109 .gpio_base = GPIO_CAM_EXPANDER_BASE,
110 .oscio_is_gpo = false,
111 .io_pullup_ena = 0x0,
112 .io_pulldn_ena = 0xc0,
113 .io_open_drain_ena = 0x0,
114 .irq_summary = -1,
115 },
116};
117
118#endif
119
Olav Haugana21169d2012-01-04 09:17:06 -0800120#define MSM_PMEM_ADSP_SIZE 0x7800000
Asish Bhattacharya9ed880f2012-04-12 08:33:37 +0530121#define MSM_PMEM_AUDIO_SIZE 0x4CF000
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800122#ifdef CONFIG_FB_MSM_HDMI_AS_PRIMARY
123#define MSM_PMEM_SIZE 0x4000000 /* 64 Mbytes */
124#else
Olav Hauganb88eef12012-01-15 10:59:26 -0800125#define MSM_PMEM_SIZE 0x2800000 /* 40 Mbytes */
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800126#endif
Hanumant Singheea62562012-05-14 11:32:45 -0700127#define MSM_LIQUID_PMEM_SIZE 0x4000000 /* 64 Mbytes */
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800128
129#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
Asish Bhattacharya9ed880f2012-04-12 08:33:37 +0530130#define MSM_PMEM_KERNEL_EBI1_SIZE 0x65000
Olav Hauganb88eef12012-01-15 10:59:26 -0800131#define MSM_ION_SF_SIZE MSM_PMEM_SIZE
Olav Hauganb88eef12012-01-15 10:59:26 -0800132#define MSM_ION_MM_SIZE MSM_PMEM_ADSP_SIZE
Olav Haugan3a9bd232012-02-15 14:23:27 -0800133#define MSM_ION_QSECOM_SIZE 0x300000 /* (3MB) */
Hanumant Singheea62562012-05-14 11:32:45 -0700134#define MSM_ION_HEAP_NUM 8
135
136
137#define MSM_ION_MM_FW_SIZE 0x200000 /* (2MB) */
Olav Hauganb5be7992011-11-18 14:29:02 -0800138#define MSM_ION_MFC_SIZE SZ_8K
Olav Haugan7355db02012-01-13 16:59:13 -0800139#define MSM_ION_AUDIO_SIZE MSM_PMEM_AUDIO_SIZE
Hanumant Singheea62562012-05-14 11:32:45 -0700140
141#define MSM_LIQUID_ION_MM_SIZE (MSM_ION_MM_SIZE + 0x600000)
142#define MSM_LIQUID_ION_SF_SIZE MSM_LIQUID_PMEM_SIZE
143#define MSM_HDMI_PRIM_ION_SF_SIZE MSM_HDMI_PRIM_PMEM_SIZE
144
145#define MSM8930_FIXED_AREA_START 0xa0000000
146#define MAX_FIXED_AREA_SIZE 0x10000000
147#define MSM_MM_FW_SIZE 0x200000
148#define MSM8930_FW_START (MSM8930_FIXED_AREA_START - MSM_MM_FW_SIZE)
149
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800150#else
151#define MSM_PMEM_KERNEL_EBI1_SIZE 0x110C000
Olav Hauganb5be7992011-11-18 14:29:02 -0800152#define MSM_ION_HEAP_NUM 1
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800153#endif
154
155#ifdef CONFIG_KERNEL_PMEM_EBI_REGION
156static unsigned pmem_kernel_ebi1_size = MSM_PMEM_KERNEL_EBI1_SIZE;
157static int __init pmem_kernel_ebi1_size_setup(char *p)
158{
159 pmem_kernel_ebi1_size = memparse(p, NULL);
160 return 0;
161}
162early_param("pmem_kernel_ebi1_size", pmem_kernel_ebi1_size_setup);
163#endif
164
165#ifdef CONFIG_ANDROID_PMEM
166static unsigned pmem_size = MSM_PMEM_SIZE;
167static int __init pmem_size_setup(char *p)
168{
169 pmem_size = memparse(p, NULL);
170 return 0;
171}
172early_param("pmem_size", pmem_size_setup);
173
174static unsigned pmem_adsp_size = MSM_PMEM_ADSP_SIZE;
175
176static int __init pmem_adsp_size_setup(char *p)
177{
178 pmem_adsp_size = memparse(p, NULL);
179 return 0;
180}
181early_param("pmem_adsp_size", pmem_adsp_size_setup);
182
183static unsigned pmem_audio_size = MSM_PMEM_AUDIO_SIZE;
184
185static int __init pmem_audio_size_setup(char *p)
186{
187 pmem_audio_size = memparse(p, NULL);
188 return 0;
189}
190early_param("pmem_audio_size", pmem_audio_size_setup);
191#endif
192
193#ifdef CONFIG_ANDROID_PMEM
194#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
195static struct android_pmem_platform_data android_pmem_pdata = {
196 .name = "pmem",
197 .allocator_type = PMEM_ALLOCATORTYPE_ALLORNOTHING,
198 .cached = 1,
199 .memory_type = MEMTYPE_EBI1,
200};
201
Laura Abbottb93525f2012-04-12 09:57:19 -0700202static struct platform_device msm8930_android_pmem_device = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800203 .name = "android_pmem",
204 .id = 0,
205 .dev = {.platform_data = &android_pmem_pdata},
206};
207
208static struct android_pmem_platform_data android_pmem_adsp_pdata = {
209 .name = "pmem_adsp",
210 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
211 .cached = 0,
212 .memory_type = MEMTYPE_EBI1,
213};
Laura Abbottb93525f2012-04-12 09:57:19 -0700214static struct platform_device msm8930_android_pmem_adsp_device = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800215 .name = "android_pmem",
216 .id = 2,
217 .dev = { .platform_data = &android_pmem_adsp_pdata },
218};
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800219
220static struct android_pmem_platform_data android_pmem_audio_pdata = {
221 .name = "pmem_audio",
222 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
223 .cached = 0,
224 .memory_type = MEMTYPE_EBI1,
225};
226
Laura Abbottb93525f2012-04-12 09:57:19 -0700227static struct platform_device msm8930_android_pmem_audio_device = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800228 .name = "android_pmem",
229 .id = 4,
230 .dev = { .platform_data = &android_pmem_audio_pdata },
231};
Asish Bhattacharya5d63c4b2012-04-12 08:41:12 +0530232#endif /* CONFIG_MSM_MULTIMEDIA_USE_ION */
233#endif /* CONFIG_ANDROID_PMEM */
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800234
Hanumant Singheea62562012-05-14 11:32:45 -0700235struct fmem_platform_data msm8930_fmem_pdata = {
236};
237
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800238#define DSP_RAM_BASE_8960 0x8da00000
239#define DSP_RAM_SIZE_8960 0x1800000
240static int dspcrashd_pdata_8960 = 0xDEADDEAD;
241
242static struct resource resources_dspcrashd_8960[] = {
243 {
244 .name = "msm_dspcrashd",
245 .start = DSP_RAM_BASE_8960,
246 .end = DSP_RAM_BASE_8960 + DSP_RAM_SIZE_8960,
247 .flags = IORESOURCE_DMA,
248 },
249};
250
251static struct platform_device msm_device_dspcrashd_8960 = {
252 .name = "msm_dspcrashd",
253 .num_resources = ARRAY_SIZE(resources_dspcrashd_8960),
254 .resource = resources_dspcrashd_8960,
255 .dev = { .platform_data = &dspcrashd_pdata_8960 },
256};
257
258static struct memtype_reserve msm8930_reserve_table[] __initdata = {
259 [MEMTYPE_SMI] = {
260 },
261 [MEMTYPE_EBI0] = {
262 .flags = MEMTYPE_FLAGS_1M_ALIGN,
263 },
264 [MEMTYPE_EBI1] = {
265 .flags = MEMTYPE_FLAGS_1M_ALIGN,
266 },
267};
268
Laura Abbottf8c03b92012-02-16 14:57:58 -0800269
270static void __init reserve_rtb_memory(void)
271{
272#if defined(CONFIG_MSM_RTB)
Laura Abbottb93525f2012-04-12 09:57:19 -0700273 msm8930_reserve_table[MEMTYPE_EBI1].size += msm8930_rtb_pdata.size;
Laura Abbottf8c03b92012-02-16 14:57:58 -0800274#endif
275}
276
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800277static void __init size_pmem_devices(void)
278{
279#ifdef CONFIG_ANDROID_PMEM
280#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
281 android_pmem_adsp_pdata.size = pmem_adsp_size;
282 android_pmem_pdata.size = pmem_size;
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800283 android_pmem_audio_pdata.size = MSM_PMEM_AUDIO_SIZE;
Asish Bhattacharya5d63c4b2012-04-12 08:41:12 +0530284#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/
285#endif /*CONFIG_ANDROID_PMEM*/
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800286}
287
Asish Bhattacharya5d63c4b2012-04-12 08:41:12 +0530288#ifdef CONFIG_ANDROID_PMEM
289#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800290static void __init reserve_memory_for(struct android_pmem_platform_data *p)
291{
292 msm8930_reserve_table[p->memory_type].size += p->size;
293}
Asish Bhattacharya5d63c4b2012-04-12 08:41:12 +0530294#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/
295#endif /*CONFIG_ANDROID_PMEM*/
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800296
297static void __init reserve_pmem_memory(void)
298{
299#ifdef CONFIG_ANDROID_PMEM
300#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
301 reserve_memory_for(&android_pmem_adsp_pdata);
302 reserve_memory_for(&android_pmem_pdata);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800303 reserve_memory_for(&android_pmem_audio_pdata);
Asish Bhattacharya5d63c4b2012-04-12 08:41:12 +0530304#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800305 msm8930_reserve_table[MEMTYPE_EBI1].size += pmem_kernel_ebi1_size;
Asish Bhattacharya5d63c4b2012-04-12 08:41:12 +0530306#endif /*CONFIG_ANDROID_PMEM*/
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800307}
308
309static int msm8930_paddr_to_memtype(unsigned int paddr)
310{
311 return MEMTYPE_EBI1;
312}
313
Hanumant Singheea62562012-05-14 11:32:45 -0700314#define FMEM_ENABLED 1
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800315#ifdef CONFIG_ION_MSM
Olav Haugan0703dbf2011-12-19 17:53:38 -0800316#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
Laura Abbottb93525f2012-04-12 09:57:19 -0700317static struct ion_cp_heap_pdata cp_mm_msm8930_ion_pdata = {
Olav Haugan0703dbf2011-12-19 17:53:38 -0800318 .permission_type = IPT_TYPE_MM_CARVEOUT,
Olav Haugan42ebe712012-01-10 16:30:58 -0800319 .align = PAGE_SIZE,
Hanumant Singheea62562012-05-14 11:32:45 -0700320 .reusable = FMEM_ENABLED,
321 .mem_is_fmem = FMEM_ENABLED,
322 .fixed_position = FIXED_MIDDLE,
Olav Haugan0703dbf2011-12-19 17:53:38 -0800323};
324
Laura Abbottb93525f2012-04-12 09:57:19 -0700325static struct ion_cp_heap_pdata cp_mfc_msm8930_ion_pdata = {
Olav Haugan0703dbf2011-12-19 17:53:38 -0800326 .permission_type = IPT_TYPE_MFC_SHAREDMEM,
Olav Haugan42ebe712012-01-10 16:30:58 -0800327 .align = PAGE_SIZE,
Hanumant Singheea62562012-05-14 11:32:45 -0700328 .reusable = 0,
329 .mem_is_fmem = FMEM_ENABLED,
330 .fixed_position = FIXED_HIGH,
Olav Haugan0703dbf2011-12-19 17:53:38 -0800331};
Hanumant Singheea62562012-05-14 11:32:45 -0700332
Laura Abbottb93525f2012-04-12 09:57:19 -0700333static struct ion_co_heap_pdata co_msm8930_ion_pdata = {
Olav Haugan42ebe712012-01-10 16:30:58 -0800334 .adjacent_mem_id = INVALID_HEAP_ID,
335 .align = PAGE_SIZE,
Hanumant Singheea62562012-05-14 11:32:45 -0700336 .mem_is_fmem = 0,
Olav Haugan42ebe712012-01-10 16:30:58 -0800337};
Hanumant Singheea62562012-05-14 11:32:45 -0700338
Laura Abbottb93525f2012-04-12 09:57:19 -0700339static struct ion_co_heap_pdata fw_co_msm8930_ion_pdata = {
Olav Haugan42ebe712012-01-10 16:30:58 -0800340 .adjacent_mem_id = ION_CP_MM_HEAP_ID,
341 .align = SZ_128K,
Hanumant Singheea62562012-05-14 11:32:45 -0700342 .mem_is_fmem = FMEM_ENABLED,
343 .fixed_position = FIXED_LOW,
Olav Haugan0703dbf2011-12-19 17:53:38 -0800344};
345#endif
Olav Haugan9cdfc2f2012-02-15 09:52:57 -0800346
347/**
348 * These heaps are listed in the order they will be allocated. Due to
349 * video hardware restrictions and content protection the FW heap has to
350 * be allocated adjacent (below) the MM heap and the MFC heap has to be
351 * allocated after the MM heap to ensure MFC heap is not more than 256MB
352 * away from the base address of the FW heap.
353 * However, the order of FW heap and MM heap doesn't matter since these
354 * two heaps are taken care of by separate code to ensure they are adjacent
355 * to each other.
356 * Don't swap the order unless you know what you are doing!
357 */
Laura Abbottb93525f2012-04-12 09:57:19 -0700358static struct ion_platform_data msm8930_ion_pdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800359 .nr = MSM_ION_HEAP_NUM,
360 .heaps = {
361 {
Olav Hauganb5be7992011-11-18 14:29:02 -0800362 .id = ION_SYSTEM_HEAP_ID,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800363 .type = ION_HEAP_TYPE_SYSTEM,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800364 .name = ION_VMALLOC_HEAP_NAME,
365 },
366#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
367 {
Olav Hauganb5be7992011-11-18 14:29:02 -0800368 .id = ION_CP_MM_HEAP_ID,
Olav Haugan0a852512012-01-09 10:20:55 -0800369 .type = ION_HEAP_TYPE_CP,
Olav Hauganb5be7992011-11-18 14:29:02 -0800370 .name = ION_MM_HEAP_NAME,
371 .size = MSM_ION_MM_SIZE,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800372 .memory_type = ION_EBI_TYPE,
Laura Abbottb93525f2012-04-12 09:57:19 -0700373 .extra_data = (void *) &cp_mm_msm8930_ion_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800374 },
Olav Hauganb5be7992011-11-18 14:29:02 -0800375 {
Olav Haugan42ebe712012-01-10 16:30:58 -0800376 .id = ION_MM_FIRMWARE_HEAP_ID,
377 .type = ION_HEAP_TYPE_CARVEOUT,
378 .name = ION_MM_FIRMWARE_HEAP_NAME,
379 .size = MSM_ION_MM_FW_SIZE,
380 .memory_type = ION_EBI_TYPE,
Laura Abbottb93525f2012-04-12 09:57:19 -0700381 .extra_data = (void *) &fw_co_msm8930_ion_pdata,
Olav Haugan42ebe712012-01-10 16:30:58 -0800382 },
383 {
Olav Hauganb5be7992011-11-18 14:29:02 -0800384 .id = ION_CP_MFC_HEAP_ID,
Olav Haugan0a852512012-01-09 10:20:55 -0800385 .type = ION_HEAP_TYPE_CP,
Olav Hauganb5be7992011-11-18 14:29:02 -0800386 .name = ION_MFC_HEAP_NAME,
387 .size = MSM_ION_MFC_SIZE,
388 .memory_type = ION_EBI_TYPE,
Laura Abbottb93525f2012-04-12 09:57:19 -0700389 .extra_data = (void *) &cp_mfc_msm8930_ion_pdata,
Olav Hauganb5be7992011-11-18 14:29:02 -0800390 },
391 {
Olav Haugan9cdfc2f2012-02-15 09:52:57 -0800392 .id = ION_SF_HEAP_ID,
393 .type = ION_HEAP_TYPE_CARVEOUT,
394 .name = ION_SF_HEAP_NAME,
395 .size = MSM_ION_SF_SIZE,
396 .memory_type = ION_EBI_TYPE,
Laura Abbottb93525f2012-04-12 09:57:19 -0700397 .extra_data = (void *) &co_msm8930_ion_pdata,
Olav Haugan9cdfc2f2012-02-15 09:52:57 -0800398 },
399 {
Olav Hauganb5be7992011-11-18 14:29:02 -0800400 .id = ION_IOMMU_HEAP_ID,
401 .type = ION_HEAP_TYPE_IOMMU,
402 .name = ION_IOMMU_HEAP_NAME,
403 },
Olav Haugan80854eb2012-01-12 12:00:23 -0800404 {
405 .id = ION_QSECOM_HEAP_ID,
406 .type = ION_HEAP_TYPE_CARVEOUT,
407 .name = ION_QSECOM_HEAP_NAME,
408 .size = MSM_ION_QSECOM_SIZE,
409 .memory_type = ION_EBI_TYPE,
Laura Abbottb93525f2012-04-12 09:57:19 -0700410 .extra_data = (void *) &co_msm8930_ion_pdata,
Olav Haugan80854eb2012-01-12 12:00:23 -0800411 },
Olav Haugan7355db02012-01-13 16:59:13 -0800412 {
413 .id = ION_AUDIO_HEAP_ID,
414 .type = ION_HEAP_TYPE_CARVEOUT,
415 .name = ION_AUDIO_HEAP_NAME,
416 .size = MSM_ION_AUDIO_SIZE,
417 .memory_type = ION_EBI_TYPE,
Laura Abbottb93525f2012-04-12 09:57:19 -0700418 .extra_data = (void *) &co_msm8930_ion_pdata,
Olav Haugan7355db02012-01-13 16:59:13 -0800419 },
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800420#endif
421 }
422};
423
Laura Abbottb93525f2012-04-12 09:57:19 -0700424static struct platform_device msm8930_ion_dev = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800425 .name = "ion-msm",
426 .id = 1,
Laura Abbottb93525f2012-04-12 09:57:19 -0700427 .dev = { .platform_data = &msm8930_ion_pdata },
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800428};
429#endif
430
Hanumant Singheea62562012-05-14 11:32:45 -0700431struct platform_device msm8930_fmem_device = {
432 .name = "fmem",
433 .id = 1,
434 .dev = { .platform_data = &msm8930_fmem_pdata },
435};
436
437static void __init reserve_mem_for_ion(enum ion_memory_types mem_type,
438 unsigned long size)
439{
440 msm8930_reserve_table[mem_type].size += size;
441}
442
443static void __init msm8930_reserve_fixed_area(unsigned long fixed_area_size)
444{
445#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION)
446 int ret;
447
448 if (fixed_area_size > MAX_FIXED_AREA_SIZE)
449 panic("fixed area size is larger than %dM\n",
450 MAX_FIXED_AREA_SIZE >> 20);
451
452 reserve_info->fixed_area_size = fixed_area_size;
453 reserve_info->fixed_area_start = MSM8930_FW_START;
454
455 ret = memblock_remove(reserve_info->fixed_area_start,
456 reserve_info->fixed_area_size);
457 BUG_ON(ret);
458#endif
459}
460
461/**
462 * Reserve memory for ION and calculate amount of reusable memory for fmem.
463 * We only reserve memory for heaps that are not reusable. However, we only
464 * support one reusable heap at the moment so we ignore the reusable flag for
465 * other than the first heap with reusable flag set. Also handle special case
466 * for video heaps (MM,FW, and MFC). Video requires heaps MM and MFC to be
467 * at a higher address than FW in addition to not more than 256MB away from the
468 * base address of the firmware. This means that if MM is reusable the other
469 * two heaps must be allocated in the same region as FW. This is handled by the
470 * mem_is_fmem flag in the platform data. In addition the MM heap must be
471 * adjacent to the FW heap for content protection purposes.
472 */
Stephen Boyd668d7652012-04-25 11:31:01 -0700473static void __init reserve_ion_memory(void)
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800474{
475#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION)
Hanumant Singheea62562012-05-14 11:32:45 -0700476 unsigned int i;
477 unsigned int reusable_count = 0;
478 unsigned int fixed_size = 0;
479 unsigned int fixed_low_size, fixed_middle_size, fixed_high_size;
480 unsigned long fixed_low_start, fixed_middle_start, fixed_high_start;
481
482 msm8930_fmem_pdata.size = 0;
483 msm8930_fmem_pdata.reserved_size_low = 0;
484 msm8930_fmem_pdata.reserved_size_high = 0;
485 fixed_low_size = 0;
486 fixed_middle_size = 0;
487 fixed_high_size = 0;
488
489 /* We only support 1 reusable heap. Check if more than one heap
490 * is specified as reusable and set as non-reusable if found.
491 */
492 for (i = 0; i < msm8930_ion_pdata.nr; ++i) {
493 const struct ion_platform_heap *heap =
494 &(msm8930_ion_pdata.heaps[i]);
495
496 if (heap->type == ION_HEAP_TYPE_CP && heap->extra_data) {
497 struct ion_cp_heap_pdata *data = heap->extra_data;
498
499 reusable_count += (data->reusable) ? 1 : 0;
500
501 if (data->reusable && reusable_count > 1) {
502 pr_err("%s: Too many heaps specified as "
503 "reusable. Heap %s was not configured "
504 "as reusable.\n", __func__, heap->name);
505 data->reusable = 0;
506 }
507 }
508 }
509
510 for (i = 0; i < msm8930_ion_pdata.nr; ++i) {
511 const struct ion_platform_heap *heap =
512 &(msm8930_ion_pdata.heaps[i]);
513
514 if (heap->extra_data) {
515 int fixed_position = NOT_FIXED;
516 int mem_is_fmem = 0;
517
518 switch (heap->type) {
519 case ION_HEAP_TYPE_CP:
520 mem_is_fmem = ((struct ion_cp_heap_pdata *)
521 heap->extra_data)->mem_is_fmem;
522 fixed_position = ((struct ion_cp_heap_pdata *)
523 heap->extra_data)->fixed_position;
524 break;
525 case ION_HEAP_TYPE_CARVEOUT:
526 mem_is_fmem = ((struct ion_co_heap_pdata *)
527 heap->extra_data)->mem_is_fmem;
528 fixed_position = ((struct ion_co_heap_pdata *)
529 heap->extra_data)->fixed_position;
530 break;
531 default:
532 break;
533 }
534
535 if (fixed_position != NOT_FIXED)
536 fixed_size += heap->size;
537 else
538 reserve_mem_for_ion(MEMTYPE_EBI1, heap->size);
539
540 if (fixed_position == FIXED_LOW)
541 fixed_low_size += heap->size;
542 else if (fixed_position == FIXED_MIDDLE)
543 fixed_middle_size += heap->size;
544 else if (fixed_position == FIXED_HIGH)
545 fixed_high_size += heap->size;
546
547 if (mem_is_fmem)
548 msm8930_fmem_pdata.size += heap->size;
549 }
550 }
551
552 if (!fixed_size)
553 return;
554
555 if (msm8930_fmem_pdata.size) {
556 msm8930_fmem_pdata.reserved_size_low = fixed_low_size;
557 msm8930_fmem_pdata.reserved_size_high = fixed_high_size;
558 }
559
560 /* Since the fixed area may be carved out of lowmem,
561 * make sure the length is a multiple of 1M.
562 */
563 fixed_size = (fixed_size + MSM_MM_FW_SIZE + SECTION_SIZE - 1)
564 & SECTION_MASK;
565 msm8930_reserve_fixed_area(fixed_size);
566
567 fixed_low_start = MSM8930_FIXED_AREA_START;
568 fixed_middle_start = fixed_low_start + fixed_low_size;
569 fixed_high_start = fixed_middle_start + fixed_middle_size;
570
571 for (i = 0; i < msm8930_ion_pdata.nr; ++i) {
572 struct ion_platform_heap *heap = &(msm8930_ion_pdata.heaps[i]);
573
574 if (heap->extra_data) {
575 int fixed_position = NOT_FIXED;
576
577 switch (heap->type) {
578 case ION_HEAP_TYPE_CP:
579 fixed_position = ((struct ion_cp_heap_pdata *)
580 heap->extra_data)->fixed_position;
581 break;
582 case ION_HEAP_TYPE_CARVEOUT:
583 fixed_position = ((struct ion_co_heap_pdata *)
584 heap->extra_data)->fixed_position;
585 break;
586 default:
587 break;
588 }
589
590 switch (fixed_position) {
591 case FIXED_LOW:
592 heap->base = fixed_low_start;
593 break;
594 case FIXED_MIDDLE:
595 heap->base = fixed_middle_start;
596 break;
597 case FIXED_HIGH:
598 heap->base = fixed_high_start;
599 break;
600 default:
601 break;
602 }
603 }
604 }
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800605#endif
606}
Huaibin Yanga5419422011-12-08 23:52:10 -0800607
608static void __init reserve_mdp_memory(void)
609{
610 msm8930_mdp_writeback(msm8930_reserve_table);
611}
612
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800613static void __init msm8930_calculate_reserve_sizes(void)
614{
615 size_pmem_devices();
616 reserve_pmem_memory();
617 reserve_ion_memory();
Huaibin Yanga5419422011-12-08 23:52:10 -0800618 reserve_mdp_memory();
Laura Abbottf8c03b92012-02-16 14:57:58 -0800619 reserve_rtb_memory();
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800620}
621
622static struct reserve_info msm8930_reserve_info __initdata = {
623 .memtype_reserve_table = msm8930_reserve_table,
624 .calculate_reserve_sizes = msm8930_calculate_reserve_sizes,
Hanumant Singheea62562012-05-14 11:32:45 -0700625 .reserve_fixed_area = msm8930_reserve_fixed_area,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800626 .paddr_to_memtype = msm8930_paddr_to_memtype,
627};
628
629static int msm8930_memory_bank_size(void)
630{
631 return 1<<29;
632}
633
634static void __init locate_unstable_memory(void)
635{
636 struct membank *mb = &meminfo.bank[meminfo.nr_banks - 1];
637 unsigned long bank_size;
638 unsigned long low, high;
639
640 bank_size = msm8930_memory_bank_size();
641 low = meminfo.bank[0].start;
642 high = mb->start + mb->size;
643
644 /* Check if 32 bit overflow occured */
645 if (high < mb->start)
Hanumant Singheea62562012-05-14 11:32:45 -0700646 high -= PAGE_SIZE;
647
648 if (high < MAX_FIXED_AREA_SIZE + MSM8930_FIXED_AREA_START)
649 panic("fixed area extends beyond end of memory\n");
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800650
651 low &= ~(bank_size - 1);
652
653 if (high - low <= bank_size)
Hanumant Singheea62562012-05-14 11:32:45 -0700654 goto no_dmm;
Larry Basselb8d61022012-02-24 10:49:45 -0800655
656 msm8930_reserve_info.bank_size = bank_size;
657#ifdef CONFIG_ENABLE_DMM
Jack Cheung6ce8f682012-01-17 10:35:42 -0800658 msm8930_reserve_info.low_unstable_address = mb->start -
659 MIN_MEMORY_BLOCK_SIZE + mb->size;
660 msm8930_reserve_info.max_unstable_size = MIN_MEMORY_BLOCK_SIZE;
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800661 pr_info("low unstable address %lx max size %lx bank size %lx\n",
662 msm8930_reserve_info.low_unstable_address,
663 msm8930_reserve_info.max_unstable_size,
664 msm8930_reserve_info.bank_size);
Hanumant Singheea62562012-05-14 11:32:45 -0700665 return;
Larry Basselb8d61022012-02-24 10:49:45 -0800666#endif
Hanumant Singheea62562012-05-14 11:32:45 -0700667no_dmm:
668 msm8930_reserve_info.low_unstable_address = high;
669 msm8930_reserve_info.max_unstable_size = 0;
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800670}
671
672static void __init place_movable_zone(void)
673{
Larry Basselb8d61022012-02-24 10:49:45 -0800674#ifdef CONFIG_ENABLE_DMM
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800675 movable_reserved_start = msm8930_reserve_info.low_unstable_address;
676 movable_reserved_size = msm8930_reserve_info.max_unstable_size;
677 pr_info("movable zone start %lx size %lx\n",
678 movable_reserved_start, movable_reserved_size);
Larry Basselb8d61022012-02-24 10:49:45 -0800679#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800680}
681
682static void __init msm8930_early_memory(void)
683{
684 reserve_info = &msm8930_reserve_info;
685 locate_unstable_memory();
686 place_movable_zone();
687}
688
689static void __init msm8930_reserve(void)
690{
691 msm_reserve();
Hanumant Singheea62562012-05-14 11:32:45 -0700692 if (msm8930_fmem_pdata.size) {
693#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION)
694 if (reserve_info->fixed_area_size) {
695 msm8930_fmem_pdata.phys =
696 reserve_info->fixed_area_start + MSM_MM_FW_SIZE;
697 pr_info("mm fw at %lx (fixed) size %x\n",
698 reserve_info->fixed_area_start, MSM_MM_FW_SIZE);
699 pr_info("fmem start %lx (fixed) size %lx\n",
700 msm8930_fmem_pdata.phys, msm8930_fmem_pdata.size);
701 }
702#endif
703 }
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800704}
705
706static int msm8930_change_memory_power(u64 start, u64 size,
707 int change_type)
708{
709 return soc_change_memory_power(start, size, change_type);
710}
711
712static void __init msm8930_allocate_memory_regions(void)
713{
714 msm8930_allocate_fb_region();
715}
716
Asish Bhattacharyab86c3472012-02-15 08:31:52 +0530717#ifdef CONFIG_WCD9304_CODEC
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800718
Asish Bhattacharyab86c3472012-02-15 08:31:52 +0530719#define SITAR_INTERRUPT_BASE (NR_MSM_IRQS + NR_GPIO_IRQS + NR_PM8921_IRQS)
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800720
721/* Micbias setting is based on 8660 CDP/MTP/FLUID requirement
722 * 4 micbiases are used to power various analog and digital
723 * microphones operating at 1800 mV. Technically, all micbiases
724 * can source from single cfilter since all microphones operate
725 * at the same voltage level. The arrangement below is to make
726 * sure all cfilters are exercised. LDO_H regulator ouput level
727 * does not need to be as high as 2.85V. It is choosen for
728 * microphone sensitivity purpose.
729 */
Asish Bhattacharyab86c3472012-02-15 08:31:52 +0530730static struct wcd9xxx_pdata sitar_platform_data = {
731 .slimbus_slave_device = {
732 .name = "sitar-slave",
733 .e_addr = {0, 0, 0x00, 0, 0x17, 2},
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800734 },
735 .irq = MSM_GPIO_TO_INT(62),
Asish Bhattacharyab86c3472012-02-15 08:31:52 +0530736 .irq_base = SITAR_INTERRUPT_BASE,
Asish Bhattacharyab1aeae22012-02-15 08:29:28 +0530737 .num_irqs = NR_WCD9XXX_IRQS,
Asish Bhattacharyab86c3472012-02-15 08:31:52 +0530738 .reset_gpio = 42,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800739 .micbias = {
Asish Bhattacharyab86c3472012-02-15 08:31:52 +0530740 .ldoh_v = SITAR_LDOH_2P85_V,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800741 .cfilt1_mv = 1800,
742 .cfilt2_mv = 1800,
Asish Bhattacharyab86c3472012-02-15 08:31:52 +0530743 .bias1_cfilt_sel = SITAR_CFILT1_SEL,
744 .bias2_cfilt_sel = SITAR_CFILT2_SEL,
745 },
746 .regulator = {
747 {
748 .name = "CDC_VDD_CP",
David Collins226f2512012-03-19 13:18:39 -0700749 .min_uV = 1950000,
Asish Bhattacharyab86c3472012-02-15 08:31:52 +0530750 .max_uV = 2200000,
751 .optimum_uA = WCD9XXX_CDC_VDDA_CP_CUR_MAX,
752 },
753 {
754 .name = "CDC_VDDA_RX",
755 .min_uV = 1800000,
756 .max_uV = 1800000,
757 .optimum_uA = WCD9XXX_CDC_VDDA_RX_CUR_MAX,
758 },
759 {
760 .name = "CDC_VDDA_TX",
761 .min_uV = 1800000,
762 .max_uV = 1800000,
763 .optimum_uA = WCD9XXX_CDC_VDDA_TX_CUR_MAX,
764 },
765 {
766 .name = "VDDIO_CDC",
767 .min_uV = 1800000,
768 .max_uV = 1800000,
769 .optimum_uA = WCD9XXX_VDDIO_CDC_CUR_MAX,
770 },
771 {
772 .name = "VDDD_CDC_D",
773 .min_uV = 1200000,
774 .max_uV = 1200000,
775 .optimum_uA = WCD9XXX_VDDD_CDC_D_CUR_MAX,
776 },
777 {
778 .name = "CDC_VDDA_A_1P2V",
779 .min_uV = 1200000,
780 .max_uV = 1200000,
781 .optimum_uA = WCD9XXX_VDDD_CDC_A_CUR_MAX,
782 },
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800783 },
784};
785
Asish Bhattacharyab86c3472012-02-15 08:31:52 +0530786static struct slim_device msm_slim_sitar = {
787 .name = "sitar-slim",
788 .e_addr = {0, 1, 0x00, 0, 0x17, 2},
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800789 .dev = {
Asish Bhattacharyab86c3472012-02-15 08:31:52 +0530790 .platform_data = &sitar_platform_data,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800791 },
792};
793#endif
794
Asish Bhattacharyab86c3472012-02-15 08:31:52 +0530795
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800796static struct slim_boardinfo msm_slim_devices[] = {
Asish Bhattacharyab86c3472012-02-15 08:31:52 +0530797#ifdef CONFIG_WCD9304_CODEC
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800798 {
799 .bus_num = 1,
Asish Bhattacharyab86c3472012-02-15 08:31:52 +0530800 .slim_slave = &msm_slim_sitar,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800801 },
802#endif
803 /* add more slimbus slaves as needed */
804};
805
806#define MSM_WCNSS_PHYS 0x03000000
807#define MSM_WCNSS_SIZE 0x280000
808
809static struct resource resources_wcnss_wlan[] = {
810 {
811 .start = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ,
812 .end = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ,
813 .name = "wcnss_wlanrx_irq",
814 .flags = IORESOURCE_IRQ,
815 },
816 {
817 .start = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ,
818 .end = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ,
819 .name = "wcnss_wlantx_irq",
820 .flags = IORESOURCE_IRQ,
821 },
822 {
823 .start = MSM_WCNSS_PHYS,
824 .end = MSM_WCNSS_PHYS + MSM_WCNSS_SIZE - 1,
825 .name = "wcnss_mmio",
826 .flags = IORESOURCE_MEM,
827 },
828 {
829 .start = 84,
830 .end = 88,
831 .name = "wcnss_gpios_5wire",
832 .flags = IORESOURCE_IO,
833 },
834};
835
836static struct qcom_wcnss_opts qcom_wcnss_pdata = {
837 .has_48mhz_xo = 1,
838};
839
840static struct platform_device msm_device_wcnss_wlan = {
841 .name = "wcnss_wlan",
842 .id = 0,
843 .num_resources = ARRAY_SIZE(resources_wcnss_wlan),
844 .resource = resources_wcnss_wlan,
845 .dev = {.platform_data = &qcom_wcnss_pdata},
846};
847
Ramesh Masavarapua26cce72012-04-09 12:32:25 -0700848#ifdef CONFIG_QSEECOM
849/* qseecom bus scaling */
850static struct msm_bus_vectors qseecom_clks_init_vectors[] = {
851 {
852 .src = MSM_BUS_MASTER_SPS,
853 .dst = MSM_BUS_SLAVE_EBI_CH0,
854 .ib = 0,
855 .ab = 0,
856 },
857 {
858 .src = MSM_BUS_MASTER_SPDM,
859 .dst = MSM_BUS_SLAVE_SPDM,
860 .ib = 0,
861 .ab = 0,
862 },
863};
864
865static struct msm_bus_vectors qseecom_enable_dfab_vectors[] = {
866 {
867 .src = MSM_BUS_MASTER_SPS,
868 .dst = MSM_BUS_SLAVE_EBI_CH0,
869 .ib = (492 * 8) * 1000000UL,
870 .ab = (492 * 8) * 100000UL,
871 },
872 {
873 .src = MSM_BUS_MASTER_SPDM,
874 .dst = MSM_BUS_SLAVE_SPDM,
875 .ib = 0,
876 .ab = 0,
877 },
878};
879
880static struct msm_bus_vectors qseecom_enable_sfpb_vectors[] = {
881 {
882 .src = MSM_BUS_MASTER_SPS,
883 .dst = MSM_BUS_SLAVE_EBI_CH0,
884 .ib = 0,
885 .ab = 0,
886 },
887 {
888 .src = MSM_BUS_MASTER_SPDM,
889 .dst = MSM_BUS_SLAVE_SPDM,
890 .ib = (64 * 8) * 1000000UL,
891 .ab = (64 * 8) * 100000UL,
892 },
893};
894
895static struct msm_bus_paths qseecom_hw_bus_scale_usecases[] = {
896 {
897 ARRAY_SIZE(qseecom_clks_init_vectors),
898 qseecom_clks_init_vectors,
899 },
900 {
901 ARRAY_SIZE(qseecom_enable_dfab_vectors),
902 qseecom_enable_sfpb_vectors,
903 },
904 {
905 ARRAY_SIZE(qseecom_enable_sfpb_vectors),
906 qseecom_enable_sfpb_vectors,
907 },
908};
909
910static struct msm_bus_scale_pdata qseecom_bus_pdata = {
911 qseecom_hw_bus_scale_usecases,
912 ARRAY_SIZE(qseecom_hw_bus_scale_usecases),
913 .name = "qsee",
914};
915
916static struct platform_device qseecom_device = {
917 .name = "qseecom",
918 .id = 0,
919 .dev = {
920 .platform_data = &qseecom_bus_pdata,
921 },
922};
923#endif
924
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800925#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
926 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) || \
927 defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
928 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
929
930#define QCE_SIZE 0x10000
931#define QCE_0_BASE 0x18500000
932
933#define QCE_HW_KEY_SUPPORT 0
934#define QCE_SHA_HMAC_SUPPORT 1
935#define QCE_SHARE_CE_RESOURCE 1
936#define QCE_CE_SHARED 0
937
938static struct resource qcrypto_resources[] = {
939 [0] = {
940 .start = QCE_0_BASE,
941 .end = QCE_0_BASE + QCE_SIZE - 1,
942 .flags = IORESOURCE_MEM,
943 },
944 [1] = {
945 .name = "crypto_channels",
946 .start = DMOV_CE_IN_CHAN,
947 .end = DMOV_CE_OUT_CHAN,
948 .flags = IORESOURCE_DMA,
949 },
950 [2] = {
951 .name = "crypto_crci_in",
952 .start = DMOV_CE_IN_CRCI,
953 .end = DMOV_CE_IN_CRCI,
954 .flags = IORESOURCE_DMA,
955 },
956 [3] = {
957 .name = "crypto_crci_out",
958 .start = DMOV_CE_OUT_CRCI,
959 .end = DMOV_CE_OUT_CRCI,
960 .flags = IORESOURCE_DMA,
961 },
962};
963
964static struct resource qcedev_resources[] = {
965 [0] = {
966 .start = QCE_0_BASE,
967 .end = QCE_0_BASE + QCE_SIZE - 1,
968 .flags = IORESOURCE_MEM,
969 },
970 [1] = {
971 .name = "crypto_channels",
972 .start = DMOV_CE_IN_CHAN,
973 .end = DMOV_CE_OUT_CHAN,
974 .flags = IORESOURCE_DMA,
975 },
976 [2] = {
977 .name = "crypto_crci_in",
978 .start = DMOV_CE_IN_CRCI,
979 .end = DMOV_CE_IN_CRCI,
980 .flags = IORESOURCE_DMA,
981 },
982 [3] = {
983 .name = "crypto_crci_out",
984 .start = DMOV_CE_OUT_CRCI,
985 .end = DMOV_CE_OUT_CRCI,
986 .flags = IORESOURCE_DMA,
987 },
988};
989
990#endif
991
992#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
993 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE)
994
995static struct msm_ce_hw_support qcrypto_ce_hw_suppport = {
996 .ce_shared = QCE_CE_SHARED,
997 .shared_ce_resource = QCE_SHARE_CE_RESOURCE,
998 .hw_key_support = QCE_HW_KEY_SUPPORT,
999 .sha_hmac = QCE_SHA_HMAC_SUPPORT,
1000};
1001
1002static struct platform_device qcrypto_device = {
1003 .name = "qcrypto",
1004 .id = 0,
1005 .num_resources = ARRAY_SIZE(qcrypto_resources),
1006 .resource = qcrypto_resources,
1007 .dev = {
1008 .coherent_dma_mask = DMA_BIT_MASK(32),
1009 .platform_data = &qcrypto_ce_hw_suppport,
1010 },
1011};
1012#endif
1013
1014#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
1015 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
1016
1017static struct msm_ce_hw_support qcedev_ce_hw_suppport = {
1018 .ce_shared = QCE_CE_SHARED,
1019 .shared_ce_resource = QCE_SHARE_CE_RESOURCE,
1020 .hw_key_support = QCE_HW_KEY_SUPPORT,
1021 .sha_hmac = QCE_SHA_HMAC_SUPPORT,
1022};
1023
1024static struct platform_device qcedev_device = {
1025 .name = "qce",
1026 .id = 0,
1027 .num_resources = ARRAY_SIZE(qcedev_resources),
1028 .resource = qcedev_resources,
1029 .dev = {
1030 .coherent_dma_mask = DMA_BIT_MASK(32),
1031 .platform_data = &qcedev_ce_hw_suppport,
1032 },
1033};
1034#endif
1035
1036#define MDM2AP_ERRFATAL 70
1037#define AP2MDM_ERRFATAL 95
1038#define MDM2AP_STATUS 69
1039#define AP2MDM_STATUS 94
1040#define AP2MDM_PMIC_RESET_N 80
1041#define AP2MDM_KPDPWR_N 81
1042
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001043static struct resource mdm_resources[] = {
1044 {
1045 .start = MDM2AP_ERRFATAL,
1046 .end = MDM2AP_ERRFATAL,
1047 .name = "MDM2AP_ERRFATAL",
1048 .flags = IORESOURCE_IO,
1049 },
1050 {
1051 .start = AP2MDM_ERRFATAL,
1052 .end = AP2MDM_ERRFATAL,
1053 .name = "AP2MDM_ERRFATAL",
1054 .flags = IORESOURCE_IO,
1055 },
1056 {
1057 .start = MDM2AP_STATUS,
1058 .end = MDM2AP_STATUS,
1059 .name = "MDM2AP_STATUS",
1060 .flags = IORESOURCE_IO,
1061 },
1062 {
1063 .start = AP2MDM_STATUS,
1064 .end = AP2MDM_STATUS,
1065 .name = "AP2MDM_STATUS",
1066 .flags = IORESOURCE_IO,
1067 },
1068 {
1069 .start = AP2MDM_PMIC_RESET_N,
1070 .end = AP2MDM_PMIC_RESET_N,
1071 .name = "AP2MDM_PMIC_RESET_N",
1072 .flags = IORESOURCE_IO,
1073 },
1074 {
1075 .start = AP2MDM_KPDPWR_N,
1076 .end = AP2MDM_KPDPWR_N,
1077 .name = "AP2MDM_KPDPWR_N",
1078 .flags = IORESOURCE_IO,
1079 },
1080};
1081
1082static struct mdm_platform_data mdm_platform_data = {
1083 .mdm_version = "2.5",
1084};
1085
1086static struct platform_device mdm_device = {
1087 .name = "mdm2_modem",
1088 .id = -1,
1089 .num_resources = ARRAY_SIZE(mdm_resources),
1090 .resource = mdm_resources,
1091 .dev = {
1092 .platform_data = &mdm_platform_data,
1093 },
1094};
1095
1096static struct platform_device *mdm_devices[] __initdata = {
1097 &mdm_device,
1098};
1099
Praveen Chidambaram78499012011-11-01 17:15:17 -06001100#ifdef CONFIG_MSM_MPM
1101static uint16_t msm_mpm_irqs_m2a[MSM_MPM_NR_MPM_IRQS] __initdata = {
1102 [1] = MSM_GPIO_TO_INT(46),
1103 [2] = MSM_GPIO_TO_INT(150),
1104 [4] = MSM_GPIO_TO_INT(103),
1105 [5] = MSM_GPIO_TO_INT(104),
1106 [6] = MSM_GPIO_TO_INT(105),
1107 [7] = MSM_GPIO_TO_INT(106),
1108 [8] = MSM_GPIO_TO_INT(107),
1109 [9] = MSM_GPIO_TO_INT(7),
1110 [10] = MSM_GPIO_TO_INT(11),
1111 [11] = MSM_GPIO_TO_INT(15),
1112 [12] = MSM_GPIO_TO_INT(19),
1113 [13] = MSM_GPIO_TO_INT(23),
1114 [14] = MSM_GPIO_TO_INT(27),
1115 [15] = MSM_GPIO_TO_INT(31),
1116 [16] = MSM_GPIO_TO_INT(35),
1117 [19] = MSM_GPIO_TO_INT(90),
1118 [20] = MSM_GPIO_TO_INT(92),
1119 [23] = MSM_GPIO_TO_INT(85),
1120 [24] = MSM_GPIO_TO_INT(83),
1121 [25] = USB1_HS_IRQ,
1122 [27] = HDMI_IRQ,
1123 [29] = MSM_GPIO_TO_INT(10),
1124 [30] = MSM_GPIO_TO_INT(102),
1125 [31] = MSM_GPIO_TO_INT(81),
1126 [32] = MSM_GPIO_TO_INT(78),
1127 [33] = MSM_GPIO_TO_INT(94),
1128 [34] = MSM_GPIO_TO_INT(72),
1129 [35] = MSM_GPIO_TO_INT(39),
1130 [36] = MSM_GPIO_TO_INT(43),
1131 [37] = MSM_GPIO_TO_INT(61),
1132 [38] = MSM_GPIO_TO_INT(50),
1133 [39] = MSM_GPIO_TO_INT(42),
1134 [41] = MSM_GPIO_TO_INT(62),
1135 [42] = MSM_GPIO_TO_INT(76),
1136 [43] = MSM_GPIO_TO_INT(75),
1137 [44] = MSM_GPIO_TO_INT(70),
1138 [45] = MSM_GPIO_TO_INT(69),
1139 [46] = MSM_GPIO_TO_INT(67),
1140 [47] = MSM_GPIO_TO_INT(65),
1141 [48] = MSM_GPIO_TO_INT(58),
1142 [49] = MSM_GPIO_TO_INT(54),
1143 [50] = MSM_GPIO_TO_INT(52),
1144 [51] = MSM_GPIO_TO_INT(49),
1145 [52] = MSM_GPIO_TO_INT(40),
1146 [53] = MSM_GPIO_TO_INT(37),
1147 [54] = MSM_GPIO_TO_INT(24),
1148 [55] = MSM_GPIO_TO_INT(14),
1149};
1150
1151static uint16_t msm_mpm_bypassed_apps_irqs[] __initdata = {
1152 TLMM_MSM_SUMMARY_IRQ,
1153 RPM_APCC_CPU0_GP_HIGH_IRQ,
1154 RPM_APCC_CPU0_GP_MEDIUM_IRQ,
1155 RPM_APCC_CPU0_GP_LOW_IRQ,
1156 RPM_APCC_CPU0_WAKE_UP_IRQ,
1157 RPM_APCC_CPU1_GP_HIGH_IRQ,
1158 RPM_APCC_CPU1_GP_MEDIUM_IRQ,
1159 RPM_APCC_CPU1_GP_LOW_IRQ,
1160 RPM_APCC_CPU1_WAKE_UP_IRQ,
1161 MSS_TO_APPS_IRQ_0,
1162 MSS_TO_APPS_IRQ_1,
1163 MSS_TO_APPS_IRQ_2,
1164 MSS_TO_APPS_IRQ_3,
1165 MSS_TO_APPS_IRQ_4,
1166 MSS_TO_APPS_IRQ_5,
1167 MSS_TO_APPS_IRQ_6,
1168 MSS_TO_APPS_IRQ_7,
1169 MSS_TO_APPS_IRQ_8,
1170 MSS_TO_APPS_IRQ_9,
1171 LPASS_SCSS_GP_LOW_IRQ,
1172 LPASS_SCSS_GP_MEDIUM_IRQ,
1173 LPASS_SCSS_GP_HIGH_IRQ,
1174 SPS_MTI_30,
1175 SPS_MTI_31,
1176 RIVA_APSS_SPARE_IRQ,
1177 RIVA_APPS_WLAN_SMSM_IRQ,
1178 RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ,
1179 RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ,
1180};
1181
1182struct msm_mpm_device_data msm8930_mpm_dev_data __initdata = {
1183 .irqs_m2a = msm_mpm_irqs_m2a,
1184 .irqs_m2a_size = ARRAY_SIZE(msm_mpm_irqs_m2a),
1185 .bypassed_apps_irqs = msm_mpm_bypassed_apps_irqs,
1186 .bypassed_apps_irqs_size = ARRAY_SIZE(msm_mpm_bypassed_apps_irqs),
1187 .mpm_request_reg_base = MSM_RPM_BASE + 0x9d8,
1188 .mpm_status_reg_base = MSM_RPM_BASE + 0xdf8,
1189 .mpm_apps_ipc_reg = MSM_APCS_GCC_BASE + 0x008,
1190 .mpm_apps_ipc_val = BIT(1),
1191 .mpm_ipc_irq = RPM_APCC_CPU0_GP_MEDIUM_IRQ,
1192
1193};
1194#endif
1195
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001196#define MSM_SHARED_RAM_PHYS 0x80000000
1197
1198static void __init msm8930_map_io(void)
1199{
1200 msm_shared_ram_phys = MSM_SHARED_RAM_PHYS;
1201 msm_map_msm8930_io();
1202
1203 if (socinfo_init() < 0)
1204 pr_err("socinfo_init() failed!\n");
1205}
1206
1207static void __init msm8930_init_irq(void)
1208{
Praveen Chidambaram78499012011-11-01 17:15:17 -06001209 struct msm_mpm_device_data *data = NULL;
1210#ifdef CONFIG_MSM_MPM
1211 data = &msm8930_mpm_dev_data;
1212#endif
1213
1214 msm_mpm_irq_extn_init(data);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001215 gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE,
1216 (void *)MSM_QGIC_CPU_BASE);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001217}
1218
1219static void __init msm8930_init_buses(void)
1220{
1221#ifdef CONFIG_MSM_BUS_SCALING
1222 msm_bus_rpm_set_mt_mask();
Gagan Maccd5b3272012-02-09 18:13:10 -07001223 msm_bus_8930_apps_fabric_pdata.rpm_enabled = 1;
1224 msm_bus_8930_sys_fabric_pdata.rpm_enabled = 1;
1225 msm_bus_8930_mm_fabric_pdata.rpm_enabled = 1;
1226 msm_bus_8930_apps_fabric.dev.platform_data =
1227 &msm_bus_8930_apps_fabric_pdata;
1228 msm_bus_8930_sys_fabric.dev.platform_data =
1229 &msm_bus_8930_sys_fabric_pdata;
1230 msm_bus_8930_mm_fabric.dev.platform_data =
1231 &msm_bus_8930_mm_fabric_pdata;
1232 msm_bus_8930_sys_fpb.dev.platform_data = &msm_bus_8930_sys_fpb_pdata;
1233 msm_bus_8930_cpss_fpb.dev.platform_data = &msm_bus_8930_cpss_fpb_pdata;
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001234#endif
1235}
1236
1237static struct msm_spi_platform_data msm8960_qup_spi_gsbi1_pdata = {
1238 .max_clock_speed = 15060000,
1239};
1240
1241#ifdef CONFIG_USB_MSM_OTG_72K
1242static struct msm_otg_platform_data msm_otg_pdata;
1243#else
Manu Gautam32ab9462012-02-20 12:33:01 +05301244#ifdef CONFIG_MSM_BUS_SCALING
1245/* Bandwidth requests (zero) if no vote placed */
1246static struct msm_bus_vectors usb_init_vectors[] = {
1247 {
1248 .src = MSM_BUS_MASTER_SPS,
1249 .dst = MSM_BUS_SLAVE_EBI_CH0,
1250 .ab = 0,
1251 .ib = 0,
1252 },
1253};
1254
1255/* Bus bandwidth requests in Bytes/sec */
1256static struct msm_bus_vectors usb_max_vectors[] = {
1257 {
1258 .src = MSM_BUS_MASTER_SPS,
1259 .dst = MSM_BUS_SLAVE_EBI_CH0,
1260 .ab = 60000000, /* At least 480Mbps on bus. */
1261 .ib = 960000000, /* MAX bursts rate */
1262 },
1263};
1264
1265static struct msm_bus_paths usb_bus_scale_usecases[] = {
1266 {
1267 ARRAY_SIZE(usb_init_vectors),
1268 usb_init_vectors,
1269 },
1270 {
1271 ARRAY_SIZE(usb_max_vectors),
1272 usb_max_vectors,
1273 },
1274};
1275
1276static struct msm_bus_scale_pdata usb_bus_scale_pdata = {
1277 usb_bus_scale_usecases,
1278 ARRAY_SIZE(usb_bus_scale_usecases),
1279 .name = "usb",
1280};
1281#endif
1282
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001283static struct msm_otg_platform_data msm_otg_pdata = {
1284 .mode = USB_OTG,
1285 .otg_control = OTG_PMIC_CONTROL,
1286 .phy_type = SNPS_28NM_INTEGRATED_PHY,
Jay Chokshi06fa7542011-12-07 13:09:17 -08001287 .pmic_id_irq = PM8038_USB_ID_IN_IRQ(PM8038_IRQ_BASE),
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001288 .power_budget = 750,
Manu Gautam32ab9462012-02-20 12:33:01 +05301289#ifdef CONFIG_MSM_BUS_SCALING
1290 .bus_scale_table = &usb_bus_scale_pdata,
1291#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001292};
1293#endif
1294
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001295#define PID_MAGIC_ID 0x71432909
1296#define SERIAL_NUM_MAGIC_ID 0x61945374
1297#define SERIAL_NUMBER_LENGTH 127
1298#define DLOAD_USB_BASE_ADD 0x2A03F0C8
1299
1300struct magic_num_struct {
1301 uint32_t pid;
1302 uint32_t serial_num;
1303};
1304
1305struct dload_struct {
1306 uint32_t reserved1;
1307 uint32_t reserved2;
1308 uint32_t reserved3;
1309 uint16_t reserved4;
1310 uint16_t pid;
1311 char serial_number[SERIAL_NUMBER_LENGTH];
1312 uint16_t reserved5;
1313 struct magic_num_struct magic_struct;
1314};
1315
1316static int usb_diag_update_pid_and_serial_num(uint32_t pid, const char *snum)
1317{
1318 struct dload_struct __iomem *dload = 0;
1319
1320 dload = ioremap(DLOAD_USB_BASE_ADD, sizeof(*dload));
1321 if (!dload) {
1322 pr_err("%s: cannot remap I/O memory region: %08x\n",
1323 __func__, DLOAD_USB_BASE_ADD);
1324 return -ENXIO;
1325 }
1326
1327 pr_debug("%s: dload:%p pid:%x serial_num:%s\n",
1328 __func__, dload, pid, snum);
1329 /* update pid */
1330 dload->magic_struct.pid = PID_MAGIC_ID;
1331 dload->pid = pid;
1332
1333 /* update serial number */
1334 dload->magic_struct.serial_num = 0;
1335 if (!snum) {
1336 memset(dload->serial_number, 0, SERIAL_NUMBER_LENGTH);
1337 goto out;
1338 }
1339
1340 dload->magic_struct.serial_num = SERIAL_NUM_MAGIC_ID;
1341 strlcpy(dload->serial_number, snum, SERIAL_NUMBER_LENGTH);
1342out:
1343 iounmap(dload);
1344 return 0;
1345}
1346
1347static struct android_usb_platform_data android_usb_pdata = {
1348 .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num,
1349};
1350
1351static struct platform_device android_usb_device = {
1352 .name = "android_usb",
1353 .id = -1,
1354 .dev = {
1355 .platform_data = &android_usb_pdata,
1356 },
1357};
1358
1359static uint8_t spm_wfi_cmd_sequence[] __initdata = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001360 0x03, 0x0f,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001361};
1362
1363static uint8_t spm_power_collapse_without_rpm[] __initdata = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001364 0x00, 0x24, 0x54, 0x10,
1365 0x09, 0x03, 0x01,
1366 0x10, 0x54, 0x30, 0x0C,
1367 0x24, 0x30, 0x0f,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001368};
1369
1370static uint8_t spm_power_collapse_with_rpm[] __initdata = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001371 0x00, 0x24, 0x54, 0x10,
1372 0x09, 0x07, 0x01, 0x0B,
1373 0x10, 0x54, 0x30, 0x0C,
1374 0x24, 0x30, 0x0f,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001375};
1376
1377static struct msm_spm_seq_entry msm_spm_seq_list[] __initdata = {
1378 [0] = {
1379 .mode = MSM_SPM_MODE_CLOCK_GATING,
1380 .notify_rpm = false,
1381 .cmd = spm_wfi_cmd_sequence,
1382 },
1383 [1] = {
1384 .mode = MSM_SPM_MODE_POWER_COLLAPSE,
1385 .notify_rpm = false,
1386 .cmd = spm_power_collapse_without_rpm,
1387 },
1388 [2] = {
1389 .mode = MSM_SPM_MODE_POWER_COLLAPSE,
1390 .notify_rpm = true,
1391 .cmd = spm_power_collapse_with_rpm,
1392 },
1393};
1394
1395static struct msm_spm_platform_data msm_spm_data[] __initdata = {
1396 [0] = {
1397 .reg_base_addr = MSM_SAW0_BASE,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001398 .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001399#if defined(CONFIG_MSM_AVS_HW)
1400 .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00,
1401 .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00,
1402#endif
1403 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01,
Praveen Chidambarame4b9eb12012-02-28 19:39:58 -07001404 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001405 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C,
1406 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C,
1407 .vctl_timeout_us = 50,
1408 .num_modes = ARRAY_SIZE(msm_spm_seq_list),
1409 .modes = msm_spm_seq_list,
1410 },
1411 [1] = {
1412 .reg_base_addr = MSM_SAW1_BASE,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001413 .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001414#if defined(CONFIG_MSM_AVS_HW)
1415 .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00,
1416 .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00,
1417#endif
1418 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01,
Praveen Chidambarame4b9eb12012-02-28 19:39:58 -07001419 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001420 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C,
1421 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C,
1422 .vctl_timeout_us = 50,
1423 .num_modes = ARRAY_SIZE(msm_spm_seq_list),
1424 .modes = msm_spm_seq_list,
1425 },
1426};
1427
1428static uint8_t l2_spm_wfi_cmd_sequence[] __initdata = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001429 0x00, 0x20, 0x03, 0x20,
1430 0x00, 0x0f,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001431};
1432
1433static uint8_t l2_spm_gdhs_cmd_sequence[] __initdata = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001434 0x00, 0x20, 0x34, 0x64,
1435 0x48, 0x07, 0x48, 0x20,
1436 0x50, 0x64, 0x04, 0x34,
1437 0x50, 0x0f,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001438};
1439static uint8_t l2_spm_power_off_cmd_sequence[] __initdata = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001440 0x00, 0x10, 0x34, 0x64,
1441 0x48, 0x07, 0x48, 0x10,
1442 0x50, 0x64, 0x04, 0x34,
1443 0x50, 0x0F,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001444};
1445
1446static struct msm_spm_seq_entry msm_spm_l2_seq_list[] __initdata = {
1447 [0] = {
1448 .mode = MSM_SPM_L2_MODE_RETENTION,
1449 .notify_rpm = false,
1450 .cmd = l2_spm_wfi_cmd_sequence,
1451 },
1452 [1] = {
1453 .mode = MSM_SPM_L2_MODE_GDHS,
1454 .notify_rpm = true,
1455 .cmd = l2_spm_gdhs_cmd_sequence,
1456 },
1457 [2] = {
1458 .mode = MSM_SPM_L2_MODE_POWER_COLLAPSE,
1459 .notify_rpm = true,
1460 .cmd = l2_spm_power_off_cmd_sequence,
1461 },
1462};
1463
1464static struct msm_spm_platform_data msm_spm_l2_data[] __initdata = {
1465 [0] = {
1466 .reg_base_addr = MSM_SAW_L2_BASE,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001467 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x00,
Praveen Chidambarame4b9eb12012-02-28 19:39:58 -07001468 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001469 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x00A000AE,
1470 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x00A00020,
1471 .modes = msm_spm_l2_seq_list,
1472 .num_modes = ARRAY_SIZE(msm_spm_l2_seq_list),
1473 },
1474};
1475
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301476#define ISA1200_HAP_EN_GPIO 77
1477#define ISA1200_HAP_LEN_GPIO 78
1478#define ISA1200_HAP_CLK PM8038_GPIO_PM_TO_SYS(7)
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001479
1480static int isa1200_power(int on)
1481{
Amy Malocheb20c1052012-04-11 10:36:13 -07001482 int rc = 0;
1483
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301484 gpio_set_value_cansleep(ISA1200_HAP_CLK, !!on);
1485
Amy Malocheb20c1052012-04-11 10:36:13 -07001486 if (on)
1487 rc = pm8xxx_aux_clk_control(CLK_MP3_1, XO_DIV_1, true);
1488 else
1489 rc = pm8xxx_aux_clk_control(CLK_MP3_1, XO_DIV_NONE, true);
1490
1491 if (rc) {
1492 pr_err("%s: unable to write aux clock register(%d)\n",
1493 __func__, rc);
1494 }
1495
1496 return rc;
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001497}
1498
1499static int isa1200_dev_setup(bool enable)
1500{
1501 int rc = 0;
1502
Amy Malocheb20c1052012-04-11 10:36:13 -07001503 if (!enable)
1504 goto fail_gpio_dir;
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301505
1506 rc = gpio_request(ISA1200_HAP_CLK, "haptics_clk");
1507 if (rc) {
1508 pr_err("%s: gpio_request for %d gpio failed rc(%d)\n",
1509 __func__, ISA1200_HAP_CLK, rc);
1510 goto fail_gpio_req;
1511 }
1512
1513 rc = gpio_direction_output(ISA1200_HAP_CLK, 0);
1514 if (rc) {
1515 pr_err("%s: gpio_direction_output failed for %d gpio rc(%d)\n",
1516 __func__, ISA1200_HAP_CLK, rc);
1517 goto fail_gpio_dir;
1518 }
1519
1520 return 0;
1521
1522fail_gpio_dir:
1523 gpio_free(ISA1200_HAP_CLK);
1524fail_gpio_req:
1525 return rc;
1526
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001527}
1528
1529static struct isa1200_regulator isa1200_reg_data[] = {
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301530 {
1531 .name = "vddp",
1532 .min_uV = ISA_I2C_VTG_MIN_UV,
1533 .max_uV = ISA_I2C_VTG_MAX_UV,
1534 .load_uA = ISA_I2C_CURR_UA,
1535 },
Amy Malochee8de95d2012-02-23 10:40:25 -08001536 {
1537 .name = "vcc_i2c",
1538 .min_uV = ISA_I2C_VTG_MIN_UV,
1539 .max_uV = ISA_I2C_VTG_MAX_UV,
1540 .load_uA = ISA_I2C_CURR_UA,
1541 },
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001542};
1543
1544static struct isa1200_platform_data isa1200_1_pdata = {
1545 .name = "vibrator",
1546 .dev_setup = isa1200_dev_setup,
1547 .power_on = isa1200_power,
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301548 .hap_en_gpio = ISA1200_HAP_EN_GPIO,
1549 .hap_len_gpio = ISA1200_HAP_LEN_GPIO,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001550 .max_timeout = 15000,
1551 .mode_ctrl = PWM_GEN_MODE,
1552 .pwm_fd = {
1553 .pwm_div = 256,
1554 },
1555 .is_erm = false,
1556 .smart_en = true,
1557 .ext_clk_en = true,
1558 .chip_en = 1,
1559 .regulator_info = isa1200_reg_data,
1560 .num_regulators = ARRAY_SIZE(isa1200_reg_data),
1561};
1562
1563static struct i2c_board_info msm_isa1200_board_info[] __initdata = {
1564 {
1565 I2C_BOARD_INFO("isa1200_1", 0x90>>1),
1566 .platform_data = &isa1200_1_pdata,
1567 },
1568};
1569
Amy Malochef3c9db42011-12-08 15:17:35 -08001570#define MXT_TS_GPIO_IRQ 11
1571#define MXT_TS_RESET_GPIO 52
1572
1573static const u8 mxt_config_data_8930[] = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001574 /* T6 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001575 0, 0, 0, 0, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001576 /* T38 Object */
Amy Malochec0dbec52012-04-23 10:55:45 -07001577 15, 2, 0, 15, 12, 11, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001578 /* T7 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001579 48, 255, 25,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001580 /* T8 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001581 27, 0, 5, 1, 0, 0, 8, 8, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001582 /* T9 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001583 131, 0, 0, 19, 11, 0, 16, 35, 1, 3,
Amy Malochef8130f92012-02-01 10:38:59 +05301584 10, 15, 1, 11, 4, 5, 40, 10, 43, 4,
1585 54, 2, 0, 0, 0, 0, 143, 40, 143, 80,
Amy Malochef3c9db42011-12-08 15:17:35 -08001586 18, 15, 50, 50, 2,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001587 /* T15 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001588 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1589 0,
1590 /* T18 Object */
1591 0, 0,
1592 /* T19 Object */
1593 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1594 0, 0, 0, 0, 0, 0,
1595 /* T23 Object */
1596 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1597 0, 0, 0, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001598 /* T25 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001599 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1600 0, 0, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001601 /* T40 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001602 0, 0, 0, 0, 0,
1603 /* T42 Object */
1604 0, 0, 0, 0, 0, 0, 0, 0,
1605 /* T46 Object */
1606 0, 3, 16, 48, 0, 0, 1, 0, 0,
1607 /* T47 Object */
1608 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1609 /* T48 Object */
1610 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1611 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1612 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1613 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1614 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1615 0, 0, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001616};
1617
Amy Malochef3c9db42011-12-08 15:17:35 -08001618static ssize_t mxt224e_vkeys_show(struct kobject *kobj,
1619 struct kobj_attribute *attr, char *buf)
1620{
1621 return snprintf(buf, 200,
Amy Malochef8130f92012-02-01 10:38:59 +05301622 __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":57:1030:90:90"
1623 ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":206:1030:90:90"
1624 ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":366:1030:90:90"
1625 ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":503:1030:90:90"
Amy Malochef3c9db42011-12-08 15:17:35 -08001626 "\n");
1627}
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001628
Amy Malochef3c9db42011-12-08 15:17:35 -08001629static struct kobj_attribute mxt224e_vkeys_attr = {
1630 .attr = {
1631 .mode = S_IRUGO,
1632 },
1633 .show = &mxt224e_vkeys_show,
1634};
1635
1636static struct attribute *mxt224e_properties_attrs[] = {
1637 &mxt224e_vkeys_attr.attr,
1638 NULL
1639};
1640
1641static struct attribute_group mxt224e_properties_attr_group = {
1642 .attrs = mxt224e_properties_attrs,
1643};
1644
1645static void mxt_init_vkeys_8930(void)
1646{
1647 int rc;
1648 static struct kobject *mxt224e_properties_kobj;
1649
1650 mxt224e_vkeys_attr.attr.name = "virtualkeys.atmel_mxt_ts";
1651 mxt224e_properties_kobj = kobject_create_and_add("board_properties",
1652 NULL);
1653 if (mxt224e_properties_kobj)
1654 rc = sysfs_create_group(mxt224e_properties_kobj,
1655 &mxt224e_properties_attr_group);
1656 if (!mxt224e_properties_kobj || rc)
1657 pr_err("%s: failed to create board_properties\n",
1658 __func__);
1659
1660 return;
1661}
1662
Jing Lindc4413c2012-01-16 15:22:52 -08001663static struct mxt_config_info mxt_config_array[] = {
1664 {
1665 .config = mxt_config_data_8930,
1666 .config_length = ARRAY_SIZE(mxt_config_data_8930),
1667 .family_id = 0x81,
1668 .variant_id = 0x01,
1669 .version = 0x10,
1670 .build = 0xAA,
1671 },
1672};
1673
Amy Malochef3c9db42011-12-08 15:17:35 -08001674static struct mxt_platform_data mxt_platform_data_8930 = {
Jing Lindc4413c2012-01-16 15:22:52 -08001675 .config_array = mxt_config_array,
1676 .config_array_size = ARRAY_SIZE(mxt_config_array),
Mohan Pallaka56a1a5d2012-02-23 12:05:13 -08001677 .panel_minx = 0,
1678 .panel_maxx = 566,
1679 .panel_miny = 0,
1680 .panel_maxy = 1067,
1681 .disp_minx = 0,
1682 .disp_maxx = 540,
1683 .disp_miny = 0,
1684 .disp_maxy = 960,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001685 .irqflags = IRQF_TRIGGER_FALLING,
Anirudh Ghayald7ad84c2012-01-09 09:17:53 +05301686#ifdef MSM8930_PHASE_2
1687 .digital_pwr_regulator = true,
1688#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001689 .i2c_pull_up = true,
Amy Malochef3c9db42011-12-08 15:17:35 -08001690 .reset_gpio = MXT_TS_RESET_GPIO,
1691 .irq_gpio = MXT_TS_GPIO_IRQ,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001692};
1693
Amy Malochef3c9db42011-12-08 15:17:35 -08001694static struct i2c_board_info mxt_device_info_8930[] __initdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001695 {
Amy Malochef3c9db42011-12-08 15:17:35 -08001696 I2C_BOARD_INFO("atmel_mxt_ts", 0x4a),
1697 .platform_data = &mxt_platform_data_8930,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001698 .irq = MSM_GPIO_TO_INT(MXT_TS_GPIO_IRQ),
1699 },
1700};
1701
Anirudh Ghayaleb3af972011-12-13 17:29:06 +05301702#ifdef MSM8930_PHASE_2
1703
1704#define GPIO_VOLUME_UP PM8038_GPIO_PM_TO_SYS(3)
1705#define GPIO_VOLUME_DOWN PM8038_GPIO_PM_TO_SYS(8)
1706#define GPIO_CAMERA_SNAPSHOT PM8038_GPIO_PM_TO_SYS(10)
1707#define GPIO_CAMERA_FOCUS PM8038_GPIO_PM_TO_SYS(11)
1708
1709static struct gpio_keys_button keys_8930[] = {
1710 {
1711 .code = KEY_VOLUMEUP,
1712 .type = EV_KEY,
1713 .desc = "volume_up",
1714 .gpio = GPIO_VOLUME_UP,
1715 .wakeup = 1,
1716 .active_low = 1,
1717 },
1718 {
1719 .code = KEY_VOLUMEDOWN,
1720 .type = EV_KEY,
1721 .desc = "volume_down",
1722 .gpio = GPIO_VOLUME_DOWN,
1723 .wakeup = 1,
1724 .active_low = 1,
1725 },
1726 {
1727 .code = KEY_CAMERA_FOCUS,
1728 .type = EV_KEY,
1729 .desc = "camera_focus",
1730 .gpio = GPIO_CAMERA_FOCUS,
1731 .wakeup = 1,
1732 .active_low = 1,
1733 },
1734 {
1735 .code = KEY_CAMERA_SNAPSHOT,
1736 .type = EV_KEY,
1737 .desc = "camera_snapshot",
1738 .gpio = GPIO_CAMERA_SNAPSHOT,
1739 .wakeup = 1,
1740 .active_low = 1,
1741 },
1742};
1743
1744/* Add GPIO keys for 8930 */
1745static struct gpio_keys_platform_data gpio_keys_8930_pdata = {
1746 .buttons = keys_8930,
1747 .nbuttons = 4,
1748};
1749
1750static struct platform_device gpio_keys_8930 = {
1751 .name = "gpio-keys",
1752 .id = -1,
1753 .dev = {
1754 .platform_data = &gpio_keys_8930_pdata,
1755 },
1756};
1757#endif /* MSM8930_PHASE_2 */
1758
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001759static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi4_pdata = {
1760 .clk_freq = 100000,
1761 .src_clk_rate = 24000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001762};
1763
1764static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi3_pdata = {
1765 .clk_freq = 100000,
1766 .src_clk_rate = 24000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001767};
1768
Harini Jayaramanfe6ff4162012-03-14 11:25:40 -06001769static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi9_pdata = {
1770 .clk_freq = 100000,
1771 .src_clk_rate = 24000000,
1772};
1773
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001774static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi10_pdata = {
1775 .clk_freq = 100000,
1776 .src_clk_rate = 24000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001777};
1778
1779static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi12_pdata = {
1780 .clk_freq = 100000,
1781 .src_clk_rate = 24000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001782};
1783
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001784
1785static struct ks8851_pdata spi_eth_pdata = {
1786 .irq_gpio = KS8851_IRQ_GPIO,
1787 .rst_gpio = KS8851_RST_GPIO,
1788};
1789
1790static struct spi_board_info spi_board_info[] __initdata = {
1791 {
1792 .modalias = "ks8851",
1793 .irq = MSM_GPIO_TO_INT(KS8851_IRQ_GPIO),
1794 .max_speed_hz = 19200000,
1795 .bus_num = 0,
1796 .chip_select = 0,
1797 .mode = SPI_MODE_0,
1798 .platform_data = &spi_eth_pdata
1799 },
1800 {
1801 .modalias = "dsi_novatek_3d_panel_spi",
1802 .max_speed_hz = 10800000,
1803 .bus_num = 0,
1804 .chip_select = 1,
1805 .mode = SPI_MODE_0,
1806 },
1807};
1808
1809static struct platform_device msm_device_saw_core0 = {
Jay Chokshi06fa7542011-12-07 13:09:17 -08001810 .name = "saw-regulator",
1811 .id = 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001812 .dev = {
David Collinsb4558422012-01-05 10:50:49 -08001813 .platform_data = &msm8930_saw_regulator_core0_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001814 },
1815};
1816
1817static struct platform_device msm_device_saw_core1 = {
Jay Chokshi06fa7542011-12-07 13:09:17 -08001818 .name = "saw-regulator",
1819 .id = 1,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001820 .dev = {
David Collinsb4558422012-01-05 10:50:49 -08001821 .platform_data = &msm8930_saw_regulator_core1_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001822 },
1823};
1824
1825static struct tsens_platform_data msm_tsens_pdata = {
Jay Chokshi06fa7542011-12-07 13:09:17 -08001826 .tsens_factor = 1000,
Siddartha Mohanadoss97425122012-03-09 12:06:54 -08001827 .hw_type = APQ_8064,
Siddartha Mohanadoss892ee472012-05-03 10:35:20 -07001828 .tsens_num_sensor = 10,
1829 .slope = {1132, 1135, 1137, 1135, 1157,
1830 1142, 1124, 1153, 1175, 1166},
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001831};
1832
Siddartha Mohanadoss48cad912012-04-05 21:29:54 -07001833static struct platform_device msm_tsens_device = {
1834 .name = "tsens8960-tm",
1835 .id = -1,
1836};
1837
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001838#ifdef CONFIG_MSM_FAKE_BATTERY
1839static struct platform_device fish_battery_device = {
1840 .name = "fish_battery",
1841};
1842#endif
1843
David Collins1d4061b2011-12-06 15:36:40 -08001844#ifndef MSM8930_PHASE_2
1845
1846/* 8930 Phase 1 */
Jay Chokshi06fa7542011-12-07 13:09:17 -08001847static struct platform_device msm8930_device_ext_5v_vreg __devinitdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001848 .name = GPIO_REGULATOR_DEV_NAME,
1849 .id = PM8921_MPP_PM_TO_SYS(7),
1850 .dev = {
1851 .platform_data = &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_5V],
1852 },
1853};
1854
Jay Chokshi06fa7542011-12-07 13:09:17 -08001855static struct platform_device msm8930_device_ext_l2_vreg __devinitdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001856 .name = GPIO_REGULATOR_DEV_NAME,
1857 .id = 91,
1858 .dev = {
1859 .platform_data = &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_L2],
1860 },
1861};
1862
David Collins1d4061b2011-12-06 15:36:40 -08001863#else
1864
1865/* 8930 Phase 2 */
1866static struct platform_device msm8930_device_ext_5v_vreg __devinitdata = {
1867 .name = GPIO_REGULATOR_DEV_NAME,
1868 .id = 63,
1869 .dev = {
1870 .platform_data =
1871 &msm8930_gpio_regulator_pdata[MSM8930_GPIO_VREG_ID_EXT_5V],
1872 },
1873};
1874
1875static struct platform_device msm8930_device_ext_otg_sw_vreg __devinitdata = {
1876 .name = GPIO_REGULATOR_DEV_NAME,
1877 .id = 97,
1878 .dev = {
1879 .platform_data =
1880 &msm8930_gpio_regulator_pdata[MSM8930_GPIO_VREG_ID_EXT_OTG_SW],
1881 },
1882};
1883
1884#endif
1885
Jay Chokshi06fa7542011-12-07 13:09:17 -08001886static struct platform_device msm8930_device_rpm_regulator __devinitdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001887 .name = "rpm-regulator",
1888 .id = -1,
1889 .dev = {
David Collins8af872e2012-01-06 11:31:56 -08001890#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001891 .platform_data = &msm_rpm_regulator_pdata,
David Collins8af872e2012-01-06 11:31:56 -08001892#else
1893 .platform_data = &msm8930_rpm_regulator_pdata,
Jay Chokshi06fa7542011-12-07 13:09:17 -08001894#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001895 },
1896};
1897
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001898static struct platform_device *common_devices[] __initdata = {
1899 &msm8960_device_dmov,
1900 &msm_device_smd,
1901 &msm8960_device_uart_gsbi5,
1902 &msm_device_uart_dm6,
1903 &msm_device_saw_core0,
1904 &msm_device_saw_core1,
Jay Chokshi06fa7542011-12-07 13:09:17 -08001905 &msm8930_device_ext_5v_vreg,
David Collins1d4061b2011-12-06 15:36:40 -08001906#ifndef MSM8930_PHASE_2
Jay Chokshi06fa7542011-12-07 13:09:17 -08001907 &msm8930_device_ext_l2_vreg,
David Collins1d4061b2011-12-06 15:36:40 -08001908#endif
Jay Chokshi33c044a2011-12-07 13:05:40 -08001909 &msm8960_device_ssbi_pmic,
David Collins1d4061b2011-12-06 15:36:40 -08001910#ifdef MSM8930_PHASE_2
1911 &msm8930_device_ext_otg_sw_vreg,
1912#endif
Stephen Boyd28d54952011-12-16 13:19:51 -08001913 &msm_8960_q6_lpass,
1914 &msm_8960_q6_mss_fw,
1915 &msm_8960_q6_mss_sw,
Stephen Boyd322a9922011-09-20 01:05:54 -07001916 &msm_8960_riva,
Stephen Boydd89eebe2011-09-28 23:28:11 -07001917 &msm_pil_tzapps,
Stephen Boyd7b973de2012-03-09 12:26:16 -08001918 &msm_pil_vidc,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001919 &msm8960_device_qup_spi_gsbi1,
1920 &msm8960_device_qup_i2c_gsbi3,
1921 &msm8960_device_qup_i2c_gsbi4,
Harini Jayaramanfe6ff4162012-03-14 11:25:40 -06001922 &msm8960_device_qup_i2c_gsbi9,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001923 &msm8960_device_qup_i2c_gsbi10,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001924 &msm8960_device_qup_i2c_gsbi12,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001925 &msm_slim_ctrl,
1926 &msm_device_wcnss_wlan,
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07001927#if defined(CONFIG_QSEECOM)
1928 &qseecom_device,
1929#endif
1930
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001931#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
1932 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE)
1933 &qcrypto_device,
1934#endif
1935
1936#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
1937 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
1938 &qcedev_device,
1939#endif
1940#ifdef CONFIG_MSM_ROTATOR
1941 &msm_rotator_device,
1942#endif
1943 &msm_device_sps,
1944#ifdef CONFIG_MSM_FAKE_BATTERY
1945 &fish_battery_device,
1946#endif
1947#ifdef CONFIG_ANDROID_PMEM
1948#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
Laura Abbottb93525f2012-04-12 09:57:19 -07001949 &msm8930_android_pmem_device,
1950 &msm8930_android_pmem_adsp_device,
1951 &msm8930_android_pmem_audio_device,
Asish Bhattacharya5d63c4b2012-04-12 08:41:12 +05301952#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/
1953#endif /*CONFIG_ANDROID_PMEM*/
Hanumant Singheea62562012-05-14 11:32:45 -07001954 &msm8930_fmem_device,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001955 &msm_device_bam_dmux,
1956 &msm_fm_platform_init,
1957
1958#ifdef CONFIG_HW_RANDOM_MSM
1959 &msm_device_rng,
1960#endif
Praveen Chidambaram78499012011-11-01 17:15:17 -06001961 &msm8930_rpm_device,
1962 &msm8930_rpm_log_device,
1963 &msm8930_rpm_stat_device,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001964#ifdef CONFIG_ION_MSM
Laura Abbottb93525f2012-04-12 09:57:19 -07001965 &msm8930_ion_dev,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001966#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001967 &msm_device_tz_log,
1968
1969#ifdef CONFIG_MSM_QDSS
Pratik Patel1403f2a2012-03-21 10:10:00 -07001970 &msm_qdss_device,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001971 &msm_etb_device,
1972 &msm_tpiu_device,
1973 &msm_funnel_device,
Pratik Patel492b3012012-03-06 14:22:30 -08001974 &msm_etm_device,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001975#endif
1976 &msm_device_dspcrashd_8960,
1977 &msm8960_device_watchdog,
Anirudh Ghayaleb3af972011-12-13 17:29:06 +05301978#ifdef MSM8930_PHASE_2
1979 &gpio_keys_8930,
1980#endif
Laura Abbottb93525f2012-04-12 09:57:19 -07001981 &msm8930_rtb_device,
Praveen Chidambaram8ea3dcd2011-12-07 14:46:31 -07001982 &msm8930_cpu_idle_device,
Praveen Chidambaram5c8adf22012-02-23 18:44:37 -07001983 &msm8930_msm_gov_device,
Gagan Maccd5b3272012-02-09 18:13:10 -07001984 &msm_bus_8930_apps_fabric,
1985 &msm_bus_8930_sys_fabric,
1986 &msm_bus_8930_mm_fabric,
1987 &msm_bus_8930_sys_fpb,
1988 &msm_bus_8930_cpss_fpb,
Stepan Moskovchenko28662c52012-03-01 12:48:45 -08001989 &msm8960_device_cache_erp,
Laura Abbott0577d7b2012-04-17 11:14:30 -07001990 &msm8930_iommu_domain_device,
Siddartha Mohanadoss48cad912012-04-05 21:29:54 -07001991 &msm_tsens_device,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001992};
1993
1994static struct platform_device *cdp_devices[] __initdata = {
1995 &msm8960_device_otg,
1996 &msm8960_device_gadget_peripheral,
1997 &msm_device_hsusb_host,
1998 &android_usb_device,
1999 &msm_pcm,
2000 &msm_pcm_routing,
2001 &msm_cpudai0,
2002 &msm_cpudai1,
2003 &msm_cpudai_hdmi_rx,
2004 &msm_cpudai_bt_rx,
2005 &msm_cpudai_bt_tx,
2006 &msm_cpudai_fm_rx,
2007 &msm_cpudai_fm_tx,
2008 &msm_cpudai_auxpcm_rx,
2009 &msm_cpudai_auxpcm_tx,
2010 &msm_cpu_fe,
2011 &msm_stub_codec,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002012#ifdef CONFIG_MSM_GEMINI
2013 &msm8960_gemini_device,
2014#endif
2015 &msm_voice,
2016 &msm_voip,
2017 &msm_lpa_pcm,
2018 &msm_cpudai_afe_01_rx,
2019 &msm_cpudai_afe_01_tx,
2020 &msm_cpudai_afe_02_rx,
2021 &msm_cpudai_afe_02_tx,
2022 &msm_pcm_afe,
Ajay Dudani79e268c2011-12-28 13:14:44 -08002023 &msm_compr_dsp,
2024 &msm_cpudai_incall_music_rx,
2025 &msm_cpudai_incall_record_rx,
2026 &msm_cpudai_incall_record_tx,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002027 &msm_pcm_hostless,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002028};
2029
2030static void __init msm8930_i2c_init(void)
2031{
2032 msm8960_device_qup_i2c_gsbi4.dev.platform_data =
2033 &msm8960_i2c_qup_gsbi4_pdata;
2034
2035 msm8960_device_qup_i2c_gsbi3.dev.platform_data =
2036 &msm8960_i2c_qup_gsbi3_pdata;
2037
Harini Jayaramanfe6ff4162012-03-14 11:25:40 -06002038 msm8960_device_qup_i2c_gsbi9.dev.platform_data =
2039 &msm8960_i2c_qup_gsbi9_pdata;
2040
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002041 msm8960_device_qup_i2c_gsbi10.dev.platform_data =
2042 &msm8960_i2c_qup_gsbi10_pdata;
2043
2044 msm8960_device_qup_i2c_gsbi12.dev.platform_data =
2045 &msm8960_i2c_qup_gsbi12_pdata;
2046}
2047
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002048static struct msm_rpmrs_level msm_rpmrs_levels[] __initdata = {
2049 {
2050 MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT,
2051 MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE),
2052 true,
Praveen Chidambarame3380672012-02-08 10:32:27 -07002053 100, 650, 801, 200,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002054 },
2055
2056 {
2057 MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE,
2058 MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE),
2059 true,
Praveen Chidambarame3380672012-02-08 10:32:27 -07002060 2000, 200, 576000, 2000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002061 },
2062
2063 {
2064 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
2065 MSM_RPMRS_LIMITS(ON, GDHS, MAX, ACTIVE),
2066 false,
Praveen Chidambarame3380672012-02-08 10:32:27 -07002067 8500, 51, 1122000, 8500,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002068 },
2069
2070 {
2071 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
2072 MSM_RPMRS_LIMITS(ON, HSFS_OPEN, MAX, ACTIVE),
2073 false,
Praveen Chidambarame3380672012-02-08 10:32:27 -07002074 9000, 51, 1130300, 9000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002075 },
2076 {
2077 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
2078 MSM_RPMRS_LIMITS(ON, HSFS_OPEN, ACTIVE, RET_HIGH),
2079 false,
Praveen Chidambarame3380672012-02-08 10:32:27 -07002080 10000, 51, 1130300, 10000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002081 },
2082
2083 {
2084 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
2085 MSM_RPMRS_LIMITS(OFF, GDHS, MAX, ACTIVE),
2086 false,
Praveen Chidambarame3380672012-02-08 10:32:27 -07002087 12000, 14, 2205900, 12000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002088 },
2089
2090 {
2091 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
2092 MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, MAX, ACTIVE),
2093 false,
Praveen Chidambarame3380672012-02-08 10:32:27 -07002094 18000, 12, 2364250, 18000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002095 },
2096
2097 {
2098 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
2099 MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, ACTIVE, RET_HIGH),
2100 false,
Praveen Chidambarame3380672012-02-08 10:32:27 -07002101 23500, 10, 2667000, 23500,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002102 },
2103
2104 {
2105 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
2106 MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, RET_HIGH, RET_LOW),
2107 false,
Praveen Chidambarame3380672012-02-08 10:32:27 -07002108 29700, 5, 2867000, 30000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002109 },
2110};
2111
Praveen Chidambaram78499012011-11-01 17:15:17 -06002112static struct msm_rpmrs_platform_data msm_rpmrs_data __initdata = {
2113 .levels = &msm_rpmrs_levels[0],
2114 .num_levels = ARRAY_SIZE(msm_rpmrs_levels),
2115 .vdd_mem_levels = {
2116 [MSM_RPMRS_VDD_MEM_RET_LOW] = 750000,
2117 [MSM_RPMRS_VDD_MEM_RET_HIGH] = 750000,
2118 [MSM_RPMRS_VDD_MEM_ACTIVE] = 1050000,
2119 [MSM_RPMRS_VDD_MEM_MAX] = 1150000,
2120 },
2121 .vdd_dig_levels = {
2122 [MSM_RPMRS_VDD_DIG_RET_LOW] = 500000,
2123 [MSM_RPMRS_VDD_DIG_RET_HIGH] = 750000,
2124 [MSM_RPMRS_VDD_DIG_ACTIVE] = 950000,
2125 [MSM_RPMRS_VDD_DIG_MAX] = 1150000,
2126 },
2127 .vdd_mask = 0x7FFFFF,
2128 .rpmrs_target_id = {
2129 [MSM_RPMRS_ID_PXO_CLK] = MSM_RPM_ID_PXO_CLK,
2130 [MSM_RPMRS_ID_L2_CACHE_CTL] = MSM_RPM_ID_LAST,
2131 [MSM_RPMRS_ID_VDD_DIG_0] = MSM_RPM_ID_PM8038_S1_0,
2132 [MSM_RPMRS_ID_VDD_DIG_1] = MSM_RPM_ID_PM8038_S1_1,
2133 [MSM_RPMRS_ID_VDD_MEM_0] = MSM_RPM_ID_PM8038_L24_0,
2134 [MSM_RPMRS_ID_VDD_MEM_1] = MSM_RPM_ID_PM8038_L24_1,
2135 [MSM_RPMRS_ID_RPM_CTL] = MSM_RPM_ID_RPM_CTL,
2136 },
2137};
2138
Maheshkumar Sivasubramanianc6c55032011-10-25 16:01:32 -06002139static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = {
2140 .mode = MSM_PM_BOOT_CONFIG_TZ,
2141};
2142
Praveen Chidambaram4d19be42012-04-03 18:05:52 -06002143static struct msm_pm_sleep_status_data msm_pm_slp_sts_data = {
2144 .base_addr = MSM_ACC0_BASE + 0x08,
2145 .cpu_offset = MSM_ACC1_BASE - MSM_ACC0_BASE,
2146 .mask = 1UL << 13,
2147};
2148
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002149#ifdef CONFIG_I2C
2150#define I2C_SURF 1
2151#define I2C_FFA (1 << 1)
2152#define I2C_RUMI (1 << 2)
2153#define I2C_SIM (1 << 3)
2154#define I2C_FLUID (1 << 4)
2155#define I2C_LIQUID (1 << 5)
2156
2157struct i2c_registry {
2158 u8 machs;
2159 int bus;
2160 struct i2c_board_info *info;
2161 int len;
2162};
2163
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002164#ifdef CONFIG_ISL9519_CHARGER
2165static struct isl_platform_data isl_data __initdata = {
2166 .valid_n_gpio = 0, /* Not required when notify-by-pmic */
2167 .chg_detection_config = NULL, /* Not required when notify-by-pmic */
2168 .max_system_voltage = 4200,
2169 .min_system_voltage = 3200,
2170 .chgcurrent = 1000, /* 1900, */
2171 .term_current = 400, /* Need fine tuning */
2172 .input_current = 2048,
2173};
2174
2175static struct i2c_board_info isl_charger_i2c_info[] __initdata = {
2176 {
2177 I2C_BOARD_INFO("isl9519q", 0x9),
2178 .irq = 0, /* Not required when notify-by-pmic */
2179 .platform_data = &isl_data,
2180 },
2181};
2182#endif /* CONFIG_ISL9519_CHARGER */
2183
2184static struct i2c_registry msm8960_i2c_devices[] __initdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002185#ifdef CONFIG_ISL9519_CHARGER
2186 {
2187 I2C_LIQUID,
2188 MSM_8930_GSBI10_QUP_I2C_BUS_ID,
2189 isl_charger_i2c_info,
2190 ARRAY_SIZE(isl_charger_i2c_info),
2191 },
2192#endif /* CONFIG_ISL9519_CHARGER */
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002193 {
Amy Malochee8de95d2012-02-23 10:40:25 -08002194 I2C_SURF | I2C_FFA | I2C_FLUID,
2195 MSM_8930_GSBI9_QUP_I2C_BUS_ID,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002196 msm_isa1200_board_info,
2197 ARRAY_SIZE(msm_isa1200_board_info),
2198 },
Amy Malochef3c9db42011-12-08 15:17:35 -08002199 {
Amy Maloche8eb91112012-03-30 10:22:37 -07002200 I2C_SURF | I2C_FFA | I2C_FLUID,
Amy Malochef3c9db42011-12-08 15:17:35 -08002201 MSM_8930_GSBI3_QUP_I2C_BUS_ID,
2202 mxt_device_info_8930,
2203 ARRAY_SIZE(mxt_device_info_8930),
2204 },
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002205};
2206#endif /* CONFIG_I2C */
2207
2208static void __init register_i2c_devices(void)
2209{
2210#ifdef CONFIG_I2C
2211 u8 mach_mask = 0;
2212 int i;
Kevin Chan09f4e662011-12-16 08:17:02 -08002213#ifdef CONFIG_MSM_CAMERA
2214 struct i2c_registry msm8930_camera_i2c_devices = {
2215 I2C_SURF | I2C_FFA | I2C_FLUID | I2C_LIQUID | I2C_RUMI,
2216 MSM_8930_GSBI4_QUP_I2C_BUS_ID,
2217 msm8930_camera_board_info.board_info,
2218 msm8930_camera_board_info.num_i2c_board_info,
2219 };
2220#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002221
2222 /* Build the matching 'supported_machs' bitmask */
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002223 if (machine_is_msm8930_cdp() || machine_is_msm8627_cdp())
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002224 mach_mask = I2C_SURF;
2225 else if (machine_is_msm8930_fluid())
2226 mach_mask = I2C_FLUID;
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002227 else if (machine_is_msm8930_mtp() || machine_is_msm8627_mtp())
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002228 mach_mask = I2C_FFA;
2229 else
2230 pr_err("unmatched machine ID in register_i2c_devices\n");
2231
2232 /* Run the array and install devices as appropriate */
2233 for (i = 0; i < ARRAY_SIZE(msm8960_i2c_devices); ++i) {
2234 if (msm8960_i2c_devices[i].machs & mach_mask)
2235 i2c_register_board_info(msm8960_i2c_devices[i].bus,
2236 msm8960_i2c_devices[i].info,
2237 msm8960_i2c_devices[i].len);
2238 }
Kevin Chan09f4e662011-12-16 08:17:02 -08002239#ifdef CONFIG_MSM_CAMERA
2240 if (msm8930_camera_i2c_devices.machs & mach_mask)
2241 i2c_register_board_info(msm8930_camera_i2c_devices.bus,
2242 msm8930_camera_i2c_devices.info,
2243 msm8930_camera_i2c_devices.len);
2244#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002245#endif
2246}
2247
2248static void __init msm8930_cdp_init(void)
2249{
2250 if (meminfo_init(SYS_MEMORY, SZ_256M) < 0)
2251 pr_err("meminfo_init() failed!\n");
2252
Siddartha Mohanadossfad0af12012-01-20 15:08:38 -08002253 msm_tsens_early_init(&msm_tsens_pdata);
Praveen Chidambaram78499012011-11-01 17:15:17 -06002254 BUG_ON(msm_rpm_init(&msm8930_rpm_data));
2255 BUG_ON(msm_rpmrs_levels_init(&msm_rpmrs_data));
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002256
2257 regulator_suppress_info_printing();
2258 if (msm_xo_init())
2259 pr_err("Failed to initialize XO votes\n");
Jay Chokshi06fa7542011-12-07 13:09:17 -08002260 platform_device_register(&msm8930_device_rpm_regulator);
Tianyi Goue3d4f542012-03-15 17:06:45 -07002261 msm_clock_init(&msm8930_clock_init_data);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002262 msm8960_device_otg.dev.platform_data = &msm_otg_pdata;
Stepan Moskovchenko3b09bf52011-12-06 20:40:53 -08002263 msm8930_init_gpiomux();
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002264 msm8960_device_qup_spi_gsbi1.dev.platform_data =
2265 &msm8960_qup_spi_gsbi1_pdata;
2266 spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
2267
Jay Chokshi06fa7542011-12-07 13:09:17 -08002268 /*
2269 * TODO: When physical 8930/PM8038 hardware becomes
2270 * available, remove this block or add the config
2271 * option.
2272 */
2273#ifndef MSM8930_PHASE_2
2274 msm8960_init_pmic();
2275#else
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002276 msm8930_init_pmic();
Jay Chokshi06fa7542011-12-07 13:09:17 -08002277#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002278 msm8930_i2c_init();
Sudhakara Rao Tentu8b5c8ed2012-03-05 14:48:41 +05302279 msm8930_init_gpu();
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002280 msm_spm_init(msm_spm_data, ARRAY_SIZE(msm_spm_data));
2281 msm_spm_l2_init(msm_spm_l2_data);
2282 msm8930_init_buses();
Matt Wagantall1f65d9d2012-04-25 14:24:20 -07002283 platform_add_devices(msm8930_footswitch, msm8930_num_footswitch);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002284 platform_add_devices(common_devices, ARRAY_SIZE(common_devices));
Arun Menonaabf2632012-02-24 15:30:47 -08002285 msm8930_add_vidc_device();
Jay Chokshi06fa7542011-12-07 13:09:17 -08002286 /*
2287 * TODO: When physical 8930/PM8038 hardware becomes
2288 * available, remove this block or add the config
2289 * option.
2290 */
2291#ifndef MSM8930_PHASE_2
2292 msm8960_pm8921_gpio_mpp_init();
2293#else
2294 msm8930_pm8038_gpio_mpp_init();
2295#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002296 platform_add_devices(cdp_devices, ARRAY_SIZE(cdp_devices));
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002297 msm8930_init_cam();
2298 msm8930_init_mmc();
Tianyi Gou7c6b81f2011-12-07 23:09:08 -08002299 acpuclk_init(&acpuclk_8930_soc_data);
Amy Maloche8eb91112012-03-30 10:22:37 -07002300 mxt_init_vkeys_8930();
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002301 register_i2c_devices();
2302 msm8930_init_fb();
2303 slim_register_board_info(msm_slim_devices,
2304 ARRAY_SIZE(msm_slim_devices));
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002305 change_memory_power = &msm8930_change_memory_power;
Maheshkumar Sivasubramanianc6c55032011-10-25 16:01:32 -06002306 BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata));
Praveen Chidambaram4d19be42012-04-03 18:05:52 -06002307 msm_pm_init_sleep_status_data(&msm_pm_slp_sts_data);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002308
2309 if (PLATFORM_IS_CHARM25())
2310 platform_add_devices(mdm_devices, ARRAY_SIZE(mdm_devices));
2311}
2312
2313MACHINE_START(MSM8930_CDP, "QCT MSM8930 CDP")
2314 .map_io = msm8930_map_io,
2315 .reserve = msm8930_reserve,
2316 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302317 .handle_irq = gic_handle_irq,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002318 .timer = &msm_timer,
2319 .init_machine = msm8930_cdp_init,
2320 .init_early = msm8930_allocate_memory_regions,
2321 .init_very_early = msm8930_early_memory,
2322MACHINE_END
2323
2324MACHINE_START(MSM8930_MTP, "QCT MSM8930 MTP")
2325 .map_io = msm8930_map_io,
2326 .reserve = msm8930_reserve,
2327 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302328 .handle_irq = gic_handle_irq,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002329 .timer = &msm_timer,
2330 .init_machine = msm8930_cdp_init,
2331 .init_early = msm8930_allocate_memory_regions,
2332 .init_very_early = msm8930_early_memory,
2333MACHINE_END
2334
2335MACHINE_START(MSM8930_FLUID, "QCT MSM8930 FLUID")
2336 .map_io = msm8930_map_io,
2337 .reserve = msm8930_reserve,
2338 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302339 .handle_irq = gic_handle_irq,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002340 .timer = &msm_timer,
2341 .init_machine = msm8930_cdp_init,
2342 .init_early = msm8930_allocate_memory_regions,
2343 .init_very_early = msm8930_early_memory,
2344MACHINE_END
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002345
2346MACHINE_START(MSM8627_CDP, "QCT MSM8627 CDP")
2347 .map_io = msm8930_map_io,
2348 .reserve = msm8930_reserve,
2349 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302350 .handle_irq = gic_handle_irq,
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002351 .timer = &msm_timer,
2352 .init_machine = msm8930_cdp_init,
2353 .init_early = msm8930_allocate_memory_regions,
2354 .init_very_early = msm8930_early_memory,
2355MACHINE_END
2356
2357MACHINE_START(MSM8627_MTP, "QCT MSM8627 MTP")
2358 .map_io = msm8930_map_io,
2359 .reserve = msm8930_reserve,
2360 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302361 .handle_irq = gic_handle_irq,
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002362 .timer = &msm_timer,
2363 .init_machine = msm8930_cdp_init,
2364 .init_early = msm8930_allocate_memory_regions,
2365 .init_very_early = msm8930_early_memory,
2366MACHINE_END