Merge "msm: board-8660: Support unique map for CP and no CP" into msm-3.4
diff --git a/drivers/media/video/msm/msm_mctl.c b/drivers/media/video/msm/msm_mctl.c
index a8d74a7..b7f6b08 100644
--- a/drivers/media/video/msm/msm_mctl.c
+++ b/drivers/media/video/msm/msm_mctl.c
@@ -197,6 +197,20 @@
return rc;
}
+static uint8_t msm_sensor_state_check(
+ struct msm_cam_media_controller *p_mctl)
+{
+ struct msm_sensor_ctrl_t *s_ctrl = NULL;
+ if (!p_mctl)
+ return 0;
+ if (!p_mctl->sensor_sdev)
+ return 0;
+ s_ctrl = get_sctrl(p_mctl->sensor_sdev);
+ if (s_ctrl->sensor_state == MSM_SENSOR_POWER_UP)
+ return 1;
+ return 0;
+}
+
/* called by the server or the config nodes to handle user space
commands*/
static int msm_mctl_cmd(struct msm_cam_media_controller *p_mctl,
@@ -370,7 +384,8 @@
ERR_COPY_FROM_USER();
rc = -EFAULT;
} else {
- rc = msm_flash_ctrl(p_mctl->sdata, &flash_info);
+ if (msm_sensor_state_check(p_mctl))
+ rc = msm_flash_ctrl(p_mctl->sdata, &flash_info);
}
break;
}
diff --git a/drivers/media/video/msm/sensors/msm_sensor.c b/drivers/media/video/msm/sensors/msm_sensor.c
index f687573..c6489c2 100644
--- a/drivers/media/video/msm/sensors/msm_sensor.c
+++ b/drivers/media/video/msm/sensors/msm_sensor.c
@@ -408,6 +408,8 @@
{
struct msm_sensor_ctrl_t *s_ctrl = get_sctrl(sd);
void __user *argp = (void __user *)arg;
+ if (s_ctrl->sensor_state == MSM_SENSOR_POWER_DOWN)
+ return -EINVAL;
switch (cmd) {
case VIDIOC_MSM_SENSOR_CFG:
return s_ctrl->func_tbl->sensor_config(s_ctrl, argp);
@@ -1601,6 +1603,7 @@
if (rc > 0)
rc = 0;
s_ctrl->func_tbl->sensor_power_down(s_ctrl);
+ s_ctrl->sensor_state = MSM_SENSOR_POWER_DOWN;
return rc;
}
@@ -1698,6 +1701,7 @@
if (rc < 0) {
pr_err("%s: %s power_up failed rc = %d\n", __func__,
s_ctrl->sensordata->sensor_name, rc);
+ s_ctrl->sensor_state = MSM_SENSOR_POWER_DOWN;
} else {
if (s_ctrl->func_tbl->sensor_match_id)
rc = s_ctrl->func_tbl->sensor_match_id(s_ctrl);
@@ -1712,10 +1716,13 @@
pr_err("%s: %s power_down failed\n",
__func__,
s_ctrl->sensordata->sensor_name);
+ s_ctrl->sensor_state = MSM_SENSOR_POWER_DOWN;
}
+ s_ctrl->sensor_state = MSM_SENSOR_POWER_UP;
}
} else {
rc = s_ctrl->func_tbl->sensor_power_down(s_ctrl);
+ s_ctrl->sensor_state = MSM_SENSOR_POWER_DOWN;
}
mutex_unlock(s_ctrl->msm_sensor_mutex);
return rc;
diff --git a/drivers/media/video/msm/sensors/msm_sensor.h b/drivers/media/video/msm/sensors/msm_sensor.h
index dc394e1..64d19e6 100644
--- a/drivers/media/video/msm/sensors/msm_sensor.h
+++ b/drivers/media/video/msm/sensors/msm_sensor.h
@@ -156,6 +156,11 @@
uint8_t is_csic;
};
+enum msm_sensor_state {
+ MSM_SENSOR_POWER_UP,
+ MSM_SENSOR_POWER_DOWN,
+};
+
struct msm_sensor_ctrl_t {
struct msm_camera_sensor_info *sensordata;
struct i2c_client *msm_sensor_client;
@@ -196,6 +201,7 @@
struct regulator **reg_ptr;
struct clk *cam_clk;
long clk_rate;
+ enum msm_sensor_state sensor_state;
};
void msm_sensor_start_stream(struct msm_sensor_ctrl_t *s_ctrl);