From bd291b65f4e6de2747a254c536ef1274566d446a Mon Sep 17 00:00:00 2001 From: Qiang Guo Date: Tue, 28 Sep 2021 17:52:56 +0800 Subject: [PATCH] camera: porting flashlight modify porting: (CR) corfup:flashlight working abnormally porting: (CR) corfur: flashlight auto turn off Change-Id: I097f481394cf74bb7497a373078d3391a9748252 Signed-off-by: Qiang Guo Reviewed-on: https://gerrit.mot.com/2078599 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Bolei Shang Reviewed-by: Shanghui Zhang Reviewed-by: XiaoFeng Wang Reviewed-by: Quanlin Zhu Reviewed-by: Zhuoran Xu Reviewed-by: Ji Zhao Submit-Approved: Jira Key --- .../cam_flash/cam_flash_core.c | 94 ++++++++++++++++++- .../cam_flash/cam_flash_dev.c | 5 +- 2 files changed, 96 insertions(+), 3 deletions(-) diff --git a/drivers/cam_sensor_module/cam_flash/cam_flash_core.c b/drivers/cam_sensor_module/cam_flash/cam_flash_core.c index 8c747c0cae8e..ba6677363f8f 100644 --- a/drivers/cam_sensor_module/cam_flash/cam_flash_core.c +++ b/drivers/cam_sensor_module/cam_flash/cam_flash_core.c @@ -15,6 +15,50 @@ static uint default_on_timer = 2; module_param(default_on_timer, uint, 0644); +static int flash_initstate = 0; +static struct i2c_settings_list* i2c_flash_off = NULL; +static struct i2c_settings_list* + cam_flash_get_i2c_ptr(struct i2c_settings_list *pi2c_list) +{ + struct i2c_settings_list *tmp; + struct cam_sensor_i2c_reg_array *i2c_reg_settings = + pi2c_list->i2c_settings.reg_setting; + uint32_t size = pi2c_list->i2c_settings.size; + int i = 0; + + tmp = kzalloc(sizeof(struct i2c_settings_list), GFP_KERNEL); + if (tmp == NULL) { + CAM_WARN(CAM_FLASH, "kzalloc failed"); + return NULL; + } + + tmp->i2c_settings.reg_setting = (struct cam_sensor_i2c_reg_array *) + vzalloc(size * sizeof(struct cam_sensor_i2c_reg_array)); + if (tmp->i2c_settings.reg_setting == NULL) { + kfree(tmp); + CAM_WARN(CAM_FLASH, "vzalloc failed"); + return NULL; + } + + tmp->i2c_settings.size = size; + tmp->op_code = pi2c_list->op_code; + tmp->i2c_settings.addr_type = pi2c_list->i2c_settings.addr_type; + tmp->i2c_settings.data_type = pi2c_list->i2c_settings.data_type; + + for( i = 0; i < size ; i++ ) { + tmp->i2c_settings.reg_setting[i].reg_addr = + i2c_reg_settings[i].reg_addr; + tmp->i2c_settings.reg_setting[i].reg_data = + i2c_reg_settings[i].reg_data; + tmp->i2c_settings.reg_setting[i].data_mask = + i2c_reg_settings[i].data_mask; + tmp->i2c_settings.reg_setting[i].delay = + i2c_reg_settings[i].delay; + } + + return tmp; +} + int cam_flash_led_prepare(struct led_trigger *trigger, int options, int *max_current, bool is_wled) { @@ -289,6 +333,7 @@ int cam_flash_i2c_flush_request(struct cam_flash_ctrl *fctrl, int i = 0; uint32_t cancel_req_id_found = 0; struct i2c_settings_array *i2c_set = NULL; + struct i2c_settings_list *i2c_list = NULL; if (!fctrl) { CAM_ERR(CAM_FLASH, "Device data is NULL"); @@ -309,6 +354,17 @@ int cam_flash_i2c_flush_request(struct cam_flash_ctrl *fctrl, continue; if (i2c_set->is_settings_valid == 1) { + 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 settings: %d", + rc); + } + } rc = delete_request(i2c_set); if (rc < 0) CAM_ERR(CAM_FLASH, @@ -479,6 +535,14 @@ int cam_flash_off(struct cam_flash_ctrl *flash_ctrl) "cannot apply streamoff settings"); } } + + if(i2c_flash_off) + { + CAM_DBG(CAM_FLASH, "i2c Flash OFF Triggered"); + cam_sensor_util_i2c_apply_setting(&(flash_ctrl->io_master_info), + i2c_flash_off); + } + return 0; } @@ -705,6 +769,8 @@ 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->apply_streamoff == true) { fctrl->apply_streamoff = false; i2c_set = &fctrl->i2c_data.streamoff_settings; @@ -721,6 +787,9 @@ int cam_flash_i2c_apply_setting(struct cam_flash_ctrl *fctrl, break; } } else if (fctrl->i2c_data.init_settings.is_settings_valid == true) { + if(flash_initstate) + goto config_setting; + list_for_each_entry(i2c_list, &(fctrl->i2c_data.init_settings.list_head), list) { @@ -742,8 +811,14 @@ int cam_flash_i2c_apply_setting(struct cam_flash_ctrl *fctrl, rc); return rc; } + + if((NULL != i2c_list) && (NULL == i2c_flash_off)) { + i2c_flash_off = cam_flash_get_i2c_ptr(i2c_list); + } } + flash_initstate = CAM_FLASH_STATE_CONFIG; } +config_setting: /* NonRealTime (Widget/RER/INIT_FIRE settings) */ if (fctrl->i2c_data.config_settings.is_settings_valid == true) { list_for_each_entry(i2c_list, @@ -1230,7 +1305,12 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg) CAM_DBG(CAM_FLASH, "settings already valid"); i2c_reg_settings->request_id = 0; i2c_reg_settings->is_settings_valid = false; - goto update_req_mgr; + //goto update_req_mgr; + rc = delete_request(i2c_reg_settings); + if (rc) { + CAM_ERR(CAM_FLASH, "Error deleting req: %d", rc); + return rc; + } } i2c_reg_settings->is_settings_valid = true; i2c_reg_settings->request_id = @@ -1907,6 +1987,18 @@ int cam_flash_release_dev(struct cam_flash_ctrl *fctrl) } } + if(i2c_flash_off != NULL) + { + if(i2c_flash_off->i2c_settings.reg_setting != NULL) { + vfree(i2c_flash_off->i2c_settings.reg_setting); + i2c_flash_off->i2c_settings.reg_setting = NULL; + } + + kfree(i2c_flash_off); + i2c_flash_off = NULL; + flash_initstate = 0; + } + if (fctrl->bridge_intf.device_hdl != 1) { rc = cam_destroy_device_hdl(fctrl->bridge_intf.device_hdl); if (rc) diff --git a/drivers/cam_sensor_module/cam_flash/cam_flash_dev.c b/drivers/cam_sensor_module/cam_flash/cam_flash_dev.c index cc57a7124ae9..6334d2acdce1 100644 --- a/drivers/cam_sensor_module/cam_flash/cam_flash_dev.c +++ b/drivers/cam_sensor_module/cam_flash/cam_flash_dev.c @@ -482,8 +482,9 @@ static int cam_flash_component_bind(struct device *dev, rc = cam_sensor_util_init_gpio_pin_tbl(soc_info, &fctrl->power_info.gpio_num_info); if ((rc < 0) || (!fctrl->power_info.gpio_num_info)) { - CAM_ERR(CAM_FLASH, "No/Error Flash GPIOs"); - return -EINVAL; + //CAM_ERR(CAM_FLASH, "No/Error Flash GPIOs"); + //return -EINVAL; + CAM_WARN(CAM_FLASH, "No/Error Flash GPIOs"); } rc = cam_sensor_util_regulator_powerup(soc_info); if (rc < 0) {