blob: fcb17c034e61cd985ac2f83bdade4e61c7a8fc9c [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>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080044
45#include <asm/mach-types.h>
46#include <asm/mach/arch.h>
47#include <asm/setup.h>
48#include <asm/hardware/gic.h>
49#include <asm/mach/mmc.h>
50
51#include <mach/board.h>
52#include <mach/msm_iomap.h>
53#include <mach/msm_spi.h>
54#ifdef CONFIG_USB_MSM_OTG_72K
55#include <mach/msm_hsusb.h>
56#else
57#include <linux/usb/msm_hsusb.h>
58#endif
59#include <linux/usb/android.h>
60#include <mach/usbdiag.h>
61#include <mach/socinfo.h>
62#include <mach/rpm.h>
63#include <mach/gpio.h>
64#include <mach/gpiomux.h>
65#include <mach/msm_bus_board.h>
66#include <mach/msm_memtypes.h>
67#include <mach/dma.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080068#include <mach/msm_xo.h>
69#include <mach/restart.h>
70
71#ifdef CONFIG_WCD9310_CODEC
72#include <linux/slimbus/slimbus.h>
73#include <linux/mfd/wcd9310/core.h>
74#include <linux/mfd/wcd9310/pdata.h>
75#endif
76
77#include <linux/ion.h>
78#include <mach/ion.h>
79#include <mach/mdm2.h>
80
81#include "timer.h"
82#include "devices.h"
83#include "devices-msm8x60.h"
84#include "spm.h"
Matt Wagantall7cca4642012-02-01 16:43:24 -080085#include "pm.h"
Abhijeet Dharmapurikarefaca4f2011-12-27 16:24:07 -080086#include <mach/cpuidle.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080087#include "rpm_resources.h"
88#include "mpm.h"
89#include "acpuclock.h"
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080090#include "smd_private.h"
91#include "pm-boot.h"
92#include "msm_watchdog.h"
Jay Chokshi06fa7542011-12-07 13:09:17 -080093#include "board-8930.h"
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080094
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080095static struct platform_device msm_fm_platform_init = {
96 .name = "iris_fm",
97 .id = -1,
98};
99
100#define KS8851_RST_GPIO 89
101#define KS8851_IRQ_GPIO 90
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800102#define HAP_SHIFT_LVL_OE_GPIO 47
103
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800104#if defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE)
105
106struct sx150x_platform_data msm8930_sx150x_data[] = {
107 [SX150X_CAM] = {
108 .gpio_base = GPIO_CAM_EXPANDER_BASE,
109 .oscio_is_gpo = false,
110 .io_pullup_ena = 0x0,
111 .io_pulldn_ena = 0xc0,
112 .io_open_drain_ena = 0x0,
113 .irq_summary = -1,
114 },
115};
116
117#endif
118
Olav Haugana21169d2012-01-04 09:17:06 -0800119#define MSM_PMEM_ADSP_SIZE 0x7800000
Ben Romberger3ffcd812011-12-08 19:12:10 -0800120#define MSM_PMEM_AUDIO_SIZE 0x2B4000
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800121#ifdef CONFIG_FB_MSM_HDMI_AS_PRIMARY
122#define MSM_PMEM_SIZE 0x4000000 /* 64 Mbytes */
123#else
Olav Hauganb88eef12012-01-15 10:59:26 -0800124#define MSM_PMEM_SIZE 0x2800000 /* 40 Mbytes */
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800125#endif
126
127
128#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
Olav Hauganedcf6832012-01-24 08:35:41 -0800129#define MSM_PMEM_KERNEL_EBI1_SIZE 0x280000
Olav Hauganb88eef12012-01-15 10:59:26 -0800130#define MSM_ION_SF_SIZE MSM_PMEM_SIZE
Olav Haugan42ebe712012-01-10 16:30:58 -0800131#define MSM_ION_MM_FW_SIZE 0x200000 /* (2MB) */
Olav Hauganb88eef12012-01-15 10:59:26 -0800132#define MSM_ION_MM_SIZE MSM_PMEM_ADSP_SIZE
Olav Haugan80854eb2012-01-12 12:00:23 -0800133#define MSM_ION_QSECOM_SIZE 0x100000 /* (1MB) */
Olav Hauganb5be7992011-11-18 14:29:02 -0800134#define MSM_ION_MFC_SIZE SZ_8K
Olav Haugan7355db02012-01-13 16:59:13 -0800135#define MSM_ION_AUDIO_SIZE MSM_PMEM_AUDIO_SIZE
136#define MSM_ION_HEAP_NUM 8
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800137#else
138#define MSM_PMEM_KERNEL_EBI1_SIZE 0x110C000
Olav Hauganb5be7992011-11-18 14:29:02 -0800139#define MSM_ION_HEAP_NUM 1
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800140#endif
141
142#ifdef CONFIG_KERNEL_PMEM_EBI_REGION
143static unsigned pmem_kernel_ebi1_size = MSM_PMEM_KERNEL_EBI1_SIZE;
144static int __init pmem_kernel_ebi1_size_setup(char *p)
145{
146 pmem_kernel_ebi1_size = memparse(p, NULL);
147 return 0;
148}
149early_param("pmem_kernel_ebi1_size", pmem_kernel_ebi1_size_setup);
150#endif
151
152#ifdef CONFIG_ANDROID_PMEM
153static unsigned pmem_size = MSM_PMEM_SIZE;
154static int __init pmem_size_setup(char *p)
155{
156 pmem_size = memparse(p, NULL);
157 return 0;
158}
159early_param("pmem_size", pmem_size_setup);
160
161static unsigned pmem_adsp_size = MSM_PMEM_ADSP_SIZE;
162
163static int __init pmem_adsp_size_setup(char *p)
164{
165 pmem_adsp_size = memparse(p, NULL);
166 return 0;
167}
168early_param("pmem_adsp_size", pmem_adsp_size_setup);
169
170static unsigned pmem_audio_size = MSM_PMEM_AUDIO_SIZE;
171
172static int __init pmem_audio_size_setup(char *p)
173{
174 pmem_audio_size = memparse(p, NULL);
175 return 0;
176}
177early_param("pmem_audio_size", pmem_audio_size_setup);
178#endif
179
180#ifdef CONFIG_ANDROID_PMEM
181#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
182static struct android_pmem_platform_data android_pmem_pdata = {
183 .name = "pmem",
184 .allocator_type = PMEM_ALLOCATORTYPE_ALLORNOTHING,
185 .cached = 1,
186 .memory_type = MEMTYPE_EBI1,
187};
188
189static struct platform_device android_pmem_device = {
190 .name = "android_pmem",
191 .id = 0,
192 .dev = {.platform_data = &android_pmem_pdata},
193};
194
195static struct android_pmem_platform_data android_pmem_adsp_pdata = {
196 .name = "pmem_adsp",
197 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
198 .cached = 0,
199 .memory_type = MEMTYPE_EBI1,
200};
201static struct platform_device android_pmem_adsp_device = {
202 .name = "android_pmem",
203 .id = 2,
204 .dev = { .platform_data = &android_pmem_adsp_pdata },
205};
206#endif
207
208static struct android_pmem_platform_data android_pmem_audio_pdata = {
209 .name = "pmem_audio",
210 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
211 .cached = 0,
212 .memory_type = MEMTYPE_EBI1,
213};
214
215static struct platform_device android_pmem_audio_device = {
216 .name = "android_pmem",
217 .id = 4,
218 .dev = { .platform_data = &android_pmem_audio_pdata },
219};
220#endif
221
222#define DSP_RAM_BASE_8960 0x8da00000
223#define DSP_RAM_SIZE_8960 0x1800000
224static int dspcrashd_pdata_8960 = 0xDEADDEAD;
225
226static struct resource resources_dspcrashd_8960[] = {
227 {
228 .name = "msm_dspcrashd",
229 .start = DSP_RAM_BASE_8960,
230 .end = DSP_RAM_BASE_8960 + DSP_RAM_SIZE_8960,
231 .flags = IORESOURCE_DMA,
232 },
233};
234
235static struct platform_device msm_device_dspcrashd_8960 = {
236 .name = "msm_dspcrashd",
237 .num_resources = ARRAY_SIZE(resources_dspcrashd_8960),
238 .resource = resources_dspcrashd_8960,
239 .dev = { .platform_data = &dspcrashd_pdata_8960 },
240};
241
242static struct memtype_reserve msm8930_reserve_table[] __initdata = {
243 [MEMTYPE_SMI] = {
244 },
245 [MEMTYPE_EBI0] = {
246 .flags = MEMTYPE_FLAGS_1M_ALIGN,
247 },
248 [MEMTYPE_EBI1] = {
249 .flags = MEMTYPE_FLAGS_1M_ALIGN,
250 },
251};
252
253static void __init size_pmem_devices(void)
254{
255#ifdef CONFIG_ANDROID_PMEM
256#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
257 android_pmem_adsp_pdata.size = pmem_adsp_size;
258 android_pmem_pdata.size = pmem_size;
259#endif
260 android_pmem_audio_pdata.size = MSM_PMEM_AUDIO_SIZE;
261#endif
262}
263
264static void __init reserve_memory_for(struct android_pmem_platform_data *p)
265{
266 msm8930_reserve_table[p->memory_type].size += p->size;
267}
268
269static void __init reserve_pmem_memory(void)
270{
271#ifdef CONFIG_ANDROID_PMEM
272#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
273 reserve_memory_for(&android_pmem_adsp_pdata);
274 reserve_memory_for(&android_pmem_pdata);
275#endif
276 reserve_memory_for(&android_pmem_audio_pdata);
277 msm8930_reserve_table[MEMTYPE_EBI1].size += pmem_kernel_ebi1_size;
278#endif
279}
280
281static int msm8930_paddr_to_memtype(unsigned int paddr)
282{
283 return MEMTYPE_EBI1;
284}
285
286#ifdef CONFIG_ION_MSM
Olav Haugan0703dbf2011-12-19 17:53:38 -0800287#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
288static struct ion_cp_heap_pdata cp_mm_ion_pdata = {
289 .permission_type = IPT_TYPE_MM_CARVEOUT,
Olav Haugan42ebe712012-01-10 16:30:58 -0800290 .align = PAGE_SIZE,
Olav Haugan0703dbf2011-12-19 17:53:38 -0800291};
292
293static struct ion_cp_heap_pdata cp_mfc_ion_pdata = {
294 .permission_type = IPT_TYPE_MFC_SHAREDMEM,
Olav Haugan42ebe712012-01-10 16:30:58 -0800295 .align = PAGE_SIZE,
Olav Haugan0703dbf2011-12-19 17:53:38 -0800296};
297static struct ion_co_heap_pdata co_ion_pdata = {
Olav Haugan42ebe712012-01-10 16:30:58 -0800298 .adjacent_mem_id = INVALID_HEAP_ID,
299 .align = PAGE_SIZE,
300};
301static struct ion_co_heap_pdata fw_co_ion_pdata = {
302 .adjacent_mem_id = ION_CP_MM_HEAP_ID,
303 .align = SZ_128K,
Olav Haugan0703dbf2011-12-19 17:53:38 -0800304};
305#endif
Olav Haugan9cdfc2f2012-02-15 09:52:57 -0800306
307/**
308 * These heaps are listed in the order they will be allocated. Due to
309 * video hardware restrictions and content protection the FW heap has to
310 * be allocated adjacent (below) the MM heap and the MFC heap has to be
311 * allocated after the MM heap to ensure MFC heap is not more than 256MB
312 * away from the base address of the FW heap.
313 * However, the order of FW heap and MM heap doesn't matter since these
314 * two heaps are taken care of by separate code to ensure they are adjacent
315 * to each other.
316 * Don't swap the order unless you know what you are doing!
317 */
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800318static struct ion_platform_data ion_pdata = {
319 .nr = MSM_ION_HEAP_NUM,
320 .heaps = {
321 {
Olav Hauganb5be7992011-11-18 14:29:02 -0800322 .id = ION_SYSTEM_HEAP_ID,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800323 .type = ION_HEAP_TYPE_SYSTEM,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800324 .name = ION_VMALLOC_HEAP_NAME,
325 },
326#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
327 {
Olav Hauganb5be7992011-11-18 14:29:02 -0800328 .id = ION_CP_MM_HEAP_ID,
Olav Haugan0a852512012-01-09 10:20:55 -0800329 .type = ION_HEAP_TYPE_CP,
Olav Hauganb5be7992011-11-18 14:29:02 -0800330 .name = ION_MM_HEAP_NAME,
331 .size = MSM_ION_MM_SIZE,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800332 .memory_type = ION_EBI_TYPE,
Olav Haugan0703dbf2011-12-19 17:53:38 -0800333 .extra_data = (void *) &cp_mm_ion_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800334 },
Olav Hauganb5be7992011-11-18 14:29:02 -0800335 {
Olav Haugan42ebe712012-01-10 16:30:58 -0800336 .id = ION_MM_FIRMWARE_HEAP_ID,
337 .type = ION_HEAP_TYPE_CARVEOUT,
338 .name = ION_MM_FIRMWARE_HEAP_NAME,
339 .size = MSM_ION_MM_FW_SIZE,
340 .memory_type = ION_EBI_TYPE,
341 .extra_data = (void *) &fw_co_ion_pdata,
342 },
343 {
Olav Hauganb5be7992011-11-18 14:29:02 -0800344 .id = ION_CP_MFC_HEAP_ID,
Olav Haugan0a852512012-01-09 10:20:55 -0800345 .type = ION_HEAP_TYPE_CP,
Olav Hauganb5be7992011-11-18 14:29:02 -0800346 .name = ION_MFC_HEAP_NAME,
347 .size = MSM_ION_MFC_SIZE,
348 .memory_type = ION_EBI_TYPE,
Olav Haugan0703dbf2011-12-19 17:53:38 -0800349 .extra_data = (void *) &cp_mfc_ion_pdata,
Olav Hauganb5be7992011-11-18 14:29:02 -0800350 },
351 {
Olav Haugan9cdfc2f2012-02-15 09:52:57 -0800352 .id = ION_SF_HEAP_ID,
353 .type = ION_HEAP_TYPE_CARVEOUT,
354 .name = ION_SF_HEAP_NAME,
355 .size = MSM_ION_SF_SIZE,
356 .memory_type = ION_EBI_TYPE,
357 .extra_data = (void *) &co_ion_pdata,
358 },
359 {
Olav Hauganb5be7992011-11-18 14:29:02 -0800360 .id = ION_IOMMU_HEAP_ID,
361 .type = ION_HEAP_TYPE_IOMMU,
362 .name = ION_IOMMU_HEAP_NAME,
363 },
Olav Haugan80854eb2012-01-12 12:00:23 -0800364 {
365 .id = ION_QSECOM_HEAP_ID,
366 .type = ION_HEAP_TYPE_CARVEOUT,
367 .name = ION_QSECOM_HEAP_NAME,
368 .size = MSM_ION_QSECOM_SIZE,
369 .memory_type = ION_EBI_TYPE,
370 .extra_data = (void *) &co_ion_pdata,
371 },
Olav Haugan7355db02012-01-13 16:59:13 -0800372 {
373 .id = ION_AUDIO_HEAP_ID,
374 .type = ION_HEAP_TYPE_CARVEOUT,
375 .name = ION_AUDIO_HEAP_NAME,
376 .size = MSM_ION_AUDIO_SIZE,
377 .memory_type = ION_EBI_TYPE,
378 .extra_data = (void *) &co_ion_pdata,
379 },
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800380#endif
381 }
382};
383
384static struct platform_device ion_dev = {
385 .name = "ion-msm",
386 .id = 1,
387 .dev = { .platform_data = &ion_pdata },
388};
389#endif
390
391static void reserve_ion_memory(void)
392{
393#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION)
Olav Hauganb5be7992011-11-18 14:29:02 -0800394 msm8930_reserve_table[MEMTYPE_EBI1].size += MSM_ION_SF_SIZE;
395 msm8930_reserve_table[MEMTYPE_EBI1].size += MSM_ION_MM_SIZE;
Olav Haugan42ebe712012-01-10 16:30:58 -0800396 msm8930_reserve_table[MEMTYPE_EBI1].size += MSM_ION_MM_FW_SIZE;
Olav Hauganb5be7992011-11-18 14:29:02 -0800397 msm8930_reserve_table[MEMTYPE_EBI1].size += MSM_ION_MFC_SIZE;
Olav Haugan80854eb2012-01-12 12:00:23 -0800398 msm8930_reserve_table[MEMTYPE_EBI1].size += MSM_ION_QSECOM_SIZE;
Olav Haugan7355db02012-01-13 16:59:13 -0800399 msm8930_reserve_table[MEMTYPE_EBI1].size += MSM_ION_AUDIO_SIZE;
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800400#endif
401}
Huaibin Yanga5419422011-12-08 23:52:10 -0800402
403static void __init reserve_mdp_memory(void)
404{
405 msm8930_mdp_writeback(msm8930_reserve_table);
406}
407
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800408static void __init msm8930_calculate_reserve_sizes(void)
409{
410 size_pmem_devices();
411 reserve_pmem_memory();
412 reserve_ion_memory();
Huaibin Yanga5419422011-12-08 23:52:10 -0800413 reserve_mdp_memory();
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800414}
415
416static struct reserve_info msm8930_reserve_info __initdata = {
417 .memtype_reserve_table = msm8930_reserve_table,
418 .calculate_reserve_sizes = msm8930_calculate_reserve_sizes,
419 .paddr_to_memtype = msm8930_paddr_to_memtype,
420};
421
422static int msm8930_memory_bank_size(void)
423{
424 return 1<<29;
425}
426
427static void __init locate_unstable_memory(void)
428{
429 struct membank *mb = &meminfo.bank[meminfo.nr_banks - 1];
430 unsigned long bank_size;
431 unsigned long low, high;
432
433 bank_size = msm8930_memory_bank_size();
434 low = meminfo.bank[0].start;
435 high = mb->start + mb->size;
436
437 /* Check if 32 bit overflow occured */
438 if (high < mb->start)
439 high = ~0UL;
440
441 low &= ~(bank_size - 1);
442
443 if (high - low <= bank_size)
444 return;
Jack Cheung6ce8f682012-01-17 10:35:42 -0800445 msm8930_reserve_info.low_unstable_address = mb->start -
446 MIN_MEMORY_BLOCK_SIZE + mb->size;
447 msm8930_reserve_info.max_unstable_size = MIN_MEMORY_BLOCK_SIZE;
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800448
449 msm8930_reserve_info.bank_size = bank_size;
450 pr_info("low unstable address %lx max size %lx bank size %lx\n",
451 msm8930_reserve_info.low_unstable_address,
452 msm8930_reserve_info.max_unstable_size,
453 msm8930_reserve_info.bank_size);
454}
455
456static void __init place_movable_zone(void)
457{
458 movable_reserved_start = msm8930_reserve_info.low_unstable_address;
459 movable_reserved_size = msm8930_reserve_info.max_unstable_size;
460 pr_info("movable zone start %lx size %lx\n",
461 movable_reserved_start, movable_reserved_size);
462}
463
464static void __init msm8930_early_memory(void)
465{
466 reserve_info = &msm8930_reserve_info;
467 locate_unstable_memory();
468 place_movable_zone();
469}
470
471static void __init msm8930_reserve(void)
472{
473 msm_reserve();
474}
475
476static int msm8930_change_memory_power(u64 start, u64 size,
477 int change_type)
478{
479 return soc_change_memory_power(start, size, change_type);
480}
481
482static void __init msm8930_allocate_memory_regions(void)
483{
484 msm8930_allocate_fb_region();
485}
486
487#ifdef CONFIG_WCD9310_CODEC
488
489#define TABLA_INTERRUPT_BASE (NR_MSM_IRQS + NR_GPIO_IRQS + NR_PM8921_IRQS)
490
491/* Micbias setting is based on 8660 CDP/MTP/FLUID requirement
492 * 4 micbiases are used to power various analog and digital
493 * microphones operating at 1800 mV. Technically, all micbiases
494 * can source from single cfilter since all microphones operate
495 * at the same voltage level. The arrangement below is to make
496 * sure all cfilters are exercised. LDO_H regulator ouput level
497 * does not need to be as high as 2.85V. It is choosen for
498 * microphone sensitivity purpose.
499 */
500static struct tabla_pdata tabla_platform_data = {
501 .slimbus_slave_device = {
502 .name = "tabla-slave",
503 .e_addr = {0, 0, 0x10, 0, 0x17, 2},
504 },
505 .irq = MSM_GPIO_TO_INT(62),
506 .irq_base = TABLA_INTERRUPT_BASE,
507 .num_irqs = NR_TABLA_IRQS,
Jay Chokshi06fa7542011-12-07 13:09:17 -0800508
509/*TODO: Replace this with right PM8038 gpio */
510#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800511 .reset_gpio = PM8921_GPIO_PM_TO_SYS(34),
Jay Chokshi06fa7542011-12-07 13:09:17 -0800512#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800513 .micbias = {
514 .ldoh_v = TABLA_LDOH_2P85_V,
515 .cfilt1_mv = 1800,
516 .cfilt2_mv = 1800,
517 .cfilt3_mv = 1800,
518 .bias1_cfilt_sel = TABLA_CFILT1_SEL,
519 .bias2_cfilt_sel = TABLA_CFILT2_SEL,
520 .bias3_cfilt_sel = TABLA_CFILT3_SEL,
521 .bias4_cfilt_sel = TABLA_CFILT3_SEL,
522 }
523};
524
525static struct slim_device msm_slim_tabla = {
526 .name = "tabla-slim",
527 .e_addr = {0, 1, 0x10, 0, 0x17, 2},
528 .dev = {
529 .platform_data = &tabla_platform_data,
530 },
531};
532
533static struct tabla_pdata tabla20_platform_data = {
534 .slimbus_slave_device = {
535 .name = "tabla-slave",
536 .e_addr = {0, 0, 0x60, 0, 0x17, 2},
537 },
538 .irq = MSM_GPIO_TO_INT(62),
539 .irq_base = TABLA_INTERRUPT_BASE,
540 .num_irqs = NR_TABLA_IRQS,
Jay Chokshi06fa7542011-12-07 13:09:17 -0800541
542/*TODO: Replace this with right PM8038 gpio */
543#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800544 .reset_gpio = PM8921_GPIO_PM_TO_SYS(34),
Jay Chokshi06fa7542011-12-07 13:09:17 -0800545#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800546 .micbias = {
547 .ldoh_v = TABLA_LDOH_2P85_V,
548 .cfilt1_mv = 1800,
549 .cfilt2_mv = 1800,
550 .cfilt3_mv = 1800,
551 .bias1_cfilt_sel = TABLA_CFILT1_SEL,
552 .bias2_cfilt_sel = TABLA_CFILT2_SEL,
553 .bias3_cfilt_sel = TABLA_CFILT3_SEL,
554 .bias4_cfilt_sel = TABLA_CFILT3_SEL,
555 }
556};
557
558static struct slim_device msm_slim_tabla20 = {
559 .name = "tabla2x-slim",
560 .e_addr = {0, 1, 0x60, 0, 0x17, 2},
561 .dev = {
562 .platform_data = &tabla20_platform_data,
563 },
564};
565#endif
566
567static struct slim_boardinfo msm_slim_devices[] = {
568#ifdef CONFIG_WCD9310_CODEC
569 {
570 .bus_num = 1,
571 .slim_slave = &msm_slim_tabla,
572 },
573 {
574 .bus_num = 1,
575 .slim_slave = &msm_slim_tabla20,
576 },
577#endif
578 /* add more slimbus slaves as needed */
579};
580
581#define MSM_WCNSS_PHYS 0x03000000
582#define MSM_WCNSS_SIZE 0x280000
583
584static struct resource resources_wcnss_wlan[] = {
585 {
586 .start = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ,
587 .end = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ,
588 .name = "wcnss_wlanrx_irq",
589 .flags = IORESOURCE_IRQ,
590 },
591 {
592 .start = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ,
593 .end = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ,
594 .name = "wcnss_wlantx_irq",
595 .flags = IORESOURCE_IRQ,
596 },
597 {
598 .start = MSM_WCNSS_PHYS,
599 .end = MSM_WCNSS_PHYS + MSM_WCNSS_SIZE - 1,
600 .name = "wcnss_mmio",
601 .flags = IORESOURCE_MEM,
602 },
603 {
604 .start = 84,
605 .end = 88,
606 .name = "wcnss_gpios_5wire",
607 .flags = IORESOURCE_IO,
608 },
609};
610
611static struct qcom_wcnss_opts qcom_wcnss_pdata = {
612 .has_48mhz_xo = 1,
613};
614
615static struct platform_device msm_device_wcnss_wlan = {
616 .name = "wcnss_wlan",
617 .id = 0,
618 .num_resources = ARRAY_SIZE(resources_wcnss_wlan),
619 .resource = resources_wcnss_wlan,
620 .dev = {.platform_data = &qcom_wcnss_pdata},
621};
622
623#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
624 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) || \
625 defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
626 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
627
628#define QCE_SIZE 0x10000
629#define QCE_0_BASE 0x18500000
630
631#define QCE_HW_KEY_SUPPORT 0
632#define QCE_SHA_HMAC_SUPPORT 1
633#define QCE_SHARE_CE_RESOURCE 1
634#define QCE_CE_SHARED 0
635
636static struct resource qcrypto_resources[] = {
637 [0] = {
638 .start = QCE_0_BASE,
639 .end = QCE_0_BASE + QCE_SIZE - 1,
640 .flags = IORESOURCE_MEM,
641 },
642 [1] = {
643 .name = "crypto_channels",
644 .start = DMOV_CE_IN_CHAN,
645 .end = DMOV_CE_OUT_CHAN,
646 .flags = IORESOURCE_DMA,
647 },
648 [2] = {
649 .name = "crypto_crci_in",
650 .start = DMOV_CE_IN_CRCI,
651 .end = DMOV_CE_IN_CRCI,
652 .flags = IORESOURCE_DMA,
653 },
654 [3] = {
655 .name = "crypto_crci_out",
656 .start = DMOV_CE_OUT_CRCI,
657 .end = DMOV_CE_OUT_CRCI,
658 .flags = IORESOURCE_DMA,
659 },
660};
661
662static struct resource qcedev_resources[] = {
663 [0] = {
664 .start = QCE_0_BASE,
665 .end = QCE_0_BASE + QCE_SIZE - 1,
666 .flags = IORESOURCE_MEM,
667 },
668 [1] = {
669 .name = "crypto_channels",
670 .start = DMOV_CE_IN_CHAN,
671 .end = DMOV_CE_OUT_CHAN,
672 .flags = IORESOURCE_DMA,
673 },
674 [2] = {
675 .name = "crypto_crci_in",
676 .start = DMOV_CE_IN_CRCI,
677 .end = DMOV_CE_IN_CRCI,
678 .flags = IORESOURCE_DMA,
679 },
680 [3] = {
681 .name = "crypto_crci_out",
682 .start = DMOV_CE_OUT_CRCI,
683 .end = DMOV_CE_OUT_CRCI,
684 .flags = IORESOURCE_DMA,
685 },
686};
687
688#endif
689
690#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
691 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE)
692
693static struct msm_ce_hw_support qcrypto_ce_hw_suppport = {
694 .ce_shared = QCE_CE_SHARED,
695 .shared_ce_resource = QCE_SHARE_CE_RESOURCE,
696 .hw_key_support = QCE_HW_KEY_SUPPORT,
697 .sha_hmac = QCE_SHA_HMAC_SUPPORT,
698};
699
700static struct platform_device qcrypto_device = {
701 .name = "qcrypto",
702 .id = 0,
703 .num_resources = ARRAY_SIZE(qcrypto_resources),
704 .resource = qcrypto_resources,
705 .dev = {
706 .coherent_dma_mask = DMA_BIT_MASK(32),
707 .platform_data = &qcrypto_ce_hw_suppport,
708 },
709};
710#endif
711
712#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
713 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
714
715static struct msm_ce_hw_support qcedev_ce_hw_suppport = {
716 .ce_shared = QCE_CE_SHARED,
717 .shared_ce_resource = QCE_SHARE_CE_RESOURCE,
718 .hw_key_support = QCE_HW_KEY_SUPPORT,
719 .sha_hmac = QCE_SHA_HMAC_SUPPORT,
720};
721
722static struct platform_device qcedev_device = {
723 .name = "qce",
724 .id = 0,
725 .num_resources = ARRAY_SIZE(qcedev_resources),
726 .resource = qcedev_resources,
727 .dev = {
728 .coherent_dma_mask = DMA_BIT_MASK(32),
729 .platform_data = &qcedev_ce_hw_suppport,
730 },
731};
732#endif
733
734#define MDM2AP_ERRFATAL 70
735#define AP2MDM_ERRFATAL 95
736#define MDM2AP_STATUS 69
737#define AP2MDM_STATUS 94
738#define AP2MDM_PMIC_RESET_N 80
739#define AP2MDM_KPDPWR_N 81
740
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800741static struct resource mdm_resources[] = {
742 {
743 .start = MDM2AP_ERRFATAL,
744 .end = MDM2AP_ERRFATAL,
745 .name = "MDM2AP_ERRFATAL",
746 .flags = IORESOURCE_IO,
747 },
748 {
749 .start = AP2MDM_ERRFATAL,
750 .end = AP2MDM_ERRFATAL,
751 .name = "AP2MDM_ERRFATAL",
752 .flags = IORESOURCE_IO,
753 },
754 {
755 .start = MDM2AP_STATUS,
756 .end = MDM2AP_STATUS,
757 .name = "MDM2AP_STATUS",
758 .flags = IORESOURCE_IO,
759 },
760 {
761 .start = AP2MDM_STATUS,
762 .end = AP2MDM_STATUS,
763 .name = "AP2MDM_STATUS",
764 .flags = IORESOURCE_IO,
765 },
766 {
767 .start = AP2MDM_PMIC_RESET_N,
768 .end = AP2MDM_PMIC_RESET_N,
769 .name = "AP2MDM_PMIC_RESET_N",
770 .flags = IORESOURCE_IO,
771 },
772 {
773 .start = AP2MDM_KPDPWR_N,
774 .end = AP2MDM_KPDPWR_N,
775 .name = "AP2MDM_KPDPWR_N",
776 .flags = IORESOURCE_IO,
777 },
778};
779
780static struct mdm_platform_data mdm_platform_data = {
781 .mdm_version = "2.5",
782};
783
784static struct platform_device mdm_device = {
785 .name = "mdm2_modem",
786 .id = -1,
787 .num_resources = ARRAY_SIZE(mdm_resources),
788 .resource = mdm_resources,
789 .dev = {
790 .platform_data = &mdm_platform_data,
791 },
792};
793
794static struct platform_device *mdm_devices[] __initdata = {
795 &mdm_device,
796};
797
Praveen Chidambaram78499012011-11-01 17:15:17 -0600798#ifdef CONFIG_MSM_MPM
799static uint16_t msm_mpm_irqs_m2a[MSM_MPM_NR_MPM_IRQS] __initdata = {
800 [1] = MSM_GPIO_TO_INT(46),
801 [2] = MSM_GPIO_TO_INT(150),
802 [4] = MSM_GPIO_TO_INT(103),
803 [5] = MSM_GPIO_TO_INT(104),
804 [6] = MSM_GPIO_TO_INT(105),
805 [7] = MSM_GPIO_TO_INT(106),
806 [8] = MSM_GPIO_TO_INT(107),
807 [9] = MSM_GPIO_TO_INT(7),
808 [10] = MSM_GPIO_TO_INT(11),
809 [11] = MSM_GPIO_TO_INT(15),
810 [12] = MSM_GPIO_TO_INT(19),
811 [13] = MSM_GPIO_TO_INT(23),
812 [14] = MSM_GPIO_TO_INT(27),
813 [15] = MSM_GPIO_TO_INT(31),
814 [16] = MSM_GPIO_TO_INT(35),
815 [19] = MSM_GPIO_TO_INT(90),
816 [20] = MSM_GPIO_TO_INT(92),
817 [23] = MSM_GPIO_TO_INT(85),
818 [24] = MSM_GPIO_TO_INT(83),
819 [25] = USB1_HS_IRQ,
820 [27] = HDMI_IRQ,
821 [29] = MSM_GPIO_TO_INT(10),
822 [30] = MSM_GPIO_TO_INT(102),
823 [31] = MSM_GPIO_TO_INT(81),
824 [32] = MSM_GPIO_TO_INT(78),
825 [33] = MSM_GPIO_TO_INT(94),
826 [34] = MSM_GPIO_TO_INT(72),
827 [35] = MSM_GPIO_TO_INT(39),
828 [36] = MSM_GPIO_TO_INT(43),
829 [37] = MSM_GPIO_TO_INT(61),
830 [38] = MSM_GPIO_TO_INT(50),
831 [39] = MSM_GPIO_TO_INT(42),
832 [41] = MSM_GPIO_TO_INT(62),
833 [42] = MSM_GPIO_TO_INT(76),
834 [43] = MSM_GPIO_TO_INT(75),
835 [44] = MSM_GPIO_TO_INT(70),
836 [45] = MSM_GPIO_TO_INT(69),
837 [46] = MSM_GPIO_TO_INT(67),
838 [47] = MSM_GPIO_TO_INT(65),
839 [48] = MSM_GPIO_TO_INT(58),
840 [49] = MSM_GPIO_TO_INT(54),
841 [50] = MSM_GPIO_TO_INT(52),
842 [51] = MSM_GPIO_TO_INT(49),
843 [52] = MSM_GPIO_TO_INT(40),
844 [53] = MSM_GPIO_TO_INT(37),
845 [54] = MSM_GPIO_TO_INT(24),
846 [55] = MSM_GPIO_TO_INT(14),
847};
848
849static uint16_t msm_mpm_bypassed_apps_irqs[] __initdata = {
850 TLMM_MSM_SUMMARY_IRQ,
851 RPM_APCC_CPU0_GP_HIGH_IRQ,
852 RPM_APCC_CPU0_GP_MEDIUM_IRQ,
853 RPM_APCC_CPU0_GP_LOW_IRQ,
854 RPM_APCC_CPU0_WAKE_UP_IRQ,
855 RPM_APCC_CPU1_GP_HIGH_IRQ,
856 RPM_APCC_CPU1_GP_MEDIUM_IRQ,
857 RPM_APCC_CPU1_GP_LOW_IRQ,
858 RPM_APCC_CPU1_WAKE_UP_IRQ,
859 MSS_TO_APPS_IRQ_0,
860 MSS_TO_APPS_IRQ_1,
861 MSS_TO_APPS_IRQ_2,
862 MSS_TO_APPS_IRQ_3,
863 MSS_TO_APPS_IRQ_4,
864 MSS_TO_APPS_IRQ_5,
865 MSS_TO_APPS_IRQ_6,
866 MSS_TO_APPS_IRQ_7,
867 MSS_TO_APPS_IRQ_8,
868 MSS_TO_APPS_IRQ_9,
869 LPASS_SCSS_GP_LOW_IRQ,
870 LPASS_SCSS_GP_MEDIUM_IRQ,
871 LPASS_SCSS_GP_HIGH_IRQ,
872 SPS_MTI_30,
873 SPS_MTI_31,
874 RIVA_APSS_SPARE_IRQ,
875 RIVA_APPS_WLAN_SMSM_IRQ,
876 RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ,
877 RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ,
878};
879
880struct msm_mpm_device_data msm8930_mpm_dev_data __initdata = {
881 .irqs_m2a = msm_mpm_irqs_m2a,
882 .irqs_m2a_size = ARRAY_SIZE(msm_mpm_irqs_m2a),
883 .bypassed_apps_irqs = msm_mpm_bypassed_apps_irqs,
884 .bypassed_apps_irqs_size = ARRAY_SIZE(msm_mpm_bypassed_apps_irqs),
885 .mpm_request_reg_base = MSM_RPM_BASE + 0x9d8,
886 .mpm_status_reg_base = MSM_RPM_BASE + 0xdf8,
887 .mpm_apps_ipc_reg = MSM_APCS_GCC_BASE + 0x008,
888 .mpm_apps_ipc_val = BIT(1),
889 .mpm_ipc_irq = RPM_APCC_CPU0_GP_MEDIUM_IRQ,
890
891};
892#endif
893
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800894#define MSM_SHARED_RAM_PHYS 0x80000000
895
896static void __init msm8930_map_io(void)
897{
898 msm_shared_ram_phys = MSM_SHARED_RAM_PHYS;
899 msm_map_msm8930_io();
900
901 if (socinfo_init() < 0)
902 pr_err("socinfo_init() failed!\n");
903}
904
905static void __init msm8930_init_irq(void)
906{
Praveen Chidambaram78499012011-11-01 17:15:17 -0600907 struct msm_mpm_device_data *data = NULL;
908#ifdef CONFIG_MSM_MPM
909 data = &msm8930_mpm_dev_data;
910#endif
911
912 msm_mpm_irq_extn_init(data);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800913 gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE,
914 (void *)MSM_QGIC_CPU_BASE);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800915}
916
917static void __init msm8930_init_buses(void)
918{
919#ifdef CONFIG_MSM_BUS_SCALING
920 msm_bus_rpm_set_mt_mask();
921 msm_bus_8960_apps_fabric_pdata.rpm_enabled = 1;
922 msm_bus_8960_sys_fabric_pdata.rpm_enabled = 1;
923 msm_bus_8960_mm_fabric_pdata.rpm_enabled = 1;
924 msm_bus_apps_fabric.dev.platform_data =
925 &msm_bus_8960_apps_fabric_pdata;
926 msm_bus_sys_fabric.dev.platform_data = &msm_bus_8960_sys_fabric_pdata;
927 msm_bus_mm_fabric.dev.platform_data = &msm_bus_8960_mm_fabric_pdata;
928 msm_bus_sys_fpb.dev.platform_data = &msm_bus_8960_sys_fpb_pdata;
929 msm_bus_cpss_fpb.dev.platform_data = &msm_bus_8960_cpss_fpb_pdata;
930#endif
931}
932
933static struct msm_spi_platform_data msm8960_qup_spi_gsbi1_pdata = {
934 .max_clock_speed = 15060000,
935};
936
937#ifdef CONFIG_USB_MSM_OTG_72K
938static struct msm_otg_platform_data msm_otg_pdata;
939#else
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800940static struct msm_otg_platform_data msm_otg_pdata = {
941 .mode = USB_OTG,
942 .otg_control = OTG_PMIC_CONTROL,
943 .phy_type = SNPS_28NM_INTEGRATED_PHY,
Jay Chokshi06fa7542011-12-07 13:09:17 -0800944 .pmic_id_irq = PM8038_USB_ID_IN_IRQ(PM8038_IRQ_BASE),
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800945 .power_budget = 750,
946};
947#endif
948
949#ifdef CONFIG_USB_EHCI_MSM_HSIC
950#define HSIC_HUB_RESET_GPIO 91
951static struct msm_hsic_host_platform_data msm_hsic_pdata = {
952 .strobe = 150,
953 .data = 151,
954};
955#else
956static struct msm_hsic_host_platform_data msm_hsic_pdata;
957#endif
958
959#define PID_MAGIC_ID 0x71432909
960#define SERIAL_NUM_MAGIC_ID 0x61945374
961#define SERIAL_NUMBER_LENGTH 127
962#define DLOAD_USB_BASE_ADD 0x2A03F0C8
963
964struct magic_num_struct {
965 uint32_t pid;
966 uint32_t serial_num;
967};
968
969struct dload_struct {
970 uint32_t reserved1;
971 uint32_t reserved2;
972 uint32_t reserved3;
973 uint16_t reserved4;
974 uint16_t pid;
975 char serial_number[SERIAL_NUMBER_LENGTH];
976 uint16_t reserved5;
977 struct magic_num_struct magic_struct;
978};
979
980static int usb_diag_update_pid_and_serial_num(uint32_t pid, const char *snum)
981{
982 struct dload_struct __iomem *dload = 0;
983
984 dload = ioremap(DLOAD_USB_BASE_ADD, sizeof(*dload));
985 if (!dload) {
986 pr_err("%s: cannot remap I/O memory region: %08x\n",
987 __func__, DLOAD_USB_BASE_ADD);
988 return -ENXIO;
989 }
990
991 pr_debug("%s: dload:%p pid:%x serial_num:%s\n",
992 __func__, dload, pid, snum);
993 /* update pid */
994 dload->magic_struct.pid = PID_MAGIC_ID;
995 dload->pid = pid;
996
997 /* update serial number */
998 dload->magic_struct.serial_num = 0;
999 if (!snum) {
1000 memset(dload->serial_number, 0, SERIAL_NUMBER_LENGTH);
1001 goto out;
1002 }
1003
1004 dload->magic_struct.serial_num = SERIAL_NUM_MAGIC_ID;
1005 strlcpy(dload->serial_number, snum, SERIAL_NUMBER_LENGTH);
1006out:
1007 iounmap(dload);
1008 return 0;
1009}
1010
1011static struct android_usb_platform_data android_usb_pdata = {
1012 .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num,
1013};
1014
1015static struct platform_device android_usb_device = {
1016 .name = "android_usb",
1017 .id = -1,
1018 .dev = {
1019 .platform_data = &android_usb_pdata,
1020 },
1021};
1022
1023static uint8_t spm_wfi_cmd_sequence[] __initdata = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001024 0x03, 0x0f,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001025};
1026
1027static uint8_t spm_power_collapse_without_rpm[] __initdata = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001028 0x00, 0x24, 0x54, 0x10,
1029 0x09, 0x03, 0x01,
1030 0x10, 0x54, 0x30, 0x0C,
1031 0x24, 0x30, 0x0f,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001032};
1033
1034static uint8_t spm_power_collapse_with_rpm[] __initdata = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001035 0x00, 0x24, 0x54, 0x10,
1036 0x09, 0x07, 0x01, 0x0B,
1037 0x10, 0x54, 0x30, 0x0C,
1038 0x24, 0x30, 0x0f,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001039};
1040
1041static struct msm_spm_seq_entry msm_spm_seq_list[] __initdata = {
1042 [0] = {
1043 .mode = MSM_SPM_MODE_CLOCK_GATING,
1044 .notify_rpm = false,
1045 .cmd = spm_wfi_cmd_sequence,
1046 },
1047 [1] = {
1048 .mode = MSM_SPM_MODE_POWER_COLLAPSE,
1049 .notify_rpm = false,
1050 .cmd = spm_power_collapse_without_rpm,
1051 },
1052 [2] = {
1053 .mode = MSM_SPM_MODE_POWER_COLLAPSE,
1054 .notify_rpm = true,
1055 .cmd = spm_power_collapse_with_rpm,
1056 },
1057};
1058
1059static struct msm_spm_platform_data msm_spm_data[] __initdata = {
1060 [0] = {
1061 .reg_base_addr = MSM_SAW0_BASE,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001062 .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001063#if defined(CONFIG_MSM_AVS_HW)
1064 .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00,
1065 .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00,
1066#endif
1067 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01,
1068 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020202,
1069 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C,
1070 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C,
1071 .vctl_timeout_us = 50,
1072 .num_modes = ARRAY_SIZE(msm_spm_seq_list),
1073 .modes = msm_spm_seq_list,
1074 },
1075 [1] = {
1076 .reg_base_addr = MSM_SAW1_BASE,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001077 .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001078#if defined(CONFIG_MSM_AVS_HW)
1079 .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00,
1080 .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00,
1081#endif
1082 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01,
1083 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020202,
1084 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C,
1085 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C,
1086 .vctl_timeout_us = 50,
1087 .num_modes = ARRAY_SIZE(msm_spm_seq_list),
1088 .modes = msm_spm_seq_list,
1089 },
1090};
1091
1092static uint8_t l2_spm_wfi_cmd_sequence[] __initdata = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001093 0x00, 0x20, 0x03, 0x20,
1094 0x00, 0x0f,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001095};
1096
1097static uint8_t l2_spm_gdhs_cmd_sequence[] __initdata = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001098 0x00, 0x20, 0x34, 0x64,
1099 0x48, 0x07, 0x48, 0x20,
1100 0x50, 0x64, 0x04, 0x34,
1101 0x50, 0x0f,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001102};
1103static uint8_t l2_spm_power_off_cmd_sequence[] __initdata = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001104 0x00, 0x10, 0x34, 0x64,
1105 0x48, 0x07, 0x48, 0x10,
1106 0x50, 0x64, 0x04, 0x34,
1107 0x50, 0x0F,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001108};
1109
1110static struct msm_spm_seq_entry msm_spm_l2_seq_list[] __initdata = {
1111 [0] = {
1112 .mode = MSM_SPM_L2_MODE_RETENTION,
1113 .notify_rpm = false,
1114 .cmd = l2_spm_wfi_cmd_sequence,
1115 },
1116 [1] = {
1117 .mode = MSM_SPM_L2_MODE_GDHS,
1118 .notify_rpm = true,
1119 .cmd = l2_spm_gdhs_cmd_sequence,
1120 },
1121 [2] = {
1122 .mode = MSM_SPM_L2_MODE_POWER_COLLAPSE,
1123 .notify_rpm = true,
1124 .cmd = l2_spm_power_off_cmd_sequence,
1125 },
1126};
1127
1128static struct msm_spm_platform_data msm_spm_l2_data[] __initdata = {
1129 [0] = {
1130 .reg_base_addr = MSM_SAW_L2_BASE,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001131 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x00,
1132 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020202,
1133 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x00A000AE,
1134 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x00A00020,
1135 .modes = msm_spm_l2_seq_list,
1136 .num_modes = ARRAY_SIZE(msm_spm_l2_seq_list),
1137 },
1138};
1139
Jay Chokshi06fa7542011-12-07 13:09:17 -08001140#/* TODO: Remove this once PM8038 physically becomes
1141 * available.
1142 */
1143#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001144#define PM_HAP_EN_GPIO PM8921_GPIO_PM_TO_SYS(33)
1145#define PM_HAP_LEN_GPIO PM8921_GPIO_PM_TO_SYS(20)
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301146#else
1147#define ISA1200_HAP_EN_GPIO 77
1148#define ISA1200_HAP_LEN_GPIO 78
1149#define ISA1200_HAP_CLK PM8038_GPIO_PM_TO_SYS(7)
Jay Chokshi06fa7542011-12-07 13:09:17 -08001150#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001151
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301152#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001153static struct msm_xo_voter *xo_handle_d1;
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301154#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001155
1156static int isa1200_power(int on)
1157{
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301158#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001159 int rc = 0;
1160
1161 gpio_set_value(HAP_SHIFT_LVL_OE_GPIO, !!on);
1162
1163 rc = on ? msm_xo_mode_vote(xo_handle_d1, MSM_XO_MODE_ON) :
1164 msm_xo_mode_vote(xo_handle_d1, MSM_XO_MODE_OFF);
1165 if (rc < 0) {
1166 pr_err("%s: failed to %svote for TCXO D1 buffer%d\n",
1167 __func__, on ? "" : "de-", rc);
1168 goto err_xo_vote;
1169 }
1170
1171 return 0;
1172
1173err_xo_vote:
1174 gpio_set_value(HAP_SHIFT_LVL_OE_GPIO, !on);
1175 return rc;
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301176#else
1177 gpio_set_value_cansleep(ISA1200_HAP_CLK, !!on);
1178
1179 return 0;
1180#endif
1181
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001182}
1183
1184static int isa1200_dev_setup(bool enable)
1185{
1186 int rc = 0;
1187
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301188#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001189 struct pm_gpio hap_gpio_config = {
1190 .direction = PM_GPIO_DIR_OUT,
1191 .pull = PM_GPIO_PULL_NO,
1192 .out_strength = PM_GPIO_STRENGTH_HIGH,
1193 .function = PM_GPIO_FUNC_NORMAL,
1194 .inv_int_pol = 0,
1195 .vin_sel = 2,
1196 .output_buffer = PM_GPIO_OUT_BUF_CMOS,
1197 .output_value = 0,
1198 };
1199
1200 if (enable == true) {
1201 rc = pm8xxx_gpio_config(PM_HAP_EN_GPIO, &hap_gpio_config);
1202 if (rc) {
1203 pr_err("%s: pm8921 gpio %d config failed(%d)\n",
1204 __func__, PM_HAP_EN_GPIO, rc);
1205 return rc;
1206 }
1207
1208 rc = pm8xxx_gpio_config(PM_HAP_LEN_GPIO, &hap_gpio_config);
1209 if (rc) {
1210 pr_err("%s: pm8921 gpio %d config failed(%d)\n",
1211 __func__, PM_HAP_LEN_GPIO, rc);
1212 return rc;
1213 }
1214
1215 rc = gpio_request(HAP_SHIFT_LVL_OE_GPIO, "hap_shft_lvl_oe");
1216 if (rc) {
1217 pr_err("%s: unable to request gpio %d (%d)\n",
1218 __func__, HAP_SHIFT_LVL_OE_GPIO, rc);
1219 return rc;
1220 }
1221
1222 rc = gpio_direction_output(HAP_SHIFT_LVL_OE_GPIO, 0);
1223 if (rc) {
1224 pr_err("%s: Unable to set direction\n", __func__);
1225 goto free_gpio;
1226 }
1227
1228 xo_handle_d1 = msm_xo_get(MSM_XO_TCXO_D1, "isa1200");
1229 if (IS_ERR(xo_handle_d1)) {
1230 rc = PTR_ERR(xo_handle_d1);
1231 pr_err("%s: failed to get the handle for D1(%d)\n",
1232 __func__, rc);
1233 goto gpio_set_dir;
1234 }
1235 } else {
1236 gpio_free(HAP_SHIFT_LVL_OE_GPIO);
1237
1238 msm_xo_put(xo_handle_d1);
1239 }
1240
1241 return 0;
1242
1243gpio_set_dir:
1244 gpio_set_value(HAP_SHIFT_LVL_OE_GPIO, 0);
1245free_gpio:
1246 gpio_free(HAP_SHIFT_LVL_OE_GPIO);
1247 return rc;
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301248#else
1249 struct pm_gpio hap_clk_gpio_config = {
1250 .direction = PM_GPIO_DIR_OUT,
1251 .pull = PM_GPIO_PULL_NO,
1252 .out_strength = PM_GPIO_STRENGTH_HIGH,
1253 .function = PM_GPIO_FUNC_1,
1254 .inv_int_pol = 0,
1255 .vin_sel = PM_GPIO_VIN_S4,
1256 .output_buffer = PM_GPIO_OUT_BUF_CMOS,
1257 .output_value = 0,
1258 };
1259
1260 rc = pm8xxx_gpio_config(ISA1200_HAP_CLK, &hap_clk_gpio_config);
1261 if (rc) {
1262 pr_err("%s: pm8038 gpio %d config failed(%d)\n",
1263 __func__, ISA1200_HAP_CLK, rc);
1264 return rc;
1265 }
1266
1267 rc = gpio_request(ISA1200_HAP_CLK, "haptics_clk");
1268 if (rc) {
1269 pr_err("%s: gpio_request for %d gpio failed rc(%d)\n",
1270 __func__, ISA1200_HAP_CLK, rc);
1271 goto fail_gpio_req;
1272 }
1273
1274 rc = gpio_direction_output(ISA1200_HAP_CLK, 0);
1275 if (rc) {
1276 pr_err("%s: gpio_direction_output failed for %d gpio rc(%d)\n",
1277 __func__, ISA1200_HAP_CLK, rc);
1278 goto fail_gpio_dir;
1279 }
1280
1281 return 0;
1282
1283fail_gpio_dir:
1284 gpio_free(ISA1200_HAP_CLK);
1285fail_gpio_req:
1286 return rc;
1287
1288#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001289}
1290
1291static struct isa1200_regulator isa1200_reg_data[] = {
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301292#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001293 {
1294 .name = "vcc_i2c",
1295 .min_uV = ISA_I2C_VTG_MIN_UV,
1296 .max_uV = ISA_I2C_VTG_MAX_UV,
1297 .load_uA = ISA_I2C_CURR_UA,
1298 },
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301299#else
1300 {
1301 .name = "vddp",
1302 .min_uV = ISA_I2C_VTG_MIN_UV,
1303 .max_uV = ISA_I2C_VTG_MAX_UV,
1304 .load_uA = ISA_I2C_CURR_UA,
1305 },
1306#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001307};
1308
1309static struct isa1200_platform_data isa1200_1_pdata = {
1310 .name = "vibrator",
1311 .dev_setup = isa1200_dev_setup,
1312 .power_on = isa1200_power,
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301313#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001314 .hap_en_gpio = PM_HAP_EN_GPIO,
1315 .hap_len_gpio = PM_HAP_LEN_GPIO,
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301316#else
1317 .hap_en_gpio = ISA1200_HAP_EN_GPIO,
1318 .hap_len_gpio = ISA1200_HAP_LEN_GPIO,
1319#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001320 .max_timeout = 15000,
1321 .mode_ctrl = PWM_GEN_MODE,
1322 .pwm_fd = {
1323 .pwm_div = 256,
1324 },
1325 .is_erm = false,
1326 .smart_en = true,
1327 .ext_clk_en = true,
1328 .chip_en = 1,
1329 .regulator_info = isa1200_reg_data,
1330 .num_regulators = ARRAY_SIZE(isa1200_reg_data),
1331};
1332
1333static struct i2c_board_info msm_isa1200_board_info[] __initdata = {
1334 {
1335 I2C_BOARD_INFO("isa1200_1", 0x90>>1),
1336 .platform_data = &isa1200_1_pdata,
1337 },
1338};
1339
Amy Malochef3c9db42011-12-08 15:17:35 -08001340#define MXT_TS_GPIO_IRQ 11
1341#define MXT_TS_RESET_GPIO 52
1342
1343static const u8 mxt_config_data_8930[] = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001344 /* T6 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001345 0, 0, 0, 0, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001346 /* T38 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001347 15, 1, 0, 15, 12, 11, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001348 /* T7 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001349 48, 255, 25,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001350 /* T8 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001351 27, 0, 5, 1, 0, 0, 8, 8, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001352 /* T9 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001353 131, 0, 0, 19, 11, 0, 16, 35, 1, 3,
Amy Malochef8130f92012-02-01 10:38:59 +05301354 10, 15, 1, 11, 4, 5, 40, 10, 43, 4,
1355 54, 2, 0, 0, 0, 0, 143, 40, 143, 80,
Amy Malochef3c9db42011-12-08 15:17:35 -08001356 18, 15, 50, 50, 2,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001357 /* T15 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001358 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1359 0,
1360 /* T18 Object */
1361 0, 0,
1362 /* T19 Object */
1363 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1364 0, 0, 0, 0, 0, 0,
1365 /* T23 Object */
1366 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1367 0, 0, 0, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001368 /* T25 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001369 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1370 0, 0, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001371 /* T40 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001372 0, 0, 0, 0, 0,
1373 /* T42 Object */
1374 0, 0, 0, 0, 0, 0, 0, 0,
1375 /* T46 Object */
1376 0, 3, 16, 48, 0, 0, 1, 0, 0,
1377 /* T47 Object */
1378 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1379 /* T48 Object */
1380 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1381 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1382 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1383 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1384 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1385 0, 0, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001386};
1387
Amy Malochef3c9db42011-12-08 15:17:35 -08001388static ssize_t mxt224e_vkeys_show(struct kobject *kobj,
1389 struct kobj_attribute *attr, char *buf)
1390{
1391 return snprintf(buf, 200,
Amy Malochef8130f92012-02-01 10:38:59 +05301392 __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":57:1030:90:90"
1393 ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":206:1030:90:90"
1394 ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":366:1030:90:90"
1395 ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":503:1030:90:90"
Amy Malochef3c9db42011-12-08 15:17:35 -08001396 "\n");
1397}
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001398
Amy Malochef3c9db42011-12-08 15:17:35 -08001399static struct kobj_attribute mxt224e_vkeys_attr = {
1400 .attr = {
1401 .mode = S_IRUGO,
1402 },
1403 .show = &mxt224e_vkeys_show,
1404};
1405
1406static struct attribute *mxt224e_properties_attrs[] = {
1407 &mxt224e_vkeys_attr.attr,
1408 NULL
1409};
1410
1411static struct attribute_group mxt224e_properties_attr_group = {
1412 .attrs = mxt224e_properties_attrs,
1413};
1414
1415static void mxt_init_vkeys_8930(void)
1416{
1417 int rc;
1418 static struct kobject *mxt224e_properties_kobj;
1419
1420 mxt224e_vkeys_attr.attr.name = "virtualkeys.atmel_mxt_ts";
1421 mxt224e_properties_kobj = kobject_create_and_add("board_properties",
1422 NULL);
1423 if (mxt224e_properties_kobj)
1424 rc = sysfs_create_group(mxt224e_properties_kobj,
1425 &mxt224e_properties_attr_group);
1426 if (!mxt224e_properties_kobj || rc)
1427 pr_err("%s: failed to create board_properties\n",
1428 __func__);
1429
1430 return;
1431}
1432
Jing Lindc4413c2012-01-16 15:22:52 -08001433static struct mxt_config_info mxt_config_array[] = {
1434 {
1435 .config = mxt_config_data_8930,
1436 .config_length = ARRAY_SIZE(mxt_config_data_8930),
1437 .family_id = 0x81,
1438 .variant_id = 0x01,
1439 .version = 0x10,
1440 .build = 0xAA,
1441 },
1442};
1443
Amy Malochef3c9db42011-12-08 15:17:35 -08001444static struct mxt_platform_data mxt_platform_data_8930 = {
Jing Lindc4413c2012-01-16 15:22:52 -08001445 .config_array = mxt_config_array,
1446 .config_array_size = ARRAY_SIZE(mxt_config_array),
Amy Malochef8130f92012-02-01 10:38:59 +05301447 .x_size = 540,
1448 .y_size = 960,
1449 .touch_x_size = 566,
1450 .touch_y_size = 1067,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001451 .irqflags = IRQF_TRIGGER_FALLING,
Anirudh Ghayald7ad84c2012-01-09 09:17:53 +05301452#ifdef MSM8930_PHASE_2
1453 .digital_pwr_regulator = true,
1454#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001455 .i2c_pull_up = true,
Amy Malochef3c9db42011-12-08 15:17:35 -08001456 .reset_gpio = MXT_TS_RESET_GPIO,
1457 .irq_gpio = MXT_TS_GPIO_IRQ,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001458};
1459
Amy Malochef3c9db42011-12-08 15:17:35 -08001460static struct i2c_board_info mxt_device_info_8930[] __initdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001461 {
Amy Malochef3c9db42011-12-08 15:17:35 -08001462 I2C_BOARD_INFO("atmel_mxt_ts", 0x4a),
1463 .platform_data = &mxt_platform_data_8930,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001464 .irq = MSM_GPIO_TO_INT(MXT_TS_GPIO_IRQ),
1465 },
1466};
1467
Anirudh Ghayaleb3af972011-12-13 17:29:06 +05301468#ifdef MSM8930_PHASE_2
1469
1470#define GPIO_VOLUME_UP PM8038_GPIO_PM_TO_SYS(3)
1471#define GPIO_VOLUME_DOWN PM8038_GPIO_PM_TO_SYS(8)
1472#define GPIO_CAMERA_SNAPSHOT PM8038_GPIO_PM_TO_SYS(10)
1473#define GPIO_CAMERA_FOCUS PM8038_GPIO_PM_TO_SYS(11)
1474
1475static struct gpio_keys_button keys_8930[] = {
1476 {
1477 .code = KEY_VOLUMEUP,
1478 .type = EV_KEY,
1479 .desc = "volume_up",
1480 .gpio = GPIO_VOLUME_UP,
1481 .wakeup = 1,
1482 .active_low = 1,
1483 },
1484 {
1485 .code = KEY_VOLUMEDOWN,
1486 .type = EV_KEY,
1487 .desc = "volume_down",
1488 .gpio = GPIO_VOLUME_DOWN,
1489 .wakeup = 1,
1490 .active_low = 1,
1491 },
1492 {
1493 .code = KEY_CAMERA_FOCUS,
1494 .type = EV_KEY,
1495 .desc = "camera_focus",
1496 .gpio = GPIO_CAMERA_FOCUS,
1497 .wakeup = 1,
1498 .active_low = 1,
1499 },
1500 {
1501 .code = KEY_CAMERA_SNAPSHOT,
1502 .type = EV_KEY,
1503 .desc = "camera_snapshot",
1504 .gpio = GPIO_CAMERA_SNAPSHOT,
1505 .wakeup = 1,
1506 .active_low = 1,
1507 },
1508};
1509
1510/* Add GPIO keys for 8930 */
1511static struct gpio_keys_platform_data gpio_keys_8930_pdata = {
1512 .buttons = keys_8930,
1513 .nbuttons = 4,
1514};
1515
1516static struct platform_device gpio_keys_8930 = {
1517 .name = "gpio-keys",
1518 .id = -1,
1519 .dev = {
1520 .platform_data = &gpio_keys_8930_pdata,
1521 },
1522};
1523#endif /* MSM8930_PHASE_2 */
1524
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001525static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi4_pdata = {
1526 .clk_freq = 100000,
1527 .src_clk_rate = 24000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001528};
1529
1530static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi3_pdata = {
1531 .clk_freq = 100000,
1532 .src_clk_rate = 24000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001533};
1534
1535static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi10_pdata = {
1536 .clk_freq = 100000,
1537 .src_clk_rate = 24000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001538};
1539
1540static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi12_pdata = {
1541 .clk_freq = 100000,
1542 .src_clk_rate = 24000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001543};
1544
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001545
1546static struct ks8851_pdata spi_eth_pdata = {
1547 .irq_gpio = KS8851_IRQ_GPIO,
1548 .rst_gpio = KS8851_RST_GPIO,
1549};
1550
1551static struct spi_board_info spi_board_info[] __initdata = {
1552 {
1553 .modalias = "ks8851",
1554 .irq = MSM_GPIO_TO_INT(KS8851_IRQ_GPIO),
1555 .max_speed_hz = 19200000,
1556 .bus_num = 0,
1557 .chip_select = 0,
1558 .mode = SPI_MODE_0,
1559 .platform_data = &spi_eth_pdata
1560 },
1561 {
1562 .modalias = "dsi_novatek_3d_panel_spi",
1563 .max_speed_hz = 10800000,
1564 .bus_num = 0,
1565 .chip_select = 1,
1566 .mode = SPI_MODE_0,
1567 },
1568};
1569
1570static struct platform_device msm_device_saw_core0 = {
Jay Chokshi06fa7542011-12-07 13:09:17 -08001571 .name = "saw-regulator",
1572 .id = 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001573 .dev = {
David Collinsb4558422012-01-05 10:50:49 -08001574 .platform_data = &msm8930_saw_regulator_core0_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001575 },
1576};
1577
1578static struct platform_device msm_device_saw_core1 = {
Jay Chokshi06fa7542011-12-07 13:09:17 -08001579 .name = "saw-regulator",
1580 .id = 1,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001581 .dev = {
David Collinsb4558422012-01-05 10:50:49 -08001582 .platform_data = &msm8930_saw_regulator_core1_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001583 },
1584};
1585
1586static struct tsens_platform_data msm_tsens_pdata = {
Siddartha Mohanadosscaeaa922012-02-07 16:41:38 -08001587 .slope = {872, 872, 872, 872, 872},
Jay Chokshi06fa7542011-12-07 13:09:17 -08001588 .tsens_factor = 1000,
1589 .hw_type = MSM_8960,
1590 .tsens_num_sensor = 5,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001591};
1592
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001593#ifdef CONFIG_MSM_FAKE_BATTERY
1594static struct platform_device fish_battery_device = {
1595 .name = "fish_battery",
1596};
1597#endif
1598
David Collins1d4061b2011-12-06 15:36:40 -08001599#ifndef MSM8930_PHASE_2
1600
1601/* 8930 Phase 1 */
Jay Chokshi06fa7542011-12-07 13:09:17 -08001602static struct platform_device msm8930_device_ext_5v_vreg __devinitdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001603 .name = GPIO_REGULATOR_DEV_NAME,
1604 .id = PM8921_MPP_PM_TO_SYS(7),
1605 .dev = {
1606 .platform_data = &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_5V],
1607 },
1608};
1609
Jay Chokshi06fa7542011-12-07 13:09:17 -08001610static struct platform_device msm8930_device_ext_l2_vreg __devinitdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001611 .name = GPIO_REGULATOR_DEV_NAME,
1612 .id = 91,
1613 .dev = {
1614 .platform_data = &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_L2],
1615 },
1616};
1617
David Collins1d4061b2011-12-06 15:36:40 -08001618#else
1619
1620/* 8930 Phase 2 */
1621static struct platform_device msm8930_device_ext_5v_vreg __devinitdata = {
1622 .name = GPIO_REGULATOR_DEV_NAME,
1623 .id = 63,
1624 .dev = {
1625 .platform_data =
1626 &msm8930_gpio_regulator_pdata[MSM8930_GPIO_VREG_ID_EXT_5V],
1627 },
1628};
1629
1630static struct platform_device msm8930_device_ext_otg_sw_vreg __devinitdata = {
1631 .name = GPIO_REGULATOR_DEV_NAME,
1632 .id = 97,
1633 .dev = {
1634 .platform_data =
1635 &msm8930_gpio_regulator_pdata[MSM8930_GPIO_VREG_ID_EXT_OTG_SW],
1636 },
1637};
1638
1639#endif
1640
Jay Chokshi06fa7542011-12-07 13:09:17 -08001641static struct platform_device msm8930_device_rpm_regulator __devinitdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001642 .name = "rpm-regulator",
1643 .id = -1,
1644 .dev = {
David Collins8af872e2012-01-06 11:31:56 -08001645#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001646 .platform_data = &msm_rpm_regulator_pdata,
David Collins8af872e2012-01-06 11:31:56 -08001647#else
1648 .platform_data = &msm8930_rpm_regulator_pdata,
Jay Chokshi06fa7542011-12-07 13:09:17 -08001649#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001650 },
1651};
1652
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001653static struct platform_device *common_devices[] __initdata = {
1654 &msm8960_device_dmov,
1655 &msm_device_smd,
1656 &msm8960_device_uart_gsbi5,
1657 &msm_device_uart_dm6,
1658 &msm_device_saw_core0,
1659 &msm_device_saw_core1,
Jay Chokshi06fa7542011-12-07 13:09:17 -08001660 &msm8930_device_ext_5v_vreg,
David Collins1d4061b2011-12-06 15:36:40 -08001661#ifndef MSM8930_PHASE_2
Jay Chokshi06fa7542011-12-07 13:09:17 -08001662 &msm8930_device_ext_l2_vreg,
David Collins1d4061b2011-12-06 15:36:40 -08001663#endif
Jay Chokshi33c044a2011-12-07 13:05:40 -08001664 &msm8960_device_ssbi_pmic,
David Collins1d4061b2011-12-06 15:36:40 -08001665#ifdef MSM8930_PHASE_2
1666 &msm8930_device_ext_otg_sw_vreg,
1667#endif
Stephen Boyd28d54952011-12-16 13:19:51 -08001668 &msm_8960_q6_lpass,
1669 &msm_8960_q6_mss_fw,
1670 &msm_8960_q6_mss_sw,
Stephen Boyd322a9922011-09-20 01:05:54 -07001671 &msm_8960_riva,
Stephen Boydd89eebe2011-09-28 23:28:11 -07001672 &msm_pil_tzapps,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001673 &msm8960_device_qup_spi_gsbi1,
1674 &msm8960_device_qup_i2c_gsbi3,
1675 &msm8960_device_qup_i2c_gsbi4,
1676 &msm8960_device_qup_i2c_gsbi10,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001677 &msm8960_device_qup_i2c_gsbi12,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001678 &msm_slim_ctrl,
1679 &msm_device_wcnss_wlan,
1680#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
1681 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE)
1682 &qcrypto_device,
1683#endif
1684
1685#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
1686 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
1687 &qcedev_device,
1688#endif
1689#ifdef CONFIG_MSM_ROTATOR
1690 &msm_rotator_device,
1691#endif
1692 &msm_device_sps,
1693#ifdef CONFIG_MSM_FAKE_BATTERY
1694 &fish_battery_device,
1695#endif
1696#ifdef CONFIG_ANDROID_PMEM
1697#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
1698 &android_pmem_device,
1699 &android_pmem_adsp_device,
1700#endif
1701 &android_pmem_audio_device,
1702#endif
1703 &msm_device_vidc,
1704 &msm_device_bam_dmux,
1705 &msm_fm_platform_init,
1706
1707#ifdef CONFIG_HW_RANDOM_MSM
1708 &msm_device_rng,
1709#endif
Praveen Chidambaram78499012011-11-01 17:15:17 -06001710 &msm8930_rpm_device,
1711 &msm8930_rpm_log_device,
1712 &msm8930_rpm_stat_device,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001713#ifdef CONFIG_ION_MSM
1714 &ion_dev,
1715#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001716 &msm_device_tz_log,
1717
1718#ifdef CONFIG_MSM_QDSS
1719 &msm_etb_device,
1720 &msm_tpiu_device,
1721 &msm_funnel_device,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001722 &msm_ptm_device,
1723#endif
1724 &msm_device_dspcrashd_8960,
1725 &msm8960_device_watchdog,
Anirudh Ghayaleb3af972011-12-13 17:29:06 +05301726#ifdef MSM8930_PHASE_2
1727 &gpio_keys_8930,
1728#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001729};
1730
1731static struct platform_device *cdp_devices[] __initdata = {
1732 &msm8960_device_otg,
1733 &msm8960_device_gadget_peripheral,
1734 &msm_device_hsusb_host,
1735 &android_usb_device,
1736 &msm_pcm,
1737 &msm_pcm_routing,
1738 &msm_cpudai0,
1739 &msm_cpudai1,
1740 &msm_cpudai_hdmi_rx,
1741 &msm_cpudai_bt_rx,
1742 &msm_cpudai_bt_tx,
1743 &msm_cpudai_fm_rx,
1744 &msm_cpudai_fm_tx,
1745 &msm_cpudai_auxpcm_rx,
1746 &msm_cpudai_auxpcm_tx,
1747 &msm_cpu_fe,
1748 &msm_stub_codec,
1749 &msm_kgsl_3d0,
1750#ifdef CONFIG_MSM_KGSL_2D
1751 &msm_kgsl_2d0,
1752 &msm_kgsl_2d1,
1753#endif
1754#ifdef CONFIG_MSM_GEMINI
1755 &msm8960_gemini_device,
1756#endif
1757 &msm_voice,
1758 &msm_voip,
1759 &msm_lpa_pcm,
1760 &msm_cpudai_afe_01_rx,
1761 &msm_cpudai_afe_01_tx,
1762 &msm_cpudai_afe_02_rx,
1763 &msm_cpudai_afe_02_tx,
1764 &msm_pcm_afe,
Ajay Dudani79e268c2011-12-28 13:14:44 -08001765 &msm_compr_dsp,
1766 &msm_cpudai_incall_music_rx,
1767 &msm_cpudai_incall_record_rx,
1768 &msm_cpudai_incall_record_tx,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001769 &msm_pcm_hostless,
1770 &msm_bus_apps_fabric,
1771 &msm_bus_sys_fabric,
1772 &msm_bus_mm_fabric,
1773 &msm_bus_sys_fpb,
1774 &msm_bus_cpss_fpb,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001775};
1776
1777static void __init msm8930_i2c_init(void)
1778{
1779 msm8960_device_qup_i2c_gsbi4.dev.platform_data =
1780 &msm8960_i2c_qup_gsbi4_pdata;
1781
1782 msm8960_device_qup_i2c_gsbi3.dev.platform_data =
1783 &msm8960_i2c_qup_gsbi3_pdata;
1784
1785 msm8960_device_qup_i2c_gsbi10.dev.platform_data =
1786 &msm8960_i2c_qup_gsbi10_pdata;
1787
1788 msm8960_device_qup_i2c_gsbi12.dev.platform_data =
1789 &msm8960_i2c_qup_gsbi12_pdata;
1790}
1791
1792static void __init msm8930_gfx_init(void)
1793{
1794 uint32_t soc_platform_version = socinfo_get_version();
1795 if (SOCINFO_VERSION_MAJOR(soc_platform_version) == 1) {
1796 struct kgsl_device_platform_data *kgsl_3d0_pdata =
1797 msm_kgsl_3d0.dev.platform_data;
1798 kgsl_3d0_pdata->pwrlevel[0].gpu_freq = 320000000;
1799 kgsl_3d0_pdata->pwrlevel[1].gpu_freq = 266667000;
1800 }
1801}
1802
1803static struct msm_cpuidle_state msm_cstates[] __initdata = {
1804 {0, 0, "C0", "WFI",
1805 MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT},
1806
1807 {0, 1, "C1", "STANDALONE_POWER_COLLAPSE",
1808 MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE},
1809
1810 {0, 2, "C2", "POWER_COLLAPSE",
1811 MSM_PM_SLEEP_MODE_POWER_COLLAPSE},
1812
1813 {1, 0, "C0", "WFI",
1814 MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT},
1815
1816 {1, 1, "C1", "STANDALONE_POWER_COLLAPSE",
1817 MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE},
1818};
1819
1820static struct msm_pm_platform_data msm_pm_data[MSM_PM_SLEEP_MODE_NR * 2] = {
1821 [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE)] = {
1822 .idle_supported = 1,
1823 .suspend_supported = 1,
1824 .idle_enabled = 0,
1825 .suspend_enabled = 0,
1826 },
1827
1828 [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = {
1829 .idle_supported = 1,
1830 .suspend_supported = 1,
1831 .idle_enabled = 0,
1832 .suspend_enabled = 0,
1833 },
1834
1835 [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = {
1836 .idle_supported = 1,
1837 .suspend_supported = 1,
1838 .idle_enabled = 1,
1839 .suspend_enabled = 1,
1840 },
1841
1842 [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_POWER_COLLAPSE)] = {
1843 .idle_supported = 0,
1844 .suspend_supported = 1,
1845 .idle_enabled = 0,
1846 .suspend_enabled = 0,
1847 },
1848
1849 [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = {
1850 .idle_supported = 1,
1851 .suspend_supported = 1,
1852 .idle_enabled = 0,
1853 .suspend_enabled = 0,
1854 },
1855
1856 [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = {
1857 .idle_supported = 1,
1858 .suspend_supported = 0,
1859 .idle_enabled = 1,
1860 .suspend_enabled = 0,
1861 },
1862};
1863
1864static struct msm_rpmrs_level msm_rpmrs_levels[] __initdata = {
1865 {
1866 MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT,
1867 MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE),
1868 true,
1869 100, 8000, 100000, 1,
1870 },
1871
1872 {
1873 MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE,
1874 MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE),
1875 true,
1876 2000, 6000, 60100000, 3000,
1877 },
1878
1879 {
1880 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1881 MSM_RPMRS_LIMITS(ON, GDHS, MAX, ACTIVE),
1882 false,
1883 4200, 5000, 60350000, 3500,
1884 },
1885
1886 {
1887 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1888 MSM_RPMRS_LIMITS(ON, HSFS_OPEN, MAX, ACTIVE),
1889 false,
1890 6300, 4500, 65350000, 4800,
1891 },
1892 {
1893 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1894 MSM_RPMRS_LIMITS(ON, HSFS_OPEN, ACTIVE, RET_HIGH),
1895 false,
1896 7000, 3500, 66600000, 5150,
1897 },
1898
1899 {
1900 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1901 MSM_RPMRS_LIMITS(OFF, GDHS, MAX, ACTIVE),
1902 false,
1903 11700, 2500, 67850000, 5500,
1904 },
1905
1906 {
1907 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1908 MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, MAX, ACTIVE),
1909 false,
1910 13800, 2000, 71850000, 6800,
1911 },
1912
1913 {
1914 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1915 MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, ACTIVE, RET_HIGH),
1916 false,
1917 29700, 500, 75850000, 8800,
1918 },
1919
1920 {
1921 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1922 MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, RET_HIGH, RET_LOW),
1923 false,
1924 29700, 0, 76350000, 9800,
1925 },
1926};
1927
Praveen Chidambaram78499012011-11-01 17:15:17 -06001928static struct msm_rpmrs_platform_data msm_rpmrs_data __initdata = {
1929 .levels = &msm_rpmrs_levels[0],
1930 .num_levels = ARRAY_SIZE(msm_rpmrs_levels),
1931 .vdd_mem_levels = {
1932 [MSM_RPMRS_VDD_MEM_RET_LOW] = 750000,
1933 [MSM_RPMRS_VDD_MEM_RET_HIGH] = 750000,
1934 [MSM_RPMRS_VDD_MEM_ACTIVE] = 1050000,
1935 [MSM_RPMRS_VDD_MEM_MAX] = 1150000,
1936 },
1937 .vdd_dig_levels = {
1938 [MSM_RPMRS_VDD_DIG_RET_LOW] = 500000,
1939 [MSM_RPMRS_VDD_DIG_RET_HIGH] = 750000,
1940 [MSM_RPMRS_VDD_DIG_ACTIVE] = 950000,
1941 [MSM_RPMRS_VDD_DIG_MAX] = 1150000,
1942 },
1943 .vdd_mask = 0x7FFFFF,
1944 .rpmrs_target_id = {
1945 [MSM_RPMRS_ID_PXO_CLK] = MSM_RPM_ID_PXO_CLK,
1946 [MSM_RPMRS_ID_L2_CACHE_CTL] = MSM_RPM_ID_LAST,
1947 [MSM_RPMRS_ID_VDD_DIG_0] = MSM_RPM_ID_PM8038_S1_0,
1948 [MSM_RPMRS_ID_VDD_DIG_1] = MSM_RPM_ID_PM8038_S1_1,
1949 [MSM_RPMRS_ID_VDD_MEM_0] = MSM_RPM_ID_PM8038_L24_0,
1950 [MSM_RPMRS_ID_VDD_MEM_1] = MSM_RPM_ID_PM8038_L24_1,
1951 [MSM_RPMRS_ID_RPM_CTL] = MSM_RPM_ID_RPM_CTL,
1952 },
1953};
1954
Maheshkumar Sivasubramanianc6c55032011-10-25 16:01:32 -06001955static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = {
1956 .mode = MSM_PM_BOOT_CONFIG_TZ,
1957};
1958
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001959#ifdef CONFIG_I2C
1960#define I2C_SURF 1
1961#define I2C_FFA (1 << 1)
1962#define I2C_RUMI (1 << 2)
1963#define I2C_SIM (1 << 3)
1964#define I2C_FLUID (1 << 4)
1965#define I2C_LIQUID (1 << 5)
1966
1967struct i2c_registry {
1968 u8 machs;
1969 int bus;
1970 struct i2c_board_info *info;
1971 int len;
1972};
1973
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001974static void __init msm8930_init_hsic(void)
1975{
1976#ifdef CONFIG_USB_EHCI_MSM_HSIC
1977 uint32_t version = socinfo_get_version();
1978
1979 pr_info("%s: version:%d mtp:%d\n", __func__,
1980 SOCINFO_VERSION_MAJOR(version),
1981 machine_is_msm8930_mtp());
1982
1983 if ((SOCINFO_VERSION_MAJOR(version) == 1) ||
1984 machine_is_msm8930_mtp() ||
1985 machine_is_msm8930_fluid())
1986 return;
1987
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001988 platform_device_register(&msm_device_hsic_host);
1989#endif
1990}
1991
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001992#ifdef CONFIG_ISL9519_CHARGER
1993static struct isl_platform_data isl_data __initdata = {
1994 .valid_n_gpio = 0, /* Not required when notify-by-pmic */
1995 .chg_detection_config = NULL, /* Not required when notify-by-pmic */
1996 .max_system_voltage = 4200,
1997 .min_system_voltage = 3200,
1998 .chgcurrent = 1000, /* 1900, */
1999 .term_current = 400, /* Need fine tuning */
2000 .input_current = 2048,
2001};
2002
2003static struct i2c_board_info isl_charger_i2c_info[] __initdata = {
2004 {
2005 I2C_BOARD_INFO("isl9519q", 0x9),
2006 .irq = 0, /* Not required when notify-by-pmic */
2007 .platform_data = &isl_data,
2008 },
2009};
2010#endif /* CONFIG_ISL9519_CHARGER */
2011
2012static struct i2c_registry msm8960_i2c_devices[] __initdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002013#ifdef CONFIG_ISL9519_CHARGER
2014 {
2015 I2C_LIQUID,
2016 MSM_8930_GSBI10_QUP_I2C_BUS_ID,
2017 isl_charger_i2c_info,
2018 ARRAY_SIZE(isl_charger_i2c_info),
2019 },
2020#endif /* CONFIG_ISL9519_CHARGER */
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05302021#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002022 {
2023 I2C_LIQUID,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002024 MSM_8930_GSBI10_QUP_I2C_BUS_ID,
2025 msm_isa1200_board_info,
2026 ARRAY_SIZE(msm_isa1200_board_info),
2027 },
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05302028#else
2029 {
2030 I2C_FFA | I2C_FLUID,
2031 MSM_8930_GSBI10_QUP_I2C_BUS_ID,
2032 msm_isa1200_board_info,
2033 ARRAY_SIZE(msm_isa1200_board_info),
2034 },
2035#endif
Amy Malochef3c9db42011-12-08 15:17:35 -08002036 {
2037 I2C_SURF,
2038 MSM_8930_GSBI3_QUP_I2C_BUS_ID,
2039 mxt_device_info_8930,
2040 ARRAY_SIZE(mxt_device_info_8930),
2041 },
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002042};
2043#endif /* CONFIG_I2C */
2044
2045static void __init register_i2c_devices(void)
2046{
2047#ifdef CONFIG_I2C
2048 u8 mach_mask = 0;
2049 int i;
Kevin Chan09f4e662011-12-16 08:17:02 -08002050#ifdef CONFIG_MSM_CAMERA
2051 struct i2c_registry msm8930_camera_i2c_devices = {
2052 I2C_SURF | I2C_FFA | I2C_FLUID | I2C_LIQUID | I2C_RUMI,
2053 MSM_8930_GSBI4_QUP_I2C_BUS_ID,
2054 msm8930_camera_board_info.board_info,
2055 msm8930_camera_board_info.num_i2c_board_info,
2056 };
2057#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002058
2059 /* Build the matching 'supported_machs' bitmask */
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002060 if (machine_is_msm8930_cdp() || machine_is_msm8627_cdp())
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002061 mach_mask = I2C_SURF;
2062 else if (machine_is_msm8930_fluid())
2063 mach_mask = I2C_FLUID;
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002064 else if (machine_is_msm8930_mtp() || machine_is_msm8627_mtp())
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002065 mach_mask = I2C_FFA;
2066 else
2067 pr_err("unmatched machine ID in register_i2c_devices\n");
2068
2069 /* Run the array and install devices as appropriate */
2070 for (i = 0; i < ARRAY_SIZE(msm8960_i2c_devices); ++i) {
2071 if (msm8960_i2c_devices[i].machs & mach_mask)
2072 i2c_register_board_info(msm8960_i2c_devices[i].bus,
2073 msm8960_i2c_devices[i].info,
2074 msm8960_i2c_devices[i].len);
2075 }
Kevin Chan09f4e662011-12-16 08:17:02 -08002076#ifdef CONFIG_MSM_CAMERA
2077 if (msm8930_camera_i2c_devices.machs & mach_mask)
2078 i2c_register_board_info(msm8930_camera_i2c_devices.bus,
2079 msm8930_camera_i2c_devices.info,
2080 msm8930_camera_i2c_devices.len);
2081#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002082#endif
2083}
2084
2085static void __init msm8930_cdp_init(void)
2086{
2087 if (meminfo_init(SYS_MEMORY, SZ_256M) < 0)
2088 pr_err("meminfo_init() failed!\n");
2089
Siddartha Mohanadossfad0af12012-01-20 15:08:38 -08002090 msm_tsens_early_init(&msm_tsens_pdata);
Praveen Chidambaram78499012011-11-01 17:15:17 -06002091 BUG_ON(msm_rpm_init(&msm8930_rpm_data));
2092 BUG_ON(msm_rpmrs_levels_init(&msm_rpmrs_data));
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002093
2094 regulator_suppress_info_printing();
2095 if (msm_xo_init())
2096 pr_err("Failed to initialize XO votes\n");
Jay Chokshi06fa7542011-12-07 13:09:17 -08002097 platform_device_register(&msm8930_device_rpm_regulator);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002098 msm_clock_init(&msm8960_clock_init_data);
2099 msm8960_device_otg.dev.platform_data = &msm_otg_pdata;
2100 msm_device_hsic_host.dev.platform_data = &msm_hsic_pdata;
Stepan Moskovchenko3b09bf52011-12-06 20:40:53 -08002101 msm8930_init_gpiomux();
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002102 msm8960_device_qup_spi_gsbi1.dev.platform_data =
2103 &msm8960_qup_spi_gsbi1_pdata;
2104 spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
2105
Jay Chokshi06fa7542011-12-07 13:09:17 -08002106 /*
2107 * TODO: When physical 8930/PM8038 hardware becomes
2108 * available, remove this block or add the config
2109 * option.
2110 */
2111#ifndef MSM8930_PHASE_2
2112 msm8960_init_pmic();
2113#else
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002114 msm8930_init_pmic();
Jay Chokshi06fa7542011-12-07 13:09:17 -08002115#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002116 msm8930_i2c_init();
2117 msm8930_gfx_init();
2118 msm_spm_init(msm_spm_data, ARRAY_SIZE(msm_spm_data));
2119 msm_spm_l2_init(msm_spm_l2_data);
2120 msm8930_init_buses();
2121 platform_add_devices(msm_footswitch_devices,
2122 msm_num_footswitch_devices);
2123 platform_add_devices(common_devices, ARRAY_SIZE(common_devices));
Jay Chokshi06fa7542011-12-07 13:09:17 -08002124 /*
2125 * TODO: When physical 8930/PM8038 hardware becomes
2126 * available, remove this block or add the config
2127 * option.
2128 */
2129#ifndef MSM8930_PHASE_2
2130 msm8960_pm8921_gpio_mpp_init();
2131#else
2132 msm8930_pm8038_gpio_mpp_init();
2133#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002134 platform_add_devices(cdp_devices, ARRAY_SIZE(cdp_devices));
2135 msm8930_init_hsic();
2136 msm8930_init_cam();
2137 msm8930_init_mmc();
Tianyi Gou7c6b81f2011-12-07 23:09:08 -08002138 acpuclk_init(&acpuclk_8930_soc_data);
Amy Malochef3c9db42011-12-08 15:17:35 -08002139 if (machine_is_msm8930_cdp() || machine_is_msm8627_cdp())
2140 mxt_init_vkeys_8930();
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002141 register_i2c_devices();
2142 msm8930_init_fb();
2143 slim_register_board_info(msm_slim_devices,
2144 ARRAY_SIZE(msm_slim_devices));
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002145 msm_pm_set_platform_data(msm_pm_data, ARRAY_SIZE(msm_pm_data));
2146 msm_pm_set_rpm_wakeup_irq(RPM_APCC_CPU0_WAKE_UP_IRQ);
2147 msm_cpuidle_set_states(msm_cstates, ARRAY_SIZE(msm_cstates),
2148 msm_pm_data);
2149 change_memory_power = &msm8930_change_memory_power;
Maheshkumar Sivasubramanianc6c55032011-10-25 16:01:32 -06002150 BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata));
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002151
2152 if (PLATFORM_IS_CHARM25())
2153 platform_add_devices(mdm_devices, ARRAY_SIZE(mdm_devices));
2154}
2155
2156MACHINE_START(MSM8930_CDP, "QCT MSM8930 CDP")
2157 .map_io = msm8930_map_io,
2158 .reserve = msm8930_reserve,
2159 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302160 .handle_irq = gic_handle_irq,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002161 .timer = &msm_timer,
2162 .init_machine = msm8930_cdp_init,
2163 .init_early = msm8930_allocate_memory_regions,
2164 .init_very_early = msm8930_early_memory,
2165MACHINE_END
2166
2167MACHINE_START(MSM8930_MTP, "QCT MSM8930 MTP")
2168 .map_io = msm8930_map_io,
2169 .reserve = msm8930_reserve,
2170 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302171 .handle_irq = gic_handle_irq,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002172 .timer = &msm_timer,
2173 .init_machine = msm8930_cdp_init,
2174 .init_early = msm8930_allocate_memory_regions,
2175 .init_very_early = msm8930_early_memory,
2176MACHINE_END
2177
2178MACHINE_START(MSM8930_FLUID, "QCT MSM8930 FLUID")
2179 .map_io = msm8930_map_io,
2180 .reserve = msm8930_reserve,
2181 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302182 .handle_irq = gic_handle_irq,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002183 .timer = &msm_timer,
2184 .init_machine = msm8930_cdp_init,
2185 .init_early = msm8930_allocate_memory_regions,
2186 .init_very_early = msm8930_early_memory,
2187MACHINE_END
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002188
2189MACHINE_START(MSM8627_CDP, "QCT MSM8627 CDP")
2190 .map_io = msm8930_map_io,
2191 .reserve = msm8930_reserve,
2192 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302193 .handle_irq = gic_handle_irq,
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002194 .timer = &msm_timer,
2195 .init_machine = msm8930_cdp_init,
2196 .init_early = msm8930_allocate_memory_regions,
2197 .init_very_early = msm8930_early_memory,
2198MACHINE_END
2199
2200MACHINE_START(MSM8627_MTP, "QCT MSM8627 MTP")
2201 .map_io = msm8930_map_io,
2202 .reserve = msm8930_reserve,
2203 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302204 .handle_irq = gic_handle_irq,
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002205 .timer = &msm_timer,
2206 .init_machine = msm8930_cdp_init,
2207 .init_early = msm8930_allocate_memory_regions,
2208 .init_very_early = msm8930_early_memory,
2209MACHINE_END