diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 3c1e9f71892d..c16d0f2f369c 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -5716,6 +5716,7 @@ void rkcif_free_rx_buf(struct rkcif_stream *stream, int buf_num) if (buf->dbufs.is_init) v4l2_subdev_call(sd, core, ioctl, RKISP_VICAP_CMD_RX_BUFFER_FREE, &buf->dbufs); + memset(buf, 0, sizeof(*buf)); buf->dummy.is_free = true; } @@ -5772,10 +5773,13 @@ void rkcif_free_rx_buf(struct rkcif_stream *stream, int buf_num) if (buf->dbufs.is_init) v4l2_subdev_call(sd, core, ioctl, RKISP_VICAP_CMD_RX_BUFFER_FREE, &buf->dbufs); - if (!dev->is_thunderboot) + if (!dev->is_thunderboot) { rkcif_free_buffer(dev, &buf->dummy); - else + memset(buf, 0, sizeof(*buf)); + buf->dummy.is_free = true; + } else { list_add_tail(&buf->list_free, &priv->buf_free_list); + } atomic_dec(&stream->buf_cnt); stream->total_buf_num--; } @@ -5857,6 +5861,8 @@ int rkcif_init_rx_buf(struct rkcif_stream *stream, int buf_num) else return -EINVAL; } + + INIT_LIST_HEAD(&stream->rx_buf_head); while (true) { buf = &stream->rx_buf[i]; memset(buf, 0, sizeof(*buf)); diff --git a/drivers/media/platform/rockchip/cif/subdev-itf.c b/drivers/media/platform/rockchip/cif/subdev-itf.c index 7cb8a67ea2ae..afe1e7dda4ba 100644 --- a/drivers/media/platform/rockchip/cif/subdev-itf.c +++ b/drivers/media/platform/rockchip/cif/subdev-itf.c @@ -98,6 +98,8 @@ static void sditf_buffree_work(struct work_struct *work) if (rx_buf) { list_del(&rx_buf->list_free); rkcif_free_reserved_mem_buf(priv->cif_dev, rx_buf); + memset(rx_buf, 0, sizeof(*rx_buf)); + rx_buf->dummy.is_free = true; } } spin_unlock_irqrestore(&priv->cif_dev->buffree_lock, flags); @@ -1320,7 +1322,7 @@ static int sditf_s_rx_buffer(struct v4l2_subdev *sd, is_free = true; } - if (!is_free && (!dbufs->is_switch)) { + if (!is_free && (!dbufs->is_switch) && stream->state == RKCIF_STATE_STREAMING) { list_add_tail(&rx_buf->list, &stream->rx_buf_head); rkcif_assign_check_buffer_update_toisp(stream); if (cif_dev->resume_mode != RKISP_RTT_MODE_ONE_FRAME) {