msm: camera: Add i2c mux support for native 3D camera

Signed-off-by: Nishant Pandit <npandit@codeaurora.org>
diff --git a/arch/arm/mach-msm/board-msm8960.c b/arch/arm/mach-msm/board-msm8960.c
index 87896df..4c29fd3 100644
--- a/arch/arm/mach-msm/board-msm8960.c
+++ b/arch/arm/mach-msm/board-msm8960.c
@@ -475,7 +475,7 @@
 		},
 	},
 };
-static struct gpiomux_setting cam_settings[4] = {
+static struct gpiomux_setting cam_settings[] = {
 	{
 		.func = GPIOMUX_FUNC_GPIO, /*suspend*/
 		.drv = GPIOMUX_DRV_2MA,
@@ -499,9 +499,34 @@
 		.drv = GPIOMUX_DRV_8MA,
 		.pull = GPIOMUX_PULL_UP,
 	},
+
+	{
+		.func = GPIOMUX_FUNC_5, /*active 4*/
+		.drv = GPIOMUX_DRV_8MA,
+		.pull = GPIOMUX_PULL_UP,
+	},
+
+	{
+		.func = GPIOMUX_FUNC_6, /*active 5*/
+		.drv = GPIOMUX_DRV_8MA,
+		.pull = GPIOMUX_PULL_UP,
+	},
+
+	{
+		.func = GPIOMUX_FUNC_2, /*active 6*/
+		.drv = GPIOMUX_DRV_2MA,
+		.pull = GPIOMUX_PULL_UP,
+	},
+
+	{
+		.func = GPIOMUX_FUNC_3, /*active 7*/
+		.drv = GPIOMUX_DRV_8MA,
+		.pull = GPIOMUX_PULL_UP,
+	},
+
 };
 
-static struct msm_gpiomux_config msm8960_cam_configs[] = {
+static struct msm_gpiomux_config msm8960_cam_common_configs[] = {
 	{
 		.gpio = 2,
 		.settings = {
@@ -531,6 +556,23 @@
 		},
 	},
 	{
+		.gpio = 76,
+		.settings = {
+			[GPIOMUX_ACTIVE]    = &cam_settings[2],
+			[GPIOMUX_SUSPENDED] = &cam_settings[0],
+		},
+	},
+	{
+		.gpio = 107,
+		.settings = {
+			[GPIOMUX_ACTIVE]    = &cam_settings[2],
+			[GPIOMUX_SUSPENDED] = &cam_settings[0],
+		},
+	},
+};
+
+static struct msm_gpiomux_config msm8960_cam_2d_configs[] = {
+	{
 		.gpio = 18,
 		.settings = {
 			[GPIOMUX_ACTIVE]    = &cam_settings[3],
@@ -558,20 +600,6 @@
 			[GPIOMUX_SUSPENDED] = &cam_settings[0],
 		},
 	},
-	{
-		.gpio = 76,
-		.settings = {
-			[GPIOMUX_ACTIVE]    = &cam_settings[2],
-			[GPIOMUX_SUSPENDED] = &cam_settings[0],
-		},
-	},
-	{
-		.gpio = 107,
-		.settings = {
-			[GPIOMUX_ACTIVE]    = &cam_settings[2],
-			[GPIOMUX_SUSPENDED] = &cam_settings[0],
-		},
-	},
 };
 
 static struct gpiomux_setting cyts_resout_sus_cfg = {
@@ -892,12 +920,19 @@
 
 #ifdef CONFIG_MSM_CAMERA
 
-static uint16_t msm_cam_gpio_tbl[] = {
+static uint16_t msm_cam_gpio_2d_tbl[] = {
 	5, /*CAMIF_MCLK*/
 	20, /*CAMIF_I2C_DATA*/
 	21, /*CAMIF_I2C_CLK*/
 };
 
+static struct msm_camera_gpio_conf gpio_conf = {
+	.cam_gpiomux_conf_tbl = msm8960_cam_2d_configs,
+	.cam_gpiomux_conf_tbl_size = ARRAY_SIZE(msm8960_cam_2d_configs),
+	.cam_gpio_tbl = msm_cam_gpio_2d_tbl,
+	.cam_gpio_tbl_size = ARRAY_SIZE(msm_cam_gpio_2d_tbl),
+};
+
 #define VFE_CAMIF_TIMER1_GPIO 2
 #define VFE_CAMIF_TIMER2_GPIO 3
 #define VFE_CAMIF_TIMER3_GPIO_INT 4
@@ -921,26 +956,17 @@
 };
 #endif
 
-#ifdef CONFIG_IMX074
-static struct msm_camera_sensor_platform_info sensor_board_info = {
-	.mount_angle = 90
-};
-#endif
-
-struct msm_camera_device_platform_data msm_camera_csi0_device_data = {
-	.ioclk.mclk_clk_rate = 24000000,
-	.ioclk.vfe_clk_rate  = 228570000,
-	.csid_core = 0,
-	.cam_gpio_tbl = msm_cam_gpio_tbl,
-	.cam_gpio_tbl_size = ARRAY_SIZE(msm_cam_gpio_tbl),
-};
-
-struct msm_camera_device_platform_data msm_camera_csi1_device_data = {
-	.ioclk.mclk_clk_rate = 24000000,
-	.ioclk.vfe_clk_rate  = 228570000,
-	.csid_core = 1,
-	.cam_gpio_tbl = msm_cam_gpio_tbl,
-	.cam_gpio_tbl_size = ARRAY_SIZE(msm_cam_gpio_tbl),
+struct msm_camera_device_platform_data msm_camera_csi_device_data[] = {
+	{
+		.ioclk.mclk_clk_rate = 24000000,
+		.ioclk.vfe_clk_rate  = 228570000,
+		.csid_core = 0,
+	},
+	{
+		.ioclk.mclk_clk_rate = 24000000,
+		.ioclk.vfe_clk_rate  = 228570000,
+		.csid_core = 1,
+	},
 };
 
 #ifdef CONFIG_IMX074
@@ -951,17 +977,23 @@
 #endif
 };
 
-static struct msm_camera_sensor_info msm_camera_sensor_imx074_data = {
-	.sensor_name	= "imx074",
+static struct msm_camera_sensor_platform_info sensor_board_info_imx074 = {
+	.mount_angle	= 90,
 	.sensor_reset	= 107,
 	.sensor_pwd	= 85,
 	.vcm_pwd	= 0,
 	.vcm_enable	= 1,
-	.pdata	= &msm_camera_csi0_device_data,
+};
+
+static struct msm_camera_sensor_info msm_camera_sensor_imx074_data = {
+	.sensor_name	= "imx074",
+	.pdata	= &msm_camera_csi_device_data[0],
 	.flash_data	= &flash_imx074,
 	.strobe_flash_data = &strobe_flash_xenon,
-	.sensor_platform_info = &sensor_board_info,
-	.csi_if	= 1
+	.sensor_platform_info = &sensor_board_info_imx074,
+	.gpio_conf = &gpio_conf,
+	.csi_if	= 1,
+	.camera_type = BACK_CAMERA_2D,
 };
 
 struct platform_device msm8960_camera_sensor_imx074 = {
@@ -976,15 +1008,22 @@
 	.flash_type	= MSM_CAMERA_FLASH_NONE,
 };
 
-static struct msm_camera_sensor_info msm_camera_sensor_ov2720_data = {
-	.sensor_name	= "ov2720",
+static struct msm_camera_sensor_platform_info sensor_board_info_ov2720 = {
+	.mount_angle	= 0,
 	.sensor_reset	= 76,
 	.sensor_pwd	= 85,
 	.vcm_pwd	= 0,
 	.vcm_enable	= 1,
-	.pdata	= &msm_camera_csi1_device_data,
+};
+
+static struct msm_camera_sensor_info msm_camera_sensor_ov2720_data = {
+	.sensor_name	= "ov2720",
+	.pdata	= &msm_camera_csi_device_data[1],
 	.flash_data	= &flash_ov2720,
-	.csi_if	= 1
+	.sensor_platform_info = &sensor_board_info_ov2720,
+	.gpio_conf = &gpio_conf,
+	.csi_if	= 1,
+	.camera_type = FRONT_CAMERA_2D,
 };
 
 struct platform_device msm8960_camera_sensor_ov2720 = {
@@ -999,16 +1038,22 @@
 	.flash_type	= MSM_CAMERA_FLASH_LED,
 };
 
-static struct msm_camera_sensor_info msm_camera_sensor_qs_mt9p017_data = {
-	.sensor_name	= "qs_mt9p017",
+static struct msm_camera_sensor_platform_info sensor_board_info_qs_mt9p017 = {
+	.mount_angle	= 270,
 	.sensor_reset	= 107,
 	.sensor_pwd	= 85,
 	.vcm_pwd	= 0,
 	.vcm_enable	= 1,
-	.pdata	= &msm_camera_csi0_device_data,
+};
+
+static struct msm_camera_sensor_info msm_camera_sensor_qs_mt9p017_data = {
+	.sensor_name	= "qs_mt9p017",
+	.pdata	= &msm_camera_csi_device_data[0],
 	.flash_data	= &flash_qs_mt9p017,
-	.sensor_platform_info = &sensor_board_info,
-	.csi_if	= 1
+	.sensor_platform_info = &sensor_board_info_qs_mt9p017,
+	.gpio_conf = &gpio_conf,
+	.csi_if	= 1,
+	.camera_type = BACK_CAMERA_3D,
 };
 
 struct platform_device msm8960_camera_sensor_qs_mt9p017 = {
@@ -2085,8 +2130,8 @@
 		return rc;
 	}
 
-	msm_gpiomux_install(msm8960_cam_configs,
-			ARRAY_SIZE(msm8960_cam_configs));
+	msm_gpiomux_install(msm8960_cam_common_configs,
+			ARRAY_SIZE(msm8960_cam_common_configs));
 
 	msm_gpiomux_install(msm8960_gpiomux_configs,
 			ARRAY_SIZE(msm8960_gpiomux_configs));
diff --git a/arch/arm/mach-msm/devices-8960.c b/arch/arm/mach-msm/devices-8960.c
index 08c8435..e346104 100644
--- a/arch/arm/mach-msm/devices-8960.c
+++ b/arch/arm/mach-msm/devices-8960.c
@@ -996,6 +996,19 @@
 		.end	= MSM8960_CSIPHY_2LN_IRQ,
 		.flags	= IORESOURCE_IRQ,
 	},
+	{
+		.name   = "s3d_rw",
+		.start  = 0x008003E0,
+		.end    = 0x008003E0 + SZ_16 - 1,
+		.flags  = IORESOURCE_MEM,
+	},
+	{
+		.name   = "s3d_ctl",
+		.start  = 0x008020B8,
+		.end    = 0x008020B8 + SZ_16 - 1,
+		.flags  = IORESOURCE_MEM,
+	},
+
 };
 
 int __init msm_get_cam_resources(struct msm_camera_sensor_info *s_info)
diff --git a/arch/arm/mach-msm/include/mach/board.h b/arch/arm/mach-msm/include/mach/board.h
index a537b4f..e0aa28d 100644
--- a/arch/arm/mach-msm/include/mach/board.h
+++ b/arch/arm/mach-msm/include/mach/board.h
@@ -65,8 +65,6 @@
 #ifdef CONFIG_MSM_BUS_SCALING
 	struct msm_bus_scale_pdata *cam_bus_scale_table;
 #endif
-	uint16_t *cam_gpio_tbl;
-	uint8_t cam_gpio_tbl_size;
 };
 enum msm_camera_csi_data_format {
 	CSI_8BIT,
@@ -159,8 +157,27 @@
 	int state;
 };
 
+enum msm_camera_type {
+	BACK_CAMERA_2D,
+	FRONT_CAMERA_2D,
+	BACK_CAMERA_3D,
+	BACK_CAMERA_INT_3D,
+};
+
 struct msm_camera_sensor_platform_info {
 	int mount_angle;
+	int sensor_reset_enable;
+	int sensor_reset;
+	int sensor_pwd;
+	int vcm_pwd;
+	int vcm_enable;
+};
+
+struct msm_camera_gpio_conf {
+	void *cam_gpiomux_conf_tbl;
+	uint8_t cam_gpiomux_conf_tbl_size;
+	uint16_t *cam_gpio_tbl;
+	uint8_t cam_gpio_tbl_size;
 };
 
 struct msm_camera_sensor_info {
@@ -181,6 +198,8 @@
 	struct msm_camera_csi_params csi_params;
 	struct msm_camera_sensor_strobe_flash_data *strobe_flash_data;
 	char *eeprom_data;
+	struct msm_camera_gpio_conf *gpio_conf;
+	enum msm_camera_type camera_type;
 };
 
 int __init msm_get_cam_resources(struct msm_camera_sensor_info *);
diff --git a/arch/arm/mach-msm/include/mach/camera.h b/arch/arm/mach-msm/include/mach/camera.h
index c0dc909..5b0e019 100644
--- a/arch/arm/mach-msm/include/mach/camera.h
+++ b/arch/arm/mach-msm/include/mach/camera.h
@@ -95,12 +95,6 @@
 	VPE_MSG_OUTPUT_ST_R,
 };
 
-enum msm_camera_type {
-	BACK_CAMERA_2D,
-	FRONT_CAMERA_2D,
-	BACK_CAMERA_3D,
-};
-
 enum msm_stereo_state {
 	STEREO_VIDEO_IDLE,
 	STEREO_VIDEO_ACTIVE,
@@ -598,12 +592,19 @@
 	S_EXIT
 };
 
+enum msm_cam_mode {
+	MODE_R,
+	MODE_L,
+	MODE_DUAL
+};
+
 int msm_camio_enable(struct platform_device *dev);
 int msm_camio_jpeg_clk_enable(void);
 int msm_camio_jpeg_clk_disable(void);
 int msm_camio_vpe_clk_enable(uint32_t);
 int msm_camio_vpe_clk_disable(void);
 
+void msm_camio_mode_config(enum msm_cam_mode mode);
 int  msm_camio_clk_enable(enum msm_camio_clk_type clk);
 int  msm_camio_clk_disable(enum msm_camio_clk_type clk);
 int  msm_camio_clk_config(uint32_t freq);
@@ -619,6 +620,8 @@
 
 void msm_camio_vfe_blk_reset(void);
 
+int32_t msm_camio_3d_enable(const struct msm_camera_sensor_info *sinfo);
+void msm_camio_3d_disable(void);
 void msm_camio_clk_sel(enum msm_camio_clk_src_type);
 void msm_camio_disable(struct platform_device *);
 int msm_camio_probe_on(struct platform_device *);
diff --git a/drivers/media/video/msm/msm_io_8960.c b/drivers/media/video/msm/msm_io_8960.c
index 96c096c..436ce52 100644
--- a/drivers/media/video/msm/msm_io_8960.c
+++ b/drivers/media/video/msm/msm_io_8960.c
@@ -15,6 +15,7 @@
 #include <linux/io.h>
 #include <linux/regulator/consumer.h>
 #include <mach/gpio.h>
+#include <mach/gpiomux.h>
 #include <mach/board.h>
 #include <mach/camera.h>
 #include <mach/vreg.h>
@@ -134,10 +135,10 @@
 
 static struct msm_camera_io_clk camio_clk;
 static struct platform_device *camio_dev;
-static struct resource *csidio, *csiphyio;
-static struct resource *csid_mem, *csiphy_mem;
+static struct resource *csidio, *csiphyio, *s3drw_io, *s3dctl_io;
+static struct resource *csid_mem, *csiphy_mem, *s3drw_mem, *s3dctl_mem;
 static struct resource *csid_irq, *csiphy_irq;
-void __iomem *csidbase, *csiphybase;
+void __iomem *csidbase, *csiphybase, *s3d_rw, *s3d_ctl;
 
 static struct msm_bus_vectors cam_init_vectors[] = {
 	{
@@ -1043,27 +1044,32 @@
 static int config_gpio_table(int gpio_en)
 {
 	struct msm_camera_sensor_info *sinfo = camio_dev->dev.platform_data;
-	struct msm_camera_device_platform_data *camdev = sinfo->pdata;
+	struct msm_camera_gpio_conf *gpio_conf = sinfo->gpio_conf;
 	int rc = 0, i = 0;
 
-	if (camdev->cam_gpio_tbl == NULL) {
-		pr_err("%s: Invalid NULL cam gpio table\n", __func__);
+	if (gpio_conf->cam_gpio_tbl == NULL || gpio_conf->cam_gpiomux_conf_tbl
+		== NULL) {
+		pr_err("%s: Invalid NULL cam gpio config table\n", __func__);
 		return -EFAULT;
 	}
 
 	if (gpio_en) {
-		for (i = 0; i < camdev->cam_gpio_tbl_size; i++) {
-			rc = gpio_request(camdev->cam_gpio_tbl[i], "CAM_GPIO");
+		msm_gpiomux_install((struct msm_gpiomux_config *)gpio_conf->
+			cam_gpiomux_conf_tbl,
+			gpio_conf->cam_gpiomux_conf_tbl_size);
+		for (i = 0; i < gpio_conf->cam_gpio_tbl_size; i++) {
+			rc = gpio_request(gpio_conf->cam_gpio_tbl[i],
+				 "CAM_GPIO");
 			if (rc < 0) {
 				pr_err("%s not able to get gpio\n", __func__);
 				for (i--; i >= 0; i--)
-					gpio_free(camdev->cam_gpio_tbl[i]);
+					gpio_free(gpio_conf->cam_gpio_tbl[i]);
 					break;
 			}
 		}
 	} else {
-		for (i = 0; i < camdev->cam_gpio_tbl_size; i++)
-			gpio_free(camdev->cam_gpio_tbl[i]);
+		for (i = 0; i < gpio_conf->cam_gpio_tbl_size; i++)
+			gpio_free(gpio_conf->cam_gpio_tbl[i]);
 	}
 	return rc;
 }
@@ -1185,6 +1191,72 @@
 	msm_camio_disable_all_clks(csid_core);
 }
 
+int32_t msm_camio_3d_enable(const struct msm_camera_sensor_info *s_info)
+{
+	int32_t val = 0, rc = 0;
+	char s3drw[] = "s3d_rw";
+	char s3dctl[] = "s3d_ctl";
+	struct platform_device *pdev = camio_dev;
+	pdev->resource = s_info->resource;
+	pdev->num_resources = s_info->num_resources;
+
+	s3drw_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, s3drw);
+	if (!s3drw_mem) {
+		pr_err("%s: no mem resource?\n", __func__);
+		return -ENODEV;
+	}
+	s3dctl_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, s3dctl);
+	if (!s3dctl_mem) {
+		pr_err("%s: no mem resource?\n", __func__);
+		return -ENODEV;
+	}
+	s3drw_io = request_mem_region(s3drw_mem->start,
+		resource_size(s3drw_mem), pdev->name);
+	if (!s3drw_io)
+		return -EBUSY;
+
+	s3d_rw = ioremap(s3drw_mem->start,
+		resource_size(s3drw_mem));
+	if (!s3d_rw) {
+		rc = -ENOMEM;
+		goto s3drw_nomem;
+	}
+	s3dctl_io = request_mem_region(s3dctl_mem->start,
+		resource_size(s3dctl_mem), pdev->name);
+	if (!s3dctl_io) {
+		rc = -EBUSY;
+		goto s3dctl_busy;
+	}
+	s3d_ctl = ioremap(s3dctl_mem->start,
+		resource_size(s3dctl_mem));
+	if (!s3d_ctl) {
+		rc = -ENOMEM;
+		goto s3dctl_nomem;
+	}
+
+	val = msm_io_r(s3d_rw);
+	msm_io_w((val | 0x200), s3d_rw);
+	return rc;
+
+s3dctl_nomem:
+	release_mem_region(s3dctl_mem->start, resource_size(s3dctl_mem));
+s3dctl_busy:
+	iounmap(s3d_rw);
+s3drw_nomem:
+	release_mem_region(s3drw_mem->start, resource_size(s3drw_mem));
+return rc;
+}
+
+void msm_camio_3d_disable(void)
+{
+	int32_t val = 0;
+	msm_io_w((val & ~0x200), s3d_rw);
+	iounmap(s3d_ctl);
+	release_mem_region(s3dctl_mem->start, resource_size(s3dctl_mem));
+	iounmap(s3d_rw);
+	release_mem_region(s3drw_mem->start, resource_size(s3drw_mem));
+}
+
 int msm_camio_sensor_clk_on(struct platform_device *pdev)
 {
 	int rc = 0;
@@ -1338,6 +1410,23 @@
 	return rc;
 }
 
+void msm_camio_mode_config(enum msm_cam_mode mode)
+{
+	uint32_t val;
+	val = msm_io_r(s3d_ctl);
+	if (mode == MODE_DUAL) {
+		msm_io_w(val | 0x3, s3d_ctl);
+	} else if (mode == MODE_L) {
+		msm_io_w(((val | 0x2) & ~(0x1)), s3d_ctl);
+		val = msm_io_r(s3d_ctl);
+		CDBG("the camio mode config left value is %d\n", val);
+	} else {
+		msm_io_w(((val | 0x1) & ~(0x2)), s3d_ctl);
+		val = msm_io_r(s3d_ctl);
+		CDBG("the camio mode config right value is %d\n", val);
+	}
+}
+
 void msm_camio_set_perf_lvl(enum msm_bus_perf_setting perf_setting)
 {
 	static uint32_t bus_perf_client;
diff --git a/drivers/media/video/msm/qs_mt9p017.c b/drivers/media/video/msm/qs_mt9p017.c
index f5bc070..d160af8 100644
--- a/drivers/media/video/msm/qs_mt9p017.c
+++ b/drivers/media/video/msm/qs_mt9p017.c
@@ -857,13 +857,16 @@
 static int32_t qs_mt9p017_power_up(const struct msm_camera_sensor_info *data)
 {
 	int32_t rc = 0;
-	rc = gpio_request(data->sensor_reset, "qs_mt9p017");
+	rc = gpio_request(data->sensor_platform_info->sensor_reset,
+		"qs_mt9p017");
 	CDBG("%s\n", __func__);
 	if (!rc) {
 		CDBG("sensor_reset = %d\n", rc);
-		gpio_direction_output(data->sensor_reset, 0);
+		gpio_direction_output(data->sensor_platform_info->sensor_reset
+			, 0);
 		msleep(50);
-		gpio_set_value_cansleep(data->sensor_reset, 1);
+		gpio_set_value_cansleep(data->sensor_platform_info->
+			sensor_reset, 1);
 		msleep(20);
 	} else {
 		CDBG("sensor reset fail");
@@ -876,8 +879,8 @@
 
 static int32_t qs_mt9p017_power_down(const struct msm_camera_sensor_info *data)
 {
-	gpio_set_value_cansleep(data->sensor_reset, 0);
-	gpio_free(data->sensor_reset);
+	gpio_set_value_cansleep(data->sensor_platform_info->sensor_reset, 0);
+	gpio_free(data->sensor_platform_info->sensor_reset);
 	return 0;
 }
 
@@ -1154,7 +1157,7 @@
 	s->s_release = qs_mt9p017_sensor_release;
 	s->s_config  = qs_mt9p017_sensor_config;
 	s->s_mount_angle = 270;
-
+	s->s_camera_type = info->camera_type;
 	qs_mt9p017_power_down(info);
 	return rc;
 
diff --git a/drivers/media/video/msm/sensors/imx074_v4l2.c b/drivers/media/video/msm/sensors/imx074_v4l2.c
index 0c9e864..fd0c310 100644
--- a/drivers/media/video/msm/sensors/imx074_v4l2.c
+++ b/drivers/media/video/msm/sensors/imx074_v4l2.c
@@ -971,9 +971,9 @@
 }
 static int imx074_probe_init_done(const struct msm_camera_sensor_info *data)
 {
-	gpio_set_value_cansleep(data->sensor_reset, 0);
-	gpio_direction_input(data->sensor_reset);
-	gpio_free(data->sensor_reset);
+	gpio_set_value_cansleep(data->sensor_platform_info->sensor_reset, 0);
+	gpio_direction_input(data->sensor_platform_info->sensor_reset);
+	gpio_free(data->sensor_platform_info->sensor_reset);
 	return 0;
 }
 
@@ -1055,13 +1055,16 @@
 	int32_t rc = 0;
 	unsigned short chipidl, chipidh;
 	CDBG("%s: %d\n", __func__, __LINE__);
-	rc = gpio_request(data->sensor_reset, "imx074");
+	rc = gpio_request(data->sensor_platform_info
+		->sensor_reset, "imx074");
 	CDBG("imx074_probe_init_sensor\n");
 	if (!rc) {
 		CDBG("sensor_reset = %d\n", rc);
-		gpio_direction_output(data->sensor_reset, 0);
+		gpio_direction_output(data->sensor_platform_info
+			->sensor_reset, 0);
 		usleep_range(5000, 6000);
-		gpio_set_value_cansleep(data->sensor_reset, 1);
+		gpio_set_value_cansleep(data->sensor_platform_info
+			->sensor_reset, 1);
 		usleep_range(5000, 6000);
 	} else {
 		CDBG("gpio reset fail");
@@ -1099,9 +1102,11 @@
 	int32_t rc = 0;
 	CDBG("imx074 enable AF actuator, gpio = %d\n",
 			imx074_ctrl->sensordata->vcm_pwd);
-	rc = gpio_request(imx074_ctrl->sensordata->vcm_pwd, "imx074");
+	rc = gpio_request(imx074_ctrl->sensordata->sensor_platform_info
+		->vcm_pwd, "imx074");
 	if (!rc) {
-		gpio_direction_output(imx074_ctrl->sensordata->vcm_pwd, 1);
+		gpio_direction_output(imx074_ctrl->sensordata->
+			sensor_platform_info->vcm_pwd, 1);
 		msleep(20);
 		rc = imx074_af_init();
 		if (rc < 0)
@@ -1113,8 +1118,9 @@
 }
 static void imx074_poweroff_af(void)
 {
-	gpio_set_value_cansleep(imx074_ctrl->sensordata->vcm_pwd, 0);
-	gpio_free(imx074_ctrl->sensordata->vcm_pwd);
+	gpio_set_value_cansleep(imx074_ctrl->sensordata->sensor_platform_info
+		->vcm_pwd, 0);
+	gpio_free(imx074_ctrl->sensordata->sensor_platform_info->vcm_pwd);
 }
 /* camsensor_iu060f_imx074_reset */
 int imx074_sensor_open_init(const struct msm_camera_sensor_info *data)
@@ -1359,10 +1365,12 @@
 	if (machine_is_msm8x60_fluid())
 		imx074_poweroff_af();
 	imx074_power_down();
-	gpio_set_value_cansleep(imx074_ctrl->sensordata->sensor_reset, 0);
+	gpio_set_value_cansleep(imx074_ctrl->sensordata->sensor_platform_info
+		->sensor_reset, 0);
 	usleep_range(5000, 6000);
-	gpio_direction_input(imx074_ctrl->sensordata->sensor_reset);
-	gpio_free(imx074_ctrl->sensordata->sensor_reset);
+	gpio_direction_input(imx074_ctrl->sensordata->sensor_platform_info
+		->sensor_reset);
+	gpio_free(imx074_ctrl->sensordata->sensor_platform_info->sensor_reset);
 	CDBG("imx074_release completed\n");
 	mutex_unlock(&imx074_mut);
 
@@ -1385,7 +1393,7 @@
 	s->s_init = imx074_sensor_open_init;
 	s->s_release = imx074_sensor_release;
 	s->s_config  = imx074_sensor_config;
-	s->s_camera_type = BACK_CAMERA_2D;
+	s->s_camera_type = info->camera_type;
 	s->s_mount_angle = info->sensor_platform_info->mount_angle;
 	imx074_probe_init_done(info);
 	return rc;
diff --git a/drivers/media/video/msm/sensors/msm_sensor.c b/drivers/media/video/msm/sensors/msm_sensor.c
index cfa6c3f..05e128e 100644
--- a/drivers/media/video/msm/sensors/msm_sensor.c
+++ b/drivers/media/video/msm/sensors/msm_sensor.c
@@ -576,12 +576,15 @@
 	int32_t rc = 0;
 	CDBG("%s: %d\n", __func__, __LINE__);
 	msm_camio_clk_rate_set(MSM_SENSOR_MCLK_24HZ);
-	rc = gpio_request(data->sensor_reset, "SENSOR_NAME");
+	rc = gpio_request(data->sensor_platform_info->sensor_reset,
+		"SENSOR_NAME");
 	if (!rc) {
 		CDBG("%s: reset sensor\n", __func__);
-		gpio_direction_output(data->sensor_reset, 0);
+		gpio_direction_output(data->sensor_platform_info->sensor_reset,
+			 0);
 		usleep_range(1000, 2000);
-		gpio_set_value_cansleep(data->sensor_reset, 1);
+		gpio_set_value_cansleep(data->sensor_platform_info->
+			sensor_reset, 1);
 		usleep_range(1000, 2000);
 	} else {
 		CDBG("%s: gpio request fail", __func__);
@@ -592,9 +595,9 @@
 int32_t msm_sensor_power_down(const struct msm_camera_sensor_info *data)
 {
 	CDBG("%s\n", __func__);
-	gpio_set_value_cansleep(data->sensor_reset, 0);
+	gpio_set_value_cansleep(data->sensor_platform_info->sensor_reset, 0);
 	usleep_range(1000, 2000);
-	gpio_free(data->sensor_reset);
+	gpio_free(data->sensor_platform_info->sensor_reset);
 	return 0;
 }
 
@@ -707,7 +710,7 @@
 	s->s_init = s_ctrl->func_tbl->sensor_open_init;
 	s->s_release = s_ctrl->func_tbl->sensor_release;
 	s->s_config  = s_ctrl->func_tbl->sensor_config;
-	s->s_camera_type = s_ctrl->camera_type;
+	s->s_camera_type = info->camera_type;
 	if (info->sensor_platform_info != NULL)
 		s->s_mount_angle = info->sensor_platform_info->mount_angle;
 	else
diff --git a/drivers/media/video/msm/sensors/msm_sensor.h b/drivers/media/video/msm/sensors/msm_sensor.h
index 08904b4..fedd485 100644
--- a/drivers/media/video/msm/sensors/msm_sensor.h
+++ b/drivers/media/video/msm/sensors/msm_sensor.h
@@ -157,7 +157,6 @@
 	enum msm_sensor_resolution_t pict_res;
 	enum msm_sensor_resolution_t curr_res;
 	enum msm_sensor_cam_mode_t cam_mode;
-	enum msm_camera_type camera_type;
 
 	struct mutex *msm_sensor_mutex;
 	struct msm_camera_csi2_params *curr_csi_params;
diff --git a/drivers/media/video/msm/sensors/ov2720.c b/drivers/media/video/msm/sensors/ov2720.c
index 23e623a..be15b779 100644
--- a/drivers/media/video/msm/sensors/ov2720.c
+++ b/drivers/media/video/msm/sensors/ov2720.c
@@ -517,7 +517,6 @@
 	.sensor_id_info = &ov2720_id_info,
 	.sensor_exp_gain_info = &ov2720_exp_gain_info,
 	.cam_mode = MSM_SENSOR_MODE_INVALID,
-	.camera_type = FRONT_CAMERA_2D,
 	.csi_params = &ov2720_csi_params_array[0],
 	.msm_sensor_mutex = &ov2720_mut,
 	.sensor_i2c_driver = &ov2720_i2c_driver,