blob: fe125e37d54a109a039a1d5966e4c542549b32b8 [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
33#include <linux/cyttsp.h>
34#include <linux/dma-mapping.h>
35#include <linux/platform_data/qcom_crypto_device.h>
36#include <linux/platform_data/qcom_wcnss_device.h>
37#include <linux/leds.h>
38#include <linux/leds-pm8xxx.h>
39#include <linux/i2c/atmel_mxt_ts.h>
40#include <linux/msm_tsens.h>
41#include <linux/ks8851.h>
42#include <linux/i2c/isa1200.h>
Anirudh Ghayaleb3af972011-12-13 17:29:06 +053043#include <linux/gpio_keys.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"
Abhijeet Dharmapurikarefaca4f2011-12-27 16:24:07 -080085#include <mach/pm.h>
86#include <mach/cpuidle.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080087#include "rpm_resources.h"
88#include "mpm.h"
89#include "acpuclock.h"
90#include "rpm_log.h"
91#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
Ben Romberger3ffcd812011-12-08 19:12:10 -0800121#define MSM_PMEM_AUDIO_SIZE 0x2B4000
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
127
128
129#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
130#define MSM_PMEM_KERNEL_EBI1_SIZE 0xB0C000
Olav Hauganb88eef12012-01-15 10:59:26 -0800131#define MSM_ION_SF_SIZE MSM_PMEM_SIZE
Olav Haugan42ebe712012-01-10 16:30:58 -0800132#define MSM_ION_MM_FW_SIZE 0x200000 /* (2MB) */
Olav Hauganb88eef12012-01-15 10:59:26 -0800133#define MSM_ION_MM_SIZE MSM_PMEM_ADSP_SIZE
Olav Haugan80854eb2012-01-12 12:00:23 -0800134#define MSM_ION_QSECOM_SIZE 0x100000 /* (1MB) */
Olav Hauganb5be7992011-11-18 14:29:02 -0800135#define MSM_ION_MFC_SIZE SZ_8K
Olav Haugan7355db02012-01-13 16:59:13 -0800136#define MSM_ION_AUDIO_SIZE MSM_PMEM_AUDIO_SIZE
137#define MSM_ION_HEAP_NUM 8
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800138#else
139#define MSM_PMEM_KERNEL_EBI1_SIZE 0x110C000
Olav Hauganb5be7992011-11-18 14:29:02 -0800140#define MSM_ION_HEAP_NUM 1
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800141#endif
142
143#ifdef CONFIG_KERNEL_PMEM_EBI_REGION
144static unsigned pmem_kernel_ebi1_size = MSM_PMEM_KERNEL_EBI1_SIZE;
145static int __init pmem_kernel_ebi1_size_setup(char *p)
146{
147 pmem_kernel_ebi1_size = memparse(p, NULL);
148 return 0;
149}
150early_param("pmem_kernel_ebi1_size", pmem_kernel_ebi1_size_setup);
151#endif
152
153#ifdef CONFIG_ANDROID_PMEM
154static unsigned pmem_size = MSM_PMEM_SIZE;
155static int __init pmem_size_setup(char *p)
156{
157 pmem_size = memparse(p, NULL);
158 return 0;
159}
160early_param("pmem_size", pmem_size_setup);
161
162static unsigned pmem_adsp_size = MSM_PMEM_ADSP_SIZE;
163
164static int __init pmem_adsp_size_setup(char *p)
165{
166 pmem_adsp_size = memparse(p, NULL);
167 return 0;
168}
169early_param("pmem_adsp_size", pmem_adsp_size_setup);
170
171static unsigned pmem_audio_size = MSM_PMEM_AUDIO_SIZE;
172
173static int __init pmem_audio_size_setup(char *p)
174{
175 pmem_audio_size = memparse(p, NULL);
176 return 0;
177}
178early_param("pmem_audio_size", pmem_audio_size_setup);
179#endif
180
181#ifdef CONFIG_ANDROID_PMEM
182#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
183static struct android_pmem_platform_data android_pmem_pdata = {
184 .name = "pmem",
185 .allocator_type = PMEM_ALLOCATORTYPE_ALLORNOTHING,
186 .cached = 1,
187 .memory_type = MEMTYPE_EBI1,
188};
189
190static struct platform_device android_pmem_device = {
191 .name = "android_pmem",
192 .id = 0,
193 .dev = {.platform_data = &android_pmem_pdata},
194};
195
196static struct android_pmem_platform_data android_pmem_adsp_pdata = {
197 .name = "pmem_adsp",
198 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
199 .cached = 0,
200 .memory_type = MEMTYPE_EBI1,
201};
202static struct platform_device android_pmem_adsp_device = {
203 .name = "android_pmem",
204 .id = 2,
205 .dev = { .platform_data = &android_pmem_adsp_pdata },
206};
207#endif
208
209static struct android_pmem_platform_data android_pmem_audio_pdata = {
210 .name = "pmem_audio",
211 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
212 .cached = 0,
213 .memory_type = MEMTYPE_EBI1,
214};
215
216static struct platform_device android_pmem_audio_device = {
217 .name = "android_pmem",
218 .id = 4,
219 .dev = { .platform_data = &android_pmem_audio_pdata },
220};
221#endif
222
223#define DSP_RAM_BASE_8960 0x8da00000
224#define DSP_RAM_SIZE_8960 0x1800000
225static int dspcrashd_pdata_8960 = 0xDEADDEAD;
226
227static struct resource resources_dspcrashd_8960[] = {
228 {
229 .name = "msm_dspcrashd",
230 .start = DSP_RAM_BASE_8960,
231 .end = DSP_RAM_BASE_8960 + DSP_RAM_SIZE_8960,
232 .flags = IORESOURCE_DMA,
233 },
234};
235
236static struct platform_device msm_device_dspcrashd_8960 = {
237 .name = "msm_dspcrashd",
238 .num_resources = ARRAY_SIZE(resources_dspcrashd_8960),
239 .resource = resources_dspcrashd_8960,
240 .dev = { .platform_data = &dspcrashd_pdata_8960 },
241};
242
243static struct memtype_reserve msm8930_reserve_table[] __initdata = {
244 [MEMTYPE_SMI] = {
245 },
246 [MEMTYPE_EBI0] = {
247 .flags = MEMTYPE_FLAGS_1M_ALIGN,
248 },
249 [MEMTYPE_EBI1] = {
250 .flags = MEMTYPE_FLAGS_1M_ALIGN,
251 },
252};
253
254static void __init size_pmem_devices(void)
255{
256#ifdef CONFIG_ANDROID_PMEM
257#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
258 android_pmem_adsp_pdata.size = pmem_adsp_size;
259 android_pmem_pdata.size = pmem_size;
260#endif
261 android_pmem_audio_pdata.size = MSM_PMEM_AUDIO_SIZE;
262#endif
263}
264
265static void __init reserve_memory_for(struct android_pmem_platform_data *p)
266{
267 msm8930_reserve_table[p->memory_type].size += p->size;
268}
269
270static void __init reserve_pmem_memory(void)
271{
272#ifdef CONFIG_ANDROID_PMEM
273#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
274 reserve_memory_for(&android_pmem_adsp_pdata);
275 reserve_memory_for(&android_pmem_pdata);
276#endif
277 reserve_memory_for(&android_pmem_audio_pdata);
278 msm8930_reserve_table[MEMTYPE_EBI1].size += pmem_kernel_ebi1_size;
279#endif
280}
281
282static int msm8930_paddr_to_memtype(unsigned int paddr)
283{
284 return MEMTYPE_EBI1;
285}
286
287#ifdef CONFIG_ION_MSM
Olav Haugan0703dbf2011-12-19 17:53:38 -0800288#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
289static struct ion_cp_heap_pdata cp_mm_ion_pdata = {
290 .permission_type = IPT_TYPE_MM_CARVEOUT,
Olav Haugan42ebe712012-01-10 16:30:58 -0800291 .align = PAGE_SIZE,
Olav Haugan0703dbf2011-12-19 17:53:38 -0800292};
293
294static struct ion_cp_heap_pdata cp_mfc_ion_pdata = {
295 .permission_type = IPT_TYPE_MFC_SHAREDMEM,
Olav Haugan42ebe712012-01-10 16:30:58 -0800296 .align = PAGE_SIZE,
Olav Haugan0703dbf2011-12-19 17:53:38 -0800297};
298static struct ion_co_heap_pdata co_ion_pdata = {
Olav Haugan42ebe712012-01-10 16:30:58 -0800299 .adjacent_mem_id = INVALID_HEAP_ID,
300 .align = PAGE_SIZE,
301};
302static struct ion_co_heap_pdata fw_co_ion_pdata = {
303 .adjacent_mem_id = ION_CP_MM_HEAP_ID,
304 .align = SZ_128K,
Olav Haugan0703dbf2011-12-19 17:53:38 -0800305};
306#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800307static struct ion_platform_data ion_pdata = {
308 .nr = MSM_ION_HEAP_NUM,
309 .heaps = {
310 {
Olav Hauganb5be7992011-11-18 14:29:02 -0800311 .id = ION_SYSTEM_HEAP_ID,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800312 .type = ION_HEAP_TYPE_SYSTEM,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800313 .name = ION_VMALLOC_HEAP_NAME,
314 },
315#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
316 {
Olav Hauganb5be7992011-11-18 14:29:02 -0800317 .id = ION_SF_HEAP_ID,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800318 .type = ION_HEAP_TYPE_CARVEOUT,
Olav Hauganb5be7992011-11-18 14:29:02 -0800319 .name = ION_SF_HEAP_NAME,
320 .size = MSM_ION_SF_SIZE,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800321 .memory_type = ION_EBI_TYPE,
Olav Haugan42ebe712012-01-10 16:30:58 -0800322 .extra_data = (void *) &co_ion_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800323 },
324 {
Olav Hauganb5be7992011-11-18 14:29:02 -0800325 .id = ION_CP_MM_HEAP_ID,
Olav Haugan0a852512012-01-09 10:20:55 -0800326 .type = ION_HEAP_TYPE_CP,
Olav Hauganb5be7992011-11-18 14:29:02 -0800327 .name = ION_MM_HEAP_NAME,
328 .size = MSM_ION_MM_SIZE,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800329 .memory_type = ION_EBI_TYPE,
Olav Haugan0703dbf2011-12-19 17:53:38 -0800330 .extra_data = (void *) &cp_mm_ion_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800331 },
Olav Hauganb5be7992011-11-18 14:29:02 -0800332 {
Olav Haugan42ebe712012-01-10 16:30:58 -0800333 .id = ION_MM_FIRMWARE_HEAP_ID,
334 .type = ION_HEAP_TYPE_CARVEOUT,
335 .name = ION_MM_FIRMWARE_HEAP_NAME,
336 .size = MSM_ION_MM_FW_SIZE,
337 .memory_type = ION_EBI_TYPE,
338 .extra_data = (void *) &fw_co_ion_pdata,
339 },
340 {
Olav Hauganb5be7992011-11-18 14:29:02 -0800341 .id = ION_CP_MFC_HEAP_ID,
Olav Haugan0a852512012-01-09 10:20:55 -0800342 .type = ION_HEAP_TYPE_CP,
Olav Hauganb5be7992011-11-18 14:29:02 -0800343 .name = ION_MFC_HEAP_NAME,
344 .size = MSM_ION_MFC_SIZE,
345 .memory_type = ION_EBI_TYPE,
Olav Haugan0703dbf2011-12-19 17:53:38 -0800346 .extra_data = (void *) &cp_mfc_ion_pdata,
Olav Hauganb5be7992011-11-18 14:29:02 -0800347 },
348 {
349 .id = ION_IOMMU_HEAP_ID,
350 .type = ION_HEAP_TYPE_IOMMU,
351 .name = ION_IOMMU_HEAP_NAME,
352 },
Olav Haugan80854eb2012-01-12 12:00:23 -0800353 {
354 .id = ION_QSECOM_HEAP_ID,
355 .type = ION_HEAP_TYPE_CARVEOUT,
356 .name = ION_QSECOM_HEAP_NAME,
357 .size = MSM_ION_QSECOM_SIZE,
358 .memory_type = ION_EBI_TYPE,
359 .extra_data = (void *) &co_ion_pdata,
360 },
Olav Haugan7355db02012-01-13 16:59:13 -0800361 {
362 .id = ION_AUDIO_HEAP_ID,
363 .type = ION_HEAP_TYPE_CARVEOUT,
364 .name = ION_AUDIO_HEAP_NAME,
365 .size = MSM_ION_AUDIO_SIZE,
366 .memory_type = ION_EBI_TYPE,
367 .extra_data = (void *) &co_ion_pdata,
368 },
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800369#endif
370 }
371};
372
373static struct platform_device ion_dev = {
374 .name = "ion-msm",
375 .id = 1,
376 .dev = { .platform_data = &ion_pdata },
377};
378#endif
379
380static void reserve_ion_memory(void)
381{
382#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION)
Olav Hauganb5be7992011-11-18 14:29:02 -0800383 msm8930_reserve_table[MEMTYPE_EBI1].size += MSM_ION_SF_SIZE;
384 msm8930_reserve_table[MEMTYPE_EBI1].size += MSM_ION_MM_SIZE;
Olav Haugan42ebe712012-01-10 16:30:58 -0800385 msm8930_reserve_table[MEMTYPE_EBI1].size += MSM_ION_MM_FW_SIZE;
Olav Hauganb5be7992011-11-18 14:29:02 -0800386 msm8930_reserve_table[MEMTYPE_EBI1].size += MSM_ION_MFC_SIZE;
Olav Haugan80854eb2012-01-12 12:00:23 -0800387 msm8930_reserve_table[MEMTYPE_EBI1].size += MSM_ION_QSECOM_SIZE;
Olav Haugan7355db02012-01-13 16:59:13 -0800388 msm8930_reserve_table[MEMTYPE_EBI1].size += MSM_ION_AUDIO_SIZE;
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800389#endif
390}
Huaibin Yanga5419422011-12-08 23:52:10 -0800391
392static void __init reserve_mdp_memory(void)
393{
394 msm8930_mdp_writeback(msm8930_reserve_table);
395}
396
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800397static void __init msm8930_calculate_reserve_sizes(void)
398{
399 size_pmem_devices();
400 reserve_pmem_memory();
401 reserve_ion_memory();
Huaibin Yanga5419422011-12-08 23:52:10 -0800402 reserve_mdp_memory();
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800403}
404
405static struct reserve_info msm8930_reserve_info __initdata = {
406 .memtype_reserve_table = msm8930_reserve_table,
407 .calculate_reserve_sizes = msm8930_calculate_reserve_sizes,
408 .paddr_to_memtype = msm8930_paddr_to_memtype,
409};
410
411static int msm8930_memory_bank_size(void)
412{
413 return 1<<29;
414}
415
416static void __init locate_unstable_memory(void)
417{
418 struct membank *mb = &meminfo.bank[meminfo.nr_banks - 1];
419 unsigned long bank_size;
420 unsigned long low, high;
421
422 bank_size = msm8930_memory_bank_size();
423 low = meminfo.bank[0].start;
424 high = mb->start + mb->size;
425
426 /* Check if 32 bit overflow occured */
427 if (high < mb->start)
428 high = ~0UL;
429
430 low &= ~(bank_size - 1);
431
432 if (high - low <= bank_size)
433 return;
434 msm8930_reserve_info.low_unstable_address = low + bank_size;
435 /* To avoid overflow of u32 compute max_unstable_size
436 * by first subtracting low from mb->start)
437 * */
438 msm8930_reserve_info.max_unstable_size = (mb->start - low) +
439 mb->size - bank_size;
440
441 msm8930_reserve_info.bank_size = bank_size;
442 pr_info("low unstable address %lx max size %lx bank size %lx\n",
443 msm8930_reserve_info.low_unstable_address,
444 msm8930_reserve_info.max_unstable_size,
445 msm8930_reserve_info.bank_size);
446}
447
448static void __init place_movable_zone(void)
449{
450 movable_reserved_start = msm8930_reserve_info.low_unstable_address;
451 movable_reserved_size = msm8930_reserve_info.max_unstable_size;
452 pr_info("movable zone start %lx size %lx\n",
453 movable_reserved_start, movable_reserved_size);
454}
455
456static void __init msm8930_early_memory(void)
457{
458 reserve_info = &msm8930_reserve_info;
459 locate_unstable_memory();
460 place_movable_zone();
461}
462
463static void __init msm8930_reserve(void)
464{
465 msm_reserve();
466}
467
468static int msm8930_change_memory_power(u64 start, u64 size,
469 int change_type)
470{
471 return soc_change_memory_power(start, size, change_type);
472}
473
474static void __init msm8930_allocate_memory_regions(void)
475{
476 msm8930_allocate_fb_region();
477}
478
479#ifdef CONFIG_WCD9310_CODEC
480
481#define TABLA_INTERRUPT_BASE (NR_MSM_IRQS + NR_GPIO_IRQS + NR_PM8921_IRQS)
482
483/* Micbias setting is based on 8660 CDP/MTP/FLUID requirement
484 * 4 micbiases are used to power various analog and digital
485 * microphones operating at 1800 mV. Technically, all micbiases
486 * can source from single cfilter since all microphones operate
487 * at the same voltage level. The arrangement below is to make
488 * sure all cfilters are exercised. LDO_H regulator ouput level
489 * does not need to be as high as 2.85V. It is choosen for
490 * microphone sensitivity purpose.
491 */
492static struct tabla_pdata tabla_platform_data = {
493 .slimbus_slave_device = {
494 .name = "tabla-slave",
495 .e_addr = {0, 0, 0x10, 0, 0x17, 2},
496 },
497 .irq = MSM_GPIO_TO_INT(62),
498 .irq_base = TABLA_INTERRUPT_BASE,
499 .num_irqs = NR_TABLA_IRQS,
Jay Chokshi06fa7542011-12-07 13:09:17 -0800500
501/*TODO: Replace this with right PM8038 gpio */
502#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800503 .reset_gpio = PM8921_GPIO_PM_TO_SYS(34),
Jay Chokshi06fa7542011-12-07 13:09:17 -0800504#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800505 .micbias = {
506 .ldoh_v = TABLA_LDOH_2P85_V,
507 .cfilt1_mv = 1800,
508 .cfilt2_mv = 1800,
509 .cfilt3_mv = 1800,
510 .bias1_cfilt_sel = TABLA_CFILT1_SEL,
511 .bias2_cfilt_sel = TABLA_CFILT2_SEL,
512 .bias3_cfilt_sel = TABLA_CFILT3_SEL,
513 .bias4_cfilt_sel = TABLA_CFILT3_SEL,
514 }
515};
516
517static struct slim_device msm_slim_tabla = {
518 .name = "tabla-slim",
519 .e_addr = {0, 1, 0x10, 0, 0x17, 2},
520 .dev = {
521 .platform_data = &tabla_platform_data,
522 },
523};
524
525static struct tabla_pdata tabla20_platform_data = {
526 .slimbus_slave_device = {
527 .name = "tabla-slave",
528 .e_addr = {0, 0, 0x60, 0, 0x17, 2},
529 },
530 .irq = MSM_GPIO_TO_INT(62),
531 .irq_base = TABLA_INTERRUPT_BASE,
532 .num_irqs = NR_TABLA_IRQS,
Jay Chokshi06fa7542011-12-07 13:09:17 -0800533
534/*TODO: Replace this with right PM8038 gpio */
535#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800536 .reset_gpio = PM8921_GPIO_PM_TO_SYS(34),
Jay Chokshi06fa7542011-12-07 13:09:17 -0800537#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800538 .micbias = {
539 .ldoh_v = TABLA_LDOH_2P85_V,
540 .cfilt1_mv = 1800,
541 .cfilt2_mv = 1800,
542 .cfilt3_mv = 1800,
543 .bias1_cfilt_sel = TABLA_CFILT1_SEL,
544 .bias2_cfilt_sel = TABLA_CFILT2_SEL,
545 .bias3_cfilt_sel = TABLA_CFILT3_SEL,
546 .bias4_cfilt_sel = TABLA_CFILT3_SEL,
547 }
548};
549
550static struct slim_device msm_slim_tabla20 = {
551 .name = "tabla2x-slim",
552 .e_addr = {0, 1, 0x60, 0, 0x17, 2},
553 .dev = {
554 .platform_data = &tabla20_platform_data,
555 },
556};
557#endif
558
559static struct slim_boardinfo msm_slim_devices[] = {
560#ifdef CONFIG_WCD9310_CODEC
561 {
562 .bus_num = 1,
563 .slim_slave = &msm_slim_tabla,
564 },
565 {
566 .bus_num = 1,
567 .slim_slave = &msm_slim_tabla20,
568 },
569#endif
570 /* add more slimbus slaves as needed */
571};
572
573#define MSM_WCNSS_PHYS 0x03000000
574#define MSM_WCNSS_SIZE 0x280000
575
576static struct resource resources_wcnss_wlan[] = {
577 {
578 .start = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ,
579 .end = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ,
580 .name = "wcnss_wlanrx_irq",
581 .flags = IORESOURCE_IRQ,
582 },
583 {
584 .start = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ,
585 .end = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ,
586 .name = "wcnss_wlantx_irq",
587 .flags = IORESOURCE_IRQ,
588 },
589 {
590 .start = MSM_WCNSS_PHYS,
591 .end = MSM_WCNSS_PHYS + MSM_WCNSS_SIZE - 1,
592 .name = "wcnss_mmio",
593 .flags = IORESOURCE_MEM,
594 },
595 {
596 .start = 84,
597 .end = 88,
598 .name = "wcnss_gpios_5wire",
599 .flags = IORESOURCE_IO,
600 },
601};
602
603static struct qcom_wcnss_opts qcom_wcnss_pdata = {
604 .has_48mhz_xo = 1,
605};
606
607static struct platform_device msm_device_wcnss_wlan = {
608 .name = "wcnss_wlan",
609 .id = 0,
610 .num_resources = ARRAY_SIZE(resources_wcnss_wlan),
611 .resource = resources_wcnss_wlan,
612 .dev = {.platform_data = &qcom_wcnss_pdata},
613};
614
615#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
616 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) || \
617 defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
618 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
619
620#define QCE_SIZE 0x10000
621#define QCE_0_BASE 0x18500000
622
623#define QCE_HW_KEY_SUPPORT 0
624#define QCE_SHA_HMAC_SUPPORT 1
625#define QCE_SHARE_CE_RESOURCE 1
626#define QCE_CE_SHARED 0
627
628static struct resource qcrypto_resources[] = {
629 [0] = {
630 .start = QCE_0_BASE,
631 .end = QCE_0_BASE + QCE_SIZE - 1,
632 .flags = IORESOURCE_MEM,
633 },
634 [1] = {
635 .name = "crypto_channels",
636 .start = DMOV_CE_IN_CHAN,
637 .end = DMOV_CE_OUT_CHAN,
638 .flags = IORESOURCE_DMA,
639 },
640 [2] = {
641 .name = "crypto_crci_in",
642 .start = DMOV_CE_IN_CRCI,
643 .end = DMOV_CE_IN_CRCI,
644 .flags = IORESOURCE_DMA,
645 },
646 [3] = {
647 .name = "crypto_crci_out",
648 .start = DMOV_CE_OUT_CRCI,
649 .end = DMOV_CE_OUT_CRCI,
650 .flags = IORESOURCE_DMA,
651 },
652};
653
654static struct resource qcedev_resources[] = {
655 [0] = {
656 .start = QCE_0_BASE,
657 .end = QCE_0_BASE + QCE_SIZE - 1,
658 .flags = IORESOURCE_MEM,
659 },
660 [1] = {
661 .name = "crypto_channels",
662 .start = DMOV_CE_IN_CHAN,
663 .end = DMOV_CE_OUT_CHAN,
664 .flags = IORESOURCE_DMA,
665 },
666 [2] = {
667 .name = "crypto_crci_in",
668 .start = DMOV_CE_IN_CRCI,
669 .end = DMOV_CE_IN_CRCI,
670 .flags = IORESOURCE_DMA,
671 },
672 [3] = {
673 .name = "crypto_crci_out",
674 .start = DMOV_CE_OUT_CRCI,
675 .end = DMOV_CE_OUT_CRCI,
676 .flags = IORESOURCE_DMA,
677 },
678};
679
680#endif
681
682#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
683 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE)
684
685static struct msm_ce_hw_support qcrypto_ce_hw_suppport = {
686 .ce_shared = QCE_CE_SHARED,
687 .shared_ce_resource = QCE_SHARE_CE_RESOURCE,
688 .hw_key_support = QCE_HW_KEY_SUPPORT,
689 .sha_hmac = QCE_SHA_HMAC_SUPPORT,
690};
691
692static struct platform_device qcrypto_device = {
693 .name = "qcrypto",
694 .id = 0,
695 .num_resources = ARRAY_SIZE(qcrypto_resources),
696 .resource = qcrypto_resources,
697 .dev = {
698 .coherent_dma_mask = DMA_BIT_MASK(32),
699 .platform_data = &qcrypto_ce_hw_suppport,
700 },
701};
702#endif
703
704#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
705 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
706
707static struct msm_ce_hw_support qcedev_ce_hw_suppport = {
708 .ce_shared = QCE_CE_SHARED,
709 .shared_ce_resource = QCE_SHARE_CE_RESOURCE,
710 .hw_key_support = QCE_HW_KEY_SUPPORT,
711 .sha_hmac = QCE_SHA_HMAC_SUPPORT,
712};
713
714static struct platform_device qcedev_device = {
715 .name = "qce",
716 .id = 0,
717 .num_resources = ARRAY_SIZE(qcedev_resources),
718 .resource = qcedev_resources,
719 .dev = {
720 .coherent_dma_mask = DMA_BIT_MASK(32),
721 .platform_data = &qcedev_ce_hw_suppport,
722 },
723};
724#endif
725
726#define MDM2AP_ERRFATAL 70
727#define AP2MDM_ERRFATAL 95
728#define MDM2AP_STATUS 69
729#define AP2MDM_STATUS 94
730#define AP2MDM_PMIC_RESET_N 80
731#define AP2MDM_KPDPWR_N 81
732
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800733static struct resource mdm_resources[] = {
734 {
735 .start = MDM2AP_ERRFATAL,
736 .end = MDM2AP_ERRFATAL,
737 .name = "MDM2AP_ERRFATAL",
738 .flags = IORESOURCE_IO,
739 },
740 {
741 .start = AP2MDM_ERRFATAL,
742 .end = AP2MDM_ERRFATAL,
743 .name = "AP2MDM_ERRFATAL",
744 .flags = IORESOURCE_IO,
745 },
746 {
747 .start = MDM2AP_STATUS,
748 .end = MDM2AP_STATUS,
749 .name = "MDM2AP_STATUS",
750 .flags = IORESOURCE_IO,
751 },
752 {
753 .start = AP2MDM_STATUS,
754 .end = AP2MDM_STATUS,
755 .name = "AP2MDM_STATUS",
756 .flags = IORESOURCE_IO,
757 },
758 {
759 .start = AP2MDM_PMIC_RESET_N,
760 .end = AP2MDM_PMIC_RESET_N,
761 .name = "AP2MDM_PMIC_RESET_N",
762 .flags = IORESOURCE_IO,
763 },
764 {
765 .start = AP2MDM_KPDPWR_N,
766 .end = AP2MDM_KPDPWR_N,
767 .name = "AP2MDM_KPDPWR_N",
768 .flags = IORESOURCE_IO,
769 },
770};
771
772static struct mdm_platform_data mdm_platform_data = {
773 .mdm_version = "2.5",
774};
775
776static struct platform_device mdm_device = {
777 .name = "mdm2_modem",
778 .id = -1,
779 .num_resources = ARRAY_SIZE(mdm_resources),
780 .resource = mdm_resources,
781 .dev = {
782 .platform_data = &mdm_platform_data,
783 },
784};
785
786static struct platform_device *mdm_devices[] __initdata = {
787 &mdm_device,
788};
789
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800790#define MSM_SHARED_RAM_PHYS 0x80000000
791
792static void __init msm8930_map_io(void)
793{
794 msm_shared_ram_phys = MSM_SHARED_RAM_PHYS;
795 msm_map_msm8930_io();
796
797 if (socinfo_init() < 0)
798 pr_err("socinfo_init() failed!\n");
799}
800
801static void __init msm8930_init_irq(void)
802{
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800803 msm_mpm_irq_extn_init();
804 gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE,
805 (void *)MSM_QGIC_CPU_BASE);
806
807 /* Edge trigger PPIs except AVS_SVICINT and AVS_SVICINTSWDONE */
808 writel_relaxed(0xFFFFD7FF, MSM_QGIC_DIST_BASE + GIC_DIST_CONFIG + 4);
809
810 writel_relaxed(0x0000FFFF, MSM_QGIC_DIST_BASE + GIC_DIST_ENABLE_SET);
811 mb();
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800812}
813
814static void __init msm8930_init_buses(void)
815{
816#ifdef CONFIG_MSM_BUS_SCALING
817 msm_bus_rpm_set_mt_mask();
818 msm_bus_8960_apps_fabric_pdata.rpm_enabled = 1;
819 msm_bus_8960_sys_fabric_pdata.rpm_enabled = 1;
820 msm_bus_8960_mm_fabric_pdata.rpm_enabled = 1;
821 msm_bus_apps_fabric.dev.platform_data =
822 &msm_bus_8960_apps_fabric_pdata;
823 msm_bus_sys_fabric.dev.platform_data = &msm_bus_8960_sys_fabric_pdata;
824 msm_bus_mm_fabric.dev.platform_data = &msm_bus_8960_mm_fabric_pdata;
825 msm_bus_sys_fpb.dev.platform_data = &msm_bus_8960_sys_fpb_pdata;
826 msm_bus_cpss_fpb.dev.platform_data = &msm_bus_8960_cpss_fpb_pdata;
827#endif
828}
829
830static struct msm_spi_platform_data msm8960_qup_spi_gsbi1_pdata = {
831 .max_clock_speed = 15060000,
832};
833
834#ifdef CONFIG_USB_MSM_OTG_72K
835static struct msm_otg_platform_data msm_otg_pdata;
836#else
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800837static struct msm_otg_platform_data msm_otg_pdata = {
838 .mode = USB_OTG,
839 .otg_control = OTG_PMIC_CONTROL,
840 .phy_type = SNPS_28NM_INTEGRATED_PHY,
Jay Chokshi06fa7542011-12-07 13:09:17 -0800841 .pmic_id_irq = PM8038_USB_ID_IN_IRQ(PM8038_IRQ_BASE),
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800842 .power_budget = 750,
843};
844#endif
845
846#ifdef CONFIG_USB_EHCI_MSM_HSIC
847#define HSIC_HUB_RESET_GPIO 91
848static struct msm_hsic_host_platform_data msm_hsic_pdata = {
849 .strobe = 150,
850 .data = 151,
851};
852#else
853static struct msm_hsic_host_platform_data msm_hsic_pdata;
854#endif
855
856#define PID_MAGIC_ID 0x71432909
857#define SERIAL_NUM_MAGIC_ID 0x61945374
858#define SERIAL_NUMBER_LENGTH 127
859#define DLOAD_USB_BASE_ADD 0x2A03F0C8
860
861struct magic_num_struct {
862 uint32_t pid;
863 uint32_t serial_num;
864};
865
866struct dload_struct {
867 uint32_t reserved1;
868 uint32_t reserved2;
869 uint32_t reserved3;
870 uint16_t reserved4;
871 uint16_t pid;
872 char serial_number[SERIAL_NUMBER_LENGTH];
873 uint16_t reserved5;
874 struct magic_num_struct magic_struct;
875};
876
877static int usb_diag_update_pid_and_serial_num(uint32_t pid, const char *snum)
878{
879 struct dload_struct __iomem *dload = 0;
880
881 dload = ioremap(DLOAD_USB_BASE_ADD, sizeof(*dload));
882 if (!dload) {
883 pr_err("%s: cannot remap I/O memory region: %08x\n",
884 __func__, DLOAD_USB_BASE_ADD);
885 return -ENXIO;
886 }
887
888 pr_debug("%s: dload:%p pid:%x serial_num:%s\n",
889 __func__, dload, pid, snum);
890 /* update pid */
891 dload->magic_struct.pid = PID_MAGIC_ID;
892 dload->pid = pid;
893
894 /* update serial number */
895 dload->magic_struct.serial_num = 0;
896 if (!snum) {
897 memset(dload->serial_number, 0, SERIAL_NUMBER_LENGTH);
898 goto out;
899 }
900
901 dload->magic_struct.serial_num = SERIAL_NUM_MAGIC_ID;
902 strlcpy(dload->serial_number, snum, SERIAL_NUMBER_LENGTH);
903out:
904 iounmap(dload);
905 return 0;
906}
907
908static struct android_usb_platform_data android_usb_pdata = {
909 .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num,
910};
911
912static struct platform_device android_usb_device = {
913 .name = "android_usb",
914 .id = -1,
915 .dev = {
916 .platform_data = &android_usb_pdata,
917 },
918};
919
920static uint8_t spm_wfi_cmd_sequence[] __initdata = {
921 0x03, 0x0f,
922};
923
924static uint8_t spm_power_collapse_without_rpm[] __initdata = {
925 0x00, 0x24, 0x54, 0x10,
926 0x09, 0x03, 0x01,
927 0x10, 0x54, 0x30, 0x0C,
928 0x24, 0x30, 0x0f,
929};
930
931static uint8_t spm_power_collapse_with_rpm[] __initdata = {
932 0x00, 0x24, 0x54, 0x10,
933 0x09, 0x07, 0x01, 0x0B,
934 0x10, 0x54, 0x30, 0x0C,
935 0x24, 0x30, 0x0f,
936};
937
938static struct msm_spm_seq_entry msm_spm_seq_list[] __initdata = {
939 [0] = {
940 .mode = MSM_SPM_MODE_CLOCK_GATING,
941 .notify_rpm = false,
942 .cmd = spm_wfi_cmd_sequence,
943 },
944 [1] = {
945 .mode = MSM_SPM_MODE_POWER_COLLAPSE,
946 .notify_rpm = false,
947 .cmd = spm_power_collapse_without_rpm,
948 },
949 [2] = {
950 .mode = MSM_SPM_MODE_POWER_COLLAPSE,
951 .notify_rpm = true,
952 .cmd = spm_power_collapse_with_rpm,
953 },
954};
955
956static struct msm_spm_platform_data msm_spm_data[] __initdata = {
957 [0] = {
958 .reg_base_addr = MSM_SAW0_BASE,
959 .reg_init_values[MSM_SPM_REG_SAW2_SECURE] = 0x00,
960 .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F,
961 .reg_init_values[MSM_SPM_REG_SAW2_VCTL] = 0x9C,
962#if defined(CONFIG_MSM_AVS_HW)
963 .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00,
964 .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00,
965#endif
966 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01,
967 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020202,
968 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C,
969 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C,
970 .vctl_timeout_us = 50,
971 .num_modes = ARRAY_SIZE(msm_spm_seq_list),
972 .modes = msm_spm_seq_list,
973 },
974 [1] = {
975 .reg_base_addr = MSM_SAW1_BASE,
976 .reg_init_values[MSM_SPM_REG_SAW2_SECURE] = 0x00,
977 .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F,
978 .reg_init_values[MSM_SPM_REG_SAW2_VCTL] = 0x9C,
979#if defined(CONFIG_MSM_AVS_HW)
980 .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00,
981 .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00,
982#endif
983 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01,
984 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020202,
985 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C,
986 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C,
987 .vctl_timeout_us = 50,
988 .num_modes = ARRAY_SIZE(msm_spm_seq_list),
989 .modes = msm_spm_seq_list,
990 },
991};
992
993static uint8_t l2_spm_wfi_cmd_sequence[] __initdata = {
994 0x00, 0x20, 0x03, 0x20,
995 0x00, 0x0f,
996};
997
998static uint8_t l2_spm_gdhs_cmd_sequence[] __initdata = {
999 0x00, 0x20, 0x34, 0x64,
1000 0x48, 0x07, 0x48, 0x20,
1001 0x50, 0x64, 0x04, 0x34,
1002 0x50, 0x0f,
1003};
1004static uint8_t l2_spm_power_off_cmd_sequence[] __initdata = {
1005 0x00, 0x10, 0x34, 0x64,
1006 0x48, 0x07, 0x48, 0x10,
1007 0x50, 0x64, 0x04, 0x34,
1008 0x50, 0x0F,
1009};
1010
1011static struct msm_spm_seq_entry msm_spm_l2_seq_list[] __initdata = {
1012 [0] = {
1013 .mode = MSM_SPM_L2_MODE_RETENTION,
1014 .notify_rpm = false,
1015 .cmd = l2_spm_wfi_cmd_sequence,
1016 },
1017 [1] = {
1018 .mode = MSM_SPM_L2_MODE_GDHS,
1019 .notify_rpm = true,
1020 .cmd = l2_spm_gdhs_cmd_sequence,
1021 },
1022 [2] = {
1023 .mode = MSM_SPM_L2_MODE_POWER_COLLAPSE,
1024 .notify_rpm = true,
1025 .cmd = l2_spm_power_off_cmd_sequence,
1026 },
1027};
1028
1029static struct msm_spm_platform_data msm_spm_l2_data[] __initdata = {
1030 [0] = {
1031 .reg_base_addr = MSM_SAW_L2_BASE,
1032 .reg_init_values[MSM_SPM_REG_SAW2_SECURE] = 0x00,
1033 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x00,
1034 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020202,
1035 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x00A000AE,
1036 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x00A00020,
1037 .modes = msm_spm_l2_seq_list,
1038 .num_modes = ARRAY_SIZE(msm_spm_l2_seq_list),
1039 },
1040};
1041
Jay Chokshi06fa7542011-12-07 13:09:17 -08001042#/* TODO: Remove this once PM8038 physically becomes
1043 * available.
1044 */
1045#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001046#define PM_HAP_EN_GPIO PM8921_GPIO_PM_TO_SYS(33)
1047#define PM_HAP_LEN_GPIO PM8921_GPIO_PM_TO_SYS(20)
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301048#else
1049#define ISA1200_HAP_EN_GPIO 77
1050#define ISA1200_HAP_LEN_GPIO 78
1051#define ISA1200_HAP_CLK PM8038_GPIO_PM_TO_SYS(7)
Jay Chokshi06fa7542011-12-07 13:09:17 -08001052#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001053
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301054#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001055static struct msm_xo_voter *xo_handle_d1;
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301056#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001057
1058static int isa1200_power(int on)
1059{
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301060#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001061 int rc = 0;
1062
1063 gpio_set_value(HAP_SHIFT_LVL_OE_GPIO, !!on);
1064
1065 rc = on ? msm_xo_mode_vote(xo_handle_d1, MSM_XO_MODE_ON) :
1066 msm_xo_mode_vote(xo_handle_d1, MSM_XO_MODE_OFF);
1067 if (rc < 0) {
1068 pr_err("%s: failed to %svote for TCXO D1 buffer%d\n",
1069 __func__, on ? "" : "de-", rc);
1070 goto err_xo_vote;
1071 }
1072
1073 return 0;
1074
1075err_xo_vote:
1076 gpio_set_value(HAP_SHIFT_LVL_OE_GPIO, !on);
1077 return rc;
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301078#else
1079 gpio_set_value_cansleep(ISA1200_HAP_CLK, !!on);
1080
1081 return 0;
1082#endif
1083
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001084}
1085
1086static int isa1200_dev_setup(bool enable)
1087{
1088 int rc = 0;
1089
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301090#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001091 struct pm_gpio hap_gpio_config = {
1092 .direction = PM_GPIO_DIR_OUT,
1093 .pull = PM_GPIO_PULL_NO,
1094 .out_strength = PM_GPIO_STRENGTH_HIGH,
1095 .function = PM_GPIO_FUNC_NORMAL,
1096 .inv_int_pol = 0,
1097 .vin_sel = 2,
1098 .output_buffer = PM_GPIO_OUT_BUF_CMOS,
1099 .output_value = 0,
1100 };
1101
1102 if (enable == true) {
1103 rc = pm8xxx_gpio_config(PM_HAP_EN_GPIO, &hap_gpio_config);
1104 if (rc) {
1105 pr_err("%s: pm8921 gpio %d config failed(%d)\n",
1106 __func__, PM_HAP_EN_GPIO, rc);
1107 return rc;
1108 }
1109
1110 rc = pm8xxx_gpio_config(PM_HAP_LEN_GPIO, &hap_gpio_config);
1111 if (rc) {
1112 pr_err("%s: pm8921 gpio %d config failed(%d)\n",
1113 __func__, PM_HAP_LEN_GPIO, rc);
1114 return rc;
1115 }
1116
1117 rc = gpio_request(HAP_SHIFT_LVL_OE_GPIO, "hap_shft_lvl_oe");
1118 if (rc) {
1119 pr_err("%s: unable to request gpio %d (%d)\n",
1120 __func__, HAP_SHIFT_LVL_OE_GPIO, rc);
1121 return rc;
1122 }
1123
1124 rc = gpio_direction_output(HAP_SHIFT_LVL_OE_GPIO, 0);
1125 if (rc) {
1126 pr_err("%s: Unable to set direction\n", __func__);
1127 goto free_gpio;
1128 }
1129
1130 xo_handle_d1 = msm_xo_get(MSM_XO_TCXO_D1, "isa1200");
1131 if (IS_ERR(xo_handle_d1)) {
1132 rc = PTR_ERR(xo_handle_d1);
1133 pr_err("%s: failed to get the handle for D1(%d)\n",
1134 __func__, rc);
1135 goto gpio_set_dir;
1136 }
1137 } else {
1138 gpio_free(HAP_SHIFT_LVL_OE_GPIO);
1139
1140 msm_xo_put(xo_handle_d1);
1141 }
1142
1143 return 0;
1144
1145gpio_set_dir:
1146 gpio_set_value(HAP_SHIFT_LVL_OE_GPIO, 0);
1147free_gpio:
1148 gpio_free(HAP_SHIFT_LVL_OE_GPIO);
1149 return rc;
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301150#else
1151 struct pm_gpio hap_clk_gpio_config = {
1152 .direction = PM_GPIO_DIR_OUT,
1153 .pull = PM_GPIO_PULL_NO,
1154 .out_strength = PM_GPIO_STRENGTH_HIGH,
1155 .function = PM_GPIO_FUNC_1,
1156 .inv_int_pol = 0,
1157 .vin_sel = PM_GPIO_VIN_S4,
1158 .output_buffer = PM_GPIO_OUT_BUF_CMOS,
1159 .output_value = 0,
1160 };
1161
1162 rc = pm8xxx_gpio_config(ISA1200_HAP_CLK, &hap_clk_gpio_config);
1163 if (rc) {
1164 pr_err("%s: pm8038 gpio %d config failed(%d)\n",
1165 __func__, ISA1200_HAP_CLK, rc);
1166 return rc;
1167 }
1168
1169 rc = gpio_request(ISA1200_HAP_CLK, "haptics_clk");
1170 if (rc) {
1171 pr_err("%s: gpio_request for %d gpio failed rc(%d)\n",
1172 __func__, ISA1200_HAP_CLK, rc);
1173 goto fail_gpio_req;
1174 }
1175
1176 rc = gpio_direction_output(ISA1200_HAP_CLK, 0);
1177 if (rc) {
1178 pr_err("%s: gpio_direction_output failed for %d gpio rc(%d)\n",
1179 __func__, ISA1200_HAP_CLK, rc);
1180 goto fail_gpio_dir;
1181 }
1182
1183 return 0;
1184
1185fail_gpio_dir:
1186 gpio_free(ISA1200_HAP_CLK);
1187fail_gpio_req:
1188 return rc;
1189
1190#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001191}
1192
1193static struct isa1200_regulator isa1200_reg_data[] = {
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301194#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001195 {
1196 .name = "vcc_i2c",
1197 .min_uV = ISA_I2C_VTG_MIN_UV,
1198 .max_uV = ISA_I2C_VTG_MAX_UV,
1199 .load_uA = ISA_I2C_CURR_UA,
1200 },
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301201#else
1202 {
1203 .name = "vddp",
1204 .min_uV = ISA_I2C_VTG_MIN_UV,
1205 .max_uV = ISA_I2C_VTG_MAX_UV,
1206 .load_uA = ISA_I2C_CURR_UA,
1207 },
1208#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001209};
1210
1211static struct isa1200_platform_data isa1200_1_pdata = {
1212 .name = "vibrator",
1213 .dev_setup = isa1200_dev_setup,
1214 .power_on = isa1200_power,
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301215#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001216 .hap_en_gpio = PM_HAP_EN_GPIO,
1217 .hap_len_gpio = PM_HAP_LEN_GPIO,
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05301218#else
1219 .hap_en_gpio = ISA1200_HAP_EN_GPIO,
1220 .hap_len_gpio = ISA1200_HAP_LEN_GPIO,
1221#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001222 .max_timeout = 15000,
1223 .mode_ctrl = PWM_GEN_MODE,
1224 .pwm_fd = {
1225 .pwm_div = 256,
1226 },
1227 .is_erm = false,
1228 .smart_en = true,
1229 .ext_clk_en = true,
1230 .chip_en = 1,
1231 .regulator_info = isa1200_reg_data,
1232 .num_regulators = ARRAY_SIZE(isa1200_reg_data),
1233};
1234
1235static struct i2c_board_info msm_isa1200_board_info[] __initdata = {
1236 {
1237 I2C_BOARD_INFO("isa1200_1", 0x90>>1),
1238 .platform_data = &isa1200_1_pdata,
1239 },
1240};
1241
1242#define CYTTSP_TS_GPIO_IRQ 11
1243#define CYTTSP_TS_SLEEP_GPIO 50
1244#define CYTTSP_TS_RESOUT_N_GPIO 52
1245
1246/*virtual key support */
1247static ssize_t tma340_vkeys_show(struct kobject *kobj,
1248 struct kobj_attribute *attr, char *buf)
1249{
1250 return snprintf(buf, 200,
1251 __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":73:1120:97:97"
1252 ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":230:1120:97:97"
1253 ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":389:1120:97:97"
1254 ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":544:1120:97:97"
1255 "\n");
1256}
1257
1258static struct kobj_attribute tma340_vkeys_attr = {
1259 .attr = {
1260 .mode = S_IRUGO,
1261 },
1262 .show = &tma340_vkeys_show,
1263};
1264
1265static struct attribute *tma340_properties_attrs[] = {
1266 &tma340_vkeys_attr.attr,
1267 NULL
1268};
1269
1270static struct attribute_group tma340_properties_attr_group = {
1271 .attrs = tma340_properties_attrs,
1272};
1273
1274
1275static int cyttsp_platform_init(struct i2c_client *client)
1276{
1277 int rc = 0;
1278 static struct kobject *tma340_properties_kobj;
1279
1280 tma340_vkeys_attr.attr.name = "virtualkeys.cyttsp-i2c";
1281 tma340_properties_kobj = kobject_create_and_add("board_properties",
1282 NULL);
1283 if (tma340_properties_kobj)
1284 rc = sysfs_create_group(tma340_properties_kobj,
1285 &tma340_properties_attr_group);
1286 if (!tma340_properties_kobj || rc)
1287 pr_err("%s: failed to create board_properties\n",
1288 __func__);
1289
1290 return 0;
1291}
1292
1293static struct cyttsp_regulator regulator_data[] = {
1294 {
1295 .name = "vdd",
1296 .min_uV = CY_TMA300_VTG_MIN_UV,
1297 .max_uV = CY_TMA300_VTG_MAX_UV,
1298 .hpm_load_uA = CY_TMA300_CURR_24HZ_UA,
1299 .lpm_load_uA = CY_TMA300_SLEEP_CURR_UA,
1300 },
1301 /* TODO: Remove after runtime PM is enabled in I2C driver */
1302 {
1303 .name = "vcc_i2c",
1304 .min_uV = CY_I2C_VTG_MIN_UV,
1305 .max_uV = CY_I2C_VTG_MAX_UV,
1306 .hpm_load_uA = CY_I2C_CURR_UA,
1307 .lpm_load_uA = CY_I2C_SLEEP_CURR_UA,
1308 },
1309};
1310
1311static struct cyttsp_platform_data cyttsp_pdata = {
1312 .panel_maxx = 634,
1313 .panel_maxy = 1166,
1314 .disp_maxx = 616,
1315 .disp_maxy = 1023,
1316 .disp_minx = 0,
1317 .disp_miny = 16,
1318 .flags = 0x01,
1319 .gen = CY_GEN3, /* or */
1320 .use_st = CY_USE_ST,
1321 .use_mt = CY_USE_MT,
1322 .use_hndshk = CY_SEND_HNDSHK,
1323 .use_trk_id = CY_USE_TRACKING_ID,
1324 .use_sleep = CY_USE_DEEP_SLEEP_SEL | CY_USE_LOW_POWER_SEL,
1325 .use_gestures = CY_USE_GESTURES,
1326 .fw_fname = "cyttsp_8960_cdp.hex",
1327 /* activate up to 4 groups
1328 * and set active distance
1329 */
1330 .gest_set = CY_GEST_GRP1 | CY_GEST_GRP2 |
1331 CY_GEST_GRP3 | CY_GEST_GRP4 |
1332 CY_ACT_DIST,
1333 /* change act_intrvl to customize the Active power state
1334 * scanning/processing refresh interval for Operating mode
1335 */
1336 .act_intrvl = CY_ACT_INTRVL_DFLT,
1337 /* change tch_tmout to customize the touch timeout for the
1338 * Active power state for Operating mode
1339 */
1340 .tch_tmout = CY_TCH_TMOUT_DFLT,
1341 /* change lp_intrvl to customize the Low Power power state
1342 * scanning/processing refresh interval for Operating mode
1343 */
1344 .lp_intrvl = CY_LP_INTRVL_DFLT,
1345 .sleep_gpio = CYTTSP_TS_SLEEP_GPIO,
1346 .resout_gpio = CYTTSP_TS_RESOUT_N_GPIO,
1347 .irq_gpio = CYTTSP_TS_GPIO_IRQ,
1348 .regulator_info = regulator_data,
1349 .num_regulators = ARRAY_SIZE(regulator_data),
1350 .init = cyttsp_platform_init,
1351 .correct_fw_ver = 9,
1352};
1353
1354static struct i2c_board_info cyttsp_info[] __initdata = {
1355 {
1356 I2C_BOARD_INFO(CY_I2C_NAME, 0x24),
1357 .platform_data = &cyttsp_pdata,
1358#ifndef CY_USE_TIMER
1359 .irq = MSM_GPIO_TO_INT(CYTTSP_TS_GPIO_IRQ),
1360#endif /* CY_USE_TIMER */
1361 },
1362};
1363
Amy Malochef3c9db42011-12-08 15:17:35 -08001364#define MXT_TS_GPIO_IRQ 11
1365#define MXT_TS_RESET_GPIO 52
1366
1367static const u8 mxt_config_data_8930[] = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001368 /* T6 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001369 0, 0, 0, 0, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001370 /* T38 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001371 15, 1, 0, 15, 12, 11, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001372 /* T7 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001373 48, 255, 25,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001374 /* T8 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001375 27, 0, 5, 1, 0, 0, 8, 8, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001376 /* T9 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001377 131, 0, 0, 19, 11, 0, 16, 35, 1, 3,
1378 10, 15, 1, 11, 4, 5, 40, 10, 54, 2,
1379 43, 4, 0, 0, 0, 0, 143, 40, 143, 80,
1380 18, 15, 50, 50, 2,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001381 /* T15 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001382 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1383 0,
1384 /* T18 Object */
1385 0, 0,
1386 /* T19 Object */
1387 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1388 0, 0, 0, 0, 0, 0,
1389 /* T23 Object */
1390 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1391 0, 0, 0, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001392 /* T25 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001393 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1394 0, 0, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001395 /* T40 Object */
Amy Malochef3c9db42011-12-08 15:17:35 -08001396 0, 0, 0, 0, 0,
1397 /* T42 Object */
1398 0, 0, 0, 0, 0, 0, 0, 0,
1399 /* T46 Object */
1400 0, 3, 16, 48, 0, 0, 1, 0, 0,
1401 /* T47 Object */
1402 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1403 /* T48 Object */
1404 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1405 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1406 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1407 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1408 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1409 0, 0, 0, 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001410};
1411
Amy Malochef3c9db42011-12-08 15:17:35 -08001412static ssize_t mxt224e_vkeys_show(struct kobject *kobj,
1413 struct kobj_attribute *attr, char *buf)
1414{
1415 return snprintf(buf, 200,
1416 __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":65:938:90:90"
1417 ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":208:938:90:90"
1418 ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":348:938:90:90"
1419 ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":490:938:90:90"
1420 "\n");
1421}
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001422
Amy Malochef3c9db42011-12-08 15:17:35 -08001423static struct kobj_attribute mxt224e_vkeys_attr = {
1424 .attr = {
1425 .mode = S_IRUGO,
1426 },
1427 .show = &mxt224e_vkeys_show,
1428};
1429
1430static struct attribute *mxt224e_properties_attrs[] = {
1431 &mxt224e_vkeys_attr.attr,
1432 NULL
1433};
1434
1435static struct attribute_group mxt224e_properties_attr_group = {
1436 .attrs = mxt224e_properties_attrs,
1437};
1438
1439static void mxt_init_vkeys_8930(void)
1440{
1441 int rc;
1442 static struct kobject *mxt224e_properties_kobj;
1443
1444 mxt224e_vkeys_attr.attr.name = "virtualkeys.atmel_mxt_ts";
1445 mxt224e_properties_kobj = kobject_create_and_add("board_properties",
1446 NULL);
1447 if (mxt224e_properties_kobj)
1448 rc = sysfs_create_group(mxt224e_properties_kobj,
1449 &mxt224e_properties_attr_group);
1450 if (!mxt224e_properties_kobj || rc)
1451 pr_err("%s: failed to create board_properties\n",
1452 __func__);
1453
1454 return;
1455}
1456
1457static struct mxt_platform_data mxt_platform_data_8930 = {
1458 .config = mxt_config_data_8930,
1459 .config_length = ARRAY_SIZE(mxt_config_data_8930),
1460 .x_size = 1067,
1461 .y_size = 566,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001462 .irqflags = IRQF_TRIGGER_FALLING,
Anirudh Ghayald7ad84c2012-01-09 09:17:53 +05301463#ifdef MSM8930_PHASE_2
1464 .digital_pwr_regulator = true,
1465#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001466 .i2c_pull_up = true,
Amy Malochef3c9db42011-12-08 15:17:35 -08001467 .reset_gpio = MXT_TS_RESET_GPIO,
1468 .irq_gpio = MXT_TS_GPIO_IRQ,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001469};
1470
Amy Malochef3c9db42011-12-08 15:17:35 -08001471static struct i2c_board_info mxt_device_info_8930[] __initdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001472 {
Amy Malochef3c9db42011-12-08 15:17:35 -08001473 I2C_BOARD_INFO("atmel_mxt_ts", 0x4a),
1474 .platform_data = &mxt_platform_data_8930,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001475 .irq = MSM_GPIO_TO_INT(MXT_TS_GPIO_IRQ),
1476 },
1477};
1478
Anirudh Ghayaleb3af972011-12-13 17:29:06 +05301479#ifdef MSM8930_PHASE_2
1480
1481#define GPIO_VOLUME_UP PM8038_GPIO_PM_TO_SYS(3)
1482#define GPIO_VOLUME_DOWN PM8038_GPIO_PM_TO_SYS(8)
1483#define GPIO_CAMERA_SNAPSHOT PM8038_GPIO_PM_TO_SYS(10)
1484#define GPIO_CAMERA_FOCUS PM8038_GPIO_PM_TO_SYS(11)
1485
1486static struct gpio_keys_button keys_8930[] = {
1487 {
1488 .code = KEY_VOLUMEUP,
1489 .type = EV_KEY,
1490 .desc = "volume_up",
1491 .gpio = GPIO_VOLUME_UP,
1492 .wakeup = 1,
1493 .active_low = 1,
1494 },
1495 {
1496 .code = KEY_VOLUMEDOWN,
1497 .type = EV_KEY,
1498 .desc = "volume_down",
1499 .gpio = GPIO_VOLUME_DOWN,
1500 .wakeup = 1,
1501 .active_low = 1,
1502 },
1503 {
1504 .code = KEY_CAMERA_FOCUS,
1505 .type = EV_KEY,
1506 .desc = "camera_focus",
1507 .gpio = GPIO_CAMERA_FOCUS,
1508 .wakeup = 1,
1509 .active_low = 1,
1510 },
1511 {
1512 .code = KEY_CAMERA_SNAPSHOT,
1513 .type = EV_KEY,
1514 .desc = "camera_snapshot",
1515 .gpio = GPIO_CAMERA_SNAPSHOT,
1516 .wakeup = 1,
1517 .active_low = 1,
1518 },
1519};
1520
1521/* Add GPIO keys for 8930 */
1522static struct gpio_keys_platform_data gpio_keys_8930_pdata = {
1523 .buttons = keys_8930,
1524 .nbuttons = 4,
1525};
1526
1527static struct platform_device gpio_keys_8930 = {
1528 .name = "gpio-keys",
1529 .id = -1,
1530 .dev = {
1531 .platform_data = &gpio_keys_8930_pdata,
1532 },
1533};
1534#endif /* MSM8930_PHASE_2 */
1535
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001536static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi4_pdata = {
1537 .clk_freq = 100000,
1538 .src_clk_rate = 24000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001539};
1540
1541static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi3_pdata = {
1542 .clk_freq = 100000,
1543 .src_clk_rate = 24000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001544};
1545
1546static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi10_pdata = {
1547 .clk_freq = 100000,
1548 .src_clk_rate = 24000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001549};
1550
1551static struct msm_i2c_platform_data msm8960_i2c_qup_gsbi12_pdata = {
1552 .clk_freq = 100000,
1553 .src_clk_rate = 24000000,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001554};
1555
1556static struct msm_rpm_platform_data msm_rpm_data = {
1557 .reg_base_addrs = {
1558 [MSM_RPM_PAGE_STATUS] = MSM_RPM_BASE,
1559 [MSM_RPM_PAGE_CTRL] = MSM_RPM_BASE + 0x400,
1560 [MSM_RPM_PAGE_REQ] = MSM_RPM_BASE + 0x600,
1561 [MSM_RPM_PAGE_ACK] = MSM_RPM_BASE + 0xa00,
1562 },
1563
1564 .irq_ack = RPM_APCC_CPU0_GP_HIGH_IRQ,
1565 .irq_err = RPM_APCC_CPU0_GP_LOW_IRQ,
1566 .irq_vmpm = RPM_APCC_CPU0_GP_MEDIUM_IRQ,
1567 .msm_apps_ipc_rpm_reg = MSM_APCS_GCC_BASE + 0x008,
1568 .msm_apps_ipc_rpm_val = 4,
1569};
1570
1571static struct ks8851_pdata spi_eth_pdata = {
1572 .irq_gpio = KS8851_IRQ_GPIO,
1573 .rst_gpio = KS8851_RST_GPIO,
1574};
1575
1576static struct spi_board_info spi_board_info[] __initdata = {
1577 {
1578 .modalias = "ks8851",
1579 .irq = MSM_GPIO_TO_INT(KS8851_IRQ_GPIO),
1580 .max_speed_hz = 19200000,
1581 .bus_num = 0,
1582 .chip_select = 0,
1583 .mode = SPI_MODE_0,
1584 .platform_data = &spi_eth_pdata
1585 },
1586 {
1587 .modalias = "dsi_novatek_3d_panel_spi",
1588 .max_speed_hz = 10800000,
1589 .bus_num = 0,
1590 .chip_select = 1,
1591 .mode = SPI_MODE_0,
1592 },
1593};
1594
1595static struct platform_device msm_device_saw_core0 = {
Jay Chokshi06fa7542011-12-07 13:09:17 -08001596 .name = "saw-regulator",
1597 .id = 0,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001598 .dev = {
David Collinsb4558422012-01-05 10:50:49 -08001599 .platform_data = &msm8930_saw_regulator_core0_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001600 },
1601};
1602
1603static struct platform_device msm_device_saw_core1 = {
Jay Chokshi06fa7542011-12-07 13:09:17 -08001604 .name = "saw-regulator",
1605 .id = 1,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001606 .dev = {
David Collinsb4558422012-01-05 10:50:49 -08001607 .platform_data = &msm8930_saw_regulator_core1_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001608 },
1609};
1610
1611static struct tsens_platform_data msm_tsens_pdata = {
Jay Chokshi06fa7542011-12-07 13:09:17 -08001612 .slope = 910,
1613 .tsens_factor = 1000,
1614 .hw_type = MSM_8960,
1615 .tsens_num_sensor = 5,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001616};
1617
1618static struct platform_device msm_tsens_device = {
1619 .name = "tsens8960-tm",
1620 .id = -1,
1621 .dev = {
1622 .platform_data = &msm_tsens_pdata,
1623 },
1624};
1625
1626#ifdef CONFIG_MSM_FAKE_BATTERY
1627static struct platform_device fish_battery_device = {
1628 .name = "fish_battery",
1629};
1630#endif
1631
David Collins1d4061b2011-12-06 15:36:40 -08001632#ifndef MSM8930_PHASE_2
1633
1634/* 8930 Phase 1 */
Jay Chokshi06fa7542011-12-07 13:09:17 -08001635static struct platform_device msm8930_device_ext_5v_vreg __devinitdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001636 .name = GPIO_REGULATOR_DEV_NAME,
1637 .id = PM8921_MPP_PM_TO_SYS(7),
1638 .dev = {
1639 .platform_data = &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_5V],
1640 },
1641};
1642
Jay Chokshi06fa7542011-12-07 13:09:17 -08001643static struct platform_device msm8930_device_ext_l2_vreg __devinitdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001644 .name = GPIO_REGULATOR_DEV_NAME,
1645 .id = 91,
1646 .dev = {
1647 .platform_data = &msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_L2],
1648 },
1649};
1650
David Collins1d4061b2011-12-06 15:36:40 -08001651#else
1652
1653/* 8930 Phase 2 */
1654static struct platform_device msm8930_device_ext_5v_vreg __devinitdata = {
1655 .name = GPIO_REGULATOR_DEV_NAME,
1656 .id = 63,
1657 .dev = {
1658 .platform_data =
1659 &msm8930_gpio_regulator_pdata[MSM8930_GPIO_VREG_ID_EXT_5V],
1660 },
1661};
1662
1663static struct platform_device msm8930_device_ext_otg_sw_vreg __devinitdata = {
1664 .name = GPIO_REGULATOR_DEV_NAME,
1665 .id = 97,
1666 .dev = {
1667 .platform_data =
1668 &msm8930_gpio_regulator_pdata[MSM8930_GPIO_VREG_ID_EXT_OTG_SW],
1669 },
1670};
1671
1672#endif
1673
Jay Chokshi06fa7542011-12-07 13:09:17 -08001674static struct platform_device msm8930_device_rpm_regulator __devinitdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001675 .name = "rpm-regulator",
1676 .id = -1,
1677 .dev = {
Jay Chokshi06fa7542011-12-07 13:09:17 -08001678 /*
1679 * TODO: When physical 8930/PM8038 hardware becomes
1680 * available, replace msm_rpm_regulator_pdata
1681 * with 8930 rpm regulator object.
1682 */
1683#if !defined(MSM8930_PHASE_2)
1684
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001685 .platform_data = &msm_rpm_regulator_pdata,
Jay Chokshi06fa7542011-12-07 13:09:17 -08001686#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001687 },
1688};
1689
1690static struct msm_rpm_log_platform_data msm_rpm_log_pdata = {
1691 .phys_addr_base = 0x0010C000,
1692 .reg_offsets = {
1693 [MSM_RPM_LOG_PAGE_INDICES] = 0x00000080,
1694 [MSM_RPM_LOG_PAGE_BUFFER] = 0x000000A0,
1695 },
1696 .phys_size = SZ_8K,
1697 .log_len = 4096, /* log's buffer length in bytes */
1698 .log_len_mask = (4096 >> 2) - 1, /* length mask in units of u32 */
1699};
1700
1701static struct platform_device msm_rpm_log_device = {
1702 .name = "msm_rpm_log",
1703 .id = -1,
1704 .dev = {
1705 .platform_data = &msm_rpm_log_pdata,
1706 },
1707};
1708
1709static struct platform_device *common_devices[] __initdata = {
1710 &msm8960_device_dmov,
1711 &msm_device_smd,
1712 &msm8960_device_uart_gsbi5,
1713 &msm_device_uart_dm6,
1714 &msm_device_saw_core0,
1715 &msm_device_saw_core1,
Jay Chokshi06fa7542011-12-07 13:09:17 -08001716 &msm8930_device_ext_5v_vreg,
David Collins1d4061b2011-12-06 15:36:40 -08001717#ifndef MSM8930_PHASE_2
Jay Chokshi06fa7542011-12-07 13:09:17 -08001718 &msm8930_device_ext_l2_vreg,
David Collins1d4061b2011-12-06 15:36:40 -08001719#endif
Jay Chokshi33c044a2011-12-07 13:05:40 -08001720 &msm8960_device_ssbi_pmic,
David Collins1d4061b2011-12-06 15:36:40 -08001721#ifdef MSM8930_PHASE_2
1722 &msm8930_device_ext_otg_sw_vreg,
1723#endif
Stephen Boyd28d54952011-12-16 13:19:51 -08001724 &msm_8960_q6_lpass,
1725 &msm_8960_q6_mss_fw,
1726 &msm_8960_q6_mss_sw,
Stephen Boyd322a9922011-09-20 01:05:54 -07001727 &msm_8960_riva,
Stephen Boydd89eebe2011-09-28 23:28:11 -07001728 &msm_pil_tzapps,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001729 &msm8960_device_qup_spi_gsbi1,
1730 &msm8960_device_qup_i2c_gsbi3,
1731 &msm8960_device_qup_i2c_gsbi4,
1732 &msm8960_device_qup_i2c_gsbi10,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001733 &msm8960_device_qup_i2c_gsbi12,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001734 &msm_slim_ctrl,
1735 &msm_device_wcnss_wlan,
1736#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
1737 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE)
1738 &qcrypto_device,
1739#endif
1740
1741#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
1742 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
1743 &qcedev_device,
1744#endif
1745#ifdef CONFIG_MSM_ROTATOR
1746 &msm_rotator_device,
1747#endif
1748 &msm_device_sps,
1749#ifdef CONFIG_MSM_FAKE_BATTERY
1750 &fish_battery_device,
1751#endif
1752#ifdef CONFIG_ANDROID_PMEM
1753#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
1754 &android_pmem_device,
1755 &android_pmem_adsp_device,
1756#endif
1757 &android_pmem_audio_device,
1758#endif
1759 &msm_device_vidc,
1760 &msm_device_bam_dmux,
1761 &msm_fm_platform_init,
1762
1763#ifdef CONFIG_HW_RANDOM_MSM
1764 &msm_device_rng,
1765#endif
1766 &msm_rpm_device,
1767#ifdef CONFIG_ION_MSM
1768 &ion_dev,
1769#endif
1770 &msm_rpm_log_device,
1771 &msm_rpm_stat_device,
1772 &msm_device_tz_log,
1773
1774#ifdef CONFIG_MSM_QDSS
1775 &msm_etb_device,
1776 &msm_tpiu_device,
1777 &msm_funnel_device,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001778 &msm_ptm_device,
1779#endif
1780 &msm_device_dspcrashd_8960,
1781 &msm8960_device_watchdog,
Anirudh Ghayaleb3af972011-12-13 17:29:06 +05301782#ifdef MSM8930_PHASE_2
1783 &gpio_keys_8930,
1784#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001785};
1786
1787static struct platform_device *cdp_devices[] __initdata = {
1788 &msm8960_device_otg,
1789 &msm8960_device_gadget_peripheral,
1790 &msm_device_hsusb_host,
1791 &android_usb_device,
1792 &msm_pcm,
1793 &msm_pcm_routing,
1794 &msm_cpudai0,
1795 &msm_cpudai1,
1796 &msm_cpudai_hdmi_rx,
1797 &msm_cpudai_bt_rx,
1798 &msm_cpudai_bt_tx,
1799 &msm_cpudai_fm_rx,
1800 &msm_cpudai_fm_tx,
1801 &msm_cpudai_auxpcm_rx,
1802 &msm_cpudai_auxpcm_tx,
1803 &msm_cpu_fe,
1804 &msm_stub_codec,
1805 &msm_kgsl_3d0,
1806#ifdef CONFIG_MSM_KGSL_2D
1807 &msm_kgsl_2d0,
1808 &msm_kgsl_2d1,
1809#endif
1810#ifdef CONFIG_MSM_GEMINI
1811 &msm8960_gemini_device,
1812#endif
1813 &msm_voice,
1814 &msm_voip,
1815 &msm_lpa_pcm,
1816 &msm_cpudai_afe_01_rx,
1817 &msm_cpudai_afe_01_tx,
1818 &msm_cpudai_afe_02_rx,
1819 &msm_cpudai_afe_02_tx,
1820 &msm_pcm_afe,
Ajay Dudani79e268c2011-12-28 13:14:44 -08001821 &msm_compr_dsp,
1822 &msm_cpudai_incall_music_rx,
1823 &msm_cpudai_incall_record_rx,
1824 &msm_cpudai_incall_record_tx,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001825 &msm_pcm_hostless,
1826 &msm_bus_apps_fabric,
1827 &msm_bus_sys_fabric,
1828 &msm_bus_mm_fabric,
1829 &msm_bus_sys_fpb,
1830 &msm_bus_cpss_fpb,
1831 &msm_tsens_device,
1832};
1833
1834static void __init msm8930_i2c_init(void)
1835{
1836 msm8960_device_qup_i2c_gsbi4.dev.platform_data =
1837 &msm8960_i2c_qup_gsbi4_pdata;
1838
1839 msm8960_device_qup_i2c_gsbi3.dev.platform_data =
1840 &msm8960_i2c_qup_gsbi3_pdata;
1841
1842 msm8960_device_qup_i2c_gsbi10.dev.platform_data =
1843 &msm8960_i2c_qup_gsbi10_pdata;
1844
1845 msm8960_device_qup_i2c_gsbi12.dev.platform_data =
1846 &msm8960_i2c_qup_gsbi12_pdata;
1847}
1848
1849static void __init msm8930_gfx_init(void)
1850{
1851 uint32_t soc_platform_version = socinfo_get_version();
1852 if (SOCINFO_VERSION_MAJOR(soc_platform_version) == 1) {
1853 struct kgsl_device_platform_data *kgsl_3d0_pdata =
1854 msm_kgsl_3d0.dev.platform_data;
1855 kgsl_3d0_pdata->pwrlevel[0].gpu_freq = 320000000;
1856 kgsl_3d0_pdata->pwrlevel[1].gpu_freq = 266667000;
1857 }
1858}
1859
1860static struct msm_cpuidle_state msm_cstates[] __initdata = {
1861 {0, 0, "C0", "WFI",
1862 MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT},
1863
1864 {0, 1, "C1", "STANDALONE_POWER_COLLAPSE",
1865 MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE},
1866
1867 {0, 2, "C2", "POWER_COLLAPSE",
1868 MSM_PM_SLEEP_MODE_POWER_COLLAPSE},
1869
1870 {1, 0, "C0", "WFI",
1871 MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT},
1872
1873 {1, 1, "C1", "STANDALONE_POWER_COLLAPSE",
1874 MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE},
1875};
1876
1877static struct msm_pm_platform_data msm_pm_data[MSM_PM_SLEEP_MODE_NR * 2] = {
1878 [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE)] = {
1879 .idle_supported = 1,
1880 .suspend_supported = 1,
1881 .idle_enabled = 0,
1882 .suspend_enabled = 0,
1883 },
1884
1885 [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = {
1886 .idle_supported = 1,
1887 .suspend_supported = 1,
1888 .idle_enabled = 0,
1889 .suspend_enabled = 0,
1890 },
1891
1892 [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = {
1893 .idle_supported = 1,
1894 .suspend_supported = 1,
1895 .idle_enabled = 1,
1896 .suspend_enabled = 1,
1897 },
1898
1899 [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_POWER_COLLAPSE)] = {
1900 .idle_supported = 0,
1901 .suspend_supported = 1,
1902 .idle_enabled = 0,
1903 .suspend_enabled = 0,
1904 },
1905
1906 [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = {
1907 .idle_supported = 1,
1908 .suspend_supported = 1,
1909 .idle_enabled = 0,
1910 .suspend_enabled = 0,
1911 },
1912
1913 [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = {
1914 .idle_supported = 1,
1915 .suspend_supported = 0,
1916 .idle_enabled = 1,
1917 .suspend_enabled = 0,
1918 },
1919};
1920
1921static struct msm_rpmrs_level msm_rpmrs_levels[] __initdata = {
1922 {
1923 MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT,
1924 MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE),
1925 true,
1926 100, 8000, 100000, 1,
1927 },
1928
1929 {
1930 MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE,
1931 MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE),
1932 true,
1933 2000, 6000, 60100000, 3000,
1934 },
1935
1936 {
1937 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1938 MSM_RPMRS_LIMITS(ON, GDHS, MAX, ACTIVE),
1939 false,
1940 4200, 5000, 60350000, 3500,
1941 },
1942
1943 {
1944 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1945 MSM_RPMRS_LIMITS(ON, HSFS_OPEN, MAX, ACTIVE),
1946 false,
1947 6300, 4500, 65350000, 4800,
1948 },
1949 {
1950 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1951 MSM_RPMRS_LIMITS(ON, HSFS_OPEN, ACTIVE, RET_HIGH),
1952 false,
1953 7000, 3500, 66600000, 5150,
1954 },
1955
1956 {
1957 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1958 MSM_RPMRS_LIMITS(OFF, GDHS, MAX, ACTIVE),
1959 false,
1960 11700, 2500, 67850000, 5500,
1961 },
1962
1963 {
1964 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1965 MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, MAX, ACTIVE),
1966 false,
1967 13800, 2000, 71850000, 6800,
1968 },
1969
1970 {
1971 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1972 MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, ACTIVE, RET_HIGH),
1973 false,
1974 29700, 500, 75850000, 8800,
1975 },
1976
1977 {
1978 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1979 MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, RET_HIGH, RET_LOW),
1980 false,
1981 29700, 0, 76350000, 9800,
1982 },
1983};
1984
Maheshkumar Sivasubramanianc6c55032011-10-25 16:01:32 -06001985static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = {
1986 .mode = MSM_PM_BOOT_CONFIG_TZ,
1987};
1988
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001989#ifdef CONFIG_I2C
1990#define I2C_SURF 1
1991#define I2C_FFA (1 << 1)
1992#define I2C_RUMI (1 << 2)
1993#define I2C_SIM (1 << 3)
1994#define I2C_FLUID (1 << 4)
1995#define I2C_LIQUID (1 << 5)
1996
1997struct i2c_registry {
1998 u8 machs;
1999 int bus;
2000 struct i2c_board_info *info;
2001 int len;
2002};
2003
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002004static void __init msm8930_init_hsic(void)
2005{
2006#ifdef CONFIG_USB_EHCI_MSM_HSIC
2007 uint32_t version = socinfo_get_version();
2008
2009 pr_info("%s: version:%d mtp:%d\n", __func__,
2010 SOCINFO_VERSION_MAJOR(version),
2011 machine_is_msm8930_mtp());
2012
2013 if ((SOCINFO_VERSION_MAJOR(version) == 1) ||
2014 machine_is_msm8930_mtp() ||
2015 machine_is_msm8930_fluid())
2016 return;
2017
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002018 platform_device_register(&msm_device_hsic_host);
2019#endif
2020}
2021
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002022#ifdef CONFIG_ISL9519_CHARGER
2023static struct isl_platform_data isl_data __initdata = {
2024 .valid_n_gpio = 0, /* Not required when notify-by-pmic */
2025 .chg_detection_config = NULL, /* Not required when notify-by-pmic */
2026 .max_system_voltage = 4200,
2027 .min_system_voltage = 3200,
2028 .chgcurrent = 1000, /* 1900, */
2029 .term_current = 400, /* Need fine tuning */
2030 .input_current = 2048,
2031};
2032
2033static struct i2c_board_info isl_charger_i2c_info[] __initdata = {
2034 {
2035 I2C_BOARD_INFO("isl9519q", 0x9),
2036 .irq = 0, /* Not required when notify-by-pmic */
2037 .platform_data = &isl_data,
2038 },
2039};
2040#endif /* CONFIG_ISL9519_CHARGER */
2041
2042static struct i2c_registry msm8960_i2c_devices[] __initdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002043#ifdef CONFIG_ISL9519_CHARGER
2044 {
2045 I2C_LIQUID,
2046 MSM_8930_GSBI10_QUP_I2C_BUS_ID,
2047 isl_charger_i2c_info,
2048 ARRAY_SIZE(isl_charger_i2c_info),
2049 },
2050#endif /* CONFIG_ISL9519_CHARGER */
2051 {
2052 I2C_SURF | I2C_FFA | I2C_FLUID,
2053 MSM_8930_GSBI3_QUP_I2C_BUS_ID,
2054 cyttsp_info,
2055 ARRAY_SIZE(cyttsp_info),
2056 },
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05302057#ifndef MSM8930_PHASE_2
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002058 {
2059 I2C_LIQUID,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002060 MSM_8930_GSBI10_QUP_I2C_BUS_ID,
2061 msm_isa1200_board_info,
2062 ARRAY_SIZE(msm_isa1200_board_info),
2063 },
Anirudh Ghayal8c15f7f2012-01-09 14:04:02 +05302064#else
2065 {
2066 I2C_FFA | I2C_FLUID,
2067 MSM_8930_GSBI10_QUP_I2C_BUS_ID,
2068 msm_isa1200_board_info,
2069 ARRAY_SIZE(msm_isa1200_board_info),
2070 },
2071#endif
Amy Malochef3c9db42011-12-08 15:17:35 -08002072 {
2073 I2C_SURF,
2074 MSM_8930_GSBI3_QUP_I2C_BUS_ID,
2075 mxt_device_info_8930,
2076 ARRAY_SIZE(mxt_device_info_8930),
2077 },
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002078};
2079#endif /* CONFIG_I2C */
2080
2081static void __init register_i2c_devices(void)
2082{
2083#ifdef CONFIG_I2C
2084 u8 mach_mask = 0;
2085 int i;
Kevin Chan09f4e662011-12-16 08:17:02 -08002086#ifdef CONFIG_MSM_CAMERA
2087 struct i2c_registry msm8930_camera_i2c_devices = {
2088 I2C_SURF | I2C_FFA | I2C_FLUID | I2C_LIQUID | I2C_RUMI,
2089 MSM_8930_GSBI4_QUP_I2C_BUS_ID,
2090 msm8930_camera_board_info.board_info,
2091 msm8930_camera_board_info.num_i2c_board_info,
2092 };
2093#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002094
2095 /* Build the matching 'supported_machs' bitmask */
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002096 if (machine_is_msm8930_cdp() || machine_is_msm8627_cdp())
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002097 mach_mask = I2C_SURF;
2098 else if (machine_is_msm8930_fluid())
2099 mach_mask = I2C_FLUID;
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002100 else if (machine_is_msm8930_mtp() || machine_is_msm8627_mtp())
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002101 mach_mask = I2C_FFA;
2102 else
2103 pr_err("unmatched machine ID in register_i2c_devices\n");
2104
2105 /* Run the array and install devices as appropriate */
2106 for (i = 0; i < ARRAY_SIZE(msm8960_i2c_devices); ++i) {
2107 if (msm8960_i2c_devices[i].machs & mach_mask)
2108 i2c_register_board_info(msm8960_i2c_devices[i].bus,
2109 msm8960_i2c_devices[i].info,
2110 msm8960_i2c_devices[i].len);
2111 }
Kevin Chan09f4e662011-12-16 08:17:02 -08002112#ifdef CONFIG_MSM_CAMERA
2113 if (msm8930_camera_i2c_devices.machs & mach_mask)
2114 i2c_register_board_info(msm8930_camera_i2c_devices.bus,
2115 msm8930_camera_i2c_devices.info,
2116 msm8930_camera_i2c_devices.len);
2117#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002118#endif
2119}
2120
2121static void __init msm8930_cdp_init(void)
2122{
2123 if (meminfo_init(SYS_MEMORY, SZ_256M) < 0)
2124 pr_err("meminfo_init() failed!\n");
2125
2126 BUG_ON(msm_rpm_init(&msm_rpm_data));
2127 BUG_ON(msm_rpmrs_levels_init(msm_rpmrs_levels,
2128 ARRAY_SIZE(msm_rpmrs_levels)));
2129
2130 regulator_suppress_info_printing();
2131 if (msm_xo_init())
2132 pr_err("Failed to initialize XO votes\n");
Jay Chokshi06fa7542011-12-07 13:09:17 -08002133 platform_device_register(&msm8930_device_rpm_regulator);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002134 msm_clock_init(&msm8960_clock_init_data);
2135 msm8960_device_otg.dev.platform_data = &msm_otg_pdata;
2136 msm_device_hsic_host.dev.platform_data = &msm_hsic_pdata;
Stepan Moskovchenko3b09bf52011-12-06 20:40:53 -08002137 msm8930_init_gpiomux();
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002138 msm8960_device_qup_spi_gsbi1.dev.platform_data =
2139 &msm8960_qup_spi_gsbi1_pdata;
2140 spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
2141
Jay Chokshi06fa7542011-12-07 13:09:17 -08002142 /*
2143 * TODO: When physical 8930/PM8038 hardware becomes
2144 * available, remove this block or add the config
2145 * option.
2146 */
2147#ifndef MSM8930_PHASE_2
2148 msm8960_init_pmic();
2149#else
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002150 msm8930_init_pmic();
Jay Chokshi06fa7542011-12-07 13:09:17 -08002151#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002152 msm8930_i2c_init();
2153 msm8930_gfx_init();
2154 msm_spm_init(msm_spm_data, ARRAY_SIZE(msm_spm_data));
2155 msm_spm_l2_init(msm_spm_l2_data);
2156 msm8930_init_buses();
2157 platform_add_devices(msm_footswitch_devices,
2158 msm_num_footswitch_devices);
2159 platform_add_devices(common_devices, ARRAY_SIZE(common_devices));
Jay Chokshi06fa7542011-12-07 13:09:17 -08002160 /*
2161 * TODO: When physical 8930/PM8038 hardware becomes
2162 * available, remove this block or add the config
2163 * option.
2164 */
2165#ifndef MSM8930_PHASE_2
2166 msm8960_pm8921_gpio_mpp_init();
2167#else
2168 msm8930_pm8038_gpio_mpp_init();
2169#endif
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002170 platform_add_devices(cdp_devices, ARRAY_SIZE(cdp_devices));
2171 msm8930_init_hsic();
2172 msm8930_init_cam();
2173 msm8930_init_mmc();
Tianyi Gou7c6b81f2011-12-07 23:09:08 -08002174 acpuclk_init(&acpuclk_8930_soc_data);
Amy Malochef3c9db42011-12-08 15:17:35 -08002175 if (machine_is_msm8930_cdp() || machine_is_msm8627_cdp())
2176 mxt_init_vkeys_8930();
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002177 register_i2c_devices();
2178 msm8930_init_fb();
2179 slim_register_board_info(msm_slim_devices,
2180 ARRAY_SIZE(msm_slim_devices));
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002181 msm_pm_set_platform_data(msm_pm_data, ARRAY_SIZE(msm_pm_data));
2182 msm_pm_set_rpm_wakeup_irq(RPM_APCC_CPU0_WAKE_UP_IRQ);
2183 msm_cpuidle_set_states(msm_cstates, ARRAY_SIZE(msm_cstates),
2184 msm_pm_data);
2185 change_memory_power = &msm8930_change_memory_power;
Maheshkumar Sivasubramanianc6c55032011-10-25 16:01:32 -06002186 BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata));
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002187
2188 if (PLATFORM_IS_CHARM25())
2189 platform_add_devices(mdm_devices, ARRAY_SIZE(mdm_devices));
2190}
2191
2192MACHINE_START(MSM8930_CDP, "QCT MSM8930 CDP")
2193 .map_io = msm8930_map_io,
2194 .reserve = msm8930_reserve,
2195 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302196 .handle_irq = gic_handle_irq,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002197 .timer = &msm_timer,
2198 .init_machine = msm8930_cdp_init,
2199 .init_early = msm8930_allocate_memory_regions,
2200 .init_very_early = msm8930_early_memory,
2201MACHINE_END
2202
2203MACHINE_START(MSM8930_MTP, "QCT MSM8930 MTP")
2204 .map_io = msm8930_map_io,
2205 .reserve = msm8930_reserve,
2206 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302207 .handle_irq = gic_handle_irq,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002208 .timer = &msm_timer,
2209 .init_machine = msm8930_cdp_init,
2210 .init_early = msm8930_allocate_memory_regions,
2211 .init_very_early = msm8930_early_memory,
2212MACHINE_END
2213
2214MACHINE_START(MSM8930_FLUID, "QCT MSM8930 FLUID")
2215 .map_io = msm8930_map_io,
2216 .reserve = msm8930_reserve,
2217 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302218 .handle_irq = gic_handle_irq,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08002219 .timer = &msm_timer,
2220 .init_machine = msm8930_cdp_init,
2221 .init_early = msm8930_allocate_memory_regions,
2222 .init_very_early = msm8930_early_memory,
2223MACHINE_END
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002224
2225MACHINE_START(MSM8627_CDP, "QCT MSM8627 CDP")
2226 .map_io = msm8930_map_io,
2227 .reserve = msm8930_reserve,
2228 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302229 .handle_irq = gic_handle_irq,
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002230 .timer = &msm_timer,
2231 .init_machine = msm8930_cdp_init,
2232 .init_early = msm8930_allocate_memory_regions,
2233 .init_very_early = msm8930_early_memory,
2234MACHINE_END
2235
2236MACHINE_START(MSM8627_MTP, "QCT MSM8627 MTP")
2237 .map_io = msm8930_map_io,
2238 .reserve = msm8930_reserve,
2239 .init_irq = msm8930_init_irq,
Marc Zyngier89bdafd12011-12-22 11:39:20 +05302240 .handle_irq = gic_handle_irq,
Stepan Moskovchenko8768eff2011-12-01 18:55:07 -08002241 .timer = &msm_timer,
2242 .init_machine = msm8930_cdp_init,
2243 .init_early = msm8930_allocate_memory_regions,
2244 .init_very_early = msm8930_early_memory,
2245MACHINE_END