hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/media/platform/rockchip/isp/isp_params_v21.c
....@@ -460,10 +460,9 @@
460460 {
461461 int i, j;
462462 unsigned int sram_addr;
463
- unsigned int data;
463
+ unsigned int data = rkisp_ioread32(params_vdev, ISP_LSC_CTRL);
464464
465
- if (is_check &&
466
- !(rkisp_ioread32(params_vdev, ISP_LSC_CTRL) & ISP_LSC_EN))
465
+ if (is_check && (data & ISP_LSC_LUT_EN || !(data & ISP_LSC_EN)))
467466 return;
468467
469468 /* CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */
....@@ -603,12 +602,13 @@
603602 * readback mode lsc lut AHB config to sram, once for single device,
604603 * need record to switch for multi-device.
605604 */
606
- if (!IS_HDR_RDBK(dev->rd_mode))
605
+ if (!IS_HDR_RDBK(dev->rd_mode)) {
607606 isp_lsc_matrix_cfg_ddr(params_vdev, arg);
608
- else if (dev->hw_dev->is_single)
609
- isp_lsc_matrix_cfg_sram(params_vdev, arg, false);
610
- else
607
+ } else {
608
+ if (dev->hw_dev->is_single)
609
+ isp_lsc_matrix_cfg_sram(params_vdev, arg, false);
611610 params_rec->others.lsc_cfg = *arg;
611
+ }
612612
613613 for (i = 0; i < 4; i++) {
614614 /* program x size tables */
....@@ -1178,6 +1178,12 @@
11781178 ISP2X_REG_WR_MASK);
11791179
11801180 wnd_num_idx = arg->wnd_num;
1181
+ if (wnd_num_idx >= ARRAY_SIZE(ae_wnd_num)) {
1182
+ wnd_num_idx = ARRAY_SIZE(ae_wnd_num) - 1;
1183
+ dev_err(params_vdev->dev->dev,
1184
+ "%s invalid wnd_num:%d, set to %d\n",
1185
+ __func__, arg->wnd_num, wnd_num_idx);
1186
+ }
11811187 value |= ISP2X_RAWAEBIG_WNDNUM_SET(wnd_num_idx);
11821188
11831189 if (arg->subwin_en[0])
....@@ -1327,8 +1333,8 @@
13271333 (arg->sw_rawawb_wp_blk_wei_w[5 * i + 1] & 0x3f) << 6 |
13281334 (arg->sw_rawawb_wp_blk_wei_w[5 * i + 2] & 0x3f) << 12 |
13291335 (arg->sw_rawawb_wp_blk_wei_w[5 * i + 3] & 0x3f) << 18 |
1330
- (arg->sw_rawawb_wp_blk_wei_w[5 * i + 4] & 0x3f) << 24,
1331
- rkisp_iowrite32(params_vdev, val, ISP21_RAWAWB_WRAM_DATA_BASE);
1336
+ (arg->sw_rawawb_wp_blk_wei_w[5 * i + 4] & 0x3f) << 24;
1337
+ rkisp_write(params_vdev->dev, ISP21_RAWAWB_WRAM_DATA_BASE, val, true);
13321338 }
13331339 }
13341340
....@@ -2143,10 +2149,9 @@
21432149
21442150 if (params_vdev->dev->hw_dev->is_single)
21452151 isp_rawawb_cfg_sram(params_vdev, arg, false);
2146
- else
2147
- memcpy(arg_rec->sw_rawawb_wp_blk_wei_w,
2148
- arg->sw_rawawb_wp_blk_wei_w,
2149
- ISP21_RAWAWB_WEIGHT_NUM);
2152
+ memcpy(arg_rec->sw_rawawb_wp_blk_wei_w,
2153
+ arg->sw_rawawb_wp_blk_wei_w,
2154
+ ISP21_RAWAWB_WEIGHT_NUM);
21502155
21512156 /* avoid to override the old enable value */
21522157 value = rkisp_ioread32(params_vdev, ISP21_RAWAWB_CTRL);
....@@ -2292,6 +2297,12 @@
22922297 return;
22932298
22942299 wnd_num_idx = arg->wnd_num;
2300
+ if (wnd_num_idx >= ARRAY_SIZE(hist_wnd_num)) {
2301
+ wnd_num_idx = ARRAY_SIZE(hist_wnd_num) - 1;
2302
+ dev_err(params_vdev->dev->dev,
2303
+ "%s invalid wnd_num:%d, set to %d\n",
2304
+ __func__, arg->wnd_num, wnd_num_idx);
2305
+ }
22952306 memset(weight15x15, 0, sizeof(weight15x15));
22962307 for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) {
22972308 for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) {
....@@ -2339,6 +2350,12 @@
23392350 }
23402351
23412352 wnd_num_idx = arg->wnd_num;
2353
+ if (wnd_num_idx >= ARRAY_SIZE(hist_wnd_num)) {
2354
+ wnd_num_idx = ARRAY_SIZE(hist_wnd_num) - 1;
2355
+ dev_err(params_vdev->dev->dev,
2356
+ "%s invalid wnd_num:%d, set to %d\n",
2357
+ __func__, arg->wnd_num, wnd_num_idx);
2358
+ }
23422359 /* avoid to override the old enable value */
23432360 hist_ctrl = rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL);
23442361 hist_ctrl &= ISP2X_RAWHSTBIG_CTRL_EN_MASK;
....@@ -2370,8 +2387,7 @@
23702387
23712388 if (dev->hw_dev->is_single)
23722389 isp_rawhstbig_cfg_sram(params_vdev, arg, blk_no, false);
2373
- else
2374
- *arg_rec = *arg;
2390
+ *arg_rec = *arg;
23752391 }
23762392
23772393 static void
....@@ -3324,7 +3340,7 @@
33243340 isp_csm_config(struct rkisp_isp_params_vdev *params_vdev,
33253341 const struct isp21_csm_cfg *arg)
33263342 {
3327
- u32 i, val, eff_ctrl, cproc_ctrl;
3343
+ u32 i, val;
33283344
33293345 for (i = 0; i < ISP21_CSM_COEFF_NUM; i++) {
33303346 if (i == 0)
....@@ -3337,32 +3353,7 @@
33373353 }
33383354
33393355 val = CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA | CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA;
3340
- if (arg->csm_full_range) {
3341
- params_vdev->quantization = V4L2_QUANTIZATION_FULL_RANGE;
3342
- isp_param_set_bits(params_vdev, ISP_CTRL, val);
3343
- } else {
3344
- params_vdev->quantization = V4L2_QUANTIZATION_LIM_RANGE;
3345
- isp_param_clear_bits(params_vdev, ISP_CTRL, val);
3346
- }
3347
-
3348
- eff_ctrl = rkisp_ioread32(params_vdev, CIF_IMG_EFF_CTRL);
3349
- if (eff_ctrl & CIF_IMG_EFF_CTRL_ENABLE) {
3350
- if (arg->csm_full_range)
3351
- eff_ctrl |= CIF_IMG_EFF_CTRL_YCBCR_FULL;
3352
- else
3353
- eff_ctrl &= ~CIF_IMG_EFF_CTRL_YCBCR_FULL;
3354
- rkisp_iowrite32(params_vdev, eff_ctrl, CIF_IMG_EFF_CTRL);
3355
- }
3356
-
3357
- cproc_ctrl = rkisp_ioread32(params_vdev, CPROC_CTRL);
3358
- if (cproc_ctrl & CIF_C_PROC_CTR_ENABLE) {
3359
- val = CIF_C_PROC_YOUT_FULL | CIF_C_PROC_YIN_FULL | CIF_C_PROC_COUT_FULL;
3360
- if (eff_ctrl & CIF_IMG_EFF_CTRL_ENABLE || !arg->csm_full_range)
3361
- cproc_ctrl &= ~val;
3362
- else
3363
- cproc_ctrl |= val;
3364
- rkisp_iowrite32(params_vdev, cproc_ctrl, CPROC_CTRL);
3365
- }
3356
+ isp_param_set_bits(params_vdev, ISP_CTRL, val);
33663357 }
33673358
33683359 static void
....@@ -3370,13 +3361,36 @@
33703361 const struct isp21_cgc_cfg *arg)
33713362 {
33723363 u32 val = rkisp_ioread32(params_vdev, ISP_CTRL);
3364
+ u32 eff_ctrl, cproc_ctrl;
33733365
3366
+ params_vdev->quantization = V4L2_QUANTIZATION_FULL_RANGE;
33743367 val &= ~(ISP21_CGC_YUV_LIMIT | ISP21_CGC_RATIO_EN);
3375
- if (arg->yuv_limit)
3368
+ if (arg->yuv_limit) {
33763369 val |= ISP21_CGC_YUV_LIMIT;
3370
+ params_vdev->quantization = V4L2_QUANTIZATION_LIM_RANGE;
3371
+ }
33773372 if (arg->ratio_en)
33783373 val |= ISP21_CGC_RATIO_EN;
33793374 rkisp_iowrite32(params_vdev, val, ISP_CTRL);
3375
+
3376
+ cproc_ctrl = rkisp_ioread32(params_vdev, CPROC_CTRL);
3377
+ if (cproc_ctrl & CIF_C_PROC_CTR_ENABLE) {
3378
+ val = CIF_C_PROC_YOUT_FULL | CIF_C_PROC_YIN_FULL | CIF_C_PROC_COUT_FULL;
3379
+ if (arg->yuv_limit)
3380
+ cproc_ctrl &= ~val;
3381
+ else
3382
+ cproc_ctrl |= val;
3383
+ rkisp_iowrite32(params_vdev, cproc_ctrl, CPROC_CTRL);
3384
+ }
3385
+
3386
+ eff_ctrl = rkisp_ioread32(params_vdev, CIF_IMG_EFF_CTRL);
3387
+ if (eff_ctrl & CIF_IMG_EFF_CTRL_ENABLE) {
3388
+ if (arg->yuv_limit)
3389
+ eff_ctrl &= ~CIF_IMG_EFF_CTRL_YCBCR_FULL;
3390
+ else
3391
+ eff_ctrl |= CIF_IMG_EFF_CTRL_YCBCR_FULL;
3392
+ rkisp_iowrite32(params_vdev, eff_ctrl, CIF_IMG_EFF_CTRL);
3393
+ }
33803394 }
33813395
33823396 struct rkisp_isp_params_v21_ops rkisp_v21_isp_params_ops = {
....@@ -3488,11 +3502,12 @@
34883502 if ((module_cfg_update & ISP2X_MODULE_GOC))
34893503 ops->goc_config(params_vdev, &new_params->others.gammaout_cfg);
34903504
3491
- if ((module_cfg_update & ISP2X_MODULE_CGC))
3492
- ops->cgc_config(params_vdev, &new_params->others.cgc_cfg);
3493
-
3505
+ /* range csm->cgc->cproc->ie */
34943506 if ((module_cfg_update & ISP2X_MODULE_CSM))
34953507 ops->csm_config(params_vdev, &new_params->others.csm_cfg);
3508
+
3509
+ if ((module_cfg_update & ISP2X_MODULE_CGC))
3510
+ ops->cgc_config(params_vdev, &new_params->others.cgc_cfg);
34963511
34973512 if ((module_cfg_update & ISP2X_MODULE_CPROC))
34983513 ops->cproc_config(params_vdev, &new_params->others.cproc_cfg);
....@@ -3741,19 +3756,6 @@
37413756 ops->rawaf_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAF));
37423757 }
37433758
3744
-static __maybe_unused
3745
-void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev)
3746
-{
3747
- struct rkisp_isp_params_v21_ops *ops =
3748
- (struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops;
3749
- struct rkisp_isp_params_val_v21 *priv_val =
3750
- (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
3751
-
3752
- ops->hdrmge_config(params_vdev, &priv_val->last_hdrmge, RKISP_PARAMS_SHD);
3753
-
3754
- ops->hdrdrc_config(params_vdev, &priv_val->last_hdrdrc, RKISP_PARAMS_SHD);
3755
-}
3756
-
37573759 static
37583760 void rkisp_params_cfgsram_v21(struct rkisp_isp_params_vdev *params_vdev)
37593761 {
....@@ -3794,42 +3796,197 @@
37943796 }
37953797 }
37963798
3799
+static bool
3800
+rkisp_params_check_bigmode_v21(struct rkisp_isp_params_vdev *params_vdev)
3801
+{
3802
+ struct rkisp_device *ispdev = params_vdev->dev;
3803
+ struct device *dev = params_vdev->dev->dev;
3804
+ struct rkisp_hw_dev *hw = params_vdev->dev->hw_dev;
3805
+ struct v4l2_rect *crop = &params_vdev->dev->isp_sdev.in_crop;
3806
+ u32 width = hw->max_in.w, height = hw->max_in.h, size = width * height;
3807
+ u32 bigmode_max_w, bigmode_max_size;
3808
+ int k = 0, idx1[DEV_MAX] = { 0 };
3809
+ int n = 0, idx2[DEV_MAX] = { 0 };
3810
+ int i = 0, j = 0;
3811
+ bool is_bigmode = false;
3812
+
3813
+multi_overflow:
3814
+ if (hw->is_multi_overflow) {
3815
+ ispdev->multi_index = 0;
3816
+ ispdev->multi_mode = 0;
3817
+ bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH;
3818
+ bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE;
3819
+ dev_warn(dev, "over virtual isp max resolution, force to 2 readback\n");
3820
+ goto end;
3821
+ }
3822
+
3823
+ switch (hw->dev_link_num) {
3824
+ case 4:
3825
+ bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH;
3826
+ bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE;
3827
+ ispdev->multi_index = ispdev->dev_id;
3828
+ ispdev->multi_mode = 2;
3829
+ /* internal buf of hw divided to four parts
3830
+ * bigmode nobigmode
3831
+ * _________ max width:1920 max width:960
3832
+ * |_sensor0_| max size:1920*1080 max size:960*540
3833
+ * |_sensor1_| max size:1920*1080 max size:960*540
3834
+ * |_sensor2_| max size:1920*1080 max size:960*540
3835
+ * |_sensor3_| max size:1920*1080 max size:960*540
3836
+ */
3837
+ for (i = 0; i < hw->dev_num; i++) {
3838
+ if (hw->isp_size[i].w <= ISP21_VIR4_MAX_WIDTH &&
3839
+ hw->isp_size[i].size <= ISP21_VIR4_MAX_SIZE)
3840
+ continue;
3841
+ dev_warn(dev, "isp%d %dx%d over four vir isp max:1920x1080\n",
3842
+ i, hw->isp_size[i].w, hw->isp_size[i].h);
3843
+ hw->is_multi_overflow = true;
3844
+ goto multi_overflow;
3845
+ }
3846
+ break;
3847
+ case 3:
3848
+ bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH;
3849
+ bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE;
3850
+ ispdev->multi_index = ispdev->dev_id;
3851
+ ispdev->multi_mode = 2;
3852
+ /* case0: bigmode nobigmode
3853
+ * _________ max width:1920 max width:960
3854
+ * |_sensor0_| max size:1920*1080 max size:960*540
3855
+ * |_sensor1_| max size:1920*1080 max size:960*540
3856
+ * |_sensor2_| max size:1920*1080 max size:960*540
3857
+ * |_________|
3858
+ *
3859
+ * case1: bigmode special reg cfg
3860
+ * _________ max width:3840
3861
+ * | sensor0 | max size:3840*2160 mode=1 index=0
3862
+ * |_________|
3863
+ * |_sensor1_| max size:1920*1080 mode=2 index=2
3864
+ * |_sensor2_| max size:1920*1080 mode=2 index=3
3865
+ * max width:1920
3866
+ */
3867
+ for (i = 0; i < hw->dev_num; i++) {
3868
+ if (!hw->isp_size[i].size) {
3869
+ if (i < hw->dev_link_num)
3870
+ idx2[n++] = i;
3871
+ continue;
3872
+ }
3873
+ if (hw->isp_size[i].w <= ISP21_VIR4_MAX_WIDTH &&
3874
+ hw->isp_size[i].size <= ISP21_VIR4_MAX_SIZE)
3875
+ continue;
3876
+ idx1[k++] = i;
3877
+ }
3878
+ if (k) {
3879
+ is_bigmode = true;
3880
+ if (k != 1 ||
3881
+ (hw->isp_size[idx1[0]].size > ISP21_VIR2_MAX_SIZE)) {
3882
+ dev_warn(dev, "isp%d %dx%d over three vir isp max:1920x1080\n",
3883
+ idx1[0], hw->isp_size[idx1[0]].h, hw->isp_size[idx1[0]].w);
3884
+ hw->is_multi_overflow = true;
3885
+ goto multi_overflow;
3886
+ } else {
3887
+ if (idx1[0] == ispdev->dev_id) {
3888
+ ispdev->multi_mode = 1;
3889
+ ispdev->multi_index = 0;
3890
+ } else {
3891
+ ispdev->multi_mode = 2;
3892
+ if (ispdev->multi_index == 0 ||
3893
+ ispdev->multi_index == 1)
3894
+ ispdev->multi_index = 3;
3895
+ }
3896
+ }
3897
+ } else if (ispdev->multi_index >= hw->dev_link_num) {
3898
+ ispdev->multi_index = idx2[ispdev->multi_index - hw->dev_link_num];
3899
+ }
3900
+ break;
3901
+ case 2:
3902
+ bigmode_max_w = ISP21_VIR2_AUTO_BIGMODE_WIDTH;
3903
+ bigmode_max_size = ISP21_VIR2_NOBIG_OVERFLOW_SIZE;
3904
+ ispdev->multi_index = ispdev->dev_id;
3905
+ ispdev->multi_mode = 1;
3906
+ /* case0: bigmode nobigmode
3907
+ * _________ max width:3840 max width:1920
3908
+ * | sensor0 | max size:3840*2160 max size:1920*1080
3909
+ * |_________|
3910
+ * | sensor1 | max size:3840*2160 max size:1920*1080
3911
+ * |_________|
3912
+ *
3913
+ * case1: bigmode special reg cfg
3914
+ * _________ max width:4096
3915
+ * | sensor0 | max size: mode=0 index=0
3916
+ * | | 3840*2160+1920*1080
3917
+ * |_________|
3918
+ * |_sensor1_| max size:1920*1080 mode=2 index=3
3919
+ * max width:1920
3920
+ */
3921
+ for (i = 0; i < hw->dev_num; i++) {
3922
+ if (!hw->isp_size[i].size) {
3923
+ if (i < hw->dev_link_num)
3924
+ idx2[n++] = i;
3925
+ continue;
3926
+ }
3927
+ if (hw->isp_size[i].w <= ISP21_VIR2_MAX_WIDTH &&
3928
+ hw->isp_size[i].size <= ISP21_VIR2_MAX_SIZE) {
3929
+ if (hw->isp_size[i].w > ISP21_VIR4_MAX_WIDTH ||
3930
+ hw->isp_size[i].size > ISP21_VIR4_MAX_SIZE)
3931
+ j++;
3932
+ continue;
3933
+ }
3934
+ idx1[k++] = i;
3935
+ }
3936
+ if (k) {
3937
+ is_bigmode = true;
3938
+ if (k == 2 || j ||
3939
+ hw->isp_size[idx1[k - 1]].size > (ISP21_VIR4_MAX_SIZE + ISP21_VIR2_MAX_SIZE)) {
3940
+ dev_warn(dev, "isp%d %dx%d over two vir isp max:3840x2160\n",
3941
+ idx1[k - 1], hw->isp_size[idx1[k - 1]].w, hw->isp_size[idx1[k - 1]].h);
3942
+ hw->is_multi_overflow = true;
3943
+ goto multi_overflow;
3944
+ } else {
3945
+ if (idx1[0] == ispdev->dev_id) {
3946
+ ispdev->multi_mode = 0;
3947
+ ispdev->multi_index = 0;
3948
+ } else {
3949
+ ispdev->multi_mode = 2;
3950
+ ispdev->multi_index = 3;
3951
+ }
3952
+ }
3953
+ } else if (ispdev->multi_index >= hw->dev_link_num) {
3954
+ ispdev->multi_index = idx2[ispdev->multi_index - hw->dev_link_num];
3955
+ }
3956
+ break;
3957
+ default:
3958
+ bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH;
3959
+ bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE;
3960
+ ispdev->multi_mode = 0;
3961
+ ispdev->multi_index = 0;
3962
+ width = crop->width;
3963
+ height = crop->height;
3964
+ size = width * height;
3965
+ break;
3966
+ }
3967
+
3968
+end:
3969
+ if (!is_bigmode &&
3970
+ (width > bigmode_max_w || size > bigmode_max_size))
3971
+ is_bigmode = true;
3972
+
3973
+ return ispdev->is_bigmode = is_bigmode;
3974
+}
3975
+
37973976 /* Not called when the camera active, thus not isr protection. */
37983977 static void
37993978 rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev)
38003979 {
3801
- struct device *dev = params_vdev->dev->dev;
3980
+ struct rkisp_device *dev = params_vdev->dev;
38023981 struct rkisp_isp_params_val_v21 *priv_val =
38033982 (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
3804
- struct rkisp_hw_dev *hw = params_vdev->dev->hw_dev;
3805
- struct v4l2_rect *out_crop = &params_vdev->dev->isp_sdev.out_crop;
3806
- u32 width = hw->max_in.w ? hw->max_in.w : out_crop->width;
3807
- u32 height = hw->max_in.h ? hw->max_in.h : out_crop->height;
3808
- u32 size = width * height;
3809
- u32 bigmode_max_w, bigmode_max_size;
38103983
3811
- if (hw->dev_num > 2) {
3812
- bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH;
3813
- bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE;
3814
- if (width > ISP21_VIR4_MAX_WIDTH || size > ISP21_VIR4_MAX_SIZE)
3815
- dev_err(dev, "%dx%d > max:3840x2160 for %d virtual isp\n",
3816
- width, height, hw->dev_num);
3817
- } else if (hw->dev_num > 1) {
3818
- bigmode_max_w = ISP21_VIR2_AUTO_BIGMODE_WIDTH;
3819
- bigmode_max_size = ISP21_VIR2_NOBIG_OVERFLOW_SIZE;
3820
- if (width > ISP21_VIR2_MAX_WIDTH || size > ISP21_VIR2_MAX_SIZE)
3821
- dev_err(dev, "%dx%d > max:1920x1080 for %d virtual isp\n",
3822
- width, height, hw->dev_num);
3823
- } else {
3824
- bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH;
3825
- bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE;
3826
- }
3827
-
3984
+ dev->is_bigmode = rkisp_params_check_bigmode_v21(params_vdev);
38283985 spin_lock(&params_vdev->config_lock);
38293986 /* override the default things */
38303987 if (!params_vdev->isp21_params->module_cfg_update &&
38313988 !params_vdev->isp21_params->module_en_update)
3832
- dev_warn(dev, "can not get first iq setting in stream on\n");
3989
+ dev_warn(dev->dev, "can not get first iq setting in stream on\n");
38333990
38343991 priv_val->dhaz_en = 0;
38353992 priv_val->wdr_en = 0;
....@@ -3840,16 +3997,10 @@
38403997 __isp_isr_other_config(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
38413998 __isp_isr_other_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
38423999 __isp_isr_meas_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
3843
- if (width > bigmode_max_w || size > bigmode_max_size) {
4000
+ if (dev->is_bigmode)
38444001 rkisp_set_bits(params_vdev->dev, ISP_CTRL1,
38454002 ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN,
38464003 ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN, false);
3847
- }
3848
-
3849
- priv_val->cur_hdrmge = params_vdev->isp21_params->others.hdrmge_cfg;
3850
- priv_val->cur_hdrdrc = params_vdev->isp21_params->others.drc_cfg;
3851
- priv_val->last_hdrmge = priv_val->cur_hdrmge;
3852
- priv_val->last_hdrdrc = priv_val->cur_hdrdrc;
38534004 spin_unlock(&params_vdev->config_lock);
38544005 }
38554006
....@@ -3958,14 +4109,21 @@
39584109 }
39594110 }
39604111
3961
-static void
4112
+static int
39624113 rkisp_params_set_ldchbuf_size_v2x(struct rkisp_isp_params_vdev *params_vdev,
39634114 void *size)
39644115 {
39654116 struct rkisp_ldchbuf_size *ldchsize = size;
39664117
39674118 rkisp_deinit_ldch_buf(params_vdev);
3968
- rkisp_init_ldch_buf(params_vdev, ldchsize);
4119
+ return rkisp_init_ldch_buf(params_vdev, ldchsize);
4120
+}
4121
+
4122
+static void
4123
+rkisp_params_free_meshbuf_v21(struct rkisp_isp_params_vdev *params_vdev,
4124
+ u64 module_id)
4125
+{
4126
+ rkisp_deinit_ldch_buf(params_vdev);
39694127 }
39704128
39714129 static void
....@@ -4050,8 +4208,6 @@
40504208 {
40514209 struct isp21_isp_params_cfg *new_params = NULL;
40524210 struct rkisp_buffer *cur_buf = params_vdev->cur_buf;
4053
- struct rkisp_device *dev = params_vdev->dev;
4054
- struct rkisp_hw_dev *hw_dev = dev->hw_dev;
40554211
40564212 spin_lock(&params_vdev->config_lock);
40574213 if (!params_vdev->streamon)
....@@ -4067,10 +4223,14 @@
40674223 list_del(&cur_buf->queue);
40684224 if (list_empty(&params_vdev->params))
40694225 break;
4070
- else if (new_params->module_en_update) {
4226
+ else if (new_params->module_en_update ||
4227
+ (new_params->module_cfg_update & ISP2X_MODULE_FORCE)) {
40714228 /* update en immediately */
4229
+ __isp_isr_meas_config(params_vdev, new_params, type);
4230
+ __isp_isr_other_config(params_vdev, new_params, type);
40724231 __isp_isr_other_en(params_vdev, new_params, type);
40734232 __isp_isr_meas_en(params_vdev, new_params, type);
4233
+ new_params->module_cfg_update = 0;
40744234 }
40754235 if (new_params->module_cfg_update & ISP2X_MODULE_LDCH)
40764236 ldch_data_abandon(params_vdev, new_params);
....@@ -4093,17 +4253,9 @@
40934253 __isp_isr_other_config(params_vdev, new_params, type);
40944254 __isp_isr_other_en(params_vdev, new_params, type);
40954255 __isp_isr_meas_en(params_vdev, new_params, type);
4096
- if (!hw_dev->is_single && type != RKISP_PARAMS_SHD)
4097
- __isp_config_hdrshd(params_vdev);
40984256
40994257 if (type != RKISP_PARAMS_IMD) {
4100
- struct rkisp_isp_params_val_v21 *priv_val =
4101
- (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
4102
-
4103
- priv_val->last_hdrmge = priv_val->cur_hdrmge;
4104
- priv_val->last_hdrdrc = priv_val->cur_hdrdrc;
4105
- priv_val->cur_hdrmge = new_params->others.hdrmge_cfg;
4106
- priv_val->cur_hdrdrc = new_params->others.drc_cfg;
4258
+ new_params->module_cfg_update = 0;
41074259 vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
41084260 cur_buf = NULL;
41094261 }
....@@ -4174,8 +4326,10 @@
41744326 .param_cfgsram = rkisp_params_cfgsram_v21,
41754327 .get_meshbuf_inf = rkisp_params_get_ldchbuf_inf_v2x,
41764328 .set_meshbuf_size = rkisp_params_set_ldchbuf_size_v2x,
4329
+ .free_meshbuf = rkisp_params_free_meshbuf_v21,
41774330 .stream_stop = rkisp_params_stream_stop_v2x,
41784331 .fop_release = rkisp_params_fop_release_v2x,
4332
+ .check_bigmode = rkisp_params_check_bigmode_v21,
41794333 };
41804334
41814335 int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev)
....@@ -4201,7 +4355,7 @@
42014355 ret = rkisp_alloc_buffer(params_vdev->dev, &priv_val->buf_3dlut[i]);
42024356 if (ret) {
42034357 dev_err(dev, "can not alloc buffer\n");
4204
- goto err;
4358
+ goto err_3dlut;
42054359 }
42064360 }
42074361
....@@ -4212,7 +4366,7 @@
42124366 ret = rkisp_alloc_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]);
42134367 if (ret) {
42144368 dev_err(dev, "can not alloc buffer\n");
4215
- goto err;
4369
+ goto err_lsclut;
42164370 }
42174371 }
42184372
....@@ -4221,15 +4375,16 @@
42214375 params_vdev->priv_ops = &rkisp_v21_isp_params_ops;
42224376 rkisp_clear_first_param_v2x(params_vdev);
42234377 return 0;
4224
-
4225
-err:
4226
- for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++)
4378
+err_lsclut:
4379
+ for (i -= 1; i >= 0; i--)
4380
+ rkisp_free_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]);
4381
+ i = RKISP_PARAM_3DLUT_BUF_NUM;
4382
+err_3dlut:
4383
+ for (i -= 1; i >= 0; i--)
42274384 rkisp_free_buffer(params_vdev->dev, &priv_val->buf_3dlut[i]);
42284385
4229
- for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++)
4230
- rkisp_free_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]);
42314386 vfree(params_vdev->isp21_params);
4232
-
4387
+ kfree(priv_val);
42334388 return ret;
42344389 }
42354390