From 09e5ec8beaace76bcbbe721a352a7593782c88f9 Mon Sep 17 00:00:00 2001 From: Suprith Malligere Shankaregowda Date: Thu, 8 Mar 2018 15:10:20 +0530 Subject: [PATCH] msm: ais: sensor: Fix the state check for i2c ops Added state condition before performing i2c operations Change-Id: Ie1cc0c4b0e5427928654638ca22d83380525cce1 Signed-off-by: Suprith Malligere Shankaregowda --- .../media/platform/msm/ais/isp/msm_isp_util.c | 2 +- .../platform/msm/ais/sensor/msm_sensor.c | 108 ++++++++++++++++-- .../platform/msm/ais/sensor/msm_sensor.h | 4 +- 3 files changed, 104 insertions(+), 10 deletions(-) diff --git a/drivers/media/platform/msm/ais/isp/msm_isp_util.c b/drivers/media/platform/msm/ais/isp/msm_isp_util.c index 3cacb5b0db10..ca7214c6f297 100644 --- a/drivers/media/platform/msm/ais/isp/msm_isp_util.c +++ b/drivers/media/platform/msm/ais/isp/msm_isp_util.c @@ -2012,7 +2012,7 @@ static void msm_isp_enqueue_tasklet_cmd(struct vfe_device *vfe_dev, MSM_VFE_TASKLETQ_SIZE; list_add_tail(&queue_cmd->list, &vfe_dev->tasklet_q); spin_unlock_irqrestore(&vfe_dev->tasklet_lock, flags); - tasklet_schedule(&vfe_dev->vfe_tasklet); + tasklet_hi_schedule(&vfe_dev->vfe_tasklet); } irqreturn_t msm_isp_process_irq(int irq_num, void *data) diff --git a/drivers/media/platform/msm/ais/sensor/msm_sensor.c b/drivers/media/platform/msm/ais/sensor/msm_sensor.c index 2801fc3ed34e..0dda3a64b1a2 100644 --- a/drivers/media/platform/msm/ais/sensor/msm_sensor.c +++ b/drivers/media/platform/msm/ais/sensor/msm_sensor.c @@ -296,7 +296,8 @@ static void msm_sensor_stop_stream(struct msm_sensor_ctrl_t *s_ctrl) int32_t rc = 0; mutex_lock(s_ctrl->msm_sensor_mutex); - if (s_ctrl->sensor_state == MSM_SENSOR_POWER_UP) { + if (s_ctrl->sensor_state == MSM_SENSOR_POWER_UP || + s_ctrl->sensor_state == MSM_SENSOR_CCI_UP) { s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_write_table( s_ctrl->sensor_i2c_client, &s_ctrl->stop_setting); kfree(s_ctrl->stop_setting.reg_setting); @@ -511,7 +512,8 @@ static int msm_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, if (s_ctrl->is_csid_tg_mode) goto DONE; - if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP) { + if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP && + s_ctrl->sensor_state != MSM_SENSOR_CCI_UP) { pr_err("%s:%d failed: invalid state %d\n", __func__, __LINE__, s_ctrl->sensor_state); rc = -EFAULT; @@ -588,6 +590,14 @@ static int msm_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, if (s_ctrl->is_csid_tg_mode) goto DONE; + if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP && + s_ctrl->sensor_state != MSM_SENSOR_CCI_UP) { + pr_err("%s:%d failed: invalid state %d\n", __func__, + __LINE__, s_ctrl->sensor_state); + rc = -EFAULT; + break; + } + read_config_ptr = (struct msm_camera_i2c_read_config *) compat_ptr(cdata->cfg.setting); @@ -660,6 +670,14 @@ static int msm_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, if (s_ctrl->is_csid_tg_mode) goto DONE; + if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP && + s_ctrl->sensor_state != MSM_SENSOR_CCI_UP) { + pr_err("%s:%d failed: invalid state %d\n", __func__, + __LINE__, s_ctrl->sensor_state); + rc = -EFAULT; + break; + } + if (copy_from_user(&write_config32, (void __user *)compat_ptr(cdata->cfg.setting), sizeof( @@ -766,7 +784,8 @@ static int msm_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, if (s_ctrl->is_csid_tg_mode) goto DONE; - if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP) { + if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP && + s_ctrl->sensor_state != MSM_SENSOR_CCI_UP) { pr_err("%s:%d failed: invalid state %d\n", __func__, __LINE__, s_ctrl->sensor_state); rc = -EFAULT; @@ -852,7 +871,7 @@ static int msm_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, kfree(s_ctrl->stop_setting.reg_setting); s_ctrl->stop_setting.reg_setting = NULL; - if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP) { + if (s_ctrl->sensor_state == MSM_SENSOR_POWER_DOWN) { pr_err("%s:%d failed: invalid state %d\n", __func__, __LINE__, s_ctrl->sensor_state); rc = -EFAULT; @@ -879,6 +898,12 @@ static int msm_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, if (s_ctrl->is_csid_tg_mode) goto DONE; + if (s_ctrl->sensor_state != MSM_SENSOR_CCI_DOWN) { + pr_err("%s:%d failed: invalid state %d\n", __func__, + __LINE__, s_ctrl->sensor_state); + rc = -EFAULT; + break; + } rc = msm_camera_cci_power_up(s_ctrl->sensor_device_type, s_ctrl->sensor_i2c_client); if (rc < 0) { @@ -886,11 +911,21 @@ static int msm_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, __LINE__, rc); break; } + s_ctrl->sensor_state = MSM_SENSOR_CCI_UP; + CDBG("%s:%d sensor state %d\n", __func__, __LINE__, + s_ctrl->sensor_state); break; case CFG_CCI_POWER_DOWN: if (s_ctrl->is_csid_tg_mode) goto DONE; + if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP && + s_ctrl->sensor_state != MSM_SENSOR_CCI_UP) { + pr_err("%s:%d failed: invalid state %d\n", __func__, + __LINE__, s_ctrl->sensor_state); + rc = -EFAULT; + break; + } rc = msm_camera_cci_power_down(s_ctrl->sensor_device_type, s_ctrl->sensor_i2c_client); if (rc < 0) { @@ -898,6 +933,9 @@ static int msm_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, __LINE__, rc); break; } + s_ctrl->sensor_state = MSM_SENSOR_CCI_DOWN; + CDBG("%s:%d sensor state %d\n", __func__, __LINE__, + s_ctrl->sensor_state); break; case CFG_SET_STOP_STREAM_SETTING: { struct msm_camera_i2c_reg_setting32 stop_setting32; @@ -908,6 +946,14 @@ static int msm_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, if (s_ctrl->is_csid_tg_mode) goto DONE; + if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP && + s_ctrl->sensor_state != MSM_SENSOR_CCI_UP) { + pr_err("%s:%d failed: invalid state %d\n", __func__, + __LINE__, s_ctrl->sensor_state); + rc = -EFAULT; + break; + } + if (copy_from_user(&stop_setting32, (void __user *)compat_ptr((cdata->cfg.setting)), sizeof(struct msm_camera_i2c_reg_setting32))) { @@ -1064,7 +1110,8 @@ int msm_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void *argp) if (s_ctrl->is_csid_tg_mode) goto DONE; - if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP) { + if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP && + s_ctrl->sensor_state != MSM_SENSOR_CCI_UP) { pr_err("%s:%d failed: invalid state %d\n", __func__, __LINE__, s_ctrl->sensor_state); rc = -EFAULT; @@ -1134,6 +1181,14 @@ int msm_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void *argp) if (s_ctrl->is_csid_tg_mode) goto DONE; + if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP && + s_ctrl->sensor_state != MSM_SENSOR_CCI_UP) { + pr_err("%s:%d failed: invalid state %d\n", __func__, + __LINE__, s_ctrl->sensor_state); + rc = -EFAULT; + break; + } + read_config_ptr = (struct msm_camera_i2c_read_config *)cdata->cfg.setting; if (copy_from_user(&read_config, (void __user *)read_config_ptr, @@ -1199,6 +1254,14 @@ int msm_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void *argp) if (s_ctrl->is_csid_tg_mode) goto DONE; + if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP && + s_ctrl->sensor_state != MSM_SENSOR_CCI_UP) { + pr_err("%s:%d failed: invalid state %d\n", __func__, + __LINE__, s_ctrl->sensor_state); + rc = -EFAULT; + break; + } + if (copy_from_user(&write_config, (void __user *)cdata->cfg.setting, sizeof(struct msm_camera_i2c_array_write_config))) { @@ -1282,7 +1345,8 @@ int msm_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void *argp) if (s_ctrl->is_csid_tg_mode) goto DONE; - if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP) { + if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP && + s_ctrl->sensor_state != MSM_SENSOR_CCI_UP) { pr_err("%s:%d failed: invalid state %d\n", __func__, __LINE__, s_ctrl->sensor_state); rc = -EFAULT; @@ -1364,7 +1428,7 @@ int msm_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void *argp) kfree(s_ctrl->stop_setting.reg_setting); s_ctrl->stop_setting.reg_setting = NULL; - if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP) { + if (s_ctrl->sensor_state == MSM_SENSOR_POWER_DOWN) { pr_err("%s:%d failed: invalid state %d\n", __func__, __LINE__, s_ctrl->sensor_state); rc = -EFAULT; @@ -1392,6 +1456,12 @@ int msm_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void *argp) if (s_ctrl->is_csid_tg_mode) goto DONE; + if (s_ctrl->sensor_state != MSM_SENSOR_CCI_DOWN) { + pr_err("%s:%d failed: invalid state %d\n", __func__, + __LINE__, s_ctrl->sensor_state); + rc = -EFAULT; + break; + } rc = msm_camera_cci_power_up(s_ctrl->sensor_device_type, s_ctrl->sensor_i2c_client); if (rc < 0) { @@ -1399,12 +1469,22 @@ int msm_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void *argp) __LINE__, rc); break; } + s_ctrl->sensor_state = MSM_SENSOR_CCI_UP; + CDBG("%s:%d sensor state %d\n", __func__, __LINE__, + s_ctrl->sensor_state); break; case CFG_CCI_POWER_DOWN: if (s_ctrl->is_csid_tg_mode) goto DONE; + if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP && + s_ctrl->sensor_state != MSM_SENSOR_CCI_UP) { + pr_err("%s:%d failed: invalid state %d\n", __func__, + __LINE__, s_ctrl->sensor_state); + rc = -EFAULT; + break; + } rc = msm_camera_cci_power_down(s_ctrl->sensor_device_type, s_ctrl->sensor_i2c_client); if (rc < 0) { @@ -1412,6 +1492,9 @@ int msm_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void *argp) __LINE__, rc); break; } + s_ctrl->sensor_state = MSM_SENSOR_CCI_DOWN; + CDBG("%s:%d sensor state %d\n", __func__, __LINE__, + s_ctrl->sensor_state); break; case CFG_SET_STOP_STREAM_SETTING: { @@ -1422,6 +1505,14 @@ int msm_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void *argp) if (s_ctrl->is_csid_tg_mode) goto DONE; + if (s_ctrl->sensor_state != MSM_SENSOR_POWER_UP && + s_ctrl->sensor_state != MSM_SENSOR_CCI_UP) { + pr_err("%s:%d failed: invalid state %d\n", __func__, + __LINE__, s_ctrl->sensor_state); + rc = -EFAULT; + break; + } + if (copy_from_user(stop_setting, (void __user *)cdata->cfg.setting, sizeof(struct msm_camera_i2c_reg_setting))) { @@ -1522,7 +1613,8 @@ static int msm_sensor_power(struct v4l2_subdev *sd, int on) struct msm_sensor_ctrl_t *s_ctrl = get_sctrl(sd); mutex_lock(s_ctrl->msm_sensor_mutex); - if (!on && s_ctrl->sensor_state == MSM_SENSOR_POWER_UP) { + if (!on && (s_ctrl->sensor_state == MSM_SENSOR_POWER_UP || + s_ctrl->sensor_state == MSM_SENSOR_CCI_UP)) { s_ctrl->func_tbl->sensor_power_down(s_ctrl); s_ctrl->sensor_state = MSM_SENSOR_POWER_DOWN; } diff --git a/drivers/media/platform/msm/ais/sensor/msm_sensor.h b/drivers/media/platform/msm/ais/sensor/msm_sensor.h index b742d06d3baa..ca6de8d0a7a8 100644 --- a/drivers/media/platform/msm/ais/sensor/msm_sensor.h +++ b/drivers/media/platform/msm/ais/sensor/msm_sensor.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -52,6 +52,8 @@ struct msm_sensor_ctrl_t; enum msm_sensor_state_t { MSM_SENSOR_POWER_DOWN, MSM_SENSOR_POWER_UP, + MSM_SENSOR_CCI_DOWN, + MSM_SENSOR_CCI_UP, }; struct msm_sensor_fn_t {