summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/media/platform/msm/ais/sensor/msm_sensor.c2
-rw-r--r--drivers/media/platform/msm/ais/sensor/msm_sensor.h2
-rw-r--r--drivers/media/platform/msm/ais/sensor/msm_sensor_driver.c99
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,
};