media: rockchip: vicap free hdr buf after change to online

Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
Change-Id: I334b6d893430ce5cf4371fabf387d3fa0846a5ef
This commit is contained in:
Zefa Chen
2025-03-18 20:23:54 +08:00
committed by 陈泽发
parent 15708c309d
commit 77e9245280
2 changed files with 39 additions and 31 deletions

View File

@@ -11737,27 +11737,6 @@ static void rkcif_store_last_buf_for_online(struct rkcif_stream *stream,
buf->dummy.dma_addr);
}
static void rkcif_release_unnecessary_buf_for_online(struct rkcif_stream *stream,
struct rkcif_rx_buffer *buf)
{
struct rkcif_device *dev = stream->cifdev;
struct sditf_priv *priv = dev->sditf[0];
struct rkcif_rx_buffer *rx_buf = NULL;
unsigned long flags;
int i = 0;
spin_lock_irqsave(&priv->cif_dev->buffree_lock, flags);
for (i = 0; i < priv->buf_num; i++) {
rx_buf = &stream->rx_buf[i];
if (rx_buf && (!rx_buf->dummy.is_free) && rx_buf != buf) {
list_add_tail(&rx_buf->list_free, &priv->buf_free_list);
stream->total_buf_num--;
}
}
spin_unlock_irqrestore(&priv->cif_dev->buffree_lock, flags);
schedule_work(&priv->buffree_work.work);
}
static void rkcif_line_wake_up_rdbk(struct rkcif_stream *stream, int mipi_id)
{
u32 mode;
@@ -11820,7 +11799,6 @@ static void rkcif_line_wake_up_rdbk(struct rkcif_stream *stream, int mipi_id)
stream->cur_stream_mode &= ~RKCIF_STREAM_MODE_TOISP_RDBK;
stream->cur_stream_mode |= RKCIF_STREAM_MODE_TOISP;
stream->cifdev->wait_line = 0;
stream->is_line_wake_up = false;
v4l2_dbg(3, rkcif_debug, &stream->cifdev->v4l2_dev,
"stream[%d] frame_idx %d, last_rx_buf_idx %d cur dma buf %x, change to online\n",
stream->id, stream->frame_idx, stream->last_rx_buf_idx,
@@ -15127,11 +15105,9 @@ void rkcif_irq_pingpong_v1(struct rkcif_device *cif_dev)
rkcif_modify_frame_skip_config(stream);
if (stream->is_change_toisp) {
stream->is_change_toisp = false;
if ((cif_dev->hdr.hdr_mode == HDR_X2 && stream->id != 1) ||
(cif_dev->hdr.hdr_mode == HDR_X3 && stream->id != 2))
rkcif_release_unnecessary_buf_for_online(stream,
stream->curr_buf_toisp);
else
if (cif_dev->hdr.hdr_mode == NO_HDR ||
(cif_dev->hdr.hdr_mode == HDR_X2 && stream->id == 1) ||
(cif_dev->hdr.hdr_mode == HDR_X3 && stream->id == 2))
sditf_change_to_online(cif_dev->sditf[0]);
rkcif_modify_line_int(stream, false);
stream->is_line_inten = false;

View File

@@ -1021,10 +1021,36 @@ static void sditf_channel_disable_rv1103b(struct sditf_priv *priv, int user)
rkcif_write_register_and(cif_dev, CIF_REG_TOISP0_CH2_CTRL, ~ctrl_val);
}
static void rkcif_release_unnecessary_buf_for_online(struct rkcif_stream *stream,
struct rkcif_rx_buffer *buf)
{
struct rkcif_device *dev = stream->cifdev;
struct sditf_priv *priv = dev->sditf[0];
struct rkcif_rx_buffer *rx_buf = NULL;
unsigned long flags;
int i = 0;
if (!buf)
buf = stream->last_buf_toisp;
spin_lock_irqsave(&priv->cif_dev->buffree_lock, flags);
for (i = 0; i < stream->rx_buf_num; i++) {
rx_buf = &stream->rx_buf[i];
if (rx_buf && (!rx_buf->dummy.is_free) && rx_buf != buf) {
list_add_tail(&rx_buf->list_free, &priv->buf_free_list);
stream->total_buf_num--;
atomic_dec(&stream->buf_cnt);
}
}
spin_unlock_irqrestore(&priv->cif_dev->buffree_lock, flags);
schedule_work(&priv->buffree_work.work);
}
void sditf_change_to_online(struct sditf_priv *priv)
{
struct rkcif_device *cif_dev = priv->cif_dev;
struct rkcif_stream *cur_stream = NULL;
int i = 0;
int stream_cnt = 0;
priv->mode = priv->mode_src;
if (priv->mode.rdbk_mode != RKISP_VICAP_ONLINE_UNITE &&
@@ -1032,18 +1058,21 @@ void sditf_change_to_online(struct sditf_priv *priv)
sditf_enable_immediately(priv);
if (cif_dev->is_thunderboot) {
if (priv->hdr_cfg.hdr_mode == NO_HDR) {
cur_stream = &cif_dev->stream[0];
cif_dev->stream[0].is_line_wake_up = false;
} else if (priv->hdr_cfg.hdr_mode == HDR_X2) {
if (priv->hdr_cfg.hdr_mode == HDR_X2) {
cur_stream = &cif_dev->stream[1];
cif_dev->stream[0].is_line_wake_up = false;
cif_dev->stream[1].is_line_wake_up = false;
stream_cnt = 1;
} else if (priv->hdr_cfg.hdr_mode == HDR_X3) {
cur_stream = &cif_dev->stream[2];
cif_dev->stream[0].is_line_wake_up = false;
cif_dev->stream[1].is_line_wake_up = false;
cif_dev->stream[2].is_line_wake_up = false;
stream_cnt = 2;
} else {
cur_stream = &cif_dev->stream[0];
cif_dev->stream[0].is_line_wake_up = false;
stream_cnt = 0;
}
if (priv->mode.rdbk_mode == RKISP_VICAP_ONLINE_UNITE)
@@ -1057,6 +1086,9 @@ void sditf_change_to_online(struct sditf_priv *priv)
if (priv->mode.rdbk_mode == RKISP_VICAP_ONLINE_UNITE)
rkcif_reinit_right_half_config(cur_stream);
for (i = 0; i < stream_cnt; i++)
rkcif_release_unnecessary_buf_for_online(&cif_dev->stream[i],
cif_dev->stream[i].curr_buf_toisp);
}
}