diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c index 20dd6095fd55..dc0d95d830de 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v21.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c @@ -3712,32 +3712,68 @@ void rkisp_params_cfgsram_v21(struct rkisp_isp_params_vdev *params_vdev) isp_rawhstbig_cfg_sram(params_vdev, ¶ms->meas.rawhist3, 0, true); } -static void -rkisp_alloc_bay3d_buf(struct rkisp_isp_params_vdev *params_vdev, - const struct isp21_isp_params_cfg *new_params) +static int +rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev, + const struct isp21_isp_params_cfg *new_params) { struct rkisp_device *ispdev = params_vdev->dev; struct rkisp_isp_subdev *isp_sdev = &ispdev->isp_sdev; struct rkisp_isp_params_val_v21 *priv_val; u64 module_en_update, module_ens; u32 w, h, size; - int ret; + int ret, i; + priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; module_en_update = new_params->module_en_update; module_ens = new_params->module_ens; + priv_val->buf_3dlut_idx = 0; + for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) { + priv_val->buf_3dlut[i].is_need_vaddr = true; + priv_val->buf_3dlut[i].size = RKISP_PARAM_3DLUT_BUF_SIZE; + ret = rkisp_alloc_buffer(ispdev, &priv_val->buf_3dlut[i]); + if (ret) { + dev_err(ispdev->dev, "can not alloc buffer\n"); + goto err_3dlut; + } + } + + priv_val->buf_lsclut_idx = 0; + for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) { + priv_val->buf_lsclut[i].is_need_vaddr = true; + priv_val->buf_lsclut[i].size = RKISP_PARAM_LSC_LUT_BUF_SIZE; + ret = rkisp_alloc_buffer(ispdev, &priv_val->buf_lsclut[i]); + if (ret) { + dev_err(ispdev->dev, "can not alloc buffer\n"); + goto err_lsclut; + } + } + if ((module_en_update & ISP2X_MODULE_BAY3D) && (module_ens & ISP2X_MODULE_BAY3D)) { w = isp_sdev->in_crop.width; h = isp_sdev->in_crop.height; size = 2 * ALIGN((ALIGN(w, 16) + (w + 15) / 8) * h, 16); - priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; - rkisp_free_buffer(ispdev, &priv_val->buf_3dnr); priv_val->buf_3dnr.size = size; ret = rkisp_alloc_buffer(ispdev, &priv_val->buf_3dnr); - if (ret) + if (ret) { dev_err(ispdev->dev, "can not alloc bay3d buffer\n"); + goto err_bay3d; + } } + + return 0; +err_bay3d: + rkisp_free_buffer(ispdev, &priv_val->buf_3dnr); + i = RKISP_PARAM_LSC_LUT_BUF_NUM; +err_lsclut: + for (i -= 1; i >= 0; i--) + rkisp_free_buffer(ispdev, &priv_val->buf_lsclut[i]); + i = RKISP_PARAM_3DLUT_BUF_NUM; +err_3dlut: + for (i -= 1; i >= 0; i--) + rkisp_free_buffer(ispdev, &priv_val->buf_3dlut[i]); + return ret; } /* Not called when the camera active, thus not isr protection. */ @@ -3752,7 +3788,7 @@ rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev) u32 width = hw->max_in.w ? hw->max_in.w : out_crop->width; u32 size = hw->max_in.w ? hw->max_in.w * hw->max_in.h : isp_param_get_insize(params_vdev); - rkisp_alloc_bay3d_buf(params_vdev, params_vdev->isp21_params); + rkisp_alloc_internal_buf(params_vdev, params_vdev->isp21_params); spin_lock(¶ms_vdev->config_lock); /* override the default things */ if (!params_vdev->isp21_params->module_cfg_update && @@ -3900,9 +3936,16 @@ rkisp_params_stream_stop_v2x(struct rkisp_isp_params_vdev *params_vdev) { struct rkisp_device *ispdev = params_vdev->dev; struct rkisp_isp_params_val_v21 *priv_val; + int i; priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; rkisp_free_buffer(ispdev, &priv_val->buf_3dnr); + for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) + rkisp_free_buffer(ispdev, &priv_val->buf_3dlut[i]); + for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) + rkisp_free_buffer(ispdev, &priv_val->buf_lsclut[i]); + for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) + rkisp_free_buffer(ispdev, &ispdev->stats_vdev.stats_buf[i]); } static void @@ -4107,9 +4150,7 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev) { - struct device *dev = params_vdev->dev->dev; struct rkisp_isp_params_val_v21 *priv_val; - int i, ret; priv_val = kzalloc(sizeof(*priv_val), GFP_KERNEL); if (!priv_val) @@ -4121,62 +4162,18 @@ int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev) return -ENOMEM; } - priv_val->buf_3dlut_idx = 0; - for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) { - priv_val->buf_3dlut[i].is_need_vaddr = true; - priv_val->buf_3dlut[i].size = RKISP_PARAM_3DLUT_BUF_SIZE; - ret = rkisp_alloc_buffer(params_vdev->dev, &priv_val->buf_3dlut[i]); - if (ret) { - dev_err(dev, "can not alloc buffer\n"); - goto err; - } - } - - priv_val->buf_lsclut_idx = 0; - for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) { - priv_val->buf_lsclut[i].is_need_vaddr = true; - priv_val->buf_lsclut[i].size = RKISP_PARAM_LSC_LUT_BUF_SIZE; - ret = rkisp_alloc_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]); - if (ret) { - dev_err(dev, "can not alloc buffer\n"); - goto err; - } - } - params_vdev->priv_val = (void *)priv_val; params_vdev->ops = &rkisp_isp_params_ops_tbl; params_vdev->priv_ops = &rkisp_v21_isp_params_ops; rkisp_clear_first_param_v2x(params_vdev); return 0; - -err: - for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) - rkisp_free_buffer(params_vdev->dev, &priv_val->buf_3dlut[i]); - - for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) - rkisp_free_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]); - vfree(params_vdev->isp21_params); - - return ret; } void rkisp_uninit_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev) { - struct rkisp_isp_params_val_v21 *priv_val; - int i; - - priv_val = params_vdev->priv_val; - if (!priv_val) - return; - - rkisp_deinit_ldch_buf(params_vdev); - for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) - rkisp_free_buffer(params_vdev->dev, &priv_val->buf_3dlut[i]); - - for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) - rkisp_free_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]); - vfree(params_vdev->isp21_params); - kfree(priv_val); + if (params_vdev->isp21_params) + vfree(params_vdev->isp21_params); + kfree(params_vdev->priv_val); params_vdev->priv_val = NULL; } diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v21.c b/drivers/media/platform/rockchip/isp/isp_stats_v21.c index c51e82356603..d6946c9fe80b 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v21.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v21.c @@ -1118,11 +1118,19 @@ static struct rkisp_isp_stats_ops rkisp_isp_stats_ops_tbl = { void rkisp_stats_first_ddr_config_v21(struct rkisp_isp_stats_vdev *stats_vdev) { + int i; + stats_vdev->rd_stats_from_ddr = false; stats_vdev->priv_ops = &rkisp_stats_reg_ops_v21; - if (!IS_HDR_RDBK(stats_vdev->dev->hdr.op_mode) && - stats_vdev->stats_buf[0].mem_priv) { + if (!IS_HDR_RDBK(stats_vdev->dev->hdr.op_mode)) { + for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) { + stats_vdev->stats_buf[i].is_need_vaddr = true; + stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE; + if (rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i])) + goto err; + } + stats_vdev->priv_ops = &rkisp_stats_ddr_ops_v21; stats_vdev->rd_stats_from_ddr = true; stats_vdev->rd_buf_idx = 0; @@ -1135,12 +1143,15 @@ void rkisp_stats_first_ddr_config_v21(struct rkisp_isp_stats_vdev *stats_vdev) rkisp_set_bits(stats_vdev->dev, CTRL_SWS_CFG, SW_3A_DDR_WRITE_EN, SW_3A_DDR_WRITE_EN, false); } + return; +err: + for (i -= 1; i >= 0; i--) + rkisp_free_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]); + dev_err(stats_vdev->dev->dev, "alloc stats ddr buf fail\n"); } void rkisp_init_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev) { - int i; - stats_vdev->vdev_fmt.fmt.meta.dataformat = V4L2_META_FMT_RK_ISP1_STAT_3A; stats_vdev->vdev_fmt.fmt.meta.buffersize = @@ -1149,19 +1160,10 @@ void rkisp_init_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev) stats_vdev->ops = &rkisp_isp_stats_ops_tbl; stats_vdev->priv_ops = &rkisp_stats_reg_ops_v21; stats_vdev->rd_stats_from_ddr = false; - - for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) { - stats_vdev->stats_buf[i].is_need_vaddr = true; - stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE; - rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]); - } } void rkisp_uninit_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev) { - int i; - for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) - rkisp_free_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]); }