All pastes #2133489 Raw Edit

Thunderg Board

public c v1 · immutable
#2133489 ·published 2012-03-29 04:48 UTC
rendered paste body
/* * Copyright (C) 2008 Google, Inc. * Copyright (c) 2008-2012, Code Aurora Forum. All rights reserved. * Author: Brian Swetland <swetland@google.com> * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * */#include <linux/kernel.h>#include <linux/gpio.h>#include <linux/init.h>#include <linux/platform_device.h>#include <linux/input.h>#include <linux/io.h>#include <linux/delay.h>#include <linux/bootmem.h>#include <linux/power_supply.h>#include <mach/msm_memtypes.h>#include <mach/hardware.h>#include <asm/mach-types.h>#include <asm/mach/arch.h>#include <asm/mach/map.h>#include <asm/mach/flash.h>#include <asm/setup.h>#include <asm/mach/mmc.h>#include <mach/vreg.h>#include <mach/mpp.h>#include <mach/board.h>#include <mach/pmic.h>#include <mach/msm_iomap.h>#include <mach/msm_rpcrouter.h>#include <mach/msm_hsusb.h>#include <mach/rpc_hsusb.h>#include <mach/rpc_pmapp.h>#include <mach/msm_serial_hs.h>#include <mach/memory.h>#include <mach/msm_battery.h>#include <mach/rpc_server_handset.h>#include <mach/msm_tsif.h>#include <mach/socinfo.h>#include <linux/msm_kgsl.h>#include <mach/dma.h>#include <mach/irqs.h>#include <asm/clkdev.h>#include <linux/dma-mapping.h>#include <linux/mtd/nand.h>#include <linux/mtd/partitions.h>#include <linux/i2c.h>#include <linux/android_pmem.h>#include <mach/camera.h>#ifdef CONFIG_CACHE_L2X0#include <asm/hardware/cache-l2x0.h>#endif#ifdef CONFIG_USB_G_ANDROID#include <linux/usb/android.h>#include <mach/usbdiag.h>#endif#ifdef CONFIG_USB_ANDROID#include <linux/usb/android_composite.h>#endif#include "devices.h"#include "clock.h"#include "acpuclock.h"#include "msm-keypad-devices.h"#include "pm.h"#include "pm-boot.h"#ifdef CONFIG_ARCH_MSM7X27#define MSM_PMEM_MDP_SIZE	0x1B76000#define MSM_PMEM_ADSP_SIZE	0xC8A000#define MSM_PMEM_AUDIO_SIZE	0x5B000#ifdef CONFIG_FB_MSM_TRIPLE_BUFFER#define MSM_FB_SIZE		0xE1000#else#define MSM_FB_SIZE		0x96000#endif#define PMEM_KERNEL_EBI1_SIZE	0x1C000#endif#define ADSP_RPC_PROG           0x3000000aint i2c_bus_num=2;/*+++++++++++++++++++++++++++++++++++++++++++++++++++Android Composite USB Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/#ifdef CONFIG_USB_ANDROIDchar *usb_functions_lge_all[] = {	#ifdef CONFIG_USB_ANDROID_MTP		"mtp",	#endif	#ifdef CONFIG_USB_ANDROID_RNDIS		"rndis",	#endif	#ifdef CONFIG_USB_ANDROID_ACM		"acm",	#endif	#ifdef CONFIG_USB_ANDROID_DIAG		"diag",	#endif	#ifdef CONFIG_USB_ANDROID_CDC_ECM		"ecm",		"acm2",	#endif	#ifdef CONFIG_USB_F_SERIAL		"nmea",	#endif	#ifdef CONFIG_USB_SUPPORT_LGE_ANDROID_AUTORUN		"usb_cdrom_storage",		"charge_only",	#endif		"usb_mass_storage",		"adb",};char *usb_functions_lge_android_plat[] = {	"acm", "diag", "nmea", "usb_mass_storage",};char *usb_functions_lge_android_plat_adb[] = {	"acm", "diag", "nmea", "usb_mass_storage", "adb",};#ifdef CONFIG_USB_ANDROID_CDC_ECMchar *usb_functions_lge_android_net[] = {	"diag", "ecm", "acm2", "nmea", "usb_mass_storage",};char *usb_functions_lge_android_net_adb[] = {	"diag", "ecm", "acm2", "nmea", "usb_mass_storage", "adb",};#endif#ifdef CONFIG_USB_ANDROID_RNDISchar *usb_functions_lge_android_rndis[] = {	"rndis",};char *usb_functions_lge_android_rndis_adb[] = {	"rndis", "adb",};#endif#ifdef CONFIG_USB_ANDROID_MTPchar *usb_functions_lge_android_mtp[] = {	"mtp",};char *usb_functions_lge_android_mtp_adb[] = {	"mtp", "adb",};#endifchar *usb_functions_lge_manufacturing[] = {	"acm", "diag",};char *usb_functions_lge_mass_storage_only[] = {	"usb_mass_storage",};#ifdef CONFIG_USB_SUPPORT_LGE_ANDROID_AUTORUNchar *usb_functions_lge_cdrom_storage_only[] = {	"usb_cdrom_storage",};char *usb_functions_lge_cdrom_storage_adb[] = {	"usb_cdrom_storage", "adb",};char *usb_functions_lge_charge_only[] = {	"charge_only",};#endifstruct android_usb_product usb_products[] = {	{		.product_id = 0x618E,		.num_functions = ARRAY_SIZE(usb_functions_lge_android_plat),		.functions = usb_functions_lge_android_plat,	},	{		.product_id = 0x618E,		.num_functions = ARRAY_SIZE(usb_functions_lge_android_plat_adb),		.functions = usb_functions_lge_android_plat_adb,	},	#ifdef CONFIG_USB_ANDROID_CDC_ECM	{		.product_id = 0x61A2,		.num_functions = ARRAY_SIZE(usb_functions_lge_android_net),		.functions = usb_functions_lge_android_net,	},	{		.product_id = 0x61A1,		.num_functions = ARRAY_SIZE(usb_functions_lge_android_net_adb),		.functions = usb_functions_lge_android_net_adb,	},	#endif	#ifdef CONFIG_USB_ANDROID_RNDIS	{		.product_id = 0x61DA,		.num_functions = ARRAY_SIZE(usb_functions_lge_android_rndis),		.functions = usb_functions_lge_android_rndis,	},	{		.product_id = 0x61D9,		.num_functions = ARRAY_SIZE(usb_functions_lge_android_rndis_adb),		.functions = usb_functions_lge_android_rndis_adb,	},	#endif	#ifdef CONFIG_USB_ANDROID_MTP	{		.product_id = 0x61C7,		.num_functions = ARRAY_SIZE(usb_functions_lge_android_mtp),		.functions = usb_functions_lge_android_mtp,	},	{		.product_id = 0x61F9,		.num_functions = ARRAY_SIZE(usb_functions_lge_android_mtp_adb),		.functions = usb_functions_lge_android_mtp_adb,	},	#endif	{		.product_id = 0x6000,		.num_functions = ARRAY_SIZE(usb_functions_lge_manufacturing),		.functions = usb_functions_lge_manufacturing,	},	{		.product_id = 0x61C5,		.num_functions = ARRAY_SIZE(usb_functions_lge_mass_storage_only),		.functions = usb_functions_lge_mass_storage_only,	},	#ifdef CONFIG_USB_SUPPORT_LGE_ANDROID_AUTORUN	{		.product_id = 0x91C8,		.num_functions = ARRAY_SIZE(usb_functions_lge_cdrom_storage_only),		.functions = usb_functions_lge_cdrom_storage_only,	},	{		.product_id = 0x61A6,		.num_functions = ARRAY_SIZE(usb_functions_lge_cdrom_storage_adb),		.functions = usb_functions_lge_cdrom_storage_adb,	},	{		.product_id = 0xFFFF,		.num_functions = ARRAY_SIZE(usb_functions_lge_charge_only),		.functions = usb_functions_lge_charge_only,	},	#endif};struct usb_mass_storage_platform_data mass_storage_pdata = {	.nluns      = 1,	.vendor     = "LGE",	.product    = "Android Platform",	.release    = 0x0100,};struct platform_device usb_mass_storage_device = {	.name   = "usb_mass_storage",	.id 	= -1,	.dev    = {		.platform_data = &mass_storage_pdata,	},};struct usb_ether_platform_data rndis_pdata = {	.vendorID   	= 0x1004,	.vendorDescr    = "LG Electronics Inc.",};struct platform_device rndis_device = {	.name   = "rndis",	.id 	= -1,	.dev    = {		.platform_data = &rndis_pdata,	},};#ifdef CONFIG_USB_ANDROID_CDC_ECMstruct usb_ether_platform_data ecm_pdata = {	.vendorID   	= 0x1004,	.vendorDescr    = "LG Electronics Inc.",};struct platform_device ecm_device = {	.name   = "ecm",	.id 	= -1,	.dev    = {		.platform_data = &ecm_pdata,	},};#endif#ifdef CONFIG_USB_ANDROID_ACMstruct acm_platform_data acm_pdata = {	.num_inst	    = 1,};struct platform_device acm_device = {	.name   = "acm",	.id 	= -1,	.dev    = {		.platform_data = &acm_pdata,	},};#endif#ifdef CONFIG_USB_SUPPORT_LGE_ANDROID_AUTORUNstruct usb_cdrom_storage_platform_data cdrom_storage_pdata = {	.nluns      = 1,	.vendor     = "LGE",	.product    = "Android Platform",	.release    = 0x0100,};struct platform_device usb_cdrom_storage_device = {	.name   = "usb_cdrom_storage",	.id = -1,	.dev    = {		.platform_data = &cdrom_storage_pdata,	},};#endifstruct android_usb_platform_data android_usb_pdata = {	.vendor_id  = 0x1004,	.product_id = 0x618E,	.version    = 0x0100,	.product_name       = "LGE USB Device",	.manufacturer_name  = "LG Electronics Inc.",	.num_products = ARRAY_SIZE(usb_products),	.products = usb_products,	.num_functions = ARRAY_SIZE(usb_functions_lge_all),	.functions = usb_functions_lge_all,	.serial_number = "LG_ANDROID_P500_GB_",};static struct platform_device android_usb_device = {	.name	= "android_usb",	.id		= -1,	.dev		= {		.platform_data = &android_usb_pdata,	},};static int __init board_serialno_setup(char *serialno){	int i;	char *src = serialno;	/* create a fake MAC address from our serial number.	 * first byte is 0x02 to signify locally administered.	 */	rndis_pdata.ethaddr[0] = 0x02;	for (i = 0; *src; i++) {		/* XOR the USB serial across the remaining bytes */		rndis_pdata.ethaddr[i % (ETH_ALEN - 1) + 1] ^= *src++;	}	android_usb_pdata.serial_number = serialno;	return 1;}__setup("androidboot.serialno=", board_serialno_setup);#endif /* CONFIG_USB_ANDROID *//*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++++++setting board revision information++++++++++++++++++++++++++++++++++++++++++++++++++++++*/int lge_bd_rev;static int __init board_revno_setup(char *rev_info){	char *rev_str[] = { "evb", "rev_a", "rev_b", "rev_c", "rev_d", "rev_e", "rev_f","rev_10","rev_11","rev_12","rev_13",};	int i;	lge_bd_rev = LGE_REV_TOT_NUM;		for (i = 0; i < LGE_REV_TOT_NUM; i++) 		if (!strncmp(rev_info, rev_str[i], 6)) {			lge_bd_rev = i;			break;		}	printk(KERN_INFO"BOARD: LGE %s\n", rev_str[lge_bd_rev]);	return 1;}__setup("lge.rev=", board_revno_setup);/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*++++++++++++++++++++++++++++++++++++++++++setting whether uart console is enalbed or disabled++++++++++++++++++++++++++++++++++++++++++++*/static int uart_console_mode = 0;int __init lge_get_uart_mode(void){	return uart_console_mode;}static int __init lge_uart_mode(char *uart_mode){	if (!strncmp("enable", uart_mode, 5)) {		printk(KERN_INFO"UART CONSOLE : enable\n");		uart_console_mode = 1;	} 	else 		printk(KERN_INFO"UART CONSOLE : disable\n");	return 1;}__setup("uart_console=", lge_uart_mode);/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++Android RAM Console Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/#ifdef CONFIG_ANDROID_RAM_CONSOLEstatic struct resource ram_console_resource[] = {	{		.name = "ram_console",		.flags = IORESOURCE_MEM,	}};static struct platform_device ram_console_device = {	.name = "ram_console",	.id = -1,	.num_resources = ARRAY_SIZE(ram_console_resource),	.resource = ram_console_resource,};void __init lge_add_ramconsole_devices(void){	struct resource *res = ram_console_resource;	struct membank *bank = &meminfo.bank[0];	res->start = MSM7X27_EBI1_CS0_BASE + bank->size;	res->end = res->start + LGE_RAM_CONSOLE_SIZE - 1;	printk("RAM CONSOLE START ADDR : %d\n", res->start);	printk("RAM CONSOLE END ADDR   : %d\n", res->end);	platform_device_register(&ram_console_device);}__WEAK struct lge_panic_handler_platform_data panic_handler_data;static struct platform_device panic_handler_device = {	.name = "panic-handler",	.dev    = {		.platform_data = &panic_handler_data,	}};void __init lge_add_panic_handler_devices(void){	platform_device_register(&panic_handler_device);}static struct platform_device ers_kernel = {	.name = "ers-kernel",};void __init lge_add_ers_devices(void){	platform_device_register(&ers_kernel);}#endif/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++++++++USB Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/#ifdef CONFIG_USB_G_ANDROIDstatic struct android_usb_platform_data android_usb_pdata = {	.update_pid_and_serial_num = usb_diag_update_pid_and_serial_num,};static struct platform_device android_usb_device = {	.name	= "android_usb",	.id		= -1,	.dev		= {		.platform_data = &android_usb_pdata,	},};#endif#ifdef CONFIG_USB_EHCI_MSM_72Kstatic void msm_hsusb_vbus_power(unsigned phy_info, int on){	if (on)		msm_hsusb_vbus_powerup();	else		msm_hsusb_vbus_shutdown();}static struct msm_usb_host_platform_data msm_usb_host_pdata = {	.phy_info       = (USB_PHY_INTEGRATED | USB_PHY_MODEL_65NM),};static void __init msm7x2x_init_host(void){	if (machine_is_msm7x25_ffa() || machine_is_msm7x27_ffa())		return;	msm_add_host(0, &msm_usb_host_pdata);}#endif#ifdef CONFIG_USB_MSM_OTG_72Kstatic int hsusb_rpc_connect(int connect){	if (connect)		return msm_hsusb_rpc_connect();	else		return msm_hsusb_rpc_close();}#endif#ifdef CONFIG_USB_MSM_OTG_72Kstatic int msm_hsusb_ldo_init(int init){	static struct vreg *reg_hsusb;	int rc;	if (init) {		reg_hsusb = vreg_get(NULL, "usb");		if (IS_ERR(reg_hsusb)) {			rc = PTR_ERR(reg_hsusb);			pr_err("%s: could not get regulator: %d\n",					__func__, rc);			goto out;		}		rc = vreg_set_level(reg_hsusb, 3300);		if (rc < 0) {			pr_err("%s: could not set voltage: %d\n",					 __func__, rc);			goto usb_reg_fail;		}		rc = vreg_enable(reg_hsusb);		if (rc < 0) {			pr_err("%s: could not enable regulator: %d\n",					__func__, rc);			goto usb_reg_fail;		}		/*		 * PHY 3.3V analog domain(VDDA33) is powered up by		 * an always enabled power supply (LP5900TL-3.3).		 * USB VREG default source is VBUS line. Turning		 * on USB VREG has a side effect on the USB suspend		 * current. Hence USB VREG is explicitly turned		 * off here.		 */		rc = vreg_disable(reg_hsusb);		if (rc < 0) {			pr_err("%s: could not disable regulator: %d\n",					__func__, rc);			goto usb_reg_fail;		}		vreg_put(reg_hsusb);	}	return 0;usb_reg_fail:	vreg_put(reg_hsusb);out:	return rc;}static int msm_hsusb_pmic_notif_init(void (*callback)(int online), int init){	int ret;	if (init) {		ret = msm_pm_app_rpc_init(callback);	} else {		msm_pm_app_rpc_deinit(callback);		ret = 0;	}	return ret;}static int msm_otg_rpc_phy_reset(void __iomem *regs){	return msm_hsusb_phy_reset();}static struct msm_otg_platform_data msm_otg_pdata = {	.rpc_connect	= hsusb_rpc_connect,#ifdef CONFIG_ARCH_MSM7X27	.phy_reset		 = msm_otg_rpc_phy_reset,#endif	.pmic_vbus_notif_init    = msm_hsusb_pmic_notif_init,	.chg_vbus_draw		 = hsusb_chg_vbus_draw,	.chg_connected		 = hsusb_chg_connected,	.chg_init		 = hsusb_chg_init,#ifdef CONFIG_USB_EHCI_MSM_72K	.vbus_power = msm_hsusb_vbus_power,#endif	.ldo_init		= msm_hsusb_ldo_init,	.pclk_required_during_lpm = 1,};#ifdef CONFIG_USB_GADGETstatic struct msm_hsusb_gadget_platform_data msm_gadget_pdata;#endif#endif/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++++++++++++==Sound Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/#define SND(desc, num) { .name = #desc, .id = num }static struct snd_endpoint snd_endpoints_list[] = {	SND(HANDSET_LOOPBACK,5),	SND(HANDSET, 6),	SND(HEADSET_LOOPBACK, 1),	SND(HEADSET, 2),	SND(HEADSET_STEREO, 3),	SND(SPEAKER, 0),	SND(SPEAKER_IN_CALL, 7),	SND(SPEAKER_RING, 8),	SND(HEADSET_AND_SPEAKER, 8),	SND(FM_HEADSET, 10),	SND(FM_SPEAKER, 11),	SND(BT, 13),	SND(TTY_HEADSET, 15),	SND(TTY_VCO, 16),	SND(TTY_HCO, 17),	SND(TTY_HCO_SPEAKER, 18),	SND(HANDSET_VR, 20),	SND(HEADSET_VR, 21),	SND(BT_VR, 23),	SND(CURRENT, 30),};#undef SNDstatic struct msm_snd_endpoints msm_device_snd_endpoints = {	.endpoints = snd_endpoints_list,	.num = sizeof(snd_endpoints_list) / sizeof(struct snd_endpoint)};static struct platform_device msm_device_snd = {	.name = "msm_snd",	.id = -1,	.dev    = {		.platform_data = &msm_device_snd_endpoints	},};#define DEC0_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \	(1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \	(1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \	(1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \	(1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \	(1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))#define DEC1_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \	(1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \	(1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \	(1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \	(1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \	(1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))#define DEC2_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \	(1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \	(1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \	(1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \	(1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \	(1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))#define DEC3_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \	(1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \	(1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \	(1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \	(1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \	(1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))#define DEC4_FORMAT (1<<MSM_ADSP_CODEC_MIDI)static unsigned int dec_concurrency_table[] = {	/* Audio LP */	(DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DMA)), 0,	0, 0, 0,	/* Concurrency 1 */	(DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC3_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC4_FORMAT),	 /* Concurrency 2 */	(DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC3_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC4_FORMAT),	/* Concurrency 3 */	(DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC4_FORMAT),	/* Concurrency 4 */	(DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC4_FORMAT),	/* Concurrency 5 */	(DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC1_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC4_FORMAT),	/* Concurrency 6 */	(DEC0_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),	0, 0, 0, 0,	/* Concurrency 7 */	(DEC0_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC1_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),	(DEC4_FORMAT),};#define DEC_INFO(name, queueid, decid, nr_codec) { .module_name = name, \	.module_queueid = queueid, .module_decid = decid, \	.nr_codec_support = nr_codec}static struct msm_adspdec_info dec_info_list[] = {	DEC_INFO("AUDPLAY0TASK", 13, 0, 11), /* AudPlay0BitStreamCtrlQueue */	DEC_INFO("AUDPLAY1TASK", 14, 1, 11),  /* AudPlay1BitStreamCtrlQueue */	DEC_INFO("AUDPLAY2TASK", 15, 2, 11),  /* AudPlay2BitStreamCtrlQueue */	DEC_INFO("AUDPLAY3TASK", 16, 3, 11),  /* AudPlay3BitStreamCtrlQueue */	DEC_INFO("AUDPLAY4TASK", 17, 4, 1),  /* AudPlay4BitStreamCtrlQueue */};static struct msm_adspdec_database msm_device_adspdec_database = {	.num_dec = ARRAY_SIZE(dec_info_list),	.num_concurrency_support = (ARRAY_SIZE(dec_concurrency_table) / \					ARRAY_SIZE(dec_info_list)),	.dec_concurrency_table = dec_concurrency_table,	.dec_info_list = dec_info_list,};static struct platform_device msm_device_adspdec = {	.name = "msm_adspdec",	.id = -1,	.dev    = {		.platform_data = &msm_device_adspdec_database	},};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Pmem Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static struct android_pmem_platform_data android_pmem_pdata = {	.name = "pmem",	.allocator_type = PMEM_ALLOCATORTYPE_BITMAP,	.cached = 1,	.memory_type = MEMTYPE_EBI1,};static struct android_pmem_platform_data android_pmem_adsp_pdata = {	.name = "pmem_adsp",	.allocator_type = PMEM_ALLOCATORTYPE_BITMAP,	.cached = 0,	.memory_type = MEMTYPE_EBI1,};static struct android_pmem_platform_data android_pmem_audio_pdata = {	.name = "pmem_audio",	.allocator_type = PMEM_ALLOCATORTYPE_BITMAP,	.cached = 0,	.memory_type = MEMTYPE_EBI1,};static struct platform_device android_pmem_device = {	.name = "android_pmem",	.id = 0,	.dev = { .platform_data = &android_pmem_pdata },};static struct platform_device android_pmem_adsp_device = {	.name = "android_pmem",	.id = 1,	.dev = { .platform_data = &android_pmem_adsp_pdata },};static struct platform_device android_pmem_audio_device = {	.name = "android_pmem",	.id = 2,	.dev = { .platform_data = &android_pmem_audio_pdata },};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++HandSet Support++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static struct msm_handset_platform_data hs_platform_data = {	.hs_name = "7k_handset",	.pwr_key_delay_ms = 500, /* 0 will disable end key */};static struct platform_device hs_device = {	.name   = "msm-handset",	.id     = -1,	.dev    = {		.platform_data = &hs_platform_data,	},};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*++++++++++++++++++++++++++++++++++++++++++++++++++++++++TSIF Module support++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//* TSIF begin */#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE)#define TSIF_B_SYNC      GPIO_CFG(87, 5, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)#define TSIF_B_DATA      GPIO_CFG(86, 3, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)#define TSIF_B_EN        GPIO_CFG(85, 3, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)#define TSIF_B_CLK       GPIO_CFG(84, 4, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)static const struct msm_gpio tsif_gpios[] = {	{ .gpio_cfg = TSIF_B_CLK,  .label =  "tsif_clk", },	{ .gpio_cfg = TSIF_B_EN,   .label =  "tsif_en", },	{ .gpio_cfg = TSIF_B_DATA, .label =  "tsif_data", },	{ .gpio_cfg = TSIF_B_SYNC, .label =  "tsif_sync", },};static struct msm_tsif_platform_data tsif_platform_data = {	.num_gpios = ARRAY_SIZE(tsif_gpios),	.gpios = tsif_gpios,	.tsif_clk = "core_clk",	.tsif_pclk = "iface_clk",	.tsif_ref_clk = "ref_clk",};#endif /* defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE) *//* TSIF end   *//*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++FrameBuffer Display Panel Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/#define MSM_FB_LCDC_VREG_OP(name, op, level)			\do { \	vreg = vreg_get(0, name); \	vreg_set_level(vreg, level); \	if (vreg_##op(vreg)) \		printk(KERN_ERR "%s: %s vreg operation failed \n", \			(vreg_##op == vreg_enable) ? "vreg_enable" \				: "vreg_disable", name); \} while (0)static char *msm_fb_vreg[] = {	"gp1",	"gp2",};static int mddi_power_save_on;static int msm_fb_mddi_power_save(int on){	struct vreg *vreg;	int flag_on = !!on;	if (mddi_power_save_on == flag_on)		return 0;	mddi_power_save_on = flag_on;	if (on) {		MSM_FB_LCDC_VREG_OP(msm_fb_vreg[0], enable, 1800);		MSM_FB_LCDC_VREG_OP(msm_fb_vreg[1], enable, 2800);	} else{		MSM_FB_LCDC_VREG_OP(msm_fb_vreg[0], disable, 0);		MSM_FB_LCDC_VREG_OP(msm_fb_vreg[1], disable, 0);	}	return 0;}static int mddi_hitachi_pmic_backlight(int level){	/* TODO: Backlight control here */	return 0;}static struct msm_panel_hitachi_pdata mddi_hitachi_panel_data = {	.gpio = 102,				/* lcd reset_n */	.pmic_backlight = mddi_hitachi_pmic_backlight,	.initialized = 1,};static struct platform_device mddi_hitachi_panel_device = {	.name   = "mddi_hitachi_hvga",	.id     = 0,	.dev    = {		.platform_data = &mddi_hitachi_panel_data,	}};static struct resource msm_fb_resources[] = {	{		.flags  = IORESOURCE_DMA,	}};static int msm_fb_detect_panel(const char *name){	int ret = -EPERM;	if (machine_is_msm7x25_ffa() || machine_is_msm7x27_ffa()) {		if (!strcmp(name, "lcdc_gordon_vga"))			ret = 0;		else			ret = -ENODEV;	}	return ret;}static struct msm_fb_platform_data msm_fb_pdata = {	.detect_client = msm_fb_detect_panel,	.mddi_prescan = 1,};static struct platform_device msm_fb_device = {	.name   = "msm_fb",	.id     = 0,	.num_resources  = ARRAY_SIZE(msm_fb_resources),	.resource       = msm_fb_resources,	.dev    = {		.platform_data = &msm_fb_pdata,	}};static struct mddi_platform_data mddi_pdata = {	.mddi_power_save = msm_fb_mddi_power_save,};static struct msm_panel_common_pdata mdp_pdata = {	.gpio = 97,	.mdp_rev = MDP_REV_30,};static void __init msm_fb_add_devices(void){	msm_fb_register_device("mdp", &mdp_pdata);	msm_fb_register_device("pmdh", &mddi_pdata);	msm_fb_register_device("lcdc", 0);}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Backlight Support++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static struct gpio_i2c_pin bl_i2c_pin[] = {	[0] = {		.sda_pin	= 89,		.scl_pin	= 88,		.reset_pin	= 82,		.irq_pin	= 0,	},};static struct i2c_gpio_platform_data bl_i2c_pdata = {	.sda_is_open_drain	= 0,	.scl_is_open_drain	= 0,	.udelay			= 2,};static struct platform_device bl_i2c_device = {	.id     = i2c_bus_num,	.name	= "i2c-gpio",	.dev.platform_data = &bl_i2c_pdata,};static struct aat28xx_platform_data aat2870bl_data[] = {	[LGE_REV_B] = {		.gpio = 82,		.version = 2870,	},	[LGE_REV_C] = {		.gpio = 82,		.version = 2862,	},	[LGE_REV_D] = {		.gpio = 82,		.version = 2862,	},	[LGE_REV_E] = {		.gpio = 82,		.version = 2862,	},	[LGE_REV_F] = {		.gpio = 82,		.version = 2862,	},	[LGE_REV_10] = {		.gpio = 82,		.version = 2862,	},	[LGE_REV_11] = {		.gpio = 82,		.version = 2862,	}};static struct i2c_board_info bl_i2c_bdinfo[] = {	[0] = {		I2C_BOARD_INFO("aat2870bl", 0x60),		.type = "aat2870bl",		.platform_data = NULL,	},};struct device* thunderg_backlight_dev(void){	return &bl_i2c_device.dev;}void __init thunderg_init_i2c_backlight(){	bl_i2c_bdinfo[0].platform_data = &aat2870bl_data[lge_bd_rev];	bl_i2c_pdata.sda_pin = bl_i2c_pin[0].sda_pin;	bl_i2c_pdata.scl_pin = bl_i2c_pin[0].scl_pin;	gpio_tlmm_config(GPIO_CFG(bl_i2c_pin[0].sda_pin, 0, GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_tlmm_config(GPIO_CFG(bl_i2c_pin[0].scl_pin, 0, GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_set_value(bl_i2c_pin[0].sda_pin, 1);	gpio_set_value(bl_i2c_pin[0].scl_pin, 1);	if (bl_i2c_pin[0].reset_pin) {		gpio_tlmm_config(GPIO_CFG(bl_i2c_pin[0].reset_pin, 0, GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);		gpio_set_value(bl_i2c_pin[0].reset_pin, 1);	}	if (bl_i2c_pin[0].irq_pin) {		gpio_tlmm_config(GPIO_CFG(bl_i2c_pin[0].irq_pin, 0, GPIO_CFG_INPUT,GPIO_CFG_PULL_UP, GPIO_CFG_2MA), GPIO_CFG_ENABLE);		bl_i2c_bdinfo[0].irq =MSM_GPIO_TO_INT(bl_i2c_pin[0].irq_pin);	}	i2c_register_board_info(bl_i2c_device.id, &bl_i2c_bdinfo[0], 1);	platform_device_register(&bl_i2c_device);}i2c_bus_num++;/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Bluetooth Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/#ifdef CONFIG_BTstatic unsigned bt_config_power_on[] = {	GPIO_CFG(BT_WAKE, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),		/* WAKE */	GPIO_CFG(BT_RFR, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),		/* RFR */	GPIO_CFG(BT_CTS, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),		/* CTS */	GPIO_CFG(BT_RX, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),		/* Rx */	GPIO_CFG(BT_TX, 3, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),		/* Tx */	GPIO_CFG(BT_PCM_DOUT, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),	/* PCM_DOUT */	GPIO_CFG(BT_PCM_DIN, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),	/* PCM_DIN */	GPIO_CFG(BT_PCM_SYNC, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),	/* PCM_SYNC */	GPIO_CFG(BT_PCM_CLK, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),	/* PCM_CLK */	GPIO_CFG(BT_HOST_WAKE, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),	/* HOST_WAKE */	GPIO_CFG(BT_RESET_N, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),	/* RESET_N */};static unsigned bt_config_power_off[] = {	GPIO_CFG(BT_WAKE, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),		/* WAKE */	GPIO_CFG(BT_RFR, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),		/* RFR */	GPIO_CFG(BT_CTS, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),		/* CTS */	GPIO_CFG(BT_RX, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),		/* Rx */	GPIO_CFG(BT_TX, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),		/* Tx */	GPIO_CFG(BT_PCM_DOUT, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),	/* PCM_DOUT */	GPIO_CFG(BT_PCM_DIN, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),	/* PCM_DIN */	GPIO_CFG(BT_PCM_SYNC, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),	/* PCM_SYNC */	GPIO_CFG(BT_PCM_CLK, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),	/* PCM_CLK */	GPIO_CFG(BT_HOST_WAKE, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),	/* HOST_WAKE */	GPIO_CFG(BT_RESET_N, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),	/* RESET_N */	};static int thunderg_bluetooth_toggle_radio(void *data, bool state){	int ret;	int (*power_control)(int enable);    	power_control = ((struct bluetooth_platform_data *)data)->bluetooth_power;	ret = (*power_control)((state == RFKILL_USER_STATE_SOFT_BLOCKED) ? 1 : 0);	return ret;}static int thunderg_bluetooth_power(int on){	int pin, rc;	static struct regulator *vreg_bt;	printk(KERN_DEBUG "%s\n", __func__);	/* do not have vreg bt defined, gp6 is the same */	/* vreg_get parameter 1 (struct device *) is ignored */	if (on) {		for (pin = 0; pin < ARRAY_SIZE(bt_config_power_on); pin++) {			rc = gpio_tlmm_config(bt_config_power_on[pin],GPIO_CFG_ENABLE);			if (rc) {				printk(KERN_ERR"%s: gpio_tlmm_config(%#x)=%d\n",__func__, bt_config_power_on[pin], rc);				return -EIO;			}		}      		//Turn Bluetooth Power On if and only if not turned on by WLAN yet.       		if (!gpio_get_value(CONFIG_BCM4325_GPIO_WL_REGON)) //#23			gpio_set_value(CONFIG_BCM4325_GPIO_WL_REGON, 1); //#23		mdelay(100);		gpio_set_value(BT_RESET_N, 0);		mdelay(100);		gpio_set_value(BT_RESET_N, 1);		mdelay(100);	} else {        	//Turn Bluetooth Power Off if and only if not used by WLAN anymore.        	if (!gpio_get_value(CONFIG_BCM4325_GPIO_WL_RESET)) //#93         		gpio_set_value(CONFIG_BCM4325_GPIO_WL_REGON, 0); //#23		for (pin = 0; pin < ARRAY_SIZE(bt_config_power_off); pin++) {			rc = gpio_tlmm_config(bt_config_power_off[pin],GPIO_CFG_ENABLE);			if (rc) {				printk(KERN_ERR"%s: gpio_tlmm_config(%#x)=%d\n",__func__, bt_config_power_off[pin], rc);				return -EIO;			}		}	}	return 0;}static struct bluetooth_platform_data thunderg_bluetooth_data = {	.bluetooth_power = thunderg_bluetooth_power,	.bluetooth_toggle_radio = thunderg_bluetooth_toggle_radio,};static struct platform_device msm_bt_power_device = {	.name = "bt_power",	.dev = {		.platform_data = &thunderg_bluetooth_data,	},};static void __init bt_power_init(void){ 	gpio_set_value(23, 1);  	ssleep(1); /* 1 sec */ 	gpio_set_value(23, 0);}#else#define bt_power_init(x) do {} while (0)#endifstatic struct resource bluesleep_resources[] = {	{		.name	= "gpio_host_wake",		.start	= BT_HOST_WAKE,		.end	= BT_HOST_WAKE,		.flags	= IORESOURCE_IO,	},	{		.name	= "gpio_ext_wake",		.start	= BT_WAKE,		.end	= BT_WAKE,		.flags	= IORESOURCE_IO,	},	{		.name	= "host_wake",		.start	= MSM_GPIO_TO_INT(BT_HOST_WAKE),		.end	= MSM_GPIO_TO_INT(BT_HOST_WAKE),		.flags	= IORESOURCE_IRQ,	},};static struct bluesleep_platform_data thunderg_bluesleep_data = {	.bluetooth_port_num = 0,};static struct platform_device msm_bluesleep_device = {	.name = "bluesleep",	.id		= -1,	.num_resources	= ARRAY_SIZE(bluesleep_resources),	.resource	= bluesleep_resources,	.dev = {		.platform_data = &thunderg_bluesleep_data,	},	};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++++++++++Button Backlight Support++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static struct platform_device msm_device_pmic_leds = {	.name   = "pmic-leds",	.id = -1,	.dev.platform_data = "button-backlight",};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*++++++++++++++++++++++++++++++++++++++++++++++++++++Camera Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/struct i2c_board_info i2c_devices[1] = {#if defined (CONFIG_ISX005)	{		I2C_BOARD_INFO("isx005", CAM_I2C_SLAVE_ADDR),	},#endif};#ifdef CONFIG_MSM_CAMERAstatic uint32_t camera_off_gpio_table[] = {	/* parallel CAMERA interfaces */	GPIO_CFG(4,  0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT0 */	GPIO_CFG(5,  0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT1 */	GPIO_CFG(6,  0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT2 */	GPIO_CFG(7,  0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT3 */	GPIO_CFG(8,  0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT4 */	GPIO_CFG(9,  0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT5 */	GPIO_CFG(10, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT6 */	GPIO_CFG(11, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT7 */	GPIO_CFG(12, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* PCLK */	GPIO_CFG(13, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* HSYNC_IN */	GPIO_CFG(14, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* VSYNC_IN */	GPIO_CFG(GPIO_CAM_MCLK, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* MCLK */};static uint32_t camera_on_gpio_table[] = {	/* parallel CAMERA interfaces */		GPIO_CFG(4,  1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT0 */	GPIO_CFG(5,  1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT1 */	GPIO_CFG(6,  1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT2 */	GPIO_CFG(7,  1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT3 */	GPIO_CFG(8,  1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT4 */	GPIO_CFG(9,  1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT5 */	GPIO_CFG(10, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT6 */	GPIO_CFG(11, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* DAT7 */	GPIO_CFG(12, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_16MA), /* PCLK */	GPIO_CFG(13, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* HSYNC_IN */	GPIO_CFG(14, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), /* VSYNC_IN */	GPIO_CFG(GPIO_CAM_MCLK, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_16MA), /* MCLK */	};static void config_gpio_table(uint32_t *table, int len){	int n, rc;	for (n = 0; n < len; n++) {		rc = gpio_tlmm_config(table[n], GPIO_CFG_ENABLE);		if (rc) {			printk(KERN_ERR "%s: gpio_tlmm_config(%#x)=%d\n",				__func__, table[n], rc);			break;		}	}}static int config_camera_on_gpios(void){	config_gpio_table(camera_on_gpio_table,		ARRAY_SIZE(camera_on_gpio_table));	return 0;}static void config_camera_off_gpios(void){	config_gpio_table(camera_off_gpio_table,		ARRAY_SIZE(camera_off_gpio_table));}int camera_power_on (void){	int rc;	struct device *dev = thunderg_backlight_dev();	camera_power_mutex_lock();	if(lcd_bl_power_state == BL_POWER_SUSPEND)	{		thunderg_pwrsink_resume();		mdelay(50);	}/* clear RESET, PWDN to Low*/	gpio_set_value(GPIO_CAM_RESET, 0);	gpio_set_value(GPIO_CAM_PWDN, 0);/*AVDD power 2.8V*/	if (lge_bd_rev == LGE_REV_B) {		rc = aat28xx_ldo_set_level(dev, LDO_CAM_AF_NO, 2800);		if (rc < 0) {			printk(KERN_ERR "%s: ldo %d set level error\n", __func__, LDO_CAM_AF_NO);			goto power_on_fail;		}		rc = aat28xx_ldo_enable(dev, LDO_CAM_AF_NO, 1);		if (rc < 0) {			printk(KERN_ERR "%s: ldo %d control error\n", __func__, LDO_CAM_AF_NO);			goto power_on_fail;		}	} else {	/* it is for rev.c and default */		struct vreg *vreg_mmc = vreg_get(0, "mmc");		vreg_set_level(vreg_mmc, 2800);		vreg_enable(vreg_mmc);	}/* DVDD power 1.2V */	rc = aat28xx_ldo_set_level(dev, LDO_CAM_DVDD_NO, 1200);	if (rc < 0) {		printk(KERN_ERR "%s: ldo %d set level error\n", __func__, LDO_CAM_DVDD_NO);		goto power_on_fail;	}	rc = aat28xx_ldo_enable(dev, LDO_CAM_DVDD_NO, 1);	if (rc < 0) {		printk(KERN_ERR "%s: ldo %d control error\n", __func__, LDO_CAM_DVDD_NO);		goto power_on_fail;	}/*IOVDD power 2.6V*/	rc = aat28xx_ldo_set_level(dev, LDO_CAM_IOVDD_NO, 2600);	if (rc < 0) {		printk(KERN_ERR "%s: ldo %d set level error\n", __func__, LDO_CAM_IOVDD_NO);		goto power_on_fail;	}	rc = aat28xx_ldo_enable(dev, LDO_CAM_IOVDD_NO, 1);	if (rc < 0) {		printk(KERN_ERR "%s: ldo %d control error\n", __func__, LDO_CAM_IOVDD_NO);		goto power_on_fail;	}/*AVDD power  2.7V*/	/* LGE_CHANGE 	  * Change AVDD level from 2.7V to 2.8V in order to reduce camera noise in dard environment.	  * 2010-08-03. minjong.gong@lge.com	  */	rc = aat28xx_ldo_set_level(dev, LDO_CAM_AVDD_NO, 2800);	if (rc < 0) {		printk(KERN_ERR "%s: ldo %d set level error\n", __func__, LDO_CAM_AVDD_NO);		goto power_on_fail;	}	rc = aat28xx_ldo_enable(dev, LDO_CAM_AVDD_NO, 1);	if (rc < 0) {		printk(KERN_ERR "%s: ldo %d control error\n", __func__, LDO_CAM_AVDD_NO);		goto power_on_fail;	}		mdelay(5);/*M Clock -24Mhz*/	msm_camio_clk_rate_set(mclk_rate);	mdelay(5);	msm_camio_camif_pad_reg_reset();	mdelay(5);/*reset high*/	gpio_set_value(GPIO_CAM_RESET, 1);	mdelay(5); /*Nstandby high*/	gpio_set_value(GPIO_CAM_PWDN, 1);	mdelay(8);  // T2 	camera_power_state = CAM_POWER_ON;power_on_fail:	camera_power_mutex_unlock();	return rc;}int camera_power_off (void){	int rc;	struct device *dev = thunderg_backlight_dev();	camera_power_mutex_lock();	if (lcd_bl_power_state == BL_POWER_SUSPEND) {		thunderg_pwrsink_resume();		mdelay(50);	}/*Nstandby low*/	gpio_set_value(GPIO_CAM_PWDN, 0);	mdelay(5);/*reset low*/	gpio_set_value(GPIO_CAM_RESET, 0);/*AVDD power 2.8V*/	if (lge_bd_rev == LGE_REV_A) {		rc = aat28xx_ldo_set_level(dev, LDO_CAM_AF_NO, 0);		if (rc < 0) {			printk(KERN_ERR "%s: ldo %d set level error\n", __func__, LDO_CAM_AF_NO);			goto power_off_fail;		}		rc = aat28xx_ldo_enable(dev, LDO_CAM_AF_NO, 0);		if (rc < 0) {			printk(KERN_ERR "%s: ldo %d control error\n", __func__, LDO_CAM_AF_NO);			goto power_off_fail;		}	} else {	/* it is for rev.c and default */		struct vreg *vreg_mmc = vreg_get(0, "mmc");		vreg_set_level(vreg_mmc, 0);		vreg_disable(vreg_mmc);	}/*AVDD power 2.7V*/	rc = aat28xx_ldo_set_level(dev, LDO_CAM_AVDD_NO, 0);	if (rc < 0) {		printk(KERN_ERR "%s: ldo %d set level error\n", __func__, LDO_CAM_AVDD_NO);		goto power_off_fail;	}	rc = aat28xx_ldo_enable(dev, LDO_CAM_AVDD_NO, 0);	if (rc < 0) {		printk(KERN_ERR "%s: ldo %d control error\n", __func__, LDO_CAM_AVDD_NO);		goto power_off_fail;	}/*IOVDD power 2.6V*/	rc = aat28xx_ldo_set_level(dev, LDO_CAM_IOVDD_NO, 0);	if (rc < 0) {		printk(KERN_ERR "%s: ldo %d set level error\n", __func__, LDO_CAM_IOVDD_NO);		goto power_off_fail;	}	rc = aat28xx_ldo_enable(dev, LDO_CAM_IOVDD_NO, 0);	if (rc < 0) {		printk(KERN_ERR "%s: ldo %d control error\n", __func__, LDO_CAM_IOVDD_NO);		goto power_off_fail;	}/* DVDD power 1.2V*/	rc = aat28xx_ldo_set_level(dev, LDO_CAM_DVDD_NO, 0);	if (rc < 0) {		printk(KERN_ERR "%s: ldo %d set level error\n", __func__, LDO_CAM_DVDD_NO);		goto power_off_fail;	}	rc = aat28xx_ldo_enable(dev, LDO_CAM_DVDD_NO, 0);	if (rc < 0) {		printk(KERN_ERR "%s: ldo %d control error\n", __func__, LDO_CAM_DVDD_NO);		goto power_off_fail;	}	camera_power_state = CAM_POWER_OFF;power_off_fail:	camera_power_mutex_unlock();	return rc;}static struct msm_camera_device_platform_data msm_camera_device_data = {	.camera_gpio_on  = config_camera_on_gpios,	.camera_gpio_off = config_camera_off_gpios,	.ioext.mdcphy = MSM7XXX_MDC_PHYS,	.ioext.mdcsz  = MSM7XXX_MDC_SIZE,	.ioext.appphy = MSM7XXX_CLK_CTL_PHYS,	.ioext.appsz  = MSM7XXX_CLK_CTL_SIZE,	.camera_power_on = camera_power_on,	.camera_power_off = camera_power_off,};#if defined (CONFIG_ISX005)static struct msm_camera_sensor_flash_data flash_none = {	.flash_type = MSM_CAMERA_FLASH_NONE,};static struct msm_camera_sensor_info msm_camera_sensor_isx005_data = {	.sensor_name    = "isx005",	.sensor_reset   = GPIO_CAM_RESET,	.sensor_pwd     = GPIO_CAM_PWDN,	.vcm_pwd        = 0,	.vcm_enable		= 0,	.pdata          = &msm_camera_device_data,	.flash_data		= &flash_none,};static struct platform_device msm_camera_sensor_isx005 = {	.name      = "msm_camera_isx005",	.dev       = {		.platform_data = &msm_camera_sensor_isx005_data,	},};#endif#endif/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++++++++++++Battery Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static u32 msm_calculate_batt_capacity(u32 current_voltage);static struct msm_psy_batt_pdata msm_psy_batt_data = {	.voltage_min_design 	= 2800,	.voltage_max_design	= 4300,	.avail_chg_sources   	= AC_CHG | USB_CHG ,	.batt_technology        = POWER_SUPPLY_TECHNOLOGY_LION,	.calculate_capacity	= &msm_calculate_batt_capacity,};static u32 msm_calculate_batt_capacity(u32 current_voltage){	u32 low_voltage   = msm_psy_batt_data.voltage_min_design;	u32 high_voltage  = msm_psy_batt_data.voltage_max_design;	return (current_voltage - low_voltage) * 100		/ (high_voltage - low_voltage);}static struct platform_device msm_batt_device = {	.name 		    = "msm-battery",	.id		    = -1,	.dev.platform_data  = &msm_psy_batt_data,};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*++++++++++++++++++++++++++++++++++++++++++++++++++++++++Dock State Driver Support++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static char *dock_state_string[] = {	"0",	"1",	"2",};enum {	DOCK_STATE_UNDOCKED = 0,	DOCK_STATE_DESK = 1, /* multikit */	DOCK_STATE_CAR = 2, /* carkit */	DOCK_STATE_UNKNOWN,};enum {	KIT_DOCKED = 0,	KIT_UNDOCKED = 1,};static void thunderg_desk_dock_detect_callback(int state){	int ret;	if (state)		state = DOCK_STATE_DESK;	ret = lge_gpio_switch_pass_event("dock", state);	if (ret)		printk(KERN_INFO "%s: desk dock event report fail\n", __func__);	return;}static int thunderg_register_callback(void){	rpc_server_hs_register_callback(thunderg_desk_dock_detect_callback);	return 0;}static int thunderg_gpio_carkit_work_func(void){	return DOCK_STATE_UNDOCKED;}static char *thunderg_gpio_carkit_print_state(int state){	return dock_state_string[state];}static int thunderg_gpio_carkit_sysfs_store(const char *buf, size_t size){	int state;	if (!strncmp(buf, "undock", size-1))		state = DOCK_STATE_UNDOCKED;	else if (!strncmp(buf, "desk", size-1))		state = DOCK_STATE_DESK;	else if (!strncmp(buf, "car", size-1))		state = DOCK_STATE_CAR;	else		return -EINVAL;	return state;}static unsigned thunderg_carkit_gpios[] = {};static struct lge_gpio_switch_platform_data thunderg_carkit_data = {	.name = "dock",	.gpios = thunderg_carkit_gpios,	.num_gpios = ARRAY_SIZE(thunderg_carkit_gpios),	.irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,	.wakeup_flag = 1,	.work_func = thunderg_gpio_carkit_work_func,	.print_state = thunderg_gpio_carkit_print_state,	.sysfs_store = thunderg_gpio_carkit_sysfs_store,	.additional_init = thunderg_register_callback,};static struct platform_device thunderg_carkit_device = {	.name = "lge-switch-gpio",	.id = 0,	.dev = {		.platform_data = &thunderg_carkit_data,	},};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++Vibrator Driver Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/#define VIBE_IC_VOLTAGE			3300#define GPIO_LIN_MOTOR_PWM		28#define GP_MN_CLK_MDIV_REG		0x004C#define GP_MN_CLK_NDIV_REG		0x0050#define GP_MN_CLK_DUTY_REG		0x0054/* about 22.93 kHz, should be checked */#define GPMN_M_DEFAULT			21#define GPMN_N_DEFAULT			4500/* default duty cycle = disable motor ic */#define GPMN_D_DEFAULT			(GPMN_N_DEFAULT >> 1) #define PWM_MAX_HALF_DUTY		((GPMN_N_DEFAULT >> 1) - 60) /* minimum operating spec. should be checked */#define GPMN_M_MASK				0x01FF#define GPMN_N_MASK				0x1FFF#define GPMN_D_MASK				0x1FFF#define REG_WRITEL(value, reg)	writel(value, (MSM_WEB_BASE+reg))int thunderg_vibrator_power_set(int enable){	static int is_enabled = 0;	struct device *dev = thunderg_backlight_dev();	if (dev==NULL) {		printk(KERN_ERR "%s: backlight devive get failed\n", __FUNCTION__);		return -1;	}	if (enable) {		if (is_enabled) {			printk(KERN_INFO "vibrator power was enabled, already\n");			return 0;		}		/* 3300 mV for Motor IC */						if (aat28xx_ldo_set_level(dev, 1, VIBE_IC_VOLTAGE) < 0) {			printk(KERN_ERR "%s: vibrator LDO set failed\n", __FUNCTION__);			return -EIO;		}				if (aat28xx_ldo_enable(dev, 1, 1) < 0) {			printk(KERN_ERR "%s: vibrator LDO enable failed\n", __FUNCTION__);			return -EIO;		}		is_enabled = 1;	} else {		if (!is_enabled) {			printk(KERN_INFO "vibrator power was disabled, already\n");			return 0;		}		if (aat28xx_ldo_set_level(dev, 1, 0) < 0) {					printk(KERN_ERR "%s: vibrator LDO set failed\n", __FUNCTION__);			return -EIO;		}		if (aat28xx_ldo_enable(dev, 1, 0) < 0) {			printk(KERN_ERR "%s: vibrator LDO disable failed\n", __FUNCTION__);			return -EIO;		}		is_enabled = 0;	}	return 0;}int thunderg_vibrator_pwm_set(int enable, int amp){	int gain = ((PWM_MAX_HALF_DUTY*amp) >> 7)+ GPMN_D_DEFAULT;	REG_WRITEL((GPMN_M_DEFAULT & GPMN_M_MASK), GP_MN_CLK_MDIV_REG);	REG_WRITEL((~( GPMN_N_DEFAULT - GPMN_M_DEFAULT )&GPMN_N_MASK), GP_MN_CLK_NDIV_REG);	if (enable) {		REG_WRITEL((gain & GPMN_D_MASK), GP_MN_CLK_DUTY_REG);		gpio_direction_output(GPIO_LIN_MOTOR_PWM, 1);	} else {		REG_WRITEL(GPMN_D_DEFAULT, GP_MN_CLK_DUTY_REG);		gpio_direction_output(GPIO_LIN_MOTOR_PWM, 0);	}	return 0;}int thunderg_vibrator_ic_enable_set(int enable){	/* nothing to do, thunder does not using Motor Enable pin */	return 0;}int thunderg_vibrator_gpio_request(void){	int rc = 0;	rc = gpio_request(GPIO_LIN_MOTOR_PWM, "lin_motor_pwm");	if (rc)		return rc;	return 0;}static struct android_vibrator_platform_data thunderg_vibrator_data = {	.enable_status = 0,		.power_set = thunderg_vibrator_power_set,	.pwm_set = thunderg_vibrator_pwm_set,	.ic_enable_set = thunderg_vibrator_ic_enable_set,	.gpio_request = thunderg_vibrator_gpio_request,	.amp_value = 115,};static struct platform_device android_vibrator_device = {	.name   = "android-vibrator",	.id = -1,	.dev = {		.platform_data = &thunderg_vibrator_data,	},};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++Ear Sense Driver Support++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static char *ear_state_string[] = {	"0",	"1",};enum {	EAR_STATE_EJECT = 0,	EAR_STATE_INJECT = 1, };enum {	EAR_EJECT = 0,	EAR_INJECT = 1,};static int thunderg_gpio_earsense_work_func(void){	int state;	int gpio_value;	gpio_value = gpio_get_value(GPIO_EAR_SENSE);	printk(KERN_INFO"%s: ear sense detected : %s\n", __func__,gpio_value?"injected":"ejected");	if (gpio_value == EAR_EJECT) {		state = EAR_STATE_EJECT;		gpio_set_value(GPIO_HS_MIC_BIAS_EN, 0);	} else {		state = EAR_STATE_INJECT;		gpio_set_value(GPIO_HS_MIC_BIAS_EN, 1);	}	return state;}static char *thunderg_gpio_earsense_print_state(int state){	return ear_state_string[state];}static int thunderg_gpio_earsense_sysfs_store(const char *buf, size_t size){	int state;	if (!strncmp(buf, "eject", size - 1))		state = EAR_STATE_EJECT;	else if (!strncmp(buf, "inject", size - 1))		state = EAR_STATE_INJECT;	else		return -EINVAL;	return state;}static unsigned thunderg_earsense_gpios[] = {	GPIO_EAR_SENSE,};static struct lge_gpio_switch_platform_data thunderg_earsense_data = {	.name = "h2w",	.gpios = thunderg_earsense_gpios,	.num_gpios = ARRAY_SIZE(thunderg_earsense_gpios),	.irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,	.wakeup_flag = 1,	.work_func = thunderg_gpio_earsense_work_func,	.print_state = thunderg_gpio_earsense_print_state,	.sysfs_store = thunderg_gpio_earsense_sysfs_store,};static struct platform_device thunderg_earsense_device = {	.name   = "lge-switch-gpio",	.id = 1,	.dev = {		.platform_data = &thunderg_earsense_data,	},};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++++++++KGSL Device Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static struct resource kgsl_3d0_resources[] = {	{		.name  = KGSL_3D0_REG_MEMORY,		.start = 0xA0000000,		.end = 0xA001ffff,		.flags = IORESOURCE_MEM,	},	{		.name = KGSL_3D0_IRQ,		.start = INT_GRAPHICS,		.end = INT_GRAPHICS,		.flags = IORESOURCE_IRQ,	},};static struct kgsl_device_platform_data kgsl_3d0_pdata = {	/* bus_freq has been set to 160000 for power savings.	* OEMs may modify the value at their discretion for performance	* The appropriate maximum replacement for 160000 is:	* msm7x2x_clock_data.max_axi_khz	*/	.pwrlevel = {		{			.gpu_freq = 0,			.bus_freq = 160000000,		},	},	.init_level = 0,	.num_levels = 1,	.set_grp_async = NULL,	.idle_timeout = HZ/5,	.clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE | KGSL_CLK_MEM,};struct platform_device msm_kgsl_3d0 = {	.name = "kgsl-3d0",	.id = 0,	.num_resources = ARRAY_SIZE(kgsl_3d0_resources),	.resource = kgsl_3d0_resources,	.dev = {		.platform_data = &kgsl_3d0_pdata,	},};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*++++++++++++++++++++++++++++++++++++++++++++++++++++++++Power Management Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static struct msm_pm_platform_data msm7x27_pm_data[MSM_PM_SLEEP_MODE_NR] = {	[MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE)] = {		.idle_supported = 1,		.suspend_supported = 1,		.idle_enabled = 1,		.suspend_enabled = 1,		.latency = 16000,		.residency = 20000,	},	[MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN)] = {		.idle_supported = 1,		.suspend_supported = 1,		.idle_enabled = 1,		.suspend_enabled = 1,		.latency = 12000,		.residency = 20000,	},	[MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT)] = {		.idle_supported = 1,		.suspend_supported = 1,		.idle_enabled = 1,		.suspend_enabled = 1,		.latency = 2000,		.residency = 0,	},};static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = {	.mode = MSM_PM_BOOT_CONFIG_RESET_VECTOR_PHYS,	.p_addr = 0,};int lcd_bl_power_state=0;int thunderg_pwrsink_suspend_noirq(struct device *dev){	printk(KERN_INFO"%s: configure gpio for suspend\n", __func__);	camera_power_mutex_lock();	if(camera_power_state == CAM_POWER_ON)	{		camera_power_mutex_unlock();		return 0;	}	gpio_tlmm_config(GPIO_CFG(GPIO_LCD_BL_EN, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_tlmm_config(GPIO_CFG(GPIO_BL_I2C_SCL, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_tlmm_config(GPIO_CFG(GPIO_BL_I2C_SDA, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);//	gpio_tlmm_config(GPIO_CFG(GPIO_LCD_VSYNC_O, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_tlmm_config(GPIO_CFG(GPIO_LCD_MAKER_LOW, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_direction_output(GPIO_LCD_MAKER_LOW, 0);	gpio_tlmm_config(GPIO_CFG(GPIO_LCD_RESET_N, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_direction_output(GPIO_LCD_RESET_N, 0);	lcd_bl_power_state = BL_POWER_SUSPEND;	camera_power_mutex_unlock();	return 0;}int thunderg_pwrsink_resume_noirq(struct device *dev){	printk(KERN_INFO"%s: configure gpio for resume\n", __func__);	camera_power_mutex_lock();	if(camera_power_state == CAM_POWER_ON || lcd_bl_power_state == BL_POWER_RESUME)	{		camera_power_mutex_unlock();		return 0;	}	gpio_tlmm_config(GPIO_CFG(GPIO_LCD_BL_EN, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_direction_output(GPIO_LCD_BL_EN, 1);	gpio_tlmm_config(GPIO_CFG(GPIO_BL_I2C_SCL, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_direction_output(GPIO_BL_I2C_SCL, 1);	gpio_tlmm_config(GPIO_CFG(GPIO_BL_I2C_SDA, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_direction_output(GPIO_BL_I2C_SDA, 1);//	gpio_tlmm_config(GPIO_CFG(GPIO_LCD_VSYNC_O, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_tlmm_config(GPIO_CFG(GPIO_LCD_MAKER_LOW, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_tlmm_config(GPIO_CFG(GPIO_LCD_RESET_N, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_direction_output(GPIO_LCD_RESET_N, 0);	lcd_bl_power_state = BL_POWER_RESUME;	camera_power_mutex_unlock();	return 0;}void thunderg_pwrsink_resume(){	gpio_tlmm_config(GPIO_CFG(GPIO_LCD_BL_EN, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_direction_output(GPIO_LCD_BL_EN, 1);	gpio_tlmm_config(GPIO_CFG(GPIO_BL_I2C_SCL, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_direction_output(GPIO_BL_I2C_SCL, 1);	gpio_tlmm_config(GPIO_CFG(GPIO_BL_I2C_SDA, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_direction_output(GPIO_BL_I2C_SDA, 1);//	gpio_tlmm_config(GPIO_CFG(GPIO_LCD_VSYNC_O, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_tlmm_config(GPIO_CFG(GPIO_LCD_MAKER_LOW, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_tlmm_config(GPIO_CFG(GPIO_LCD_RESET_N, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_direction_output(GPIO_LCD_RESET_N, 0);	lcd_bl_power_state = BL_POWER_RESUME;}static struct dev_pm_ops thunderg_pwrsink_data = {	.suspend_noirq = thunderg_pwrsink_suspend_noirq,	.resume_noirq = thunderg_pwrsink_resume_noirq,};static struct platform_device thunderg_pwrsink_device = {	.name = "lge-pwrsink",	.id = -1,	.dev = {		.platform_data = &thunderg_pwrsink_data,	},};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*++++++++++++++++++++++++++++++++++++++++++++++++++++++++ATCMD Virtual Device Support+++++++++++++++++++++++++++++++++++++++++++++++++++++*/static unsigned short atcmd_virtual_keycode[ATCMD_VIRTUAL_KEYPAD_ROW][ATCMD_VIRTUAL_KEYPAD_COL] = {	{KEY_1, 	KEY_8, 		KEY_Q,  	 KEY_I,          KEY_D,      	KEY_HOME,	KEY_B,           KEY_UP},	{KEY_2, 	KEY_9, 		KEY_W,		 KEY_O,       	 KEY_F,		KEY_RIGHTSHIFT, KEY_N,	         KEY_DOWN},	{KEY_3, 	KEY_0, 		KEY_E,		 KEY_P,          KEY_G,      	KEY_Z,        	KEY_M, 	         KEY_UNKNOWN},	{KEY_4, 	KEY_BACK,  	KEY_R,		 KEY_SEARCH,     KEY_H,		KEY_X,    	KEY_LEFTSHIFT,   KEY_UNKNOWN},	{KEY_5, 	KEY_BACKSPACE, 	KEY_T,		 KEY_LEFTALT,    KEY_J,      	KEY_C,     	KEY_REPLY,       KEY_CAMERA},	{KEY_6, 	KEY_ENTER,  	KEY_Y,  	 KEY_A,		 KEY_K,		KEY_V,  	KEY_RIGHT,       KEY_CAMERAFOCUS},	{KEY_7, 	KEY_MENU,	KEY_U,  	 KEY_S,    	 KEY_L, 	KEY_SPACE,      KEY_LEFT,        KEY_SEND},	{KEY_UNKNOWN, 	KEY_UNKNOWN,  	KEY_UNKNOWN,     KEY_UNKNOWN, 	 KEY_UNKNOWN,	KEY_UNKNOWN,    KEY_FOLDER_MENU, KEY_FOLDER_HOME},};static struct atcmd_virtual_platform_data atcmd_virtual_pdata = {	.keypad_row = ATCMD_VIRTUAL_KEYPAD_ROW,	.keypad_col = ATCMD_VIRTUAL_KEYPAD_COL,	.keycode = (unsigned char *)atcmd_virtual_keycode,};static struct platform_device atcmd_virtual_device = {	.name = "atcmd_virtual_kbd",	.id = -1,	.dev = {		.platform_data = &atcmd_virtual_pdata,	},};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++++++++++Hardware Keys Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static unsigned int keypad_row_gpios[] = {32, 33, 36};static unsigned int keypad_col_gpios[] = {37, 38};#define KEYMAP_INDEX(row, col) ((row)*ARRAY_SIZE(keypad_col_gpios) + (col))static const unsigned short keypad_keymap_thunder[][8] = {	[LGE_REV_B] = {		[KEYMAP_INDEX(0, 0)] = KEY_MENU,		[KEYMAP_INDEX(0, 1)] = KEY_SEARCH,		[KEYMAP_INDEX(1, 0)] = KEY_HOME,		[KEYMAP_INDEX(1, 1)] = KEY_BACK,		[KEYMAP_INDEX(2, 0)] = KEY_VOLUMEDOWN,		[KEYMAP_INDEX(2, 1)] = KEY_VOLUMEUP,	},	[LGE_REV_C] = {		[KEYMAP_INDEX(0, 0)] = KEY_HOME,		[KEYMAP_INDEX(0, 1)] = KEY_SEARCH,		[KEYMAP_INDEX(1, 0)] = KEY_BACK,		[KEYMAP_INDEX(1, 1)] = KEY_MENU,		[KEYMAP_INDEX(2, 0)] = KEY_VOLUMEDOWN,		[KEYMAP_INDEX(2, 1)] = KEY_VOLUMEUP,	},	[LGE_REV_D] = {		[KEYMAP_INDEX(0, 0)] = KEY_HOME,		[KEYMAP_INDEX(0, 1)] = KEY_SEARCH,		[KEYMAP_INDEX(1, 0)] = KEY_BACK,		[KEYMAP_INDEX(1, 1)] = KEY_MENU,		[KEYMAP_INDEX(2, 0)] = KEY_VOLUMEDOWN,		[KEYMAP_INDEX(2, 1)] = KEY_VOLUMEUP,	},	[LGE_REV_E] = {		[KEYMAP_INDEX(0, 0)] = KEY_HOME,		[KEYMAP_INDEX(0, 1)] = KEY_SEARCH,		[KEYMAP_INDEX(1, 0)] = KEY_BACK,		[KEYMAP_INDEX(1, 1)] = KEY_MENU,		[KEYMAP_INDEX(2, 0)] = KEY_VOLUMEDOWN,		[KEYMAP_INDEX(2, 1)] = KEY_VOLUMEUP,	},	[LGE_REV_F] = {		[KEYMAP_INDEX(0, 0)] = KEY_HOME,		[KEYMAP_INDEX(0, 1)] = KEY_SEARCH,		[KEYMAP_INDEX(1, 0)] = KEY_BACK,		[KEYMAP_INDEX(1, 1)] = KEY_MENU,		[KEYMAP_INDEX(2, 0)] = KEY_VOLUMEDOWN,		[KEYMAP_INDEX(2, 1)] = KEY_VOLUMEUP,	},	[LGE_REV_10] = {		[KEYMAP_INDEX(0, 0)] = KEY_HOME,		[KEYMAP_INDEX(0, 1)] = KEY_SEARCH,		[KEYMAP_INDEX(1, 0)] = KEY_BACK,		[KEYMAP_INDEX(1, 1)] = KEY_MENU,		[KEYMAP_INDEX(2, 0)] = KEY_VOLUMEDOWN,		[KEYMAP_INDEX(2, 1)] = KEY_VOLUMEUP,	},	[LGE_REV_11] = {		[KEYMAP_INDEX(0, 0)] = KEY_HOME,		[KEYMAP_INDEX(0, 1)] = KEY_SEARCH,		[KEYMAP_INDEX(1, 0)] = KEY_BACK,		[KEYMAP_INDEX(1, 1)] = KEY_MENU,		[KEYMAP_INDEX(2, 0)] = KEY_VOLUMEDOWN,		[KEYMAP_INDEX(2, 1)] = KEY_VOLUMEUP,	},};int thunderg_matrix_info_wrapper(struct gpio_event_input_devs *input_dev, struct gpio_event_info *info, void **data, int func){        int ret ;	if (func == GPIO_EVENT_FUNC_RESUME) {		gpio_tlmm_config(GPIO_CFG(keypad_col_gpios[0], 0,GPIO_CFG_INPUT, GPIO_CFG_PULL_UP,GPIO_CFG_2MA), GPIO_CFG_ENABLE);		gpio_tlmm_config(GPIO_CFG(keypad_col_gpios[1], 0,GPIO_CFG_INPUT, GPIO_CFG_PULL_UP,GPIO_CFG_2MA), GPIO_CFG_ENABLE);	}	ret = gpio_event_matrix_func(input_dev, info, data, func);        return ret ;}static int thunderg_gpio_matrix_power(                const struct gpio_event_platform_data *pdata, bool on){	/* this is dummy function to make gpio_event driver register suspend function*/	return 0;}static struct gpio_event_matrix_info thunder_keypad_matrix_info = {	.info.func	= thunderg_matrix_info_wrapper,	.keymap		= NULL,	.output_gpios	= keypad_row_gpios,	.input_gpios	= keypad_col_gpios,	.noutputs	= ARRAY_SIZE(keypad_row_gpios),	.ninputs	= ARRAY_SIZE(keypad_col_gpios),	.settle_time.tv.nsec = 40 * NSEC_PER_USEC,	.poll_time.tv.nsec = 20 * NSEC_PER_MSEC,	.flags		= GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_PRINT_UNMAPPED_KEYS | GPIOKPF_DRIVE_INACTIVE};static void __init thunder_select_keymap(void){	thunder_keypad_matrix_info.keymap = keypad_keymap_thunder[lge_bd_rev];	return;}static struct gpio_event_info *thunder_keypad_info[] = {	&thunder_keypad_matrix_info.info};static struct gpio_event_platform_data thunder_keypad_data = {	.name		= "thunder_keypad",	.info		= thunder_keypad_info,	.info_count	= ARRAY_SIZE(thunder_keypad_info),	.power          = thunderg_gpio_matrix_power,};struct platform_device keypad_device_thunder= {	.name	= GPIO_EVENT_DEV_NAME,	.id	= -1,	.dev	= {		.platform_data	= &thunder_keypad_data,	},};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*++++++++++++++++++++++++++++++++++++++++++++++++++++++KeyReset Platform Device Support+++++++++++++++++++++++++++++++++++++++++++++++++++*/static int thunderg_reset_keys_up[] = {	KEY_HOME,	0};static struct keyreset_platform_data thunderg_reset_keys_pdata = {	.keys_up = thunderg_reset_keys_up,	.keys_down = {		//KEY_BACK,		KEY_VOLUMEDOWN,		KEY_SEARCH,		0	},};struct platform_device thunderg_reset_keys_device = {	.name = KEYRESET_NAME,	.dev.platform_data = &thunderg_reset_keys_pdata,};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*++++++++++++++++++++++++++++++++++++++++++++++++++++++++mcs6000 Touchscreen Support++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static struct gpio_i2c_pin ts_i2c_pin[] = {	[0] = {		.sda_pin	= TS_GPIO_I2C_SDA,		.scl_pin	= TS_GPIO_I2C_SCL,		.reset_pin	= 0,		.irq_pin	= TS_GPIO_IRQ,	},};static struct i2c_gpio_platform_data ts_i2c_pdata = {	.sda_is_open_drain	= 0,	.scl_is_open_drain	= 0,	.udelay				= 2,};static struct platform_device ts_i2c_device = {	.id     = i2c_bus_num,	.name	= "i2c-gpio",	.dev.platform_data = &ts_i2c_pdata,};static int ts_set_vreg_pulldown(int onoff){	struct vreg *vreg_touch;	int rc;	unsigned id;	printk("[Touch] %s() pulldown:%d\n",__FUNCTION__, onoff);	vreg_touch = vreg_get(0, "synt");	if(IS_ERR(vreg_touch)) {		printk("[Touch] vreg_get fail : touch\n");		return -1;	}	id = PM_VREG_PDOWN_SYNT_ID;	rc = msm_proc_comm(PCOM_VREG_PULLDOWN, &onoff, &id);	if (rc != 0) {		printk("[Touch] vreg_set_pulldown failed\n");		return -1;	}	vreg_disable(vreg_touch);	return 0;}static int ts_set_vreg(unsigned char onoff){	struct vreg *vreg_touch;	int rc;	printk("[Touch] %s() onoff:%d\n",__FUNCTION__, onoff);	vreg_touch = vreg_get(0, "synt");	if(IS_ERR(vreg_touch)) {		printk("[Touch] vreg_get fail : touch\n");		return -1;	}	if (onoff) {		rc = vreg_set_level(vreg_touch, 3050);		if (rc != 0) {			printk("[Touch] vreg_set_level failed\n");			return -1;		}		vreg_enable(vreg_touch);	} else {		vreg_disable(vreg_touch);	}	return 0;}static struct touch_platform_data ts_pdata = {	.ts_x_min = TS_X_MIN,	.ts_x_max = TS_X_MAX,	.ts_y_min = TS_Y_MIN,	.ts_y_max = TS_Y_MAX,	.power 	  = ts_set_vreg,	.pulldown = ts_set_vreg_pulldown,	.irq 	  = TS_GPIO_IRQ,	.scl      = TS_GPIO_I2C_SCL,	.sda      = TS_GPIO_I2C_SDA,};static struct i2c_board_info ts_i2c_bdinfo[] = {	[0] = {		I2C_BOARD_INFO("touch_mcs6000", TS_I2C_SLAVE_ADDR),		.type = "touch_mcs6000",		.platform_data = &ts_pdata,	},};static void __init thunderg_init_i2c_touch(){	ts_i2c_pdata.sda_pin = ts_i2c_pin[0].sda_pin;	ts_i2c_pdata.scl_pin = ts_i2c_pin[0].scl_pin;	gpio_tlmm_config(GPIO_CFG(ts_i2c_pin[0].sda_pin, 0, GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_tlmm_config(GPIO_CFG(ts_i2c_pin[0].scl_pin, 0, GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_set_value(ts_i2c_pin[0].sda_pin, 1);	gpio_set_value(ts_i2c_pin[0].scl_pin, 1);	if (ts_i2c_pin[0].reset_pin) {		gpio_tlmm_config(GPIO_CFG(ts_i2c_pin[0].reset_pin, 0, GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);		gpio_set_value(ts_i2c_pin[0].reset_pin, 1);	}	if (ts_i2c_pin[0].irq_pin) {		gpio_tlmm_config(GPIO_CFG(ts_i2c_pin[0].irq_pin, 0, GPIO_CFG_INPUT,GPIO_CFG_PULL_UP, GPIO_CFG_2MA), GPIO_CFG_ENABLE);		ts_i2c_bdinfo[0].irq =			MSM_GPIO_TO_INT(ts_i2c_pin[0].irq_pin);	}	i2c_register_board_info(ts_i2c_device.id, &ts_i2c_bdinfo[0], 1);	platform_device_register(&ts_i2c_device);}i2c_bus_num++;/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++Accelerometer Support+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static int kr3dh_config_gpio(int config){	if (config) {		/* for wake state */		gpio_tlmm_config(GPIO_CFG(ACCEL_GPIO_I2C_SCL, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);		gpio_tlmm_config(GPIO_CFG(ACCEL_GPIO_I2C_SDA, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	} else {		/* for sleep state */		gpio_tlmm_config(GPIO_CFG(ACCEL_GPIO_I2C_SCL, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);		gpio_tlmm_config(GPIO_CFG(ACCEL_GPIO_I2C_SDA, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	}	return 0;}static int kr_init(void){	return 0;}static void kr_exit(void){}static int accel_power_on(void){	int ret = 0;	struct vreg *gp3_vreg = vreg_get(0, "gp3");	printk("[Accelerometer] %s() : Power On\n",__FUNCTION__);	vreg_set_level(gp3_vreg, 3000);	vreg_enable(gp3_vreg);	return ret;}static int accel_power_off(void){	int ret = 0;	struct vreg *gp3_vreg = vreg_get(0, "gp3");	printk("[Accelerometer] %s() : Power Off\n",__FUNCTION__);	vreg_disable(gp3_vreg);	return ret;}struct kr3dh_platform_data kr3dh_data = {	.poll_interval = 100,	.min_interval = 0,	.g_range = 0x00,	.axis_map_x = 0,	.axis_map_y = 1,	.axis_map_z = 2,	.negate_x = 0,	.negate_y = 0,	.negate_z = 0,	.power_on = accel_power_on,	.power_off = accel_power_off,	.kr_init = kr_init,	.kr_exit = kr_exit,	.gpio_config = kr3dh_config_gpio,};static struct gpio_i2c_pin accel_i2c_pin[] = {	[0] = {		.sda_pin	= ACCEL_GPIO_I2C_SDA,		.scl_pin	= ACCEL_GPIO_I2C_SCL,		.reset_pin	= 0,		.irq_pin	= ACCEL_GPIO_INT,	},};static struct i2c_gpio_platform_data accel_i2c_pdata = {	.sda_is_open_drain = 0,	.scl_is_open_drain = 0,	.udelay = 2,};static struct platform_device accel_i2c_device = {	.id   =  i2c_bus_num,	.name = "i2c-gpio",	.dev.platform_data = &accel_i2c_pdata,};static struct i2c_board_info accel_i2c_bdinfo[] = {	[1] = {		I2C_BOARD_INFO("KR3DH", ACCEL_I2C_ADDRESS_H),		.type = "KR3DH",		.platform_data = &kr3dh_data,	},	[0] = {		I2C_BOARD_INFO("KR3DM", ACCEL_I2C_ADDRESS),		.type = "KR3DM",		.platform_data = &kr3dh_data,	},};static void __init thunderg_init_i2c_acceleration(){	accel_i2c_pdata.sda_pin = accel_i2c_pin[0].sda_pin;	accel_i2c_pdata.scl_pin = accel_i2c_pin[0].scl_pin;	gpio_tlmm_config(GPIO_CFG(accel_i2c_pin[0].sda_pin, 0, GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_tlmm_config(GPIO_CFG(accel_i2c_pin[0].scl_pin, 0, GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);	gpio_set_value(accel_i2c_pin[0].sda_pin, 1);	gpio_set_value(accel_i2c_pin[0].scl_pin, 1);	if (accel_i2c_pin[0].reset_pin) {		gpio_tlmm_config(GPIO_CFG(accel_i2c_pin[0].reset_pin, 0, GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);		gpio_set_value(accel_i2c_pin[0].reset_pin, 1);	}	if (accel_i2c_pin[0].irq_pin) {		gpio_tlmm_config(GPIO_CFG(accel_i2c_pin[0].irq_pin, 0, GPIO_CFG_INPUT,GPIO_CFG_PULL_UP, GPIO_CFG_2MA), GPIO_CFG_ENABLE);		accel_i2c_bdinfo[0].irq =			MSM_GPIO_TO_INT(accel_i2c_pin[0].irq_pin);	}	if(lge_bd_rev >= LGE_REV_11)		i2c_register_board_info(accel_i2c_device.id, &accel_i2c_bdinfo[1], 1);	/* KR3DH */	else		i2c_register_board_info(accel_i2c_device.id, &accel_i2c_bdinfo[0], 1);	/* KR3DM */	platform_device_register(&accel_i2c_device);}i2c_bus_num++;/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*+++++++++++++++++++++++++++++++++++++++++++++++++ECompass & Proximity Sensor Support+++++++++++++++++++++++++++++++++++++++++++++++++++++*/static int ecom_power_set(unsigned char onoff){	int ret = 0;	struct vreg *gp3_vreg = vreg_get(0, "gp3");	struct vreg *gp6_vreg = vreg_get(0, "gp6");	printk("[Ecompass] %s() : Power %s\n",__FUNCTION__, onoff ? "On" : "Off");	if (onoff) {		vreg_set_level(gp3_vreg, 3000);		vreg_enable(gp3_vreg);		/* proximity power on , when we turn off I2C line be set to low caues sensor H/W characteristic */		vreg_set_level(gp6_vreg, 2800);		vreg_enable(gp6_vreg);	} else {		vreg_disable(gp3_vreg);		/* proximity power off */		vreg_disable(gp6_vreg);	}	return ret;}static struct ecom_platform_data ecom_pdata = {	.pin_int        	= ECOM_GPIO_INT,	.pin_rst		= 0,	.power          	= ecom_power_set,};static int prox_power_set(unsigned char onoff){	int ret = 0;	struct vreg *gp6_vreg = vreg_get(0, "gp6");	printk("[Proximity] %s() : Power %s\n",__FUNCTION__, onoff ? "On" : "Off");	if (onoff) {		vreg_set_level(gp6_vreg, 2800);		vreg_enable(gp6_vreg);	} else {		vreg_disable(gp6_vreg);	}	return ret;}static struct proximity_platform_data proxi_pdata = {	.irq_num	= PROXI_GPIO_DOUT,	.power		= prox_power_set,	.methods		= 0,	.operation_mode		= 2,	.debounce	 = 0,	.cycle = 2,};static struct i2c_board_info prox_ecom_i2c_bdinfo[] = {	[0] = {		I2C_BOARD_INFO("proximity_gp2ap", PROXI_I2C_ADDRESS),		.type = "proximity_gp2ap",		.platform_data = &proxi_pdata,	},	[1] = {		I2C_BOARD_INFO("ami304_sensor", ECOM_I2C_ADDRESS),		.type = "ami304_sensor",		.platform_data = &ecom_pdata,	},};static struct gpio_i2c_pin proxi_ecom_i2c_pin[] = {	[0] = {		.sda_pin	= PROXI_GPIO_I2C_SDA,		.scl_pin	= PROXI_GPIO_I2C_SCL,		.reset_pin	= 0,		.irq_pin	= PROXI_GPIO_DOUT,	},	[1] = {		.sda_pin	= ECOM_GPIO_I2C_SDA,		.scl_pin	= ECOM_GPIO_I2C_SCL,		.reset_pin	= 0,		.irq_pin	= ECOM_GPIO_INT,	},};static struct i2c_gpio_platform_data proxi_ecom_i2c_pdata = {	.sda_is_open_drain = 0,	.scl_is_open_drain = 0,	.udelay = 2,};static struct platform_device proxi_ecom_i2c_device = {	.id   =  i2c_bus_num,        .name = "i2c-gpio",        .dev.platform_data = &proxi_ecom_i2c_pdata,};static void __init thunderg_init_i2c_prox_ecom(int bus_num){	int index;		for(index=0;index<2;index++)	{		proxi_ecom_i2c_pdata.sda_pin = proxi_ecom_i2c_pin[index].sda_pin;		proxi_ecom_i2c_pdata.scl_pin = proxi_ecom_i2c_pin[index].scl_pin;		gpio_tlmm_config(GPIO_CFG(proxi_ecom_i2c_pin[index].sda_pin,0,GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL,GPIO_CFG_2MA), 					 GPIO_CFG_ENABLE);		gpio_tlmm_config(GPIO_CFG(proxi_ecom_i2c_pin[index].scl_pin, 0, GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL, GPIO_CFG_2MA), 					 GPIO_CFG_ENABLE);		gpio_set_value(proxi_ecom_i2c_pin[index].sda_pin, 1);		gpio_set_value(proxi_ecom_i2c_pin[index].scl_pin, 1);		if (proxi_ecom_i2c_pin[index].reset_pin) {			gpio_tlmm_config(GPIO_CFG(proxi_ecom_i2c_pin[index].reset_pin, 0,GPIO_CFG_OUTPUT,GPIO_CFG_NO_PULL,GPIO_CFG_2MA), 						 GPIO_CFG_ENABLE);			gpio_set_value(proxi_ecom_i2c_pin[index].reset_pin, 1);		}		if (proxi_ecom_i2c_pin[index].irq_pin) {			gpio_tlmm_config(GPIO_CFG(proxi_ecom_i2c_pin[index].irq_pin, 0, GPIO_CFG_INPUT,GPIO_CFG_PULL_UP, GPIO_CFG_2MA), 					 GPIO_CFG_ENABLE);			prox_ecom_i2c_bdinfo[index].irq =MSM_GPIO_TO_INT(proxi_ecom_i2c_pin[index].irq_pin);		}	i2c_register_board_info(proxi_ecom_i2c_device.id, &prox_ecom_i2c_bdinfo[0], 2);	platform_device_register(&proxi_ecom_i2c_device);}i2c_bus_num++;/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/struct platform_device asoc_msm_pcm = {	.name   = "msm-dsp-audio",	.id     = 0,};struct platform_device asoc_msm_dai0 = {	.name   = "msm-codec-dai",	.id     = 0,};struct platform_device asoc_msm_dai1 = {	.name   = "msm-cpu-dai",	.id     = 0,};/*++++++++++++++++++++++++++++++++++++++++++++++++++++++Devices being added to system++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static struct platform_device *devices[] __initdata = {	&asoc_msm_pcm,	&asoc_msm_dai0,	&asoc_msm_dai1,	&msm_device_smd, #	&msm_device_dmov, #	&msm_device_nand, ##ifdef CONFIG_USB_MSM_OTG_72K	&msm_device_otg, ##ifdef CONFIG_USB_GADGET	&msm_device_gadget_peripheral, ##endif#endif#ifdef CONFIG_USB_ANDROID	&usb_mass_storage_device, #	&rndis_device, ##ifdef CONFIG_USB_ANDROID_CDC_ECM	&ecm_device, ##endif#ifdef CONFIG_USB_ANDROID_ACM	&acm_device, ##endif#ifdef CONFIG_USB_ANDROID_DIAG	&usb_diag_device, ##endif#ifdef CONFIG_USB_SUPPORT_LGE_ANDROID_AUTORUN	&usb_cdrom_storage_device, ##endif	&android_usb_device, ##endif#ifdef CONFIG_USB_G_ANDROID	&android_usb_device, ##endif	&msm_device_i2c, #	&msm_device_tssc,	&android_pmem_device, #	&android_pmem_adsp_device, #	&android_pmem_audio_device, #	&msm_fb_device, #	&mddi_hitachi_panel_device #	&msm_device_uart_dm1, ##ifdef CONFIG_BT	&msm_bt_power_device, ##endif	&msm_device_pmic_leds, #	&msm_device_snd, #	&msm_device_adspdec, ##if defined (CONFIG_ISX005)	&msm_camera_sensor_isx005, ##endif	&msm_bluesleep_device, ##ifdef CONFIG_ARCH_MSM7X27	&msm_kgsl_3d0, ##endif#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE)	&msm_device_tsif, ##endif	&hs_device, #	&keypad_device_thunder, #	&thunderg_reset_keys_device, #	&atcmd_virtual_device, #	&msm_batt_device, #	&android_vibrator_device, #	&thunderg_carkit_device, #	&thunderg_earsense_device, #	&thunderg_pwrsink_device, #};/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++MMC Support++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/#if (defined(CONFIG_MMC_MSM_SDC1_SUPPORT)\	|| defined(CONFIG_MMC_MSM_SDC2_SUPPORT)\	|| defined(CONFIG_MMC_MSM_SDC3_SUPPORT)\	|| defined(CONFIG_MMC_MSM_SDC4_SUPPORT))static unsigned long vreg_sts, gpio_sts;static struct vreg *vreg_mmc;static unsigned mpp_mmc = 2;struct sdcc_gpio {	struct msm_gpio *cfg_data;	uint32_t size;	struct msm_gpio *sleep_cfg_data;};static struct msm_gpio sdc1_cfg_data[] = {#ifdef  CONFIG_MMC_MSM_CARD_HW_DETECTION	{GPIO_CFG(GPIO_SD_DATA_3, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_3"},	{GPIO_CFG(GPIO_SD_DATA_2, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_2"},	{GPIO_CFG(GPIO_SD_DATA_1, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_1"},	{GPIO_CFG(GPIO_SD_DATA_0, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_0"},	{GPIO_CFG(GPIO_SD_CMD, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_cmd"},	{GPIO_CFG(GPIO_SD_CLK, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "sdc1_clk"},#else	{GPIO_CFG(51, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_3"},	{GPIO_CFG(52, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_2"},	{GPIO_CFG(53, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_1"},	{GPIO_CFG(54, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_dat_0"},	{GPIO_CFG(55, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc1_cmd"},	{GPIO_CFG(56, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "sdc1_clk"},#endif};static struct msm_gpio sdc2_cfg_data[] = {	{GPIO_CFG(62, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "sdc2_clk"},	{GPIO_CFG(63, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_cmd"},	{GPIO_CFG(64, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_3"},	{GPIO_CFG(65, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_2"},	{GPIO_CFG(66, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_1"},	{GPIO_CFG(67, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc2_dat_0"},};static struct msm_gpio sdc2_sleep_cfg_data[] = {	{GPIO_CFG(62, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "sdc2_clk"},	{GPIO_CFG(63, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "sdc2_cmd"},	{GPIO_CFG(64, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "sdc2_dat_3"},	{GPIO_CFG(65, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "sdc2_dat_2"},	{GPIO_CFG(66, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "sdc2_dat_1"},	{GPIO_CFG(67, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "sdc2_dat_0"},};static struct msm_gpio sdc3_cfg_data[] = {	{GPIO_CFG(88, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "sdc3_clk"},	{GPIO_CFG(89, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_cmd"},	{GPIO_CFG(90, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_3"},	{GPIO_CFG(91, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_2"},	{GPIO_CFG(92, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_1"},	{GPIO_CFG(93, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc3_dat_0"},};static struct msm_gpio sdc4_cfg_data[] = {	{GPIO_CFG(19, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_3"},	{GPIO_CFG(20, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_2"},	{GPIO_CFG(21, 4, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_1"},	{GPIO_CFG(107, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_cmd"},	{GPIO_CFG(108, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_8MA), "sdc4_dat_0"},	{GPIO_CFG(109, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "sdc4_clk"},};static struct sdcc_gpio sdcc_cfg_data[] = {	{		.cfg_data = sdc1_cfg_data,		.size = ARRAY_SIZE(sdc1_cfg_data),		.sleep_cfg_data = NULL,	},	{		.cfg_data = sdc2_cfg_data,		.size = ARRAY_SIZE(sdc2_cfg_data),		.sleep_cfg_data = sdc2_sleep_cfg_data,	},	{		.cfg_data = sdc3_cfg_data,		.size = ARRAY_SIZE(sdc3_cfg_data),		.sleep_cfg_data = NULL,	},	{		.cfg_data = sdc4_cfg_data,		.size = ARRAY_SIZE(sdc4_cfg_data),		.sleep_cfg_data = NULL,	},};static void msm_sdcc_setup_gpio(int dev_id, unsigned int enable){	int rc = 0;	struct sdcc_gpio *curr;	curr = &sdcc_cfg_data[dev_id - 1];	if (!(test_bit(dev_id, &gpio_sts)^enable))		return;	if (enable) {		set_bit(dev_id, &gpio_sts);		rc = msm_gpios_request_enable(curr->cfg_data, curr->size);		if (rc)			printk(KERN_ERR "%s: Failed to turn on GPIOs for slot %d\n",				__func__,  dev_id);	} else {		clear_bit(dev_id, &gpio_sts);		if (curr->sleep_cfg_data) {			msm_gpios_enable(curr->sleep_cfg_data, curr->size);			msm_gpios_free(curr->sleep_cfg_data, curr->size);			return;		}		msm_gpios_disable_free(curr->cfg_data, curr->size);	}}static uint32_t msm_sdcc_setup_power(struct device *dv, unsigned int vdd){	int rc = 0;	struct platform_device *pdev;	pdev = container_of(dv, struct platform_device, dev);	msm_sdcc_setup_gpio(pdev->id, !!vdd);	if (vdd == 0) {		if (!vreg_sts)			return 0;		clear_bit(pdev->id, &vreg_sts);		if (!vreg_sts) {			if (machine_is_msm7x25_ffa() ||					machine_is_msm7x27_ffa()) {				rc = mpp_config_digital_out(mpp_mmc,				     MPP_CFG(MPP_DLOGIC_LVL_MSMP,				     MPP_DLOGIC_OUT_CTRL_LOW));			} else				rc = regulator_disable(vreg_mmc);			if (rc) {				pr_err("%s: return val: %d\n",					__func__, rc);			}		}		return 0;	}	if (!vreg_sts) {		if (machine_is_msm7x25_ffa() || machine_is_msm7x27_ffa()) {			rc = mpp_config_digital_out(mpp_mmc,			     MPP_CFG(MPP_DLOGIC_LVL_MSMP,			     MPP_DLOGIC_OUT_CTRL_HIGH));		} else {#ifdef CONFIG_MMC_MSM_CARD_HW_DETECTION			rc = vreg_set_level(vreg_mmc, VREG_SD_LEVEL);#else					rc = vreg_set_level(vreg_mmc, 2850);#endif			if (!rc)				rc = regulator_enable(vreg_mmc);		}		if (rc) {			pr_err("%s: return val: %d\n",					__func__, rc);		}	}	set_bit(pdev->id, &vreg_sts);	return 0;}#ifdef CONFIG_MMC_MSM_CARD_HW_DETECTIONstatic unsigned int thunderg_sdcc_slot_status(struct device *dev){	return !(gpio_get_value(GPIO_MMC_COVER_DETECT)||gpio_get_value(GPIO_SD_DETECT_N));}#endifstatic struct mmc_platform_data msm7x2x_sdcc_data = {#ifdef CONFIG_MMC_MSM_CARD_HW_DETECTION	.ocr_mask		= MMC_VDD_30_31,	.translate_vdd	= msm_sdcc_setup_power,	.status 		= thunderg_sdcc_slot_status,	.status_irq 	= MSM_GPIO_TO_INT(GPIO_MMC_COVER_DETECT),	.irq_flags		= IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,	.mmc_bus_width	= MMC_CAP_4_BIT_DATA,#else	.ocr_mask		= MMC_VDD_28_29,	.translate_vdd	= msm_sdcc_setup_power,	.mmc_bus_width  = MMC_CAP_4_BIT_DATA,#endif		.msmsdcc_fmin	= 144000,	.msmsdcc_fmid	= 24576000,	.msmsdcc_fmax	= 49152000,	.nonremovable	= 0,};#if defined(CONFIG_LGE_BCM432X_PATCH)static unsigned int bcm432x_sdcc_wlan_slot_status(struct device *dev){	printk(KERN_ERR "%s: %d %d\n", __func__, CONFIG_BCM4325_GPIO_WL_RESET, gpio_get_value(CONFIG_BCM4325_GPIO_WL_RESET));    return gpio_get_value(CONFIG_BCM4325_GPIO_WL_RESET);}static struct mmc_platform_data bcm432x_sdcc_wlan_data = {    .ocr_mask   	= MMC_VDD_30_31,	.translate_vdd	= msm_sdcc_setup_power,    .status     	= bcm432x_sdcc_wlan_slot_status,	.status_irq		= MSM_GPIO_TO_INT(CONFIG_BCM4325_GPIO_WL_RESET),    .irq_flags      = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,    .mmc_bus_width  = MMC_CAP_4_BIT_DATA,	.msmsdcc_fmin	= 144000,	.msmsdcc_fmid	= 24576000,	.msmsdcc_fmax	= 49152000,	.nonremovable	= 1,};#endifstatic void __init msm7x2x_init_mmc(void){	if (!machine_is_msm7x25_ffa() && !machine_is_msm7x27_ffa()) {		vreg_mmc = vreg_get(NULL, "wlan");		if (IS_ERR(vreg_mmc)) {			pr_err("%s: could not get regulator: %ld\n",					__func__, PTR_ERR(vreg_mmc));		}	}#ifdef CONFIG_MMC_MSM_CARD_HW_DETECTION	int rc = 0;	if (gpio_request(GPIO_SD_DETECT_N, "sdc1_status_pin_irq"))		pr_err("failed to request gpio sdc1_status_irq\n");	rc = gpio_tlmm_config(GPIO_CFG(GPIO_SD_DETECT_N, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP,									GPIO_CFG_2MA), GPIO_CFG_ENABLE);	if (rc)		printk(KERN_ERR "%s: Failed to configure GPIO %d\n",					__func__, rc);	if (gpio_request(GPIO_MMC_COVER_DETECT, "sdc1_status_socket_irq"))		pr_err("failed to request gpio sdc1_status_irq\n");	rc = gpio_tlmm_config(GPIO_CFG(GPIO_MMC_COVER_DETECT, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP,								   GPIO_CFG_2MA), GPIO_CFG_ENABLE);	if (rc)		printk(KERN_ERR "%s: Failed to configure GPIO %d\n",					__func__, rc);#endif	msm_add_sdcc(1, &msm7x2x_sdcc_data);#if defined(CONFIG_LGE_BCM432X_PATCH)	/* GPIO config */	gpio_tlmm_config(GPIO_CFG(CONFIG_BCM4325_GPIO_WL_REGON, 0, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_2MA), GPIO_ENABLE);	gpio_configure(CONFIG_BCM4325_GPIO_WL_REGON, GPIOF_DRIVE_OUTPUT);	gpio_set_value(CONFIG_BCM4325_GPIO_WL_REGON, 0);	gpio_tlmm_config(GPIO_CFG(CONFIG_BCM4325_GPIO_WL_RESET, 0, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_2MA), GPIO_ENABLE);	gpio_configure(CONFIG_BCM4325_GPIO_WL_RESET, GPIOF_DRIVE_OUTPUT);	gpio_set_value(CONFIG_BCM4325_GPIO_WL_RESET, 0);		gpio_tlmm_config(GPIO_CFG(CONFIG_BCM4325_GPIO_WL_HOSTWAKEUP, 0, GPIO_OUTPUT, GPIO_PULL_UP, GPIO_2MA), GPIO_ENABLE);	gpio_configure(CONFIG_BCM4325_GPIO_WL_HOSTWAKEUP, GPIOF_INPUT);	/* Register platform device */        msm_add_sdcc(2, &bcm432x_sdcc_wlan_data);		/* Enable RESET IRQ for wlan card detect */	enable_irq(gpio_to_irq(CONFIG_BCM4325_GPIO_WL_RESET));#endif}#else#define msm7x2x_init_mmc() do {} while (0)#endif/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/extern struct sys_timer msm_timer;static void __init msm7x2x_init_irq(void){	msm_init_irq();}void msm_serial_debug_init(unsigned int base, int irq,			   struct device *clk_device, int signal_irq);static voidmsm_i2c_gpio_config(int iface, int config_type){	int gpio_scl;	int gpio_sda;	if (iface) {		gpio_scl = 95;		gpio_sda = 96;	} else {		gpio_scl = 60;		gpio_sda = 61;	}	if (config_type) {		gpio_tlmm_config(GPIO_CFG(gpio_scl, 1, GPIO_CFG_INPUT,					GPIO_CFG_NO_PULL, GPIO_CFG_16MA), GPIO_CFG_ENABLE);		gpio_tlmm_config(GPIO_CFG(gpio_sda, 1, GPIO_CFG_INPUT,					GPIO_CFG_NO_PULL, GPIO_CFG_16MA), GPIO_CFG_ENABLE);	} else {		gpio_tlmm_config(GPIO_CFG(gpio_scl, 0, GPIO_CFG_OUTPUT,					GPIO_CFG_NO_PULL, GPIO_CFG_16MA), GPIO_CFG_ENABLE);		gpio_tlmm_config(GPIO_CFG(gpio_sda, 0, GPIO_CFG_OUTPUT,					GPIO_CFG_NO_PULL, GPIO_CFG_16MA), GPIO_CFG_ENABLE);	}}static struct msm_i2c_platform_data msm_i2c_pdata = {	.clk_freq = 100000,	.rmutex  = 0,	.pri_clk = 60,	.pri_dat = 61,	.aux_clk = 95,	.aux_dat = 96,	.msm_i2c_config_gpio = msm_i2c_gpio_config,};static void __init msm_device_i2c_init(void){	if (gpio_request(60, "i2c_pri_clk"))		pr_err("failed to request gpio i2c_pri_clk\n");	if (gpio_request(61, "i2c_pri_dat"))		pr_err("failed to request gpio i2c_pri_dat\n");	if (gpio_request(95, "i2c_sec_clk"))		pr_err("failed to request gpio i2c_sec_clk\n");	if (gpio_request(96, "i2c_sec_dat"))		pr_err("failed to request gpio i2c_sec_dat\n");	msm_i2c_pdata.pm_lat =	msm7x27_pm_data[MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN]	.latency;	msm_device_i2c.dev.platform_data = &msm_i2c_pdata;}static void usb_mpp_init(void){	/*TODO*/}static void msm7x27_wlan_init(void){  	/*TODO*/}static void msm_adsp_add_pdev(void){	int rc = 0;	struct rpc_board_dev *rpc_adsp_pdev;	rpc_adsp_pdev = kzalloc(sizeof(struct rpc_board_dev), GFP_KERNEL);	if (rpc_adsp_pdev == NULL) {		pr_err("%s: Memory Allocation failure\n", __func__);		return;	}	rpc_adsp_pdev->prog = ADSP_RPC_PROG;	rpc_adsp_pdev->pdev = msm_adsp_device;	rc = msm_rpc_add_board_dev(rpc_adsp_pdev, 1);	if (rc < 0) {		pr_err("%s: return val: %d\n",	__func__, rc);		kfree(rpc_adsp_pdev);	}}/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++Main Init Rountine+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static void __init msm7x2x_init(void){	msm_clock_init(&msm7x27_clock_init_data);#if defined(CONFIG_MSM_SERIAL_DEBUGGER)	msm_serial_debug_init(MSM_UART3_PHYS, INT_UART3,			&msm_device_uart3.dev, 1);#endif	acpuclk_init(&acpuclk_7x27_soc_data);	usb_mpp_init();#ifdef CONFIG_USB_MSM_OTG_72K	msm_device_otg.dev.platform_data = &msm_otg_pdata;	if (machine_is_msm7x25_surf() || machine_is_msm7x25_ffa()) {		msm_otg_pdata.pemp_level =			PRE_EMPHASIS_WITH_20_PERCENT;		msm_otg_pdata.drv_ampl = HS_DRV_AMPLITUDE_5_PERCENT;		msm_otg_pdata.cdr_autoreset = CDR_AUTO_RESET_ENABLE;		msm_otg_pdata.phy_reset = msm_otg_rpc_phy_reset;	}	if (machine_is_msm7x27_surf() || machine_is_msm7x27_ffa()) {		msm_otg_pdata.pemp_level =			PRE_EMPHASIS_WITH_10_PERCENT;		msm_otg_pdata.drv_ampl = HS_DRV_AMPLITUDE_5_PERCENT;		msm_otg_pdata.cdr_autoreset = CDR_AUTO_RESET_DISABLE;		msm_otg_pdata.phy_reset_sig_inverted = 1;	}#ifdef CONFIG_USB_GADGET	msm_otg_pdata.swfi_latency =		msm7x27_pm_data		[MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT].latency;	msm_device_gadget_peripheral.dev.platform_data = &msm_gadget_pdata;	msm_gadget_pdata.is_phy_status_timer_on = 1;#endif#endif#if defined(CONFIG_TSIF) || defined(CONFIG_TSIF_MODULE)	msm_device_tsif.dev.platform_data = &tsif_platform_data;#endif	thunder_select_keymap();	lcd_bl_power_state = BL_POWER_RESUME;	platform_add_devices(devices, ARRAY_SIZE(devices));#if !defined(CONFIG_MSM_SERIAL_DEBUGGER)	if (lge_get_uart_mode())		platform_device_register(&msm_device_uart3);#endif#ifdef CONFIG_MSM_CAMERA	config_camera_off_gpios(); /* might not be necessary */#endif	msm_adsp_add_pdev();	msm_device_i2c_init();	i2c_register_board_info(0, i2c_devices, ARRAY_SIZE(i2c_devices));	lcdc_gordon_gpio_init();	msm_fb_add_devices();#ifdef CONFIG_USB_EHCI_MSM_72K	msm7x2x_init_host();#endif	msm7x2x_init_mmc();	bt_power_init();#ifdef CONFIG_ANDROID_RAM_CONSOLE	lge_add_ramconsole_devices();	lge_add_ers_devices();	lge_add_panic_handler_devices();#endif	thunderg_init_i2c_backlight();	lge_add_gpio_i2c_device(thunderg_init_i2c_touch);	lge_add_gpio_i2c_device(thunderg_init_i2c_prox_ecom);	lge_add_gpio_i2c_device(thunderg_init_i2c_acceleration);	if (cpu_is_msm7x27())		msm_pm_set_platform_data(msm7x27_pm_data,					ARRAY_SIZE(msm7x27_pm_data));	else		msm_pm_set_platform_data(msm7x25_pm_data,					ARRAY_SIZE(msm7x25_pm_data));	BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata));	msm7x27_wlan_init();}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/static unsigned pmem_kernel_ebi1_size = PMEM_KERNEL_EBI1_SIZE;static int __init pmem_kernel_ebi1_size_setup(char *p){	pmem_kernel_ebi1_size = memparse(p, NULL);	return 0;}early_param("pmem_kernel_ebi1_size", pmem_kernel_ebi1_size_setup);static unsigned pmem_mdp_size = MSM_PMEM_MDP_SIZE;static int __init pmem_mdp_size_setup(char *p){	pmem_mdp_size = memparse(p, NULL);	return 0;}early_param("pmem_mdp_size", pmem_mdp_size_setup);static unsigned pmem_adsp_size = MSM_PMEM_ADSP_SIZE;static int __init pmem_adsp_size_setup(char *p){	pmem_adsp_size = memparse(p, NULL);	return 0;}early_param("pmem_adsp_size", pmem_adsp_size_setup);static unsigned pmem_audio_size = MSM_PMEM_AUDIO_SIZE;static int __init pmem_audio_size_setup(char *p){	pmem_audio_size = memparse(p, NULL);	return 0;}early_param("pmem_audio_size", pmem_audio_size_setup);static unsigned fb_size = MSM_FB_SIZE;static int __init fb_size_setup(char *p){	fb_size = memparse(p, NULL);	return 0;}early_param("fb_size", fb_size_setup);static void __init msm_msm7x2x_allocate_memory_regions(void){	void *addr;	unsigned long size;	size = fb_size ? : MSM_FB_SIZE;	addr = alloc_bootmem_align(size, 0x1000);	msm_fb_resources[0].start = __pa(addr);	msm_fb_resources[0].end = msm_fb_resources[0].start + size - 1;	pr_info("allocating %lu bytes at %p (%lx physical) for fb\n",		size, addr, __pa(addr));}static struct memtype_reserve msm7x27_reserve_table[] __initdata = {	[MEMTYPE_SMI] = {	},	[MEMTYPE_EBI0] = {		.flags	=	MEMTYPE_FLAGS_1M_ALIGN,	},	[MEMTYPE_EBI1] = {		.flags	=	MEMTYPE_FLAGS_1M_ALIGN,	},};static void __init size_pmem_devices(void){#ifdef CONFIG_ANDROID_PMEM	android_pmem_adsp_pdata.size = pmem_adsp_size;	android_pmem_pdata.size = pmem_mdp_size;	android_pmem_audio_pdata.size = pmem_audio_size;#endif}static void __init reserve_memory_for(struct android_pmem_platform_data *p){	msm7x27_reserve_table[p->memory_type].size += p->size;}static void __init reserve_pmem_memory(void){#ifdef CONFIG_ANDROID_PMEM	reserve_memory_for(&android_pmem_adsp_pdata);	reserve_memory_for(&android_pmem_pdata);	reserve_memory_for(&android_pmem_audio_pdata);	msm7x27_reserve_table[MEMTYPE_EBI1].size += pmem_kernel_ebi1_size;#endif}static void __init msm7x27_calculate_reserve_sizes(void){	size_pmem_devices();	reserve_pmem_memory();}static int msm7x27_paddr_to_memtype(unsigned int paddr){	return MEMTYPE_EBI1;}static struct reserve_info msm7x27_reserve_info __initdata = {	.memtype_reserve_table = msm7x27_reserve_table,	.calculate_reserve_sizes = msm7x27_calculate_reserve_sizes,	.paddr_to_memtype = msm7x27_paddr_to_memtype,};static void __init msm7x27_reserve(void){	reserve_info = &msm7x27_reserve_info;	msm_reserve();}static void __init msm7x27_init_early(void){	msm_msm7x2x_allocate_memory_regions();}static void __init msm7x2x_map_io(void){	msm_map_common_io();	if (socinfo_init() < 0)		BUG();#ifdef CONFIG_CACHE_L2X0	/* 7x27 has 256KB L2 cache:		64Kb/Way and 4-Way Associativity;		R/W latency: 3 cycles; 		evmon/parity/share disabled. */	l2x0_init(MSM_L2CC_BASE, 0x00068012, 0xfe000000);#endif}MACHINE_START(MSM7X27_THUNDERG, "THUNDER Global board (LGE LGP500)")	.boot_params	= PLAT_PHYS_OFFSET + 0x100,	.map_io		= msm7x2x_map_io,	.reserve	= msm7x27_reserve,	.init_irq	= msm7x2x_init_irq,	.init_machine	= msm7x2x_init,	.timer		= &msm_timer,        .init_early     = msm7x27_init_early,	.handle_irq     = vic_handle_irq,MACHINE_END