msm: camera: flash: Add support for flash stream off
- Apply flash off register settings at the time of stream off. - Add support to send fire command in initial config command. CRs-Fixed: 2998772 Change-Id: I8897a68e637d283afd98e386b6a7b1fbaaf63c61 Signed-off-by: shiwgupt <shiwgupt@codeaurora.org>
This commit is contained in:
Родитель
5ab24d0f0c
Коммит
0c9bd2865b
|
@ -1,6 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
|
@ -505,6 +505,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;
|
||||
|
@ -515,6 +517,17 @@ int cam_flash_off(struct cam_flash_ctrl *flash_ctrl)
|
|||
(enum led_brightness)LED_SWITCH_OFF);
|
||||
|
||||
flash_ctrl->flash_state = CAM_FLASH_STATE_START;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -702,7 +715,24 @@ int cam_flash_i2c_apply_setting(struct cam_flash_ctrl *fctrl,
|
|||
|
||||
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) {
|
||||
|
@ -1180,7 +1210,8 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
|
|||
|
||||
rc = fctrl->func_tbl.apply_setting(fctrl, 0);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_FLASH, "cannot apply settings rc = %d", rc);
|
||||
CAM_ERR(CAM_FLASH,
|
||||
"cannot apply settings rc = %d", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -1212,6 +1243,18 @@ 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: {
|
||||
|
@ -1265,6 +1308,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));
|
||||
|
@ -1805,6 +1871,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)
|
||||
|
@ -1815,6 +1891,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;
|
||||
|
|
|
@ -71,6 +71,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,
|
||||
|
@ -123,6 +124,7 @@ static int32_t cam_flash_driver_cmd(struct cam_flash_ctrl *fctrl,
|
|||
if (fctrl->func_tbl.power_ops(fctrl, false))
|
||||
CAM_WARN(CAM_FLASH, "Power Down Failed");
|
||||
|
||||
fctrl->streamoff_count = 0;
|
||||
fctrl->flash_state = CAM_FLASH_STATE_INIT;
|
||||
break;
|
||||
}
|
||||
|
@ -162,6 +164,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;
|
||||
}
|
||||
|
@ -490,6 +493,7 @@ static int32_t cam_flash_platform_probe(struct platform_device *pdev)
|
|||
|
||||
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));
|
||||
|
@ -592,6 +596,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));
|
||||
|
||||
|
|
|
@ -40,6 +40,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;
|
||||
|
||||
|
@ -182,6 +183,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];
|
||||
|
@ -210,6 +213,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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче