msm: camera: Add support for privacy light on 8960 Liquid
MPP 12 is used for privacy light on Liquid device.
Setting sink to low to turn the light on.
Privacy light is only turn on for front camera.
Signed-off-by: Kevin Chan <ktchan@codeaurora.org>
diff --git a/arch/arm/mach-msm/board-msm8960.c b/arch/arm/mach-msm/board-msm8960.c
index 2694e0c..b9fe340 100644
--- a/arch/arm/mach-msm/board-msm8960.c
+++ b/arch/arm/mach-msm/board-msm8960.c
@@ -1064,6 +1064,10 @@
},
};
+static struct msm8960_privacy_light_cfg privacy_light_info = {
+ .mpp = PM8921_MPP_PM_TO_SYS(12),
+};
+
static void __init msm8960_init_cam(void)
{
int i;
@@ -1073,6 +1077,16 @@
&msm8960_camera_sensor_qs_mt9p017,
};
+ if (machine_is_msm8960_liquid()) {
+ struct msm_camera_sensor_info *s_info;
+ s_info = msm8960_camera_sensor_imx074.dev.platform_data;
+ s_info->sensor_platform_info->mount_angle = 180;
+ s_info = msm8960_camera_sensor_ov2720.dev.platform_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;
diff --git a/arch/arm/mach-msm/include/mach/board.h b/arch/arm/mach-msm/include/mach/board.h
index e0aa28d..f752bf5 100644
--- a/arch/arm/mach-msm/include/mach/board.h
+++ b/arch/arm/mach-msm/include/mach/board.h
@@ -164,6 +164,10 @@
BACK_CAMERA_INT_3D,
};
+struct msm8960_privacy_light_cfg {
+ unsigned mpp;
+};
+
struct msm_camera_sensor_platform_info {
int mount_angle;
int sensor_reset_enable;
@@ -171,6 +175,8 @@
int sensor_pwd;
int vcm_pwd;
int vcm_enable;
+ int privacy_light;
+ void *privacy_light_info;
};
struct msm_camera_gpio_conf {
diff --git a/drivers/media/video/msm/msm_io_8960.c b/drivers/media/video/msm/msm_io_8960.c
index 436ce52..58bb109 100644
--- a/drivers/media/video/msm/msm_io_8960.c
+++ b/drivers/media/video/msm/msm_io_8960.c
@@ -14,6 +14,7 @@
#include <linux/clk.h>
#include <linux/io.h>
#include <linux/regulator/consumer.h>
+#include <linux/mfd/pm8xxx/pm8921.h>
#include <mach/gpio.h>
#include <mach/gpiomux.h>
#include <mach/board.h>
@@ -1257,6 +1258,18 @@
release_mem_region(s3drw_mem->start, resource_size(s3drw_mem));
}
+static struct pm8xxx_mpp_config_data privacy_light_on_config = {
+ .type = PM8XXX_MPP_TYPE_SINK,
+ .level = PM8XXX_MPP_CS_OUT_5MA,
+ .control = PM8XXX_MPP_CS_CTRL_MPP_LOW_EN,
+};
+
+static struct pm8xxx_mpp_config_data privacy_light_off_config = {
+ .type = PM8XXX_MPP_TYPE_SINK,
+ .level = PM8XXX_MPP_CS_OUT_5MA,
+ .control = PM8XXX_MPP_CS_CTRL_DISABLE,
+};
+
int msm_camio_sensor_clk_on(struct platform_device *pdev)
{
int rc = 0;
@@ -1266,6 +1279,12 @@
camio_clk = camdev->ioclk;
msm_camera_vreg_enable(pdev);
+ if (sinfo->sensor_platform_info->privacy_light) {
+ struct msm8960_privacy_light_cfg *privacy_light_config =
+ sinfo->sensor_platform_info->privacy_light_info;
+ pm8xxx_mpp_config(privacy_light_config->mpp,
+ &privacy_light_on_config);
+ }
msleep(20);
rc = config_gpio_table(1);
if (rc < 0)
@@ -1276,7 +1295,14 @@
int msm_camio_sensor_clk_off(struct platform_device *pdev)
{
int rc = 0;
+ struct msm_camera_sensor_info *sinfo = pdev->dev.platform_data;
msm_camera_vreg_disable();
+ if (sinfo->sensor_platform_info->privacy_light) {
+ struct msm8960_privacy_light_cfg *privacy_light_config =
+ sinfo->sensor_platform_info->privacy_light_info;
+ pm8xxx_mpp_config(privacy_light_config->mpp,
+ &privacy_light_off_config);
+ }
rc = config_gpio_table(0);
if (rc < 0)
return rc;