| .. | .. |
|---|
| 3324 | 3324 | isp_csm_config(struct rkisp_isp_params_vdev *params_vdev, |
|---|
| 3325 | 3325 | const struct isp21_csm_cfg *arg) |
|---|
| 3326 | 3326 | { |
|---|
| 3327 | | - u32 i, val, eff_ctrl, cproc_ctrl; |
|---|
| 3327 | + u32 i, val; |
|---|
| 3328 | 3328 | |
|---|
| 3329 | 3329 | for (i = 0; i < ISP21_CSM_COEFF_NUM; i++) { |
|---|
| 3330 | 3330 | if (i == 0) |
|---|
| .. | .. |
|---|
| 3337 | 3337 | } |
|---|
| 3338 | 3338 | |
|---|
| 3339 | 3339 | 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 | | - } |
|---|
| 3340 | + isp_param_set_bits(params_vdev, ISP_CTRL, val); |
|---|
| 3366 | 3341 | } |
|---|
| 3367 | 3342 | |
|---|
| 3368 | 3343 | static void |
|---|
| .. | .. |
|---|
| 3370 | 3345 | const struct isp21_cgc_cfg *arg) |
|---|
| 3371 | 3346 | { |
|---|
| 3372 | 3347 | u32 val = rkisp_ioread32(params_vdev, ISP_CTRL); |
|---|
| 3348 | + u32 eff_ctrl, cproc_ctrl; |
|---|
| 3373 | 3349 | |
|---|
| 3350 | + params_vdev->quantization = V4L2_QUANTIZATION_FULL_RANGE; |
|---|
| 3374 | 3351 | val &= ~(ISP21_CGC_YUV_LIMIT | ISP21_CGC_RATIO_EN); |
|---|
| 3375 | | - if (arg->yuv_limit) |
|---|
| 3352 | + if (arg->yuv_limit) { |
|---|
| 3376 | 3353 | val |= ISP21_CGC_YUV_LIMIT; |
|---|
| 3354 | + params_vdev->quantization = V4L2_QUANTIZATION_LIM_RANGE; |
|---|
| 3355 | + } |
|---|
| 3377 | 3356 | if (arg->ratio_en) |
|---|
| 3378 | 3357 | val |= ISP21_CGC_RATIO_EN; |
|---|
| 3379 | 3358 | rkisp_iowrite32(params_vdev, val, ISP_CTRL); |
|---|
| 3359 | + |
|---|
| 3360 | + cproc_ctrl = rkisp_ioread32(params_vdev, CPROC_CTRL); |
|---|
| 3361 | + if (cproc_ctrl & CIF_C_PROC_CTR_ENABLE) { |
|---|
| 3362 | + val = CIF_C_PROC_YOUT_FULL | CIF_C_PROC_YIN_FULL | CIF_C_PROC_COUT_FULL; |
|---|
| 3363 | + if (arg->yuv_limit) |
|---|
| 3364 | + cproc_ctrl &= ~val; |
|---|
| 3365 | + else |
|---|
| 3366 | + cproc_ctrl |= val; |
|---|
| 3367 | + rkisp_iowrite32(params_vdev, cproc_ctrl, CPROC_CTRL); |
|---|
| 3368 | + } |
|---|
| 3369 | + |
|---|
| 3370 | + eff_ctrl = rkisp_ioread32(params_vdev, CIF_IMG_EFF_CTRL); |
|---|
| 3371 | + if (eff_ctrl & CIF_IMG_EFF_CTRL_ENABLE) { |
|---|
| 3372 | + if (arg->yuv_limit) |
|---|
| 3373 | + eff_ctrl &= ~CIF_IMG_EFF_CTRL_YCBCR_FULL; |
|---|
| 3374 | + else |
|---|
| 3375 | + eff_ctrl |= CIF_IMG_EFF_CTRL_YCBCR_FULL; |
|---|
| 3376 | + rkisp_iowrite32(params_vdev, eff_ctrl, CIF_IMG_EFF_CTRL); |
|---|
| 3377 | + } |
|---|
| 3380 | 3378 | } |
|---|
| 3381 | 3379 | |
|---|
| 3382 | 3380 | struct rkisp_isp_params_v21_ops rkisp_v21_isp_params_ops = { |
|---|
| .. | .. |
|---|
| 3488 | 3486 | if ((module_cfg_update & ISP2X_MODULE_GOC)) |
|---|
| 3489 | 3487 | ops->goc_config(params_vdev, &new_params->others.gammaout_cfg); |
|---|
| 3490 | 3488 | |
|---|
| 3491 | | - if ((module_cfg_update & ISP2X_MODULE_CGC)) |
|---|
| 3492 | | - ops->cgc_config(params_vdev, &new_params->others.cgc_cfg); |
|---|
| 3493 | | - |
|---|
| 3489 | + /* range csm->cgc->cproc->ie */ |
|---|
| 3494 | 3490 | if ((module_cfg_update & ISP2X_MODULE_CSM)) |
|---|
| 3495 | 3491 | ops->csm_config(params_vdev, &new_params->others.csm_cfg); |
|---|
| 3492 | + |
|---|
| 3493 | + if ((module_cfg_update & ISP2X_MODULE_CGC)) |
|---|
| 3494 | + ops->cgc_config(params_vdev, &new_params->others.cgc_cfg); |
|---|
| 3496 | 3495 | |
|---|
| 3497 | 3496 | if ((module_cfg_update & ISP2X_MODULE_CPROC)) |
|---|
| 3498 | 3497 | ops->cproc_config(params_vdev, &new_params->others.cproc_cfg); |
|---|
| .. | .. |
|---|
| 3741 | 3740 | ops->rawaf_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAF)); |
|---|
| 3742 | 3741 | } |
|---|
| 3743 | 3742 | |
|---|
| 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 | | - |
|---|
| 3757 | 3743 | static |
|---|
| 3758 | 3744 | void rkisp_params_cfgsram_v21(struct rkisp_isp_params_vdev *params_vdev) |
|---|
| 3759 | 3745 | { |
|---|
| .. | .. |
|---|
| 3794 | 3780 | } |
|---|
| 3795 | 3781 | } |
|---|
| 3796 | 3782 | |
|---|
| 3783 | +static bool |
|---|
| 3784 | +rkisp_params_check_bigmode_v21(struct rkisp_isp_params_vdev *params_vdev) |
|---|
| 3785 | +{ |
|---|
| 3786 | + struct rkisp_device *ispdev = params_vdev->dev; |
|---|
| 3787 | + struct device *dev = params_vdev->dev->dev; |
|---|
| 3788 | + struct rkisp_hw_dev *hw = params_vdev->dev->hw_dev; |
|---|
| 3789 | + struct v4l2_rect *crop = ¶ms_vdev->dev->isp_sdev.in_crop; |
|---|
| 3790 | + u32 width = hw->max_in.w, height = hw->max_in.h, size = width * height; |
|---|
| 3791 | + u32 bigmode_max_w, bigmode_max_size; |
|---|
| 3792 | + int k = 0, idx1[DEV_MAX] = { 0 }; |
|---|
| 3793 | + int n = 0, idx2[DEV_MAX] = { 0 }; |
|---|
| 3794 | + int i = 0, j = 0; |
|---|
| 3795 | + bool is_bigmode = false; |
|---|
| 3796 | + |
|---|
| 3797 | +multi_overflow: |
|---|
| 3798 | + if (hw->is_multi_overflow) { |
|---|
| 3799 | + ispdev->multi_index = 0; |
|---|
| 3800 | + ispdev->multi_mode = 0; |
|---|
| 3801 | + bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH; |
|---|
| 3802 | + bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE; |
|---|
| 3803 | + dev_warn(dev, "over virtual isp max resolution, force to 2 readback\n"); |
|---|
| 3804 | + goto end; |
|---|
| 3805 | + } |
|---|
| 3806 | + |
|---|
| 3807 | + switch (hw->dev_link_num) { |
|---|
| 3808 | + case 4: |
|---|
| 3809 | + bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH; |
|---|
| 3810 | + bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE; |
|---|
| 3811 | + ispdev->multi_index = ispdev->dev_id; |
|---|
| 3812 | + ispdev->multi_mode = 2; |
|---|
| 3813 | + /* internal buf of hw divided to four parts |
|---|
| 3814 | + * bigmode nobigmode |
|---|
| 3815 | + * _________ max width:1920 max width:960 |
|---|
| 3816 | + * |_sensor0_| max size:1920*1080 max size:960*540 |
|---|
| 3817 | + * |_sensor1_| max size:1920*1080 max size:960*540 |
|---|
| 3818 | + * |_sensor2_| max size:1920*1080 max size:960*540 |
|---|
| 3819 | + * |_sensor3_| max size:1920*1080 max size:960*540 |
|---|
| 3820 | + */ |
|---|
| 3821 | + for (i = 0; i < hw->dev_num; i++) { |
|---|
| 3822 | + if (hw->isp_size[i].w <= ISP21_VIR4_MAX_WIDTH && |
|---|
| 3823 | + hw->isp_size[i].size <= ISP21_VIR4_MAX_SIZE) |
|---|
| 3824 | + continue; |
|---|
| 3825 | + dev_warn(dev, "isp%d %dx%d over four vir isp max:1920x1080\n", |
|---|
| 3826 | + i, hw->isp_size[i].w, hw->isp_size[i].h); |
|---|
| 3827 | + hw->is_multi_overflow = true; |
|---|
| 3828 | + goto multi_overflow; |
|---|
| 3829 | + } |
|---|
| 3830 | + break; |
|---|
| 3831 | + case 3: |
|---|
| 3832 | + bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH; |
|---|
| 3833 | + bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE; |
|---|
| 3834 | + ispdev->multi_index = ispdev->dev_id; |
|---|
| 3835 | + ispdev->multi_mode = 2; |
|---|
| 3836 | + /* case0: bigmode nobigmode |
|---|
| 3837 | + * _________ max width:1920 max width:960 |
|---|
| 3838 | + * |_sensor0_| max size:1920*1080 max size:960*540 |
|---|
| 3839 | + * |_sensor1_| max size:1920*1080 max size:960*540 |
|---|
| 3840 | + * |_sensor2_| max size:1920*1080 max size:960*540 |
|---|
| 3841 | + * |_________| |
|---|
| 3842 | + * |
|---|
| 3843 | + * case1: bigmode special reg cfg |
|---|
| 3844 | + * _________ max width:3840 |
|---|
| 3845 | + * | sensor0 | max size:3840*2160 mode=1 index=0 |
|---|
| 3846 | + * |_________| |
|---|
| 3847 | + * |_sensor1_| max size:1920*1080 mode=2 index=2 |
|---|
| 3848 | + * |_sensor2_| max size:1920*1080 mode=2 index=3 |
|---|
| 3849 | + * max width:1920 |
|---|
| 3850 | + */ |
|---|
| 3851 | + for (i = 0; i < hw->dev_num; i++) { |
|---|
| 3852 | + if (!hw->isp_size[i].size) { |
|---|
| 3853 | + if (i < hw->dev_link_num) |
|---|
| 3854 | + idx2[n++] = i; |
|---|
| 3855 | + continue; |
|---|
| 3856 | + } |
|---|
| 3857 | + if (hw->isp_size[i].w <= ISP21_VIR4_MAX_WIDTH && |
|---|
| 3858 | + hw->isp_size[i].size <= ISP21_VIR4_MAX_SIZE) |
|---|
| 3859 | + continue; |
|---|
| 3860 | + idx1[k++] = i; |
|---|
| 3861 | + } |
|---|
| 3862 | + if (k) { |
|---|
| 3863 | + is_bigmode = true; |
|---|
| 3864 | + if (k != 1 || |
|---|
| 3865 | + (hw->isp_size[idx1[0]].size > ISP21_VIR2_MAX_SIZE)) { |
|---|
| 3866 | + dev_warn(dev, "isp%d %dx%d over three vir isp max:1920x1080\n", |
|---|
| 3867 | + idx1[0], hw->isp_size[idx1[0]].h, hw->isp_size[idx1[0]].w); |
|---|
| 3868 | + hw->is_multi_overflow = true; |
|---|
| 3869 | + goto multi_overflow; |
|---|
| 3870 | + } else { |
|---|
| 3871 | + if (idx1[0] == ispdev->dev_id) { |
|---|
| 3872 | + ispdev->multi_mode = 1; |
|---|
| 3873 | + ispdev->multi_index = 0; |
|---|
| 3874 | + } else { |
|---|
| 3875 | + ispdev->multi_mode = 2; |
|---|
| 3876 | + if (ispdev->multi_index == 0 || |
|---|
| 3877 | + ispdev->multi_index == 1) |
|---|
| 3878 | + ispdev->multi_index = 3; |
|---|
| 3879 | + } |
|---|
| 3880 | + } |
|---|
| 3881 | + } else if (ispdev->multi_index >= hw->dev_link_num) { |
|---|
| 3882 | + ispdev->multi_index = idx2[ispdev->multi_index - hw->dev_link_num]; |
|---|
| 3883 | + } |
|---|
| 3884 | + break; |
|---|
| 3885 | + case 2: |
|---|
| 3886 | + bigmode_max_w = ISP21_VIR2_AUTO_BIGMODE_WIDTH; |
|---|
| 3887 | + bigmode_max_size = ISP21_VIR2_NOBIG_OVERFLOW_SIZE; |
|---|
| 3888 | + ispdev->multi_index = ispdev->dev_id; |
|---|
| 3889 | + ispdev->multi_mode = 1; |
|---|
| 3890 | + /* case0: bigmode nobigmode |
|---|
| 3891 | + * _________ max width:3840 max width:1920 |
|---|
| 3892 | + * | sensor0 | max size:3840*2160 max size:1920*1080 |
|---|
| 3893 | + * |_________| |
|---|
| 3894 | + * | sensor1 | max size:3840*2160 max size:1920*1080 |
|---|
| 3895 | + * |_________| |
|---|
| 3896 | + * |
|---|
| 3897 | + * case1: bigmode special reg cfg |
|---|
| 3898 | + * _________ max width:4096 |
|---|
| 3899 | + * | sensor0 | max size: mode=0 index=0 |
|---|
| 3900 | + * | | 3840*2160+1920*1080 |
|---|
| 3901 | + * |_________| |
|---|
| 3902 | + * |_sensor1_| max size:1920*1080 mode=2 index=3 |
|---|
| 3903 | + * max width:1920 |
|---|
| 3904 | + */ |
|---|
| 3905 | + for (i = 0; i < hw->dev_num; i++) { |
|---|
| 3906 | + if (!hw->isp_size[i].size) { |
|---|
| 3907 | + if (i < hw->dev_link_num) |
|---|
| 3908 | + idx2[n++] = i; |
|---|
| 3909 | + continue; |
|---|
| 3910 | + } |
|---|
| 3911 | + if (hw->isp_size[i].w <= ISP21_VIR2_MAX_WIDTH && |
|---|
| 3912 | + hw->isp_size[i].size <= ISP21_VIR2_MAX_SIZE) { |
|---|
| 3913 | + if (hw->isp_size[i].w > ISP21_VIR4_MAX_WIDTH || |
|---|
| 3914 | + hw->isp_size[i].size > ISP21_VIR4_MAX_SIZE) |
|---|
| 3915 | + j++; |
|---|
| 3916 | + continue; |
|---|
| 3917 | + } |
|---|
| 3918 | + idx1[k++] = i; |
|---|
| 3919 | + } |
|---|
| 3920 | + if (k) { |
|---|
| 3921 | + is_bigmode = true; |
|---|
| 3922 | + if (k == 2 || j || |
|---|
| 3923 | + hw->isp_size[idx1[k - 1]].size > (ISP21_VIR4_MAX_SIZE + ISP21_VIR2_MAX_SIZE)) { |
|---|
| 3924 | + dev_warn(dev, "isp%d %dx%d over two vir isp max:3840x2160\n", |
|---|
| 3925 | + idx1[k - 1], hw->isp_size[idx1[k - 1]].w, hw->isp_size[idx1[k - 1]].h); |
|---|
| 3926 | + hw->is_multi_overflow = true; |
|---|
| 3927 | + goto multi_overflow; |
|---|
| 3928 | + } else { |
|---|
| 3929 | + if (idx1[0] == ispdev->dev_id) { |
|---|
| 3930 | + ispdev->multi_mode = 0; |
|---|
| 3931 | + ispdev->multi_index = 0; |
|---|
| 3932 | + } else { |
|---|
| 3933 | + ispdev->multi_mode = 2; |
|---|
| 3934 | + ispdev->multi_index = 3; |
|---|
| 3935 | + } |
|---|
| 3936 | + } |
|---|
| 3937 | + } else if (ispdev->multi_index >= hw->dev_link_num) { |
|---|
| 3938 | + ispdev->multi_index = idx2[ispdev->multi_index - hw->dev_link_num]; |
|---|
| 3939 | + } |
|---|
| 3940 | + break; |
|---|
| 3941 | + default: |
|---|
| 3942 | + bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH; |
|---|
| 3943 | + bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE; |
|---|
| 3944 | + ispdev->multi_mode = 0; |
|---|
| 3945 | + ispdev->multi_index = 0; |
|---|
| 3946 | + width = crop->width; |
|---|
| 3947 | + height = crop->height; |
|---|
| 3948 | + size = width * height; |
|---|
| 3949 | + break; |
|---|
| 3950 | + } |
|---|
| 3951 | + |
|---|
| 3952 | +end: |
|---|
| 3953 | + if (!is_bigmode && |
|---|
| 3954 | + (width > bigmode_max_w || size > bigmode_max_size)) |
|---|
| 3955 | + is_bigmode = true; |
|---|
| 3956 | + |
|---|
| 3957 | + return ispdev->is_bigmode = is_bigmode; |
|---|
| 3958 | +} |
|---|
| 3959 | + |
|---|
| 3797 | 3960 | /* Not called when the camera active, thus not isr protection. */ |
|---|
| 3798 | 3961 | static void |
|---|
| 3799 | 3962 | rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev) |
|---|
| 3800 | 3963 | { |
|---|
| 3801 | | - struct device *dev = params_vdev->dev->dev; |
|---|
| 3964 | + struct rkisp_device *dev = params_vdev->dev; |
|---|
| 3802 | 3965 | struct rkisp_isp_params_val_v21 *priv_val = |
|---|
| 3803 | 3966 | (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 = ¶ms_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; |
|---|
| 3810 | 3967 | |
|---|
| 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 | | - |
|---|
| 3968 | + dev->is_bigmode = rkisp_params_check_bigmode_v21(params_vdev); |
|---|
| 3828 | 3969 | spin_lock(¶ms_vdev->config_lock); |
|---|
| 3829 | 3970 | /* override the default things */ |
|---|
| 3830 | 3971 | if (!params_vdev->isp21_params->module_cfg_update && |
|---|
| 3831 | 3972 | !params_vdev->isp21_params->module_en_update) |
|---|
| 3832 | | - dev_warn(dev, "can not get first iq setting in stream on\n"); |
|---|
| 3973 | + dev_warn(dev->dev, "can not get first iq setting in stream on\n"); |
|---|
| 3833 | 3974 | |
|---|
| 3834 | 3975 | priv_val->dhaz_en = 0; |
|---|
| 3835 | 3976 | priv_val->wdr_en = 0; |
|---|
| .. | .. |
|---|
| 3840 | 3981 | __isp_isr_other_config(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL); |
|---|
| 3841 | 3982 | __isp_isr_other_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL); |
|---|
| 3842 | 3983 | __isp_isr_meas_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL); |
|---|
| 3843 | | - if (width > bigmode_max_w || size > bigmode_max_size) { |
|---|
| 3984 | + if (dev->is_bigmode) |
|---|
| 3844 | 3985 | rkisp_set_bits(params_vdev->dev, ISP_CTRL1, |
|---|
| 3845 | 3986 | ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN, |
|---|
| 3846 | 3987 | 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; |
|---|
| 3853 | 3988 | spin_unlock(¶ms_vdev->config_lock); |
|---|
| 3854 | 3989 | } |
|---|
| 3855 | 3990 | |
|---|
| .. | .. |
|---|
| 3958 | 4093 | } |
|---|
| 3959 | 4094 | } |
|---|
| 3960 | 4095 | |
|---|
| 3961 | | -static void |
|---|
| 4096 | +static int |
|---|
| 3962 | 4097 | rkisp_params_set_ldchbuf_size_v2x(struct rkisp_isp_params_vdev *params_vdev, |
|---|
| 3963 | 4098 | void *size) |
|---|
| 3964 | 4099 | { |
|---|
| 3965 | 4100 | struct rkisp_ldchbuf_size *ldchsize = size; |
|---|
| 3966 | 4101 | |
|---|
| 3967 | 4102 | rkisp_deinit_ldch_buf(params_vdev); |
|---|
| 3968 | | - rkisp_init_ldch_buf(params_vdev, ldchsize); |
|---|
| 4103 | + return rkisp_init_ldch_buf(params_vdev, ldchsize); |
|---|
| 4104 | +} |
|---|
| 4105 | + |
|---|
| 4106 | +static void |
|---|
| 4107 | +rkisp_params_free_meshbuf_v21(struct rkisp_isp_params_vdev *params_vdev, |
|---|
| 4108 | + u64 module_id) |
|---|
| 4109 | +{ |
|---|
| 4110 | + rkisp_deinit_ldch_buf(params_vdev); |
|---|
| 3969 | 4111 | } |
|---|
| 3970 | 4112 | |
|---|
| 3971 | 4113 | static void |
|---|
| .. | .. |
|---|
| 4050 | 4192 | { |
|---|
| 4051 | 4193 | struct isp21_isp_params_cfg *new_params = NULL; |
|---|
| 4052 | 4194 | 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; |
|---|
| 4055 | 4195 | |
|---|
| 4056 | 4196 | spin_lock(¶ms_vdev->config_lock); |
|---|
| 4057 | 4197 | if (!params_vdev->streamon) |
|---|
| .. | .. |
|---|
| 4067 | 4207 | list_del(&cur_buf->queue); |
|---|
| 4068 | 4208 | if (list_empty(¶ms_vdev->params)) |
|---|
| 4069 | 4209 | break; |
|---|
| 4070 | | - else if (new_params->module_en_update) { |
|---|
| 4210 | + else if (new_params->module_en_update || |
|---|
| 4211 | + (new_params->module_cfg_update & ISP2X_MODULE_FORCE)) { |
|---|
| 4071 | 4212 | /* update en immediately */ |
|---|
| 4213 | + __isp_isr_meas_config(params_vdev, new_params, type); |
|---|
| 4214 | + __isp_isr_other_config(params_vdev, new_params, type); |
|---|
| 4072 | 4215 | __isp_isr_other_en(params_vdev, new_params, type); |
|---|
| 4073 | 4216 | __isp_isr_meas_en(params_vdev, new_params, type); |
|---|
| 4217 | + new_params->module_cfg_update = 0; |
|---|
| 4074 | 4218 | } |
|---|
| 4075 | 4219 | if (new_params->module_cfg_update & ISP2X_MODULE_LDCH) |
|---|
| 4076 | 4220 | ldch_data_abandon(params_vdev, new_params); |
|---|
| .. | .. |
|---|
| 4093 | 4237 | __isp_isr_other_config(params_vdev, new_params, type); |
|---|
| 4094 | 4238 | __isp_isr_other_en(params_vdev, new_params, type); |
|---|
| 4095 | 4239 | __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); |
|---|
| 4098 | 4240 | |
|---|
| 4099 | 4241 | 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; |
|---|
| 4242 | + new_params->module_cfg_update = 0; |
|---|
| 4107 | 4243 | vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); |
|---|
| 4108 | 4244 | cur_buf = NULL; |
|---|
| 4109 | 4245 | } |
|---|
| .. | .. |
|---|
| 4174 | 4310 | .param_cfgsram = rkisp_params_cfgsram_v21, |
|---|
| 4175 | 4311 | .get_meshbuf_inf = rkisp_params_get_ldchbuf_inf_v2x, |
|---|
| 4176 | 4312 | .set_meshbuf_size = rkisp_params_set_ldchbuf_size_v2x, |
|---|
| 4313 | + .free_meshbuf = rkisp_params_free_meshbuf_v21, |
|---|
| 4177 | 4314 | .stream_stop = rkisp_params_stream_stop_v2x, |
|---|
| 4178 | 4315 | .fop_release = rkisp_params_fop_release_v2x, |
|---|
| 4316 | + .check_bigmode = rkisp_params_check_bigmode_v21, |
|---|
| 4179 | 4317 | }; |
|---|
| 4180 | 4318 | |
|---|
| 4181 | 4319 | int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev) |
|---|