diff --git a/drivers/media/platform/rockchip/isp/common.c b/drivers/media/platform/rockchip/isp/common.c index 328e5a79afee..d0a6d5d23eb1 100644 --- a/drivers/media/platform/rockchip/isp/common.c +++ b/drivers/media/platform/rockchip/isp/common.c @@ -32,6 +32,11 @@ u32 rkisp_read(struct rkisp_device *dev, u32 reg, bool is_direct) return val; } +u32 rkisp_read_reg_cache(struct rkisp_device *dev, u32 reg) +{ + return *(u32 *)(dev->sw_base_addr + reg); +} + void rkisp_set_bits(struct rkisp_device *dev, u32 reg, u32 mask, u32 val, bool is_direct) { u32 tmp = rkisp_read(dev, reg, is_direct) & ~mask; diff --git a/drivers/media/platform/rockchip/isp/common.h b/drivers/media/platform/rockchip/isp/common.h index 925b879a4390..3b3ee06eef98 100644 --- a/drivers/media/platform/rockchip/isp/common.h +++ b/drivers/media/platform/rockchip/isp/common.h @@ -163,6 +163,7 @@ static inline struct vb2_queue *to_vb2_queue(struct file *file) void rkisp_write(struct rkisp_device *dev, u32 reg, u32 val, bool is_direct); u32 rkisp_read(struct rkisp_device *dev, u32 reg, bool is_direct); +u32 rkisp_read_reg_cache(struct rkisp_device *dev, u32 reg); void rkisp_set_bits(struct rkisp_device *dev, u32 reg, u32 mask, u32 val, bool is_direct); void rkisp_clear_bits(struct rkisp_device *dev, u32 reg, u32 mask, bool is_direct); void rkisp_update_regs(struct rkisp_device *dev, u32 start, u32 end); diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index 25ce980f5eec..39168bf18392 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -491,7 +491,7 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) u32 val, cur_frame_id, tmp, rd_mode; bool is_feature_on = hw->is_feature_on; u64 iq_feature = hw->iq_feature; - bool is_upd = false; + bool is_upd = false, is_3dlut_upd = false; if (dev->isp_ver == ISP_V21) dma2frm = 0; @@ -574,11 +574,19 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) if (IS_HDR_RDBK(dev->csi_dev.rd_mode)) rkisp_params_cfgsram(params_vdev); + /* read 3d lut at frame end */ + if (hw->is_single && is_upd && + rkisp_read_reg_cache(dev, ISP_3DLUT_UPDATE) & 0x1) { + rkisp_write(dev, ISP_3DLUT_UPDATE, 0, true); + is_3dlut_upd = true; + } if (is_upd) { val = rkisp_read(dev, ISP_CTRL, false); val |= CIF_ISP_CTRL_ISP_CFG_UPD; rkisp_write(dev, ISP_CTRL, val, true); } + if (is_3dlut_upd) + rkisp_write(dev, ISP_3DLUT_UPDATE, 1, true); memset(csi->filt_state, 0, sizeof(csi->filt_state)); csi->filt_state[CSI_F_VS] = dma2frm; diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 2d8e4fdb6ed4..67bb47e17fd5 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -2332,6 +2332,9 @@ void rkisp_isp_isr(unsigned int isp_mis, else dev->csi_dev.filt_state[CSI_F_VS]--; if (IS_HDR_RDBK(dev->hdr.op_mode)) { + /* read 3d lut at isp readback */ + if (!dev->hw_dev->is_single) + rkisp_write(dev, ISP_3DLUT_UPDATE, 0, true); rkisp_stats_rdbk_enable(&dev->stats_vdev, true); goto vs_skip; }