diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 085056f4eca1..f5afd3474159 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -11737,27 +11737,6 @@ static void rkcif_store_last_buf_for_online(struct rkcif_stream *stream, buf->dummy.dma_addr); } -static void rkcif_release_unnecessary_buf_for_online(struct rkcif_stream *stream, - struct rkcif_rx_buffer *buf) -{ - struct rkcif_device *dev = stream->cifdev; - struct sditf_priv *priv = dev->sditf[0]; - struct rkcif_rx_buffer *rx_buf = NULL; - unsigned long flags; - int i = 0; - - spin_lock_irqsave(&priv->cif_dev->buffree_lock, flags); - for (i = 0; i < priv->buf_num; i++) { - rx_buf = &stream->rx_buf[i]; - if (rx_buf && (!rx_buf->dummy.is_free) && rx_buf != buf) { - list_add_tail(&rx_buf->list_free, &priv->buf_free_list); - stream->total_buf_num--; - } - } - spin_unlock_irqrestore(&priv->cif_dev->buffree_lock, flags); - schedule_work(&priv->buffree_work.work); -} - static void rkcif_line_wake_up_rdbk(struct rkcif_stream *stream, int mipi_id) { u32 mode; @@ -11820,7 +11799,6 @@ static void rkcif_line_wake_up_rdbk(struct rkcif_stream *stream, int mipi_id) stream->cur_stream_mode &= ~RKCIF_STREAM_MODE_TOISP_RDBK; stream->cur_stream_mode |= RKCIF_STREAM_MODE_TOISP; stream->cifdev->wait_line = 0; - stream->is_line_wake_up = false; v4l2_dbg(3, rkcif_debug, &stream->cifdev->v4l2_dev, "stream[%d] frame_idx %d, last_rx_buf_idx %d cur dma buf %x, change to online\n", stream->id, stream->frame_idx, stream->last_rx_buf_idx, @@ -15127,11 +15105,9 @@ void rkcif_irq_pingpong_v1(struct rkcif_device *cif_dev) rkcif_modify_frame_skip_config(stream); if (stream->is_change_toisp) { stream->is_change_toisp = false; - if ((cif_dev->hdr.hdr_mode == HDR_X2 && stream->id != 1) || - (cif_dev->hdr.hdr_mode == HDR_X3 && stream->id != 2)) - rkcif_release_unnecessary_buf_for_online(stream, - stream->curr_buf_toisp); - else + if (cif_dev->hdr.hdr_mode == NO_HDR || + (cif_dev->hdr.hdr_mode == HDR_X2 && stream->id == 1) || + (cif_dev->hdr.hdr_mode == HDR_X3 && stream->id == 2)) sditf_change_to_online(cif_dev->sditf[0]); rkcif_modify_line_int(stream, false); stream->is_line_inten = false; diff --git a/drivers/media/platform/rockchip/cif/subdev-itf.c b/drivers/media/platform/rockchip/cif/subdev-itf.c index 7e0f5b5e4725..2f3e8c902010 100644 --- a/drivers/media/platform/rockchip/cif/subdev-itf.c +++ b/drivers/media/platform/rockchip/cif/subdev-itf.c @@ -1021,10 +1021,36 @@ static void sditf_channel_disable_rv1103b(struct sditf_priv *priv, int user) rkcif_write_register_and(cif_dev, CIF_REG_TOISP0_CH2_CTRL, ~ctrl_val); } +static void rkcif_release_unnecessary_buf_for_online(struct rkcif_stream *stream, + struct rkcif_rx_buffer *buf) +{ + struct rkcif_device *dev = stream->cifdev; + struct sditf_priv *priv = dev->sditf[0]; + struct rkcif_rx_buffer *rx_buf = NULL; + unsigned long flags; + int i = 0; + + if (!buf) + buf = stream->last_buf_toisp; + spin_lock_irqsave(&priv->cif_dev->buffree_lock, flags); + for (i = 0; i < stream->rx_buf_num; i++) { + rx_buf = &stream->rx_buf[i]; + if (rx_buf && (!rx_buf->dummy.is_free) && rx_buf != buf) { + list_add_tail(&rx_buf->list_free, &priv->buf_free_list); + stream->total_buf_num--; + atomic_dec(&stream->buf_cnt); + } + } + spin_unlock_irqrestore(&priv->cif_dev->buffree_lock, flags); + schedule_work(&priv->buffree_work.work); +} + void sditf_change_to_online(struct sditf_priv *priv) { struct rkcif_device *cif_dev = priv->cif_dev; struct rkcif_stream *cur_stream = NULL; + int i = 0; + int stream_cnt = 0; priv->mode = priv->mode_src; if (priv->mode.rdbk_mode != RKISP_VICAP_ONLINE_UNITE && @@ -1032,18 +1058,21 @@ void sditf_change_to_online(struct sditf_priv *priv) sditf_enable_immediately(priv); if (cif_dev->is_thunderboot) { - if (priv->hdr_cfg.hdr_mode == NO_HDR) { - cur_stream = &cif_dev->stream[0]; - cif_dev->stream[0].is_line_wake_up = false; - } else if (priv->hdr_cfg.hdr_mode == HDR_X2) { + if (priv->hdr_cfg.hdr_mode == HDR_X2) { cur_stream = &cif_dev->stream[1]; cif_dev->stream[0].is_line_wake_up = false; cif_dev->stream[1].is_line_wake_up = false; + stream_cnt = 1; } else if (priv->hdr_cfg.hdr_mode == HDR_X3) { cur_stream = &cif_dev->stream[2]; cif_dev->stream[0].is_line_wake_up = false; cif_dev->stream[1].is_line_wake_up = false; cif_dev->stream[2].is_line_wake_up = false; + stream_cnt = 2; + } else { + cur_stream = &cif_dev->stream[0]; + cif_dev->stream[0].is_line_wake_up = false; + stream_cnt = 0; } if (priv->mode.rdbk_mode == RKISP_VICAP_ONLINE_UNITE) @@ -1057,6 +1086,9 @@ void sditf_change_to_online(struct sditf_priv *priv) if (priv->mode.rdbk_mode == RKISP_VICAP_ONLINE_UNITE) rkcif_reinit_right_half_config(cur_stream); + for (i = 0; i < stream_cnt; i++) + rkcif_release_unnecessary_buf_for_online(&cif_dev->stream[i], + cif_dev->stream[i].curr_buf_toisp); } }