mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
media: rockchip: vicap fixes buf lack source to avoid stream loss
Change-Id: I6a213bbbd8f445c4544120af5ccd004e58624151 Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
This commit is contained in:
@@ -2237,8 +2237,11 @@ static void rkcif_assign_new_buffer_init_toisp(struct rkcif_stream *stream,
|
||||
rkcif_write_register(dev, frm0_addr_y, buff_addr_y);
|
||||
}
|
||||
} else {
|
||||
if (buf_stream->lack_buf_cnt < 2)
|
||||
if (buf_stream->lack_buf_cnt < 2) {
|
||||
buf_stream->lack_buf_cnt++;
|
||||
v4l2_dbg(5, rkcif_debug, &dev->v4l2_dev, "%s %d, stream[%d] lack buf %d\n",
|
||||
__func__, __LINE__, buf_stream->id, buf_stream->lack_buf_cnt);
|
||||
}
|
||||
buf_stream->toisp_buf_state.state = RKCIF_TOISP_BUF_LOSS;
|
||||
}
|
||||
|
||||
@@ -2255,8 +2258,11 @@ static void rkcif_assign_new_buffer_init_toisp(struct rkcif_stream *stream,
|
||||
} else if (buf_stream->curr_buf_toisp) {
|
||||
buf_stream->next_buf_toisp = buf_stream->curr_buf_toisp;
|
||||
buf_stream->toisp_buf_state.state = RKCIF_TOISP_BUF_THESAME;
|
||||
if (buf_stream->lack_buf_cnt < 2)
|
||||
if (buf_stream->lack_buf_cnt < 2) {
|
||||
buf_stream->lack_buf_cnt++;
|
||||
v4l2_dbg(5, rkcif_debug, &dev->v4l2_dev, "%s %d, stream[%d] lack buf %d\n",
|
||||
__func__, __LINE__, buf_stream->id, buf_stream->lack_buf_cnt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2269,8 +2275,11 @@ static void rkcif_assign_new_buffer_init_toisp(struct rkcif_stream *stream,
|
||||
rkcif_write_register(dev, frm1_addr_y, buff_addr_y);
|
||||
}
|
||||
} else {
|
||||
if (buf_stream->lack_buf_cnt < 2)
|
||||
if (buf_stream->lack_buf_cnt < 2) {
|
||||
buf_stream->lack_buf_cnt++;
|
||||
v4l2_dbg(5, rkcif_debug, &dev->v4l2_dev, "%s %d, stream[%d] lack buf %d\n",
|
||||
__func__, __LINE__, buf_stream->id, buf_stream->lack_buf_cnt);
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&buf_stream->vbq_lock, flags);
|
||||
@@ -2342,8 +2351,9 @@ static int rkcif_assign_new_buffer_update_toisp(struct rkcif_stream *stream,
|
||||
} else {
|
||||
stream->sequence = stream->frame_idx - 1;
|
||||
}
|
||||
if (dev->rdbk_debug &&
|
||||
stream->frame_idx < 15)
|
||||
if ((dev->rdbk_debug &&
|
||||
stream->frame_idx < 15) ||
|
||||
rkcif_debug > 4)
|
||||
v4l2_info(&dev->v4l2_dev,
|
||||
"stream[%d] done seq %d, real seq %d\n",
|
||||
stream->id,
|
||||
@@ -2453,13 +2463,19 @@ static int rkcif_assign_new_buffer_update_toisp(struct rkcif_stream *stream,
|
||||
rkcif_rdbk_with_tools(stream, active_buf);
|
||||
}
|
||||
}
|
||||
if (buf_stream->lack_buf_cnt)
|
||||
if (buf_stream->lack_buf_cnt) {
|
||||
buf_stream->lack_buf_cnt--;
|
||||
v4l2_dbg(5, rkcif_debug, &dev->v4l2_dev, "%s %d, stream[%d] lack buf %d\n",
|
||||
__func__, __LINE__, buf_stream->id, buf_stream->lack_buf_cnt);
|
||||
}
|
||||
} else {
|
||||
if (priv->mode.rdbk_mode < RKISP_VICAP_RDBK_AIQ)
|
||||
goto out_get_buf;
|
||||
if (buf_stream->lack_buf_cnt < 2)
|
||||
if (buf_stream->lack_buf_cnt < 2) {
|
||||
buf_stream->lack_buf_cnt++;
|
||||
v4l2_dbg(5, rkcif_debug, &dev->v4l2_dev, "%s %d, stream[%d] lack buf %d\n",
|
||||
__func__, __LINE__, buf_stream->id, buf_stream->lack_buf_cnt);
|
||||
}
|
||||
if (dev->hw_dev->dummy_buf.vaddr) {
|
||||
if (stream->frame_phase == CIF_CSI_FRAME0_READY) {
|
||||
active_buf = buf_stream->curr_buf_toisp;
|
||||
@@ -2532,8 +2548,9 @@ out_get_buf:
|
||||
} else {
|
||||
rkcif_write_register(dev, frm_addr_y, buff_addr_y);
|
||||
}
|
||||
if (dev->rdbk_debug > 1 &&
|
||||
stream->frame_idx < 15)
|
||||
if ((dev->rdbk_debug > 1 &&
|
||||
stream->frame_idx < 15) ||
|
||||
rkcif_debug > 4)
|
||||
v4l2_info(&dev->v4l2_dev,
|
||||
"stream[%d] update, seq %d, reg %x, buf %x\n",
|
||||
stream->id,
|
||||
@@ -2615,8 +2632,9 @@ void rkcif_assign_check_buffer_update_toisp(struct rkcif_stream *stream)
|
||||
buf_stream->toisp_buf_state.check_cnt == 0)
|
||||
is_dual_update = true;
|
||||
|
||||
if (dev->rdbk_debug > 2 &&
|
||||
stream->frame_idx < 15)
|
||||
if ((dev->rdbk_debug > 2 &&
|
||||
stream->frame_idx < 15) ||
|
||||
rkcif_debug > 4)
|
||||
v4l2_info(&dev->v4l2_dev,
|
||||
"stream[%d] check update, lack_buf %d\n",
|
||||
stream->id, buf_stream->lack_buf_cnt);
|
||||
@@ -2647,8 +2665,9 @@ void rkcif_assign_check_buffer_update_toisp(struct rkcif_stream *stream)
|
||||
} else {
|
||||
rkcif_write_register(dev, frm_addr_y, buff_addr_y);
|
||||
}
|
||||
if (dev->rdbk_debug > 1 &&
|
||||
stream->frame_idx < 15)
|
||||
if ((dev->rdbk_debug > 1 &&
|
||||
stream->frame_idx < 15) ||
|
||||
rkcif_debug > 4)
|
||||
v4l2_info(&dev->v4l2_dev,
|
||||
"stream[%d] check update, seq %d, addr 0x%x, buf 0x%x\n",
|
||||
stream->id,
|
||||
@@ -2670,8 +2689,9 @@ void rkcif_assign_check_buffer_update_toisp(struct rkcif_stream *stream)
|
||||
} else {
|
||||
rkcif_write_register(dev, frm_addr_y, buff_addr_y);
|
||||
}
|
||||
if (dev->rdbk_debug > 1 &&
|
||||
stream->frame_idx < 15)
|
||||
if ((dev->rdbk_debug > 1 &&
|
||||
stream->frame_idx < 15) ||
|
||||
rkcif_debug > 4)
|
||||
v4l2_info(&dev->v4l2_dev,
|
||||
"stream[%d] check update, seq %d, addr 0x%x, buf 0x%x\n",
|
||||
stream->id,
|
||||
@@ -2685,8 +2705,9 @@ void rkcif_assign_check_buffer_update_toisp(struct rkcif_stream *stream)
|
||||
if (is_dual_update) {
|
||||
frame_phase_next = frame_phase & CIF_CSI_FRAME0_READY ?
|
||||
CIF_CSI_FRAME1_READY : CIF_CSI_FRAME0_READY;
|
||||
if (dev->rdbk_debug > 1 &&
|
||||
stream->frame_idx < 15)
|
||||
if ((dev->rdbk_debug > 1 &&
|
||||
stream->frame_idx < 15) ||
|
||||
rkcif_debug > 4)
|
||||
v4l2_info(&dev->v4l2_dev,
|
||||
"stream[%d] dual update, seq %d, phase %d\n",
|
||||
stream->id,
|
||||
@@ -10144,6 +10165,7 @@ static long rkcif_ioctl_default(struct file *file, void *fh,
|
||||
if (dev->sditf[0]->mode.rdbk_mode < RKISP_VICAP_RDBK_AIQ) {
|
||||
for (i = 0; i < stream_num; i++) {
|
||||
cur_stream = &dev->stream[i];
|
||||
cur_stream->to_stop_dma = 0;
|
||||
if (dev->hdr.hdr_mode == NO_HDR ||
|
||||
(dev->hdr.hdr_mode == HDR_X2 && cur_stream->id == 1) ||
|
||||
(dev->hdr.hdr_mode == HDR_X3 && cur_stream->id == 2)) {
|
||||
@@ -10156,6 +10178,7 @@ static long rkcif_ioctl_default(struct file *file, void *fh,
|
||||
} else {
|
||||
for (i = 0; i < stream_num; i++) {
|
||||
cur_stream = &dev->stream[i];
|
||||
cur_stream->to_stop_dma = 0;
|
||||
if (dev->sditf[0]->mode.rdbk_mode != RKISP_VICAP_RDBK_AIQ)
|
||||
cur_stream->to_en_dma = RKCIF_DMAEN_BY_ISP;
|
||||
else
|
||||
@@ -14381,6 +14404,7 @@ static int rkcif_terminal_sensor_set_stream(struct rkcif_device *cif_dev, int on
|
||||
__func__, on ? "on" : "off", p->subdevs[i]->name);
|
||||
}
|
||||
}
|
||||
atomic_set(&cif_dev->sensor_off, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -15053,6 +15077,7 @@ void rkcif_irq_pingpong_v1(struct rkcif_device *cif_dev)
|
||||
int on = 0;
|
||||
int tmp_csi_host_idx = 0;
|
||||
struct rkcif_stream *last_stream = NULL;
|
||||
struct rkcif_stream *buf_stream = NULL;
|
||||
|
||||
if (!cif_dev->active_sensor)
|
||||
return;
|
||||
@@ -15167,9 +15192,15 @@ void rkcif_irq_pingpong_v1(struct rkcif_device *cif_dev)
|
||||
rkcif_switch_change(cif_dev, !!cif_dev->switch_info.gpio_val);
|
||||
}
|
||||
}
|
||||
if (cif_dev->switch_info.is_init_buf)
|
||||
buf_stream = &cif_dev->stream[stream->id];
|
||||
else
|
||||
buf_stream = &cif_dev->switch_info.switch_dev->stream[stream->id];
|
||||
} else {
|
||||
stream = &cif_dev->stream[mipi_id];
|
||||
buf_stream = stream;
|
||||
}
|
||||
|
||||
if (!cif_dev->sditf[0] ||
|
||||
cif_dev->sditf[0]->mode.rdbk_mode >= RKISP_VICAP_RDBK_AIQ)
|
||||
stream->buf_wake_up_cnt++;
|
||||
@@ -15324,7 +15355,7 @@ void rkcif_irq_pingpong_v1(struct rkcif_device *cif_dev)
|
||||
if (cif_dev->switch_info.is_use_switch)
|
||||
atomic_inc(&cif_dev->hw_dev->switch_stream_cnt[cif_dev->switch_info.host_idx]);
|
||||
}
|
||||
} else if (stream->lack_buf_cnt == 2 && !stream->cur_skip_frame) {
|
||||
} else if (buf_stream->lack_buf_cnt == 2 && !stream->cur_skip_frame) {
|
||||
spin_unlock_irqrestore(&stream->cifdev->stream_spinlock, flags);
|
||||
if (stream->dma_en & RKCIF_DMAEN_BY_ISP)
|
||||
stream->to_stop_dma = RKCIF_DMAEN_BY_ISP;
|
||||
|
||||
Reference in New Issue
Block a user