From dd09e02ea1e645a8ff4a8e78a933844f71a8ce95 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Tue, 9 Jan 2024 10:15:20 +0800 Subject: [PATCH] media: rockchip: isp: support multiple wrap Change-Id: Ic0388b6ff7595799164d1872c1303da4107397f2 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/capture.c | 8 ++----- .../media/platform/rockchip/isp/capture_v32.c | 5 ----- .../media/platform/rockchip/isp/capture_v3x.h | 4 ++-- .../media/platform/rockchip/isp/isp_rockit.c | 21 ++++++++++++++++++- drivers/media/platform/rockchip/isp/rkisp.c | 4 ++++ 5 files changed, 28 insertions(+), 14 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c index 99c26528fdfb..bad561885b92 100644 --- a/drivers/media/platform/rockchip/isp/capture.c +++ b/drivers/media/platform/rockchip/isp/capture.c @@ -1155,12 +1155,8 @@ static int rkisp_set_wrap_line(struct rkisp_stream *stream, struct rkisp_wrap_in { struct rkisp_device *dev = stream->ispdev; - if (dev->isp_ver != ISP_V32 || - dev->hw_dev->dev_link_num > 1 || - !stream->ops->set_wrap || - dev->hw_dev->unite) { - v4l2_err(&dev->v4l2_dev, - "wrap only support for single sensor and mainpath\n"); + if (!stream->ops->set_wrap) { + v4l2_err(&dev->v4l2_dev, "no support wrap\n"); return -EINVAL; } dev->cap_dev.wrap_width = arg->width; diff --git a/drivers/media/platform/rockchip/isp/capture_v32.c b/drivers/media/platform/rockchip/isp/capture_v32.c index 760414ab20fb..51e4b750ef7a 100644 --- a/drivers/media/platform/rockchip/isp/capture_v32.c +++ b/drivers/media/platform/rockchip/isp/capture_v32.c @@ -1364,11 +1364,6 @@ static int mi_frame_start(struct rkisp_stream *stream, u32 mis) unsigned long lock_flags = 0; u32 val; - if (stream->streaming && dev->isp_ver == ISP_V32) { - rkisp_rockit_buf_done(stream, ROCKIT_DVBM_START); - rkisp_rockit_ctrl_fps(stream); - } - /* readback start to update stream buf if null */ spin_lock_irqsave(&stream->vbq_lock, lock_flags); if (stream->streaming) { diff --git a/drivers/media/platform/rockchip/isp/capture_v3x.h b/drivers/media/platform/rockchip/isp/capture_v3x.h index 746290312de2..3071b11cc43a 100644 --- a/drivers/media/platform/rockchip/isp/capture_v3x.h +++ b/drivers/media/platform/rockchip/isp/capture_v3x.h @@ -30,7 +30,7 @@ void rkisp_rockit_buf_state_clear(struct rkisp_stream *stream); int rkisp_rockit_buf_free(struct rkisp_stream *stream); void rkisp_rockit_dev_init(struct rkisp_device *dev); void rkisp_rockit_dev_deinit(void); -bool rkisp_rockit_ctrl_fps(struct rkisp_stream *stream); +void rkisp_rockit_frame_start(struct rkisp_device *dev); int rkisp_rockit_fps_set(int *dst_fps, struct rkisp_stream *stream); int rkisp_rockit_fps_get(int *dst_fps, struct rkisp_stream *stream); int rkisp_rockit_buf_done(struct rkisp_stream *stream, int cmd); @@ -44,7 +44,7 @@ static inline void rkisp_rockit_buf_state_clear(struct rkisp_stream *stream) { r static inline int rkisp_rockit_buf_free(struct rkisp_stream *stream) { return -EINVAL; } static inline void rkisp_rockit_dev_init(struct rkisp_device *dev) { return; } static inline void rkisp_rockit_dev_deinit(void) {} -static inline bool rkisp_rockit_ctrl_fps(struct rkisp_stream *stream) { return false; } +static inline void rkisp_rockit_frame_start(struct rkisp_device *dev) {} static inline int rkisp_rockit_fps_set(int *dst_fps, struct rkisp_stream *stream) { return -EINVAL; } static inline int rkisp_rockit_fps_get(int *dst_fps, struct rkisp_stream *stream) { return -EINVAL; } static inline int rkisp_rockit_buf_done(struct rkisp_stream *stream, int cmd) { return -EINVAL; } diff --git a/drivers/media/platform/rockchip/isp/isp_rockit.c b/drivers/media/platform/rockchip/isp/isp_rockit.c index 67e7c615b0b2..6ff581044af9 100644 --- a/drivers/media/platform/rockchip/isp/isp_rockit.c +++ b/drivers/media/platform/rockchip/isp/isp_rockit.c @@ -598,7 +598,7 @@ int rkisp_rockit_fps_get(int *dst_fps, struct rkisp_stream *stream) return 0; } -bool rkisp_rockit_ctrl_fps(struct rkisp_stream *stream) +static bool rkisp_rockit_ctrl_fps(struct rkisp_stream *stream) { struct rkisp_device *dev = stream->ispdev; struct rkisp_sensor_info *sensor = NULL; @@ -676,6 +676,25 @@ bool rkisp_rockit_ctrl_fps(struct rkisp_stream *stream) return true; } +void rkisp_rockit_frame_start(struct rkisp_device *dev) +{ + struct rkisp_stream *stream; + int i; + + if (rockit_cfg == NULL) + return; + + for (i = 0; i < RKISP_MAX_STREAM; i++) { + if (i == RKISP_STREAM_VIR || i == RKISP_STREAM_LUMA) + continue; + stream = &dev->cap_dev.stream[i]; + if (!stream->streaming) + continue; + rkisp_rockit_buf_done(stream, ROCKIT_DVBM_START); + rkisp_rockit_ctrl_fps(stream); + } +} + void *rkisp_rockit_function_register(void *function, int cmd) { if (rockit_cfg == NULL) { diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 73b170b2dfc6..b90a411b4622 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -724,6 +724,8 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo params_vdev->rdbk_times = dma2frm + 1; run_next: + if (!dev->sw_rd_cnt) + rkisp_rockit_frame_start(dev); rkisp_params_cfgsram(params_vdev, true); stats_vdev->rdbk_drop = false; if (dev->is_frame_double) { @@ -4191,6 +4193,7 @@ void rkisp_isp_isr(unsigned int isp_mis, dev->isp_sdev.frm_timestamp = rkisp_time_get_ns(dev); rkisp_isp_queue_event_sof(&dev->isp_sdev); rkisp_stream_frame_start(dev, isp_mis); + rkisp_rockit_frame_start(dev); } vs_skip: writel(CIF_ISP_V_START, base + CIF_ISP_ICR); @@ -4345,6 +4348,7 @@ vs_skip: dev->isp_sdev.frm_timestamp = rkisp_time_get_ns(dev); rkisp_isp_queue_event_sof(&dev->isp_sdev); rkisp_stream_frame_start(dev, isp_mis); + rkisp_rockit_frame_start(dev); } if (isp_mis & ISP3X_OUT_FRM_QUARTER) {