From d07683b39573bed2389c3d7e6e277504a362ea24 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Wed, 8 Jun 2022 14:29:27 +0800 Subject: [PATCH] media: rockchip: isp: fix hold at lsc ram data config isp_raw_clk auto-gate and lsc ram config need lsc enable Change-Id: Id257c40bea4fea0bf89b799bbcb127a4827d5394 Signed-off-by: Cai YiWei --- .../platform/rockchip/isp/isp_params_v32.c | 23 ++++++++------- .../platform/rockchip/isp/isp_params_v3x.c | 29 +++++++++---------- .../media/platform/rockchip/isp/regs_v3x.h | 2 ++ 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/isp_params_v32.c b/drivers/media/platform/rockchip/isp/isp_params_v32.c index b697b8d8d0bd..df755cccd77c 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v32.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v32.c @@ -540,16 +540,10 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, u32 data, lsc_ctrl; int i; - /* To config must be off , store the current status firstly */ lsc_ctrl = isp3_param_read(params_vdev, ISP3X_LSC_CTRL); - isp3_param_clear_bits(params_vdev, ISP3X_LSC_CTRL, ISP_LSC_EN | BIT(2)); params_rec->others.lsc_cfg = *arg; - if (dev->hw_dev->is_single) { - if (lsc_ctrl & ISP_LSC_EN) - tasklet_schedule(&priv_val->lsc_tasklet); - else - isp_lsc_matrix_cfg_sram(params_vdev, arg, false); - } + if (dev->hw_dev->is_single && (lsc_ctrl & ISP_LSC_EN)) + tasklet_schedule(&priv_val->lsc_tasklet); for (i = 0; i < ISP32_LSC_SIZE_TBL_SIZE / 4; i++) { /* program x size tables */ @@ -578,17 +572,24 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, } if (arg->sector_16x16) - lsc_ctrl |= BIT(2); - isp3_param_set_bits(params_vdev, ISP3X_LSC_CTRL, lsc_ctrl); + lsc_ctrl |= ISP3X_LSC_SECTOR_16X16; + else + lsc_ctrl &= ~ISP3X_LSC_SECTOR_16X16; + isp3_param_write(params_vdev, lsc_ctrl, ISP3X_LSC_CTRL); } static void isp_lsc_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { - u32 val = ISP_LSC_EN; + struct isp32_isp_params_cfg *params_rec = params_vdev->isp32_params; + u32 val; if (en) { + val = ISP_LSC_EN | ISP32_SELF_FORCE_UPD; isp3_param_set_bits(params_vdev, ISP3X_LSC_CTRL, val); + if (params_vdev->dev->hw_dev->is_single) + isp_lsc_matrix_cfg_sram(params_vdev, + ¶ms_rec->others.lsc_cfg, false); } else { isp3_param_clear_bits(params_vdev, ISP3X_LSC_CTRL, ISP_LSC_EN); isp3_param_clear_bits(params_vdev, ISP3X_GAIN_CTRL, BIT(8)); diff --git a/drivers/media/platform/rockchip/isp/isp_params_v3x.c b/drivers/media/platform/rockchip/isp/isp_params_v3x.c index 0b09ffafe0a5..e7bd20dc262c 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v3x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v3x.c @@ -609,19 +609,13 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, u32 lsc_ctrl; int i; - /* To config must be off , store the current status firstly */ lsc_ctrl = isp3_param_read(params_vdev, ISP3X_LSC_CTRL, id); - isp3_param_clear_bits(params_vdev, ISP3X_LSC_CTRL, ISP_LSC_EN | BIT(2), id); params_rec->others.lsc_cfg = *arg; - if (dev->hw_dev->is_single) { - if (lsc_ctrl & ISP_LSC_EN) { - /* latest config for ISP3_LEFT, unite isp or single isp */ - if (id == ISP3_LEFT) - tasklet_schedule(&priv_val->lsc_tasklet); - } else { - isp_lsc_matrix_cfg_sram(params_vdev, arg, false, id); - } - } + if (dev->hw_dev->is_single && + (lsc_ctrl & ISP_LSC_EN) && + (id == ISP3_LEFT)) + /* latest config for ISP3_LEFT, unite isp or single isp */ + tasklet_schedule(&priv_val->lsc_tasklet); for (i = 0; i < ISP3X_LSC_SIZE_TBL_SIZE / 4; i++) { /* program x size tables */ @@ -658,17 +652,23 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, } if (arg->sector_16x16) - lsc_ctrl |= BIT(2); - isp3_param_set_bits(params_vdev, ISP3X_LSC_CTRL, lsc_ctrl, id); + lsc_ctrl |= ISP3X_LSC_SECTOR_16X16; + else + lsc_ctrl &= ~ISP3X_LSC_SECTOR_16X16; + isp3_param_write(params_vdev, lsc_ctrl, ISP3X_LSC_CTRL, id); } static void isp_lsc_enable(struct rkisp_isp_params_vdev *params_vdev, bool en, u32 id) { + struct isp3x_isp_params_cfg *params_rec = params_vdev->isp3x_params + id; u32 val = ISP_LSC_EN; if (en) { isp3_param_set_bits(params_vdev, ISP3X_LSC_CTRL, val, id); + if (params_vdev->dev->hw_dev->is_single) + isp_lsc_matrix_cfg_sram(params_vdev, + ¶ms_rec->others.lsc_cfg, false, id); } else { isp3_param_clear_bits(params_vdev, ISP3X_LSC_CTRL, ISP_LSC_EN, id); isp3_param_clear_bits(params_vdev, ISP3X_GAIN_CTRL, BIT(8), id); @@ -2796,8 +2796,7 @@ isp_dhaz_config(struct rkisp_isp_params_vdev *params_vdev, ctrl |= (arg->soft_wr_en & 0x1) << 25; /* merge dual unite isp params at frame end */ if (arg->soft_wr_en && - (!dev->hw_dev->is_unite || - (dev->hw_dev->is_unite && !(ctrl & ISP3X_DHAZ_ENMUX)))) { + (!dev->hw_dev->is_unite || !(ctrl & ISP3X_DHAZ_ENMUX))) { value = ISP_PACK_2SHORT(arg->adp_wt_wr, arg->adp_air_wr); isp3_param_write(params_vdev, value, ISP3X_DHAZ_ADT_WR0, id); value = ISP_PACK_2SHORT(arg->adp_tmax_wr, arg->adp_gratio_wr); diff --git a/drivers/media/platform/rockchip/isp/regs_v3x.h b/drivers/media/platform/rockchip/isp/regs_v3x.h index 12fd64ce1ea8..13e6f0acb03e 100644 --- a/drivers/media/platform/rockchip/isp/regs_v3x.h +++ b/drivers/media/platform/rockchip/isp/regs_v3x.h @@ -2138,6 +2138,8 @@ #define ISP3X_LSC_TABLE_ADDRESS_0 0 #define ISP3X_LSC_TABLE_ADDRESS_153 153 +#define ISP3X_LSC_SECTOR_16X16 BIT(2) + /* RAWAE */ #define ISP3X_RAWAE_LITE_EN BIT(0) #define ISP3X_RAWAE_LITE_WNDNUM BIT(1)