diff --git a/drivers/media/platform/rockchip/isp/isp_dvbm.c b/drivers/media/platform/rockchip/isp/isp_dvbm.c index fe597add1f64..047c170e5347 100644 --- a/drivers/media/platform/rockchip/isp/isp_dvbm.c +++ b/drivers/media/platform/rockchip/isp/isp_dvbm.c @@ -82,6 +82,15 @@ int rkisp_dvbm_event(struct rkisp_device *dev, u32 event) case CIF_ISP_V_START: cmd = DVBM_ISP_FRM_START; break; + case ISP3X_OUT_FRM_QUARTER: + cmd = DVBM_ISP_FRM_QUARTER; + break; + case ISP3X_OUT_FRM_HALF: + cmd = DVBM_ISP_FRM_QUARTER; + break; + case ISP3X_OUT_FRM_END: + cmd = DVBM_ISP_FRM_QUARTER; + break; case CIF_MI_MP_FRAME: cmd = DVBM_ISP_FRM_END; break; diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index d26a468f8df2..030e7aadb3b3 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -1529,6 +1529,15 @@ static int rkisp_config_isp(struct rkisp_device *dev) /* interrupt mask */ irq_mask |= CIF_ISP_FRAME | CIF_ISP_V_START | CIF_ISP_PIC_SIZE_ERROR | CIF_ISP_FRAME_IN; + if (dev->cap_dev.wrap_line) { + irq_mask |= ISP3X_OUT_FRM_QUARTER | ISP3X_OUT_FRM_HALF | + ISP3X_OUT_FRM_END; + /* line to irq */ + rkisp_write(dev, ISP32_ISP_IRQ_CFG0, + (in_crop->height / 2) << 16 | in_crop->height / 4, false); + rkisp_write(dev, ISP32_ISP_IRQ_CFG1, + in_crop->height / 4 * 3, false); + } if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21 || dev->isp_ver == ISP_V30 || dev->isp_ver == ISP_V32) irq_mask |= ISP2X_LSC_LUT_ERR; @@ -3734,6 +3743,19 @@ vs_skip: rkisp_stream_frame_start(dev, isp_mis); } + if (isp_mis & ISP3X_OUT_FRM_QUARTER) { + writel(ISP3X_OUT_FRM_QUARTER, base + CIF_ISP_ICR); + rkisp_dvbm_event(dev, ISP3X_OUT_FRM_QUARTER); + } + if (isp_mis & ISP3X_OUT_FRM_HALF) { + writel(ISP3X_OUT_FRM_HALF, base + CIF_ISP_ICR); + rkisp_dvbm_event(dev, ISP3X_OUT_FRM_HALF); + } + if (isp_mis & ISP3X_OUT_FRM_END) { + writel(ISP3X_OUT_FRM_END, base + CIF_ISP_ICR); + rkisp_dvbm_event(dev, ISP3X_OUT_FRM_END); + } + if (isp_mis & CIF_ISP_FRAME_IN) rkisp_check_idle(dev, ISP_FRAME_IN); if (isp_mis & CIF_ISP_FRAME)