mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-07 20:33:58 -04:00
Merge "msm: camera: flash: Add support for flash stream off" into camera-kernel.lnx.4.0
This commit is contained in:
commit
40fa38ccab
3 changed files with 82 additions and 1 deletions
|
|
@ -459,6 +459,8 @@ static int cam_flash_ops(struct cam_flash_ctrl *flash_ctrl,
|
|||
|
||||
int cam_flash_off(struct cam_flash_ctrl *flash_ctrl)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (!flash_ctrl) {
|
||||
CAM_ERR(CAM_FLASH, "Flash control Null");
|
||||
return -EINVAL;
|
||||
|
|
@ -467,6 +469,16 @@ int cam_flash_off(struct cam_flash_ctrl *flash_ctrl)
|
|||
if (flash_ctrl->switch_trigger)
|
||||
cam_res_mgr_led_trigger_event(flash_ctrl->switch_trigger,
|
||||
(enum led_brightness)LED_SWITCH_OFF);
|
||||
|
||||
if ((flash_ctrl->i2c_data.streamoff_settings.is_settings_valid) &&
|
||||
(flash_ctrl->i2c_data.streamoff_settings.request_id == 0)) {
|
||||
flash_ctrl->apply_streamoff = true;
|
||||
rc = cam_flash_i2c_apply_setting(flash_ctrl, 0);
|
||||
if (rc < 0) {
|
||||
CAM_ERR(CAM_SENSOR,
|
||||
"cannot apply streamoff settings");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -693,7 +705,22 @@ int cam_flash_i2c_apply_setting(struct cam_flash_ctrl *fctrl,
|
|||
CAM_DBG(CAM_FLASH, "req_id=%llu", req_id);
|
||||
if (req_id == 0) {
|
||||
/* NonRealTime Init settings*/
|
||||
if (fctrl->i2c_data.init_settings.is_settings_valid == true) {
|
||||
if (fctrl->apply_streamoff == true) {
|
||||
fctrl->apply_streamoff = false;
|
||||
i2c_set = &fctrl->i2c_data.streamoff_settings;
|
||||
list_for_each_entry(i2c_list,
|
||||
&(i2c_set->list_head),
|
||||
list) {
|
||||
rc = cam_sensor_util_i2c_apply_setting
|
||||
(&(fctrl->io_master_info), i2c_list);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_FLASH,
|
||||
"Failed to apply stream on settings: %d", rc);
|
||||
return rc;
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else if (fctrl->i2c_data.init_settings.is_settings_valid == true) {
|
||||
list_for_each_entry(i2c_list,
|
||||
&(fctrl->i2c_data.init_settings.list_head),
|
||||
list) {
|
||||
|
|
@ -1217,6 +1244,16 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
|
|||
"Failed in parsing i2c packets");
|
||||
return rc;
|
||||
}
|
||||
if ((fctrl->flash_state == CAM_FLASH_STATE_ACQUIRE) ||
|
||||
(fctrl->flash_state == CAM_FLASH_STATE_CONFIG)) {
|
||||
fctrl->flash_state = CAM_FLASH_STATE_CONFIG;
|
||||
rc = fctrl->func_tbl.apply_setting(fctrl, 1);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_FLASH, "cannot apply fire settings rc = %d", rc);
|
||||
return rc;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CAM_FLASH_PACKET_OPCODE_NON_REALTIME_SET_OPS: {
|
||||
|
|
@ -1274,6 +1311,29 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
|
|||
csl_packet->header.request_id);
|
||||
goto update_req_mgr;
|
||||
}
|
||||
case CAM_FLASH_PACKET_OPCODE_STREAM_OFF: {
|
||||
if (fctrl->streamoff_count > 0)
|
||||
return rc;
|
||||
|
||||
CAM_DBG(CAM_FLASH, "Received Stream off Settings");
|
||||
i2c_data = &(fctrl->i2c_data);
|
||||
fctrl->streamoff_count = fctrl->streamoff_count + 1;
|
||||
i2c_reg_settings = &i2c_data->streamoff_settings;
|
||||
i2c_reg_settings->request_id = 0;
|
||||
i2c_reg_settings->is_settings_valid = 1;
|
||||
offset = (uint32_t *)((uint8_t *)&csl_packet->payload +
|
||||
csl_packet->cmd_buf_offset);
|
||||
cmd_desc = (struct cam_cmd_buf_desc *)(offset);
|
||||
rc = cam_sensor_i2c_command_parser(&fctrl->io_master_info,
|
||||
i2c_reg_settings,
|
||||
cmd_desc, 1, NULL);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_FLASH,
|
||||
"Failed in parsing i2c Stream off packets");
|
||||
return rc;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
CAM_ERR(CAM_FLASH, "Wrong Opcode : %d",
|
||||
(csl_packet->header.op_code & 0xFFFFFF));
|
||||
|
|
@ -1837,6 +1897,16 @@ int cam_flash_release_dev(struct cam_flash_ctrl *fctrl)
|
|||
{
|
||||
int rc = 0;
|
||||
|
||||
if (fctrl->i2c_data.streamoff_settings.is_settings_valid == true) {
|
||||
fctrl->i2c_data.streamoff_settings.is_settings_valid = false;
|
||||
rc = delete_request(&fctrl->i2c_data.streamoff_settings);
|
||||
if (rc) {
|
||||
CAM_WARN(CAM_FLASH,
|
||||
"Failed to delete Stream off i2c_setting: %d",
|
||||
rc);
|
||||
}
|
||||
}
|
||||
|
||||
if (fctrl->bridge_intf.device_hdl != 1) {
|
||||
rc = cam_destroy_device_hdl(fctrl->bridge_intf.device_hdl);
|
||||
if (rc)
|
||||
|
|
@ -1847,6 +1917,7 @@ int cam_flash_release_dev(struct cam_flash_ctrl *fctrl)
|
|||
fctrl->bridge_intf.link_hdl = -1;
|
||||
fctrl->bridge_intf.session_hdl = -1;
|
||||
fctrl->last_flush_req = 0;
|
||||
fctrl->streamoff_count = 0;
|
||||
}
|
||||
|
||||
return rc;
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@ static int32_t cam_flash_driver_cmd(struct cam_flash_ctrl *fctrl,
|
|||
flash_acq_dev.device_handle;
|
||||
fctrl->bridge_intf.session_hdl =
|
||||
flash_acq_dev.session_handle;
|
||||
fctrl->apply_streamoff = false;
|
||||
|
||||
rc = copy_to_user(u64_to_user_ptr(cmd->handle),
|
||||
&flash_acq_dev,
|
||||
|
|
@ -126,6 +127,7 @@ static int32_t cam_flash_driver_cmd(struct cam_flash_ctrl *fctrl,
|
|||
CAM_WARN(CAM_FLASH, "Power Down Failed");
|
||||
}
|
||||
|
||||
fctrl->streamoff_count = 0;
|
||||
fctrl->flash_state = CAM_FLASH_STATE_INIT;
|
||||
break;
|
||||
}
|
||||
|
|
@ -165,6 +167,7 @@ static int32_t cam_flash_driver_cmd(struct cam_flash_ctrl *fctrl,
|
|||
goto release_mutex;
|
||||
}
|
||||
|
||||
fctrl->apply_streamoff = false;
|
||||
fctrl->flash_state = CAM_FLASH_STATE_START;
|
||||
break;
|
||||
}
|
||||
|
|
@ -493,6 +496,7 @@ static int cam_flash_component_bind(struct device *dev,
|
|||
|
||||
INIT_LIST_HEAD(&(fctrl->i2c_data.init_settings.list_head));
|
||||
INIT_LIST_HEAD(&(fctrl->i2c_data.config_settings.list_head));
|
||||
INIT_LIST_HEAD(&(fctrl->i2c_data.streamoff_settings.list_head));
|
||||
for (i = 0; i < MAX_PER_FRAME_ARRAY; i++)
|
||||
INIT_LIST_HEAD(
|
||||
&(fctrl->i2c_data.per_frame[i].list_head));
|
||||
|
|
@ -641,6 +645,7 @@ static int32_t cam_flash_i2c_driver_probe(struct i2c_client *client,
|
|||
|
||||
INIT_LIST_HEAD(&(fctrl->i2c_data.init_settings.list_head));
|
||||
INIT_LIST_HEAD(&(fctrl->i2c_data.config_settings.list_head));
|
||||
INIT_LIST_HEAD(&(fctrl->i2c_data.streamoff_settings.list_head));
|
||||
for (i = 0; i < MAX_PER_FRAME_ARRAY; i++)
|
||||
INIT_LIST_HEAD(&(fctrl->i2c_data.per_frame[i].list_head));
|
||||
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@
|
|||
#define CAM_FLASH_PACKET_OPCODE_INIT 0
|
||||
#define CAM_FLASH_PACKET_OPCODE_SET_OPS 1
|
||||
#define CAM_FLASH_PACKET_OPCODE_NON_REALTIME_SET_OPS 2
|
||||
#define CAM_FLASH_PACKET_OPCODE_STREAM_OFF 3
|
||||
|
||||
struct cam_flash_ctrl;
|
||||
|
||||
|
|
@ -189,6 +190,8 @@ struct cam_flash_func_tbl {
|
|||
* @io_master_info : Information about the communication master
|
||||
* @i2c_data : I2C register settings
|
||||
* @last_flush_req : last request to flush
|
||||
* @streamoff_count : Count to hold the number of times stream off called
|
||||
* @apply_streamoff : variable to store when to apply stream off
|
||||
*/
|
||||
struct cam_flash_ctrl {
|
||||
char device_name[CAM_CTX_DEV_NAME_MAX_LENGTH];
|
||||
|
|
@ -217,6 +220,8 @@ struct cam_flash_ctrl {
|
|||
struct camera_io_master io_master_info;
|
||||
struct i2c_data_settings i2c_data;
|
||||
uint32_t last_flush_req;
|
||||
uint32_t streamoff_count;
|
||||
int32_t apply_streamoff;
|
||||
};
|
||||
|
||||
int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg);
|
||||
|
|
|
|||
Loading…
Reference in a new issue