blob: 392205e96d8b69c265f90a661859cfe2fdf2cfed [file] [log] [blame]
Deepak Verma888204f2013-01-25 11:43:09 +05301/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
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>
Niranjana Vishwanathapurac1edd402012-06-28 15:32:50 -060014#include <linux/bitops.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070015#include <linux/platform_device.h>
Steve Mucklef132c6c2012-06-06 18:30:57 -070016#include <linux/gpio.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070017#include <linux/io.h>
18#include <linux/irq.h>
Kenneth Heitke748593a2011-07-15 15:45:11 -060019#include <linux/i2c.h>
David Keitel2f613d92012-02-15 11:29:16 -080020#include <linux/i2c/smb349.h>
Siddartha Mohanadossb9df4942012-02-08 09:58:21 -080021#include <linux/i2c/sx150x.h>
Sagar Dharia8bdcdaf2011-09-16 16:01:15 -060022#include <linux/slimbus/slimbus.h>
Asish Bhattacharyab1aeae22012-02-15 08:29:28 +053023#include <linux/mfd/wcd9xxx/core.h>
24#include <linux/mfd/wcd9xxx/pdata.h>
Amy Maloche70090f992012-02-16 16:35:26 -080025#include <linux/mfd/pm8xxx/misc.h>
Kenneth Heitke36920d32011-07-20 16:44:30 -060026#include <linux/msm_ssbi.h>
Stepan Moskovchenkoeed82a52011-09-02 13:19:23 -070027#include <linux/spi/spi.h>
Laura Abbott0ae40a02012-08-10 10:49:33 -070028#include <linux/dma-contiguous.h>
Ramesh Masavarapu28311912011-10-27 11:04:12 -070029#include <linux/dma-mapping.h>
30#include <linux/platform_data/qcom_crypto_device.h>
Mitchel Humpherys6ff930c2012-09-06 11:32:54 -070031#include <linux/msm_ion.h>
Jack Cheung46bfffa2012-01-19 15:26:24 -080032#include <linux/memory.h>
Larry Bassel67b921d2012-04-06 10:23:27 -070033#include <linux/memblock.h>
Praveen Chidambaram877d7a42012-06-05 14:33:20 -060034#include <linux/msm_thermal.h>
Jing Lin21ed4de2012-02-05 15:53:28 -080035#include <linux/i2c/atmel_mxt_ts.h>
Steve Mucklef132c6c2012-06-06 18:30:57 -070036#include <linux/cyttsp-qc.h>
Amy Maloche70090f992012-02-16 16:35:26 -080037#include <linux/i2c/isa1200.h>
Mohan Pallaka474b94b2012-01-25 12:59:58 +053038#include <linux/gpio_keys.h>
Siddartha Mohanadossb9df4942012-02-08 09:58:21 -080039#include <linux/epm_adc.h>
Jay Chokshie7d8d4f2012-04-04 14:47:57 -070040#include <linux/i2c/sx150x.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070041#include <asm/mach-types.h>
42#include <asm/mach/arch.h>
43#include <asm/hardware/gic.h>
Sahitya Tummala3586ed92011-08-03 09:13:23 +053044#include <asm/mach/mmc.h>
Ankit Verma6b7e2ba2012-01-26 15:48:54 -080045#include <linux/platform_data/qcom_wcnss_device.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070046
47#include <mach/board.h>
48#include <mach/msm_iomap.h>
Olav Haugan7c6aa742012-01-16 16:47:37 -080049#include <mach/ion.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070050#include <linux/usb/msm_hsusb.h>
51#include <linux/usb/android.h>
52#include <mach/socinfo.h>
Harini Jayaramanc4c58692011-07-19 14:50:10 -060053#include <mach/msm_spi.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070054#include "timer.h"
55#include "devices.h"
Joel King4ebccc62011-07-22 09:43:22 -070056#include <mach/gpiomux.h>
Praveen Chidambaram78499012011-11-01 17:15:17 -060057#include <mach/rpm.h>
Olav Haugan7c6aa742012-01-16 16:47:37 -080058#ifdef CONFIG_ANDROID_PMEM
Kevin Chan13be4e22011-10-20 11:30:32 -070059#include <linux/android_pmem.h>
Olav Haugan7c6aa742012-01-16 16:47:37 -080060#endif
Kevin Chan13be4e22011-10-20 11:30:32 -070061#include <mach/msm_memtypes.h>
62#include <linux/bootmem.h>
63#include <asm/setup.h>
Ramesh Masavarapu28311912011-10-27 11:04:12 -070064#include <mach/dma.h>
Jin Hongd3024e62012-02-09 16:13:32 -080065#include <mach/msm_dsps.h>
Gagan Mac8a7a5d32011-11-11 16:43:06 -070066#include <mach/msm_bus_board.h>
Praveen Chidambaram78499012011-11-01 17:15:17 -060067#include <mach/cpuidle.h>
Joel Kingdacbc822012-01-25 13:30:57 -080068#include <mach/mdm2.h>
Siddartha Mohanadosscaeaa922012-02-07 16:41:38 -080069#include <linux/msm_tsens.h>
Stephen Boyd4d0d2582012-02-10 14:49:40 -080070#include <mach/msm_xo.h>
Laura Abbott350c8362012-02-28 14:46:52 -080071#include <mach/msm_rtb.h>
Santosh Mardieff9a742012-04-09 23:23:39 +053072#include <sound/cs8427.h>
Ravi Kumar V05931a22012-04-04 17:09:37 +053073#include <media/gpio-ir-recv.h>
Larry Bassel67b921d2012-04-06 10:23:27 -070074#include <linux/fmem.h>
Niranjana Vishwanathapura06f89332012-05-03 17:11:13 -060075#include <mach/msm_pcie.h>
Jeff Ohlsteindd0dd9b2012-05-29 17:47:21 -070076#include <mach/restart.h>
Niranjana Vishwanathapurac1edd402012-06-28 15:32:50 -060077#include <mach/msm_iomap.h>
Joel King4ebccc62011-07-22 09:43:22 -070078
Jeff Ohlstein7e668552011-10-06 16:17:25 -070079#include "msm_watchdog.h"
Stepan Moskovchenko5a83dba2011-12-05 17:30:17 -080080#include "board-8064.h"
Matt Wagantalld55b90f2012-02-23 23:27:44 -080081#include "clock.h"
Praveen Chidambaram78499012011-11-01 17:15:17 -060082#include "spm.h"
Subhash Jadavani909e04f2012-04-12 10:52:50 +053083#include <mach/mpm.h>
Praveen Chidambaram78499012011-11-01 17:15:17 -060084#include "rpm_resources.h"
Matt Wagantall7cca4642012-02-01 16:43:24 -080085#include "pm.h"
Praveen Chidambaram78499012011-11-01 17:15:17 -060086#include "pm-boot.h"
Rajesh Sastrulaaee8af32012-01-20 11:46:31 -080087#include "devices-msm8x60.h"
Hanumant Singh50440d42012-04-23 19:27:16 -070088#include "smd_private.h"
Ameya Thakurffd21b02013-01-30 11:33:22 -080089#include "sysmon.h"
Jay Chokshiea67c622011-07-29 17:12:26 -070090
Olav Haugan7c6aa742012-01-16 16:47:37 -080091#define MSM_PMEM_ADSP_SIZE 0x7800000
Bharath Ramachandramurthy2fd017a2012-03-13 10:21:09 -070092#define MSM_PMEM_AUDIO_SIZE 0x4CF000
Olav Haugan7c6aa742012-01-16 16:47:37 -080093#ifdef CONFIG_FB_MSM_HDMI_AS_PRIMARY
94#define MSM_PMEM_SIZE 0x4000000 /* 64 Mbytes */
95#else
Chetan Kalyan72aac4f2012-02-23 14:56:54 -080096#define MSM_PMEM_SIZE 0x4000000 /* 64 Mbytes */
Olav Haugan7c6aa742012-01-16 16:47:37 -080097#endif
Kevin Chan13be4e22011-10-20 11:30:32 -070098
Olav Haugan7c6aa742012-01-16 16:47:37 -080099#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
Hanumant Singheadb7502012-05-15 18:14:04 -0700100#define HOLE_SIZE 0x20000
Deepak Verma888204f2013-01-25 11:43:09 +0530101#define MSM_ION_MFC_META_SIZE 0x40000 /* 256 Kbytes */
Mitchel Humpherys05e58812012-08-13 14:24:13 -0700102#define MSM_CONTIG_MEM_SIZE 0x65000
Olav Haugan129992c2012-03-22 09:54:01 -0700103#ifdef CONFIG_MSM_IOMMU
104#define MSM_ION_MM_SIZE 0x3800000
105#define MSM_ION_SF_SIZE 0
Olav Haugan39477bb2012-05-14 16:05:36 -0700106#define MSM_ION_QSECOM_SIZE 0x780000 /* (7.5MB) */
Laura Abbott03e3cd72013-02-09 09:35:30 -0800107#define MSM_ION_HEAP_NUM 8
Olav Haugan129992c2012-03-22 09:54:01 -0700108#else
Olav Haugan7c6aa742012-01-16 16:47:37 -0800109#define MSM_ION_MM_SIZE MSM_PMEM_ADSP_SIZE
Olav Haugan129992c2012-03-22 09:54:01 -0700110#define MSM_ION_SF_SIZE MSM_PMEM_SIZE
Olav Haugan39477bb2012-05-14 16:05:36 -0700111#define MSM_ION_QSECOM_SIZE 0x600000 /* (6MB) */
Olav Haugan129992c2012-03-22 09:54:01 -0700112#define MSM_ION_HEAP_NUM 8
113#endif
Hanumant Singheadb7502012-05-15 18:14:04 -0700114#define MSM_ION_MM_FW_SIZE (0x200000 - HOLE_SIZE) /* (2MB - 128KB) */
Deepak Verma888204f2013-01-25 11:43:09 +0530115#define MSM_ION_MFC_SIZE (SZ_8K + MSM_ION_MFC_META_SIZE)
Olav Haugan2c43fac2012-01-19 11:06:37 -0800116#define MSM_ION_AUDIO_SIZE MSM_PMEM_AUDIO_SIZE
Olav Haugan7c6aa742012-01-16 16:47:37 -0800117#else
Mitchel Humpherys05e58812012-08-13 14:24:13 -0700118#define MSM_CONTIG_MEM_SIZE 0x110C000
Olav Haugan7c6aa742012-01-16 16:47:37 -0800119#define MSM_ION_HEAP_NUM 1
120#endif
Kevin Chan13be4e22011-10-20 11:30:32 -0700121
Hanumant Singheadb7502012-05-15 18:14:04 -0700122#define APQ8064_FIXED_AREA_START (0xa0000000 - (MSM_ION_MM_FW_SIZE + \
123 HOLE_SIZE))
Larry Bassel67b921d2012-04-06 10:23:27 -0700124#define MAX_FIXED_AREA_SIZE 0x10000000
Hanumant Singheadb7502012-05-15 18:14:04 -0700125#define MSM_MM_FW_SIZE (0x200000 - HOLE_SIZE)
126#define APQ8064_FW_START APQ8064_FIXED_AREA_START
Laura Abbott03e3cd72013-02-09 09:35:30 -0800127#define MSM_ION_ADSP_SIZE SZ_8M
Larry Bassel67b921d2012-04-06 10:23:27 -0700128
Niranjana Vishwanathapurac1edd402012-06-28 15:32:50 -0600129#define QFPROM_RAW_FEAT_CONFIG_ROW0_MSB (MSM_QFPROM_BASE + 0x23c)
130#define QFPROM_RAW_OEM_CONFIG_ROW0_LSB (MSM_QFPROM_BASE + 0x220)
131
Niranjana Vishwanathapura68210ff2012-06-24 18:03:49 -0600132/* PCIE AXI address space */
133#define PCIE_AXI_BAR_PHYS 0x08000000
134#define PCIE_AXI_BAR_SIZE SZ_128M
135
Niranjana Vishwanathapura459a27d2012-07-20 12:23:55 -0600136/* PCIe pmic gpios */
137#define PCIE_WAKE_N_PMIC_GPIO 12
Niranjana Vishwanathapura06f89332012-05-03 17:11:13 -0600138#define PCIE_PWR_EN_PMIC_GPIO 13
139#define PCIE_RST_N_PMIC_MPP 1
140
Mitchel Humpherys05e58812012-08-13 14:24:13 -0700141#ifdef CONFIG_KERNEL_MSM_CONTIG_MEM_REGION
142static unsigned msm_contig_mem_size = MSM_CONTIG_MEM_SIZE;
143static int __init msm_contig_mem_size_setup(char *p)
Kevin Chan13be4e22011-10-20 11:30:32 -0700144{
Mitchel Humpherys05e58812012-08-13 14:24:13 -0700145 msm_contig_mem_size = memparse(p, NULL);
Olav Haugan7c6aa742012-01-16 16:47:37 -0800146 return 0;
Kevin Chan13be4e22011-10-20 11:30:32 -0700147}
Mitchel Humpherys05e58812012-08-13 14:24:13 -0700148early_param("msm_contig_mem_size", msm_contig_mem_size_setup);
Olav Haugan7c6aa742012-01-16 16:47:37 -0800149#endif
Kevin Chan13be4e22011-10-20 11:30:32 -0700150
Olav Haugan7c6aa742012-01-16 16:47:37 -0800151#ifdef CONFIG_ANDROID_PMEM
Kevin Chan13be4e22011-10-20 11:30:32 -0700152static unsigned pmem_size = MSM_PMEM_SIZE;
153static int __init pmem_size_setup(char *p)
154{
155 pmem_size = memparse(p, NULL);
156 return 0;
157}
158early_param("pmem_size", pmem_size_setup);
159
160static unsigned pmem_adsp_size = MSM_PMEM_ADSP_SIZE;
161
162static int __init pmem_adsp_size_setup(char *p)
163{
164 pmem_adsp_size = memparse(p, NULL);
165 return 0;
166}
167early_param("pmem_adsp_size", pmem_adsp_size_setup);
168
169static unsigned pmem_audio_size = MSM_PMEM_AUDIO_SIZE;
170
171static int __init pmem_audio_size_setup(char *p)
172{
173 pmem_audio_size = memparse(p, NULL);
174 return 0;
175}
176early_param("pmem_audio_size", pmem_audio_size_setup);
Olav Haugan7c6aa742012-01-16 16:47:37 -0800177#endif
Kevin Chan13be4e22011-10-20 11:30:32 -0700178
Olav Haugan7c6aa742012-01-16 16:47:37 -0800179#ifdef CONFIG_ANDROID_PMEM
180#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
Kevin Chan13be4e22011-10-20 11:30:32 -0700181static struct android_pmem_platform_data android_pmem_pdata = {
182 .name = "pmem",
183 .allocator_type = PMEM_ALLOCATORTYPE_ALLORNOTHING,
184 .cached = 1,
185 .memory_type = MEMTYPE_EBI1,
186};
187
Laura Abbottb93525f2012-04-12 09:57:19 -0700188static struct platform_device apq8064_android_pmem_device = {
Kevin Chan13be4e22011-10-20 11:30:32 -0700189 .name = "android_pmem",
190 .id = 0,
191 .dev = {.platform_data = &android_pmem_pdata},
192};
193
194static struct android_pmem_platform_data android_pmem_adsp_pdata = {
195 .name = "pmem_adsp",
196 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
197 .cached = 0,
198 .memory_type = MEMTYPE_EBI1,
199};
Laura Abbottb93525f2012-04-12 09:57:19 -0700200static struct platform_device apq8064_android_pmem_adsp_device = {
Kevin Chan13be4e22011-10-20 11:30:32 -0700201 .name = "android_pmem",
202 .id = 2,
203 .dev = { .platform_data = &android_pmem_adsp_pdata },
204};
205
206static struct android_pmem_platform_data android_pmem_audio_pdata = {
207 .name = "pmem_audio",
208 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
209 .cached = 0,
210 .memory_type = MEMTYPE_EBI1,
211};
212
Laura Abbottb93525f2012-04-12 09:57:19 -0700213static struct platform_device apq8064_android_pmem_audio_device = {
Kevin Chan13be4e22011-10-20 11:30:32 -0700214 .name = "android_pmem",
215 .id = 4,
216 .dev = { .platform_data = &android_pmem_audio_pdata },
217};
Bharath Ramachandramurthy4a3fa912012-03-13 19:16:24 -0700218#endif /* CONFIG_MSM_MULTIMEDIA_USE_ION */
219#endif /* CONFIG_ANDROID_PMEM */
Olav Haugan7c6aa742012-01-16 16:47:37 -0800220
Larry Bassel67b921d2012-04-06 10:23:27 -0700221struct fmem_platform_data apq8064_fmem_pdata = {
222};
223
Olav Haugan7c6aa742012-01-16 16:47:37 -0800224static struct memtype_reserve apq8064_reserve_table[] __initdata = {
225 [MEMTYPE_SMI] = {
226 },
227 [MEMTYPE_EBI0] = {
228 .flags = MEMTYPE_FLAGS_1M_ALIGN,
229 },
230 [MEMTYPE_EBI1] = {
231 .flags = MEMTYPE_FLAGS_1M_ALIGN,
232 },
233};
Kevin Chan13be4e22011-10-20 11:30:32 -0700234
Laura Abbott350c8362012-02-28 14:46:52 -0800235static void __init reserve_rtb_memory(void)
236{
237#if defined(CONFIG_MSM_RTB)
Laura Abbottb93525f2012-04-12 09:57:19 -0700238 apq8064_reserve_table[MEMTYPE_EBI1].size += apq8064_rtb_pdata.size;
Laura Abbott350c8362012-02-28 14:46:52 -0800239#endif
240}
241
242
Kevin Chan13be4e22011-10-20 11:30:32 -0700243static void __init size_pmem_devices(void)
244{
Olav Haugan7c6aa742012-01-16 16:47:37 -0800245#ifdef CONFIG_ANDROID_PMEM
246#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
Kevin Chan13be4e22011-10-20 11:30:32 -0700247 android_pmem_adsp_pdata.size = pmem_adsp_size;
248 android_pmem_pdata.size = pmem_size;
249 android_pmem_audio_pdata.size = MSM_PMEM_AUDIO_SIZE;
Bharath Ramachandramurthy4a3fa912012-03-13 19:16:24 -0700250#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/
251#endif /*CONFIG_ANDROID_PMEM*/
Kevin Chan13be4e22011-10-20 11:30:32 -0700252}
253
Bharath Ramachandramurthy4a3fa912012-03-13 19:16:24 -0700254#ifdef CONFIG_ANDROID_PMEM
255#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
Kevin Chan13be4e22011-10-20 11:30:32 -0700256static void __init reserve_memory_for(struct android_pmem_platform_data *p)
257{
258 apq8064_reserve_table[p->memory_type].size += p->size;
259}
Bharath Ramachandramurthy4a3fa912012-03-13 19:16:24 -0700260#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/
261#endif /*CONFIG_ANDROID_PMEM*/
Kevin Chan13be4e22011-10-20 11:30:32 -0700262
Kevin Chan13be4e22011-10-20 11:30:32 -0700263static void __init reserve_pmem_memory(void)
264{
Olav Haugan7c6aa742012-01-16 16:47:37 -0800265#ifdef CONFIG_ANDROID_PMEM
266#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
Kevin Chan13be4e22011-10-20 11:30:32 -0700267 reserve_memory_for(&android_pmem_adsp_pdata);
268 reserve_memory_for(&android_pmem_pdata);
269 reserve_memory_for(&android_pmem_audio_pdata);
Bharath Ramachandramurthy4a3fa912012-03-13 19:16:24 -0700270#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/
Mitchel Humpherys05e58812012-08-13 14:24:13 -0700271 apq8064_reserve_table[MEMTYPE_EBI1].size += msm_contig_mem_size;
Bharath Ramachandramurthy4a3fa912012-03-13 19:16:24 -0700272#endif /*CONFIG_ANDROID_PMEM*/
Olav Haugan7c6aa742012-01-16 16:47:37 -0800273}
274
275static int apq8064_paddr_to_memtype(unsigned int paddr)
276{
277 return MEMTYPE_EBI1;
278}
279
Steve Mucklef132c6c2012-06-06 18:30:57 -0700280#define FMEM_ENABLED 0
Larry Bassel67b921d2012-04-06 10:23:27 -0700281
Olav Haugan7c6aa742012-01-16 16:47:37 -0800282#ifdef CONFIG_ION_MSM
283#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
Laura Abbottb93525f2012-04-12 09:57:19 -0700284static struct ion_cp_heap_pdata cp_mm_apq8064_ion_pdata = {
Olav Haugan7c6aa742012-01-16 16:47:37 -0800285 .permission_type = IPT_TYPE_MM_CARVEOUT,
Olav Haugand3d29682012-01-19 10:57:07 -0800286 .align = PAGE_SIZE,
Larry Bassel67b921d2012-04-06 10:23:27 -0700287 .reusable = FMEM_ENABLED,
288 .mem_is_fmem = FMEM_ENABLED,
289 .fixed_position = FIXED_MIDDLE,
Laura Abbottadec9c72012-12-05 11:49:59 -0800290 .is_cma = 1,
Laura Abbott5249a052012-12-11 15:09:03 -0800291 .no_nonsecure_alloc = 1,
Olav Haugan7c6aa742012-01-16 16:47:37 -0800292};
293
Laura Abbottb93525f2012-04-12 09:57:19 -0700294static struct ion_cp_heap_pdata cp_mfc_apq8064_ion_pdata = {
Olav Haugan7c6aa742012-01-16 16:47:37 -0800295 .permission_type = IPT_TYPE_MFC_SHAREDMEM,
Olav Haugand3d29682012-01-19 10:57:07 -0800296 .align = PAGE_SIZE,
Larry Bassel67b921d2012-04-06 10:23:27 -0700297 .reusable = 0,
298 .mem_is_fmem = FMEM_ENABLED,
299 .fixed_position = FIXED_HIGH,
Laura Abbott5249a052012-12-11 15:09:03 -0800300 .no_nonsecure_alloc = 1,
Olav Haugan7c6aa742012-01-16 16:47:37 -0800301};
302
Laura Abbottb93525f2012-04-12 09:57:19 -0700303static struct ion_co_heap_pdata co_apq8064_ion_pdata = {
Olav Haugand3d29682012-01-19 10:57:07 -0800304 .adjacent_mem_id = INVALID_HEAP_ID,
305 .align = PAGE_SIZE,
Larry Bassel67b921d2012-04-06 10:23:27 -0700306 .mem_is_fmem = 0,
Olav Haugand3d29682012-01-19 10:57:07 -0800307};
308
Laura Abbottb93525f2012-04-12 09:57:19 -0700309static struct ion_co_heap_pdata fw_co_apq8064_ion_pdata = {
Olav Haugand3d29682012-01-19 10:57:07 -0800310 .adjacent_mem_id = ION_CP_MM_HEAP_ID,
311 .align = SZ_128K,
Larry Bassel67b921d2012-04-06 10:23:27 -0700312 .mem_is_fmem = FMEM_ENABLED,
313 .fixed_position = FIXED_LOW,
Olav Haugan7c6aa742012-01-16 16:47:37 -0800314};
315#endif
Olav Haugan9cdfc2f2012-02-15 09:52:57 -0800316
Laura Abbott0ae40a02012-08-10 10:49:33 -0700317static u64 msm_dmamask = DMA_BIT_MASK(32);
318
319static struct platform_device ion_mm_heap_device = {
320 .name = "ion-mm-heap-device",
321 .id = -1,
322 .dev = {
323 .dma_mask = &msm_dmamask,
324 .coherent_dma_mask = DMA_BIT_MASK(32),
325 }
326};
327
Laura Abbott03e3cd72013-02-09 09:35:30 -0800328static struct platform_device ion_adsp_heap_device = {
329 .name = "ion-adsp-heap-device",
330 .id = -1,
331 .dev = {
332 .dma_mask = &msm_dmamask,
333 .coherent_dma_mask = DMA_BIT_MASK(32),
334 }
335};
Olav Haugan9cdfc2f2012-02-15 09:52:57 -0800336/**
337 * These heaps are listed in the order they will be allocated. Due to
338 * video hardware restrictions and content protection the FW heap has to
339 * be allocated adjacent (below) the MM heap and the MFC heap has to be
340 * allocated after the MM heap to ensure MFC heap is not more than 256MB
341 * away from the base address of the FW heap.
342 * However, the order of FW heap and MM heap doesn't matter since these
343 * two heaps are taken care of by separate code to ensure they are adjacent
344 * to each other.
345 * Don't swap the order unless you know what you are doing!
346 */
Benjamin Gaignardb2d367c2012-06-25 15:27:30 -0700347struct ion_platform_heap apq8064_heaps[] = {
Olav Haugan7c6aa742012-01-16 16:47:37 -0800348 {
349 .id = ION_SYSTEM_HEAP_ID,
350 .type = ION_HEAP_TYPE_SYSTEM,
351 .name = ION_VMALLOC_HEAP_NAME,
352 },
353#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
354 {
Olav Haugan7c6aa742012-01-16 16:47:37 -0800355 .id = ION_CP_MM_HEAP_ID,
356 .type = ION_HEAP_TYPE_CP,
357 .name = ION_MM_HEAP_NAME,
358 .size = MSM_ION_MM_SIZE,
359 .memory_type = ION_EBI_TYPE,
Laura Abbottb93525f2012-04-12 09:57:19 -0700360 .extra_data = (void *) &cp_mm_apq8064_ion_pdata,
Laura Abbott0ae40a02012-08-10 10:49:33 -0700361 .priv = &ion_mm_heap_device.dev
Olav Haugan7c6aa742012-01-16 16:47:37 -0800362 },
363 {
Olav Haugand3d29682012-01-19 10:57:07 -0800364 .id = ION_MM_FIRMWARE_HEAP_ID,
365 .type = ION_HEAP_TYPE_CARVEOUT,
366 .name = ION_MM_FIRMWARE_HEAP_NAME,
367 .size = MSM_ION_MM_FW_SIZE,
368 .memory_type = ION_EBI_TYPE,
Laura Abbottb93525f2012-04-12 09:57:19 -0700369 .extra_data = (void *) &fw_co_apq8064_ion_pdata,
Olav Haugand3d29682012-01-19 10:57:07 -0800370 },
371 {
Olav Haugan7c6aa742012-01-16 16:47:37 -0800372 .id = ION_CP_MFC_HEAP_ID,
373 .type = ION_HEAP_TYPE_CP,
374 .name = ION_MFC_HEAP_NAME,
375 .size = MSM_ION_MFC_SIZE,
376 .memory_type = ION_EBI_TYPE,
Laura Abbottb93525f2012-04-12 09:57:19 -0700377 .extra_data = (void *) &cp_mfc_apq8064_ion_pdata,
Olav Haugan7c6aa742012-01-16 16:47:37 -0800378 },
Olav Haugan129992c2012-03-22 09:54:01 -0700379#ifndef CONFIG_MSM_IOMMU
Olav Haugan7c6aa742012-01-16 16:47:37 -0800380 {
Olav Haugan9cdfc2f2012-02-15 09:52:57 -0800381 .id = ION_SF_HEAP_ID,
382 .type = ION_HEAP_TYPE_CARVEOUT,
383 .name = ION_SF_HEAP_NAME,
384 .size = MSM_ION_SF_SIZE,
385 .memory_type = ION_EBI_TYPE,
Laura Abbottb93525f2012-04-12 09:57:19 -0700386 .extra_data = (void *) &co_apq8064_ion_pdata,
Olav Haugan9cdfc2f2012-02-15 09:52:57 -0800387 },
Olav Haugan129992c2012-03-22 09:54:01 -0700388#endif
Olav Haugan9cdfc2f2012-02-15 09:52:57 -0800389 {
Olav Haugan7c6aa742012-01-16 16:47:37 -0800390 .id = ION_IOMMU_HEAP_ID,
391 .type = ION_HEAP_TYPE_IOMMU,
392 .name = ION_IOMMU_HEAP_NAME,
393 },
Olav Hauganf45e2142012-01-19 11:01:01 -0800394 {
395 .id = ION_QSECOM_HEAP_ID,
396 .type = ION_HEAP_TYPE_CARVEOUT,
397 .name = ION_QSECOM_HEAP_NAME,
398 .size = MSM_ION_QSECOM_SIZE,
399 .memory_type = ION_EBI_TYPE,
Laura Abbottb93525f2012-04-12 09:57:19 -0700400 .extra_data = (void *) &co_apq8064_ion_pdata,
Olav Hauganf45e2142012-01-19 11:01:01 -0800401 },
Olav Haugan2c43fac2012-01-19 11:06:37 -0800402 {
403 .id = ION_AUDIO_HEAP_ID,
404 .type = ION_HEAP_TYPE_CARVEOUT,
405 .name = ION_AUDIO_HEAP_NAME,
406 .size = MSM_ION_AUDIO_SIZE,
407 .memory_type = ION_EBI_TYPE,
Laura Abbottb93525f2012-04-12 09:57:19 -0700408 .extra_data = (void *) &co_apq8064_ion_pdata,
Olav Haugan2c43fac2012-01-19 11:06:37 -0800409 },
Laura Abbott03e3cd72013-02-09 09:35:30 -0800410 {
411 .id = ION_ADSP_HEAP_ID,
412 .type = ION_HEAP_TYPE_DMA,
413 .name = ION_ADSP_HEAP_NAME,
414 .size = MSM_ION_ADSP_SIZE,
415 .memory_type = ION_EBI_TYPE,
416 .extra_data = (void *) &co_apq8064_ion_pdata,
417 .priv = &ion_adsp_heap_device.dev,
418 },
Olav Haugan7c6aa742012-01-16 16:47:37 -0800419#endif
Benjamin Gaignardb2d367c2012-06-25 15:27:30 -0700420};
421
422static struct ion_platform_data apq8064_ion_pdata = {
423 .nr = MSM_ION_HEAP_NUM,
424 .heaps = apq8064_heaps,
Olav Haugan7c6aa742012-01-16 16:47:37 -0800425};
426
Laura Abbottb93525f2012-04-12 09:57:19 -0700427static struct platform_device apq8064_ion_dev = {
Olav Haugan7c6aa742012-01-16 16:47:37 -0800428 .name = "ion-msm",
429 .id = 1,
Laura Abbottb93525f2012-04-12 09:57:19 -0700430 .dev = { .platform_data = &apq8064_ion_pdata },
Olav Haugan7c6aa742012-01-16 16:47:37 -0800431};
432#endif
433
Larry Bassel67b921d2012-04-06 10:23:27 -0700434static struct platform_device apq8064_fmem_device = {
435 .name = "fmem",
436 .id = 1,
437 .dev = { .platform_data = &apq8064_fmem_pdata },
438};
439
440static void __init reserve_mem_for_ion(enum ion_memory_types mem_type,
441 unsigned long size)
442{
443 apq8064_reserve_table[mem_type].size += size;
444}
445
446static void __init apq8064_reserve_fixed_area(unsigned long fixed_area_size)
447{
448#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION)
449 int ret;
450
451 if (fixed_area_size > MAX_FIXED_AREA_SIZE)
452 panic("fixed area size is larger than %dM\n",
453 MAX_FIXED_AREA_SIZE >> 20);
454
455 reserve_info->fixed_area_size = fixed_area_size;
456 reserve_info->fixed_area_start = APQ8064_FW_START;
457
458 ret = memblock_remove(reserve_info->fixed_area_start,
459 reserve_info->fixed_area_size);
460 BUG_ON(ret);
461#endif
462}
463
464/**
465 * Reserve memory for ION and calculate amount of reusable memory for fmem.
466 * We only reserve memory for heaps that are not reusable. However, we only
467 * support one reusable heap at the moment so we ignore the reusable flag for
468 * other than the first heap with reusable flag set. Also handle special case
469 * for video heaps (MM,FW, and MFC). Video requires heaps MM and MFC to be
470 * at a higher address than FW in addition to not more than 256MB away from the
471 * base address of the firmware. This means that if MM is reusable the other
472 * two heaps must be allocated in the same region as FW. This is handled by the
473 * mem_is_fmem flag in the platform data. In addition the MM heap must be
474 * adjacent to the FW heap for content protection purposes.
475 */
Stephen Boyd668d7652012-04-25 11:31:01 -0700476static void __init reserve_ion_memory(void)
Olav Haugan7c6aa742012-01-16 16:47:37 -0800477{
478#if defined(CONFIG_ION_MSM) && defined(CONFIG_MSM_MULTIMEDIA_USE_ION)
Larry Bassel67b921d2012-04-06 10:23:27 -0700479 unsigned int i;
Laura Abbott0ae40a02012-08-10 10:49:33 -0700480 unsigned int ret;
Larry Bassel67b921d2012-04-06 10:23:27 -0700481 unsigned int fixed_size = 0;
482 unsigned int fixed_low_size, fixed_middle_size, fixed_high_size;
483 unsigned long fixed_low_start, fixed_middle_start, fixed_high_start;
Laura Abbott0ae40a02012-08-10 10:49:33 -0700484 unsigned long cma_alignment;
485 unsigned int low_use_cma = 0;
486 unsigned int middle_use_cma = 0;
487 unsigned int high_use_cma = 0;
488
Larry Bassel67b921d2012-04-06 10:23:27 -0700489
Larry Bassel67b921d2012-04-06 10:23:27 -0700490 fixed_low_size = 0;
491 fixed_middle_size = 0;
492 fixed_high_size = 0;
493
Laura Abbott0ae40a02012-08-10 10:49:33 -0700494 cma_alignment = PAGE_SIZE << max(MAX_ORDER, pageblock_order);
495
Larry Bassel67b921d2012-04-06 10:23:27 -0700496 for (i = 0; i < apq8064_ion_pdata.nr; ++i) {
Laura Abbott0ae40a02012-08-10 10:49:33 -0700497 struct ion_platform_heap *heap =
Larry Bassel67b921d2012-04-06 10:23:27 -0700498 &(apq8064_ion_pdata.heaps[i]);
Laura Abbott0ae40a02012-08-10 10:49:33 -0700499 int use_cma = 0;
500
Larry Bassel67b921d2012-04-06 10:23:27 -0700501
502 if (heap->extra_data) {
503 int fixed_position = NOT_FIXED;
Larry Bassel67b921d2012-04-06 10:23:27 -0700504
Mitchel Humpherysdc4d01d2012-09-13 10:53:22 -0700505 switch ((int)heap->type) {
Larry Bassel67b921d2012-04-06 10:23:27 -0700506 case ION_HEAP_TYPE_CP:
Laura Abbott0ae40a02012-08-10 10:49:33 -0700507 if (((struct ion_cp_heap_pdata *)
508 heap->extra_data)->is_cma) {
509 heap->size = ALIGN(heap->size,
510 cma_alignment);
511 use_cma = 1;
512 }
Larry Bassel67b921d2012-04-06 10:23:27 -0700513 fixed_position = ((struct ion_cp_heap_pdata *)
514 heap->extra_data)->fixed_position;
515 break;
Laura Abbott0ae40a02012-08-10 10:49:33 -0700516 case ION_HEAP_TYPE_DMA:
517 use_cma = 1;
518 /* Purposely fall through here */
Larry Bassel67b921d2012-04-06 10:23:27 -0700519 case ION_HEAP_TYPE_CARVEOUT:
Larry Bassel67b921d2012-04-06 10:23:27 -0700520 fixed_position = ((struct ion_co_heap_pdata *)
521 heap->extra_data)->fixed_position;
522 break;
523 default:
524 break;
525 }
526
527 if (fixed_position != NOT_FIXED)
528 fixed_size += heap->size;
529 else
530 reserve_mem_for_ion(MEMTYPE_EBI1, heap->size);
531
Laura Abbott0ae40a02012-08-10 10:49:33 -0700532 if (fixed_position == FIXED_LOW) {
Larry Bassel67b921d2012-04-06 10:23:27 -0700533 fixed_low_size += heap->size;
Laura Abbott0ae40a02012-08-10 10:49:33 -0700534 low_use_cma = use_cma;
535 } else if (fixed_position == FIXED_MIDDLE) {
Larry Bassel67b921d2012-04-06 10:23:27 -0700536 fixed_middle_size += heap->size;
Laura Abbott0ae40a02012-08-10 10:49:33 -0700537 middle_use_cma = use_cma;
538 } else if (fixed_position == FIXED_HIGH) {
Larry Bassel67b921d2012-04-06 10:23:27 -0700539 fixed_high_size += heap->size;
Laura Abbott0ae40a02012-08-10 10:49:33 -0700540 high_use_cma = use_cma;
541 } else if (use_cma) {
542 /*
543 * Heaps that use CMA but are not part of the
544 * fixed set. Create wherever.
545 */
546 dma_declare_contiguous(
547 heap->priv,
548 heap->size,
549 0,
550 0xb0000000);
551
552 }
Larry Bassel67b921d2012-04-06 10:23:27 -0700553 }
554 }
555
556 if (!fixed_size)
557 return;
558
Laura Abbott0ae40a02012-08-10 10:49:33 -0700559 /*
560 * Given the setup for the fixed area, we can't round up all sizes.
561 * Some sizes must be set up exactly and aligned correctly. Incorrect
562 * alignments are considered a configuration issue
Larry Bassel67b921d2012-04-06 10:23:27 -0700563 */
Larry Bassel67b921d2012-04-06 10:23:27 -0700564
565 fixed_low_start = APQ8064_FIXED_AREA_START;
Laura Abbott0ae40a02012-08-10 10:49:33 -0700566 if (low_use_cma) {
567 BUG_ON(!IS_ALIGNED(fixed_low_size + HOLE_SIZE, cma_alignment));
568 BUG_ON(!IS_ALIGNED(fixed_low_start, cma_alignment));
569 } else {
570 BUG_ON(!IS_ALIGNED(fixed_low_size + HOLE_SIZE, SECTION_SIZE));
571 ret = memblock_remove(fixed_low_start,
572 fixed_low_size + HOLE_SIZE);
573 BUG_ON(ret);
574 }
575
Hanumant Singheadb7502012-05-15 18:14:04 -0700576 fixed_middle_start = fixed_low_start + fixed_low_size + HOLE_SIZE;
Laura Abbott0ae40a02012-08-10 10:49:33 -0700577 if (middle_use_cma) {
578 BUG_ON(!IS_ALIGNED(fixed_middle_start, cma_alignment));
579 BUG_ON(!IS_ALIGNED(fixed_middle_size, cma_alignment));
580 } else {
581 BUG_ON(!IS_ALIGNED(fixed_middle_size, SECTION_SIZE));
582 ret = memblock_remove(fixed_middle_start, fixed_middle_size);
583 BUG_ON(ret);
584 }
585
Larry Bassel67b921d2012-04-06 10:23:27 -0700586 fixed_high_start = fixed_middle_start + fixed_middle_size;
Laura Abbott0ae40a02012-08-10 10:49:33 -0700587 if (high_use_cma) {
588 fixed_high_size = ALIGN(fixed_high_size, cma_alignment);
589 BUG_ON(!IS_ALIGNED(fixed_high_start, cma_alignment));
590 } else {
591 /* This is the end of the fixed area so it's okay to round up */
592 fixed_high_size = ALIGN(fixed_high_size, SECTION_SIZE);
593 ret = memblock_remove(fixed_high_start, fixed_high_size);
594 BUG_ON(ret);
595 }
Larry Bassel67b921d2012-04-06 10:23:27 -0700596
597 for (i = 0; i < apq8064_ion_pdata.nr; ++i) {
598 struct ion_platform_heap *heap = &(apq8064_ion_pdata.heaps[i]);
599
600 if (heap->extra_data) {
601 int fixed_position = NOT_FIXED;
Steve Mucklef132c6c2012-06-06 18:30:57 -0700602 struct ion_cp_heap_pdata *pdata = NULL;
Larry Bassel67b921d2012-04-06 10:23:27 -0700603
Mitchel Humpherysdc4d01d2012-09-13 10:53:22 -0700604 switch ((int) heap->type) {
Larry Bassel67b921d2012-04-06 10:23:27 -0700605 case ION_HEAP_TYPE_CP:
Hanumant Singheadb7502012-05-15 18:14:04 -0700606 pdata =
607 (struct ion_cp_heap_pdata *)heap->extra_data;
608 fixed_position = pdata->fixed_position;
Larry Bassel67b921d2012-04-06 10:23:27 -0700609 break;
610 case ION_HEAP_TYPE_CARVEOUT:
Laura Abbott0ae40a02012-08-10 10:49:33 -0700611 case ION_HEAP_TYPE_DMA:
Larry Bassel67b921d2012-04-06 10:23:27 -0700612 fixed_position = ((struct ion_co_heap_pdata *)
613 heap->extra_data)->fixed_position;
614 break;
615 default:
616 break;
617 }
618
619 switch (fixed_position) {
620 case FIXED_LOW:
621 heap->base = fixed_low_start;
622 break;
623 case FIXED_MIDDLE:
624 heap->base = fixed_middle_start;
Laura Abbott0ae40a02012-08-10 10:49:33 -0700625 if (middle_use_cma) {
626 ret = dma_declare_contiguous(
627 heap->priv,
628 heap->size,
629 fixed_middle_start,
630 0xa0000000);
631 WARN_ON(ret);
632 }
Hanumant Singheadb7502012-05-15 18:14:04 -0700633 pdata->secure_base = fixed_middle_start
634 - HOLE_SIZE;
635 pdata->secure_size = HOLE_SIZE + heap->size;
Larry Bassel67b921d2012-04-06 10:23:27 -0700636 break;
637 case FIXED_HIGH:
638 heap->base = fixed_high_start;
639 break;
640 default:
641 break;
642 }
643 }
644 }
Olav Haugan7c6aa742012-01-16 16:47:37 -0800645#endif
Kevin Chan13be4e22011-10-20 11:30:32 -0700646}
647
Huaibin Yang4a084e32011-12-15 15:25:52 -0800648static void __init reserve_mdp_memory(void)
649{
650 apq8064_mdp_writeback(apq8064_reserve_table);
651}
652
Laura Abbott93a4a352012-05-25 09:26:35 -0700653static void __init reserve_cache_dump_memory(void)
654{
655#ifdef CONFIG_MSM_CACHE_DUMP
656 unsigned int total;
657
658 total = apq8064_cache_dump_pdata.l1_size +
659 apq8064_cache_dump_pdata.l2_size;
660 apq8064_reserve_table[MEMTYPE_EBI1].size += total;
661#endif
662}
663
Abhijeet Dharmapurikar3edb5de2012-09-13 11:02:03 -0700664static void __init reserve_mpdcvs_memory(void)
665{
666 apq8064_reserve_table[MEMTYPE_EBI1].size += SZ_32K;
667}
668
Kevin Chan13be4e22011-10-20 11:30:32 -0700669static void __init apq8064_calculate_reserve_sizes(void)
670{
671 size_pmem_devices();
672 reserve_pmem_memory();
Olav Haugan7c6aa742012-01-16 16:47:37 -0800673 reserve_ion_memory();
Huaibin Yang4a084e32011-12-15 15:25:52 -0800674 reserve_mdp_memory();
Laura Abbott350c8362012-02-28 14:46:52 -0800675 reserve_rtb_memory();
Laura Abbott93a4a352012-05-25 09:26:35 -0700676 reserve_cache_dump_memory();
Abhijeet Dharmapurikar3edb5de2012-09-13 11:02:03 -0700677 reserve_mpdcvs_memory();
Kevin Chan13be4e22011-10-20 11:30:32 -0700678}
679
680static struct reserve_info apq8064_reserve_info __initdata = {
681 .memtype_reserve_table = apq8064_reserve_table,
682 .calculate_reserve_sizes = apq8064_calculate_reserve_sizes,
Larry Bassel67b921d2012-04-06 10:23:27 -0700683 .reserve_fixed_area = apq8064_reserve_fixed_area,
Kevin Chan13be4e22011-10-20 11:30:32 -0700684 .paddr_to_memtype = apq8064_paddr_to_memtype,
685};
686
687static int apq8064_memory_bank_size(void)
688{
689 return 1<<29;
690}
691
692static void __init locate_unstable_memory(void)
693{
694 struct membank *mb = &meminfo.bank[meminfo.nr_banks - 1];
695 unsigned long bank_size;
696 unsigned long low, high;
697
698 bank_size = apq8064_memory_bank_size();
699 low = meminfo.bank[0].start;
700 high = mb->start + mb->size;
Olav Haugand76e3a82012-01-16 16:55:07 -0800701
702 /* Check if 32 bit overflow occured */
703 if (high < mb->start)
Larry Bassel67b921d2012-04-06 10:23:27 -0700704 high = -PAGE_SIZE;
Olav Haugand76e3a82012-01-16 16:55:07 -0800705
Kevin Chan13be4e22011-10-20 11:30:32 -0700706 low &= ~(bank_size - 1);
707
708 if (high - low <= bank_size)
Larry Bassel67b921d2012-04-06 10:23:27 -0700709 goto no_dmm;
710
711#ifdef CONFIG_ENABLE_DMM
Jack Cheung46bfffa2012-01-19 15:26:24 -0800712 apq8064_reserve_info.low_unstable_address = mb->start -
713 MIN_MEMORY_BLOCK_SIZE + mb->size;
714 apq8064_reserve_info.max_unstable_size = MIN_MEMORY_BLOCK_SIZE;
715
Kevin Chan13be4e22011-10-20 11:30:32 -0700716 apq8064_reserve_info.bank_size = bank_size;
717 pr_info("low unstable address %lx max size %lx bank size %lx\n",
718 apq8064_reserve_info.low_unstable_address,
719 apq8064_reserve_info.max_unstable_size,
720 apq8064_reserve_info.bank_size);
Larry Bassel67b921d2012-04-06 10:23:27 -0700721 return;
722#endif
723no_dmm:
724 apq8064_reserve_info.low_unstable_address = high;
725 apq8064_reserve_info.max_unstable_size = 0;
Kevin Chan13be4e22011-10-20 11:30:32 -0700726}
727
Hanumant Singh50440d42012-04-23 19:27:16 -0700728static int apq8064_change_memory_power(u64 start, u64 size,
729 int change_type)
730{
731 return soc_change_memory_power(start, size, change_type);
732}
733
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -0700734static char prim_panel_name[PANEL_NAME_MAX_LEN];
735static char ext_panel_name[PANEL_NAME_MAX_LEN];
Ajay Singh Parmar6b82d2b2012-07-19 17:23:26 +0530736
737static int ext_resolution;
738
Aravind Venkateswaran8ac7f412012-03-16 17:57:30 -0700739static int __init prim_display_setup(char *param)
740{
741 if (strnlen(param, PANEL_NAME_MAX_LEN))
742 strlcpy(prim_panel_name, param, PANEL_NAME_MAX_LEN);
743 return 0;
744}
745early_param("prim_display", prim_display_setup);
746
747static int __init ext_display_setup(char *param)
748{
749 if (strnlen(param, PANEL_NAME_MAX_LEN))
750 strlcpy(ext_panel_name, param, PANEL_NAME_MAX_LEN);
751 return 0;
752}
753early_param("ext_display", ext_display_setup);
754
Ajay Singh Parmar6b82d2b2012-07-19 17:23:26 +0530755static int __init hdmi_resulution_setup(char *param)
756{
757 int ret;
758 ret = kstrtoint(param, 10, &ext_resolution);
759 return ret;
760}
761early_param("ext_resolution", hdmi_resulution_setup);
762
Kevin Chan13be4e22011-10-20 11:30:32 -0700763static void __init apq8064_reserve(void)
764{
Ajay Singh Parmar6b82d2b2012-07-19 17:23:26 +0530765 apq8064_set_display_params(prim_panel_name, ext_panel_name,
766 ext_resolution);
Kevin Chan13be4e22011-10-20 11:30:32 -0700767 msm_reserve();
768}
769
Laura Abbott6988cef2012-03-15 14:27:13 -0700770static void __init place_movable_zone(void)
771{
Larry Bassel67b921d2012-04-06 10:23:27 -0700772#ifdef CONFIG_ENABLE_DMM
Laura Abbott6988cef2012-03-15 14:27:13 -0700773 movable_reserved_start = apq8064_reserve_info.low_unstable_address;
774 movable_reserved_size = apq8064_reserve_info.max_unstable_size;
775 pr_info("movable zone start %lx size %lx\n",
776 movable_reserved_start, movable_reserved_size);
Larry Bassel67b921d2012-04-06 10:23:27 -0700777#endif
Laura Abbott6988cef2012-03-15 14:27:13 -0700778}
779
780static void __init apq8064_early_reserve(void)
781{
782 reserve_info = &apq8064_reserve_info;
783 locate_unstable_memory();
784 place_movable_zone();
785
786}
Hemant Kumara945b472012-01-25 15:08:06 -0800787#ifdef CONFIG_USB_EHCI_MSM_HSIC
Hemant Kumare6275972012-02-29 20:06:21 -0800788/* Bandwidth requests (zero) if no vote placed */
789static struct msm_bus_vectors hsic_init_vectors[] = {
790 {
791 .src = MSM_BUS_MASTER_SPS,
Hemant Kumare6275972012-02-29 20:06:21 -0800792 .dst = MSM_BUS_SLAVE_SPS,
793 .ab = 0,
794 .ib = 0,
795 },
796};
797
798/* Bus bandwidth requests in Bytes/sec */
799static struct msm_bus_vectors hsic_max_vectors[] = {
800 {
801 .src = MSM_BUS_MASTER_SPS,
Hemant Kumare6275972012-02-29 20:06:21 -0800802 .dst = MSM_BUS_SLAVE_SPS,
803 .ab = 0,
Hemant Kumar266d9d52012-10-17 13:48:10 -0700804 .ib = 256000000, /*vote for 32Mhz dfab clk rate*/
Hemant Kumare6275972012-02-29 20:06:21 -0800805 },
806};
807
808static struct msm_bus_paths hsic_bus_scale_usecases[] = {
809 {
810 ARRAY_SIZE(hsic_init_vectors),
811 hsic_init_vectors,
812 },
813 {
814 ARRAY_SIZE(hsic_max_vectors),
815 hsic_max_vectors,
816 },
817};
818
819static struct msm_bus_scale_pdata hsic_bus_scale_pdata = {
820 hsic_bus_scale_usecases,
821 ARRAY_SIZE(hsic_bus_scale_usecases),
822 .name = "hsic",
823};
824
Hemant Kumara945b472012-01-25 15:08:06 -0800825static struct msm_hsic_host_platform_data msm_hsic_pdata = {
Hemant Kumare6275972012-02-29 20:06:21 -0800826 .strobe = 88,
827 .data = 89,
828 .bus_scale_table = &hsic_bus_scale_pdata,
Hemant Kumara945b472012-01-25 15:08:06 -0800829};
830#else
831static struct msm_hsic_host_platform_data msm_hsic_pdata;
832#endif
833
Hemant Kumarcb7d8a12012-01-25 12:25:55 -0800834#define PID_MAGIC_ID 0x71432909
835#define SERIAL_NUM_MAGIC_ID 0x61945374
836#define SERIAL_NUMBER_LENGTH 127
837#define DLOAD_USB_BASE_ADD 0x2A03F0C8
838
839struct magic_num_struct {
840 uint32_t pid;
841 uint32_t serial_num;
842};
843
844struct dload_struct {
845 uint32_t reserved1;
846 uint32_t reserved2;
847 uint32_t reserved3;
848 uint16_t reserved4;
849 uint16_t pid;
850 char serial_number[SERIAL_NUMBER_LENGTH];
851 uint16_t reserved5;
852 struct magic_num_struct magic_struct;
853};
854
855static int usb_diag_update_pid_and_serial_num(uint32_t pid, const char *snum)
856{
857 struct dload_struct __iomem *dload = 0;
858
859 dload = ioremap(DLOAD_USB_BASE_ADD, sizeof(*dload));
860 if (!dload) {
861 pr_err("%s: cannot remap I/O memory region: %08x\n",
862 __func__, DLOAD_USB_BASE_ADD);
863 return -ENXIO;
864 }
865
866 pr_debug("%s: dload:%p pid:%x serial_num:%s\n",
867 __func__, dload, pid, snum);
868 /* update pid */
869 dload->magic_struct.pid = PID_MAGIC_ID;
870 dload->pid = pid;
871
872 /* update serial number */
873 dload->magic_struct.serial_num = 0;
874 if (!snum) {
875 memset(dload->serial_number, 0, SERIAL_NUMBER_LENGTH);
876 goto out;
877 }
878
879 dload->magic_struct.serial_num = SERIAL_NUM_MAGIC_ID;
880 strlcpy(dload->serial_number, snum, SERIAL_NUMBER_LENGTH);
881out:
882 iounmap(dload);
883 return 0;
884}
885
886static struct android_usb_platform_data android_usb_pdata = {
887 .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num,
888};
889
Hemant Kumar4933b072011-10-17 23:43:11 -0700890static struct platform_device android_usb_device = {
Hemant Kumarcb7d8a12012-01-25 12:25:55 -0800891 .name = "android_usb",
892 .id = -1,
893 .dev = {
894 .platform_data = &android_usb_pdata,
895 },
Hemant Kumar4933b072011-10-17 23:43:11 -0700896};
897
Hemant Kumar7620eed2012-02-26 09:08:43 -0800898/* Bandwidth requests (zero) if no vote placed */
899static struct msm_bus_vectors usb_init_vectors[] = {
900 {
901 .src = MSM_BUS_MASTER_SPS,
902 .dst = MSM_BUS_SLAVE_EBI_CH0,
903 .ab = 0,
904 .ib = 0,
905 },
906};
907
908/* Bus bandwidth requests in Bytes/sec */
909static struct msm_bus_vectors usb_max_vectors[] = {
910 {
911 .src = MSM_BUS_MASTER_SPS,
912 .dst = MSM_BUS_SLAVE_EBI_CH0,
913 .ab = 60000000, /* At least 480Mbps on bus. */
914 .ib = 960000000, /* MAX bursts rate */
915 },
916};
917
918static struct msm_bus_paths usb_bus_scale_usecases[] = {
919 {
920 ARRAY_SIZE(usb_init_vectors),
921 usb_init_vectors,
922 },
923 {
924 ARRAY_SIZE(usb_max_vectors),
925 usb_max_vectors,
926 },
927};
928
929static struct msm_bus_scale_pdata usb_bus_scale_pdata = {
930 usb_bus_scale_usecases,
931 ARRAY_SIZE(usb_bus_scale_usecases),
932 .name = "usb",
933};
934
Vamsi Krishna1f8704c2012-03-29 18:24:24 -0700935static int phy_init_seq[] = {
936 0x38, 0x81, /* update DC voltage level */
937 0x24, 0x82, /* set pre-emphasis and rise/fall time */
938 -1
939};
940
Vijayavardhan Vennapusa4fa13692012-08-02 14:35:03 +0530941#define PMIC_GPIO_DP 27 /* PMIC GPIO for D+ change */
942#define PMIC_GPIO_DP_IRQ PM8921_GPIO_IRQ(PM8921_IRQ_BASE, PMIC_GPIO_DP)
Jack Pham87f202f2012-08-06 00:24:22 -0700943#define MSM_MPM_PIN_USB1_OTGSESSVLD 40
944
Hemant Kumar4933b072011-10-17 23:43:11 -0700945static struct msm_otg_platform_data msm_otg_pdata = {
Hemant Kumard86c4882012-01-24 19:39:37 -0800946 .mode = USB_OTG,
947 .otg_control = OTG_PMIC_CONTROL,
Hemant Kumar4933b072011-10-17 23:43:11 -0700948 .phy_type = SNPS_28NM_INTEGRATED_PHY,
Hemant Kumard86c4882012-01-24 19:39:37 -0800949 .pmic_id_irq = PM8921_USB_ID_IN_IRQ(PM8921_IRQ_BASE),
950 .power_budget = 750,
Hemant Kumar7620eed2012-02-26 09:08:43 -0800951 .bus_scale_table = &usb_bus_scale_pdata,
Vamsi Krishna1f8704c2012-03-29 18:24:24 -0700952 .phy_init_seq = phy_init_seq,
Jack Pham87f202f2012-08-06 00:24:22 -0700953 .mpm_otgsessvld_int = MSM_MPM_PIN_USB1_OTGSESSVLD,
Hemant Kumar4933b072011-10-17 23:43:11 -0700954};
955
Hemant Kumar1d66e1c2012-02-13 15:24:59 -0800956static struct msm_usb_host_platform_data msm_ehci_host_pdata3 = {
Manu Gautam91223e02011-11-08 15:27:22 +0530957 .power_budget = 500,
958};
959
Hemant Kumar1d66e1c2012-02-13 15:24:59 -0800960#ifdef CONFIG_USB_EHCI_MSM_HOST4
961static struct msm_usb_host_platform_data msm_ehci_host_pdata4;
962#endif
963
Manu Gautam91223e02011-11-08 15:27:22 +0530964static void __init apq8064_ehci_host_init(void)
965{
Chiranjeevi Velempatib822fa32012-05-23 22:05:59 +0530966 if (machine_is_apq8064_liquid() || machine_is_mpq8064_cdp() ||
967 machine_is_mpq8064_hrd() || machine_is_mpq8064_dtv()) {
968 if (machine_is_apq8064_liquid())
969 msm_ehci_host_pdata3.dock_connect_irq =
970 PM8921_MPP_IRQ(PM8921_IRQ_BASE, 9);
Vijayavardhan Vennapusa4fa13692012-08-02 14:35:03 +0530971 else
972 msm_ehci_host_pdata3.pmic_gpio_dp_irq =
973 PMIC_GPIO_DP_IRQ;
Hemant Kumar56925352012-02-13 16:59:52 -0800974
Manu Gautam91223e02011-11-08 15:27:22 +0530975 apq8064_device_ehci_host3.dev.platform_data =
Hemant Kumar1d66e1c2012-02-13 15:24:59 -0800976 &msm_ehci_host_pdata3;
Manu Gautam91223e02011-11-08 15:27:22 +0530977 platform_device_register(&apq8064_device_ehci_host3);
Hemant Kumar1d66e1c2012-02-13 15:24:59 -0800978
979#ifdef CONFIG_USB_EHCI_MSM_HOST4
980 apq8064_device_ehci_host4.dev.platform_data =
981 &msm_ehci_host_pdata4;
982 platform_device_register(&apq8064_device_ehci_host4);
983#endif
Manu Gautam91223e02011-11-08 15:27:22 +0530984 }
985}
986
David Keitel2f613d92012-02-15 11:29:16 -0800987static struct smb349_platform_data smb349_data __initdata = {
988 .en_n_gpio = PM8921_GPIO_PM_TO_SYS(37),
989 .chg_susp_gpio = PM8921_GPIO_PM_TO_SYS(30),
990 .chg_current_ma = 2200,
991};
992
993static struct i2c_board_info smb349_charger_i2c_info[] __initdata = {
994 {
995 I2C_BOARD_INFO(SMB349_NAME, 0x1B),
996 .platform_data = &smb349_data,
997 },
998};
999
Siddartha Mohanadossb9df4942012-02-08 09:58:21 -08001000struct sx150x_platform_data apq8064_sx150x_data[] = {
1001 [SX150X_EPM] = {
1002 .gpio_base = GPIO_EPM_EXPANDER_BASE,
1003 .oscio_is_gpo = false,
1004 .io_pullup_ena = 0x0,
1005 .io_pulldn_ena = 0x0,
1006 .io_open_drain_ena = 0x0,
1007 .io_polarity = 0,
1008 .irq_summary = -1,
1009 },
1010};
1011
1012static struct epm_chan_properties ads_adc_channel_data[] = {
Yan Hec942e402012-08-31 11:14:58 -07001013 {10, 100}, {1000, 1}, {10, 100}, {1000, 1},
1014 {10, 100}, {1000, 1}, {10, 100}, {1000, 1},
1015 {10, 100}, {20, 100}, {500, 100}, {5, 100},
1016 {1000, 1}, {200, 100}, {50, 100}, {10, 100},
1017 {510, 100}, {50, 100}, {20, 100}, {100, 100},
1018 {510, 100}, {20, 100}, {50, 100}, {200, 100},
1019 {10, 100}, {20, 100}, {1000, 1}, {10, 100},
1020 {200, 100}, {510, 100}, {1000, 100}, {200, 100},
Siddartha Mohanadossb9df4942012-02-08 09:58:21 -08001021};
1022
1023static struct epm_adc_platform_data epm_adc_pdata = {
1024 .channel = ads_adc_channel_data,
1025 .bus_id = 0x0,
1026 .epm_i2c_board_info = {
1027 .type = "sx1509q",
1028 .addr = 0x3e,
1029 .platform_data = &apq8064_sx150x_data[SX150X_EPM],
1030 },
1031 .gpio_expander_base_addr = GPIO_EPM_EXPANDER_BASE,
1032};
1033
1034static struct platform_device epm_adc_device = {
1035 .name = "epm_adc",
1036 .id = -1,
1037 .dev = {
1038 .platform_data = &epm_adc_pdata,
1039 },
1040};
1041
1042static void __init apq8064_epm_adc_init(void)
1043{
1044 epm_adc_pdata.num_channels = 32;
1045 epm_adc_pdata.num_adc = 2;
1046 epm_adc_pdata.chan_per_adc = 16;
1047 epm_adc_pdata.chan_per_mux = 8;
1048};
1049
Swaminathan Sathappan2f51a752011-12-05 12:51:19 -08001050/* Micbias setting is based on 8660 CDP/MTP/FLUID requirement
1051 * 4 micbiases are used to power various analog and digital
1052 * microphones operating at 1800 mV. Technically, all micbiases
1053 * can source from single cfilter since all microphones operate
1054 * at the same voltage level. The arrangement below is to make
1055 * sure all cfilters are exercised. LDO_H regulator ouput level
1056 * does not need to be as high as 2.85V. It is choosen for
1057 * microphone sensitivity purpose.
1058 */
Asish Bhattacharyab1aeae22012-02-15 08:29:28 +05301059static struct wcd9xxx_pdata apq8064_tabla_platform_data = {
Swaminathan Sathappan2f51a752011-12-05 12:51:19 -08001060 .slimbus_slave_device = {
1061 .name = "tabla-slave",
1062 .e_addr = {0, 0, 0x10, 0, 0x17, 2},
1063 },
Swaminathan Sathappancef966d2011-12-15 17:27:04 -08001064 .irq = MSM_GPIO_TO_INT(42),
Swaminathan Sathappan2f51a752011-12-05 12:51:19 -08001065 .irq_base = TABLA_INTERRUPT_BASE,
Asish Bhattacharyab1aeae22012-02-15 08:29:28 +05301066 .num_irqs = NR_WCD9XXX_IRQS,
Swaminathan Sathappan2f51a752011-12-05 12:51:19 -08001067 .reset_gpio = PM8921_GPIO_PM_TO_SYS(34),
1068 .micbias = {
1069 .ldoh_v = TABLA_LDOH_2P85_V,
1070 .cfilt1_mv = 1800,
Bhalchandra Gajare975c53a2012-08-10 12:16:49 -07001071 .cfilt2_mv = 2700,
Swaminathan Sathappan2f51a752011-12-05 12:51:19 -08001072 .cfilt3_mv = 1800,
1073 .bias1_cfilt_sel = TABLA_CFILT1_SEL,
1074 .bias2_cfilt_sel = TABLA_CFILT2_SEL,
1075 .bias3_cfilt_sel = TABLA_CFILT3_SEL,
1076 .bias4_cfilt_sel = TABLA_CFILT3_SEL,
Asish Bhattacharyab1aeae22012-02-15 08:29:28 +05301077 },
1078 .regulator = {
1079 {
1080 .name = "CDC_VDD_CP",
1081 .min_uV = 1800000,
1082 .max_uV = 1800000,
1083 .optimum_uA = WCD9XXX_CDC_VDDA_CP_CUR_MAX,
1084 },
1085 {
1086 .name = "CDC_VDDA_RX",
1087 .min_uV = 1800000,
1088 .max_uV = 1800000,
1089 .optimum_uA = WCD9XXX_CDC_VDDA_RX_CUR_MAX,
1090 },
1091 {
1092 .name = "CDC_VDDA_TX",
1093 .min_uV = 1800000,
1094 .max_uV = 1800000,
1095 .optimum_uA = WCD9XXX_CDC_VDDA_TX_CUR_MAX,
1096 },
1097 {
1098 .name = "VDDIO_CDC",
1099 .min_uV = 1800000,
1100 .max_uV = 1800000,
1101 .optimum_uA = WCD9XXX_VDDIO_CDC_CUR_MAX,
1102 },
1103 {
1104 .name = "VDDD_CDC_D",
1105 .min_uV = 1225000,
David Collins62debe82012-06-06 17:01:03 -07001106 .max_uV = 1250000,
Asish Bhattacharyab1aeae22012-02-15 08:29:28 +05301107 .optimum_uA = WCD9XXX_VDDD_CDC_D_CUR_MAX,
1108 },
1109 {
1110 .name = "CDC_VDDA_A_1P2V",
1111 .min_uV = 1225000,
David Collins62debe82012-06-06 17:01:03 -07001112 .max_uV = 1250000,
Asish Bhattacharyab1aeae22012-02-15 08:29:28 +05301113 .optimum_uA = WCD9XXX_VDDD_CDC_A_CUR_MAX,
1114 },
1115 },
Swaminathan Sathappan2f51a752011-12-05 12:51:19 -08001116};
1117
1118static struct slim_device apq8064_slim_tabla = {
1119 .name = "tabla-slim",
1120 .e_addr = {0, 1, 0x10, 0, 0x17, 2},
1121 .dev = {
1122 .platform_data = &apq8064_tabla_platform_data,
1123 },
1124};
1125
Asish Bhattacharyab1aeae22012-02-15 08:29:28 +05301126static struct wcd9xxx_pdata apq8064_tabla20_platform_data = {
Swaminathan Sathappancef966d2011-12-15 17:27:04 -08001127 .slimbus_slave_device = {
1128 .name = "tabla-slave",
1129 .e_addr = {0, 0, 0x60, 0, 0x17, 2},
1130 },
1131 .irq = MSM_GPIO_TO_INT(42),
1132 .irq_base = TABLA_INTERRUPT_BASE,
Asish Bhattacharyab1aeae22012-02-15 08:29:28 +05301133 .num_irqs = NR_WCD9XXX_IRQS,
Swaminathan Sathappancef966d2011-12-15 17:27:04 -08001134 .reset_gpio = PM8921_GPIO_PM_TO_SYS(34),
1135 .micbias = {
1136 .ldoh_v = TABLA_LDOH_2P85_V,
1137 .cfilt1_mv = 1800,
Bhalchandra Gajare975c53a2012-08-10 12:16:49 -07001138 .cfilt2_mv = 2700,
Swaminathan Sathappancef966d2011-12-15 17:27:04 -08001139 .cfilt3_mv = 1800,
1140 .bias1_cfilt_sel = TABLA_CFILT1_SEL,
1141 .bias2_cfilt_sel = TABLA_CFILT2_SEL,
1142 .bias3_cfilt_sel = TABLA_CFILT3_SEL,
1143 .bias4_cfilt_sel = TABLA_CFILT3_SEL,
Asish Bhattacharyab1aeae22012-02-15 08:29:28 +05301144 },
1145 .regulator = {
1146 {
1147 .name = "CDC_VDD_CP",
1148 .min_uV = 1800000,
1149 .max_uV = 1800000,
1150 .optimum_uA = WCD9XXX_CDC_VDDA_CP_CUR_MAX,
1151 },
1152 {
1153 .name = "CDC_VDDA_RX",
1154 .min_uV = 1800000,
1155 .max_uV = 1800000,
1156 .optimum_uA = WCD9XXX_CDC_VDDA_RX_CUR_MAX,
1157 },
1158 {
1159 .name = "CDC_VDDA_TX",
1160 .min_uV = 1800000,
1161 .max_uV = 1800000,
1162 .optimum_uA = WCD9XXX_CDC_VDDA_TX_CUR_MAX,
1163 },
1164 {
1165 .name = "VDDIO_CDC",
1166 .min_uV = 1800000,
1167 .max_uV = 1800000,
1168 .optimum_uA = WCD9XXX_VDDIO_CDC_CUR_MAX,
1169 },
1170 {
1171 .name = "VDDD_CDC_D",
1172 .min_uV = 1225000,
David Collins62debe82012-06-06 17:01:03 -07001173 .max_uV = 1250000,
Asish Bhattacharyab1aeae22012-02-15 08:29:28 +05301174 .optimum_uA = WCD9XXX_VDDD_CDC_D_CUR_MAX,
1175 },
1176 {
1177 .name = "CDC_VDDA_A_1P2V",
1178 .min_uV = 1225000,
David Collins62debe82012-06-06 17:01:03 -07001179 .max_uV = 1250000,
Asish Bhattacharyab1aeae22012-02-15 08:29:28 +05301180 .optimum_uA = WCD9XXX_VDDD_CDC_A_CUR_MAX,
1181 },
1182 },
Swaminathan Sathappancef966d2011-12-15 17:27:04 -08001183};
1184
1185static struct slim_device apq8064_slim_tabla20 = {
1186 .name = "tabla2x-slim",
1187 .e_addr = {0, 1, 0x60, 0, 0x17, 2},
1188 .dev = {
1189 .platform_data = &apq8064_tabla20_platform_data,
1190 },
1191};
1192
Santosh Mardi695be0d2012-04-10 23:21:12 +05301193/* enable the level shifter for cs8427 to make sure the I2C
1194 * clock is running at 100KHz and voltage levels are at 3.3
1195 * and 5 volts
1196 */
1197static int enable_100KHz_ls(int enable)
1198{
1199 int ret = 0;
1200 if (enable) {
1201 ret = gpio_request(SX150X_GPIO(1, 10),
1202 "cs8427_100KHZ_ENABLE");
1203 if (ret) {
1204 pr_err("%s: Failed to request gpio %d\n", __func__,
1205 SX150X_GPIO(1, 10));
1206 return ret;
1207 }
1208 gpio_direction_output(SX150X_GPIO(1, 10), 1);
Santosh Mardid706fcf2012-08-31 19:26:54 +05301209 } else {
1210 gpio_direction_output(SX150X_GPIO(1, 10), 0);
Santosh Mardi695be0d2012-04-10 23:21:12 +05301211 gpio_free(SX150X_GPIO(1, 10));
Santosh Mardid706fcf2012-08-31 19:26:54 +05301212 }
Santosh Mardi695be0d2012-04-10 23:21:12 +05301213 return ret;
1214}
1215
Santosh Mardieff9a742012-04-09 23:23:39 +05301216static struct cs8427_platform_data cs8427_i2c_platform_data = {
1217 .irq = SX150X_GPIO(1, 4),
1218 .reset_gpio = SX150X_GPIO(1, 6),
Santosh Mardi695be0d2012-04-10 23:21:12 +05301219 .enable = enable_100KHz_ls,
Santosh Mardieff9a742012-04-09 23:23:39 +05301220};
1221
1222static struct i2c_board_info cs8427_device_info[] __initdata = {
1223 {
1224 I2C_BOARD_INFO("cs8427", CS8427_ADDR4),
1225 .platform_data = &cs8427_i2c_platform_data,
1226 },
1227};
1228
Amy Maloche70090f992012-02-16 16:35:26 -08001229#define HAP_SHIFT_LVL_OE_GPIO PM8921_MPP_PM_TO_SYS(8)
1230#define ISA1200_HAP_EN_GPIO PM8921_GPIO_PM_TO_SYS(33)
1231#define ISA1200_HAP_LEN_GPIO PM8921_GPIO_PM_TO_SYS(20)
David Collins6f7c3472012-08-22 13:18:06 -07001232#define ISA1200_HAP_CLK_PM8921 PM8921_GPIO_PM_TO_SYS(44)
1233#define ISA1200_HAP_CLK_PM8917 PM8921_GPIO_PM_TO_SYS(38)
Amy Maloche70090f992012-02-16 16:35:26 -08001234
Mohan Pallaka2d877602012-05-11 13:07:30 +05301235static int isa1200_clk_enable(bool on)
Amy Maloche70090f992012-02-16 16:35:26 -08001236{
David Collins6f7c3472012-08-22 13:18:06 -07001237 unsigned int gpio = ISA1200_HAP_CLK_PM8921;
Amy Maloche8f973892012-03-26 14:53:13 -07001238 int rc = 0;
1239
David Collins6f7c3472012-08-22 13:18:06 -07001240 if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917)
1241 gpio = ISA1200_HAP_CLK_PM8917;
1242
1243 gpio_set_value_cansleep(gpio, on);
Amy Maloche70090f992012-02-16 16:35:26 -08001244
Mohan Pallaka2d877602012-05-11 13:07:30 +05301245 if (on) {
Amy Maloche8f973892012-03-26 14:53:13 -07001246 rc = pm8xxx_aux_clk_control(CLK_MP3_2, XO_DIV_1, true);
Mohan Pallaka2d877602012-05-11 13:07:30 +05301247 if (rc) {
1248 pr_err("%s: unable to write aux clock register(%d)\n",
1249 __func__, rc);
1250 goto err_gpio_dis;
1251 }
1252 } else {
Amy Maloche8f973892012-03-26 14:53:13 -07001253 rc = pm8xxx_aux_clk_control(CLK_MP3_2, XO_DIV_NONE, true);
Mohan Pallaka2d877602012-05-11 13:07:30 +05301254 if (rc)
1255 pr_err("%s: unable to write aux clock register(%d)\n",
1256 __func__, rc);
Amy Maloche8f973892012-03-26 14:53:13 -07001257 }
1258
1259 return rc;
Mohan Pallaka2d877602012-05-11 13:07:30 +05301260
1261err_gpio_dis:
David Collins6f7c3472012-08-22 13:18:06 -07001262 gpio_set_value_cansleep(gpio, !on);
Mohan Pallaka2d877602012-05-11 13:07:30 +05301263 return rc;
Amy Maloche70090f992012-02-16 16:35:26 -08001264}
1265
1266static int isa1200_dev_setup(bool enable)
1267{
David Collins6f7c3472012-08-22 13:18:06 -07001268 unsigned int gpio = ISA1200_HAP_CLK_PM8921;
Amy Maloche70090f992012-02-16 16:35:26 -08001269 int rc = 0;
1270
David Collins6f7c3472012-08-22 13:18:06 -07001271 if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917)
1272 gpio = ISA1200_HAP_CLK_PM8917;
1273
Amy Maloche70090f992012-02-16 16:35:26 -08001274 if (!enable)
1275 goto free_gpio;
1276
David Collins6f7c3472012-08-22 13:18:06 -07001277 rc = gpio_request(gpio, "haptics_clk");
Amy Maloche70090f992012-02-16 16:35:26 -08001278 if (rc) {
1279 pr_err("%s: unable to request gpio %d config(%d)\n",
David Collins6f7c3472012-08-22 13:18:06 -07001280 __func__, gpio, rc);
Amy Maloche70090f992012-02-16 16:35:26 -08001281 return rc;
1282 }
1283
David Collins6f7c3472012-08-22 13:18:06 -07001284 rc = gpio_direction_output(gpio, 0);
Amy Maloche70090f992012-02-16 16:35:26 -08001285 if (rc) {
1286 pr_err("%s: unable to set direction\n", __func__);
1287 goto free_gpio;
1288 }
1289
1290 return 0;
1291
1292free_gpio:
David Collins6f7c3472012-08-22 13:18:06 -07001293 gpio_free(gpio);
Amy Maloche70090f992012-02-16 16:35:26 -08001294 return rc;
1295}
1296
1297static struct isa1200_regulator isa1200_reg_data[] = {
1298 {
1299 .name = "vddp",
1300 .min_uV = ISA_I2C_VTG_MIN_UV,
1301 .max_uV = ISA_I2C_VTG_MAX_UV,
1302 .load_uA = ISA_I2C_CURR_UA,
1303 },
1304};
1305
1306static struct isa1200_platform_data isa1200_1_pdata = {
1307 .name = "vibrator",
1308 .dev_setup = isa1200_dev_setup,
Mohan Pallaka2d877602012-05-11 13:07:30 +05301309 .clk_enable = isa1200_clk_enable,
Mohan Pallaka32f20a72012-06-14 14:41:11 +05301310 .need_pwm_clk = true,
Amy Maloche70090f992012-02-16 16:35:26 -08001311 .hap_en_gpio = ISA1200_HAP_EN_GPIO,
1312 .hap_len_gpio = ISA1200_HAP_LEN_GPIO,
1313 .max_timeout = 15000,
1314 .mode_ctrl = PWM_GEN_MODE,
1315 .pwm_fd = {
1316 .pwm_div = 256,
1317 },
1318 .is_erm = false,
1319 .smart_en = true,
1320 .ext_clk_en = true,
1321 .chip_en = 1,
1322 .regulator_info = isa1200_reg_data,
1323 .num_regulators = ARRAY_SIZE(isa1200_reg_data),
1324};
1325
1326static struct i2c_board_info isa1200_board_info[] __initdata = {
1327 {
1328 I2C_BOARD_INFO("isa1200_1", 0x90>>1),
1329 .platform_data = &isa1200_1_pdata,
1330 },
1331};
Jing Lin21ed4de2012-02-05 15:53:28 -08001332/* configuration data for mxt1386e using V2.1 firmware */
1333static const u8 mxt1386e_config_data_v2_1[] = {
1334 /* T6 Object */
1335 0, 0, 0, 0, 0, 0,
1336 /* T38 Object */
Jing Line4c47042012-08-31 10:54:44 -07001337 14, 3, 0, 5, 7, 12, 0, 0, 0, 0,
Jing Lin21ed4de2012-02-05 15:53:28 -08001338 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1339 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1340 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1341 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1342 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1343 0, 0, 0, 0,
1344 /* T7 Object */
Jing Line4c47042012-08-31 10:54:44 -07001345 32, 10, 50,
Jing Lin21ed4de2012-02-05 15:53:28 -08001346 /* T8 Object */
Jing Linf1208fd2012-02-23 11:15:42 -08001347 25, 0, 20, 20, 0, 0, 0, 0, 0, 0,
Jing Lin21ed4de2012-02-05 15:53:28 -08001348 /* T9 Object */
Jing Lin943fcec2012-05-25 13:58:57 -07001349 139, 0, 0, 26, 42, 0, 32, 80, 2, 5,
Jing Line4c47042012-08-31 10:54:44 -07001350 0, 5, 5, 79, 10, 30, 10, 10, 255, 2,
Jing Linf1208fd2012-02-23 11:15:42 -08001351 85, 5, 0, 5, 9, 5, 12, 35, 70, 40,
1352 20, 5, 0, 0, 0,
Jing Lin21ed4de2012-02-05 15:53:28 -08001353 /* T18 Object */
1354 0, 0,
1355 /* T24 Object */
1356 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1357 0, 0, 0, 0, 0, 0, 0, 0, 0,
1358 /* T25 Object */
Jing Lin943fcec2012-05-25 13:58:57 -07001359 1, 0, 60, 115, 156, 99,
Jing Lin21ed4de2012-02-05 15:53:28 -08001360 /* T27 Object */
1361 0, 0, 0, 0, 0, 0, 0,
1362 /* T40 Object */
1363 0, 0, 0, 0, 0,
1364 /* T42 Object */
Jing Lin943fcec2012-05-25 13:58:57 -07001365 0, 0, 255, 0, 255, 0, 0, 0, 0, 0,
Jing Lin21ed4de2012-02-05 15:53:28 -08001366 /* T43 Object */
1367 0, 0, 0, 0, 0, 0, 0, 64, 0, 8,
1368 16,
1369 /* T46 Object */
Jing Linf1208fd2012-02-23 11:15:42 -08001370 68, 0, 16, 16, 0, 0, 0, 0, 0,
Jing Lin21ed4de2012-02-05 15:53:28 -08001371 /* T47 Object */
1372 0, 0, 0, 0, 0, 0, 3, 64, 66, 0,
1373 /* T48 Object */
Jing Lin943fcec2012-05-25 13:58:57 -07001374 1, 64, 64, 0, 0, 0, 0, 0, 0, 0,
Jing Linf1208fd2012-02-23 11:15:42 -08001375 32, 40, 0, 10, 10, 0, 0, 100, 10, 90,
1376 0, 0, 0, 0, 0, 0, 0, 10, 1, 10,
1377 52, 10, 12, 0, 33, 0, 1, 0, 0, 0,
Jing Lin21ed4de2012-02-05 15:53:28 -08001378 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1379 0, 0, 0, 0,
1380 /* T56 Object */
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,
Jing Linf1208fd2012-02-23 11:15:42 -08001385 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1386 0,
Jing Lin21ed4de2012-02-05 15:53:28 -08001387};
1388
1389#define MXT_TS_GPIO_IRQ 6
1390#define MXT_TS_PWR_EN_GPIO PM8921_GPIO_PM_TO_SYS(23)
1391#define MXT_TS_RESET_GPIO 33
1392
1393static struct mxt_config_info mxt_config_array[] = {
1394 {
1395 .config = mxt1386e_config_data_v2_1,
1396 .config_length = ARRAY_SIZE(mxt1386e_config_data_v2_1),
1397 .family_id = 0xA0,
1398 .variant_id = 0x7,
1399 .version = 0x21,
1400 .build = 0xAA,
Jing Linef4aa9b2012-03-26 12:01:41 -07001401 .bootldr_id = MXT_BOOTLOADER_ID_1386E,
1402 .fw_name = "atmel_8064_liquid_v2_2_AA.hex",
1403 },
1404 {
1405 /* The config data for V2.2.AA is the same as for V2.1.AA */
1406 .config = mxt1386e_config_data_v2_1,
1407 .config_length = ARRAY_SIZE(mxt1386e_config_data_v2_1),
1408 .family_id = 0xA0,
1409 .variant_id = 0x7,
1410 .version = 0x22,
1411 .build = 0xAA,
1412 .bootldr_id = MXT_BOOTLOADER_ID_1386E,
Jing Lin21ed4de2012-02-05 15:53:28 -08001413 },
1414};
1415
1416static struct mxt_platform_data mxt_platform_data = {
1417 .config_array = mxt_config_array,
1418 .config_array_size = ARRAY_SIZE(mxt_config_array),
Mohan Pallaka56a1a5d2012-02-23 12:05:13 -08001419 .panel_minx = 0,
1420 .panel_maxx = 1365,
1421 .panel_miny = 0,
1422 .panel_maxy = 767,
1423 .disp_minx = 0,
1424 .disp_maxx = 1365,
1425 .disp_miny = 0,
1426 .disp_maxy = 767,
Anirudh Ghayal39dbe3f2012-04-13 15:43:16 +05301427 .irqflags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
Jing Lin21ed4de2012-02-05 15:53:28 -08001428 .i2c_pull_up = true,
1429 .reset_gpio = MXT_TS_RESET_GPIO,
1430 .irq_gpio = MXT_TS_GPIO_IRQ,
1431};
1432
1433static struct i2c_board_info mxt_device_info[] __initdata = {
1434 {
1435 I2C_BOARD_INFO("atmel_mxt_ts", 0x5b),
1436 .platform_data = &mxt_platform_data,
1437 .irq = MSM_GPIO_TO_INT(MXT_TS_GPIO_IRQ),
1438 },
1439};
Anirudh Ghayal2917a5a2012-02-05 19:51:07 -08001440#define CYTTSP_TS_GPIO_IRQ 6
Anirudh Ghayal2917a5a2012-02-05 19:51:07 -08001441#define CYTTSP_TS_GPIO_SLEEP 33
Amy Maloche609bb5e2012-08-03 09:41:42 -07001442#define CYTTSP_TS_GPIO_SLEEP_ALT 12
Anirudh Ghayal2917a5a2012-02-05 19:51:07 -08001443
1444static ssize_t tma340_vkeys_show(struct kobject *kobj,
1445 struct kobj_attribute *attr, char *buf)
1446{
1447 return snprintf(buf, 200,
1448 __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":73:1120:97:97"
1449 ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":230:1120:97:97"
1450 ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":389:1120:97:97"
1451 ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":544:1120:97:97"
1452 "\n");
1453}
1454
1455static struct kobj_attribute tma340_vkeys_attr = {
1456 .attr = {
1457 .mode = S_IRUGO,
1458 },
1459 .show = &tma340_vkeys_show,
1460};
1461
1462static struct attribute *tma340_properties_attrs[] = {
1463 &tma340_vkeys_attr.attr,
1464 NULL
1465};
1466
1467static struct attribute_group tma340_properties_attr_group = {
1468 .attrs = tma340_properties_attrs,
1469};
1470
1471static int cyttsp_platform_init(struct i2c_client *client)
1472{
1473 int rc = 0;
1474 static struct kobject *tma340_properties_kobj;
1475
1476 tma340_vkeys_attr.attr.name = "virtualkeys.cyttsp-i2c";
1477 tma340_properties_kobj = kobject_create_and_add("board_properties",
1478 NULL);
1479 if (tma340_properties_kobj)
1480 rc = sysfs_create_group(tma340_properties_kobj,
1481 &tma340_properties_attr_group);
1482 if (!tma340_properties_kobj || rc)
1483 pr_err("%s: failed to create board_properties\n",
1484 __func__);
1485
1486 return 0;
1487}
1488
1489static struct cyttsp_regulator cyttsp_regulator_data[] = {
1490 {
1491 .name = "vdd",
1492 .min_uV = CY_TMA300_VTG_MIN_UV,
1493 .max_uV = CY_TMA300_VTG_MAX_UV,
1494 .hpm_load_uA = CY_TMA300_CURR_24HZ_UA,
1495 .lpm_load_uA = CY_TMA300_CURR_24HZ_UA,
1496 },
1497 {
1498 .name = "vcc_i2c",
1499 .min_uV = CY_I2C_VTG_MIN_UV,
1500 .max_uV = CY_I2C_VTG_MAX_UV,
1501 .hpm_load_uA = CY_I2C_CURR_UA,
1502 .lpm_load_uA = CY_I2C_CURR_UA,
1503 },
1504};
1505
1506static struct cyttsp_platform_data cyttsp_pdata = {
1507 .panel_maxx = 634,
1508 .panel_maxy = 1166,
Amy Maloche684fcda2012-12-05 14:28:53 -08001509 .disp_minx = 18,
1510 .disp_maxx = 617,
1511 .disp_miny = 18,
1512 .disp_maxy = 1041,
Anirudh Ghayal2917a5a2012-02-05 19:51:07 -08001513 .flags = 0x01,
1514 .gen = CY_GEN3,
1515 .use_st = CY_USE_ST,
1516 .use_mt = CY_USE_MT,
1517 .use_hndshk = CY_SEND_HNDSHK,
1518 .use_trk_id = CY_USE_TRACKING_ID,
1519 .use_sleep = CY_USE_DEEP_SLEEP_SEL,
1520 .use_gestures = CY_USE_GESTURES,
1521 .fw_fname = "cyttsp_8064_mtp.hex",
1522 /* change act_intrvl to customize the Active power state
1523 * scanning/processing refresh interval for Operating mode
1524 */
1525 .act_intrvl = CY_ACT_INTRVL_DFLT,
1526 /* change tch_tmout to customize the touch timeout for the
1527 * Active power state for Operating mode
1528 */
1529 .tch_tmout = CY_TCH_TMOUT_DFLT,
1530 /* change lp_intrvl to customize the Low Power power state
1531 * scanning/processing refresh interval for Operating mode
1532 */
1533 .lp_intrvl = CY_LP_INTRVL_DFLT,
1534 .sleep_gpio = CYTTSP_TS_GPIO_SLEEP,
Amy Maloche9ba3ffe2012-04-26 10:31:20 -07001535 .resout_gpio = -1,
Anirudh Ghayal2917a5a2012-02-05 19:51:07 -08001536 .irq_gpio = CYTTSP_TS_GPIO_IRQ,
1537 .regulator_info = cyttsp_regulator_data,
1538 .num_regulators = ARRAY_SIZE(cyttsp_regulator_data),
1539 .init = cyttsp_platform_init,
1540 .correct_fw_ver = 17,
1541};
1542
1543static struct i2c_board_info cyttsp_info[] __initdata = {
1544 {
1545 I2C_BOARD_INFO(CY_I2C_NAME, 0x24),
1546 .platform_data = &cyttsp_pdata,
1547 .irq = MSM_GPIO_TO_INT(CYTTSP_TS_GPIO_IRQ),
1548 },
1549};
Jing Lin21ed4de2012-02-05 15:53:28 -08001550
Ankit Verma6b7e2ba2012-01-26 15:48:54 -08001551#define MSM_WCNSS_PHYS 0x03000000
1552#define MSM_WCNSS_SIZE 0x280000
1553
1554static struct resource resources_wcnss_wlan[] = {
1555 {
1556 .start = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ,
1557 .end = RIVA_APPS_WLAN_RX_DATA_AVAIL_IRQ,
1558 .name = "wcnss_wlanrx_irq",
1559 .flags = IORESOURCE_IRQ,
1560 },
1561 {
1562 .start = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ,
1563 .end = RIVA_APPS_WLAN_DATA_XFER_DONE_IRQ,
1564 .name = "wcnss_wlantx_irq",
1565 .flags = IORESOURCE_IRQ,
1566 },
1567 {
1568 .start = MSM_WCNSS_PHYS,
1569 .end = MSM_WCNSS_PHYS + MSM_WCNSS_SIZE - 1,
1570 .name = "wcnss_mmio",
1571 .flags = IORESOURCE_MEM,
1572 },
1573 {
1574 .start = 64,
1575 .end = 68,
1576 .name = "wcnss_gpios_5wire",
1577 .flags = IORESOURCE_IO,
1578 },
1579};
1580
1581static struct qcom_wcnss_opts qcom_wcnss_pdata = {
1582 .has_48mhz_xo = 1,
1583};
1584
1585static struct platform_device msm_device_wcnss_wlan = {
1586 .name = "wcnss_wlan",
1587 .id = 0,
1588 .num_resources = ARRAY_SIZE(resources_wcnss_wlan),
1589 .resource = resources_wcnss_wlan,
1590 .dev = {.platform_data = &qcom_wcnss_pdata},
1591};
1592
Ankit Vermab7c26e62012-02-28 15:04:15 -08001593static struct platform_device msm_device_iris_fm __devinitdata = {
1594 .name = "iris_fm",
1595 .id = -1,
1596};
1597
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07001598#ifdef CONFIG_QSEECOM
1599/* qseecom bus scaling */
1600static struct msm_bus_vectors qseecom_clks_init_vectors[] = {
1601 {
Ramesh Masavarapu037942d2012-09-04 11:52:57 -07001602 .src = MSM_BUS_MASTER_ADM_PORT0,
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07001603 .dst = MSM_BUS_SLAVE_EBI_CH0,
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07001604 .ab = 0,
Ramesh Masavarapu037942d2012-09-04 11:52:57 -07001605 .ib = 0,
1606 },
1607 {
1608 .src = MSM_BUS_MASTER_ADM_PORT1,
1609 .dst = MSM_BUS_SLAVE_GSBI1_UART,
1610 .ab = 0,
1611 .ib = 0,
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07001612 },
1613 {
1614 .src = MSM_BUS_MASTER_SPDM,
1615 .dst = MSM_BUS_SLAVE_SPDM,
1616 .ib = 0,
1617 .ab = 0,
1618 },
1619};
1620
1621static struct msm_bus_vectors qseecom_enable_dfab_vectors[] = {
1622 {
Ramesh Masavarapu037942d2012-09-04 11:52:57 -07001623 .src = MSM_BUS_MASTER_ADM_PORT0,
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07001624 .dst = MSM_BUS_SLAVE_EBI_CH0,
Ramesh Masavarapu037942d2012-09-04 11:52:57 -07001625 .ab = 70000000UL,
1626 .ib = 70000000UL,
1627 },
1628 {
1629 .src = MSM_BUS_MASTER_ADM_PORT1,
1630 .dst = MSM_BUS_SLAVE_GSBI1_UART,
1631 .ab = 2480000000UL,
1632 .ib = 2480000000UL,
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07001633 },
1634 {
1635 .src = MSM_BUS_MASTER_SPDM,
1636 .dst = MSM_BUS_SLAVE_SPDM,
1637 .ib = 0,
1638 .ab = 0,
1639 },
1640};
1641
1642static struct msm_bus_vectors qseecom_enable_sfpb_vectors[] = {
1643 {
Ramesh Masavarapu037942d2012-09-04 11:52:57 -07001644 .src = MSM_BUS_MASTER_ADM_PORT0,
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07001645 .dst = MSM_BUS_SLAVE_EBI_CH0,
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07001646 .ab = 0,
Ramesh Masavarapu037942d2012-09-04 11:52:57 -07001647 .ib = 0,
1648 },
1649 {
1650 .src = MSM_BUS_MASTER_ADM_PORT1,
1651 .dst = MSM_BUS_SLAVE_GSBI1_UART,
1652 .ab = 0,
1653 .ib = 0,
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07001654 },
1655 {
1656 .src = MSM_BUS_MASTER_SPDM,
1657 .dst = MSM_BUS_SLAVE_SPDM,
1658 .ib = (64 * 8) * 1000000UL,
1659 .ab = (64 * 8) * 100000UL,
1660 },
1661};
1662
Ramesh Masavarapu4f091cb2012-10-03 10:18:06 -07001663static struct msm_bus_vectors qseecom_enable_dfab_sfpb_vectors[] = {
1664 {
1665 .src = MSM_BUS_MASTER_ADM_PORT0,
1666 .dst = MSM_BUS_SLAVE_EBI_CH0,
1667 .ab = 70000000UL,
1668 .ib = 70000000UL,
1669 },
1670 {
1671 .src = MSM_BUS_MASTER_ADM_PORT1,
1672 .dst = MSM_BUS_SLAVE_GSBI1_UART,
1673 .ab = 2480000000UL,
1674 .ib = 2480000000UL,
1675 },
1676 {
1677 .src = MSM_BUS_MASTER_SPDM,
1678 .dst = MSM_BUS_SLAVE_SPDM,
1679 .ib = (64 * 8) * 1000000UL,
1680 .ab = (64 * 8) * 100000UL,
1681 },
1682};
1683
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07001684static struct msm_bus_paths qseecom_hw_bus_scale_usecases[] = {
1685 {
1686 ARRAY_SIZE(qseecom_clks_init_vectors),
1687 qseecom_clks_init_vectors,
1688 },
1689 {
1690 ARRAY_SIZE(qseecom_enable_dfab_vectors),
Ramesh Masavarapu037942d2012-09-04 11:52:57 -07001691 qseecom_enable_dfab_vectors,
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07001692 },
1693 {
1694 ARRAY_SIZE(qseecom_enable_sfpb_vectors),
1695 qseecom_enable_sfpb_vectors,
1696 },
Ramesh Masavarapu4f091cb2012-10-03 10:18:06 -07001697 {
1698 ARRAY_SIZE(qseecom_enable_dfab_sfpb_vectors),
1699 qseecom_enable_dfab_sfpb_vectors,
1700 },
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07001701};
1702
1703static struct msm_bus_scale_pdata qseecom_bus_pdata = {
1704 qseecom_hw_bus_scale_usecases,
1705 ARRAY_SIZE(qseecom_hw_bus_scale_usecases),
1706 .name = "qsee",
1707};
1708
1709static struct platform_device qseecom_device = {
1710 .name = "qseecom",
1711 .id = 0,
1712 .dev = {
1713 .platform_data = &qseecom_bus_pdata,
1714 },
1715};
1716#endif
1717
Ramesh Masavarapu28311912011-10-27 11:04:12 -07001718#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
1719 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE) || \
1720 defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
1721 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
1722
1723#define QCE_SIZE 0x10000
1724#define QCE_0_BASE 0x11000000
1725
1726#define QCE_HW_KEY_SUPPORT 0
1727#define QCE_SHA_HMAC_SUPPORT 1
1728#define QCE_SHARE_CE_RESOURCE 3
1729#define QCE_CE_SHARED 0
1730
1731static struct resource qcrypto_resources[] = {
1732 [0] = {
1733 .start = QCE_0_BASE,
1734 .end = QCE_0_BASE + QCE_SIZE - 1,
1735 .flags = IORESOURCE_MEM,
1736 },
1737 [1] = {
1738 .name = "crypto_channels",
1739 .start = DMOV8064_CE_IN_CHAN,
1740 .end = DMOV8064_CE_OUT_CHAN,
1741 .flags = IORESOURCE_DMA,
1742 },
1743 [2] = {
1744 .name = "crypto_crci_in",
1745 .start = DMOV8064_CE_IN_CRCI,
1746 .end = DMOV8064_CE_IN_CRCI,
1747 .flags = IORESOURCE_DMA,
1748 },
1749 [3] = {
1750 .name = "crypto_crci_out",
1751 .start = DMOV8064_CE_OUT_CRCI,
1752 .end = DMOV8064_CE_OUT_CRCI,
1753 .flags = IORESOURCE_DMA,
1754 },
1755};
1756
1757static struct resource qcedev_resources[] = {
1758 [0] = {
1759 .start = QCE_0_BASE,
1760 .end = QCE_0_BASE + QCE_SIZE - 1,
1761 .flags = IORESOURCE_MEM,
1762 },
1763 [1] = {
1764 .name = "crypto_channels",
1765 .start = DMOV8064_CE_IN_CHAN,
1766 .end = DMOV8064_CE_OUT_CHAN,
1767 .flags = IORESOURCE_DMA,
1768 },
1769 [2] = {
1770 .name = "crypto_crci_in",
1771 .start = DMOV8064_CE_IN_CRCI,
1772 .end = DMOV8064_CE_IN_CRCI,
1773 .flags = IORESOURCE_DMA,
1774 },
1775 [3] = {
1776 .name = "crypto_crci_out",
1777 .start = DMOV8064_CE_OUT_CRCI,
1778 .end = DMOV8064_CE_OUT_CRCI,
1779 .flags = IORESOURCE_DMA,
1780 },
1781};
1782
1783#endif
1784
1785#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
1786 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE)
1787
1788static struct msm_ce_hw_support qcrypto_ce_hw_suppport = {
1789 .ce_shared = QCE_CE_SHARED,
1790 .shared_ce_resource = QCE_SHARE_CE_RESOURCE,
1791 .hw_key_support = QCE_HW_KEY_SUPPORT,
1792 .sha_hmac = QCE_SHA_HMAC_SUPPORT,
Ramesh Masavarapu49259682011-12-02 14:00:18 -08001793 .bus_scale_table = NULL,
Ramesh Masavarapu28311912011-10-27 11:04:12 -07001794};
1795
1796static struct platform_device qcrypto_device = {
1797 .name = "qcrypto",
1798 .id = 0,
1799 .num_resources = ARRAY_SIZE(qcrypto_resources),
1800 .resource = qcrypto_resources,
1801 .dev = {
1802 .coherent_dma_mask = DMA_BIT_MASK(32),
1803 .platform_data = &qcrypto_ce_hw_suppport,
1804 },
1805};
1806#endif
1807
1808#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
1809 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
1810
1811static struct msm_ce_hw_support qcedev_ce_hw_suppport = {
1812 .ce_shared = QCE_CE_SHARED,
1813 .shared_ce_resource = QCE_SHARE_CE_RESOURCE,
1814 .hw_key_support = QCE_HW_KEY_SUPPORT,
1815 .sha_hmac = QCE_SHA_HMAC_SUPPORT,
Ramesh Masavarapu49259682011-12-02 14:00:18 -08001816 .bus_scale_table = NULL,
Ramesh Masavarapu28311912011-10-27 11:04:12 -07001817};
1818
1819static struct platform_device qcedev_device = {
1820 .name = "qce",
1821 .id = 0,
1822 .num_resources = ARRAY_SIZE(qcedev_resources),
1823 .resource = qcedev_resources,
1824 .dev = {
1825 .coherent_dma_mask = DMA_BIT_MASK(32),
1826 .platform_data = &qcedev_ce_hw_suppport,
1827 },
1828};
1829#endif
1830
Joel Kingef390842012-05-23 16:42:48 -07001831static struct mdm_vddmin_resource mdm_vddmin_rscs = {
1832 .rpm_id = MSM_RPM_ID_VDDMIN_GPIO,
1833 .ap2mdm_vddmin_gpio = 30,
1834 .modes = 0x03,
1835 .drive_strength = 8,
1836 .mdm2ap_vddmin_gpio = 80,
1837};
1838
Joel King269aa602012-07-23 08:07:35 -07001839static struct gpiomux_setting mdm2ap_status_gpio_run_cfg = {
1840 .func = GPIOMUX_FUNC_GPIO,
1841 .drv = GPIOMUX_DRV_8MA,
1842 .pull = GPIOMUX_PULL_NONE,
1843};
1844
Joel Kingdacbc822012-01-25 13:30:57 -08001845static struct mdm_platform_data mdm_platform_data = {
1846 .mdm_version = "3.0",
1847 .ramdump_delay_ms = 2000,
Joel King14fe7fa2012-05-27 14:26:11 -07001848 .early_power_on = 1,
1849 .sfr_query = 1,
Joel Kingef390842012-05-23 16:42:48 -07001850 .vddmin_resource = &mdm_vddmin_rscs,
Hemant Kumara945b472012-01-25 15:08:06 -08001851 .peripheral_platform_device = &apq8064_device_hsic_host,
Ameya Thakurc9a7a842012-06-24 22:47:52 -07001852 .ramdump_timeout_ms = 120000,
Joel King269aa602012-07-23 08:07:35 -07001853 .mdm2ap_status_gpio_run_cfg = &mdm2ap_status_gpio_run_cfg,
Ameya Thakurffd21b02013-01-30 11:33:22 -08001854 .sysmon_subsys_id_valid = 1,
1855 .sysmon_subsys_id = SYSMON_SS_EXT_MODEM,
Joel Kingdacbc822012-01-25 13:30:57 -08001856};
Ramesh Masavarapu28311912011-10-27 11:04:12 -07001857
Ameya Thakur2702baf2013-01-30 11:55:25 -08001858static struct mdm_vddmin_resource bmdm_vddmin_rscs = {
1859 .rpm_id = MSM_RPM_ID_VDDMIN_GPIO,
1860 .ap2mdm_vddmin_gpio = 30,
1861 .modes = 0x03,
1862 .drive_strength = 8,
1863 .mdm2ap_vddmin_gpio = 64,
1864};
1865
1866static struct mdm_platform_data bmdm_platform_data = {
1867 .mdm_version = "3.0",
1868 .ramdump_delay_ms = 2000,
1869 .sfr_query = 1,
1870 .send_shdn = 1,
1871 .vddmin_resource = &bmdm_vddmin_rscs,
1872 .peripheral_platform_device = &apq8064_device_ehci_host3,
1873 .ramdump_timeout_ms = 120000,
1874 .mdm2ap_status_gpio_run_cfg = &mdm2ap_status_gpio_run_cfg,
1875};
1876
Siddartha Mohanadosscaeaa922012-02-07 16:41:38 -08001877static struct tsens_platform_data apq_tsens_pdata = {
1878 .tsens_factor = 1000,
1879 .hw_type = APQ_8064,
1880 .tsens_num_sensor = 11,
1881 .slope = {1176, 1176, 1154, 1176, 1111,
1882 1132, 1132, 1199, 1132, 1199, 1132},
1883};
1884
Siddartha Mohanadoss48cad912012-04-05 21:29:54 -07001885static struct platform_device msm_tsens_device = {
1886 .name = "tsens8960-tm",
1887 .id = -1,
1888};
1889
Praveen Chidambaram877d7a42012-06-05 14:33:20 -06001890static struct msm_thermal_data msm_thermal_pdata = {
1891 .sensor_id = 7,
Eugene Seah2ee4a5d2012-06-25 18:16:41 -06001892 .poll_ms = 250,
1893 .limit_temp_degC = 60,
1894 .temp_hysteresis_degC = 10,
1895 .freq_step = 2,
Praveen Chidambaram877d7a42012-06-05 14:33:20 -06001896};
1897
Jeff Hugo0c0f5e92011-09-28 13:55:45 -06001898#define MSM_SHARED_RAM_PHYS 0x80000000
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001899static void __init apq8064_map_io(void)
1900{
Jeff Hugo0c0f5e92011-09-28 13:55:45 -06001901 msm_shared_ram_phys = MSM_SHARED_RAM_PHYS;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001902 msm_map_apq8064_io();
Jeff Ohlstein3a77f9f2011-09-06 14:50:20 -07001903 if (socinfo_init() < 0)
1904 pr_err("socinfo_init() failed!\n");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001905}
1906
1907static void __init apq8064_init_irq(void)
1908{
Praveen Chidambaram78499012011-11-01 17:15:17 -06001909 struct msm_mpm_device_data *data = NULL;
1910
1911#ifdef CONFIG_MSM_MPM
1912 data = &apq8064_mpm_dev_data;
1913#endif
1914
1915 msm_mpm_irq_extn_init(data);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001916 gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE,
1917 (void *)MSM_QGIC_CPU_BASE);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001918}
1919
Jay Chokshi7805b5a2011-11-07 15:55:30 -08001920static struct platform_device msm8064_device_saw_regulator_core0 = {
1921 .name = "saw-regulator",
1922 .id = 0,
1923 .dev = {
1924 .platform_data = &msm8064_saw_regulator_pdata_8921_s5,
1925 },
1926};
1927
1928static struct platform_device msm8064_device_saw_regulator_core1 = {
1929 .name = "saw-regulator",
1930 .id = 1,
1931 .dev = {
1932 .platform_data = &msm8064_saw_regulator_pdata_8921_s6,
1933 },
1934};
1935
1936static struct platform_device msm8064_device_saw_regulator_core2 = {
1937 .name = "saw-regulator",
1938 .id = 2,
1939 .dev = {
1940 .platform_data = &msm8064_saw_regulator_pdata_8821_s0,
1941 },
1942};
1943
1944static struct platform_device msm8064_device_saw_regulator_core3 = {
1945 .name = "saw-regulator",
1946 .id = 3,
1947 .dev = {
1948 .platform_data = &msm8064_saw_regulator_pdata_8821_s1,
Praveen Chidambaram78499012011-11-01 17:15:17 -06001949
1950 },
1951};
1952
Oluwafemi Adeyemif5a31422012-03-08 16:58:45 -08001953static struct msm_rpmrs_level msm_rpmrs_levels[] = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001954 {
1955 MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT,
1956 MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE),
1957 true,
Girish Mahadevan9bf71562012-04-13 14:41:44 -06001958 1, 784, 180000, 100,
Praveen Chidambaram78499012011-11-01 17:15:17 -06001959 },
1960
1961 {
Anji Jonnala85b29ff2013-01-15 14:12:45 +05301962 MSM_PM_SLEEP_MODE_RETENTION,
1963 MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE),
1964 true,
1965 415, 715, 340827, 475,
1966 },
1967
1968 {
Praveen Chidambaram78499012011-11-01 17:15:17 -06001969 MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE,
1970 MSM_RPMRS_LIMITS(ON, ACTIVE, MAX, ACTIVE),
1971 true,
Girish Mahadevan9bf71562012-04-13 14:41:44 -06001972 1300, 228, 1200000, 2000,
Praveen Chidambaram78499012011-11-01 17:15:17 -06001973 },
1974
1975 {
1976 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1977 MSM_RPMRS_LIMITS(ON, GDHS, MAX, ACTIVE),
1978 false,
Girish Mahadevan9bf71562012-04-13 14:41:44 -06001979 2000, 138, 1208400, 3200,
Praveen Chidambaram78499012011-11-01 17:15:17 -06001980 },
1981
1982 {
1983 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
Praveen Chidambarame3380672012-02-08 10:32:27 -07001984 MSM_RPMRS_LIMITS(ON, HSFS_OPEN, ACTIVE, RET_HIGH),
1985 false,
Girish Mahadevan9bf71562012-04-13 14:41:44 -06001986 6000, 119, 1850300, 9000,
Praveen Chidambaram78499012011-11-01 17:15:17 -06001987 },
1988
1989 {
1990 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1991 MSM_RPMRS_LIMITS(OFF, GDHS, MAX, ACTIVE),
1992 false,
Girish Mahadevan9bf71562012-04-13 14:41:44 -06001993 9200, 68, 2839200, 16400,
Praveen Chidambaram78499012011-11-01 17:15:17 -06001994 },
1995
1996 {
1997 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
1998 MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, MAX, ACTIVE),
1999 false,
Girish Mahadevan9bf71562012-04-13 14:41:44 -06002000 10300, 63, 3128000, 18200,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002001 },
2002
2003 {
2004 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
2005 MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, ACTIVE, RET_HIGH),
2006 false,
Girish Mahadevan9bf71562012-04-13 14:41:44 -06002007 18000, 10, 4602600, 27000,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002008 },
2009
2010 {
2011 MSM_PM_SLEEP_MODE_POWER_COLLAPSE,
2012 MSM_RPMRS_LIMITS(OFF, HSFS_OPEN, RET_HIGH, RET_LOW),
2013 false,
Girish Mahadevan9bf71562012-04-13 14:41:44 -06002014 20000, 2, 5752000, 32000,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002015 },
2016};
2017
2018static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = {
2019 .mode = MSM_PM_BOOT_CONFIG_TZ,
2020};
2021
2022static struct msm_rpmrs_platform_data msm_rpmrs_data __initdata = {
2023 .levels = &msm_rpmrs_levels[0],
2024 .num_levels = ARRAY_SIZE(msm_rpmrs_levels),
2025 .vdd_mem_levels = {
2026 [MSM_RPMRS_VDD_MEM_RET_LOW] = 750000,
2027 [MSM_RPMRS_VDD_MEM_RET_HIGH] = 750000,
2028 [MSM_RPMRS_VDD_MEM_ACTIVE] = 1050000,
2029 [MSM_RPMRS_VDD_MEM_MAX] = 1150000,
2030 },
2031 .vdd_dig_levels = {
2032 [MSM_RPMRS_VDD_DIG_RET_LOW] = 500000,
2033 [MSM_RPMRS_VDD_DIG_RET_HIGH] = 750000,
2034 [MSM_RPMRS_VDD_DIG_ACTIVE] = 950000,
2035 [MSM_RPMRS_VDD_DIG_MAX] = 1150000,
2036 },
2037 .vdd_mask = 0x7FFFFF,
2038 .rpmrs_target_id = {
2039 [MSM_RPMRS_ID_PXO_CLK] = MSM_RPM_ID_PXO_CLK,
2040 [MSM_RPMRS_ID_L2_CACHE_CTL] = MSM_RPM_ID_LAST,
2041 [MSM_RPMRS_ID_VDD_DIG_0] = MSM_RPM_ID_PM8921_S3_0,
2042 [MSM_RPMRS_ID_VDD_DIG_1] = MSM_RPM_ID_PM8921_S3_1,
2043 [MSM_RPMRS_ID_VDD_MEM_0] = MSM_RPM_ID_PM8921_L24_0,
2044 [MSM_RPMRS_ID_VDD_MEM_1] = MSM_RPM_ID_PM8921_L24_1,
2045 [MSM_RPMRS_ID_RPM_CTL] = MSM_RPM_ID_RPM_CTL,
2046 },
2047};
2048
Praveen Chidambaram78499012011-11-01 17:15:17 -06002049static uint8_t spm_wfi_cmd_sequence[] __initdata = {
2050 0x03, 0x0f,
2051};
2052
2053static uint8_t spm_power_collapse_without_rpm[] __initdata = {
2054 0x00, 0x24, 0x54, 0x10,
2055 0x09, 0x03, 0x01,
2056 0x10, 0x54, 0x30, 0x0C,
2057 0x24, 0x30, 0x0f,
2058};
2059
Anji Jonnala85b29ff2013-01-15 14:12:45 +05302060static uint8_t spm_retention_cmd_sequence[] __initdata = {
2061 0x00, 0x05, 0x03, 0x0D,
2062 0x0B, 0x00, 0x0f,
2063};
2064
Praveen Chidambaram78499012011-11-01 17:15:17 -06002065static uint8_t spm_power_collapse_with_rpm[] __initdata = {
2066 0x00, 0x24, 0x54, 0x10,
2067 0x09, 0x07, 0x01, 0x0B,
2068 0x10, 0x54, 0x30, 0x0C,
2069 0x24, 0x30, 0x0f,
2070};
2071
Anji Jonnala0f297a92013-01-19 11:22:25 +05302072/* 8064AB has a different command to assert apc_pdn */
2073static uint8_t spm_power_collapse_without_rpm_krait_v3[] __initdata = {
2074 0x00, 0x24, 0x84, 0x10,
2075 0x09, 0x03, 0x01,
2076 0x10, 0x84, 0x30, 0x0C,
2077 0x24, 0x30, 0x0f,
2078};
2079
2080static uint8_t spm_power_collapse_with_rpm_krait_v3[] __initdata = {
2081 0x00, 0x24, 0x84, 0x10,
2082 0x09, 0x07, 0x01, 0x0B,
2083 0x10, 0x84, 0x30, 0x0C,
2084 0x24, 0x30, 0x0f,
2085};
2086
Anji Jonnala85b29ff2013-01-15 14:12:45 +05302087static struct msm_spm_seq_entry msm_spm_boot_cpu_seq_list[] __initdata = {
2088 [0] = {
2089 .mode = MSM_SPM_MODE_CLOCK_GATING,
2090 .notify_rpm = false,
2091 .cmd = spm_wfi_cmd_sequence,
2092 },
2093 [1] = {
2094 .mode = MSM_SPM_MODE_POWER_RETENTION,
2095 .notify_rpm = false,
2096 .cmd = spm_retention_cmd_sequence,
2097 },
2098 [2] = {
2099 .mode = MSM_SPM_MODE_POWER_COLLAPSE,
2100 .notify_rpm = false,
2101 .cmd = spm_power_collapse_without_rpm,
2102 },
2103 [3] = {
2104 .mode = MSM_SPM_MODE_POWER_COLLAPSE,
2105 .notify_rpm = true,
2106 .cmd = spm_power_collapse_with_rpm,
2107 },
2108};
2109static struct msm_spm_seq_entry msm_spm_nonboot_cpu_seq_list[] __initdata = {
Praveen Chidambaram78499012011-11-01 17:15:17 -06002110 [0] = {
2111 .mode = MSM_SPM_MODE_CLOCK_GATING,
2112 .notify_rpm = false,
2113 .cmd = spm_wfi_cmd_sequence,
2114 },
2115 [1] = {
2116 .mode = MSM_SPM_MODE_POWER_COLLAPSE,
2117 .notify_rpm = false,
2118 .cmd = spm_power_collapse_without_rpm,
2119 },
2120 [2] = {
2121 .mode = MSM_SPM_MODE_POWER_COLLAPSE,
2122 .notify_rpm = true,
2123 .cmd = spm_power_collapse_with_rpm,
2124 },
2125};
2126
2127static uint8_t l2_spm_wfi_cmd_sequence[] __initdata = {
2128 0x00, 0x20, 0x03, 0x20,
2129 0x00, 0x0f,
2130};
2131
2132static uint8_t l2_spm_gdhs_cmd_sequence[] __initdata = {
2133 0x00, 0x20, 0x34, 0x64,
2134 0x48, 0x07, 0x48, 0x20,
2135 0x50, 0x64, 0x04, 0x34,
2136 0x50, 0x0f,
2137};
2138static uint8_t l2_spm_power_off_cmd_sequence[] __initdata = {
2139 0x00, 0x10, 0x34, 0x64,
2140 0x48, 0x07, 0x48, 0x10,
2141 0x50, 0x64, 0x04, 0x34,
2142 0x50, 0x0F,
2143};
2144
2145static struct msm_spm_seq_entry msm_spm_l2_seq_list[] __initdata = {
2146 [0] = {
2147 .mode = MSM_SPM_L2_MODE_RETENTION,
2148 .notify_rpm = false,
2149 .cmd = l2_spm_wfi_cmd_sequence,
2150 },
2151 [1] = {
2152 .mode = MSM_SPM_L2_MODE_GDHS,
2153 .notify_rpm = true,
2154 .cmd = l2_spm_gdhs_cmd_sequence,
2155 },
2156 [2] = {
2157 .mode = MSM_SPM_L2_MODE_POWER_COLLAPSE,
2158 .notify_rpm = true,
2159 .cmd = l2_spm_power_off_cmd_sequence,
2160 },
2161};
2162
2163
2164static struct msm_spm_platform_data msm_spm_l2_data[] __initdata = {
2165 [0] = {
2166 .reg_base_addr = MSM_SAW_L2_BASE,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002167 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x00,
Praveen Chidambarame4b9eb12012-02-28 19:39:58 -07002168 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002169 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x00A000AE,
2170 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x00A00020,
2171 .modes = msm_spm_l2_seq_list,
2172 .num_modes = ARRAY_SIZE(msm_spm_l2_seq_list),
2173 },
2174};
2175
2176static struct msm_spm_platform_data msm_spm_data[] __initdata = {
2177 [0] = {
2178 .reg_base_addr = MSM_SAW0_BASE,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002179 .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002180#if defined(CONFIG_MSM_AVS_HW)
2181 .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00,
2182 .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00,
2183#endif
2184 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01,
Anji Jonnala85b29ff2013-01-15 14:12:45 +05302185 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x03020004,
2186 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0084009C,
2187 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x00A4001C,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002188 .vctl_timeout_us = 50,
Anji Jonnala85b29ff2013-01-15 14:12:45 +05302189 .num_modes = ARRAY_SIZE(msm_spm_boot_cpu_seq_list),
2190 .modes = msm_spm_boot_cpu_seq_list,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002191 },
2192 [1] = {
2193 .reg_base_addr = MSM_SAW1_BASE,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002194 .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002195#if defined(CONFIG_MSM_AVS_HW)
2196 .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00,
2197 .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00,
2198#endif
2199 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01,
Praveen Chidambarame4b9eb12012-02-28 19:39:58 -07002200 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002201 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C,
2202 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C,
2203 .vctl_timeout_us = 50,
Anji Jonnala85b29ff2013-01-15 14:12:45 +05302204 .num_modes = ARRAY_SIZE(msm_spm_nonboot_cpu_seq_list),
2205 .modes = msm_spm_nonboot_cpu_seq_list,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002206 },
2207 [2] = {
2208 .reg_base_addr = MSM_SAW2_BASE,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002209 .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002210#if defined(CONFIG_MSM_AVS_HW)
2211 .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00,
2212 .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00,
2213#endif
2214 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01,
Praveen Chidambarame4b9eb12012-02-28 19:39:58 -07002215 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002216 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C,
2217 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C,
2218 .vctl_timeout_us = 50,
Anji Jonnala85b29ff2013-01-15 14:12:45 +05302219 .num_modes = ARRAY_SIZE(msm_spm_nonboot_cpu_seq_list),
2220 .modes = msm_spm_nonboot_cpu_seq_list,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002221 },
2222 [3] = {
2223 .reg_base_addr = MSM_SAW3_BASE,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002224 .reg_init_values[MSM_SPM_REG_SAW2_CFG] = 0x1F,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002225#if defined(CONFIG_MSM_AVS_HW)
2226 .reg_init_values[MSM_SPM_REG_SAW2_AVS_CTL] = 0x00,
2227 .reg_init_values[MSM_SPM_REG_SAW2_AVS_HYSTERESIS] = 0x00,
2228#endif
2229 .reg_init_values[MSM_SPM_REG_SAW2_SPM_CTL] = 0x01,
Praveen Chidambarame4b9eb12012-02-28 19:39:58 -07002230 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DLY] = 0x02020204,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002231 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_0] = 0x0060009C,
2232 .reg_init_values[MSM_SPM_REG_SAW2_PMIC_DATA_1] = 0x0000001C,
2233 .vctl_timeout_us = 50,
Anji Jonnala85b29ff2013-01-15 14:12:45 +05302234 .num_modes = ARRAY_SIZE(msm_spm_nonboot_cpu_seq_list),
2235 .modes = msm_spm_nonboot_cpu_seq_list,
Jay Chokshi7805b5a2011-11-07 15:55:30 -08002236 },
2237};
2238
Anji Jonnala0f297a92013-01-19 11:22:25 +05302239static void __init apq8064ab_update_krait_spm(void)
2240{
2241 int i;
2242
2243 /* Update the SPM sequences for SPC and PC */
2244 for (i = 0; i < ARRAY_SIZE(msm_spm_data); i++) {
2245 int j;
2246 struct msm_spm_platform_data *pdata = &msm_spm_data[i];
2247 for (j = 0; j < pdata->num_modes; j++) {
2248 if (pdata->modes[j].cmd ==
2249 spm_power_collapse_without_rpm)
2250 pdata->modes[j].cmd =
2251 spm_power_collapse_without_rpm_krait_v3;
2252 else if (pdata->modes[j].cmd ==
2253 spm_power_collapse_with_rpm)
2254 pdata->modes[j].cmd =
2255 spm_power_collapse_with_rpm_krait_v3;
2256 }
2257 }
2258}
2259
Gagan Mac8a7a5d32011-11-11 16:43:06 -07002260static void __init apq8064_init_buses(void)
2261{
2262 msm_bus_rpm_set_mt_mask();
2263 msm_bus_8064_apps_fabric_pdata.rpm_enabled = 1;
2264 msm_bus_8064_sys_fabric_pdata.rpm_enabled = 1;
2265 msm_bus_8064_mm_fabric_pdata.rpm_enabled = 1;
2266 msm_bus_8064_apps_fabric.dev.platform_data =
2267 &msm_bus_8064_apps_fabric_pdata;
2268 msm_bus_8064_sys_fabric.dev.platform_data =
2269 &msm_bus_8064_sys_fabric_pdata;
2270 msm_bus_8064_mm_fabric.dev.platform_data =
2271 &msm_bus_8064_mm_fabric_pdata;
2272 msm_bus_8064_sys_fpb.dev.platform_data = &msm_bus_8064_sys_fpb_pdata;
2273 msm_bus_8064_cpss_fpb.dev.platform_data = &msm_bus_8064_cpss_fpb_pdata;
2274}
2275
Niranjana Vishwanathapura06f89332012-05-03 17:11:13 -06002276/* PCIe gpios */
2277static struct msm_pcie_gpio_info_t msm_pcie_gpio_info[MSM_PCIE_MAX_GPIO] = {
2278 {"rst_n", PM8921_MPP_PM_TO_SYS(PCIE_RST_N_PMIC_MPP), 0},
2279 {"pwr_en", PM8921_GPIO_PM_TO_SYS(PCIE_PWR_EN_PMIC_GPIO), 1},
2280};
2281
2282static struct msm_pcie_platform msm_pcie_platform_data = {
2283 .gpio = msm_pcie_gpio_info,
Niranjana Vishwanathapura68210ff2012-06-24 18:03:49 -06002284 .axi_addr = PCIE_AXI_BAR_PHYS,
2285 .axi_size = PCIE_AXI_BAR_SIZE,
Niranjana Vishwanathapura459a27d2012-07-20 12:23:55 -06002286 .wake_n = PM8921_GPIO_IRQ(PM8921_IRQ_BASE, PCIE_WAKE_N_PMIC_GPIO),
Niranjana Vishwanathapura06f89332012-05-03 17:11:13 -06002287};
2288
Niranjana Vishwanathapurac1edd402012-06-28 15:32:50 -06002289static int __init mpq8064_pcie_enabled(void)
2290{
2291 return !((readl_relaxed(QFPROM_RAW_FEAT_CONFIG_ROW0_MSB) & BIT(21)) ||
2292 (readl_relaxed(QFPROM_RAW_OEM_CONFIG_ROW0_LSB) & BIT(4)));
2293}
2294
Niranjana Vishwanathapura06f89332012-05-03 17:11:13 -06002295static void __init mpq8064_pcie_init(void)
2296{
Niranjana Vishwanathapurac1edd402012-06-28 15:32:50 -06002297 if (mpq8064_pcie_enabled()) {
2298 msm_device_pcie.dev.platform_data = &msm_pcie_platform_data;
2299 platform_device_register(&msm_device_pcie);
2300 }
Niranjana Vishwanathapura06f89332012-05-03 17:11:13 -06002301}
2302
David Collinsf0d00732012-01-25 15:46:50 -08002303static struct platform_device apq8064_device_ext_5v_vreg __devinitdata = {
2304 .name = GPIO_REGULATOR_DEV_NAME,
2305 .id = PM8921_MPP_PM_TO_SYS(7),
2306 .dev = {
2307 .platform_data
2308 = &apq8064_gpio_regulator_pdata[GPIO_VREG_ID_EXT_5V],
2309 },
2310};
2311
Jay Chokshi1de4f9d2012-02-07 16:11:31 -08002312static struct platform_device apq8064_device_ext_mpp8_vreg __devinitdata = {
2313 .name = GPIO_REGULATOR_DEV_NAME,
2314 .id = PM8921_MPP_PM_TO_SYS(8),
2315 .dev = {
2316 .platform_data
2317 = &apq8064_gpio_regulator_pdata[GPIO_VREG_ID_EXT_MPP8],
2318 },
2319};
2320
David Collinsf0d00732012-01-25 15:46:50 -08002321static struct platform_device apq8064_device_ext_3p3v_vreg __devinitdata = {
2322 .name = GPIO_REGULATOR_DEV_NAME,
2323 .id = APQ8064_EXT_3P3V_REG_EN_GPIO,
2324 .dev = {
2325 .platform_data =
2326 &apq8064_gpio_regulator_pdata[GPIO_VREG_ID_EXT_3P3V],
2327 },
2328};
2329
David Collins390fc332012-02-07 14:38:16 -08002330static struct platform_device apq8064_device_ext_ts_sw_vreg __devinitdata = {
2331 .name = GPIO_REGULATOR_DEV_NAME,
2332 .id = PM8921_GPIO_PM_TO_SYS(23),
2333 .dev = {
2334 .platform_data
2335 = &apq8064_gpio_regulator_pdata[GPIO_VREG_ID_EXT_TS_SW],
2336 },
2337};
2338
David Collins2782b5c2012-02-06 10:02:42 -08002339static struct platform_device apq8064_device_rpm_regulator __devinitdata = {
2340 .name = "rpm-regulator",
David Collins36199252012-08-21 15:43:02 -07002341 .id = 0,
David Collins2782b5c2012-02-06 10:02:42 -08002342 .dev = {
2343 .platform_data = &apq8064_rpm_regulator_pdata,
2344 },
2345};
2346
David Collins36199252012-08-21 15:43:02 -07002347static struct platform_device
2348apq8064_pm8921_device_rpm_regulator __devinitdata = {
2349 .name = "rpm-regulator",
2350 .id = 1,
2351 .dev = {
2352 .platform_data = &apq8064_rpm_regulator_pm8921_pdata,
2353 },
2354};
2355
Ravi Kumar V05931a22012-04-04 17:09:37 +05302356static struct gpio_ir_recv_platform_data gpio_ir_recv_pdata = {
2357 .gpio_nr = 88,
2358 .active_low = 1,
2359};
2360
2361static struct platform_device gpio_ir_recv_pdev = {
2362 .name = "gpio-rc-recv",
2363 .dev = {
2364 .platform_data = &gpio_ir_recv_pdata,
2365 },
2366};
2367
Terence Hampson36b70722012-05-10 13:18:16 -04002368static struct platform_device *common_not_mpq_devices[] __initdata = {
David Keitel3c40fc52012-02-09 17:53:52 -08002369 &apq8064_device_qup_i2c_gsbi1,
Jing Lin04601f92012-02-05 15:36:07 -08002370 &apq8064_device_qup_i2c_gsbi3,
Kenneth Heitke748593a2011-07-15 15:45:11 -06002371 &apq8064_device_qup_i2c_gsbi4,
Terence Hampson36b70722012-05-10 13:18:16 -04002372};
2373
David Collins36199252012-08-21 15:43:02 -07002374static struct platform_device *early_common_devices[] __initdata = {
Matt Wagantallf5cc3892012-06-07 19:47:02 -07002375 &apq8064_device_acpuclk,
Terence Hampson36b70722012-05-10 13:18:16 -04002376 &apq8064_device_dmov,
Harini Jayaramanc4c58692011-07-19 14:50:10 -06002377 &apq8064_device_qup_spi_gsbi5,
David Collins36199252012-08-21 15:43:02 -07002378};
2379
2380static struct platform_device *pm8921_common_devices[] __initdata = {
David Collinsf0d00732012-01-25 15:46:50 -08002381 &apq8064_device_ext_5v_vreg,
Jay Chokshi1de4f9d2012-02-07 16:11:31 -08002382 &apq8064_device_ext_mpp8_vreg,
David Collinsf0d00732012-01-25 15:46:50 -08002383 &apq8064_device_ext_3p3v_vreg,
Jay Chokshi9c25f072011-09-23 18:19:15 -07002384 &apq8064_device_ssbi_pmic1,
2385 &apq8064_device_ssbi_pmic2,
Steve Mucklef132c6c2012-06-06 18:30:57 -07002386 &apq8064_device_ext_ts_sw_vreg,
David Collins36199252012-08-21 15:43:02 -07002387};
2388
2389static struct platform_device *pm8917_common_devices[] __initdata = {
2390 &apq8064_device_ext_mpp8_vreg,
2391 &apq8064_device_ext_3p3v_vreg,
2392 &apq8064_device_ssbi_pmic1,
2393 &apq8064_device_ssbi_pmic2,
2394 &apq8064_device_ext_ts_sw_vreg,
2395};
2396
2397static struct platform_device *common_devices[] __initdata = {
Jeff Hugo0c0f5e92011-09-28 13:55:45 -06002398 &msm_device_smd_apq8064,
Hemant Kumar4933b072011-10-17 23:43:11 -07002399 &apq8064_device_otg,
2400 &apq8064_device_gadget_peripheral,
Hemant Kumard86c4882012-01-24 19:39:37 -08002401 &apq8064_device_hsusb_host,
Hemant Kumar4933b072011-10-17 23:43:11 -07002402 &android_usb_device,
Ankit Verma6b7e2ba2012-01-26 15:48:54 -08002403 &msm_device_wcnss_wlan,
Ankit Vermab7c26e62012-02-28 15:04:15 -08002404 &msm_device_iris_fm,
Larry Bassel67b921d2012-04-06 10:23:27 -07002405 &apq8064_fmem_device,
Olav Haugan7c6aa742012-01-16 16:47:37 -08002406#ifdef CONFIG_ANDROID_PMEM
2407#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
Laura Abbottb93525f2012-04-12 09:57:19 -07002408 &apq8064_android_pmem_device,
2409 &apq8064_android_pmem_adsp_device,
2410 &apq8064_android_pmem_audio_device,
Bharath Ramachandramurthy4a3fa912012-03-13 19:16:24 -07002411#endif /*CONFIG_MSM_MULTIMEDIA_USE_ION*/
2412#endif /*CONFIG_ANDROID_PMEM*/
Olav Haugan7c6aa742012-01-16 16:47:37 -08002413#ifdef CONFIG_ION_MSM
Laura Abbottb93525f2012-04-12 09:57:19 -07002414 &apq8064_ion_dev,
Olav Haugan7c6aa742012-01-16 16:47:37 -08002415#endif
Jeff Ohlstein7e668552011-10-06 16:17:25 -07002416 &msm8064_device_watchdog,
Jay Chokshi7805b5a2011-11-07 15:55:30 -08002417 &msm8064_device_saw_regulator_core0,
2418 &msm8064_device_saw_regulator_core1,
2419 &msm8064_device_saw_regulator_core2,
2420 &msm8064_device_saw_regulator_core3,
Ramesh Masavarapua26cce72012-04-09 12:32:25 -07002421#if defined(CONFIG_QSEECOM)
2422 &qseecom_device,
2423#endif
2424
Joel Nider6b9a7bc2012-06-26 11:19:19 +03002425 &msm_8064_device_tsif[0],
2426 &msm_8064_device_tsif[1],
2427
Ramesh Masavarapu28311912011-10-27 11:04:12 -07002428#if defined(CONFIG_CRYPTO_DEV_QCRYPTO) || \
2429 defined(CONFIG_CRYPTO_DEV_QCRYPTO_MODULE)
2430 &qcrypto_device,
2431#endif
2432
2433#if defined(CONFIG_CRYPTO_DEV_QCEDEV) || \
2434 defined(CONFIG_CRYPTO_DEV_QCEDEV_MODULE)
2435 &qcedev_device,
2436#endif
Ramesh Masavarapuf46be1b2011-11-03 11:13:41 -07002437
2438#ifdef CONFIG_HW_RANDOM_MSM
2439 &apq8064_device_rng,
2440#endif
Bharath Ramachandramurthyb8e797f2011-11-30 12:08:42 -08002441 &apq_pcm,
2442 &apq_pcm_routing,
2443 &apq_cpudai0,
2444 &apq_cpudai1,
Santosh Mardieff9a742012-04-09 23:23:39 +05302445 &mpq_cpudai_sec_i2s_rx,
Kuirong Wangf23f8c52012-03-31 12:34:51 -07002446 &mpq_cpudai_mi2s_tx,
Bharath Ramachandramurthyb8e797f2011-11-30 12:08:42 -08002447 &apq_cpudai_hdmi_rx,
2448 &apq_cpudai_bt_rx,
2449 &apq_cpudai_bt_tx,
2450 &apq_cpudai_fm_rx,
2451 &apq_cpudai_fm_tx,
2452 &apq_cpu_fe,
2453 &apq_stub_codec,
2454 &apq_voice,
2455 &apq_voip,
2456 &apq_lpa_pcm,
Krishnankutty Kolathappilly4374e332012-03-18 22:27:30 -07002457 &apq_compr_dsp,
2458 &apq_multi_ch_pcm,
Jayasena Sangaraboina99bf09c2012-07-17 12:03:08 -07002459 &apq_lowlatency_pcm,
Bharath Ramachandramurthyb8e797f2011-11-30 12:08:42 -08002460 &apq_pcm_hostless,
2461 &apq_cpudai_afe_01_rx,
2462 &apq_cpudai_afe_01_tx,
2463 &apq_cpudai_afe_02_rx,
2464 &apq_cpudai_afe_02_tx,
2465 &apq_pcm_afe,
2466 &apq_cpudai_auxpcm_rx,
2467 &apq_cpudai_auxpcm_tx,
Neema Shetty8427c262012-02-16 11:23:43 -08002468 &apq_cpudai_stub,
Neema Shetty3c9d2862012-03-11 01:25:32 -08002469 &apq_cpudai_slimbus_1_rx,
2470 &apq_cpudai_slimbus_1_tx,
Kiran Kandi97fe19d2012-05-20 22:34:04 -07002471 &apq_cpudai_slimbus_2_rx,
Kiran Kandi1e6371d2012-03-29 11:48:57 -07002472 &apq_cpudai_slimbus_2_tx,
Neema Shettyc9d86c32012-05-09 12:01:39 -07002473 &apq_cpudai_slimbus_3_rx,
Helen Zeng38c3c962012-05-17 14:56:20 -07002474 &apq_cpudai_slimbus_3_tx,
Praveen Chidambaram78499012011-11-01 17:15:17 -06002475 &apq8064_rpm_device,
2476 &apq8064_rpm_log_device,
2477 &apq8064_rpm_stat_device,
Anji Jonnala2a8bd312012-11-01 13:11:42 +05302478 &apq8064_rpm_master_stat_device,
Ramesh Masavarapuf31ff242012-05-10 18:55:21 -07002479 &apq_device_tz_log,
Gagan Mac8a7a5d32011-11-11 16:43:06 -07002480 &msm_bus_8064_apps_fabric,
2481 &msm_bus_8064_sys_fabric,
2482 &msm_bus_8064_mm_fabric,
2483 &msm_bus_8064_sys_fpb,
2484 &msm_bus_8064_cpss_fpb,
Mohan Kumar Gubbihalli Lachma Naik7f72edd2012-02-06 17:26:47 -08002485 &apq8064_msm_device_vidc,
Stephen Boyd25c4a0b2011-09-20 00:12:36 -07002486 &msm_pil_dsps,
Matt Wagantallb94b9a52012-02-02 21:59:54 -08002487 &msm_8960_q6_lpass,
Stephen Boyd7b973de2012-03-09 12:26:16 -08002488 &msm_pil_vidc,
Matt Wagantall292aace2012-01-26 19:12:34 -08002489 &msm_gss,
Laura Abbottb93525f2012-04-12 09:57:19 -07002490 &apq8064_rtb_device,
Steve Mucklea9aac292012-11-02 15:41:00 -07002491 &apq8064_dcvs_device,
Abhijeet Dharmapurikarde91d2c2012-08-23 14:36:59 -07002492 &apq8064_msm_gov_device,
Stepan Moskovchenko28662c52012-03-01 12:48:45 -08002493 &apq8064_device_cache_erp,
Stepan Moskovchenko0f3de112012-06-08 18:11:46 -07002494 &msm8960_device_ebi1_ch0_erp,
2495 &msm8960_device_ebi1_ch1_erp,
Siddartha Mohanadossb9df4942012-02-08 09:58:21 -08002496 &epm_adc_device,
Pratik Patel3b0ca882012-06-01 16:54:14 -07002497 &coresight_tpiu_device,
2498 &coresight_etb_device,
2499 &apq8064_coresight_funnel_device,
2500 &coresight_etm0_device,
2501 &coresight_etm1_device,
2502 &coresight_etm2_device,
2503 &coresight_etm3_device,
Helen Zeng8f925502012-03-05 16:50:17 -08002504 &apq_cpudai_slim_4_rx,
2505 &apq_cpudai_slim_4_tx,
Steve Mucklef132c6c2012-06-06 18:30:57 -07002506#ifdef CONFIG_MSM_GEMINI
Jignesh Mehta921649d2012-04-19 06:57:23 -07002507 &msm8960_gemini_device,
Steve Mucklef132c6c2012-06-06 18:30:57 -07002508#endif
Laura Abbott0577d7b2012-04-17 11:14:30 -07002509 &apq8064_iommu_domain_device,
Siddartha Mohanadoss48cad912012-04-05 21:29:54 -07002510 &msm_tsens_device,
Laura Abbott93a4a352012-05-25 09:26:35 -07002511 &apq8064_cache_dump_device,
Joel Nider0e4a16d2012-08-05 14:20:11 +03002512 &msm_8064_device_tspp,
Abhijeet Dharmapurikarde91d2c2012-08-23 14:36:59 -07002513#ifdef CONFIG_BATTERY_BCL
2514 &battery_bcl_device,
2515#endif
2516 &apq8064_msm_mpd_device,
Harini Jayaramanc4c58692011-07-19 14:50:10 -06002517};
2518
Joel King82b7e3f2012-01-05 10:03:27 -08002519static struct platform_device *cdp_devices[] __initdata = {
2520 &apq8064_device_uart_gsbi1,
Jin Hong4bbbfba2012-02-02 21:48:07 -08002521 &apq8064_device_uart_gsbi7,
Joel King82b7e3f2012-01-05 10:03:27 -08002522 &msm_device_sps_apq8064,
Aravind Venkateswaran4ca27532012-02-16 14:27:05 -08002523#ifdef CONFIG_MSM_ROTATOR
2524 &msm_rotator_device,
2525#endif
Anji Jonnalae84292b2012-09-21 13:34:44 +05302526 &msm8064_pc_cntr,
Joel King82b7e3f2012-01-05 10:03:27 -08002527};
2528
Jay Chokshi1b7eaa92012-04-04 14:53:14 -07002529static struct platform_device
Jay Chokshi1b7eaa92012-04-04 14:53:14 -07002530mpq8064_device_ext_1p2_buck_vreg __devinitdata = {
2531 .name = GPIO_REGULATOR_DEV_NAME,
2532 .id = SX150X_GPIO(4, 2),
2533 .dev = {
2534 .platform_data =
2535 &mpq8064_gpio_regulator_pdata[GPIO_VREG_ID_AVC_1P2V],
2536 },
2537};
2538
2539static struct platform_device
2540mpq8064_device_ext_1p8_buck_vreg __devinitdata = {
2541 .name = GPIO_REGULATOR_DEV_NAME,
2542 .id = SX150X_GPIO(4, 4),
2543 .dev = {
2544 .platform_data =
2545 &mpq8064_gpio_regulator_pdata[GPIO_VREG_ID_AVC_1P8V],
2546 },
2547};
2548
2549static struct platform_device
2550mpq8064_device_ext_2p2_buck_vreg __devinitdata = {
2551 .name = GPIO_REGULATOR_DEV_NAME,
2552 .id = SX150X_GPIO(4, 14),
2553 .dev = {
2554 .platform_data =
2555 &mpq8064_gpio_regulator_pdata[GPIO_VREG_ID_AVC_2P2V],
2556 },
2557};
2558
2559static struct platform_device
2560mpq8064_device_ext_5v_buck_vreg __devinitdata = {
2561 .name = GPIO_REGULATOR_DEV_NAME,
2562 .id = SX150X_GPIO(4, 3),
2563 .dev = {
2564 .platform_data =
2565 &mpq8064_gpio_regulator_pdata[GPIO_VREG_ID_AVC_5V],
2566 },
2567};
2568
2569static struct platform_device
2570mpq8064_device_ext_3p3v_ldo_vreg __devinitdata = {
2571 .name = GPIO_REGULATOR_DEV_NAME,
2572 .id = SX150X_GPIO(4, 15),
2573 .dev = {
2574 .platform_data =
2575 &mpq8064_gpio_regulator_pdata[GPIO_VREG_ID_AVC_3P3V],
2576 },
2577};
2578
Ravi Kumar V1c903012012-05-15 16:11:35 +05302579static struct platform_device rc_input_loopback_pdev = {
2580 .name = "rc-user-input",
2581 .id = -1,
2582};
2583
Ravi Kumar V040eeff2012-05-23 21:29:23 +05302584static int rf4ce_gpio_init(void)
2585{
Ravi Kumar V0143c582012-08-14 17:18:11 +05302586 if (!machine_is_mpq8064_cdp() &&
2587 !machine_is_mpq8064_hrd() &&
2588 !machine_is_mpq8064_dtv())
Ravi Kumar V040eeff2012-05-23 21:29:23 +05302589 return -EINVAL;
2590
2591 /* CC2533 SRDY Input */
2592 if (!gpio_request(SX150X_GPIO(4, 6), "rf4ce_srdy")) {
2593 gpio_direction_input(SX150X_GPIO(4, 6));
2594 gpio_export(SX150X_GPIO(4, 6), true);
2595 }
2596
2597 /* CC2533 MRDY Output */
2598 if (!gpio_request(SX150X_GPIO(4, 5), "rf4ce_mrdy")) {
2599 gpio_direction_output(SX150X_GPIO(4, 5), 1);
2600 gpio_export(SX150X_GPIO(4, 5), true);
2601 }
2602
2603 /* CC2533 Reset Output */
2604 if (!gpio_request(SX150X_GPIO(4, 7), "rf4ce_reset")) {
2605 gpio_direction_output(SX150X_GPIO(4, 7), 0);
2606 gpio_export(SX150X_GPIO(4, 7), true);
2607 }
2608
2609 return 0;
2610}
2611late_initcall(rf4ce_gpio_init);
2612
Jay Chokshi1b7eaa92012-04-04 14:53:14 -07002613static struct platform_device *mpq_devices[] __initdata = {
2614 &msm_device_sps_apq8064,
2615 &mpq8064_device_qup_i2c_gsbi5,
2616#ifdef CONFIG_MSM_ROTATOR
2617 &msm_rotator_device,
2618#endif
Ravi Kumar V05931a22012-04-04 17:09:37 +05302619 &gpio_ir_recv_pdev,
Jay Chokshi1b7eaa92012-04-04 14:53:14 -07002620 &mpq8064_device_ext_1p2_buck_vreg,
2621 &mpq8064_device_ext_1p8_buck_vreg,
2622 &mpq8064_device_ext_2p2_buck_vreg,
2623 &mpq8064_device_ext_5v_buck_vreg,
2624 &mpq8064_device_ext_3p3v_ldo_vreg,
Terence Hampson2e1705f2012-04-11 19:55:29 -04002625#ifdef CONFIG_MSM_VCAP
2626 &msm8064_device_vcap,
2627#endif
Ravi Kumar V1c903012012-05-15 16:11:35 +05302628 &rc_input_loopback_pdev,
Jay Chokshi1b7eaa92012-04-04 14:53:14 -07002629};
2630
Harini Jayaramanc4c58692011-07-19 14:50:10 -06002631static struct msm_spi_platform_data apq8064_qup_spi_gsbi5_pdata = {
Stepan Moskovchenkoc71c9792012-01-31 18:12:44 -08002632 .max_clock_speed = 1100000,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002633};
2634
Stepan Moskovchenkoeed82a52011-09-02 13:19:23 -07002635#define KS8851_IRQ_GPIO 43
2636
2637static struct spi_board_info spi_board_info[] __initdata = {
2638 {
2639 .modalias = "ks8851",
2640 .irq = MSM_GPIO_TO_INT(KS8851_IRQ_GPIO),
2641 .max_speed_hz = 19200000,
2642 .bus_num = 0,
2643 .chip_select = 2,
2644 .mode = SPI_MODE_0,
2645 },
Siddartha Mohanadossb9df4942012-02-08 09:58:21 -08002646 {
2647 .modalias = "epm_adc",
2648 .max_speed_hz = 1100000,
2649 .bus_num = 0,
2650 .chip_select = 3,
2651 .mode = SPI_MODE_0,
2652 },
Stepan Moskovchenkoeed82a52011-09-02 13:19:23 -07002653};
2654
Sagar Dharia8bdcdaf2011-09-16 16:01:15 -06002655static struct slim_boardinfo apq8064_slim_devices[] = {
Swaminathan Sathappan2f51a752011-12-05 12:51:19 -08002656 {
Swaminathan Sathappancef966d2011-12-15 17:27:04 -08002657 .bus_num = 1,
2658 .slim_slave = &apq8064_slim_tabla,
2659 },
2660 {
2661 .bus_num = 1,
2662 .slim_slave = &apq8064_slim_tabla20,
Swaminathan Sathappan2f51a752011-12-05 12:51:19 -08002663 },
2664 /* add more slimbus slaves as needed */
Sagar Dharia8bdcdaf2011-09-16 16:01:15 -06002665};
2666
David Keitel3c40fc52012-02-09 17:53:52 -08002667static struct msm_i2c_platform_data apq8064_i2c_qup_gsbi1_pdata = {
2668 .clk_freq = 100000,
2669 .src_clk_rate = 24000000,
2670};
2671
Jing Lin04601f92012-02-05 15:36:07 -08002672static struct msm_i2c_platform_data apq8064_i2c_qup_gsbi3_pdata = {
Anirudh Ghayalc2163472012-04-10 14:58:14 +05302673 .clk_freq = 384000,
Jing Lin04601f92012-02-05 15:36:07 -08002674 .src_clk_rate = 24000000,
2675};
2676
Kenneth Heitke748593a2011-07-15 15:45:11 -06002677static struct msm_i2c_platform_data apq8064_i2c_qup_gsbi4_pdata = {
2678 .clk_freq = 100000,
2679 .src_clk_rate = 24000000,
Kenneth Heitke748593a2011-07-15 15:45:11 -06002680};
2681
Joel King8f839b92012-04-01 14:37:46 -07002682static struct msm_i2c_platform_data mpq8064_i2c_qup_gsbi5_pdata = {
2683 .clk_freq = 100000,
2684 .src_clk_rate = 24000000,
2685};
2686
David Keitel3c40fc52012-02-09 17:53:52 -08002687#define GSBI_DUAL_MODE_CODE 0x60
2688#define MSM_GSBI1_PHYS 0x12440000
Kenneth Heitke748593a2011-07-15 15:45:11 -06002689static void __init apq8064_i2c_init(void)
2690{
David Keitel3c40fc52012-02-09 17:53:52 -08002691 void __iomem *gsbi_mem;
2692
2693 apq8064_device_qup_i2c_gsbi1.dev.platform_data =
2694 &apq8064_i2c_qup_gsbi1_pdata;
2695 gsbi_mem = ioremap_nocache(MSM_GSBI1_PHYS, 4);
2696 writel_relaxed(GSBI_DUAL_MODE_CODE, gsbi_mem);
2697 /* Ensure protocol code is written before proceeding */
2698 wmb();
2699 iounmap(gsbi_mem);
2700 apq8064_i2c_qup_gsbi1_pdata.use_gsbi_shared_mode = 1;
Jing Lin04601f92012-02-05 15:36:07 -08002701 apq8064_device_qup_i2c_gsbi3.dev.platform_data =
2702 &apq8064_i2c_qup_gsbi3_pdata;
Siddartha Mohanadossb9df4942012-02-08 09:58:21 -08002703 apq8064_device_qup_i2c_gsbi1.dev.platform_data =
2704 &apq8064_i2c_qup_gsbi1_pdata;
Kenneth Heitke748593a2011-07-15 15:45:11 -06002705 apq8064_device_qup_i2c_gsbi4.dev.platform_data =
2706 &apq8064_i2c_qup_gsbi4_pdata;
Joel King8f839b92012-04-01 14:37:46 -07002707 mpq8064_device_qup_i2c_gsbi5.dev.platform_data =
2708 &mpq8064_i2c_qup_gsbi5_pdata;
Kenneth Heitke748593a2011-07-15 15:45:11 -06002709}
2710
Stepan Moskovchenkoc71c9792012-01-31 18:12:44 -08002711#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE)
Stepan Moskovchenkoeed82a52011-09-02 13:19:23 -07002712static int ethernet_init(void)
2713{
2714 int ret;
2715 ret = gpio_request(KS8851_IRQ_GPIO, "ks8851_irq");
2716 if (ret) {
2717 pr_err("ks8851 gpio_request failed: %d\n", ret);
2718 goto fail;
2719 }
2720
2721 return 0;
2722fail:
2723 return ret;
2724}
2725#else
2726static int ethernet_init(void)
2727{
2728 return 0;
2729}
2730#endif
2731
David Collins6f7c3472012-08-22 13:18:06 -07002732#define GPIO_KEY_HOME PM8921_GPIO_PM_TO_SYS(27)
2733#define GPIO_KEY_VOLUME_UP PM8921_GPIO_PM_TO_SYS(35)
2734#define GPIO_KEY_VOLUME_DOWN_PM8921 PM8921_GPIO_PM_TO_SYS(38)
2735#define GPIO_KEY_VOLUME_DOWN_PM8917 PM8921_GPIO_PM_TO_SYS(30)
2736#define GPIO_KEY_CAM_FOCUS PM8921_GPIO_PM_TO_SYS(3)
2737#define GPIO_KEY_CAM_SNAP PM8921_GPIO_PM_TO_SYS(4)
2738#define GPIO_KEY_ROTATION_PM8921 PM8921_GPIO_PM_TO_SYS(42)
2739#define GPIO_KEY_ROTATION_PM8917 PM8921_GPIO_PM_TO_SYS(8)
Mohan Pallaka474b94b2012-01-25 12:59:58 +05302740
David Collins6f7c3472012-08-22 13:18:06 -07002741static struct gpio_keys_button cdp_keys_pm8921[] = {
Mohan Pallaka474b94b2012-01-25 12:59:58 +05302742 {
2743 .code = KEY_HOME,
2744 .gpio = GPIO_KEY_HOME,
2745 .desc = "home_key",
2746 .active_low = 1,
2747 .type = EV_KEY,
2748 .wakeup = 1,
2749 .debounce_interval = 15,
2750 },
2751 {
2752 .code = KEY_VOLUMEUP,
2753 .gpio = GPIO_KEY_VOLUME_UP,
2754 .desc = "volume_up_key",
2755 .active_low = 1,
2756 .type = EV_KEY,
2757 .wakeup = 1,
2758 .debounce_interval = 15,
2759 },
2760 {
2761 .code = KEY_VOLUMEDOWN,
David Collins6f7c3472012-08-22 13:18:06 -07002762 .gpio = GPIO_KEY_VOLUME_DOWN_PM8921,
Mohan Pallaka474b94b2012-01-25 12:59:58 +05302763 .desc = "volume_down_key",
2764 .active_low = 1,
2765 .type = EV_KEY,
2766 .wakeup = 1,
2767 .debounce_interval = 15,
2768 },
2769 {
2770 .code = SW_ROTATE_LOCK,
David Collins6f7c3472012-08-22 13:18:06 -07002771 .gpio = GPIO_KEY_ROTATION_PM8921,
2772 .desc = "rotate_key",
2773 .active_low = 1,
2774 .type = EV_SW,
2775 .debounce_interval = 15,
2776 },
2777};
2778
2779static struct gpio_keys_button cdp_keys_pm8917[] = {
2780 {
2781 .code = KEY_HOME,
2782 .gpio = GPIO_KEY_HOME,
2783 .desc = "home_key",
2784 .active_low = 1,
2785 .type = EV_KEY,
2786 .wakeup = 1,
2787 .debounce_interval = 15,
2788 },
2789 {
2790 .code = KEY_VOLUMEUP,
2791 .gpio = GPIO_KEY_VOLUME_UP,
2792 .desc = "volume_up_key",
2793 .active_low = 1,
2794 .type = EV_KEY,
2795 .wakeup = 1,
2796 .debounce_interval = 15,
2797 },
2798 {
2799 .code = KEY_VOLUMEDOWN,
2800 .gpio = GPIO_KEY_VOLUME_DOWN_PM8917,
2801 .desc = "volume_down_key",
2802 .active_low = 1,
2803 .type = EV_KEY,
2804 .wakeup = 1,
2805 .debounce_interval = 15,
2806 },
2807 {
2808 .code = SW_ROTATE_LOCK,
2809 .gpio = GPIO_KEY_ROTATION_PM8917,
Mohan Pallaka474b94b2012-01-25 12:59:58 +05302810 .desc = "rotate_key",
2811 .active_low = 1,
2812 .type = EV_SW,
2813 .debounce_interval = 15,
2814 },
2815};
2816
2817static struct gpio_keys_platform_data cdp_keys_data = {
David Collins6f7c3472012-08-22 13:18:06 -07002818 .buttons = cdp_keys_pm8921,
2819 .nbuttons = ARRAY_SIZE(cdp_keys_pm8921),
Mohan Pallaka474b94b2012-01-25 12:59:58 +05302820};
2821
2822static struct platform_device cdp_kp_pdev = {
2823 .name = "gpio-keys",
2824 .id = -1,
2825 .dev = {
2826 .platform_data = &cdp_keys_data,
2827 },
2828};
2829
2830static struct gpio_keys_button mtp_keys[] = {
2831 {
2832 .code = KEY_CAMERA_FOCUS,
2833 .gpio = GPIO_KEY_CAM_FOCUS,
2834 .desc = "cam_focus_key",
2835 .active_low = 1,
2836 .type = EV_KEY,
2837 .wakeup = 1,
2838 .debounce_interval = 15,
2839 },
2840 {
2841 .code = KEY_VOLUMEUP,
2842 .gpio = GPIO_KEY_VOLUME_UP,
2843 .desc = "volume_up_key",
2844 .active_low = 1,
2845 .type = EV_KEY,
2846 .wakeup = 1,
2847 .debounce_interval = 15,
2848 },
2849 {
2850 .code = KEY_VOLUMEDOWN,
David Collins6f7c3472012-08-22 13:18:06 -07002851 .gpio = GPIO_KEY_VOLUME_DOWN_PM8921,
Mohan Pallaka474b94b2012-01-25 12:59:58 +05302852 .desc = "volume_down_key",
2853 .active_low = 1,
2854 .type = EV_KEY,
2855 .wakeup = 1,
2856 .debounce_interval = 15,
2857 },
2858 {
2859 .code = KEY_CAMERA_SNAPSHOT,
2860 .gpio = GPIO_KEY_CAM_SNAP,
2861 .desc = "cam_snap_key",
2862 .active_low = 1,
2863 .type = EV_KEY,
2864 .debounce_interval = 15,
2865 },
2866};
2867
2868static struct gpio_keys_platform_data mtp_keys_data = {
2869 .buttons = mtp_keys,
2870 .nbuttons = ARRAY_SIZE(mtp_keys),
2871};
2872
2873static struct platform_device mtp_kp_pdev = {
2874 .name = "gpio-keys",
2875 .id = -1,
2876 .dev = {
2877 .platform_data = &mtp_keys_data,
2878 },
2879};
2880
Anirudh Ghayal32ea6252012-04-26 16:39:50 +05302881static struct gpio_keys_button mpq_keys[] = {
2882 {
2883 .code = KEY_VOLUMEDOWN,
David Collins6f7c3472012-08-22 13:18:06 -07002884 .gpio = GPIO_KEY_VOLUME_DOWN_PM8921,
Anirudh Ghayal32ea6252012-04-26 16:39:50 +05302885 .desc = "volume_down_key",
2886 .active_low = 1,
2887 .type = EV_KEY,
2888 .wakeup = 1,
2889 .debounce_interval = 15,
2890 },
2891 {
2892 .code = KEY_VOLUMEUP,
2893 .gpio = GPIO_KEY_VOLUME_UP,
2894 .desc = "volume_up_key",
2895 .active_low = 1,
2896 .type = EV_KEY,
2897 .wakeup = 1,
2898 .debounce_interval = 15,
2899 },
2900};
2901
2902static struct gpio_keys_platform_data mpq_keys_data = {
2903 .buttons = mpq_keys,
2904 .nbuttons = ARRAY_SIZE(mpq_keys),
2905};
2906
2907static struct platform_device mpq_gpio_keys_pdev = {
2908 .name = "gpio-keys",
2909 .id = -1,
2910 .dev = {
2911 .platform_data = &mpq_keys_data,
2912 },
2913};
2914
2915#define MPQ_KP_ROW_BASE SX150X_EXP2_GPIO_BASE
2916#define MPQ_KP_COL_BASE (SX150X_EXP2_GPIO_BASE + 4)
2917
2918static unsigned int mpq_row_gpios[] = {MPQ_KP_ROW_BASE, MPQ_KP_ROW_BASE + 1,
2919 MPQ_KP_ROW_BASE + 2, MPQ_KP_ROW_BASE + 3};
2920static unsigned int mpq_col_gpios[] = {MPQ_KP_COL_BASE, MPQ_KP_COL_BASE + 1,
2921 MPQ_KP_COL_BASE + 2};
2922
2923static const unsigned int mpq_keymap[] = {
2924 KEY(0, 0, KEY_UP),
2925 KEY(0, 1, KEY_ENTER),
2926 KEY(0, 2, KEY_3),
2927
2928 KEY(1, 0, KEY_DOWN),
2929 KEY(1, 1, KEY_EXIT),
2930 KEY(1, 2, KEY_4),
2931
2932 KEY(2, 0, KEY_LEFT),
2933 KEY(2, 1, KEY_1),
2934 KEY(2, 2, KEY_5),
2935
2936 KEY(3, 0, KEY_RIGHT),
2937 KEY(3, 1, KEY_2),
2938 KEY(3, 2, KEY_6),
2939};
2940
2941static struct matrix_keymap_data mpq_keymap_data = {
2942 .keymap_size = ARRAY_SIZE(mpq_keymap),
2943 .keymap = mpq_keymap,
2944};
2945
2946static struct matrix_keypad_platform_data mpq_keypad_data = {
2947 .keymap_data = &mpq_keymap_data,
2948 .row_gpios = mpq_row_gpios,
2949 .col_gpios = mpq_col_gpios,
2950 .num_row_gpios = ARRAY_SIZE(mpq_row_gpios),
2951 .num_col_gpios = ARRAY_SIZE(mpq_col_gpios),
2952 .col_scan_delay_us = 32000,
2953 .debounce_ms = 20,
2954 .wakeup = 1,
2955 .active_low = 1,
2956 .no_autorepeat = 1,
2957};
2958
2959static struct platform_device mpq_keypad_device = {
2960 .name = "matrix-keypad",
2961 .id = -1,
2962 .dev = {
2963 .platform_data = &mpq_keypad_data,
2964 },
2965};
2966
Jin Hongd3024e62012-02-09 16:13:32 -08002967/* Sensors DSPS platform data */
2968#define DSPS_PIL_GENERIC_NAME "dsps"
2969static void __init apq8064_init_dsps(void)
2970{
2971 struct msm_dsps_platform_data *pdata =
2972 msm_dsps_device_8064.dev.platform_data;
2973 pdata->pil_name = DSPS_PIL_GENERIC_NAME;
2974 pdata->gpios = NULL;
2975 pdata->gpios_num = 0;
2976
2977 platform_device_register(&msm_dsps_device_8064);
2978}
Mohan Pallaka474b94b2012-01-25 12:59:58 +05302979
Jing Lin417fa452012-02-05 14:31:06 -08002980#define I2C_SURF 1
2981#define I2C_FFA (1 << 1)
2982#define I2C_RUMI (1 << 2)
2983#define I2C_SIM (1 << 3)
2984#define I2C_LIQUID (1 << 4)
Jay Chokshie7d8d4f2012-04-04 14:47:57 -07002985#define I2C_MPQ_CDP BIT(5)
2986#define I2C_MPQ_HRD BIT(6)
2987#define I2C_MPQ_DTV BIT(7)
Jing Lin417fa452012-02-05 14:31:06 -08002988
2989struct i2c_registry {
2990 u8 machs;
2991 int bus;
2992 struct i2c_board_info *info;
2993 int len;
2994};
2995
2996static struct i2c_registry apq8064_i2c_devices[] __initdata = {
Jing Lin21ed4de2012-02-05 15:53:28 -08002997 {
David Keitel2f613d92012-02-15 11:29:16 -08002998 I2C_LIQUID,
2999 APQ_8064_GSBI1_QUP_I2C_BUS_ID,
3000 smb349_charger_i2c_info,
3001 ARRAY_SIZE(smb349_charger_i2c_info)
3002 },
3003 {
Jing Lin21ed4de2012-02-05 15:53:28 -08003004 I2C_SURF | I2C_LIQUID,
3005 APQ_8064_GSBI3_QUP_I2C_BUS_ID,
3006 mxt_device_info,
3007 ARRAY_SIZE(mxt_device_info),
3008 },
Anirudh Ghayal2917a5a2012-02-05 19:51:07 -08003009 {
3010 I2C_FFA,
3011 APQ_8064_GSBI3_QUP_I2C_BUS_ID,
3012 cyttsp_info,
3013 ARRAY_SIZE(cyttsp_info),
3014 },
Amy Maloche70090f992012-02-16 16:35:26 -08003015 {
3016 I2C_FFA | I2C_LIQUID,
3017 APQ_8064_GSBI1_QUP_I2C_BUS_ID,
3018 isa1200_board_info,
3019 ARRAY_SIZE(isa1200_board_info),
3020 },
Santosh Mardieff9a742012-04-09 23:23:39 +05303021 {
3022 I2C_MPQ_CDP,
3023 APQ_8064_GSBI5_QUP_I2C_BUS_ID,
3024 cs8427_device_info,
3025 ARRAY_SIZE(cs8427_device_info),
3026 },
Jing Lin417fa452012-02-05 14:31:06 -08003027};
3028
Jay Chokshi607f61b2012-04-25 18:21:21 -07003029#define SX150X_EXP1_INT_N PM8921_MPP_IRQ(PM8921_IRQ_BASE, 9)
Anirudh Ghayal9f1aaa72012-04-26 18:15:08 +05303030#define SX150X_EXP2_INT_N MSM_GPIO_TO_INT(81)
Jay Chokshi607f61b2012-04-25 18:21:21 -07003031
Jay Chokshie7d8d4f2012-04-04 14:47:57 -07003032struct sx150x_platform_data mpq8064_sx150x_pdata[] = {
3033 [SX150X_EXP1] = {
3034 .gpio_base = SX150X_EXP1_GPIO_BASE,
3035 .oscio_is_gpo = false,
3036 .io_pullup_ena = 0x0,
3037 .io_pulldn_ena = 0x0,
3038 .io_open_drain_ena = 0x0,
3039 .io_polarity = 0,
Jay Chokshi607f61b2012-04-25 18:21:21 -07003040 .irq_summary = SX150X_EXP1_INT_N,
3041 .irq_base = SX150X_EXP1_IRQ_BASE,
Jay Chokshie7d8d4f2012-04-04 14:47:57 -07003042 },
3043 [SX150X_EXP2] = {
3044 .gpio_base = SX150X_EXP2_GPIO_BASE,
3045 .oscio_is_gpo = false,
Anirudh Ghayal32ea6252012-04-26 16:39:50 +05303046 .io_pullup_ena = 0x0f,
3047 .io_pulldn_ena = 0x70,
Jay Chokshie7d8d4f2012-04-04 14:47:57 -07003048 .io_open_drain_ena = 0x0,
3049 .io_polarity = 0,
Anirudh Ghayal9f1aaa72012-04-26 18:15:08 +05303050 .irq_summary = SX150X_EXP2_INT_N,
3051 .irq_base = SX150X_EXP2_IRQ_BASE,
Jay Chokshie7d8d4f2012-04-04 14:47:57 -07003052 },
3053 [SX150X_EXP3] = {
3054 .gpio_base = SX150X_EXP3_GPIO_BASE,
3055 .oscio_is_gpo = false,
3056 .io_pullup_ena = 0x0,
3057 .io_pulldn_ena = 0x0,
3058 .io_open_drain_ena = 0x0,
3059 .io_polarity = 0,
3060 .irq_summary = -1,
3061 },
3062 [SX150X_EXP4] = {
3063 .gpio_base = SX150X_EXP4_GPIO_BASE,
3064 .oscio_is_gpo = false,
3065 .io_pullup_ena = 0x0,
3066 .io_pulldn_ena = 0x0,
3067 .io_open_drain_ena = 0x0,
3068 .io_polarity = 0,
3069 .irq_summary = -1,
3070 },
3071};
3072
3073static struct i2c_board_info sx150x_gpio_exp_info[] = {
3074 {
3075 I2C_BOARD_INFO("sx1509q", 0x70),
3076 .platform_data = &mpq8064_sx150x_pdata[SX150X_EXP1],
3077 },
3078 {
3079 I2C_BOARD_INFO("sx1508q", 0x23),
3080 .platform_data = &mpq8064_sx150x_pdata[SX150X_EXP2],
3081 },
3082 {
3083 I2C_BOARD_INFO("sx1508q", 0x22),
3084 .platform_data = &mpq8064_sx150x_pdata[SX150X_EXP3],
3085 },
3086 {
3087 I2C_BOARD_INFO("sx1509q", 0x3E),
3088 .platform_data = &mpq8064_sx150x_pdata[SX150X_EXP4],
3089 },
3090};
3091
3092#define MPQ8064_I2C_GSBI5_BUS_ID 5
3093
3094static struct i2c_registry mpq8064_i2c_devices[] __initdata = {
3095 {
3096 I2C_MPQ_CDP,
3097 MPQ8064_I2C_GSBI5_BUS_ID,
3098 sx150x_gpio_exp_info,
3099 ARRAY_SIZE(sx150x_gpio_exp_info),
3100 },
3101};
3102
Jing Lin417fa452012-02-05 14:31:06 -08003103static void __init register_i2c_devices(void)
3104{
3105 u8 mach_mask = 0;
3106 int i;
3107
Kevin Chand07220e2012-02-13 15:52:22 -08003108#ifdef CONFIG_MSM_CAMERA
3109 struct i2c_registry apq8064_camera_i2c_devices = {
3110 I2C_SURF | I2C_FFA | I2C_LIQUID | I2C_RUMI,
3111 APQ_8064_GSBI4_QUP_I2C_BUS_ID,
3112 apq8064_camera_board_info.board_info,
3113 apq8064_camera_board_info.num_i2c_board_info,
3114 };
3115#endif
Jing Lin417fa452012-02-05 14:31:06 -08003116 /* Build the matching 'supported_machs' bitmask */
3117 if (machine_is_apq8064_cdp())
3118 mach_mask = I2C_SURF;
3119 else if (machine_is_apq8064_mtp())
3120 mach_mask = I2C_FFA;
3121 else if (machine_is_apq8064_liquid())
3122 mach_mask = I2C_LIQUID;
Jay Chokshie7d8d4f2012-04-04 14:47:57 -07003123 else if (PLATFORM_IS_MPQ8064())
3124 mach_mask = I2C_MPQ_CDP;
Jing Lin417fa452012-02-05 14:31:06 -08003125 else
3126 pr_err("unmatched machine ID in register_i2c_devices\n");
3127
3128 /* Run the array and install devices as appropriate */
3129 for (i = 0; i < ARRAY_SIZE(apq8064_i2c_devices); ++i) {
3130 if (apq8064_i2c_devices[i].machs & mach_mask)
3131 i2c_register_board_info(apq8064_i2c_devices[i].bus,
3132 apq8064_i2c_devices[i].info,
3133 apq8064_i2c_devices[i].len);
3134 }
Kevin Chand07220e2012-02-13 15:52:22 -08003135#ifdef CONFIG_MSM_CAMERA
3136 if (apq8064_camera_i2c_devices.machs & mach_mask)
3137 i2c_register_board_info(apq8064_camera_i2c_devices.bus,
3138 apq8064_camera_i2c_devices.info,
3139 apq8064_camera_i2c_devices.len);
3140#endif
Jay Chokshie7d8d4f2012-04-04 14:47:57 -07003141
3142 for (i = 0; i < ARRAY_SIZE(mpq8064_i2c_devices); ++i) {
3143 if (mpq8064_i2c_devices[i].machs & mach_mask)
3144 i2c_register_board_info(
3145 mpq8064_i2c_devices[i].bus,
3146 mpq8064_i2c_devices[i].info,
3147 mpq8064_i2c_devices[i].len);
3148 }
Jing Lin417fa452012-02-05 14:31:06 -08003149}
3150
Jay Chokshie7d8d4f2012-04-04 14:47:57 -07003151static void enable_avc_i2c_bus(void)
3152{
3153 int avc_i2c_en_mpp = PM8921_MPP_PM_TO_SYS(8);
3154 int rc;
3155
3156 rc = gpio_request(avc_i2c_en_mpp, "avc_i2c_en");
3157 if (rc)
3158 pr_err("request for avc_i2c_en mpp failed,"
3159 "rc=%d\n", rc);
3160 else
3161 gpio_set_value_cansleep(avc_i2c_en_mpp, 1);
3162}
3163
David Collins6f7c3472012-08-22 13:18:06 -07003164/* Modify platform data values to match requirements for PM8917. */
3165static void __init apq8064_pm8917_pdata_fixup(void)
3166{
3167 cdp_keys_data.buttons = cdp_keys_pm8917;
3168 cdp_keys_data.nbuttons = ARRAY_SIZE(cdp_keys_pm8917);
3169}
3170
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003171static void __init apq8064_common_init(void)
3172{
Ameya Thakur2702baf2013-01-30 11:55:25 -08003173 u32 platform_version = socinfo_get_platform_version();
David Collins6f7c3472012-08-22 13:18:06 -07003174
3175 if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917)
3176 apq8064_pm8917_pdata_fixup();
Rohit Vaswanib1cc4932012-07-23 21:30:11 -07003177 platform_device_register(&msm_gpio_device);
Joel King8f839b92012-04-01 14:37:46 -07003178 msm_tsens_early_init(&apq_tsens_pdata);
Praveen Chidambaram877d7a42012-06-05 14:33:20 -06003179 msm_thermal_init(&msm_thermal_pdata);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003180 if (socinfo_init() < 0)
3181 pr_err("socinfo_init() failed!\n");
Praveen Chidambaram78499012011-11-01 17:15:17 -06003182 BUG_ON(msm_rpm_init(&apq8064_rpm_data));
3183 BUG_ON(msm_rpmrs_levels_init(&msm_rpmrs_data));
David Collins2782b5c2012-02-06 10:02:42 -08003184 regulator_suppress_info_printing();
David Collins36199252012-08-21 15:43:02 -07003185 if (socinfo_get_pmic_model() == PMIC_MODEL_PM8917)
3186 configure_apq8064_pm8917_power_grid();
David Collins2782b5c2012-02-06 10:02:42 -08003187 platform_device_register(&apq8064_device_rpm_regulator);
David Collins36199252012-08-21 15:43:02 -07003188 if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917)
3189 platform_device_register(&apq8064_pm8921_device_rpm_regulator);
Stephen Boyd4d0d2582012-02-10 14:49:40 -08003190 if (msm_xo_init())
3191 pr_err("Failed to initialize XO votes\n");
Matt Wagantallc51e5602012-02-27 17:25:25 -08003192 msm_clock_init(&apq8064_clock_init_data);
Stepan Moskovchenko2327a952011-12-14 16:31:28 -08003193 apq8064_init_gpiomux();
Kenneth Heitke748593a2011-07-15 15:45:11 -06003194 apq8064_i2c_init();
Jing Lin417fa452012-02-05 14:31:06 -08003195 register_i2c_devices();
Kenneth Heitke36920d32011-07-20 16:44:30 -06003196
Harini Jayaramanc4c58692011-07-19 14:50:10 -06003197 apq8064_device_qup_spi_gsbi5.dev.platform_data =
3198 &apq8064_qup_spi_gsbi5_pdata;
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -08003199 apq8064_init_pmic();
Hemant Kumar94e7da22012-02-03 16:52:29 -08003200 if (machine_is_apq8064_liquid())
3201 msm_otg_pdata.mhl_enable = true;
Vamsi Krishnad9863eb2012-03-26 17:34:48 -07003202
Ofir Cohen94213a72012-05-03 14:26:32 +03003203 android_usb_pdata.swfi_latency =
3204 msm_rpmrs_levels[0].latency_us;
Vamsi Krishnad9863eb2012-03-26 17:34:48 -07003205
Stepan Moskovchenko14aa6492011-08-08 15:15:01 -07003206 apq8064_device_otg.dev.platform_data = &msm_otg_pdata;
Manu Gautam91223e02011-11-08 15:27:22 +05303207 apq8064_ehci_host_init();
Gagan Mac8a7a5d32011-11-11 16:43:06 -07003208 apq8064_init_buses();
David Collins36199252012-08-21 15:43:02 -07003209
3210 platform_add_devices(early_common_devices,
3211 ARRAY_SIZE(early_common_devices));
3212 if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917)
3213 platform_add_devices(pm8921_common_devices,
3214 ARRAY_SIZE(pm8921_common_devices));
3215 else
3216 platform_add_devices(pm8917_common_devices,
3217 ARRAY_SIZE(pm8917_common_devices));
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003218 platform_add_devices(common_devices, ARRAY_SIZE(common_devices));
Terence Hampson36b70722012-05-10 13:18:16 -04003219 if (!(machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() ||
3220 machine_is_mpq8064_dtv()))
3221 platform_add_devices(common_not_mpq_devices,
3222 ARRAY_SIZE(common_not_mpq_devices));
Pavankumar Kondetife2d4d32012-09-07 15:33:09 +05303223 msm_hsic_pdata.swfi_latency =
3224 msm_rpmrs_levels[0].latency_us;
Hemant Kumarf1ca9192012-02-07 18:59:33 -08003225 if (machine_is_apq8064_mtp()) {
Ajay Dudanic4e40db2012-08-20 14:44:40 -07003226 msm_hsic_pdata.log2_irq_thresh = 5,
Hemant Kumarf1ca9192012-02-07 18:59:33 -08003227 apq8064_device_hsic_host.dev.platform_data = &msm_hsic_pdata;
3228 device_initialize(&apq8064_device_hsic_host.dev);
Ameya Thakur2702baf2013-01-30 11:55:25 -08003229 if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_DSDA2) {
3230 apq8064_device_ehci_host3.dev.platform_data =
3231 &msm_ehci_host_pdata3;
3232 device_initialize(&apq8064_device_ehci_host3.dev);
3233 }
Hemant Kumarf1ca9192012-02-07 18:59:33 -08003234 }
Jay Chokshie8741282012-01-25 15:22:55 -08003235 apq8064_pm8xxx_gpio_mpp_init();
Sahitya Tummala3586ed92011-08-03 09:13:23 +05303236 apq8064_init_mmc();
Swaminathan Sathappan144b4882012-02-06 17:01:20 -08003237
3238 if (machine_is_apq8064_mtp()) {
Ameya Thakur2702baf2013-01-30 11:55:25 -08003239 if (socinfo_get_platform_subtype() == PLATFORM_SUBTYPE_DSDA2) {
3240 amdm_8064_device.dev.platform_data = &mdm_platform_data;
3241 platform_device_register(&amdm_8064_device);
3242 bmdm_8064_device.dev.platform_data =
3243 &bmdm_platform_data;
3244 platform_device_register(&bmdm_8064_device);
3245 } else if (SOCINFO_VERSION_MINOR(platform_version) == 1) {
Ameya Thakure155ece2012-07-09 12:08:37 -07003246 i2s_mdm_8064_device.dev.platform_data =
3247 &mdm_platform_data;
3248 platform_device_register(&i2s_mdm_8064_device);
3249 } else {
3250 mdm_8064_device.dev.platform_data = &mdm_platform_data;
3251 platform_device_register(&mdm_8064_device);
3252 }
Swaminathan Sathappan144b4882012-02-06 17:01:20 -08003253 }
3254 platform_device_register(&apq8064_slim_ctrl);
Sagar Dharia8bdcdaf2011-09-16 16:01:15 -06003255 slim_register_board_info(apq8064_slim_devices,
3256 ARRAY_SIZE(apq8064_slim_devices));
Taniya Dasbbf633d2012-07-31 16:07:47 +05303257 if (!PLATFORM_IS_MPQ8064()) {
Taniya Das30cae292012-07-31 15:56:12 +05303258 apq8064_init_dsps();
Taniya Dasbbf633d2012-07-31 16:07:47 +05303259 platform_device_register(&msm_8960_riva);
3260 }
Anji Jonnala0f297a92013-01-19 11:22:25 +05303261 if (cpu_is_apq8064ab())
3262 apq8064ab_update_krait_spm();
Praveen Chidambaram78499012011-11-01 17:15:17 -06003263 msm_spm_init(msm_spm_data, ARRAY_SIZE(msm_spm_data));
3264 msm_spm_l2_init(msm_spm_l2_data);
Praveen Chidambaram78499012011-11-01 17:15:17 -06003265 BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata));
Siddartha Mohanadossb9df4942012-02-08 09:58:21 -08003266 apq8064_epm_adc_init();
Anji Jonnala85b29ff2013-01-15 14:12:45 +05303267 msm_pm_set_tz_retention_flag(1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003268}
3269
Huaibin Yang4a084e32011-12-15 15:25:52 -08003270static void __init apq8064_allocate_memory_regions(void)
3271{
3272 apq8064_allocate_fb_region();
3273}
3274
Joel King82b7e3f2012-01-05 10:03:27 -08003275static void __init apq8064_cdp_init(void)
3276{
Hanumant Singh50440d42012-04-23 19:27:16 -07003277 if (meminfo_init(SYS_MEMORY, SZ_256M) < 0)
3278 pr_err("meminfo_init() failed!\n");
Amy Maloche609bb5e2012-08-03 09:41:42 -07003279 if (machine_is_apq8064_mtp() &&
3280 SOCINFO_VERSION_MINOR(socinfo_get_platform_version()) == 1)
3281 cyttsp_pdata.sleep_gpio = CYTTSP_TS_GPIO_SLEEP_ALT;
Joel King82b7e3f2012-01-05 10:03:27 -08003282 apq8064_common_init();
Joel King8f839b92012-04-01 14:37:46 -07003283 if (machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd() ||
3284 machine_is_mpq8064_dtv()) {
Jay Chokshie7d8d4f2012-04-04 14:47:57 -07003285 enable_avc_i2c_bus();
Olav Hauganef95ae32012-05-15 09:50:30 -07003286 msm_rotator_set_split_iommu_domain();
Joel King8f839b92012-04-01 14:37:46 -07003287 platform_add_devices(mpq_devices, ARRAY_SIZE(mpq_devices));
Niranjana Vishwanathapura06f89332012-05-03 17:11:13 -06003288 mpq8064_pcie_init();
Joel King8f839b92012-04-01 14:37:46 -07003289 } else {
3290 ethernet_init();
Olav Hauganef95ae32012-05-15 09:50:30 -07003291 msm_rotator_set_split_iommu_domain();
Joel King8f839b92012-04-01 14:37:46 -07003292 platform_add_devices(cdp_devices, ARRAY_SIZE(cdp_devices));
3293 spi_register_board_info(spi_board_info,
3294 ARRAY_SIZE(spi_board_info));
3295 }
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -08003296 apq8064_init_fb();
Jordan Crouseb3115fe2012-02-01 22:11:12 -07003297 apq8064_init_gpu();
Matt Wagantall1f65d9d2012-04-25 14:24:20 -07003298 platform_add_devices(apq8064_footswitch, apq8064_num_footswitch);
Steve Mucklef132c6c2012-06-06 18:30:57 -07003299#ifdef CONFIG_MSM_CAMERA
Kevin Chand07220e2012-02-13 15:52:22 -08003300 apq8064_init_cam();
Steve Mucklef132c6c2012-06-06 18:30:57 -07003301#endif
Mohan Pallaka474b94b2012-01-25 12:59:58 +05303302
3303 if (machine_is_apq8064_cdp() || machine_is_apq8064_liquid())
3304 platform_device_register(&cdp_kp_pdev);
3305
3306 if (machine_is_apq8064_mtp())
3307 platform_device_register(&mtp_kp_pdev);
Hanumant Singh50440d42012-04-23 19:27:16 -07003308
3309 change_memory_power = &apq8064_change_memory_power;
Anirudh Ghayal32ea6252012-04-26 16:39:50 +05303310
3311 if (machine_is_mpq8064_cdp()) {
3312 platform_device_register(&mpq_gpio_keys_pdev);
3313 platform_device_register(&mpq_keypad_device);
3314 }
Joel King82b7e3f2012-01-05 10:03:27 -08003315}
3316
Joel King82b7e3f2012-01-05 10:03:27 -08003317MACHINE_START(APQ8064_CDP, "QCT APQ8064 CDP")
3318 .map_io = apq8064_map_io,
3319 .reserve = apq8064_reserve,
3320 .init_irq = apq8064_init_irq,
3321 .handle_irq = gic_handle_irq,
3322 .timer = &msm_timer,
3323 .init_machine = apq8064_cdp_init,
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -08003324 .init_early = apq8064_allocate_memory_regions,
Laura Abbott6988cef2012-03-15 14:27:13 -07003325 .init_very_early = apq8064_early_reserve,
Jeff Ohlsteindd0dd9b2012-05-29 17:47:21 -07003326 .restart = msm_restart,
Joel King82b7e3f2012-01-05 10:03:27 -08003327MACHINE_END
3328
3329MACHINE_START(APQ8064_MTP, "QCT APQ8064 MTP")
3330 .map_io = apq8064_map_io,
3331 .reserve = apq8064_reserve,
3332 .init_irq = apq8064_init_irq,
3333 .handle_irq = gic_handle_irq,
3334 .timer = &msm_timer,
3335 .init_machine = apq8064_cdp_init,
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -08003336 .init_early = apq8064_allocate_memory_regions,
Laura Abbott6988cef2012-03-15 14:27:13 -07003337 .init_very_early = apq8064_early_reserve,
Jeff Ohlsteindd0dd9b2012-05-29 17:47:21 -07003338 .restart = msm_restart,
Joel King82b7e3f2012-01-05 10:03:27 -08003339MACHINE_END
3340
3341MACHINE_START(APQ8064_LIQUID, "QCT APQ8064 LIQUID")
3342 .map_io = apq8064_map_io,
3343 .reserve = apq8064_reserve,
3344 .init_irq = apq8064_init_irq,
3345 .handle_irq = gic_handle_irq,
3346 .timer = &msm_timer,
3347 .init_machine = apq8064_cdp_init,
Ravishangar Kalyanamc2fee312012-02-09 19:11:22 -08003348 .init_early = apq8064_allocate_memory_regions,
Laura Abbott6988cef2012-03-15 14:27:13 -07003349 .init_very_early = apq8064_early_reserve,
Jeff Ohlsteindd0dd9b2012-05-29 17:47:21 -07003350 .restart = msm_restart,
Joel King82b7e3f2012-01-05 10:03:27 -08003351MACHINE_END
3352
Joel King064bbf82012-04-01 13:23:39 -07003353MACHINE_START(MPQ8064_CDP, "QCT MPQ8064 CDP")
3354 .map_io = apq8064_map_io,
3355 .reserve = apq8064_reserve,
3356 .init_irq = apq8064_init_irq,
3357 .handle_irq = gic_handle_irq,
3358 .timer = &msm_timer,
3359 .init_machine = apq8064_cdp_init,
3360 .init_early = apq8064_allocate_memory_regions,
3361 .init_very_early = apq8064_early_reserve,
Jeff Ohlsteindd0dd9b2012-05-29 17:47:21 -07003362 .restart = msm_restart,
Joel King064bbf82012-04-01 13:23:39 -07003363MACHINE_END
3364
Joel King11ca8202012-02-13 16:19:03 -08003365MACHINE_START(MPQ8064_HRD, "QCT MPQ8064 HRD")
3366 .map_io = apq8064_map_io,
3367 .reserve = apq8064_reserve,
3368 .init_irq = apq8064_init_irq,
3369 .handle_irq = gic_handle_irq,
3370 .timer = &msm_timer,
3371 .init_machine = apq8064_cdp_init,
Joel King3a57e772012-05-28 11:22:55 -07003372 .init_early = apq8064_allocate_memory_regions,
Laura Abbott6988cef2012-03-15 14:27:13 -07003373 .init_very_early = apq8064_early_reserve,
Jeff Ohlsteindd0dd9b2012-05-29 17:47:21 -07003374 .restart = msm_restart,
Joel King11ca8202012-02-13 16:19:03 -08003375MACHINE_END
3376
3377MACHINE_START(MPQ8064_DTV, "QCT MPQ8064 DTV")
3378 .map_io = apq8064_map_io,
3379 .reserve = apq8064_reserve,
3380 .init_irq = apq8064_init_irq,
3381 .handle_irq = gic_handle_irq,
3382 .timer = &msm_timer,
3383 .init_machine = apq8064_cdp_init,
Joel King3a57e772012-05-28 11:22:55 -07003384 .init_early = apq8064_allocate_memory_regions,
Laura Abbott6988cef2012-03-15 14:27:13 -07003385 .init_very_early = apq8064_early_reserve,
Jeff Ohlsteindd0dd9b2012-05-29 17:47:21 -07003386 .restart = msm_restart,
Joel King11ca8202012-02-13 16:19:03 -08003387MACHINE_END
3388