From 47c1b60431324eb056fe8aac75a97abbf26dc5d2 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Fri, 3 Jul 2020 14:20:00 +0800 Subject: [PATCH] media: rockchip: isp: fix isp no ready to read back for thunderboot mode Change-Id: Ib42b6dee1f7cc2b891b00458a09b2dfabafef9f0 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/csi.c | 17 ++++++++++++----- drivers/media/platform/rockchip/isp/csi.h | 2 -- drivers/media/platform/rockchip/isp/rkisp.c | 2 ++ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index c6d95b1e243f..f9b49ff7c9c6 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -415,8 +415,7 @@ int rkisp_csi_config_patch(struct rkisp_device *dev) if (IS_HDR_RDBK(dev->hdr.op_mode)) isp_set_bits(dev->base_addr + CTRL_SWS_CFG, 0, SW_MPIP_DROP_FRM_DIS); - dev->csi_dev.is_first = true; - kfifo_reset(&dev->csi_dev.rdbk_kfifo); + dev->csi_dev.is_isp_end = true; return ret; } @@ -476,13 +475,20 @@ int rkisp_csi_trigger_event(struct rkisp_csi_device *csi, void *arg) spin_lock_irqsave(&csi->rdbk_lock, lock_flags); if (!trigger) csi->is_isp_end = true; + + /* isp doesn't ready to read back */ + if (dev->isp_state != ISP_START) { + if (trigger) + kfifo_in(fifo, trigger, sizeof(*trigger)); + csi->is_isp_end = true; + goto end; + } + if (trigger && - (csi->is_first || - (csi->is_isp_end && kfifo_is_empty(fifo)))) { + (csi->is_isp_end && kfifo_is_empty(fifo))) { /* isp idle and no event in queue * start read back direct */ - csi->is_first = false; dev->dmarx_dev.pre_frame = dev->dmarx_dev.cur_frame; dev->dmarx_dev.cur_frame.id = trigger->frame_id; dev->dmarx_dev.cur_frame.timestamp = trigger->frame_timestamp; @@ -510,6 +516,7 @@ int rkisp_csi_trigger_event(struct rkisp_csi_device *csi, void *arg) v4l2_err(&dev->v4l2_dev, "csi trigger fifo is full\n"); } +end: spin_unlock_irqrestore(&csi->rdbk_lock, lock_flags); if (times >= 0) diff --git a/drivers/media/platform/rockchip/isp/csi.h b/drivers/media/platform/rockchip/isp/csi.h index 5e66d8f38b2d..e2497ac99f3e 100644 --- a/drivers/media/platform/rockchip/isp/csi.h +++ b/drivers/media/platform/rockchip/isp/csi.h @@ -66,7 +66,6 @@ struct sink_info { * filt_state: multiframe read back mode to filt irq event * tx_first: flags for dmatx first Y_STATE irq * memory: compact or big/little endian byte order for tx/rx - * is_first: flags of first frame read back * is_isp_end: flags of isp frame end */ struct rkisp_csi_device { @@ -81,7 +80,6 @@ struct rkisp_csi_device { u8 filt_state[CSI_F_MAX]; u8 tx_first[HDR_DMA_MAX]; u8 memory; - bool is_first; bool is_isp_end; }; diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 9267a661612f..5464dec8746b 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -967,6 +967,8 @@ static int rkisp_isp_stop(struct rkisp_device *dev) } dev->isp_state = ISP_STOP; + if (dev->isp_ver == ISP_V20) + kfifo_reset(&dev->csi_dev.rdbk_kfifo); if (dev->emd_vc <= CIF_ISP_ADD_DATA_VC_MAX) { for (i = 0; i < RKISP_EMDDATA_FIFO_MAX; i++) kfifo_free(&dev->emd_data_fifo[i].mipi_kfifo);