media: rockchip: isp: enable ae big interrupt to get last ae stats in rdbk mode

Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
Change-Id: I8fe1f7e1db38b65290b6490b3ca7be9b92866b0d
This commit is contained in:
Hu Kejun
2020-04-14 15:40:28 +08:00
committed by Tao Huang
parent 7c60625d66
commit b319fe861e
2 changed files with 27 additions and 7 deletions

View File

@@ -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) {

View File

@@ -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) {