summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/media/platform/msm/ais/sensor/msm_sensor_driver.c96
1 files changed, 55 insertions, 41 deletions
diff --git a/drivers/media/platform/msm/ais/sensor/msm_sensor_driver.c b/drivers/media/platform/msm/ais/sensor/msm_sensor_driver.c
index cc01b1f6421b..348023040ec0 100644
--- a/drivers/media/platform/msm/ais/sensor/msm_sensor_driver.c
+++ b/drivers/media/platform/msm/ais/sensor/msm_sensor_driver.c
@@ -73,35 +73,41 @@ static int msm_sensor_suspend(struct device *dev)
return -EFAULT;
}
- /* Turning on cci clock to retain previous state */
- if (!msm_camera_cci_power_up(s_ctrl->sensor_device_type,
- s_ctrl->sensor_i2c_client)) {
- s_ctrl->sensor_state = MSM_SENSOR_CCI_UP;
- }
-
if (s_ctrl->is_csid_tg_mode)
return 0;
- kfree(s_ctrl->stop_setting.reg_setting);
- s_ctrl->stop_setting.reg_setting = NULL;
- if (s_ctrl->sensor_state == MSM_SENSOR_POWER_DOWN) {
- pr_debug("just returning success since sensor is already off %d\n",
- s_ctrl->sensor_state);
- return 0;
- }
- if (s_ctrl->func_tbl->sensor_power_down) {
- if (s_ctrl->sensordata->misc_regulator)
- msm_sensor_misc_regulator(s_ctrl, 0);
+ if (s_ctrl->sensor_state == MSM_SENSOR_CCI_DOWN) {
- rc = s_ctrl->func_tbl->sensor_power_down(s_ctrl);
- if (rc < 0) {
- pr_err("%s:%d failed rc %d\n", __func__,
- __LINE__, rc);
+ /* Turning on cci clock to retain previous state */
+ if (!msm_camera_cci_power_up(s_ctrl->sensor_device_type,
+ s_ctrl->sensor_i2c_client)) {
+ s_ctrl->sensor_state = MSM_SENSOR_CCI_UP;
+ }
+
+ kfree(s_ctrl->stop_setting.reg_setting);
+ s_ctrl->stop_setting.reg_setting = NULL;
+ if (s_ctrl->func_tbl->sensor_power_down) {
+ if (s_ctrl->sensordata->misc_regulator)
+ msm_sensor_misc_regulator(s_ctrl, 0);
+
+ rc = s_ctrl->func_tbl->sensor_power_down(s_ctrl);
+ if (rc < 0) {
+ pr_err("%s:%d failed rc %d\n", __func__,
+ __LINE__, rc);
+ rc = -EFAULT;
+ return rc;
+ }
+ s_ctrl->sensor_state = MSM_SENSOR_POWER_DOWN;
+ } else {
rc = -EFAULT;
- return rc;
}
- s_ctrl->sensor_state = MSM_SENSOR_POWER_DOWN;
+ } else if (s_ctrl->sensor_state == MSM_SENSOR_POWER_DOWN) {
+ pr_debug("just returning success since sensor is already off %d\n",
+ s_ctrl->sensor_state);
+ return 0;
} else {
+ pr_err("%s:%d invalid state\n", __func__,
+ __LINE__);
rc = -EFAULT;
}
@@ -123,33 +129,41 @@ static int msm_sensor_resume(struct device *dev)
if (s_ctrl->is_csid_tg_mode)
return 0;
- if (s_ctrl->sensor_state == MSM_SENSOR_POWER_UP) {
- pr_debug("just returning success since sensor is alreay on %d\n",
- s_ctrl->sensor_state);
- return 0;
- }
- if (s_ctrl->func_tbl->sensor_power_up) {
- if (s_ctrl->sensordata->misc_regulator)
- msm_sensor_misc_regulator(s_ctrl, 1);
+ if (s_ctrl->sensor_state == MSM_SENSOR_POWER_DOWN) {
- rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl);
- if (rc < 0) {
- pr_err("%s:%d failed rc %d\n", __func__,
- __LINE__, rc);
+ if (s_ctrl->func_tbl->sensor_power_up) {
+ if (s_ctrl->sensordata->misc_regulator)
+ msm_sensor_misc_regulator(s_ctrl, 1);
+
+ rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl);
+ if (rc < 0) {
+ pr_err("%s:%d failed rc %d\n", __func__,
+ __LINE__, rc);
+ rc = -EFAULT;
+ return rc;
+ }
+ s_ctrl->sensor_state = MSM_SENSOR_POWER_UP;
+ CDBG("%s:%d sensor state %d\n", __func__, __LINE__,
+ s_ctrl->sensor_state);
+ } else {
rc = -EFAULT;
}
- s_ctrl->sensor_state = MSM_SENSOR_POWER_UP;
- CDBG("%s:%d sensor state %d\n", __func__, __LINE__,
+
+ /* Turning off cci clock to retain previous state */
+ if (!msm_camera_cci_power_down(s_ctrl->sensor_device_type,
+ s_ctrl->sensor_i2c_client)) {
+ s_ctrl->sensor_state = MSM_SENSOR_CCI_DOWN;
+ }
+ } else if (s_ctrl->sensor_state == MSM_SENSOR_CCI_DOWN) {
+ pr_debug("just returning success since sensor is already on %d\n",
s_ctrl->sensor_state);
+ rc = 0;
} else {
+ pr_err("%s:%d invalid state\n", __func__,
+ __LINE__);
rc = -EFAULT;
}
- /* Turning off cci clock to retain previous state */
- if (!msm_camera_cci_power_down(s_ctrl->sensor_device_type,
- s_ctrl->sensor_i2c_client)) {
- s_ctrl->sensor_state = MSM_SENSOR_CCI_DOWN;
- }
return rc;
}