msm: camera: Handle out of sequence requests in KMD drivers
The change handles out of sequence requests by performing
necessary state validation in sensor, actuator, csiphy, eeprom,
ois & flash submodules. In a given state a driver will be able
to support certain operations. Any other unsupported requests
in that state would be reported as an error.
Change-Id: I94582c24c94e8b8a262dc257dfbd44e99aa61e66
Signed-off-by: Karthik Anantha Ram <kartanan@codeaurora.org>
Signed-off-by: Jigarkumar Zala <jzala@codeaurora.org>
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c
index 85db1b1..5ed1ef2 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c
@@ -553,6 +553,14 @@
}
break;
case CAM_RELEASE_DEV: {
+ if (a_ctrl->cam_act_state != CAM_ACTUATOR_ACQUIRE) {
+ rc = -EINVAL;
+ CAM_WARN(CAM_ACTUATOR,
+ "Not in right state to release : %d",
+ a_ctrl->cam_act_state);
+ goto release_mutex;
+ }
+
if (a_ctrl->bridge_intf.device_hdl == -1) {
CAM_ERR(CAM_ACTUATOR, "link hdl: %d device hdl: %d",
a_ctrl->bridge_intf.device_hdl,
@@ -582,6 +590,14 @@
}
break;
case CAM_START_DEV: {
+ if (a_ctrl->cam_act_state != CAM_ACTUATOR_ACQUIRE) {
+ rc = -EINVAL;
+ CAM_WARN(CAM_ACTUATOR,
+ "Not in right state to start : %d",
+ a_ctrl->cam_act_state);
+ goto release_mutex;
+ }
+
rc = cam_actuator_power_up(a_ctrl);
if (rc < 0) {
CAM_ERR(CAM_ACTUATOR, " Actuator Power up failed");
@@ -613,6 +629,14 @@
struct i2c_settings_array *i2c_set = NULL;
int i;
+ if (a_ctrl->cam_act_state != CAM_ACTUATOR_START) {
+ rc = -EINVAL;
+ CAM_WARN(CAM_ACTUATOR,
+ "Not in right state to stop : %d",
+ a_ctrl->cam_act_state);
+ goto release_mutex;
+ }
+
rc = camera_io_release(&a_ctrl->io_master_info);
if (rc < 0)
CAM_ERR(CAM_ACTUATOR, "Failed in releasing CCI");
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_dev.h b/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_dev.h
index bd5d50f..144e161 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_dev.h
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_dev.h
@@ -57,7 +57,6 @@
CAM_ACTUATOR_INIT,
CAM_ACTUATOR_ACQUIRE,
CAM_ACTUATOR_START,
- CAM_ACTUATOR_RELEASE,
};
/**
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c
index bd9f0fe..2e79b2e 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c
@@ -289,6 +289,8 @@
CAM_ERR(CAM_EEPROM, "failed: eeprom power up rc %d", rc);
goto data_mem_free;
}
+
+ e_ctrl->cam_eeprom_state = CAM_EEPROM_CONFIG;
if (e_ctrl->eeprom_device_type == MSM_CAMERA_SPI_DEVICE) {
rc = cam_eeprom_match_id(e_ctrl);
if (rc) {
@@ -305,6 +307,8 @@
rc = cam_eeprom_power_down(e_ctrl);
if (rc)
CAM_ERR(CAM_EEPROM, "failed: eeprom power down rc %d", rc);
+
+ e_ctrl->cam_eeprom_state = CAM_EEPROM_ACQUIRE;
return rc;
power_down:
cam_eeprom_power_down(e_ctrl);
@@ -313,6 +317,7 @@
kfree(e_ctrl->cal_data.map);
e_ctrl->cal_data.num_data = 0;
e_ctrl->cal_data.num_map = 0;
+ e_ctrl->cam_eeprom_state = CAM_EEPROM_ACQUIRE;
return rc;
}
@@ -704,6 +709,7 @@
goto memdata_free;
}
+ e_ctrl->cam_eeprom_state = CAM_EEPROM_CONFIG;
rc = cam_eeprom_read_memory(e_ctrl, &e_ctrl->cal_data);
if (rc) {
CAM_ERR(CAM_EEPROM,
@@ -713,6 +719,7 @@
rc = cam_eeprom_get_cal_data(e_ctrl, csl_packet);
rc = cam_eeprom_power_down(e_ctrl);
+ e_ctrl->cam_eeprom_state = CAM_EEPROM_ACQUIRE;
kfree(e_ctrl->cal_data.mapdata);
kfree(e_ctrl->cal_data.map);
e_ctrl->cal_data.num_data = 0;
@@ -730,6 +737,7 @@
kfree(e_ctrl->cal_data.map);
e_ctrl->cal_data.num_data = 0;
e_ctrl->cal_data.num_map = 0;
+ e_ctrl->cam_eeprom_state = CAM_EEPROM_ACQUIRE;
return rc;
}
@@ -740,10 +748,7 @@
if (e_ctrl->cam_eeprom_state == CAM_EEPROM_INIT)
return;
- if (e_ctrl->cam_eeprom_state == CAM_EEPROM_START) {
- rc = camera_io_release(&e_ctrl->io_master_info);
- if (rc < 0)
- CAM_ERR(CAM_EEPROM, "Failed in releasing CCI");
+ if (e_ctrl->cam_eeprom_state == CAM_EEPROM_CONFIG) {
rc = cam_eeprom_power_down(e_ctrl);
if (rc < 0)
CAM_ERR(CAM_EEPROM, "EEPROM Power down failed");
@@ -754,6 +759,7 @@
rc = cam_destroy_device_hdl(e_ctrl->bridge_intf.device_hdl);
if (rc < 0)
CAM_ERR(CAM_EEPROM, "destroying the device hdl");
+
e_ctrl->bridge_intf.device_hdl = -1;
e_ctrl->bridge_intf.link_hdl = -1;
e_ctrl->bridge_intf.session_hdl = -1;
@@ -807,6 +813,14 @@
e_ctrl->cam_eeprom_state = CAM_EEPROM_ACQUIRE;
break;
case CAM_RELEASE_DEV:
+ if (e_ctrl->cam_eeprom_state != CAM_EEPROM_ACQUIRE) {
+ rc = -EINVAL;
+ CAM_WARN(CAM_EEPROM,
+ "Not in right state to release : %d",
+ e_ctrl->cam_eeprom_state);
+ goto release_mutex;
+ }
+
if (e_ctrl->bridge_intf.device_hdl == -1) {
CAM_ERR(CAM_EEPROM,
"Invalid Handles: link hdl: %d device hdl: %d",
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_dev.h b/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_dev.h
index fa4a3dd..4a2190d 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_dev.h
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_dev.h
@@ -40,8 +40,7 @@
enum cam_eeprom_state {
CAM_EEPROM_INIT,
CAM_EEPROM_ACQUIRE,
- CAM_EEPROM_START,
- CAM_EEPROM_RELEASE,
+ CAM_EEPROM_CONFIG,
};
/**
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.c
index 8573f00..59d502f 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.c
@@ -25,7 +25,7 @@
return -EINVAL;
}
- if ((state == CAM_FLASH_STATE_INIT) &&
+ if ((state == CAM_FLASH_STATE_START) &&
(flash_ctrl->is_regulator_enabled == false)) {
rc = qpnp_flash_led_prepare(flash_ctrl->switch_trigger,
ENABLE_REGULATOR, NULL);
@@ -35,7 +35,8 @@
return rc;
}
flash_ctrl->is_regulator_enabled = true;
- } else if ((state == CAM_FLASH_STATE_RELEASE) &&
+ flash_ctrl->flash_state = CAM_FLASH_STATE_START;
+ } else if ((state == CAM_FLASH_STATE_STOP) &&
(flash_ctrl->is_regulator_enabled == true)) {
rc = qpnp_flash_led_prepare(flash_ctrl->switch_trigger,
DISABLE_REGULATOR, NULL);
@@ -45,7 +46,7 @@
return rc;
}
flash_ctrl->is_regulator_enabled = false;
- flash_ctrl->flash_state = CAM_FLASH_STATE_RELEASE;
+ flash_ctrl->flash_state = CAM_FLASH_STATE_ACQUIRE;
} else {
CAM_ERR(CAM_FLASH, "Wrong Flash State : %d",
flash_ctrl->flash_state);
@@ -55,6 +56,74 @@
return rc;
}
+static int cam_flash_flush_nrt(struct cam_flash_ctrl *fctrl)
+{
+ int j = 0;
+ struct cam_flash_frame_setting *nrt_settings;
+
+ if (!fctrl)
+ return -EINVAL;
+
+ nrt_settings = &fctrl->nrt_info;
+
+ if (nrt_settings->cmn_attr.cmd_type ==
+ CAMERA_SENSOR_FLASH_CMD_TYPE_INIT) {
+ fctrl->flash_init_setting.cmn_attr.is_settings_valid = false;
+ } else if ((nrt_settings->cmn_attr.cmd_type ==
+ CAMERA_SENSOR_FLASH_CMD_TYPE_WIDGET) ||
+ (nrt_settings->cmn_attr.cmd_type ==
+ CAMERA_SENSOR_FLASH_CMD_TYPE_RER)) {
+ fctrl->nrt_info.cmn_attr.is_settings_valid = false;
+ fctrl->nrt_info.cmn_attr.count = 0;
+ fctrl->nrt_info.num_iterations = 0;
+ fctrl->nrt_info.led_on_delay_ms = 0;
+ fctrl->nrt_info.led_off_delay_ms = 0;
+ for (j = 0; j < CAM_FLASH_MAX_LED_TRIGGERS; j++)
+ fctrl->nrt_info.led_current_ma[j] = 0;
+ }
+
+ return 0;
+}
+
+int cam_flash_flush_request(struct cam_req_mgr_flush_request *flush)
+{
+ int rc = 0;
+ int i = 0, j = 0;
+ struct cam_flash_ctrl *fctrl = NULL;
+ int frame_offset = 0;
+
+ fctrl = (struct cam_flash_ctrl *) cam_get_device_priv(flush->dev_hdl);
+ if (!fctrl) {
+ CAM_ERR(CAM_FLASH, "Device data is NULL");
+ return -EINVAL;
+ }
+
+ if (flush->type == CAM_REQ_MGR_FLUSH_TYPE_ALL) {
+ /* flush all requests*/
+ for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) {
+ fctrl->per_frame[i].cmn_attr.request_id = 0;
+ fctrl->per_frame[i].cmn_attr.is_settings_valid = false;
+ fctrl->per_frame[i].cmn_attr.count = 0;
+ for (j = 0; j < CAM_FLASH_MAX_LED_TRIGGERS; j++)
+ fctrl->per_frame[i].led_current_ma[j] = 0;
+ }
+
+ rc = cam_flash_flush_nrt(fctrl);
+ if (rc)
+ CAM_ERR(CAM_FLASH, "NonRealTime flush error");
+ } else if (flush->type == CAM_REQ_MGR_FLUSH_TYPE_CANCEL_REQ) {
+ /* flush request with req_id*/
+ frame_offset = flush->req_id % MAX_PER_FRAME_ARRAY;
+ fctrl->per_frame[frame_offset].cmn_attr.request_id = 0;
+ fctrl->per_frame[frame_offset].cmn_attr.is_settings_valid =
+ false;
+ fctrl->per_frame[frame_offset].cmn_attr.count = 0;
+ for (i = 0; i < CAM_FLASH_MAX_LED_TRIGGERS; i++)
+ fctrl->per_frame[frame_offset].led_current_ma[i] = 0;
+ }
+ return rc;
+}
+
static int cam_flash_ops(struct cam_flash_ctrl *flash_ctrl,
struct cam_flash_frame_setting *flash_data, enum camera_flash_opcode op)
{
@@ -138,6 +207,7 @@
led_trigger_event(flash_ctrl->switch_trigger,
LED_SWITCH_OFF);
+ flash_ctrl->flash_state = CAM_FLASH_STATE_START;
return 0;
}
@@ -239,15 +309,13 @@
CAMERA_SENSOR_FLASH_OP_FIRELOW) {
if (!(fctrl->is_regulator_enabled)) {
rc = cam_flash_prepare(fctrl,
- CAM_FLASH_STATE_INIT);
+ CAM_FLASH_STATE_START);
if (rc) {
CAM_ERR(CAM_FLASH,
"Reg Enable Failed %d",
rc);
goto nrt_del_req;
}
- fctrl->flash_state =
- CAM_FLASH_STATE_INIT;
rc = cam_flash_low(fctrl, flash_data);
if (rc) {
CAM_ERR(CAM_FLASH,
@@ -260,49 +328,41 @@
}
} else if (flash_data->opcode ==
CAMERA_SENSOR_FLASH_OP_OFF) {
- if (fctrl->flash_state !=
- CAM_FLASH_STATE_INIT) {
+ if (fctrl->flash_state ==
+ CAM_FLASH_STATE_LOW) {
rc = cam_flash_off(fctrl);
if (rc)
CAM_ERR(CAM_FLASH,
"LED off failed: %d",
rc);
}
+ cam_flash_flush_nrt(fctrl);
- rc = cam_flash_prepare(fctrl,
- CAM_FLASH_STATE_RELEASE);
- if (rc) {
+ rc = cam_flash_release_dev(fctrl);
+ if (rc)
CAM_ERR(CAM_FLASH,
- "Regulator Disable failed %d",
- rc);
- goto nrt_del_req;
- }
-
+ "Release dev failed rc %d", rc);
fctrl->flash_state =
- CAM_FLASH_STATE_RELEASE;
- fctrl->is_regulator_enabled = false;
+ CAM_FLASH_STATE_INIT;
}
} else if (fctrl->nrt_info.cmn_attr.cmd_type ==
CAMERA_SENSOR_FLASH_CMD_TYPE_RER) {
flash_data = &fctrl->nrt_info;
- if (fctrl->flash_state != CAM_FLASH_STATE_INIT) {
+ if (fctrl->flash_state != CAM_FLASH_STATE_START) {
rc = cam_flash_off(fctrl);
if (rc) {
CAM_ERR(CAM_FLASH,
"Flash off failed: %d",
rc);
- } else {
- fctrl->flash_state =
- CAM_FLASH_STATE_INIT;
+ goto nrt_del_req;
}
}
-
num_iterations = flash_data->num_iterations;
for (i = 0; i < num_iterations; i++) {
/* Turn On Torch */
if (fctrl->flash_state ==
- CAM_FLASH_STATE_INIT) {
+ CAM_FLASH_STATE_START) {
rc = cam_flash_low(fctrl, flash_data);
if (rc) {
CAM_ERR(CAM_FLASH,
@@ -311,11 +371,12 @@
}
fctrl->flash_state =
CAM_FLASH_STATE_LOW;
- }
- usleep_range(
- flash_data->led_on_delay_ms * 1000,
- flash_data->led_on_delay_ms * 1000 + 100);
+ usleep_range(
+ flash_data->led_on_delay_ms * 1000,
+ flash_data->led_on_delay_ms * 1000 +
+ 100);
+ }
/* Turn Off Torch */
rc = cam_flash_off(fctrl);
if (rc) {
@@ -324,7 +385,7 @@
rc);
continue;
}
- fctrl->flash_state = CAM_FLASH_STATE_INIT;
+ fctrl->flash_state = CAM_FLASH_STATE_START;
usleep_range(
flash_data->led_off_delay_ms * 1000,
flash_data->led_off_delay_ms * 1000 + 100);
@@ -338,7 +399,7 @@
(flash_data->cmn_attr.is_settings_valid) &&
(flash_data->cmn_attr.request_id == req_id)) {
/* Turn On Flash */
- if (fctrl->flash_state == CAM_FLASH_STATE_INIT) {
+ if (fctrl->flash_state == CAM_FLASH_STATE_START) {
rc = cam_flash_high(fctrl, flash_data);
if (rc) {
CAM_ERR(CAM_FLASH,
@@ -353,7 +414,7 @@
(flash_data->cmn_attr.is_settings_valid) &&
(flash_data->cmn_attr.request_id == req_id)) {
/* Turn On Torch */
- if (fctrl->flash_state == CAM_FLASH_STATE_INIT) {
+ if (fctrl->flash_state == CAM_FLASH_STATE_START) {
rc = cam_flash_low(fctrl, flash_data);
if (rc) {
CAM_ERR(CAM_FLASH,
@@ -366,15 +427,13 @@
} else if ((flash_data->opcode == CAMERA_SENSOR_FLASH_OP_OFF) &&
(flash_data->cmn_attr.is_settings_valid) &&
(flash_data->cmn_attr.request_id == req_id)) {
- if ((fctrl->flash_state != CAM_FLASH_STATE_RELEASE) ||
- (fctrl->flash_state != CAM_FLASH_STATE_INIT)) {
+ if ((fctrl->flash_state == CAM_FLASH_STATE_LOW) ||
+ (fctrl->flash_state == CAM_FLASH_STATE_HIGH)) {
rc = cam_flash_off(fctrl);
if (rc) {
CAM_ERR(CAM_FLASH,
"Flash off failed %d", rc);
- } else {
- fctrl->flash_state =
- CAM_FLASH_STATE_INIT;
+ goto apply_setting_err;
}
}
} else {
@@ -684,77 +743,14 @@
return 0;
}
-static int cam_flash_flush_nrt(struct cam_flash_ctrl *fctrl)
+
+int cam_flash_stop_dev(struct cam_flash_ctrl *fctrl)
{
- int j = 0;
- struct cam_flash_frame_setting *nrt_settings;
+ int rc = 0, i, j;
- if (!fctrl)
- return -EINVAL;
-
- nrt_settings = &fctrl->nrt_info;
-
- if (nrt_settings->cmn_attr.cmd_type ==
- CAMERA_SENSOR_FLASH_CMD_TYPE_INIT) {
- fctrl->flash_init_setting.cmn_attr.is_settings_valid = false;
- } else if ((nrt_settings->cmn_attr.cmd_type ==
- CAMERA_SENSOR_FLASH_CMD_TYPE_WIDGET) ||
- (nrt_settings->cmn_attr.cmd_type ==
- CAMERA_SENSOR_FLASH_CMD_TYPE_RER)) {
- fctrl->nrt_info.cmn_attr.is_settings_valid = false;
- fctrl->nrt_info.cmn_attr.count = 0;
- fctrl->nrt_info.num_iterations = 0;
- fctrl->nrt_info.led_on_delay_ms = 0;
- fctrl->nrt_info.led_off_delay_ms = 0;
- for (j = 0; j < CAM_FLASH_MAX_LED_TRIGGERS; j++)
- fctrl->nrt_info.led_current_ma[j] = 0;
- }
-
- return 0;
-}
-
-int cam_flash_flush_request(struct cam_req_mgr_flush_request *flush)
-{
- int rc = 0;
- int i = 0, j = 0;
- struct cam_flash_ctrl *fctrl = NULL;
- int frame_offset = 0;
-
- fctrl = (struct cam_flash_ctrl *) cam_get_device_priv(flush->dev_hdl);
- if (!fctrl) {
- CAM_ERR(CAM_FLASH, "Device data is NULL");
- return -EINVAL;
- }
-
- if (flush->type == CAM_REQ_MGR_FLUSH_TYPE_ALL) {
- /* flush all requests*/
- for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) {
- fctrl->per_frame[i].cmn_attr.request_id = 0;
- fctrl->per_frame[i].cmn_attr.is_settings_valid = false;
- fctrl->per_frame[i].cmn_attr.count = 0;
- for (j = 0; j < CAM_FLASH_MAX_LED_TRIGGERS; j++)
- fctrl->per_frame[i].led_current_ma[j] = 0;
- }
-
- rc = cam_flash_flush_nrt(fctrl);
- if (rc)
- CAM_ERR(CAM_FLASH, "NonRealTime flush error");
- } else if (flush->type == CAM_REQ_MGR_FLUSH_TYPE_CANCEL_REQ) {
- /* flush request with req_id*/
- frame_offset = flush->req_id % MAX_PER_FRAME_ARRAY;
- fctrl->per_frame[frame_offset].cmn_attr.request_id = 0;
- fctrl->per_frame[frame_offset].cmn_attr.is_settings_valid =
- false;
- fctrl->per_frame[frame_offset].cmn_attr.count = 0;
- for (i = 0; i < CAM_FLASH_MAX_LED_TRIGGERS; i++)
- fctrl->per_frame[frame_offset].led_current_ma[i] = 0;
- }
- return rc;
-}
-
-void cam_flash_shutdown(struct cam_flash_ctrl *fctrl)
-{
- int rc, i, j;
+ if ((fctrl->flash_state == CAM_FLASH_STATE_LOW) ||
+ (fctrl->flash_state == CAM_FLASH_STATE_HIGH))
+ cam_flash_off(fctrl);
for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) {
fctrl->per_frame[i].cmn_attr.request_id = 0;
@@ -764,27 +760,63 @@
fctrl->per_frame[i].led_current_ma[j] = 0;
}
- cam_flash_flush_nrt(fctrl);
+ rc = cam_flash_flush_nrt(fctrl);
+ if (rc) {
+ CAM_ERR(CAM_FLASH,
+ "NonRealTime Dev flush failed rc: %d", rc);
+ return rc;
+ }
- if ((fctrl->flash_state != CAM_FLASH_STATE_RELEASE) &&
+ if ((fctrl->flash_state == CAM_FLASH_STATE_START) &&
(fctrl->is_regulator_enabled == true)) {
- rc = cam_flash_prepare(fctrl, CAM_FLASH_STATE_RELEASE);
+ rc = cam_flash_prepare(fctrl, CAM_FLASH_STATE_STOP);
if (rc)
- CAM_ERR(CAM_FLASH, "Disable Regulator Failed ret = %d",
+ CAM_ERR(CAM_FLASH, "Disable Regulator Failed rc: %d",
rc);
}
- if (fctrl->bridge_intf.device_hdl != -1) {
- rc = cam_destroy_device_hdl(fctrl->bridge_intf.
- device_hdl);
+ return rc;
+}
+
+int cam_flash_release_dev(struct cam_flash_ctrl *fctrl)
+{
+ int rc = 0;
+
+ if (fctrl->bridge_intf.device_hdl != 1) {
+ rc = cam_destroy_device_hdl(fctrl->bridge_intf.device_hdl);
if (rc)
CAM_ERR(CAM_FLASH,
- "Failed in destroying the device Handle rc= %d",
+ "Failed in destroying device handle rc = %d",
rc);
fctrl->bridge_intf.device_hdl = -1;
fctrl->bridge_intf.link_hdl = -1;
fctrl->bridge_intf.session_hdl = -1;
}
+
+ return rc;
+}
+
+void cam_flash_shutdown(struct cam_flash_ctrl *fctrl)
+{
+ int rc;
+
+ if (fctrl->flash_state == CAM_FLASH_STATE_INIT)
+ return;
+
+ if (fctrl->flash_state == CAM_FLASH_STATE_ACQUIRE) {
+ cam_flash_release_dev(fctrl);
+ return;
+ }
+
+ rc = cam_flash_stop_dev(fctrl);
+ if (rc)
+ CAM_ERR(CAM_FLASH, "Stop Failed rc: %d", rc);
+
+ rc = cam_flash_release_dev(fctrl);
+ if (rc)
+ CAM_ERR(CAM_FLASH, "Release failed rc: %d", rc);
+
+ fctrl->flash_state = CAM_FLASH_STATE_INIT;
}
int cam_flash_apply_request(struct cam_req_mgr_apply_request *apply)
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.h b/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.h
index f2a782b..d5ea04c 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.h
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.h
@@ -30,4 +30,6 @@
int cam_flash_prepare(struct cam_flash_ctrl *flash_ctrl,
enum cam_flash_state state);
void cam_flash_shutdown(struct cam_flash_ctrl *flash_ctrl);
+int cam_flash_stop_dev(struct cam_flash_ctrl *flash_ctrl);
+int cam_flash_release_dev(struct cam_flash_ctrl *fctrl);
#endif /*_CAM_FLASH_CORE_H_*/
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_dev.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_dev.c
index 57f1f0f..2b371a3 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_dev.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_dev.c
@@ -36,6 +36,13 @@
struct cam_create_dev_hdl bridge_params;
CAM_DBG(CAM_FLASH, "CAM_ACQUIRE_DEV");
+
+ if (fctrl->flash_state != CAM_FLASH_STATE_INIT) {
+ CAM_ERR(CAM_FLASH,
+ "Cannot apply Acquire dev: Prev state: %d",
+ fctrl->flash_state);
+ }
+
if (fctrl->bridge_intf.device_hdl != -1) {
CAM_ERR(CAM_FLASH, "Device is already acquired");
rc = -EINVAL;
@@ -70,12 +77,19 @@
rc = -EFAULT;
goto release_mutex;
}
- break;
fctrl->flash_state = CAM_FLASH_STATE_ACQUIRE;
+ break;
}
case CAM_RELEASE_DEV: {
CAM_DBG(CAM_FLASH, "CAM_RELEASE_DEV");
- if (fctrl->bridge_intf.device_hdl == -1) {
+ if (fctrl->flash_state != CAM_FLASH_STATE_ACQUIRE) {
+ CAM_WARN(CAM_FLASH,
+ "Cannot apply Release dev: Prev state:%d",
+ fctrl->flash_state);
+ }
+
+ if (fctrl->bridge_intf.device_hdl == -1 &&
+ fctrl->flash_state == CAM_FLASH_STATE_ACQUIRE) {
CAM_ERR(CAM_FLASH,
"Invalid Handle: Link Hdl: %d device hdl: %d",
fctrl->bridge_intf.device_hdl,
@@ -83,16 +97,13 @@
rc = -EINVAL;
goto release_mutex;
}
- rc = cam_destroy_device_hdl(fctrl->bridge_intf.device_hdl);
+ rc = cam_flash_release_dev(fctrl);
if (rc)
CAM_ERR(CAM_FLASH,
"Failed in destroying the device Handle rc= %d",
rc);
- fctrl->bridge_intf.device_hdl = -1;
- fctrl->bridge_intf.link_hdl = -1;
- fctrl->bridge_intf.session_hdl = -1;
+ fctrl->flash_state = CAM_FLASH_STATE_INIT;
break;
- fctrl->flash_state = CAM_FLASH_STATE_RELEASE;
}
case CAM_QUERY_CAP: {
struct cam_flash_query_cap_info flash_cap = {0};
@@ -120,29 +131,38 @@
}
case CAM_START_DEV: {
CAM_DBG(CAM_FLASH, "CAM_START_DEV");
- rc = cam_flash_prepare(fctrl, CAM_FLASH_STATE_INIT);
+ if (fctrl->flash_state != CAM_FLASH_STATE_ACQUIRE) {
+ CAM_WARN(CAM_FLASH,
+ "Cannot apply Start Dev: Prev state: %d",
+ fctrl->flash_state);
+ rc = -EINVAL;
+ goto release_mutex;
+ }
+
+ rc = cam_flash_prepare(fctrl, CAM_FLASH_STATE_START);
if (rc) {
CAM_ERR(CAM_FLASH,
"Enable Regulator Failed rc = %d", rc);
goto release_mutex;
}
- fctrl->flash_state = CAM_FLASH_STATE_INIT;
rc = cam_flash_apply_setting(fctrl, 0);
if (rc) {
CAM_ERR(CAM_FLASH, "cannot apply settings rc = %d", rc);
goto release_mutex;
}
- fctrl->flash_state = CAM_FLASH_STATE_INIT;
+ fctrl->flash_state = CAM_FLASH_STATE_START;
break;
}
case CAM_STOP_DEV: {
- CAM_DBG(CAM_FLASH, "CAM_STOP_DEV");
- if (fctrl->flash_state != CAM_FLASH_STATE_INIT)
- cam_flash_off(fctrl);
+ if (fctrl->flash_state != CAM_FLASH_STATE_START) {
+ CAM_WARN(CAM_FLASH,
+ "Cannot apply Stop dev: Prev state is: %d",
+ fctrl->flash_state);
+ }
- rc = cam_flash_prepare(fctrl, CAM_FLASH_STATE_RELEASE);
+ rc = cam_flash_stop_dev(fctrl);
if (rc) {
- CAM_ERR(CAM_FLASH, "Disable Regulator Failed ret = %d",
+ CAM_ERR(CAM_FLASH, "Stop Dev Failed rc = %d",
rc);
goto release_mutex;
}
@@ -344,6 +364,7 @@
mutex_init(&(flash_ctrl->flash_mutex));
mutex_init(&(flash_ctrl->flash_wq_mutex));
+ flash_ctrl->flash_state = CAM_FLASH_STATE_INIT;
CAM_DBG(CAM_FLASH, "Probe success");
return rc;
free_resource:
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_dev.h b/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_dev.h
index 1583c27..bacf088 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_dev.h
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_dev.h
@@ -50,9 +50,10 @@
enum cam_flash_state {
CAM_FLASH_STATE_INIT,
CAM_FLASH_STATE_ACQUIRE,
+ CAM_FLASH_STATE_START,
CAM_FLASH_STATE_LOW,
CAM_FLASH_STATE_HIGH,
- CAM_FLASH_STATE_RELEASE,
+ CAM_FLASH_STATE_STOP,
};
/**
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.c
index 2a877fd..8571347 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.c
@@ -531,6 +531,13 @@
o_ctrl->cam_ois_state = CAM_OIS_ACQUIRE;
break;
case CAM_START_DEV:
+ if (o_ctrl->cam_ois_state != CAM_OIS_ACQUIRE) {
+ rc = -EINVAL;
+ CAM_WARN(CAM_OIS,
+ "Not in right state for start : %d",
+ o_ctrl->cam_ois_state);
+ }
+
rc = cam_ois_power_up(o_ctrl);
if (rc) {
CAM_ERR(CAM_OIS, " OIS Power up failed");
@@ -574,6 +581,13 @@
}
break;
case CAM_RELEASE_DEV:
+ if (o_ctrl->cam_ois_state != CAM_OIS_ACQUIRE) {
+ rc = -EINVAL;
+ CAM_WARN(CAM_OIS,
+ "Not in right state for release : %d",
+ o_ctrl->cam_ois_state);
+ }
+
if (o_ctrl->bridge_intf.device_hdl == -1) {
CAM_ERR(CAM_OIS, "link hdl: %d device hdl: %d",
o_ctrl->bridge_intf.device_hdl,
@@ -590,6 +604,13 @@
o_ctrl->cam_ois_state = CAM_OIS_INIT;
break;
case CAM_STOP_DEV:
+ if (o_ctrl->cam_ois_state != CAM_OIS_START) {
+ rc = -EINVAL;
+ CAM_WARN(CAM_OIS,
+ "Not in right state for stop : %d",
+ o_ctrl->cam_ois_state);
+ }
+
rc = camera_io_release(&o_ctrl->io_master_info);
if (rc < 0)
CAM_ERR(CAM_OIS, "Failed in releasing CCI");
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_dev.h b/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_dev.h
index e341bb7..96166b4 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_dev.h
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_dev.h
@@ -35,7 +35,6 @@
CAM_OIS_INIT,
CAM_OIS_ACQUIRE,
CAM_OIS_START,
- CAM_OIS_RELEASE,
};
/**
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c
index c3ca7d3..bc41921 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c
@@ -686,9 +686,18 @@
rc = -EFAULT;
goto release_mutex;
}
+ s_ctrl->sensor_state = CAM_SENSOR_ACQUIRE;
}
break;
case CAM_RELEASE_DEV: {
+ if (s_ctrl->sensor_state != CAM_SENSOR_ACQUIRE) {
+ rc = -EINVAL;
+ CAM_WARN(CAM_SENSOR,
+ "Not in right state to release : %d",
+ s_ctrl->sensor_state);
+ goto release_mutex;
+ }
+
cam_sensor_release_resource(s_ctrl);
if (s_ctrl->bridge_intf.device_hdl == -1) {
CAM_ERR(CAM_SENSOR,
@@ -705,6 +714,8 @@
s_ctrl->bridge_intf.device_hdl = -1;
s_ctrl->bridge_intf.link_hdl = -1;
s_ctrl->bridge_intf.session_hdl = -1;
+
+ s_ctrl->sensor_state = CAM_SENSOR_INIT;
}
break;
case CAM_QUERY_CAP: {
@@ -720,6 +731,14 @@
break;
}
case CAM_START_DEV: {
+ if (s_ctrl->sensor_state != CAM_SENSOR_ACQUIRE) {
+ rc = -EINVAL;
+ CAM_WARN(CAM_SENSOR,
+ "Not in right state to start : %d",
+ s_ctrl->sensor_state);
+ goto release_mutex;
+ }
+
if (s_ctrl->i2c_data.streamon_settings.is_settings_valid &&
(s_ctrl->i2c_data.streamon_settings.request_id == 0)) {
rc = cam_sensor_apply_settings(s_ctrl, 0,
@@ -734,6 +753,14 @@
}
break;
case CAM_STOP_DEV: {
+ if (s_ctrl->sensor_state != CAM_SENSOR_START) {
+ rc = -EINVAL;
+ CAM_WARN(CAM_SENSOR,
+ "Not in right state to stop : %d",
+ s_ctrl->sensor_state);
+ goto release_mutex;
+ }
+
if (s_ctrl->i2c_data.streamoff_settings.is_settings_valid &&
(s_ctrl->i2c_data.streamoff_settings.request_id == 0)) {
rc = cam_sensor_apply_settings(s_ctrl, 0,
@@ -748,6 +775,7 @@
CAM_ERR(CAM_SENSOR, "Sensor Power Down failed");
goto release_mutex;
}
+ s_ctrl->sensor_state = CAM_SENSOR_ACQUIRE;
}
break;
case CAM_CONFIG_DEV: {