diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index 0fbed1c3d5a6..42e6b9330fb8 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -133,10 +133,6 @@ static int rkisp_csi_s_stream(struct v4l2_subdev *sd, int on) struct rkisp_device *dev = csi->ispdev; memset(csi->tx_first, 0, sizeof(csi->tx_first)); - csi->frame_cnt = -1; - csi->frame_cnt_x1 = -1; - csi->frame_cnt_x2 = -1; - csi->frame_cnt_x3 = -1; if (!IS_HDR_RDBK(dev->hdr.op_mode)) return 0; @@ -326,6 +322,7 @@ static int csi_config(struct rkisp_csi_device *csi) /* hdr merge */ switch (dev->hdr.op_mode) { + case HDR_RDBK_FRAME1: case HDR_RDBK_FRAME2: case HDR_FRAMEX2_DDR: case HDR_LINEX2_DDR: @@ -343,7 +340,6 @@ static int csi_config(struct rkisp_csi_device *csi) val = 0; } rkisp_write(dev, ISP_HDRMGE_BASE, val, false); - rkisp_write(dev, ISP_HDRTMO_BASE, val, false); v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "CSI2RX_IDS 0x%08x 0x%08x\n", @@ -441,7 +437,8 @@ int rkisp_csi_config_patch(struct rkisp_device *dev) } } - if (dev->hdr.op_mode == HDR_RDBK_FRAME2) + if (dev->hdr.op_mode == HDR_RDBK_FRAME2 || + dev->hdr.op_mode == HDR_RDBK_FRAME1) val = SW_HDRMGE_EN | SW_HDRMGE_MODE_FRAMEX2; else if (dev->hdr.op_mode == HDR_RDBK_FRAME3) val = SW_HDRMGE_EN | SW_HDRMGE_MODE_FRAMEX3; @@ -450,7 +447,6 @@ int rkisp_csi_config_patch(struct rkisp_device *dev) rkisp_write(dev, CSI2RX_CTRL0, SW_IBUF_OP_MODE(dev->hdr.op_mode), true); rkisp_write(dev, ISP_HDRMGE_BASE, val, false); - rkisp_write(dev, ISP_HDRTMO_BASE, val & SW_HDRMGE_EN, false); rkisp_write(dev, CSI2RX_MASK_STAT, 0x7FFFFF7F, true); } @@ -459,6 +455,10 @@ int rkisp_csi_config_patch(struct rkisp_device *dev) rkisp_set_bits(dev, CTRL_SWS_CFG, 0, SW_MPIP_DROP_FRM_DIS, true); } + dev->csi_dev.frame_cnt = -1; + dev->csi_dev.frame_cnt_x1 = -1; + dev->csi_dev.frame_cnt_x2 = -1; + dev->csi_dev.frame_cnt_x3 = -1; return ret; } @@ -491,6 +491,7 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) val = 0; if (mode & T_START_X1) { csi->rd_mode = HDR_RDBK_FRAME1; + val = SW_HDRMGE_EN | SW_HDRMGE_MODE_FRAMEX2; } else if (mode & T_START_X2) { csi->rd_mode = HDR_RDBK_FRAME2; val = SW_HDRMGE_EN | SW_HDRMGE_MODE_FRAMEX2; @@ -526,8 +527,11 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) cur_frame_id, dma2frm + 1); val = rkisp_read(dev, CSI2RX_CTRL0, true); val &= ~SW_IBUF_OP_MODE(0xf); - val |= SW_CSI2RX_EN | SW_DMA_2FRM_MODE(dma2frm) | - SW_IBUF_OP_MODE(csi->rd_mode); + if (csi->rd_mode == HDR_RDBK_FRAME1) + val |= SW_IBUF_OP_MODE(HDR_RDBK_FRAME2); + else + val |= SW_IBUF_OP_MODE(csi->rd_mode); + val |= SW_CSI2RX_EN | SW_DMA_2FRM_MODE(dma2frm); rkisp_write(dev, CSI2RX_CTRL0, val, true); } diff --git a/drivers/media/platform/rockchip/isp/dmarx.c b/drivers/media/platform/rockchip/isp/dmarx.c index edf700fb2cbf..bb65d5b5dbd3 100644 --- a/drivers/media/platform/rockchip/isp/dmarx.c +++ b/drivers/media/platform/rockchip/isp/dmarx.c @@ -375,6 +375,16 @@ static void update_rawrd(struct rkisp_stream *stream) readl(base + rawwr_addr)); } } + if (dev->isp_ver == ISP_V20 && + dev->csi_dev.rd_mode == HDR_RDBK_FRAME1 && + stream->id == RKISP_STREAM_RAWRD2) { + rkisp_write(dev, MI_RAW0_RD_BASE, + rkisp_read(dev, MI_RAW2_RD_BASE, false), + false); + rkisp_write(dev, MI_RAW0_RD_LENGTH, + rkisp_read(dev, MI_RAW2_RD_LENGTH, false), + false); + } } static struct streams_ops rkisp2_dmarx_streams_ops = { diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c index 017111b68bef..4df76f06358f 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c @@ -3432,8 +3432,7 @@ isp_gain_config(struct rkisp_isp_params_vdev *params_vdev, u32 value, i, gain_wsize; u8 mge_en; - if (dev->csi_dev.rd_mode != HDR_NORMAL && - dev->csi_dev.rd_mode != HDR_RDBK_FRAME1) + if (dev->csi_dev.rd_mode != HDR_NORMAL) mge_en = 1; else mge_en = 0;