From b319fe861ece1bf1097272e19a93c867e87f6ff1 Mon Sep 17 00:00:00 2001 From: Hu Kejun Date: Tue, 14 Apr 2020 15:40:28 +0800 Subject: [PATCH] media: rockchip: isp: enable ae big interrupt to get last ae stats in rdbk mode Signed-off-by: Hu Kejun Change-Id: I8fe1f7e1db38b65290b6490b3ca7be9b92866b0d --- .../platform/rockchip/isp/isp_stats_v2x.c | 20 +++++++++++++------ drivers/media/platform/rockchip/isp/rkisp.c | 14 ++++++++++++- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v2x.c b/drivers/media/platform/rockchip/isp/isp_stats_v2x.c index a801001f0b88..8f4df6be1135 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v2x.c @@ -1341,15 +1341,13 @@ static void rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev, u32 isp_ris, u32 isp3a_ris) { + struct rkisp_device *dev = stats_vdev->dev; u32 isp_mis_tmp = 0; struct rkisp_isp_readout_work work; u32 cur_frame_id = rkisp_dmarx_get_frame_id(stats_vdev->dev); u32 iq_isr_mask = ISP2X_SIAWB_DONE | ISP2X_SIAF_FIN | ISP2X_YUVAE_END | ISP2X_SIHST_RDY | ISP2X_AFM_SUM_OF | ISP2X_AFM_LUM_OF; - u32 iq_3a_mask = ISP2X_3A_RAWAE_BIG | ISP2X_3A_RAWAE_CH0 | ISP2X_3A_RAWAE_CH1 | - ISP2X_3A_RAWAE_CH2 | ISP2X_3A_RAWHIST_BIG | ISP2X_3A_RAWHIST_CH0 | - ISP2X_3A_RAWHIST_CH1 | ISP2X_3A_RAWHIST_CH2 | ISP2X_3A_RAWAF_SUM | - ISP2X_3A_RAWAF_LUM | ISP2X_3A_RAWAF | ISP2X_3A_RAWAWB; + u32 iq_3a_mask = 0; u32 hdl_ris, hdl_3aris, unhdl_ris, unhdl_3aris; u32 wr_buf_idx; u32 temp_isp_ris, temp_isp3a_ris; @@ -1357,6 +1355,10 @@ rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev, #ifdef LOG_ISR_EXE_TIME ktime_t in_t = ktime_get(); #endif + + if (IS_HDR_RDBK(dev->hdr.op_mode)) + iq_3a_mask = ISP2X_3A_RAWAE_BIG; + spin_lock(&stats_vdev->irq_lock); temp_isp_ris = readl(stats_vdev->dev->base_addr + ISP_ISP_RIS); @@ -1413,7 +1415,7 @@ rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev, work.readout = RKISP_ISP_READOUT_MEAS; work.frame_id = cur_frame_id; work.isp_ris = temp_isp_ris | isp_ris; - work.isp3a_ris = temp_isp3a_ris; + work.isp3a_ris = temp_isp3a_ris | iq_3a_mask; work.timestamp = ktime_get_ns(); if (!kfifo_is_full(&stats_vdev->rd_kfifo)) @@ -1426,7 +1428,13 @@ rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev, tasklet_schedule(&stats_vdev->rd_tasklet); } - rkisp_stats_clr_3a_isr(stats_vdev, unhdl_ris, unhdl_3aris); + /* + * The last time that rx perform 'back read' don't clear done flag + * in advance, otherwise the statistics will be abnormal. + */ + if (!(isp3a_ris & ISP2X_3A_RAWAE_BIG) || + stats_vdev->dev->params_vdev.rdbk_times > 1) + rkisp_stats_clr_3a_isr(stats_vdev, unhdl_ris, unhdl_3aris); #ifdef LOG_ISR_EXE_TIME if (isp_ris & iq_isr_mask) { diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 5b715520e63b..0773de9d5bd5 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -623,6 +623,11 @@ static int rkisp_config_isp(struct rkisp_device *dev) CIF_ISP_FRAME_IN; writel(irq_mask, base + CIF_ISP_IMSC); + if (dev->isp_ver == ISP_V20 && IS_HDR_RDBK(dev->hdr.op_mode)) { + irq_mask = ISP2X_3A_RAWAE_BIG; + writel(irq_mask, base + ISP_ISP3A_IMSC); + } + if (out_fmt->fmt_type == FMT_BAYER) rkisp_params_disable_isp(&dev->params_vdev); else @@ -1984,8 +1989,15 @@ void rkisp_isp_isr(unsigned int isp_mis, ISP2X_3A_RAWAF_SUM | ISP2X_3A_RAWAF_LUM | ISP2X_3A_RAWAF | ISP2X_3A_RAWAWB; + /* + * The last time that rx perform 'back read' don't clear done flag + * in advance, otherwise the statistics will be abnormal. + */ + if (isp3a_mis & ISP2X_3A_RAWAE_BIG && dev->params_vdev.rdbk_times > 0) + writel(BIT(31), base + RAWAE_BIG1_BASE + RAWAE_BIG_CTRL); + v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev, - "isp isr:0x%x\n", isp_mis); + "isp isr:0x%x, 0x%x\n", isp_mis, isp3a_mis); /* start edge of v_sync */ if (isp_mis & CIF_ISP_V_START) {