msm: camera: reqmgr: Handle flash properly
Apply the flash at EOF and apply the other devices at the EPOCH of next frame, then the flash can cover all the exposure zone of current request. Add the inject delay for SOF and EOF separate, then we can use inject delay for more flexible frame skip control. CRs-Fixed: 2820683 Change-Id: Ic6a58327a0ae44c54190884ba42ea7926ec7c90e Signed-off-by: Depeng Shao <depengs@codeaurora.org>
This commit is contained in:
@@ -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>
|
||||
@@ -374,11 +374,10 @@ static int cam_actuator_update_req_mgr(
|
||||
int rc = 0;
|
||||
struct cam_req_mgr_add_request add_req;
|
||||
|
||||
memset(&add_req, 0, sizeof(add_req));
|
||||
add_req.link_hdl = a_ctrl->bridge_intf.link_hdl;
|
||||
add_req.req_id = csl_packet->header.request_id;
|
||||
add_req.dev_hdl = a_ctrl->bridge_intf.device_hdl;
|
||||
add_req.skip_before_applying = 0;
|
||||
add_req.trigger_eof = false;
|
||||
|
||||
if (a_ctrl->bridge_intf.crm_cb &&
|
||||
a_ctrl->bridge_intf.crm_cb->add_req) {
|
||||
|
@@ -1263,26 +1263,30 @@ update_req_mgr:
|
||||
CAM_PKT_NOP_OPCODE) ||
|
||||
((csl_packet->header.op_code & 0xFFFFF) ==
|
||||
CAM_FLASH_PACKET_OPCODE_SET_OPS)) {
|
||||
memset(&add_req, 0, sizeof(add_req));
|
||||
add_req.link_hdl = fctrl->bridge_intf.link_hdl;
|
||||
add_req.req_id = csl_packet->header.request_id;
|
||||
add_req.dev_hdl = fctrl->bridge_intf.device_hdl;
|
||||
|
||||
if ((csl_packet->header.op_code & 0xFFFFF) ==
|
||||
CAM_FLASH_PACKET_OPCODE_SET_OPS)
|
||||
add_req.skip_before_applying = 1;
|
||||
else
|
||||
add_req.skip_before_applying = 0;
|
||||
CAM_FLASH_PACKET_OPCODE_SET_OPS) {
|
||||
add_req.trigger_eof = true;
|
||||
add_req.skip_at_sof = 1;
|
||||
}
|
||||
|
||||
if (fctrl->bridge_intf.crm_cb &&
|
||||
fctrl->bridge_intf.crm_cb->add_req)
|
||||
fctrl->bridge_intf.crm_cb->add_req) {
|
||||
rc = fctrl->bridge_intf.crm_cb->add_req(&add_req);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_FLASH,
|
||||
"Failed in adding request: %llu to request manager",
|
||||
csl_packet->header.request_id);
|
||||
return rc;
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_FLASH,
|
||||
"Failed in adding request: %llu to request manager",
|
||||
csl_packet->header.request_id);
|
||||
return rc;
|
||||
}
|
||||
CAM_DBG(CAM_FLASH,
|
||||
"add req %lld to req_mgr, trigger_eof %d",
|
||||
add_req.req_id, add_req.trigger_eof);
|
||||
}
|
||||
CAM_DBG(CAM_FLASH, "add req to req_mgr= %lld", add_req.req_id);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
@@ -1507,7 +1511,8 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
|
||||
switch (cmn_hdr->cmd_type) {
|
||||
case CAMERA_SENSOR_FLASH_CMD_TYPE_FIRE: {
|
||||
CAM_DBG(CAM_FLASH,
|
||||
"CAMERA_SENSOR_FLASH_CMD_TYPE_FIRE cmd called");
|
||||
"CAMERA_SENSOR_FLASH_CMD_TYPE_FIRE cmd called, req:%lld",
|
||||
csl_packet->header.request_id);
|
||||
if ((fctrl->flash_state == CAM_FLASH_STATE_INIT) ||
|
||||
(fctrl->flash_state ==
|
||||
CAM_FLASH_STATE_ACQUIRE)) {
|
||||
@@ -1545,7 +1550,8 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
|
||||
= flash_operation_info->led_current_ma[i];
|
||||
|
||||
CAM_DBG(CAM_FLASH,
|
||||
"FLASH_CMD_TYPE op:%d", flash_data->opcode);
|
||||
"FLASH_CMD_TYPE op:%d, req:%lld",
|
||||
flash_data->opcode, csl_packet->header.request_id);
|
||||
|
||||
if (flash_data->opcode ==
|
||||
CAMERA_SENSOR_FLASH_OP_FIREDURATION) {
|
||||
@@ -1739,29 +1745,34 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
|
||||
CAM_PKT_NOP_OPCODE) ||
|
||||
((csl_packet->header.op_code & 0xFFFFF) ==
|
||||
CAM_FLASH_PACKET_OPCODE_SET_OPS)) {
|
||||
memset(&add_req, 0, sizeof(add_req));
|
||||
add_req.link_hdl = fctrl->bridge_intf.link_hdl;
|
||||
add_req.req_id = csl_packet->header.request_id;
|
||||
add_req.dev_hdl = fctrl->bridge_intf.device_hdl;
|
||||
|
||||
if ((csl_packet->header.op_code & 0xFFFFF) ==
|
||||
CAM_FLASH_PACKET_OPCODE_SET_OPS) {
|
||||
add_req.skip_before_applying |= SKIP_NEXT_FRAME;
|
||||
add_req.trigger_eof = true;
|
||||
|
||||
if (flash_data && (flash_data->opcode !=
|
||||
CAMERA_SENSOR_FLASH_OP_FIREDURATION))
|
||||
add_req.skip_before_applying |= 1;
|
||||
else
|
||||
add_req.skip_before_applying = 0;
|
||||
} else {
|
||||
add_req.skip_before_applying = 0;
|
||||
if (flash_data->opcode == CAMERA_SENSOR_FLASH_OP_OFF) {
|
||||
add_req.skip_at_sof = 1;
|
||||
add_req.skip_at_eof = 1;
|
||||
} else
|
||||
add_req.skip_at_sof = 1;
|
||||
}
|
||||
CAM_DBG(CAM_FLASH,
|
||||
"add req to req_mgr= %lld:: trigger_eof: %d",
|
||||
add_req.req_id, add_req.trigger_eof);
|
||||
|
||||
if (fctrl->bridge_intf.crm_cb &&
|
||||
fctrl->bridge_intf.crm_cb->add_req)
|
||||
fctrl->bridge_intf.crm_cb->add_req(&add_req);
|
||||
fctrl->bridge_intf.crm_cb->add_req) {
|
||||
rc = fctrl->bridge_intf.crm_cb->add_req(&add_req);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_FLASH,
|
||||
"Failed in adding request: %llu to request manager",
|
||||
csl_packet->header.request_id);
|
||||
return rc;
|
||||
}
|
||||
CAM_DBG(CAM_FLASH,
|
||||
"add req %lld to req_mgr, trigger_eof %d",
|
||||
add_req.req_id, add_req.trigger_eof);
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
|
@@ -20,13 +20,12 @@ static int cam_sensor_update_req_mgr(
|
||||
int rc = 0;
|
||||
struct cam_req_mgr_add_request add_req;
|
||||
|
||||
memset(&add_req, 0, sizeof(add_req));
|
||||
add_req.link_hdl = s_ctrl->bridge_intf.link_hdl;
|
||||
add_req.req_id = csl_packet->header.request_id;
|
||||
CAM_DBG(CAM_SENSOR, " Rxed Req Id: %llu",
|
||||
csl_packet->header.request_id);
|
||||
add_req.dev_hdl = s_ctrl->bridge_intf.device_hdl;
|
||||
add_req.skip_before_applying = 0;
|
||||
add_req.trigger_eof = false;
|
||||
if (s_ctrl->bridge_intf.crm_cb &&
|
||||
s_ctrl->bridge_intf.crm_cb->add_req) {
|
||||
rc = s_ctrl->bridge_intf.crm_cb->add_req(&add_req);
|
||||
|
Reference in New Issue
Block a user