From d383f0568f447bc3ee68587f94b0834b6c0cdc0a Mon Sep 17 00:00:00 2001 From: Hu Kejun Date: Sat, 3 Oct 2020 16:56:24 +0800 Subject: [PATCH] media: rockchip: isp: fix lsc error when ldch is on Signed-off-by: Hu Kejun Change-Id: I51c31edbf098367b9917170b3611de4c597fd7ca --- drivers/media/platform/rockchip/isp/csi.c | 9 +-- .../media/platform/rockchip/isp/isp_params.c | 6 ++ .../media/platform/rockchip/isp/isp_params.h | 4 ++ .../platform/rockchip/isp/isp_params_v2x.c | 71 ++++++++++--------- 4 files changed, 50 insertions(+), 40 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index 3d82b2f7519b..897312cad34f 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -506,14 +506,9 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) if (!hw->is_single) { rkisp_update_regs(dev, CTRL_VI_ISP_PATH, SUPER_IMP_COLOR_CR); - rkisp_update_regs(dev, ISP_ACQ_PROP, CSI2RX_VERSION); + rkisp_update_regs(dev, ISP_ACQ_PROP, ISP_LSC_CTRL); rkisp_update_regs(dev, ISP_LSC_XGRAD_01, ISP_RAWAWB_RAM_DATA); - - val = rkisp_read(dev, ISP_LSC_CTRL, false); - if (val & ISP_LSC_EN) { - val = ISP_LSC_LUT_EN | ISP_LSC_EN; - rkisp_set_bits(dev, ISP_LSC_CTRL, val, val, true); - } + rkisp_params_cfgsram(params_vdev); is_upd = true; } if (is_upd) { diff --git a/drivers/media/platform/rockchip/isp/isp_params.c b/drivers/media/platform/rockchip/isp/isp_params.c index e9959e288326..d022000945c5 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.c +++ b/drivers/media/platform/rockchip/isp/isp_params.c @@ -297,6 +297,12 @@ void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, rdbk_times, RKISP_PARAMS_IMD); } +void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev) +{ + if (params_vdev->ops->param_cfgsram) + params_vdev->ops->param_cfgsram(params_vdev); +} + void rkisp_params_isr(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis) { diff --git a/drivers/media/platform/rockchip/isp/isp_params.h b/drivers/media/platform/rockchip/isp/isp_params.h index 2437c4c48805..67978c23cfe0 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.h +++ b/drivers/media/platform/rockchip/isp/isp_params.h @@ -24,6 +24,7 @@ struct rkisp_isp_params_ops { void (*isr_hdl)(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis); void (*param_cfg)(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id, u32 rdbk_times, enum rkisp_params_type type); + void (*param_cfgsram)(struct rkisp_isp_params_vdev *params_vdev); }; /* @@ -65,6 +66,7 @@ struct rkisp_isp_params_vdev { struct isp2x_hdrmge_cfg last_hdrmge; struct isp2x_hdrtmo_cfg cur_hdrtmo; struct isp2x_hdrmge_cfg cur_hdrmge; + struct isp2x_lsc_cfg cur_lsccfg; }; /* config params before ISP streaming */ @@ -84,4 +86,6 @@ void rkisp_params_isr(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis); void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id, u32 rdbk_times); +void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev); + #endif /* _RKISP_ISP_PARAM_H */ diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c index afaef878f55a..a3eac911ad94 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c @@ -559,7 +559,7 @@ isp_sihst_enable(struct rkisp_isp_params_vdev *params_vdev, static void __maybe_unused isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_lsc_cfg *pconfig) + const struct isp2x_lsc_cfg *pconfig, bool is_direct) { int i, j; unsigned int sram_addr; @@ -567,10 +567,10 @@ isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev, /* CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */ sram_addr = CIF_ISP_LSC_TABLE_ADDRESS_0; - rkisp_iowrite32(params_vdev, sram_addr, ISP_LSC_R_TABLE_ADDR); - rkisp_iowrite32(params_vdev, sram_addr, ISP_LSC_GR_TABLE_ADDR); - rkisp_iowrite32(params_vdev, sram_addr, ISP_LSC_GB_TABLE_ADDR); - rkisp_iowrite32(params_vdev, sram_addr, ISP_LSC_B_TABLE_ADDR); + rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_ADDR, sram_addr, is_direct); + rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_ADDR, sram_addr, is_direct); + rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_ADDR, sram_addr, is_direct); + rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_ADDR, sram_addr, is_direct); /* program data tables (table size is 9 * 17 = 153) */ for (i = 0; i < CIF_ISP_LSC_SECTORS_MAX * CIF_ISP_LSC_SECTORS_MAX; @@ -583,51 +583,43 @@ isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev, data = ISP_ISP_LSC_TABLE_DATA( pconfig->r_data_tbl[i + j], pconfig->r_data_tbl[i + j + 1]); - rkisp_iowrite32(params_vdev, data, - ISP_LSC_R_TABLE_DATA); + rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct); data = ISP_ISP_LSC_TABLE_DATA( pconfig->gr_data_tbl[i + j], pconfig->gr_data_tbl[i + j + 1]); - rkisp_iowrite32(params_vdev, data, - ISP_LSC_GR_TABLE_DATA); + rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, is_direct); data = ISP_ISP_LSC_TABLE_DATA( pconfig->gb_data_tbl[i + j], pconfig->gb_data_tbl[i + j + 1]); - rkisp_iowrite32(params_vdev, data, - ISP_LSC_GB_TABLE_DATA); + rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, is_direct); data = ISP_ISP_LSC_TABLE_DATA( pconfig->b_data_tbl[i + j], pconfig->b_data_tbl[i + j + 1]); - rkisp_iowrite32(params_vdev, data, - ISP_LSC_B_TABLE_DATA); + rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, is_direct); } data = ISP_ISP_LSC_TABLE_DATA( pconfig->r_data_tbl[i + j], 0); - rkisp_iowrite32(params_vdev, data, - ISP_LSC_R_TABLE_DATA); + rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct); data = ISP_ISP_LSC_TABLE_DATA( pconfig->gr_data_tbl[i + j], 0); - rkisp_iowrite32(params_vdev, data, - CIF_ISP_LSC_GR_TABLE_DATA); + rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, is_direct); data = ISP_ISP_LSC_TABLE_DATA( pconfig->gb_data_tbl[i + j], 0); - rkisp_iowrite32(params_vdev, data, - ISP_LSC_GB_TABLE_DATA); + rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, is_direct); data = ISP_ISP_LSC_TABLE_DATA( pconfig->b_data_tbl[i + j], 0); - rkisp_iowrite32(params_vdev, data, - ISP_LSC_B_TABLE_DATA); + rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, is_direct); } } @@ -709,15 +701,17 @@ static void isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_lsc_cfg *arg) { - int i; - u32 lsc_ctrl; + struct rkisp_hw_dev *hw = params_vdev->dev->hw_dev; unsigned int data; + u32 lsc_ctrl; + int i; /* To config must be off , store the current status firstly */ lsc_ctrl = rkisp_ioread32(params_vdev, ISP_LSC_CTRL); isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN); - isp_lsc_matrix_cfg_ddr(params_vdev, arg); + if (hw->is_single) + isp_lsc_matrix_cfg_ddr(params_vdev, arg); for (i = 0; i < 4; i++) { /* program x size tables */ @@ -755,21 +749,24 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, ISP_LSC_CTRL, ISP_LSC_EN); } + + params_vdev->cur_lsccfg = *arg; } static void isp_lsc_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { - if (en) { - isp_param_set_bits(params_vdev, - ISP_LSC_CTRL, - ISP_LSC_LUT_EN | ISP_LSC_EN); - } else { - isp_param_clear_bits(params_vdev, - ISP_LSC_CTRL, - ISP_LSC_EN); - } + struct rkisp_hw_dev *hw = params_vdev->dev->hw_dev; + u32 val = ISP_LSC_EN; + + if (hw->is_single) + val |= ISP_LSC_LUT_EN; + + if (en) + isp_param_set_bits(params_vdev, ISP_LSC_CTRL, val); + else + isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN); } static void @@ -4135,6 +4132,13 @@ void __preisp_isr_update_hdrae_para(struct rkisp_isp_params_vdev *params_vdev, { } +static +void rkisp_params_cfgsram_v2x(struct rkisp_isp_params_vdev *params_vdev) +{ + isp_lsc_matrix_cfg_sram(params_vdev, + ¶ms_vdev->cur_lsccfg, true); +} + /* Not called when the camera active, thus not isr protection. */ static void rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev) @@ -4327,6 +4331,7 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { .disable_isp = rkisp_params_disable_isp_v2x, .isr_hdl = rkisp_params_isr_v2x, .param_cfg = rkisp_params_cfg_v2x, + .param_cfgsram = rkisp_params_cfgsram_v2x, }; int rkisp_init_params_vdev_v2x(struct rkisp_isp_params_vdev *params_vdev)