msm: camera: Add I2C mux control driver
add i2c mux control driver to control i2c bus
The driver will control which camera the i2c
control message will send to. (etc left, right, both)
Change-Id: I592701b8445d6acc8dfc60f81d562ee52dd65971
Signed-off-by: Kevin Chan <ktchan@codeaurora.org>
diff --git a/arch/arm/mach-msm/devices-8960.c b/arch/arm/mach-msm/devices-8960.c
index 4525bab..0c1d4ab 100644
--- a/arch/arm/mach-msm/devices-8960.c
+++ b/arch/arm/mach-msm/devices-8960.c
@@ -1134,27 +1134,27 @@
};
#ifdef CONFIG_MSM_CAMERA
-struct resource msm_camera_resources[] = {
+static struct resource msm_cam_gsbi4_i2c_mux_resources[] = {
{
- .name = "s3d_rw",
+ .name = "i2c_mux_rw",
.start = 0x008003E0,
- .end = 0x008003E0 + SZ_16 - 1,
+ .end = 0x008003E0 + SZ_8 - 1,
.flags = IORESOURCE_MEM,
},
{
- .name = "s3d_ctl",
+ .name = "i2c_mux_ctl",
.start = 0x008020B8,
- .end = 0x008020B8 + SZ_16 - 1,
+ .end = 0x008020B8 + SZ_4 - 1,
.flags = IORESOURCE_MEM,
},
};
-int __init msm_get_cam_resources(struct msm_camera_sensor_info *s_info)
-{
- s_info->resource = msm_camera_resources;
- s_info->num_resources = ARRAY_SIZE(msm_camera_resources);
- return 0;
-}
+struct platform_device msm8960_device_i2c_mux_gsbi4 = {
+ .name = "msm_cam_i2c_mux",
+ .id = 0,
+ .resource = msm_cam_gsbi4_i2c_mux_resources,
+ .num_resources = ARRAY_SIZE(msm_cam_gsbi4_i2c_mux_resources),
+};
static struct resource msm_csiphy0_resources[] = {
{
diff --git a/arch/arm/mach-msm/devices.h b/arch/arm/mach-msm/devices.h
index c4f57ab..78cb73e 100644
--- a/arch/arm/mach-msm/devices.h
+++ b/arch/arm/mach-msm/devices.h
@@ -59,6 +59,7 @@
extern struct platform_device msm8960_device_qup_i2c_gsbi12;
extern struct platform_device msm8960_device_qup_spi_gsbi1;
extern struct platform_device msm8960_gemini_device;
+extern struct platform_device msm8960_device_i2c_mux_gsbi4;
extern struct platform_device msm8960_device_csiphy0;
extern struct platform_device msm8960_device_csiphy1;
extern struct platform_device msm8960_device_csid0;
diff --git a/arch/arm/mach-msm/include/mach/board.h b/arch/arm/mach-msm/include/mach/board.h
index ba9fc70..5d22d66 100644
--- a/arch/arm/mach-msm/include/mach/board.h
+++ b/arch/arm/mach-msm/include/mach/board.h
@@ -202,6 +202,18 @@
uint8_t cam_gpio_set_tbl_size;
};
+enum msm_camera_i2c_mux_mode {
+ MODE_R,
+ MODE_L,
+ MODE_DUAL
+};
+
+struct msm_camera_i2c_conf {
+ uint8_t use_i2c_mux;
+ struct platform_device *mux_dev;
+ enum msm_camera_i2c_mux_mode i2c_mux_mode;
+};
+
struct msm_camera_sensor_platform_info {
int mount_angle;
int sensor_reset;
@@ -209,6 +221,7 @@
int num_vreg;
int32_t (*ext_power_ctrl) (int enable);
struct msm_camera_gpio_conf *gpio_conf;
+ struct msm_camera_i2c_conf *i2c_conf;
};
struct msm_actuator_info {
diff --git a/arch/arm/mach-msm/include/mach/camera.h b/arch/arm/mach-msm/include/mach/camera.h
index 700e28c..ef7be45 100644
--- a/arch/arm/mach-msm/include/mach/camera.h
+++ b/arch/arm/mach-msm/include/mach/camera.h
@@ -631,12 +631,6 @@
S_EXIT
};
-enum msm_cam_mode {
- MODE_R,
- MODE_L,
- MODE_DUAL
-};
-
struct msm_cam_clk_info {
const char *clk_name;
long clk_rate;
@@ -648,7 +642,7 @@
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);
+void msm_camio_mode_config(enum msm_camera_i2c_mux_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);