diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index d72213bbb4b9..f949f392b5ce 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -493,19 +493,8 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) u64 iq_feature = hw->iq_feature; bool is_upd = false, is_3dlut_upd = false; - if (dev->isp_ver == ISP_V21) - dma2frm = 0; hw->cur_dev_id = dev->dev_id; rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, NULL, true); - if (dma2frm > 2) - dma2frm = 2; - if (dma2frm == 2) - csi->frame_cnt_x3++; - else if (dma2frm == 1) - csi->frame_cnt_x2++; - else - csi->frame_cnt_x1++; - csi->frame_cnt++; val = 0; if (mode & T_START_X1) { @@ -560,7 +549,7 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) rkisp_params_first_cfg(&dev->params_vdev, &dev->isp_sdev.in_fmt, dev->isp_sdev.quantization); - rkisp_params_cfg(params_vdev, cur_frame_id, dma2frm + 1); + rkisp_params_cfg(params_vdev, cur_frame_id); if (!hw->is_single) { rkisp_update_regs(dev, CTRL_VI_ISP_PATH, SUPER_IMP_COLOR_CR); @@ -572,7 +561,11 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) rkisp_update_regs(dev, MI_RD_CTRL2, ISP_LSC_CTRL); rkisp_update_regs(dev, MI_MP_WR_Y_BASE, MI_MP_WR_Y_LLENGTH); rkisp_update_regs(dev, ISP_LSC_XGRAD_01, ISP_RAWAWB_RAM_DATA); - if (dev->isp_ver == ISP_V21) { + if (dev->isp_ver == ISP_V20 && + (rkisp_read(dev, ISP_DHAZ_CTRL, false) & ISP_DHAZ_ENMUX || + rkisp_read(dev, ISP_HDRTMO_CTRL, false) & ISP_HDRTMO_EN)) { + dma2frm += (dma2frm ? 0 : 1); + } else if (dev->isp_ver == ISP_V21) { val = rkisp_read(dev, MI_WR_CTRL2, false); rkisp_set_bits(dev, MI_WR_CTRL2, 0, val, true); rkisp_write(dev, MI_WR_INIT, ISP21_SP_FORCE_UPD | ISP21_MP_FORCE_UPD, true); @@ -584,8 +577,20 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) is_upd = true; } - if (IS_HDR_RDBK(dev->csi_dev.rd_mode)) - rkisp_params_cfgsram(params_vdev); + if (dev->isp_ver == ISP_V21) + dma2frm = 0; + if (dma2frm > 2) + dma2frm = 2; + if (dma2frm == 2) + csi->frame_cnt_x3++; + else if (dma2frm == 1) + csi->frame_cnt_x2++; + else + csi->frame_cnt_x1++; + csi->frame_cnt++; + + rkisp_params_cfgsram(params_vdev); + params_vdev->rdbk_times = dma2frm + 1; /* read 3d lut at frame end */ if (hw->is_single && is_upd && diff --git a/drivers/media/platform/rockchip/isp/isp_params.c b/drivers/media/platform/rockchip/isp/isp_params.c index 9c1e0b6accf9..5ce3e6673de4 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.c +++ b/drivers/media/platform/rockchip/isp/isp_params.c @@ -187,6 +187,7 @@ static void rkisp_params_vb2_stop_streaming(struct vb2_queue *vq) /* clean module params */ params_vdev->ops->clear_first_param(params_vdev); + params_vdev->rdbk_times = 0; } static int @@ -298,12 +299,10 @@ static void rkisp_uninit_params_vdev(struct rkisp_isp_params_vdev *params_vdev) rkisp_uninit_params_vdev_v2x(params_vdev); } -void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, - u32 frame_id, u32 rdbk_times) +void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id) { if (params_vdev->ops->param_cfg) - params_vdev->ops->param_cfg(params_vdev, frame_id, - rdbk_times, RKISP_PARAMS_IMD); + params_vdev->ops->param_cfg(params_vdev, frame_id, RKISP_PARAMS_IMD); } void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev) diff --git a/drivers/media/platform/rockchip/isp/isp_params.h b/drivers/media/platform/rockchip/isp/isp_params.h index 69c203ac3c96..e4d8c009fc18 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.h +++ b/drivers/media/platform/rockchip/isp/isp_params.h @@ -23,7 +23,7 @@ struct rkisp_isp_params_ops { void (*disable_isp)(struct rkisp_isp_params_vdev *params_vdev); void (*isr_hdl)(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis); void (*param_cfg)(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id, - u32 rdbk_times, enum rkisp_params_type type); + enum rkisp_params_type type); void (*param_cfgsram)(struct rkisp_isp_params_vdev *params_vdev); void (*get_ldchbuf_inf)(struct rkisp_isp_params_vdev *params_vdev, struct rkisp_ldchbuf_info *ldchbuf); @@ -94,8 +94,7 @@ void rkisp_unregister_params_vdev(struct rkisp_isp_params_vdev *params_vdev); void rkisp_params_isr(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis); -void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, - u32 frame_id, u32 rdbk_times); +void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id); void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev); void rkisp_params_get_ldchbuf_inf(struct rkisp_isp_params_vdev *params_vdev, diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c index 626ae17fe4c7..1808bb11ca42 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v21.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c @@ -4118,7 +4118,7 @@ rkisp_params_disable_isp_v2x(struct rkisp_isp_params_vdev *params_vdev) static void rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev, - u32 frame_id, u32 rdbk_times, enum rkisp_params_type type) + u32 frame_id, enum rkisp_params_type type) { struct isp21_isp_params_cfg *new_params = NULL; struct rkisp_buffer *cur_buf = params_vdev->cur_buf; @@ -4169,8 +4169,6 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev, params_vdev->cur_hdrdrc = new_params->others.drc_cfg; vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); cur_buf = NULL; - } else { - params_vdev->rdbk_times = rdbk_times; } unlock: @@ -4210,12 +4208,13 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev, rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, NULL, true); if (isp_mis & CIF_ISP_V_START) { + if (params_vdev->rdbk_times) + params_vdev->rdbk_times--; if (!params_vdev->cur_buf) return; - params_vdev->rdbk_times--; if (IS_HDR_RDBK(dev->csi_dev.rd_mode) && !params_vdev->rdbk_times) { - rkisp_params_cfg_v2x(params_vdev, cur_frame_id, 0, RKISP_PARAMS_SHD); + rkisp_params_cfg_v2x(params_vdev, cur_frame_id, RKISP_PARAMS_SHD); return; } } @@ -4224,7 +4223,7 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev, rkisp_params_clear_fstflg(params_vdev); if ((isp_mis & CIF_ISP_FRAME) && !IS_HDR_RDBK(dev->csi_dev.rd_mode)) - rkisp_params_cfg_v2x(params_vdev, cur_frame_id, 0, RKISP_PARAMS_ALL); + rkisp_params_cfg_v2x(params_vdev, cur_frame_id, RKISP_PARAMS_ALL); } static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c index 1d31009b0ba8..df6cb0831c20 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c @@ -3118,7 +3118,7 @@ static void isp_hdrtmo_wait_first_line(struct rkisp_isp_params_vdev *params_vdev rkisp_dmarx_get_frame(params_vdev->dev, &frame_id, NULL, NULL, true); do { - value = rkisp_ioread32(params_vdev, ISP_HDRTMO_LG_RO5); + value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_RO5, true); line_cnt = value & 0x1fff; if (frame_id != 0 && (line_cnt < 1 || line_cnt >= out_crop->height)) @@ -3137,7 +3137,7 @@ isp_hdrtmo_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_hdrtmo_cfg *arg, enum rkisp_params_type type) { u8 big_en, nobig_en; - u32 value, irq_mask = 0x0; + u32 value; if (type == RKISP_PARAMS_SHD || type == RKISP_PARAMS_ALL) { value = rkisp_ioread32(params_vdev, ISP_HDRTMO_CTRL_CFG); @@ -3149,7 +3149,8 @@ isp_hdrtmo_config(struct rkisp_isp_params_vdev *params_vdev, value = ISP2X_PACK_2SHORT(arg->lgscl, arg->lgscl_inv); rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_SCL); - isp_hdrtmo_wait_first_line(params_vdev); + if (type == RKISP_PARAMS_SHD) + isp_hdrtmo_wait_first_line(params_vdev); value = ISP2X_PACK_2SHORT(arg->set_palpha, arg->set_gainoff); rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG0); @@ -3175,12 +3176,6 @@ isp_hdrtmo_config(struct rkisp_isp_params_vdev *params_vdev, nobig_en = 0; } - irq_mask = rkisp_ioread32(params_vdev, CIF_ISP_IMSC); - if (arg->cnt_mode & 0x01 && !(irq_mask & ISP2X_HDR_DONE)) { - irq_mask |= ISP2X_HDR_DONE; - rkisp_write(params_vdev->dev, CIF_ISP_IMSC, irq_mask, true); - } - value = rkisp_ioread32(params_vdev, ISP_HDRTMO_CTRL); value &= ISP_HDRTMO_EN; value |= (arg->cnt_vsize & 0x1FFF) << 16 | @@ -4212,9 +4207,9 @@ void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev) (struct rkisp_isp_params_v2x_ops *)params_vdev->priv_ops; ops->hdrmge_config(params_vdev, - ¶ms_vdev->last_hdrmge, RKISP_PARAMS_SHD); + ¶ms_vdev->last_hdrmge, RKISP_PARAMS_ALL); ops->hdrtmo_config(params_vdev, - ¶ms_vdev->last_hdrtmo, RKISP_PARAMS_SHD); + ¶ms_vdev->last_hdrtmo, RKISP_PARAMS_ALL); } static __maybe_unused @@ -4435,7 +4430,7 @@ rkisp_params_disable_isp_v2x(struct rkisp_isp_params_vdev *params_vdev) static void rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev, - u32 frame_id, u32 rdbk_times, enum rkisp_params_type type) + u32 frame_id, enum rkisp_params_type type) { struct isp2x_isp_params_cfg *new_params = NULL; struct rkisp_buffer *cur_buf = params_vdev->cur_buf; @@ -4486,11 +4481,9 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev, params_vdev->cur_hdrmge = new_params->others.hdrmge_cfg; vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); cur_buf = NULL; - } else { - params_vdev->rdbk_times = rdbk_times; } - params_vdev->exposure = new_params->exposure; + params_vdev->exposure = new_params->exposure; unlock: params_vdev->cur_buf = cur_buf; spin_unlock(¶ms_vdev->config_lock); @@ -4513,13 +4506,12 @@ static void isp_hdrtmo_palhpa_reconfig(struct rkisp_isp_params_vdev *params_vdev rkisp_dmarx_get_frame(params_vdev->dev, &cur_frame_id, NULL, NULL, true); - value = rkisp_ioread32(params_vdev, ISP_HDRTMO_LG_CFG0) & 0xfffffc00; + value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_CFG0, true) & 0xfffffc00; value |= palpha; - rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG0); + rkisp_write(params_vdev->dev, ISP_HDRTMO_LG_CFG0, value, true); v4l2_dbg(5, rkisp_debug, ¶ms_vdev->dev->v4l2_dev, - "frame(%d), palpha(%d)\n", - cur_frame_id, palpha); + "frame(%d), palpha(%d)\n", cur_frame_id, palpha); } static void isp_hdrtmo_lgavgmax_reconfig(struct rkisp_isp_params_vdev *params_vdev, @@ -4541,17 +4533,15 @@ static void isp_hdrtmo_lgavgmax_reconfig(struct rkisp_isp_params_vdev *params_vd lgavgmax = min(lgavgmax / 256, lgrange1); } - value = rkisp_ioread32(params_vdev, ISP_HDRTMO_LG_CFG4) & 0xffff0000; + value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_CFG4, true) & 0xffff0000; value |= lgavgmax; - rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG4); + rkisp_write(params_vdev->dev, ISP_HDRTMO_LG_CFG4, value, true); rkisp_dmarx_get_frame(params_vdev->dev, &cur_frame_id, NULL, NULL, true); v4l2_dbg(5, rkisp_debug, ¶ms_vdev->dev->v4l2_dev, - "frame(%d), global_tmo(%d), lgavgmax(%d)\n", - cur_frame_id, - params_vdev->cur_hdrtmo.predict.global_tmo, - lgavgmax); + "frame(%d), global_tmo(%d), lgavgmax(%d)\n", + cur_frame_id, params_vdev->cur_hdrtmo.predict.global_tmo, lgavgmax); } static void isp_hdrtmo_lgrange1_reconfig(struct rkisp_isp_params_vdev *params_vdev, @@ -4562,17 +4552,15 @@ static void isp_hdrtmo_lgrange1_reconfig(struct rkisp_isp_params_vdev *params_vd u32 cur_frame_id, value; lgrange1 = lgmean; - value = rkisp_ioread32(params_vdev, ISP_HDRTMO_LG_CFG3) & 0xffff; + value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_CFG3, true) & 0xffff; value |= lgrange1 << 16; - rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG3); + rkisp_write(params_vdev->dev, ISP_HDRTMO_LG_CFG3, value, true); rkisp_dmarx_get_frame(params_vdev->dev, &cur_frame_id, NULL, NULL, true); v4l2_dbg(5, rkisp_debug, ¶ms_vdev->dev->v4l2_dev, - "frame(%d), global_tmo(%d), lgrange1(%d)\n", - cur_frame_id, - params_vdev->cur_hdrtmo.predict.global_tmo, - lgrange1); + "frame(%d), global_tmo(%d), lgrange1(%d)\n", + cur_frame_id, params_vdev->cur_hdrtmo.predict.global_tmo, lgrange1); } } @@ -4590,7 +4578,7 @@ static u16 isp_hdrtmo_lgmean_reconfig(struct rkisp_isp_params_vdev *params_vdev) s32 iir = 0; s32 global_tmo_strength = params_vdev->cur_hdrtmo.predict.global_tmo_strength; - value = rkisp_ioread32(params_vdev, ISP_HDRTMO_LG_RO2); + value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_RO2, true); ro_lgmean = value & 0xffff; iir = min(cur_frame_id + 1, params_vdev->cur_hdrtmo.predict.iir); @@ -4609,19 +4597,17 @@ static u16 isp_hdrtmo_lgmean_reconfig(struct rkisp_isp_params_vdev *params_vdev) } } - value = rkisp_ioread32(params_vdev, ISP_HDRTMO_LG_CFG2) & 0xffff0000; + value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_CFG2, true) & 0xffff0000; value |= lgmean; - rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG2); + rkisp_write(params_vdev->dev, ISP_HDRTMO_LG_CFG2, value, true); prev_lgmean = lgmean; v4l2_dbg(5, rkisp_debug, ¶ms_vdev->dev->v4l2_dev, - "frame(%d), scene_stable(%d), k_rolgmean(%d), iir(%d), lgmean(%d)\n", - cur_frame_id, - params_vdev->cur_hdrtmo.predict.scene_stable, - params_vdev->cur_hdrtmo.predict.k_rolgmean, - params_vdev->cur_hdrtmo.predict.iir, - lgmean); + "frame(%d), scene_stable(%d), k_rolgmean(%d), iir(%d), lgmean(%d)\n", + cur_frame_id, params_vdev->cur_hdrtmo.predict.scene_stable, + params_vdev->cur_hdrtmo.predict.k_rolgmean, + params_vdev->cur_hdrtmo.predict.iir, lgmean); return lgmean; } @@ -4635,10 +4621,11 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev, rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, NULL, true); if (isp_mis & CIF_ISP_V_START) { + if (params_vdev->rdbk_times) + params_vdev->rdbk_times--; if (!params_vdev->cur_buf) return; - params_vdev->rdbk_times--; if (IS_HDR_RDBK(dev->csi_dev.rd_mode) && !params_vdev->rdbk_times) { struct rkisp_isp_params_val_v2x *priv_val = (struct rkisp_isp_params_val_v2x *)params_vdev->priv_val; @@ -4651,7 +4638,7 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev, priv_val->delay_en_ldch = false; } - rkisp_params_cfg_v2x(params_vdev, cur_frame_id, 0, RKISP_PARAMS_SHD); + rkisp_params_cfg_v2x(params_vdev, cur_frame_id, RKISP_PARAMS_SHD); return; } } @@ -4668,7 +4655,7 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev, } if ((isp_mis & CIF_ISP_FRAME) && !IS_HDR_RDBK(dev->csi_dev.rd_mode)) - rkisp_params_cfg_v2x(params_vdev, cur_frame_id, 0, RKISP_PARAMS_ALL); + rkisp_params_cfg_v2x(params_vdev, cur_frame_id, RKISP_PARAMS_ALL); } static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index dc54fc9ff58c..6407c334926e 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -653,6 +653,8 @@ static int rkisp_config_isp(struct rkisp_device *dev) CIF_ISP_FRAME_IN; if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) irq_mask |= ISP2X_LSC_LUT_ERR; + if (dev->isp_ver == ISP_V20) + irq_mask |= ISP2X_HDR_DONE; rkisp_write(dev, CIF_ISP_IMSC, irq_mask, true); if ((dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) &&