From d760ab0140b3d23791b80961814fb48f63058db1 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Fri, 6 Nov 2020 13:33:33 +0800 Subject: [PATCH] media: rockchip: isp: fix normal merge enable config RKISP_NORMAL_MERGE_EN default 1 to enable this function Change-Id: Iccb33ba372baa90306329998fd64f872063b7609 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/common.h | 2 + drivers/media/platform/rockchip/isp/csi.c | 89 ++++++++++++++++--- drivers/media/platform/rockchip/isp/dmarx.c | 26 +++--- .../platform/rockchip/isp/isp_params_v2x.c | 7 +- 4 files changed, 95 insertions(+), 29 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/common.h b/drivers/media/platform/rockchip/isp/common.h index f4c89af67f21..b6c14698716f 100644 --- a/drivers/media/platform/rockchip/isp/common.h +++ b/drivers/media/platform/rockchip/isp/common.h @@ -63,6 +63,8 @@ #define RKISP_EMDDATA_FIFO_MAX 4 #define RKISP_DMATX_CHECK 0xA5A5A5A5 +#define RKISP_NORMAL_MERGE_EN 1 + struct rkisp_device; /* ISP_V10_1 for only support MP */ diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index 42e6b9330fb8..43c9c77053ff 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -13,6 +13,54 @@ #include "dev.h" #include "regs.h" +static void __maybe_unused fixed_normal_merge_config(struct rkisp_device *dev) +{ + struct rkisp_stream *stream; + int i; + + if (dev->isp_ver != ISP_V20 && + dev->csi_dev.rd_mode != HDR_RDBK_FRAME1) + return; + + stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD2]; + if (stream->curr_buf) + rkisp_write(dev, MI_RAW0_RD_BASE, + stream->curr_buf->buff_addr[0], false); + rkisp_write(dev, MI_RAW0_RD_LENGTH, + rkisp_read(dev, MI_RAW2_RD_LENGTH, false), false); + + rkisp_write(dev, ISP_HDRMGE_BASE, SW_HDRMGE_EN | + SW_HDRMGE_MODE_FRAMEX2, false); + rkisp_write(dev, ISP_HDRMGE_GAIN0, 0xfff0040, false); + rkisp_write(dev, ISP_HDRMGE_GAIN1, 0xfff0040, false); + rkisp_write(dev, ISP_HDRMGE_GAIN2, 0x40, false); + rkisp_write(dev, ISP_HDRMGE_CONS_DIFF, 0x26e626cd, false); + for (i = ISP_HDRMGE_DIFF_Y0; i <= ISP_HDRMGE_DIFF_Y3; i += 4) + rkisp_write(dev, i, 0, false); + rkisp_write(dev, ISP_HDRMGE_DIFF_Y4, 0x10001, false); + rkisp_write(dev, ISP_HDRMGE_DIFF_Y5, 0x40004, false); + rkisp_write(dev, ISP_HDRMGE_DIFF_Y6, 0xd000d, false); + rkisp_write(dev, ISP_HDRMGE_DIFF_Y7, 0x2b002b, false); + rkisp_write(dev, ISP_HDRMGE_DIFF_Y8, 0x890089, false); + rkisp_write(dev, ISP_HDRMGE_DIFF_Y9, 0x1680168, false); + rkisp_write(dev, ISP_HDRMGE_DIFF_Y10, 0x29e029e, false); + rkisp_write(dev, ISP_HDRMGE_DIFF_Y11, 0x3790379, false); + rkisp_write(dev, ISP_HDRMGE_DIFF_Y12, 0x3d603d6, false); + rkisp_write(dev, ISP_HDRMGE_DIFF_Y13, 0x3f303f3, false); + rkisp_write(dev, ISP_HDRMGE_DIFF_Y14, 0x3fc03fc, false); + rkisp_write(dev, ISP_HDRMGE_DIFF_Y15, 0x3ff03ff, false); + rkisp_write(dev, ISP_HDRMGE_DIFF_Y16, 0x3ff03ff, false); + for (i = ISP_HDRMGE_OVER_Y0; i <= ISP_HDRMGE_OVER_Y7; i += 4) + rkisp_write(dev, i, 0, false); + rkisp_write(dev, ISP_HDRMGE_OVER_Y8, 0x4, false); + rkisp_write(dev, ISP_HDRMGE_OVER_Y9, 0x2a, false); + rkisp_write(dev, ISP_HDRMGE_OVER_Y10, 0x162, false); + rkisp_write(dev, ISP_HDRMGE_OVER_Y11, 0x376, false); + rkisp_write(dev, ISP_HDRMGE_OVER_Y12, 0x3f3, false); + for (i = ISP_HDRMGE_OVER_Y12; i <= ISP_HDRMGE_OVER_Y16; i += 4) + rkisp_write(dev, i, 0x3ff, false); +} + static void get_remote_mipi_sensor(struct rkisp_device *dev, struct v4l2_subdev **sensor_sd, u32 function) { @@ -322,7 +370,6 @@ 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: @@ -437,8 +484,7 @@ int rkisp_csi_config_patch(struct rkisp_device *dev) } } - if (dev->hdr.op_mode == HDR_RDBK_FRAME2 || - dev->hdr.op_mode == HDR_RDBK_FRAME1) + if (dev->hdr.op_mode == HDR_RDBK_FRAME2) 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; @@ -454,6 +500,15 @@ int rkisp_csi_config_patch(struct rkisp_device *dev) dev->csi_dev.rd_mode = dev->hdr.op_mode; rkisp_set_bits(dev, CTRL_SWS_CFG, 0, SW_MPIP_DROP_FRM_DIS, true); +#if RKISP_NORMAL_MERGE_EN + if (!dev->hw_dev->is_mi_update && + dev->hdr.op_mode == HDR_RDBK_FRAME1 && + dev->isp_ver == ISP_V20) + rkisp_write(dev, CSI2RX_CTRL0, + SW_IBUF_OP_MODE(HDR_RDBK_FRAME2) | + SW_HDR_ESP_MODE(dev->hdr.esp_mode), true); + fixed_normal_merge_config(dev); +#endif } dev->csi_dev.frame_cnt = -1; dev->csi_dev.frame_cnt_x1 = -1; @@ -485,13 +540,15 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) else csi->frame_cnt_x1++; csi->frame_cnt++; - /* configure hdr params in rdbk mode */ - rkisp_params_cfg(params_vdev, cur_frame_id, dma2frm + 1); val = 0; if (mode & T_START_X1) { csi->rd_mode = HDR_RDBK_FRAME1; - val = SW_HDRMGE_EN | SW_HDRMGE_MODE_FRAMEX2; +#if RKISP_NORMAL_MERGE_EN + fixed_normal_merge_config(dev); + if (dev->isp_ver == ISP_V20) + val = SW_HDRMGE_EN | SW_HDRMGE_MODE_FRAMEX2; +#endif } else if (mode & T_START_X2) { csi->rd_mode = HDR_RDBK_FRAME2; val = SW_HDRMGE_EN | SW_HDRMGE_MODE_FRAMEX2; @@ -506,6 +563,8 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) dev->skip_frame = 2; is_upd = true; } + /* configure hdr params in rdbk mode */ + rkisp_params_cfg(params_vdev, cur_frame_id, dma2frm + 1); if (!hw->is_single) { rkisp_update_regs(dev, CTRL_VI_ISP_PATH, SUPER_IMP_COLOR_CR); @@ -522,16 +581,18 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) /* wait 50 us to load lsc table, otherwise lsc lut error will occur */ udelay(50); } - v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev, - "readback frame:%d time:%d\n", - cur_frame_id, dma2frm + 1); + val = rkisp_read(dev, CSI2RX_CTRL0, true); val &= ~SW_IBUF_OP_MODE(0xf); - 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); + tmp = SW_IBUF_OP_MODE(csi->rd_mode); +#if RKISP_NORMAL_MERGE_EN + if (csi->rd_mode == HDR_RDBK_FRAME1 && dev->isp_ver == ISP_V20) + tmp = SW_IBUF_OP_MODE(HDR_RDBK_FRAME2); +#endif + val |= tmp | SW_CSI2RX_EN | SW_DMA_2FRM_MODE(dma2frm); + v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev, + "readback frame:%d time:%d 0x%x\n", + cur_frame_id, dma2frm + 1, val); 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 bb65d5b5dbd3..c0ad9a726830 100644 --- a/drivers/media/platform/rockchip/isp/dmarx.c +++ b/drivers/media/platform/rockchip/isp/dmarx.c @@ -346,7 +346,7 @@ static void update_rawrd(struct rkisp_stream *stream) } else if (dev->dmarx_dev.trigger == T_AUTO) { /* internal raw wr/rd buf rotate */ struct rkisp_dummy_buffer *buf; - u32 id, rawwr_addr; + u32 id, rawwr_addr, val; switch (stream->id) { case RKISP_STREAM_RAWRD2: @@ -368,22 +368,20 @@ static void update_rawrd(struct rkisp_stream *stream) } buf = hdr_dqbuf(&dev->hdr.q_rx[id]); if (buf) { - mi_set_y_addr(stream, buf->dma_addr); + val = buf->dma_addr; dev->hdr.rx_cur_buf[id] = buf; } else { - mi_set_y_addr(stream, - readl(base + rawwr_addr)); + val = 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); + mi_set_y_addr(stream, val); +#if RKISP_NORMAL_MERGE_EN + if (dev->isp_ver == ISP_V20 && + dev->csi_dev.rd_mode == HDR_RDBK_FRAME1) { + rkisp_write(dev, MI_RAW0_RD_BASE, val, true); + rkisp_write(dev, MI_RAW0_RD_LENGTH, + rkisp_read(dev, MI_RAW2_RD_LENGTH, true), true); + } +#endif } } diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c index 36d20677baff..72233eb1506e 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c @@ -3432,10 +3432,15 @@ 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) + if (dev->csi_dev.rd_mode != HDR_NORMAL && + dev->csi_dev.rd_mode != HDR_RDBK_FRAME1) mge_en = 1; else mge_en = 0; +#if RKISP_NORMAL_MERGE_EN + if (dev->csi_dev.rd_mode == HDR_RDBK_FRAME1) + mge_en = 1; +#endif gain_wsize = rkisp_ioread32(params_vdev, MI_GAIN_WR_SIZE); gain_wsize &= 0x0FFFFFF0;