Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3fd90287 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: ais: sensor: Fix turning off sensor during suspend"

parents cedd6dde f032e2ce
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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
+99 −0
Original line number Diff line number Diff line
@@ -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,
};