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