media: rockchip: isp: fix isp no ready to read back for thunderboot mode

Change-Id: Ib42b6dee1f7cc2b891b00458a09b2dfabafef9f0
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2020-07-03 14:20:00 +08:00
committed by Tao Huang
parent d0f4aa1f13
commit 47c1b60431
3 changed files with 14 additions and 7 deletions

View File

@@ -415,8 +415,7 @@ int rkisp_csi_config_patch(struct rkisp_device *dev)
if (IS_HDR_RDBK(dev->hdr.op_mode))
isp_set_bits(dev->base_addr + CTRL_SWS_CFG,
0, SW_MPIP_DROP_FRM_DIS);
dev->csi_dev.is_first = true;
kfifo_reset(&dev->csi_dev.rdbk_kfifo);
dev->csi_dev.is_isp_end = true;
return ret;
}
@@ -476,13 +475,20 @@ int rkisp_csi_trigger_event(struct rkisp_csi_device *csi, void *arg)
spin_lock_irqsave(&csi->rdbk_lock, lock_flags);
if (!trigger)
csi->is_isp_end = true;
/* isp doesn't ready to read back */
if (dev->isp_state != ISP_START) {
if (trigger)
kfifo_in(fifo, trigger, sizeof(*trigger));
csi->is_isp_end = true;
goto end;
}
if (trigger &&
(csi->is_first ||
(csi->is_isp_end && kfifo_is_empty(fifo)))) {
(csi->is_isp_end && kfifo_is_empty(fifo))) {
/* isp idle and no event in queue
* start read back direct
*/
csi->is_first = false;
dev->dmarx_dev.pre_frame = dev->dmarx_dev.cur_frame;
dev->dmarx_dev.cur_frame.id = trigger->frame_id;
dev->dmarx_dev.cur_frame.timestamp = trigger->frame_timestamp;
@@ -510,6 +516,7 @@ int rkisp_csi_trigger_event(struct rkisp_csi_device *csi, void *arg)
v4l2_err(&dev->v4l2_dev,
"csi trigger fifo is full\n");
}
end:
spin_unlock_irqrestore(&csi->rdbk_lock, lock_flags);
if (times >= 0)

View File

@@ -66,7 +66,6 @@ struct sink_info {
* filt_state: multiframe read back mode to filt irq event
* tx_first: flags for dmatx first Y_STATE irq
* memory: compact or big/little endian byte order for tx/rx
* is_first: flags of first frame read back
* is_isp_end: flags of isp frame end
*/
struct rkisp_csi_device {
@@ -81,7 +80,6 @@ struct rkisp_csi_device {
u8 filt_state[CSI_F_MAX];
u8 tx_first[HDR_DMA_MAX];
u8 memory;
bool is_first;
bool is_isp_end;
};

View File

@@ -967,6 +967,8 @@ static int rkisp_isp_stop(struct rkisp_device *dev)
}
dev->isp_state = ISP_STOP;
if (dev->isp_ver == ISP_V20)
kfifo_reset(&dev->csi_dev.rdbk_kfifo);
if (dev->emd_vc <= CIF_ISP_ADD_DATA_VC_MAX) {
for (i = 0; i < RKISP_EMDDATA_FIFO_MAX; i++)
kfifo_free(&dev->emd_data_fifo[i].mipi_kfifo);