diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 1b41157eebc4..86d3596ade2b 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -7647,7 +7647,8 @@ static void rkcif_line_wake_up_rdbk(struct rkcif_stream *stream, int mipi_id) if (stream->cur_stream_mode & RKCIF_STREAM_MODE_TOISP_RDBK) { spin_lock_irqsave(&stream->vbq_lock, flags); if (stream->cifdev->is_thunderboot && - (stream->frame_idx - 1) == stream->last_rx_buf_idx) { + (stream->frame_idx - 1) == stream->last_rx_buf_idx && + stream->cifdev->is_rdbk_to_online) { stream->cur_stream_mode &= ~RKCIF_STREAM_MODE_TOISP_RDBK; stream->cur_stream_mode |= RKCIF_STREAM_MODE_TOISP; stream->cifdev->wait_line = 0; diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h index 58fbc4682795..d744df74a41e 100644 --- a/drivers/media/platform/rockchip/cif/dev.h +++ b/drivers/media/platform/rockchip/cif/dev.h @@ -828,6 +828,7 @@ struct rkcif_device { bool is_use_dummybuf; bool is_notifier_isp; bool is_thunderboot; + bool is_rdbk_to_online; int rdbk_debug; int sync_type; int sditf_cnt; diff --git a/drivers/media/platform/rockchip/cif/subdev-itf.c b/drivers/media/platform/rockchip/cif/subdev-itf.c index 847da7af7875..5c838395570a 100644 --- a/drivers/media/platform/rockchip/cif/subdev-itf.c +++ b/drivers/media/platform/rockchip/cif/subdev-itf.c @@ -539,12 +539,30 @@ void sditf_change_to_online(struct sditf_priv *priv) rkcif_free_rx_buf(&cif_dev->stream[2], priv->buf_num); } +static void sditf_check_capture_mode(struct rkcif_device *cif_dev) +{ + struct rkcif_device *dev = NULL; + int i = 0; + int toisp_cnt = 0; + + for (i = 0; i < cif_dev->hw_dev->dev_num; i++) { + dev = cif_dev->hw_dev->cif_dev[i]; + if (dev && dev->sditf_cnt) + toisp_cnt++; + } + if (cif_dev->is_thunderboot && toisp_cnt == 1) + cif_dev->is_rdbk_to_online = true; + else + cif_dev->is_rdbk_to_online = false; +} + static int sditf_start_stream(struct sditf_priv *priv) { struct rkcif_device *cif_dev = priv->cif_dev; struct v4l2_subdev_format fmt; unsigned int mode = RKCIF_STREAM_MODE_TOISP; + sditf_check_capture_mode(cif_dev); sditf_get_set_fmt(&priv->sd, NULL, &fmt); if (priv->mode.rdbk_mode == RKISP_VICAP_ONLINE) { if (priv->toisp_inf.link_mode == TOISP0) {