media: rockchip: isp: frame start to update buf for isp30

Change-Id: Ied04130500b7e1d33907b1be2e1baab97118dd45
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2022-10-21 11:20:04 +08:00
parent 02ffc39dd9
commit 7cbb5846dc

View File

@@ -16,6 +16,7 @@
#define CIF_ISP_REQ_BUFS_MIN 0
static int mi_frame_end(struct rkisp_stream *stream);
static int mi_frame_start(struct rkisp_stream *stream, u32 mis);
static const struct capture_fmt mp_fmts[] = {
/* yuv422 */
@@ -856,6 +857,7 @@ static struct streams_ops rkisp_mp_streams_ops = {
.is_stream_stopped = mp_is_stream_stopped,
.update_mi = update_mi,
.frame_end = mi_frame_end,
.frame_start = mi_frame_start,
};
static struct streams_ops rkisp_sp_streams_ops = {
@@ -866,6 +868,7 @@ static struct streams_ops rkisp_sp_streams_ops = {
.is_stream_stopped = sp_is_stream_stopped,
.update_mi = update_mi,
.frame_end = mi_frame_end,
.frame_start = mi_frame_start,
};
static struct streams_ops rkisp_fbc_streams_ops = {
@@ -875,6 +878,7 @@ static struct streams_ops rkisp_fbc_streams_ops = {
.is_stream_stopped = fbc_is_stream_stopped,
.update_mi = update_mi,
.frame_end = mi_frame_end,
.frame_start = mi_frame_start,
};
static struct streams_ops rkisp_bp_streams_ops = {
@@ -884,8 +888,63 @@ static struct streams_ops rkisp_bp_streams_ops = {
.is_stream_stopped = bp_is_stream_stopped,
.update_mi = update_mi,
.frame_end = mi_frame_end,
.frame_start = mi_frame_start,
};
static void stream_self_update(struct rkisp_stream *stream)
{
struct rkisp_device *dev = stream->ispdev;
u32 val, mask = ISP3X_MPSELF_UPD | ISP3X_SPSELF_UPD | ISP3X_BPSELF_UPD;
bool is_unite = dev->hw_dev->is_unite;
if (stream->id == RKISP_STREAM_FBC) {
val = ISP3X_MPFBC_FORCE_UPD;
rkisp_unite_set_bits(dev, ISP3X_MPFBC_CTRL, 0, val, false, is_unite);
return;
}
switch (stream->id) {
case RKISP_STREAM_MP:
val = ISP3X_MPSELF_UPD;
break;
case RKISP_STREAM_SP:
val = ISP3X_SPSELF_UPD;
break;
case RKISP_STREAM_BP:
val = ISP3X_BPSELF_UPD;
break;
default:
return;
}
rkisp_unite_set_bits(dev, ISP3X_MI_WR_XTD_FORMAT_CTRL, mask, val, false, is_unite);
}
static int mi_frame_start(struct rkisp_stream *stream, u32 mis)
{
struct rkisp_device *dev = stream->ispdev;
unsigned long lock_flags = 0;
/* readback start to update stream buf if null */
spin_lock_irqsave(&stream->vbq_lock, lock_flags);
if (stream->streaming && !mis && !stream->curr_buf) {
if (!stream->next_buf && !list_empty(&stream->buf_queue)) {
stream->next_buf = list_first_entry(&stream->buf_queue,
struct rkisp_buffer, queue);
list_del(&stream->next_buf->queue);
stream->ops->update_mi(stream);
}
if (dev->hw_dev->is_single && stream->next_buf) {
stream->curr_buf = stream->next_buf;
stream->next_buf = NULL;
stream_self_update(stream);
}
}
spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
return 0;
}
/*
* This function is called when a frame end come. The next frame
* is processing and we should set up buffer for next-next frame,