diff options
| -rw-r--r-- | drivers/media/platform/msm/ais/sensor/msm_sensor_driver.c | 96 |
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; } |
