diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c index 81b4e937acb0..48941c88dad3 100644 --- a/drivers/media/platform/rockchip/isp/capture.c +++ b/drivers/media/platform/rockchip/isp/capture.c @@ -1533,8 +1533,9 @@ static int mi_frame_end(struct rkisp_stream *stream) stream->id == RKISP_STREAM_DMATX1 || stream->id == RKISP_STREAM_DMATX2)) v4l2_info(&isp_dev->v4l2_dev, - "no available stream(%d) buffer, use dummy\n", - stream->id); + "tx stream:%d lose frame:%d, isp state:0x%x frame:%d\n", + stream->id, atomic_read(&stream->sequence) - 1, + isp_dev->isp_state, isp_dev->dmarx_dev.cur_frame.id); if (stream->curr_buf && (!interlaced || @@ -1906,7 +1907,7 @@ static void rkisp_stream_stop(struct rkisp_stream *stream) stream->stopping = true; stream->ops->stop_mi(stream); - if (dev->isp_state == ISP_START && + if ((dev->isp_state & ISP_START) && dev->isp_inp != INP_DMARX_ISP) { ret = wait_event_timeout(stream->done, !stream->streaming, diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index f9b49ff7c9c6..b1154021a7cf 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -477,7 +477,7 @@ int rkisp_csi_trigger_event(struct rkisp_csi_device *csi, void *arg) csi->is_isp_end = true; /* isp doesn't ready to read back */ - if (dev->isp_state != ISP_START) { + if (!(dev->isp_state & ISP_START)) { if (trigger) kfifo_in(fifo, trigger, sizeof(*trigger)); csi->is_isp_end = true; diff --git a/drivers/media/platform/rockchip/isp/dev.h b/drivers/media/platform/rockchip/isp/dev.h index 07c188f88a9a..b39dbffc6b85 100644 --- a/drivers/media/platform/rockchip/isp/dev.h +++ b/drivers/media/platform/rockchip/isp/dev.h @@ -87,9 +87,13 @@ enum rkisp_isp_ver { }; enum rkisp_isp_state { - ISP_STOP = 0, - ISP_START, - ISP_ERROR + ISP_FRAME_END = BIT(0), + ISP_FRAME_IN = BIT(1), + ISP_FRAME_VS = BIT(2), + + ISP_STOP = BIT(8), + ISP_START = BIT(9), + ISP_ERROR = BIT(10), }; enum rkisp_isp_inp { diff --git a/drivers/media/platform/rockchip/isp/dmarx.c b/drivers/media/platform/rockchip/isp/dmarx.c index 1e3a42fa61c4..87de39b07b17 100644 --- a/drivers/media/platform/rockchip/isp/dmarx.c +++ b/drivers/media/platform/rockchip/isp/dmarx.c @@ -405,8 +405,7 @@ static void dmarx_stop(struct rkisp_stream *stream) int ret = 0; stream->stopping = true; - if (dev->isp_state == ISP_START && - !stream->frame_end) { + if ((dev->isp_state & ISP_START) && !stream->frame_end) { ret = wait_event_timeout(stream->done, !stream->streaming, msecs_to_jiffies(100)); diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 8a4863a9f377..be09ecab59ce 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -434,7 +434,15 @@ u32 rkisp_mbus_pixelcode_to_v4l2(u32 pixelcode) return pixelformat; } -/**************** register operations ****************/ +static void rkisp_set_state(struct rkisp_device *dev, u32 state) +{ + u32 mask = 0xff; + + if (state < ISP_STOP) + mask = 0xff00; + dev->isp_state &= mask; + dev->isp_state |= state; +} static void rkisp_config_clk(struct rkisp_device *dev, int on) { @@ -965,7 +973,7 @@ static int rkisp_isp_stop(struct rkisp_device *dev) #endif } } - dev->isp_state = ISP_STOP; + rkisp_set_state(dev, ISP_STOP); if (dev->isp_ver == ISP_V20) kfifo_reset(&dev->csi_dev.rdbk_kfifo); @@ -2214,6 +2222,7 @@ void rkisp_isp_isr(unsigned int isp_mis, /* start edge of v_sync */ if (isp_mis & CIF_ISP_V_START) { + rkisp_set_state(dev, ISP_FRAME_VS); dev->csi_dev.is_isp_end = false; /* filt v_sync when frame read back mode */ if (dev->csi_dev.filt_state[CSI_F_VS]) { @@ -2270,7 +2279,7 @@ vs_skip: if (dev->isp_err_cnt++ > RKISP_CONTI_ERR_MAX) { rkisp_isp_stop(dev); - dev->isp_state = ISP_ERROR; + rkisp_set_state(dev, ISP_ERROR); v4l2_err(&dev->v4l2_dev, "Too many isp error, stop isp!\n"); } @@ -2287,6 +2296,7 @@ vs_skip: /* sampled input frame is complete */ if (isp_mis & CIF_ISP_FRAME_IN) { + rkisp_set_state(dev, ISP_FRAME_IN); writel(CIF_ISP_FRAME_IN, base + CIF_ISP_ICR); isp_mis_tmp = readl(base + CIF_ISP_MIS); if (isp_mis_tmp & CIF_ISP_FRAME_IN) @@ -2299,6 +2309,7 @@ vs_skip: /* frame was completely put out */ if (isp_mis & CIF_ISP_FRAME) { /* Clear Frame In (ISP) */ + rkisp_set_state(dev, ISP_FRAME_END); writel(CIF_ISP_FRAME, base + CIF_ISP_ICR); isp_mis_tmp = readl(base + CIF_ISP_MIS); if (isp_mis_tmp & CIF_ISP_FRAME)