msm: camera: Convert camera sensors into i2c devices
Convert camera sensors to i2c devices as well as
v4l2 sub-devices.
Change-Id: Iefe7050aec051bb591dfdb26696094cde65b6af0
Signed-off-by: Kevin Chan <ktchan@codeaurora.org>
Signed-off-by: Jignesh Mehta <jigneshm@codeaurora.org>
diff --git a/arch/arm/mach-msm/board-8930-camera.c b/arch/arm/mach-msm/board-8930-camera.c
index 9161fbf..7edfa9e 100644
--- a/arch/arm/mach-msm/board-8930-camera.c
+++ b/arch/arm/mach-msm/board-8930-camera.c
@@ -11,8 +11,6 @@
*
*/
-#include <linux/i2c.h>
-#include <linux/i2c/sx150x.h>
#include <asm/mach-types.h>
#include <mach/board.h>
#include <mach/msm_bus_board.h>
@@ -402,13 +400,6 @@
.actuator_info = &imx074_actuator_info
#endif
};
-
-static struct platform_device msm8960_camera_sensor_imx074 = {
- .name = "msm_camera_imx074",
- .dev = {
- .platform_data = &msm_camera_sensor_imx074_data,
- },
-};
#endif
#ifdef CONFIG_OV2720
static struct msm_camera_sensor_flash_data flash_ov2720 = {
@@ -432,33 +423,13 @@
.csi_if = 1,
.camera_type = FRONT_CAMERA_2D,
};
-
-static struct platform_device msm8960_camera_sensor_ov2720 = {
- .name = "msm_camera_ov2720",
- .dev = {
- .platform_data = &msm_camera_sensor_ov2720_data,
- },
-};
#endif
void __init msm8930_init_cam(void)
{
- int i;
- struct platform_device *cam_dev[] = {
- &msm8960_camera_sensor_imx074,
- &msm8960_camera_sensor_ov2720,
- };
-
msm_gpiomux_install(msm8960_cam_common_configs,
ARRAY_SIZE(msm8960_cam_common_configs));
- for (i = 0; i < ARRAY_SIZE(cam_dev); i++) {
- struct msm_camera_sensor_info *s_info;
- s_info = cam_dev[i]->dev.platform_data;
- msm_get_cam_resources(s_info);
- platform_device_register(cam_dev[i]);
- }
-
platform_device_register(&msm8960_device_csiphy0);
platform_device_register(&msm8960_device_csiphy1);
platform_device_register(&msm8960_device_csid0);
@@ -467,4 +438,31 @@
platform_device_register(&msm8960_device_vfe);
platform_device_register(&msm8960_device_vpe);
}
+
+#ifdef CONFIG_I2C
+struct i2c_board_info msm8930_camera_i2c_boardinfo[] = {
+#ifdef CONFIG_IMX074
+ {
+ I2C_BOARD_INFO("imx074", 0x1A),
+ .platform_data = &msm_camera_sensor_imx074_data,
+ },
+#endif
+#ifdef CONFIG_OV2720
+ {
+ I2C_BOARD_INFO("ov2720", 0x6C),
+ .platform_data = &msm_camera_sensor_ov2720_data,
+ },
+#endif
+#ifdef CONFIG_MSM_CAMERA_FLASH_SC628A
+ {
+ I2C_BOARD_INFO("sc628a", 0x6E),
+ },
+#endif
+};
+
+struct msm_camera_board_info msm8930_camera_board_info = {
+ .board_info = msm8930_camera_i2c_boardinfo,
+ .num_i2c_board_info = ARRAY_SIZE(msm8930_camera_i2c_boardinfo),
+};
+#endif
#endif
diff --git a/arch/arm/mach-msm/board-8930.c b/arch/arm/mach-msm/board-8930.c
index bff699c..6eba2f9 100644
--- a/arch/arm/mach-msm/board-8930.c
+++ b/arch/arm/mach-msm/board-8930.c
@@ -1947,6 +1947,14 @@
#ifdef CONFIG_I2C
u8 mach_mask = 0;
int i;
+#ifdef CONFIG_MSM_CAMERA
+ struct i2c_registry msm8930_camera_i2c_devices = {
+ I2C_SURF | I2C_FFA | I2C_FLUID | I2C_LIQUID | I2C_RUMI,
+ MSM_8930_GSBI4_QUP_I2C_BUS_ID,
+ msm8930_camera_board_info.board_info,
+ msm8930_camera_board_info.num_i2c_board_info,
+ };
+#endif
/* Build the matching 'supported_machs' bitmask */
if (machine_is_msm8930_cdp() || machine_is_msm8627_cdp())
@@ -1965,6 +1973,12 @@
msm8960_i2c_devices[i].info,
msm8960_i2c_devices[i].len);
}
+#ifdef CONFIG_MSM_CAMERA
+ if (msm8930_camera_i2c_devices.machs & mach_mask)
+ i2c_register_board_info(msm8930_camera_i2c_devices.bus,
+ msm8930_camera_i2c_devices.info,
+ msm8930_camera_i2c_devices.len);
+#endif
#endif
}
diff --git a/arch/arm/mach-msm/board-8930.h b/arch/arm/mach-msm/board-8930.h
index 61eb408..c81825f 100644
--- a/arch/arm/mach-msm/board-8930.h
+++ b/arch/arm/mach-msm/board-8930.h
@@ -15,6 +15,7 @@
#include <linux/regulator/gpio-regulator.h>
#include <linux/mfd/pm8xxx/pm8038.h>
+#include <linux/i2c.h>
#include <linux/i2c/sx150x.h>
#include <mach/irqs.h>
#include <mach/rpm-regulator.h>
@@ -89,6 +90,7 @@
#endif
extern struct sx150x_platform_data msm8930_sx150x_data[];
+extern struct msm_camera_board_info msm8930_camera_board_info;
void msm8930_init_cam(void);
void msm8930_init_fb(void);
void msm8930_init_pmic(void);
diff --git a/arch/arm/mach-msm/board-8960-camera.c b/arch/arm/mach-msm/board-8960-camera.c
index f84944b..4466872 100644
--- a/arch/arm/mach-msm/board-8960-camera.c
+++ b/arch/arm/mach-msm/board-8960-camera.c
@@ -11,8 +11,6 @@
*
*/
-#include <linux/i2c.h>
-#include <linux/i2c/sx150x.h>
#include <asm/mach-types.h>
#include <mach/board.h>
#include <mach/msm_bus_board.h>
@@ -407,13 +405,6 @@
.actuator_info = &imx074_actuator_info
#endif
};
-
-static struct platform_device msm8960_camera_sensor_imx074 = {
- .name = "msm_camera_imx074",
- .dev = {
- .platform_data = &msm_camera_sensor_imx074_data,
- },
-};
#endif
#ifdef CONFIG_MT9M114
@@ -435,13 +426,6 @@
.csi_if = 1,
.camera_type = BACK_CAMERA_2D,
};
-
-struct platform_device msm8960_camera_sensor_mt9m114 = {
- .name = "msm_camera_mt9m114",
- .dev = {
- .platform_data = &msm_camera_sensor_mt9m114_data,
- },
-};
#endif
#ifdef CONFIG_OV2720
@@ -466,13 +450,6 @@
.csi_if = 1,
.camera_type = FRONT_CAMERA_2D,
};
-
-static struct platform_device msm8960_camera_sensor_ov2720 = {
- .name = "msm_camera_ov2720",
- .dev = {
- .platform_data = &msm_camera_sensor_ov2720_data,
- },
-};
#endif
static struct msm8960_privacy_light_cfg privacy_light_info = {
@@ -481,15 +458,6 @@
void __init msm8960_init_cam(void)
{
- int i;
- struct platform_device *cam_dev[] = {
- &msm8960_camera_sensor_imx074,
-#ifdef CONFIG_MT9M114
- &msm8960_camera_sensor_mt9m114,
-#endif
- &msm8960_camera_sensor_ov2720,
- };
-
msm_gpiomux_install(msm8960_cam_common_configs,
ARRAY_SIZE(msm8960_cam_common_configs));
@@ -509,21 +477,14 @@
if (machine_is_msm8960_liquid()) {
struct msm_camera_sensor_info *s_info;
- s_info = msm8960_camera_sensor_imx074.dev.platform_data;
+ s_info = &msm_camera_sensor_imx074_data;
s_info->sensor_platform_info->mount_angle = 180;
- s_info = msm8960_camera_sensor_ov2720.dev.platform_data;
+ s_info = &msm_camera_sensor_ov2720_data;
s_info->sensor_platform_info->privacy_light = 1;
s_info->sensor_platform_info->privacy_light_info =
&privacy_light_info;
}
- for (i = 0; i < ARRAY_SIZE(cam_dev); i++) {
- struct msm_camera_sensor_info *s_info;
- s_info = cam_dev[i]->dev.platform_data;
- msm_get_cam_resources(s_info);
- platform_device_register(cam_dev[i]);
- }
-
platform_device_register(&msm8960_device_csiphy0);
platform_device_register(&msm8960_device_csiphy1);
platform_device_register(&msm8960_device_csid0);
@@ -532,4 +493,35 @@
platform_device_register(&msm8960_device_vfe);
platform_device_register(&msm8960_device_vpe);
}
+
+#ifdef CONFIG_I2C
+static struct i2c_board_info msm8960_camera_i2c_boardinfo[] = {
+#ifdef CONFIG_IMX074
+ {
+ I2C_BOARD_INFO("imx074", 0x1A),
+ .platform_data = &msm_camera_sensor_imx074_data,
+ },
+#endif
+#ifdef CONFIG_OV2720
+ {
+ I2C_BOARD_INFO("ov2720", 0x6C),
+ .platform_data = &msm_camera_sensor_ov2720_data,
+ },
+#endif
+ {
+ I2C_BOARD_INFO("mt9m114", 0x48),
+ .platform_data = &msm_camera_sensor_mt9m114_data,
+ },
+#ifdef CONFIG_MSM_CAMERA_FLASH_SC628A
+ {
+ I2C_BOARD_INFO("sc628a", 0x6E),
+ },
+#endif
+};
+
+struct msm_camera_board_info msm8960_camera_board_info = {
+ .board_info = msm8960_camera_i2c_boardinfo,
+ .num_i2c_board_info = ARRAY_SIZE(msm8960_camera_i2c_boardinfo),
+};
+#endif
#endif
diff --git a/arch/arm/mach-msm/board-8960-regulator.c b/arch/arm/mach-msm/board-8960-regulator.c
index 936bb1c..58332ec 100644
--- a/arch/arm/mach-msm/board-8960-regulator.c
+++ b/arch/arm/mach-msm/board-8960-regulator.c
@@ -30,9 +30,9 @@
VREG_CONSUMERS(L2) = {
REGULATOR_SUPPLY("8921_l2", NULL),
REGULATOR_SUPPLY("dsi_vdda", "mipi_dsi.1"),
- REGULATOR_SUPPLY("mipi_csi_vdd", "msm_camera_imx074.0"),
- REGULATOR_SUPPLY("mipi_csi_vdd", "msm_camera_ov2720.0"),
- REGULATOR_SUPPLY("mipi_csi_vdd", "msm_camera_mt9m114.0"),
+ REGULATOR_SUPPLY("mipi_csi_vdd", "4-001a"),
+ REGULATOR_SUPPLY("mipi_csi_vdd", "4-006c"),
+ REGULATOR_SUPPLY("mipi_csi_vdd", "4-0048"),
};
VREG_CONSUMERS(L3) = {
REGULATOR_SUPPLY("8921_l3", NULL),
@@ -71,15 +71,15 @@
};
VREG_CONSUMERS(L11) = {
REGULATOR_SUPPLY("8921_l11", NULL),
- REGULATOR_SUPPLY("cam_vana", "msm_camera_imx074.0"),
- REGULATOR_SUPPLY("cam_vana", "msm_camera_ov2720.0"),
- REGULATOR_SUPPLY("cam_vana", "msm_camera_mt9m114.0"),
+ REGULATOR_SUPPLY("cam_vana", "4-001a"),
+ REGULATOR_SUPPLY("cam_vana", "4-006c"),
+ REGULATOR_SUPPLY("cam_vana", "4-0048"),
};
VREG_CONSUMERS(L12) = {
REGULATOR_SUPPLY("8921_l12", NULL),
- REGULATOR_SUPPLY("cam_vdig", "msm_camera_imx074.0"),
- REGULATOR_SUPPLY("cam_vdig", "msm_camera_ov2720.0"),
- REGULATOR_SUPPLY("cam_vdig", "msm_camera_mt9m114.0"),
+ REGULATOR_SUPPLY("cam_vdig", "4-001a"),
+ REGULATOR_SUPPLY("cam_vdig", "4-006c"),
+ REGULATOR_SUPPLY("cam_vdig", "4-0048"),
};
VREG_CONSUMERS(L14) = {
REGULATOR_SUPPLY("8921_l14", NULL),
@@ -90,9 +90,9 @@
};
VREG_CONSUMERS(L16) = {
REGULATOR_SUPPLY("8921_l16", NULL),
- REGULATOR_SUPPLY("cam_vaf", "msm_camera_imx074.0"),
- REGULATOR_SUPPLY("cam_vaf", "msm_camera_ov2720.0"),
- REGULATOR_SUPPLY("cam_vaf", "msm_camera_mt9m114.0"),
+ REGULATOR_SUPPLY("cam_vaf", "4-001a"),
+ REGULATOR_SUPPLY("cam_vaf", "4-006c"),
+ REGULATOR_SUPPLY("cam_vaf", "4-0048"),
};
VREG_CONSUMERS(L17) = {
REGULATOR_SUPPLY("8921_l17", NULL),
@@ -201,9 +201,9 @@
};
VREG_CONSUMERS(LVS5) = {
REGULATOR_SUPPLY("8921_lvs5", NULL),
- REGULATOR_SUPPLY("cam_vio", "msm_camera_imx074.0"),
- REGULATOR_SUPPLY("cam_vio", "msm_camera_ov2720.0"),
- REGULATOR_SUPPLY("cam_vio", "msm_camera_mt9m114.0"),
+ REGULATOR_SUPPLY("cam_vio", "4-001a"),
+ REGULATOR_SUPPLY("cam_vio", "4-006c"),
+ REGULATOR_SUPPLY("cam_vio", "4-0048"),
};
VREG_CONSUMERS(LVS6) = {
REGULATOR_SUPPLY("8921_lvs6", NULL),
diff --git a/arch/arm/mach-msm/board-8960.c b/arch/arm/mach-msm/board-8960.c
index 1b33453..dbda923 100644
--- a/arch/arm/mach-msm/board-8960.c
+++ b/arch/arm/mach-msm/board-8960.c
@@ -1974,31 +1974,6 @@
int len;
};
-#ifdef CONFIG_MSM_CAMERA
-static struct i2c_board_info msm_camera_boardinfo[] __initdata = {
-#ifdef CONFIG_IMX074
- {
- I2C_BOARD_INFO("imx074", 0x1A),
- },
-#endif
-#ifdef CONFIG_OV2720
- {
- I2C_BOARD_INFO("ov2720", 0x6C),
- },
-#endif
-#ifdef CONFIG_MT9M114
- {
- I2C_BOARD_INFO("mt9m114", 0x48),
- },
-#endif
-#ifdef CONFIG_MSM_CAMERA_FLASH_SC628A
- {
- I2C_BOARD_INFO("sc628a", 0x6E),
- },
-#endif
-};
-#endif
-
/* Sensors DSPS platform data */
#ifdef CONFIG_MSM_DSPS
#define DSPS_PIL_GENERIC_NAME "dsps"
@@ -2085,14 +2060,6 @@
};
static struct i2c_registry msm8960_i2c_devices[] __initdata = {
-#ifdef CONFIG_MSM_CAMERA
- {
- I2C_SURF | I2C_FFA | I2C_FLUID | I2C_LIQUID | I2C_RUMI,
- MSM_8960_GSBI4_QUP_I2C_BUS_ID,
- msm_camera_boardinfo,
- ARRAY_SIZE(msm_camera_boardinfo),
- },
-#endif
#ifdef CONFIG_ISL9519_CHARGER
{
I2C_LIQUID,
@@ -2139,6 +2106,14 @@
#ifdef CONFIG_I2C
u8 mach_mask = 0;
int i;
+#ifdef CONFIG_MSM_CAMERA
+ struct i2c_registry msm8960_camera_i2c_devices = {
+ I2C_SURF | I2C_FFA | I2C_FLUID | I2C_LIQUID | I2C_RUMI,
+ MSM_8960_GSBI4_QUP_I2C_BUS_ID,
+ msm8960_camera_board_info.board_info,
+ msm8960_camera_board_info.num_i2c_board_info,
+ };
+#endif
/* Build the matching 'supported_machs' bitmask */
if (machine_is_msm8960_cdp())
@@ -2163,6 +2138,12 @@
msm8960_i2c_devices[i].info,
msm8960_i2c_devices[i].len);
}
+#ifdef CONFIG_MSM_CAMERA
+ if (msm8960_camera_i2c_devices.machs & mach_mask)
+ i2c_register_board_info(msm8960_camera_i2c_devices.bus,
+ msm8960_camera_i2c_devices.info,
+ msm8960_camera_i2c_devices.len);
+#endif
#endif
}
diff --git a/arch/arm/mach-msm/board-8960.h b/arch/arm/mach-msm/board-8960.h
index 125ae4d..7d35e4d 100644
--- a/arch/arm/mach-msm/board-8960.h
+++ b/arch/arm/mach-msm/board-8960.h
@@ -15,6 +15,7 @@
#include <linux/regulator/gpio-regulator.h>
#include <linux/mfd/pm8xxx/pm8921.h>
+#include <linux/i2c.h>
#include <linux/i2c/sx150x.h>
#include <mach/irqs.h>
#include <mach/rpm-regulator.h>
@@ -71,6 +72,7 @@
#endif
extern struct sx150x_platform_data msm8960_sx150x_data[];
+extern struct msm_camera_board_info msm8960_camera_board_info;
void msm8960_init_cam(void);
void msm8960_init_fb(void);
void msm8960_init_pmic(void);
diff --git a/arch/arm/mach-msm/clock-8960.c b/arch/arm/mach-msm/clock-8960.c
index 5521c64..101658c 100644
--- a/arch/arm/mach-msm/clock-8960.c
+++ b/arch/arm/mach-msm/clock-8960.c
@@ -5496,11 +5496,9 @@
CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, NULL),
CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, NULL),
CLK_LOOKUP("core_clk", amp_clk.c, NULL),
- CLK_LOOKUP("cam_clk", cam0_clk.c, NULL),
- CLK_LOOKUP("cam_clk", cam1_clk.c, NULL),
- CLK_LOOKUP("cam_clk", cam0_clk.c, "msm_camera_imx074.0"),
- CLK_LOOKUP("cam_clk", cam0_clk.c, "msm_camera_mt9m114.0"),
- CLK_LOOKUP("cam_clk", cam0_clk.c, "msm_camera_ov2720.0"),
+ CLK_LOOKUP("cam_clk", cam0_clk.c, "4-001a"),
+ CLK_LOOKUP("cam_clk", cam0_clk.c, "4-006c"),
+ CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0048"),
CLK_LOOKUP("csi_src_clk", csi0_src_clk.c, "msm_csid.0"),
CLK_LOOKUP("csi_src_clk", csi1_src_clk.c, "msm_csid.1"),
CLK_LOOKUP("csi_clk", csi0_clk.c, "msm_csid.0"),
diff --git a/arch/arm/mach-msm/include/mach/board.h b/arch/arm/mach-msm/include/mach/board.h
index 0cd1c5c..ae68036 100644
--- a/arch/arm/mach-msm/include/mach/board.h
+++ b/arch/arm/mach-msm/include/mach/board.h
@@ -219,6 +219,11 @@
struct msm_actuator_info *actuator_info;
};
+struct msm_camera_board_info {
+ struct i2c_board_info *board_info;
+ uint8_t num_i2c_board_info;
+};
+
int msm_get_cam_resources(struct msm_camera_sensor_info *);
struct clk_lookup;
diff --git a/arch/arm/mach-msm/include/mach/camera.h b/arch/arm/mach-msm/include/mach/camera.h
index ae1f753..1dc6758 100644
--- a/arch/arm/mach-msm/include/mach/camera.h
+++ b/arch/arm/mach-msm/include/mach/camera.h
@@ -667,6 +667,8 @@
void msm_io_dump(void __iomem *addr, int size);
void msm_io_memcpy(void __iomem *dest_addr, void __iomem *src_addr, u32 len);
void msm_camio_set_perf_lvl(enum msm_bus_perf_setting);
+void msm_camio_bus_scale_cfg(
+ struct msm_bus_scale_pdata *, enum msm_bus_perf_setting);
void *msm_isp_sync_alloc(int size, gfp_t gfp);
@@ -674,4 +676,7 @@
int msm_cam_clk_enable(struct device *dev, struct msm_cam_clk_info *clk_info,
struct clk **clk_ptr, int num_clk, int enable);
+
+int msm_sensor_probe_on(struct device *);
+int msm_sensor_probe_off(struct device *);
#endif