diff options
| -rw-r--r-- | drivers/media/platform/msm/ais/sensor/msm_sensor.c | 2 | ||||
| -rw-r--r-- | drivers/media/platform/msm/ais/sensor/msm_sensor.h | 2 | ||||
| -rw-r--r-- | drivers/media/platform/msm/ais/sensor/msm_sensor_driver.c | 99 |
3 files changed, 102 insertions, 1 deletions
diff --git a/drivers/media/platform/msm/ais/sensor/msm_sensor.c b/drivers/media/platform/msm/ais/sensor/msm_sensor.c index 657c6ee7c0b6..5f79b4615bfb 100644 --- a/drivers/media/platform/msm/ais/sensor/msm_sensor.c +++ b/drivers/media/platform/msm/ais/sensor/msm_sensor.c @@ -50,7 +50,7 @@ static void msm_sensor_adjust_mclk(struct msm_camera_power_ctrl_t *ctrl) } } -static void msm_sensor_misc_regulator( +void msm_sensor_misc_regulator( struct msm_sensor_ctrl_t *sctrl, uint32_t enable) { int32_t rc = 0; diff --git a/drivers/media/platform/msm/ais/sensor/msm_sensor.h b/drivers/media/platform/msm/ais/sensor/msm_sensor.h index ca6de8d0a7a8..07627cefc65e 100644 --- a/drivers/media/platform/msm/ais/sensor/msm_sensor.h +++ b/drivers/media/platform/msm/ais/sensor/msm_sensor.h @@ -136,4 +136,6 @@ long msm_sensor_subdev_fops_ioctl(struct file *file, unsigned int cmd, unsigned long arg); #endif +void msm_sensor_misc_regulator( + struct msm_sensor_ctrl_t *sctrl, uint32_t enable); #endif 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 03ae276d1a6f..cc01b1f6421b 100644 --- a/drivers/media/platform/msm/ais/sensor/msm_sensor_driver.c +++ b/drivers/media/platform/msm/ais/sensor/msm_sensor_driver.c @@ -17,6 +17,7 @@ #include "camera.h" #include "msm_cci.h" #include "msm_camera_dt_util.h" +#include "msm_early_cam.h" /* Logging macro */ #undef CDBG @@ -59,12 +60,110 @@ static const struct of_device_id msm_sensor_driver_dt_match[] = { MODULE_DEVICE_TABLE(of, msm_sensor_driver_dt_match); +static int msm_sensor_suspend(struct device *dev) +{ + struct msm_sensor_ctrl_t *s_ctrl = NULL; + int rc = 0; + + s_ctrl = (struct msm_sensor_ctrl_t *)dev_get_drvdata(dev); + + if (!s_ctrl) { + pr_err("%s:%d Invalid platform data\n", __func__, + __LINE__); + 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); + + 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; +} + +static int msm_sensor_resume(struct device *dev) +{ + struct msm_sensor_ctrl_t *s_ctrl = NULL; + int rc = 0; + + s_ctrl = (struct msm_sensor_ctrl_t *)dev_get_drvdata(dev); + + if (!s_ctrl) { + pr_err("%s:%d Invalid platform data\n", __func__, + __LINE__); + return -EFAULT; + } + 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); + + 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; + } + s_ctrl->sensor_state = MSM_SENSOR_POWER_UP; + CDBG("%s:%d sensor state %d\n", __func__, __LINE__, + s_ctrl->sensor_state); + } else { + 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; +} + +static SIMPLE_DEV_PM_OPS(msm_sensor_pm_ops, msm_sensor_suspend, + msm_sensor_resume); +#define MSM_SENSOR_PM_OPS (&msm_sensor_pm_ops) + static struct platform_driver msm_sensor_platform_driver = { .probe = msm_sensor_driver_platform_probe, .driver = { .name = "qcom,camera", .owner = THIS_MODULE, .of_match_table = msm_sensor_driver_dt_match, + .pm = MSM_SENSOR_PM_OPS, }, .remove = msm_sensor_platform_remove, }; |
