media: rockchip: isp: support multiple wrap

Change-Id: Ic0388b6ff7595799164d1872c1303da4107397f2
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2024-01-09 10:15:20 +08:00
committed by Tao Huang
parent b84a03e24e
commit dd09e02ea1
5 changed files with 28 additions and 14 deletions

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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; }

View File

@@ -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) {

View File

@@ -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) {