From c8e9459d3778a24cbace6b45682995b1e0d495b2 Mon Sep 17 00:00:00 2001 From: Suprith Malligere Shankaregowda Date: Thu, 5 Jul 2018 16:34:51 +0530 Subject: [PATCH] msm: ais: sensor: Fix turning clocks off during suspend Added condition check for suspend only if sensor state is power down and for resume only if sensor state is power up in pm functions on sensor driver to control. Change-Id: Ia31f34dc103428423a86efe8f8012db18b5a75f1 Signed-off-by: Suprith Malligere Shankaregowda --- .../msm/ais/sensor/msm_sensor_driver.c | 96 +++++++++++-------- 1 file 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) { + if (s_ctrl->sensor_state == MSM_SENSOR_CCI_DOWN) { + + /* 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; + } + } 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; - } - 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 { + 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; }