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);
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;
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);
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(
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;
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;
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) {
__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) {
__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;
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))) {
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;
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,
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))) {
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;
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;
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) {
__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) {
__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: {
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))) {
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;
}