mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user