From 2b919461fe502333bd5ff3b66739e99a39dca341 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Wed, 21 Sep 2022 14:45:04 +0800 Subject: [PATCH] media: rockchip: vicap: thunderboot support multi camera if all cameras need deal by isp, only support readback mode Signed-off-by: Zefa Chen Change-Id: Id943e8150fec09e1e7d4eddc0fd92a23ce94c669 --- drivers/media/platform/rockchip/cif/capture.c | 3 ++- drivers/media/platform/rockchip/cif/dev.h | 1 + .../media/platform/rockchip/cif/subdev-itf.c | 18 ++++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) 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) {