Merge "msm: camera: isp: Unsubscribe for discard frame trigger in bh" into camera-kernel.lnx.5.0

This commit is contained in:
Camera Software Integration
2021-05-24 19:52:43 -07:00
committed by Gerrit - the friendly Code Review server

View File

@@ -568,9 +568,40 @@ static inline void cam_ife_csid_ver2_reset_discard_frame_cfg(
atomic_read(&csid_hw->discard_frame_per_path)); atomic_read(&csid_hw->discard_frame_per_path));
} }
static int cam_ife_csid_ver2_discard_sof_pix_top_half( static int cam_ife_csid_ver2_discard_sof_top_half(
uint32_t evt_id, uint32_t evt_id,
struct cam_irq_th_payload *th_payload) struct cam_irq_th_payload *th_payload)
{
struct cam_hw_info *hw_info;
struct cam_ife_csid_ver2_hw *csid_hw = NULL;
struct cam_isp_resource_node *res;
struct cam_ife_csid_ver2_path_cfg *path_cfg;
res = th_payload->handler_priv;
if (!res) {
CAM_ERR_RATE_LIMIT(CAM_ISP, "No private returned");
return -ENODEV;
}
hw_info = (struct cam_hw_info *)res->hw_intf->hw_priv;
csid_hw = (struct cam_ife_csid_ver2_hw *)hw_info->core_info;
path_cfg = (struct cam_ife_csid_ver2_path_cfg *)res->res_priv;
CAM_DBG(CAM_ISP, "CSID: %d status: 0x%x for res: %s",
csid_hw->hw_intf->hw_idx,
th_payload->evt_status_arr[path_cfg->irq_reg_idx],
res->res_name);
/* No need of payload since it's an exclusive th & bh */
th_payload->evt_payload_priv = NULL;
return 0;
}
static int cam_ife_csid_ver2_discard_sof_pix_bottom_half(
void *handler_priv,
void *evt_payload_priv)
{ {
struct cam_hw_info *hw_info; struct cam_hw_info *hw_info;
struct cam_ife_csid_ver2_hw *csid_hw = NULL; struct cam_ife_csid_ver2_hw *csid_hw = NULL;
@@ -582,13 +613,12 @@ static int cam_ife_csid_ver2_discard_sof_pix_top_half(
void __iomem *base; void __iomem *base;
uint32_t val; uint32_t val;
res = th_payload->handler_priv; if (!handler_priv) {
CAM_ERR(CAM_ISP, "Invalid handler_priv");
if (!res) { return -EINVAL;
CAM_ERR_RATE_LIMIT(CAM_ISP, "No private returned");
return -ENODEV;
} }
res = handler_priv;
hw_info = (struct cam_hw_info *)res->hw_intf->hw_priv; hw_info = (struct cam_hw_info *)res->hw_intf->hw_priv;
csid_hw = (struct cam_ife_csid_ver2_hw *)hw_info->core_info; csid_hw = (struct cam_ife_csid_ver2_hw *)hw_info->core_info;
csid_reg = (struct cam_ife_csid_ver2_reg_info *) csid_reg = (struct cam_ife_csid_ver2_reg_info *)
@@ -603,7 +633,7 @@ static int cam_ife_csid_ver2_discard_sof_pix_top_half(
path_reg = csid_reg->ppp_reg; path_reg = csid_reg->ppp_reg;
} else { } else {
CAM_WARN(CAM_ISP, "Invalid res_id: 0x%x", res->res_id); CAM_WARN(CAM_ISP, "Invalid res_id: 0x%x", res->res_id);
return -ENODEV; return -EINVAL;
} }
/* Count SOFs */ /* Count SOFs */
@@ -628,12 +658,12 @@ static int cam_ife_csid_ver2_discard_sof_pix_top_half(
cam_ife_csid_ver2_reset_discard_frame_cfg(res->res_name, csid_hw, path_cfg); cam_ife_csid_ver2_reset_discard_frame_cfg(res->res_name, csid_hw, path_cfg);
} }
return IRQ_HANDLED; return 0;
} }
static int cam_ife_csid_ver2_discard_sof_rdi_top_half( static int cam_ife_csid_ver2_discard_sof_rdi_bottom_half(
uint32_t evt_id, void *handler_priv,
struct cam_irq_th_payload *th_payload) void *evt_payload_priv)
{ {
struct cam_hw_info *hw_info; struct cam_hw_info *hw_info;
struct cam_ife_csid_ver2_hw *csid_hw = NULL; struct cam_ife_csid_ver2_hw *csid_hw = NULL;
@@ -645,13 +675,12 @@ static int cam_ife_csid_ver2_discard_sof_rdi_top_half(
void __iomem *base; void __iomem *base;
uint32_t val; uint32_t val;
res = th_payload->handler_priv; if (!handler_priv) {
CAM_ERR(CAM_ISP, "Invalid handler_priv");
if (!res) { return -EINVAL;
CAM_ERR_RATE_LIMIT(CAM_ISP, "No private returned");
return -ENODEV;
} }
res = handler_priv;
hw_info = (struct cam_hw_info *)res->hw_intf->hw_priv; hw_info = (struct cam_hw_info *)res->hw_intf->hw_priv;
csid_hw = (struct cam_ife_csid_ver2_hw *)hw_info->core_info; csid_hw = (struct cam_ife_csid_ver2_hw *)hw_info->core_info;
csid_reg = (struct cam_ife_csid_ver2_reg_info *) csid_reg = (struct cam_ife_csid_ver2_reg_info *)
@@ -679,7 +708,7 @@ static int cam_ife_csid_ver2_discard_sof_rdi_top_half(
cam_ife_csid_ver2_reset_discard_frame_cfg(res->res_name, csid_hw, path_cfg); cam_ife_csid_ver2_reset_discard_frame_cfg(res->res_name, csid_hw, path_cfg);
} }
return IRQ_HANDLED; return 0;
} }
static int cam_ife_csid_ver2_stop_csi2_in_err( static int cam_ife_csid_ver2_stop_csi2_in_err(
@@ -2702,7 +2731,8 @@ static inline int cam_ife_csid_ver2_subscribe_sof_for_discard(
struct cam_ife_csid_ver2_path_cfg *path_cfg, struct cam_ife_csid_ver2_path_cfg *path_cfg,
struct cam_ife_csid_ver2_hw *csid_hw, struct cam_ife_csid_ver2_hw *csid_hw,
struct cam_isp_resource_node *res, struct cam_isp_resource_node *res,
CAM_IRQ_HANDLER_TOP_HALF top_half_handler) CAM_IRQ_HANDLER_TOP_HALF top_half_handler,
CAM_IRQ_HANDLER_BOTTOM_HALF bottom_half_handler)
{ {
int rc = 0; int rc = 0;
uint32_t val; uint32_t val;
@@ -2712,13 +2742,13 @@ static inline int cam_ife_csid_ver2_subscribe_sof_for_discard(
irq_mask[path_cfg->irq_reg_idx] = val; irq_mask[path_cfg->irq_reg_idx] = val;
path_cfg->discard_irq_handle = cam_irq_controller_subscribe_irq( path_cfg->discard_irq_handle = cam_irq_controller_subscribe_irq(
csid_hw->csid_irq_controller, csid_hw->csid_irq_controller,
CAM_IRQ_PRIORITY_1, CAM_IRQ_PRIORITY_0,
irq_mask, irq_mask,
res, res,
top_half_handler, top_half_handler,
NULL, bottom_half_handler,
NULL, csid_hw->tasklet,
NULL); &tasklet_bh_api);
if (path_cfg->discard_irq_handle < 1) { if (path_cfg->discard_irq_handle < 1) {
CAM_ERR(CAM_ISP, CAM_ERR(CAM_ISP,
@@ -2846,7 +2876,8 @@ static int cam_ife_csid_ver2_program_rdi_path(
if (path_cfg->discard_init_frames) { if (path_cfg->discard_init_frames) {
rc = cam_ife_csid_ver2_subscribe_sof_for_discard( rc = cam_ife_csid_ver2_subscribe_sof_for_discard(
path_cfg, csid_hw, res, path_cfg, csid_hw, res,
cam_ife_csid_ver2_discard_sof_rdi_top_half); cam_ife_csid_ver2_discard_sof_top_half,
cam_ife_csid_ver2_discard_sof_rdi_bottom_half);
if (rc) if (rc)
goto end; goto end;
} }
@@ -2973,7 +3004,8 @@ static int cam_ife_csid_ver2_program_ipp_path(
if (path_cfg->discard_init_frames) { if (path_cfg->discard_init_frames) {
rc = cam_ife_csid_ver2_subscribe_sof_for_discard( rc = cam_ife_csid_ver2_subscribe_sof_for_discard(
path_cfg, csid_hw, res, path_cfg, csid_hw, res,
cam_ife_csid_ver2_discard_sof_pix_top_half); cam_ife_csid_ver2_discard_sof_top_half,
cam_ife_csid_ver2_discard_sof_pix_bottom_half);
if (rc) if (rc)
goto end; goto end;
} }
@@ -3211,7 +3243,8 @@ static int cam_ife_csid_ver2_program_ppp_path(
if (path_cfg->discard_init_frames) { if (path_cfg->discard_init_frames) {
rc = cam_ife_csid_ver2_subscribe_sof_for_discard( rc = cam_ife_csid_ver2_subscribe_sof_for_discard(
path_cfg, csid_hw, res, path_cfg, csid_hw, res,
cam_ife_csid_ver2_discard_sof_pix_top_half); cam_ife_csid_ver2_discard_sof_top_half,
cam_ife_csid_ver2_discard_sof_pix_bottom_half);
if (rc) if (rc)
goto end; goto end;
} }