diff --git a/drivers/media/platform/rockchip/isp/isp_params.c b/drivers/media/platform/rockchip/isp/isp_params.c index 0aef6dc4d3a7..452a920fb844 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.c +++ b/drivers/media/platform/rockchip/isp/isp_params.c @@ -322,6 +322,10 @@ void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id) void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev) { + /* multi device to switch sram config */ + if (params_vdev->dev->hw_dev->is_single) + return; + if (params_vdev->ops->param_cfgsram) params_vdev->ops->param_cfgsram(params_vdev); } diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c index cc28330dc510..20dd6095fd55 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v21.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c @@ -456,18 +456,22 @@ isp_sdg_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, bool is_direct) + const struct isp2x_lsc_cfg *pconfig, bool is_check) { int i, j; unsigned int sram_addr; unsigned int data; + if (is_check && + !(rkisp_ioread32(params_vdev, ISP_LSC_CTRL) & ISP_LSC_EN)) + return; + /* CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */ sram_addr = CIF_ISP_LSC_TABLE_ADDRESS_0; - 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); + rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_ADDR, sram_addr, true); + rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_ADDR, sram_addr, true); + rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_ADDR, sram_addr, true); + rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_ADDR, sram_addr, true); /* program data tables (table size is 9 * 17 = 153) */ for (i = 0; i < CIF_ISP_LSC_SECTORS_MAX * CIF_ISP_LSC_SECTORS_MAX; @@ -477,46 +481,34 @@ isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev, * DWORDs (2nd value of last DWORD unused) */ for (j = 0; j < CIF_ISP_LSC_SECTORS_MAX - 1; j += 2) { - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->r_data_tbl[i + j], - pconfig->r_data_tbl[i + j + 1]); - rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct); + data = ISP_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j], + pconfig->r_data_tbl[i + j + 1]); + rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, true); - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->gr_data_tbl[i + j], - pconfig->gr_data_tbl[i + j + 1]); - rkisp_write(params_vdev->dev, ISP_LSC_GR_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_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, true); - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->gb_data_tbl[i + j], - pconfig->gb_data_tbl[i + j + 1]); - rkisp_write(params_vdev->dev, ISP_LSC_GB_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_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, true); - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->b_data_tbl[i + j], - pconfig->b_data_tbl[i + j + 1]); - rkisp_write(params_vdev->dev, ISP_LSC_B_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_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, true); } - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->r_data_tbl[i + j], - 0); - rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct); + data = ISP_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j], 0); + rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, true); - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->gr_data_tbl[i + j], - 0); - rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, is_direct); + data = ISP_ISP_LSC_TABLE_DATA(pconfig->gr_data_tbl[i + j], 0); + rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, true); - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->gb_data_tbl[i + j], - 0); - rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, is_direct); + data = ISP_ISP_LSC_TABLE_DATA(pconfig->gb_data_tbl[i + j], 0); + rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, true); - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->b_data_tbl[i + j], - 0); - rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, is_direct); + data = ISP_ISP_LSC_TABLE_DATA(pconfig->b_data_tbl[i + j], 0); + rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, true); } } @@ -598,8 +590,7 @@ static void isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_lsc_cfg *arg) { - struct rkisp_isp_params_val_v21 *priv_val = - (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; + struct isp21_isp_params_cfg *params_rec = params_vdev->isp21_params; struct rkisp_device *dev = params_vdev->dev; unsigned int data; u32 lsc_ctrl; @@ -607,10 +598,17 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, /* 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_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN); + /* online mode lsc lut load from ddr quick for some sensor VB short + * readback mode lsc lut AHB config to sram, once for single device, + * need record to switch for multi-device. + */ if (!IS_HDR_RDBK(dev->rd_mode)) isp_lsc_matrix_cfg_ddr(params_vdev, arg); + else if (dev->hw_dev->is_single) + isp_lsc_matrix_cfg_sram(params_vdev, arg, false); + else + params_rec->others.lsc_cfg = *arg; for (i = 0; i < 4; i++) { /* program x size tables */ @@ -646,8 +644,6 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, } else { isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN); } - - priv_val->cur_lsccfg = *arg; } static void @@ -2249,37 +2245,81 @@ isp_rawhstlite_enable(struct rkisp_isp_params_vdev *params_vdev, } static void -isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_rawhistbig_cfg *arg, u32 blk_no) +isp_rawhstbig_cfg_sram(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_rawhistbig_cfg *arg, + u32 blk_no, bool is_check) { - u32 i, j; - u32 value; - u32 hist_ctrl; - u32 block_hsize, block_vsize; - u32 wnd_num_idx, hist_weight_num; + u32 i, j, wnd_num_idx, value; u8 weight15x15[ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE]; - const u32 hist_wnd_num[] = { - 5, 5, 15, 15 - }; + const u32 hist_wnd_num[] = { 5, 5, 15, 15 }; u32 addr; switch (blk_no) { - case 0: - addr = ISP_RAWHIST_BIG1_BASE; - break; case 1: addr = ISP_RAWHIST_BIG2_BASE; break; case 2: addr = ISP_RAWHIST_BIG3_BASE; break; + case 0: default: addr = ISP_RAWHIST_BIG1_BASE; break; } + value = ISP2X_RAWHSTBIG_CTRL_EN_MASK; + if (is_check && + !(rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL) & value)) + return; + + wnd_num_idx = arg->wnd_num; + memset(weight15x15, 0, sizeof(weight15x15)); + for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) { + for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) { + weight15x15[i * ISP2X_RAWHSTBIG_ROW_NUM + j] = + arg->weight[i * hist_wnd_num[wnd_num_idx] + j]; + } + } + + for (i = 0; i < (ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE / 5); i++) { + value = ISP2X_RAWHSTBIG_WEIGHT_SET(weight15x15[5 * i + 0], + weight15x15[5 * i + 1], + weight15x15[5 * i + 2], + weight15x15[5 * i + 3], + weight15x15[5 * i + 4]); + rkisp_write(params_vdev->dev, addr + ISP_RAWHIST_BIG_WEIGHT_BASE, + value, true); + } +} + +static void +isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_rawhistbig_cfg *arg, u32 blk_no) +{ + struct isp21_isp_params_cfg *params_rec = params_vdev->isp21_params; + struct rkisp_device *dev = params_vdev->dev; + struct isp2x_rawhistbig_cfg *arg_rec; + u32 hist_ctrl, block_hsize, block_vsize, wnd_num_idx; + const u32 hist_wnd_num[] = { 5, 5, 15, 15 }; + u32 addr; + + switch (blk_no) { + case 1: + addr = ISP_RAWHIST_BIG2_BASE; + arg_rec = ¶ms_rec->meas.rawhist1; + break; + case 2: + addr = ISP_RAWHIST_BIG3_BASE; + arg_rec = ¶ms_rec->meas.rawhist2; + break; + case 0: + default: + addr = ISP_RAWHIST_BIG1_BASE; + arg_rec = ¶ms_rec->meas.rawhist3; + break; + } + wnd_num_idx = arg->wnd_num; - memset(weight15x15, 0x00, sizeof(weight15x15)); /* avoid to override the old enable value */ hist_ctrl = rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL); hist_ctrl &= ISP2X_RAWHSTBIG_CTRL_EN_MASK; @@ -2309,25 +2349,10 @@ isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev, ISP2X_PACK_4BYTE(arg->rcc, arg->gcc, arg->bcc, arg->off), addr + ISP_RAWHIST_BIG_RAW2Y_CC); - for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) { - for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) { - weight15x15[i * ISP2X_RAWHSTBIG_ROW_NUM + j] = - arg->weight[i * hist_wnd_num[wnd_num_idx] + j]; - } - } - - rkisp_iowrite32(params_vdev, ISP2X_RAWHSTBIG_WRAM_EN, ISP_RAWHIST_BIG_WRAM_CTRL); - hist_weight_num = ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE; - for (i = 0; i < (hist_weight_num / 5); i++) { - value = ISP2X_RAWHSTBIG_WEIGHT_SET( - weight15x15[5 * i + 0], - weight15x15[5 * i + 1], - weight15x15[5 * i + 2], - weight15x15[5 * i + 3], - weight15x15[5 * i + 4]); - rkisp_iowrite32(params_vdev, value, - addr + ISP_RAWHIST_BIG_WEIGHT_BASE); - } + if (dev->hw_dev->is_single) + isp_rawhstbig_cfg_sram(params_vdev, arg, blk_no, false); + else + *arg_rec = *arg; } static void @@ -3677,12 +3702,14 @@ void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev) } static -void rkisp_params_cfgsram_v2x(struct rkisp_isp_params_vdev *params_vdev) +void rkisp_params_cfgsram_v21(struct rkisp_isp_params_vdev *params_vdev) { - struct rkisp_isp_params_val_v21 *priv_val = - (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; + struct isp21_isp_params_cfg *params = params_vdev->isp21_params; - isp_lsc_matrix_cfg_sram(params_vdev, &priv_val->cur_lsccfg, true); + isp_lsc_matrix_cfg_sram(params_vdev, ¶ms->others.lsc_cfg, true); + isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist1, 1, true); + isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist2, 2, true); + isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist3, 0, true); } static void @@ -4071,7 +4098,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, + .param_cfgsram = rkisp_params_cfgsram_v21, .get_meshbuf_inf = rkisp_params_get_ldchbuf_inf_v2x, .set_meshbuf_size = rkisp_params_set_ldchbuf_size_v2x, .stream_stop = rkisp_params_stream_stop_v2x, diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.h b/drivers/media/platform/rockchip/isp/isp_params_v21.h index 65262efe9bee..da26ef9734c5 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v21.h +++ b/drivers/media/platform/rockchip/isp/isp_params_v21.h @@ -156,7 +156,6 @@ struct rkisp_isp_params_val_v21 { struct isp21_drc_cfg last_hdrdrc; struct isp2x_hdrmge_cfg cur_hdrmge; struct isp21_drc_cfg cur_hdrdrc; - struct isp2x_lsc_cfg cur_lsccfg; u8 dhaz_en; u8 wdr_en; diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c index 907c0eec9e90..656834e2a922 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c @@ -532,18 +532,22 @@ 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, bool is_direct) + const struct isp2x_lsc_cfg *pconfig, bool is_check) { int i, j; unsigned int sram_addr; unsigned int data; + if (is_check && + !(rkisp_ioread32(params_vdev, ISP_LSC_CTRL) & ISP_LSC_EN)) + return; + /* CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */ sram_addr = CIF_ISP_LSC_TABLE_ADDRESS_0; - 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); + rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_ADDR, sram_addr, true); + rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_ADDR, sram_addr, true); + rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_ADDR, sram_addr, true); + rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_ADDR, sram_addr, true); /* program data tables (table size is 9 * 17 = 153) */ for (i = 0; i < CIF_ISP_LSC_SECTORS_MAX * CIF_ISP_LSC_SECTORS_MAX; @@ -553,46 +557,34 @@ isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev, * DWORDs (2nd value of last DWORD unused) */ for (j = 0; j < CIF_ISP_LSC_SECTORS_MAX - 1; j += 2) { - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->r_data_tbl[i + j], - pconfig->r_data_tbl[i + j + 1]); - rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct); + data = ISP_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j], + pconfig->r_data_tbl[i + j + 1]); + rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, true); - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->gr_data_tbl[i + j], - pconfig->gr_data_tbl[i + j + 1]); - rkisp_write(params_vdev->dev, ISP_LSC_GR_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_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, true); - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->gb_data_tbl[i + j], - pconfig->gb_data_tbl[i + j + 1]); - rkisp_write(params_vdev->dev, ISP_LSC_GB_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_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, true); - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->b_data_tbl[i + j], - pconfig->b_data_tbl[i + j + 1]); - rkisp_write(params_vdev->dev, ISP_LSC_B_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_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, true); } - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->r_data_tbl[i + j], - 0); - rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct); + data = ISP_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j], 0); + rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, true); - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->gr_data_tbl[i + j], - 0); - rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, is_direct); + data = ISP_ISP_LSC_TABLE_DATA(pconfig->gr_data_tbl[i + j], 0); + rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, true); - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->gb_data_tbl[i + j], - 0); - rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, is_direct); + data = ISP_ISP_LSC_TABLE_DATA(pconfig->gb_data_tbl[i + j], 0); + rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, true); - data = ISP_ISP_LSC_TABLE_DATA( - pconfig->b_data_tbl[i + j], - 0); - rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, is_direct); + data = ISP_ISP_LSC_TABLE_DATA(pconfig->b_data_tbl[i + j], 0); + rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, true); } } @@ -674,8 +666,7 @@ static void isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_lsc_cfg *arg) { - struct rkisp_isp_params_val_v2x *priv_val = - (struct rkisp_isp_params_val_v2x *)params_vdev->priv_val; + struct isp2x_isp_params_cfg *params_rec = params_vdev->isp2x_params; struct rkisp_device *dev = params_vdev->dev; unsigned int data; u32 lsc_ctrl; @@ -683,10 +674,17 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, /* 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_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN); + /* online mode lsc lut load from ddr quick for some sensor VB short + * readback mode lsc lut AHB config to sram, once for single device, + * need record to switch for multi-device. + */ if (!IS_HDR_RDBK(dev->rd_mode)) isp_lsc_matrix_cfg_ddr(params_vdev, arg); + else if (dev->hw_dev->is_single) + isp_lsc_matrix_cfg_sram(params_vdev, arg, false); + else + params_rec->others.lsc_cfg = *arg; for (i = 0; i < 4; i++) { /* program x size tables */ @@ -722,8 +720,6 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, } else { isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN); } - - priv_val->cur_lsccfg = *arg; } static void @@ -2807,37 +2803,82 @@ isp_rawhstlite_enable(struct rkisp_isp_params_vdev *params_vdev, } static void -isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_rawhistbig_cfg *arg, u32 blk_no) +isp_rawhstbig_cfg_sram(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_rawhistbig_cfg *arg, + u32 blk_no, bool is_check) { - u32 i, j; - u32 value; - u32 hist_ctrl; - u32 block_hsize, block_vsize; - u32 wnd_num_idx, hist_weight_num; + u32 i, j, wnd_num_idx, value; u8 weight15x15[ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE]; - const u32 hist_wnd_num[] = { - 5, 5, 15, 15 - }; + const u32 hist_wnd_num[] = { 5, 5, 15, 15 }; u32 addr; switch (blk_no) { - case 0: - addr = ISP_RAWHIST_BIG1_BASE; - break; case 1: addr = ISP_RAWHIST_BIG2_BASE; break; case 2: addr = ISP_RAWHIST_BIG3_BASE; break; + case 0: default: addr = ISP_RAWHIST_BIG1_BASE; break; } + value = ISP2X_RAWHSTBIG_CTRL_EN_MASK; + if (is_check && + !(rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL) & value)) + return; + + wnd_num_idx = arg->wnd_num; + memset(weight15x15, 0, sizeof(weight15x15)); + for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) { + for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) { + weight15x15[i * ISP2X_RAWHSTBIG_ROW_NUM + j] = + arg->weight[i * hist_wnd_num[wnd_num_idx] + j]; + } + } + + for (i = 0; i < (ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE / 5); i++) { + value = ISP2X_RAWHSTBIG_WEIGHT_SET(weight15x15[5 * i + 0], + weight15x15[5 * i + 1], + weight15x15[5 * i + 2], + weight15x15[5 * i + 3], + weight15x15[5 * i + 4]); + rkisp_write(params_vdev->dev, + addr + ISP_RAWHIST_BIG_WEIGHT_BASE, + value, true); + } +} + +static void +isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev, + const struct isp2x_rawhistbig_cfg *arg, u32 blk_no) +{ + struct isp2x_isp_params_cfg *params_rec = params_vdev->isp2x_params; + struct rkisp_device *dev = params_vdev->dev; + struct isp2x_rawhistbig_cfg *arg_rec; + u32 hist_ctrl, block_hsize, block_vsize, wnd_num_idx; + const u32 hist_wnd_num[] = { 5, 5, 15, 15 }; + u32 addr; + + switch (blk_no) { + case 1: + addr = ISP_RAWHIST_BIG2_BASE; + arg_rec = ¶ms_rec->meas.rawhist1; + break; + case 2: + addr = ISP_RAWHIST_BIG3_BASE; + arg_rec = ¶ms_rec->meas.rawhist2; + break; + case 0: + default: + addr = ISP_RAWHIST_BIG1_BASE; + arg_rec = ¶ms_rec->meas.rawhist3; + break; + } + wnd_num_idx = arg->wnd_num; - memset(weight15x15, 0x00, sizeof(weight15x15)); /* avoid to override the old enable value */ hist_ctrl = rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL); hist_ctrl &= ISP2X_RAWHSTBIG_CTRL_EN_MASK; @@ -2867,25 +2908,10 @@ isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev, ISP2X_PACK_4BYTE(arg->rcc, arg->gcc, arg->bcc, arg->off), addr + ISP_RAWHIST_BIG_RAW2Y_CC); - for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) { - for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) { - weight15x15[i * ISP2X_RAWHSTBIG_ROW_NUM + j] = - arg->weight[i * hist_wnd_num[wnd_num_idx] + j]; - } - } - - rkisp_iowrite32(params_vdev, ISP2X_RAWHSTBIG_WRAM_EN, ISP_RAWHIST_BIG_WRAM_CTRL); - hist_weight_num = ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE; - for (i = 0; i < (hist_weight_num / 5); i++) { - value = ISP2X_RAWHSTBIG_WEIGHT_SET( - weight15x15[5 * i + 0], - weight15x15[5 * i + 1], - weight15x15[5 * i + 2], - weight15x15[5 * i + 3], - weight15x15[5 * i + 4]); - rkisp_iowrite32(params_vdev, value, - addr + ISP_RAWHIST_BIG_WEIGHT_BASE); - } + if (dev->hw_dev->is_single) + isp_rawhstbig_cfg_sram(params_vdev, arg, blk_no, false); + else + *arg_rec = *arg; } static void @@ -4014,10 +4040,12 @@ void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev) static void rkisp_params_cfgsram_v2x(struct rkisp_isp_params_vdev *params_vdev) { - struct rkisp_isp_params_val_v2x *priv_val = - (struct rkisp_isp_params_val_v2x *)params_vdev->priv_val; + struct isp2x_isp_params_cfg *params = params_vdev->isp2x_params; - isp_lsc_matrix_cfg_sram(params_vdev, &priv_val->cur_lsccfg, true); + isp_lsc_matrix_cfg_sram(params_vdev, ¶ms->others.lsc_cfg, true); + isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist1, 1, true); + isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist2, 2, true); + isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist3, 0, true); } /* Not called when the camera active, thus not isr protection. */ diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.h b/drivers/media/platform/rockchip/isp/isp_params_v2x.h index b35505ce230c..707ada18205b 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.h +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.h @@ -333,7 +333,6 @@ struct rkisp_isp_params_val_v2x { struct isp2x_hdrmge_cfg last_hdrmge; struct isp2x_hdrtmo_cfg cur_hdrtmo; struct isp2x_hdrmge_cfg cur_hdrmge; - struct isp2x_lsc_cfg cur_lsccfg; u8 dhaz_en; u8 wdr_en;