1 // SPDX-License-Identifier: (GPL-2.0+ OR MIT) 2 /* 3 * Rockchip ISP1 Driver - Params subdevice 4 * 5 * Copyright (C) 2017 Rockchip Electronics Co., Ltd. 6 */ 7 8 #include <media/v4l2-common.h> 9 #include <media/v4l2-event.h> 10 #include <media/v4l2-ioctl.h> 11 #include <media/videobuf2-core.h> 12 #include <media/videobuf2-vmalloc.h> /* for ISP params */ 13 14 #include "rkisp1-common.h" 15 16 #define RKISP1_PARAMS_DEV_NAME RKISP1_DRIVER_NAME "_params" 17 18 #define RKISP1_ISP_PARAMS_REQ_BUFS_MIN 2 19 #define RKISP1_ISP_PARAMS_REQ_BUFS_MAX 8 20 21 #define RKISP1_ISP_DPCC_METHODS_SET(n) \ 22 (RKISP1_CIF_ISP_DPCC_METHODS_SET_1 + 0x4 * (n)) 23 #define RKISP1_ISP_DPCC_LINE_THRESH(n) \ 24 (RKISP1_CIF_ISP_DPCC_LINE_THRESH_1 + 0x14 * (n)) 25 #define RKISP1_ISP_DPCC_LINE_MAD_FAC(n) \ 26 (RKISP1_CIF_ISP_DPCC_LINE_MAD_FAC_1 + 0x14 * (n)) 27 #define RKISP1_ISP_DPCC_PG_FAC(n) \ 28 (RKISP1_CIF_ISP_DPCC_PG_FAC_1 + 0x14 * (n)) 29 #define RKISP1_ISP_DPCC_RND_THRESH(n) \ 30 (RKISP1_CIF_ISP_DPCC_RND_THRESH_1 + 0x14 * (n)) 31 #define RKISP1_ISP_DPCC_RG_FAC(n) \ 32 (RKISP1_CIF_ISP_DPCC_RG_FAC_1 + 0x14 * (n)) 33 #define RKISP1_ISP_CC_COEFF(n) \ 34 (RKISP1_CIF_ISP_CC_COEFF_0 + (n) * 4) 35 36 static inline void 37 rkisp1_param_set_bits(struct rkisp1_params *params, u32 reg, u32 bit_mask) 38 { 39 u32 val; 40 41 val = rkisp1_read(params->rkisp1, reg); 42 rkisp1_write(params->rkisp1, reg, val | bit_mask); 43 } 44 45 static inline void 46 rkisp1_param_clear_bits(struct rkisp1_params *params, u32 reg, u32 bit_mask) 47 { 48 u32 val; 49 50 val = rkisp1_read(params->rkisp1, reg); 51 rkisp1_write(params->rkisp1, reg, val & ~bit_mask); 52 } 53 54 /* ISP BP interface function */ 55 static void rkisp1_dpcc_config(struct rkisp1_params *params, 56 const struct rkisp1_cif_isp_dpcc_config *arg) 57 { 58 unsigned int i; 59 u32 mode; 60 61 /* 62 * The enable bit is controlled in rkisp1_isp_isr_other_config() and 63 * must be preserved. The grayscale mode should be configured 64 * automatically based on the media bus code on the ISP sink pad, so 65 * only the STAGE1_ENABLE bit can be set by userspace. 66 */ 67 mode = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_DPCC_MODE); 68 mode &= RKISP1_CIF_ISP_DPCC_MODE_DPCC_ENABLE; 69 mode |= arg->mode & RKISP1_CIF_ISP_DPCC_MODE_STAGE1_ENABLE; 70 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPCC_MODE, mode); 71 72 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPCC_OUTPUT_MODE, 73 arg->output_mode & RKISP1_CIF_ISP_DPCC_OUTPUT_MODE_MASK); 74 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPCC_SET_USE, 75 arg->set_use & RKISP1_CIF_ISP_DPCC_SET_USE_MASK); 76 77 for (i = 0; i < RKISP1_CIF_ISP_DPCC_METHODS_MAX; i++) { 78 rkisp1_write(params->rkisp1, RKISP1_ISP_DPCC_METHODS_SET(i), 79 arg->methods[i].method & 80 RKISP1_CIF_ISP_DPCC_METHODS_SET_MASK); 81 rkisp1_write(params->rkisp1, RKISP1_ISP_DPCC_LINE_THRESH(i), 82 arg->methods[i].line_thresh & 83 RKISP1_CIF_ISP_DPCC_LINE_THRESH_MASK); 84 rkisp1_write(params->rkisp1, RKISP1_ISP_DPCC_LINE_MAD_FAC(i), 85 arg->methods[i].line_mad_fac & 86 RKISP1_CIF_ISP_DPCC_LINE_MAD_FAC_MASK); 87 rkisp1_write(params->rkisp1, RKISP1_ISP_DPCC_PG_FAC(i), 88 arg->methods[i].pg_fac & 89 RKISP1_CIF_ISP_DPCC_PG_FAC_MASK); 90 rkisp1_write(params->rkisp1, RKISP1_ISP_DPCC_RND_THRESH(i), 91 arg->methods[i].rnd_thresh & 92 RKISP1_CIF_ISP_DPCC_RND_THRESH_MASK); 93 rkisp1_write(params->rkisp1, RKISP1_ISP_DPCC_RG_FAC(i), 94 arg->methods[i].rg_fac & 95 RKISP1_CIF_ISP_DPCC_RG_FAC_MASK); 96 } 97 98 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPCC_RND_OFFS, 99 arg->rnd_offs & RKISP1_CIF_ISP_DPCC_RND_OFFS_MASK); 100 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPCC_RO_LIMITS, 101 arg->ro_limits & RKISP1_CIF_ISP_DPCC_RO_LIMIT_MASK); 102 } 103 104 /* ISP black level subtraction interface function */ 105 static void rkisp1_bls_config(struct rkisp1_params *params, 106 const struct rkisp1_cif_isp_bls_config *arg) 107 { 108 /* avoid to override the old enable value */ 109 u32 new_control; 110 111 new_control = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_BLS_CTRL); 112 new_control &= RKISP1_CIF_ISP_BLS_ENA; 113 /* fixed subtraction values */ 114 if (!arg->enable_auto) { 115 const struct rkisp1_cif_isp_bls_fixed_val *pval = 116 &arg->fixed_val; 117 118 switch (params->raw_type) { 119 case RKISP1_RAW_BGGR: 120 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_D_FIXED, 121 pval->r); 122 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_C_FIXED, 123 pval->gr); 124 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_B_FIXED, 125 pval->gb); 126 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_A_FIXED, 127 pval->b); 128 break; 129 case RKISP1_RAW_GBRG: 130 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_C_FIXED, 131 pval->r); 132 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_D_FIXED, 133 pval->gr); 134 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_A_FIXED, 135 pval->gb); 136 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_B_FIXED, 137 pval->b); 138 break; 139 case RKISP1_RAW_GRBG: 140 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_B_FIXED, 141 pval->r); 142 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_A_FIXED, 143 pval->gr); 144 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_D_FIXED, 145 pval->gb); 146 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_C_FIXED, 147 pval->b); 148 break; 149 case RKISP1_RAW_RGGB: 150 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_A_FIXED, 151 pval->r); 152 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_B_FIXED, 153 pval->gr); 154 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_C_FIXED, 155 pval->gb); 156 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_D_FIXED, 157 pval->b); 158 break; 159 default: 160 break; 161 } 162 163 } else { 164 if (arg->en_windows & BIT(1)) { 165 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_H2_START, 166 arg->bls_window2.h_offs); 167 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_H2_STOP, 168 arg->bls_window2.h_size); 169 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_V2_START, 170 arg->bls_window2.v_offs); 171 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_V2_STOP, 172 arg->bls_window2.v_size); 173 new_control |= RKISP1_CIF_ISP_BLS_WINDOW_2; 174 } 175 176 if (arg->en_windows & BIT(0)) { 177 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_H1_START, 178 arg->bls_window1.h_offs); 179 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_H1_STOP, 180 arg->bls_window1.h_size); 181 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_V1_START, 182 arg->bls_window1.v_offs); 183 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_V1_STOP, 184 arg->bls_window1.v_size); 185 new_control |= RKISP1_CIF_ISP_BLS_WINDOW_1; 186 } 187 188 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_SAMPLES, 189 arg->bls_samples); 190 191 new_control |= RKISP1_CIF_ISP_BLS_MODE_MEASURED; 192 } 193 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_BLS_CTRL, new_control); 194 } 195 196 /* ISP LS correction interface function */ 197 static void 198 rkisp1_lsc_matrix_config_v10(struct rkisp1_params *params, 199 const struct rkisp1_cif_isp_lsc_config *pconfig) 200 { 201 struct rkisp1_device *rkisp1 = params->rkisp1; 202 u32 lsc_status, sram_addr, lsc_table_sel; 203 unsigned int i, j; 204 205 lsc_status = rkisp1_read(rkisp1, RKISP1_CIF_ISP_LSC_STATUS); 206 207 /* RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */ 208 sram_addr = lsc_status & RKISP1_CIF_ISP_LSC_ACTIVE_TABLE ? 209 RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_0 : 210 RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_153; 211 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_R_TABLE_ADDR, sram_addr); 212 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GR_TABLE_ADDR, sram_addr); 213 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GB_TABLE_ADDR, sram_addr); 214 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_B_TABLE_ADDR, sram_addr); 215 216 /* program data tables (table size is 9 * 17 = 153) */ 217 for (i = 0; i < RKISP1_CIF_ISP_LSC_SAMPLES_MAX; i++) { 218 const __u16 *r_tbl = pconfig->r_data_tbl[i]; 219 const __u16 *gr_tbl = pconfig->gr_data_tbl[i]; 220 const __u16 *gb_tbl = pconfig->gb_data_tbl[i]; 221 const __u16 *b_tbl = pconfig->b_data_tbl[i]; 222 223 /* 224 * 17 sectors with 2 values in one DWORD = 9 225 * DWORDs (2nd value of last DWORD unused) 226 */ 227 for (j = 0; j < RKISP1_CIF_ISP_LSC_SAMPLES_MAX - 1; j += 2) { 228 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_R_TABLE_DATA, 229 RKISP1_CIF_ISP_LSC_TABLE_DATA_V10( 230 r_tbl[j], r_tbl[j + 1])); 231 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GR_TABLE_DATA, 232 RKISP1_CIF_ISP_LSC_TABLE_DATA_V10( 233 gr_tbl[j], gr_tbl[j + 1])); 234 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GB_TABLE_DATA, 235 RKISP1_CIF_ISP_LSC_TABLE_DATA_V10( 236 gb_tbl[j], gb_tbl[j + 1])); 237 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_B_TABLE_DATA, 238 RKISP1_CIF_ISP_LSC_TABLE_DATA_V10( 239 b_tbl[j], b_tbl[j + 1])); 240 } 241 242 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_R_TABLE_DATA, 243 RKISP1_CIF_ISP_LSC_TABLE_DATA_V10(r_tbl[j], 0)); 244 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GR_TABLE_DATA, 245 RKISP1_CIF_ISP_LSC_TABLE_DATA_V10(gr_tbl[j], 0)); 246 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GB_TABLE_DATA, 247 RKISP1_CIF_ISP_LSC_TABLE_DATA_V10(gb_tbl[j], 0)); 248 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_B_TABLE_DATA, 249 RKISP1_CIF_ISP_LSC_TABLE_DATA_V10(b_tbl[j], 0)); 250 } 251 252 lsc_table_sel = lsc_status & RKISP1_CIF_ISP_LSC_ACTIVE_TABLE ? 253 RKISP1_CIF_ISP_LSC_TABLE_0 : RKISP1_CIF_ISP_LSC_TABLE_1; 254 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_TABLE_SEL, lsc_table_sel); 255 } 256 257 static void 258 rkisp1_lsc_matrix_config_v12(struct rkisp1_params *params, 259 const struct rkisp1_cif_isp_lsc_config *pconfig) 260 { 261 struct rkisp1_device *rkisp1 = params->rkisp1; 262 u32 lsc_status, sram_addr, lsc_table_sel; 263 unsigned int i, j; 264 265 lsc_status = rkisp1_read(rkisp1, RKISP1_CIF_ISP_LSC_STATUS); 266 267 /* RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */ 268 sram_addr = lsc_status & RKISP1_CIF_ISP_LSC_ACTIVE_TABLE ? 269 RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_0 : 270 RKISP1_CIF_ISP_LSC_TABLE_ADDRESS_153; 271 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_R_TABLE_ADDR, sram_addr); 272 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GR_TABLE_ADDR, sram_addr); 273 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GB_TABLE_ADDR, sram_addr); 274 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_B_TABLE_ADDR, sram_addr); 275 276 /* program data tables (table size is 9 * 17 = 153) */ 277 for (i = 0; i < RKISP1_CIF_ISP_LSC_SAMPLES_MAX; i++) { 278 const __u16 *r_tbl = pconfig->r_data_tbl[i]; 279 const __u16 *gr_tbl = pconfig->gr_data_tbl[i]; 280 const __u16 *gb_tbl = pconfig->gb_data_tbl[i]; 281 const __u16 *b_tbl = pconfig->b_data_tbl[i]; 282 283 /* 284 * 17 sectors with 2 values in one DWORD = 9 285 * DWORDs (2nd value of last DWORD unused) 286 */ 287 for (j = 0; j < RKISP1_CIF_ISP_LSC_SAMPLES_MAX - 1; j += 2) { 288 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_R_TABLE_DATA, 289 RKISP1_CIF_ISP_LSC_TABLE_DATA_V12( 290 r_tbl[j], r_tbl[j + 1])); 291 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GR_TABLE_DATA, 292 RKISP1_CIF_ISP_LSC_TABLE_DATA_V12( 293 gr_tbl[j], gr_tbl[j + 1])); 294 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GB_TABLE_DATA, 295 RKISP1_CIF_ISP_LSC_TABLE_DATA_V12( 296 gb_tbl[j], gb_tbl[j + 1])); 297 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_B_TABLE_DATA, 298 RKISP1_CIF_ISP_LSC_TABLE_DATA_V12( 299 b_tbl[j], b_tbl[j + 1])); 300 } 301 302 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_R_TABLE_DATA, 303 RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(r_tbl[j], 0)); 304 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GR_TABLE_DATA, 305 RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(gr_tbl[j], 0)); 306 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_GB_TABLE_DATA, 307 RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(gb_tbl[j], 0)); 308 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_B_TABLE_DATA, 309 RKISP1_CIF_ISP_LSC_TABLE_DATA_V12(b_tbl[j], 0)); 310 } 311 312 lsc_table_sel = lsc_status & RKISP1_CIF_ISP_LSC_ACTIVE_TABLE ? 313 RKISP1_CIF_ISP_LSC_TABLE_0 : RKISP1_CIF_ISP_LSC_TABLE_1; 314 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_TABLE_SEL, lsc_table_sel); 315 } 316 317 static void rkisp1_lsc_config(struct rkisp1_params *params, 318 const struct rkisp1_cif_isp_lsc_config *arg) 319 { 320 struct rkisp1_device *rkisp1 = params->rkisp1; 321 u32 lsc_ctrl, data; 322 unsigned int i; 323 324 /* To config must be off , store the current status firstly */ 325 lsc_ctrl = rkisp1_read(rkisp1, RKISP1_CIF_ISP_LSC_CTRL); 326 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_LSC_CTRL, 327 RKISP1_CIF_ISP_LSC_CTRL_ENA); 328 params->ops->lsc_matrix_config(params, arg); 329 330 for (i = 0; i < RKISP1_CIF_ISP_LSC_SECTORS_TBL_SIZE / 2; i++) { 331 /* program x size tables */ 332 data = RKISP1_CIF_ISP_LSC_SECT_SIZE(arg->x_size_tbl[i * 2], 333 arg->x_size_tbl[i * 2 + 1]); 334 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_XSIZE(i), data); 335 336 /* program x grad tables */ 337 data = RKISP1_CIF_ISP_LSC_SECT_GRAD(arg->x_grad_tbl[i * 2], 338 arg->x_grad_tbl[i * 2 + 1]); 339 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_XGRAD(i), data); 340 341 /* program y size tables */ 342 data = RKISP1_CIF_ISP_LSC_SECT_SIZE(arg->y_size_tbl[i * 2], 343 arg->y_size_tbl[i * 2 + 1]); 344 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_YSIZE(i), data); 345 346 /* program y grad tables */ 347 data = RKISP1_CIF_ISP_LSC_SECT_GRAD(arg->y_grad_tbl[i * 2], 348 arg->y_grad_tbl[i * 2 + 1]); 349 rkisp1_write(rkisp1, RKISP1_CIF_ISP_LSC_YGRAD(i), data); 350 } 351 352 /* restore the lsc ctrl status */ 353 if (lsc_ctrl & RKISP1_CIF_ISP_LSC_CTRL_ENA) 354 rkisp1_param_set_bits(params, RKISP1_CIF_ISP_LSC_CTRL, 355 RKISP1_CIF_ISP_LSC_CTRL_ENA); 356 else 357 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_LSC_CTRL, 358 RKISP1_CIF_ISP_LSC_CTRL_ENA); 359 } 360 361 /* ISP Filtering function */ 362 static void rkisp1_flt_config(struct rkisp1_params *params, 363 const struct rkisp1_cif_isp_flt_config *arg) 364 { 365 u32 filt_mode; 366 367 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_THRESH_BL0, 368 arg->thresh_bl0); 369 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_THRESH_BL1, 370 arg->thresh_bl1); 371 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_THRESH_SH0, 372 arg->thresh_sh0); 373 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_THRESH_SH1, 374 arg->thresh_sh1); 375 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_FAC_BL0, 376 arg->fac_bl0); 377 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_FAC_BL1, 378 arg->fac_bl1); 379 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_FAC_MID, 380 arg->fac_mid); 381 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_FAC_SH0, 382 arg->fac_sh0); 383 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_FAC_SH1, 384 arg->fac_sh1); 385 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_LUM_WEIGHT, 386 arg->lum_weight); 387 388 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_MODE, 389 (arg->mode ? RKISP1_CIF_ISP_FLT_MODE_DNR : 0) | 390 RKISP1_CIF_ISP_FLT_CHROMA_V_MODE(arg->chr_v_mode) | 391 RKISP1_CIF_ISP_FLT_CHROMA_H_MODE(arg->chr_h_mode) | 392 RKISP1_CIF_ISP_FLT_GREEN_STAGE1(arg->grn_stage1)); 393 394 /* avoid to override the old enable value */ 395 filt_mode = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_FILT_MODE); 396 filt_mode &= RKISP1_CIF_ISP_FLT_ENA; 397 if (arg->mode) 398 filt_mode |= RKISP1_CIF_ISP_FLT_MODE_DNR; 399 filt_mode |= RKISP1_CIF_ISP_FLT_CHROMA_V_MODE(arg->chr_v_mode) | 400 RKISP1_CIF_ISP_FLT_CHROMA_H_MODE(arg->chr_h_mode) | 401 RKISP1_CIF_ISP_FLT_GREEN_STAGE1(arg->grn_stage1); 402 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_FILT_MODE, filt_mode); 403 } 404 405 /* ISP demosaic interface function */ 406 static int rkisp1_bdm_config(struct rkisp1_params *params, 407 const struct rkisp1_cif_isp_bdm_config *arg) 408 { 409 u32 bdm_th; 410 411 /* avoid to override the old enable value */ 412 bdm_th = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_DEMOSAIC); 413 bdm_th &= RKISP1_CIF_ISP_DEMOSAIC_BYPASS; 414 bdm_th |= arg->demosaic_th & ~RKISP1_CIF_ISP_DEMOSAIC_BYPASS; 415 /* set demosaic threshold */ 416 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DEMOSAIC, bdm_th); 417 return 0; 418 } 419 420 /* ISP GAMMA correction interface function */ 421 static void rkisp1_sdg_config(struct rkisp1_params *params, 422 const struct rkisp1_cif_isp_sdg_config *arg) 423 { 424 unsigned int i; 425 426 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_GAMMA_DX_LO, 427 arg->xa_pnts.gamma_dx0); 428 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_GAMMA_DX_HI, 429 arg->xa_pnts.gamma_dx1); 430 431 for (i = 0; i < RKISP1_CIF_ISP_DEGAMMA_CURVE_SIZE; i++) { 432 rkisp1_write(params->rkisp1, 433 RKISP1_CIF_ISP_GAMMA_R_Y0 + i * 4, 434 arg->curve_r.gamma_y[i]); 435 rkisp1_write(params->rkisp1, 436 RKISP1_CIF_ISP_GAMMA_G_Y0 + i * 4, 437 arg->curve_g.gamma_y[i]); 438 rkisp1_write(params->rkisp1, 439 RKISP1_CIF_ISP_GAMMA_B_Y0 + i * 4, 440 arg->curve_b.gamma_y[i]); 441 } 442 } 443 444 /* ISP GAMMA correction interface function */ 445 static void rkisp1_goc_config_v10(struct rkisp1_params *params, 446 const struct rkisp1_cif_isp_goc_config *arg) 447 { 448 unsigned int i; 449 450 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL, 451 RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA); 452 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_GAMMA_OUT_MODE_V10, 453 arg->mode); 454 455 for (i = 0; i < RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10; i++) 456 rkisp1_write(params->rkisp1, 457 RKISP1_CIF_ISP_GAMMA_OUT_Y_0_V10 + i * 4, 458 arg->gamma_y[i]); 459 } 460 461 static void rkisp1_goc_config_v12(struct rkisp1_params *params, 462 const struct rkisp1_cif_isp_goc_config *arg) 463 { 464 unsigned int i; 465 u32 value; 466 467 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL, 468 RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA); 469 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_GAMMA_OUT_MODE_V12, 470 arg->mode); 471 472 for (i = 0; i < RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V12 / 2; i++) { 473 value = RKISP1_CIF_ISP_GAMMA_VALUE_V12( 474 arg->gamma_y[2 * i + 1], 475 arg->gamma_y[2 * i]); 476 rkisp1_write(params->rkisp1, 477 RKISP1_CIF_ISP_GAMMA_OUT_Y_0_V12 + i * 4, value); 478 } 479 } 480 481 /* ISP Cross Talk */ 482 static void rkisp1_ctk_config(struct rkisp1_params *params, 483 const struct rkisp1_cif_isp_ctk_config *arg) 484 { 485 unsigned int i, j, k = 0; 486 487 for (i = 0; i < 3; i++) 488 for (j = 0; j < 3; j++) 489 rkisp1_write(params->rkisp1, 490 RKISP1_CIF_ISP_CT_COEFF_0 + 4 * k++, 491 arg->coeff[i][j]); 492 for (i = 0; i < 3; i++) 493 rkisp1_write(params->rkisp1, 494 RKISP1_CIF_ISP_CT_OFFSET_R + i * 4, 495 arg->ct_offset[i]); 496 } 497 498 static void rkisp1_ctk_enable(struct rkisp1_params *params, bool en) 499 { 500 if (en) 501 return; 502 503 /* Write back the default values. */ 504 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_0, 0x80); 505 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_1, 0); 506 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_2, 0); 507 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_3, 0); 508 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_4, 0x80); 509 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_5, 0); 510 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_6, 0); 511 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_7, 0); 512 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_COEFF_8, 0x80); 513 514 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_OFFSET_R, 0); 515 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_OFFSET_G, 0); 516 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CT_OFFSET_B, 0); 517 } 518 519 /* ISP White Balance Mode */ 520 static void rkisp1_awb_meas_config_v10(struct rkisp1_params *params, 521 const struct rkisp1_cif_isp_awb_meas_config *arg) 522 { 523 u32 reg_val = 0; 524 /* based on the mode,configure the awb module */ 525 if (arg->awb_mode == RKISP1_CIF_ISP_AWB_MODE_YCBCR) { 526 /* Reference Cb and Cr */ 527 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_REF_V10, 528 RKISP1_CIF_ISP_AWB_REF_CR_SET(arg->awb_ref_cr) | 529 arg->awb_ref_cb); 530 /* Yc Threshold */ 531 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_THRESH_V10, 532 RKISP1_CIF_ISP_AWB_MAX_Y_SET(arg->max_y) | 533 RKISP1_CIF_ISP_AWB_MIN_Y_SET(arg->min_y) | 534 RKISP1_CIF_ISP_AWB_MAX_CS_SET(arg->max_csum) | 535 arg->min_c); 536 } 537 538 reg_val = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V10); 539 if (arg->enable_ymax_cmp) 540 reg_val |= RKISP1_CIF_ISP_AWB_YMAX_CMP_EN; 541 else 542 reg_val &= ~RKISP1_CIF_ISP_AWB_YMAX_CMP_EN; 543 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V10, reg_val); 544 545 /* window offset */ 546 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_WND_V_OFFS_V10, 547 arg->awb_wnd.v_offs); 548 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_WND_H_OFFS_V10, 549 arg->awb_wnd.h_offs); 550 /* AWB window size */ 551 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_WND_V_SIZE_V10, 552 arg->awb_wnd.v_size); 553 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_WND_H_SIZE_V10, 554 arg->awb_wnd.h_size); 555 /* Number of frames */ 556 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_FRAMES_V10, 557 arg->frames); 558 } 559 560 static void rkisp1_awb_meas_config_v12(struct rkisp1_params *params, 561 const struct rkisp1_cif_isp_awb_meas_config *arg) 562 { 563 u32 reg_val = 0; 564 /* based on the mode,configure the awb module */ 565 if (arg->awb_mode == RKISP1_CIF_ISP_AWB_MODE_YCBCR) { 566 /* Reference Cb and Cr */ 567 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_REF_V12, 568 RKISP1_CIF_ISP_AWB_REF_CR_SET(arg->awb_ref_cr) | 569 arg->awb_ref_cb); 570 /* Yc Threshold */ 571 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_THRESH_V12, 572 RKISP1_CIF_ISP_AWB_MAX_Y_SET(arg->max_y) | 573 RKISP1_CIF_ISP_AWB_MIN_Y_SET(arg->min_y) | 574 RKISP1_CIF_ISP_AWB_MAX_CS_SET(arg->max_csum) | 575 arg->min_c); 576 } 577 578 reg_val = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V12); 579 if (arg->enable_ymax_cmp) 580 reg_val |= RKISP1_CIF_ISP_AWB_YMAX_CMP_EN; 581 else 582 reg_val &= ~RKISP1_CIF_ISP_AWB_YMAX_CMP_EN; 583 reg_val &= ~RKISP1_CIF_ISP_AWB_SET_FRAMES_MASK_V12; 584 reg_val |= RKISP1_CIF_ISP_AWB_SET_FRAMES_V12(arg->frames); 585 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V12, reg_val); 586 587 /* window offset */ 588 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_OFFS_V12, 589 arg->awb_wnd.v_offs << 16 | arg->awb_wnd.h_offs); 590 /* AWB window size */ 591 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_SIZE_V12, 592 arg->awb_wnd.v_size << 16 | arg->awb_wnd.h_size); 593 } 594 595 static void 596 rkisp1_awb_meas_enable_v10(struct rkisp1_params *params, 597 const struct rkisp1_cif_isp_awb_meas_config *arg, 598 bool en) 599 { 600 u32 reg_val = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V10); 601 602 /* switch off */ 603 reg_val &= RKISP1_CIF_ISP_AWB_MODE_MASK_NONE; 604 605 if (en) { 606 if (arg->awb_mode == RKISP1_CIF_ISP_AWB_MODE_RGB) 607 reg_val |= RKISP1_CIF_ISP_AWB_MODE_RGB_EN; 608 else 609 reg_val |= RKISP1_CIF_ISP_AWB_MODE_YCBCR_EN; 610 611 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V10, 612 reg_val); 613 614 /* Measurements require AWB block be active. */ 615 rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL, 616 RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA); 617 } else { 618 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V10, 619 reg_val); 620 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL, 621 RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA); 622 } 623 } 624 625 static void 626 rkisp1_awb_meas_enable_v12(struct rkisp1_params *params, 627 const struct rkisp1_cif_isp_awb_meas_config *arg, 628 bool en) 629 { 630 u32 reg_val = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V12); 631 632 /* switch off */ 633 reg_val &= RKISP1_CIF_ISP_AWB_MODE_MASK_NONE; 634 635 if (en) { 636 if (arg->awb_mode == RKISP1_CIF_ISP_AWB_MODE_RGB) 637 reg_val |= RKISP1_CIF_ISP_AWB_MODE_RGB_EN; 638 else 639 reg_val |= RKISP1_CIF_ISP_AWB_MODE_YCBCR_EN; 640 641 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V12, 642 reg_val); 643 644 /* Measurements require AWB block be active. */ 645 rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL, 646 RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA); 647 } else { 648 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_PROP_V12, 649 reg_val); 650 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL, 651 RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA); 652 } 653 } 654 655 static void 656 rkisp1_awb_gain_config_v10(struct rkisp1_params *params, 657 const struct rkisp1_cif_isp_awb_gain_config *arg) 658 { 659 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_GAIN_G_V10, 660 RKISP1_CIF_ISP_AWB_GAIN_R_SET(arg->gain_green_r) | 661 arg->gain_green_b); 662 663 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_GAIN_RB_V10, 664 RKISP1_CIF_ISP_AWB_GAIN_R_SET(arg->gain_red) | 665 arg->gain_blue); 666 } 667 668 static void 669 rkisp1_awb_gain_config_v12(struct rkisp1_params *params, 670 const struct rkisp1_cif_isp_awb_gain_config *arg) 671 { 672 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_GAIN_G_V12, 673 RKISP1_CIF_ISP_AWB_GAIN_R_SET(arg->gain_green_r) | 674 arg->gain_green_b); 675 676 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AWB_GAIN_RB_V12, 677 RKISP1_CIF_ISP_AWB_GAIN_R_SET(arg->gain_red) | 678 arg->gain_blue); 679 } 680 681 static void rkisp1_aec_config_v10(struct rkisp1_params *params, 682 const struct rkisp1_cif_isp_aec_config *arg) 683 { 684 unsigned int block_hsize, block_vsize; 685 u32 exp_ctrl; 686 687 /* avoid to override the old enable value */ 688 exp_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_EXP_CTRL); 689 exp_ctrl &= RKISP1_CIF_ISP_EXP_ENA; 690 if (arg->autostop) 691 exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_AUTOSTOP; 692 if (arg->mode == RKISP1_CIF_ISP_EXP_MEASURING_MODE_1) 693 exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_MEASMODE_1; 694 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_CTRL, exp_ctrl); 695 696 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_H_OFFSET_V10, 697 arg->meas_window.h_offs); 698 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_V_OFFSET_V10, 699 arg->meas_window.v_offs); 700 701 block_hsize = arg->meas_window.h_size / 702 RKISP1_CIF_ISP_EXP_COLUMN_NUM_V10 - 1; 703 block_vsize = arg->meas_window.v_size / 704 RKISP1_CIF_ISP_EXP_ROW_NUM_V10 - 1; 705 706 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_H_SIZE_V10, 707 RKISP1_CIF_ISP_EXP_H_SIZE_SET_V10(block_hsize)); 708 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_V_SIZE_V10, 709 RKISP1_CIF_ISP_EXP_V_SIZE_SET_V10(block_vsize)); 710 } 711 712 static void rkisp1_aec_config_v12(struct rkisp1_params *params, 713 const struct rkisp1_cif_isp_aec_config *arg) 714 { 715 u32 exp_ctrl; 716 u32 block_hsize, block_vsize; 717 u32 wnd_num_idx = 1; 718 const u32 ae_wnd_num[] = { 5, 9, 15, 15 }; 719 720 /* avoid to override the old enable value */ 721 exp_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_EXP_CTRL); 722 exp_ctrl &= RKISP1_CIF_ISP_EXP_ENA; 723 if (arg->autostop) 724 exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_AUTOSTOP; 725 if (arg->mode == RKISP1_CIF_ISP_EXP_MEASURING_MODE_1) 726 exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_MEASMODE_1; 727 exp_ctrl |= RKISP1_CIF_ISP_EXP_CTRL_WNDNUM_SET_V12(wnd_num_idx); 728 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_CTRL, exp_ctrl); 729 730 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_OFFS_V12, 731 RKISP1_CIF_ISP_EXP_V_OFFSET_SET_V12(arg->meas_window.v_offs) | 732 RKISP1_CIF_ISP_EXP_H_OFFSET_SET_V12(arg->meas_window.h_offs)); 733 734 block_hsize = arg->meas_window.h_size / ae_wnd_num[wnd_num_idx] - 1; 735 block_vsize = arg->meas_window.v_size / ae_wnd_num[wnd_num_idx] - 1; 736 737 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_EXP_SIZE_V12, 738 RKISP1_CIF_ISP_EXP_V_SIZE_SET_V12(block_vsize) | 739 RKISP1_CIF_ISP_EXP_H_SIZE_SET_V12(block_hsize)); 740 } 741 742 static void rkisp1_cproc_config(struct rkisp1_params *params, 743 const struct rkisp1_cif_isp_cproc_config *arg) 744 { 745 struct rkisp1_cif_isp_isp_other_cfg *cur_other_cfg = 746 container_of(arg, struct rkisp1_cif_isp_isp_other_cfg, cproc_config); 747 struct rkisp1_cif_isp_ie_config *cur_ie_config = 748 &cur_other_cfg->ie_config; 749 u32 effect = cur_ie_config->effect; 750 u32 quantization = params->quantization; 751 752 rkisp1_write(params->rkisp1, RKISP1_CIF_C_PROC_CONTRAST, 753 arg->contrast); 754 rkisp1_write(params->rkisp1, RKISP1_CIF_C_PROC_HUE, arg->hue); 755 rkisp1_write(params->rkisp1, RKISP1_CIF_C_PROC_SATURATION, arg->sat); 756 rkisp1_write(params->rkisp1, RKISP1_CIF_C_PROC_BRIGHTNESS, 757 arg->brightness); 758 759 if (quantization != V4L2_QUANTIZATION_FULL_RANGE || 760 effect != V4L2_COLORFX_NONE) { 761 rkisp1_param_clear_bits(params, RKISP1_CIF_C_PROC_CTRL, 762 RKISP1_CIF_C_PROC_YOUT_FULL | 763 RKISP1_CIF_C_PROC_YIN_FULL | 764 RKISP1_CIF_C_PROC_COUT_FULL); 765 } else { 766 rkisp1_param_set_bits(params, RKISP1_CIF_C_PROC_CTRL, 767 RKISP1_CIF_C_PROC_YOUT_FULL | 768 RKISP1_CIF_C_PROC_YIN_FULL | 769 RKISP1_CIF_C_PROC_COUT_FULL); 770 } 771 } 772 773 static void rkisp1_hst_config_v10(struct rkisp1_params *params, 774 const struct rkisp1_cif_isp_hst_config *arg) 775 { 776 unsigned int block_hsize, block_vsize; 777 static const u32 hist_weight_regs[] = { 778 RKISP1_CIF_ISP_HIST_WEIGHT_00TO30_V10, 779 RKISP1_CIF_ISP_HIST_WEIGHT_40TO21_V10, 780 RKISP1_CIF_ISP_HIST_WEIGHT_31TO12_V10, 781 RKISP1_CIF_ISP_HIST_WEIGHT_22TO03_V10, 782 RKISP1_CIF_ISP_HIST_WEIGHT_13TO43_V10, 783 RKISP1_CIF_ISP_HIST_WEIGHT_04TO34_V10, 784 }; 785 const u8 *weight; 786 unsigned int i; 787 u32 hist_prop; 788 789 /* avoid to override the old enable value */ 790 hist_prop = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_HIST_PROP_V10); 791 hist_prop &= RKISP1_CIF_ISP_HIST_PROP_MODE_MASK_V10; 792 hist_prop |= RKISP1_CIF_ISP_HIST_PREDIV_SET_V10(arg->histogram_predivider); 793 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_PROP_V10, hist_prop); 794 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_H_OFFS_V10, 795 arg->meas_window.h_offs); 796 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_V_OFFS_V10, 797 arg->meas_window.v_offs); 798 799 block_hsize = arg->meas_window.h_size / 800 RKISP1_CIF_ISP_HIST_COLUMN_NUM_V10 - 1; 801 block_vsize = arg->meas_window.v_size / RKISP1_CIF_ISP_HIST_ROW_NUM_V10 - 1; 802 803 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_H_SIZE_V10, 804 block_hsize); 805 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_V_SIZE_V10, 806 block_vsize); 807 808 weight = arg->hist_weight; 809 for (i = 0; i < ARRAY_SIZE(hist_weight_regs); ++i, weight += 4) 810 rkisp1_write(params->rkisp1, hist_weight_regs[i], 811 RKISP1_CIF_ISP_HIST_WEIGHT_SET_V10(weight[0], weight[1], 812 weight[2], weight[3])); 813 814 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_WEIGHT_44_V10, 815 weight[0] & 0x1F); 816 } 817 818 static void rkisp1_hst_config_v12(struct rkisp1_params *params, 819 const struct rkisp1_cif_isp_hst_config *arg) 820 { 821 unsigned int i, j; 822 u32 block_hsize, block_vsize; 823 u32 wnd_num_idx, hist_weight_num, hist_ctrl, value; 824 u8 weight15x15[RKISP1_CIF_ISP_HIST_WEIGHT_REG_SIZE_V12]; 825 const u32 hist_wnd_num[] = { 5, 9, 15, 15 }; 826 827 /* now we just support 9x9 window */ 828 wnd_num_idx = 1; 829 memset(weight15x15, 0x00, sizeof(weight15x15)); 830 /* avoid to override the old enable value */ 831 hist_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_HIST_CTRL_V12); 832 hist_ctrl &= RKISP1_CIF_ISP_HIST_CTRL_MODE_MASK_V12 | 833 RKISP1_CIF_ISP_HIST_CTRL_EN_MASK_V12; 834 hist_ctrl = hist_ctrl | 835 RKISP1_CIF_ISP_HIST_CTRL_INTRSEL_SET_V12(1) | 836 RKISP1_CIF_ISP_HIST_CTRL_DATASEL_SET_V12(0) | 837 RKISP1_CIF_ISP_HIST_CTRL_WATERLINE_SET_V12(0) | 838 RKISP1_CIF_ISP_HIST_CTRL_AUTOSTOP_SET_V12(0) | 839 RKISP1_CIF_ISP_HIST_CTRL_WNDNUM_SET_V12(1) | 840 RKISP1_CIF_ISP_HIST_CTRL_STEPSIZE_SET_V12(arg->histogram_predivider); 841 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_CTRL_V12, hist_ctrl); 842 843 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_OFFS_V12, 844 RKISP1_CIF_ISP_HIST_OFFS_SET_V12(arg->meas_window.h_offs, 845 arg->meas_window.v_offs)); 846 847 block_hsize = arg->meas_window.h_size / hist_wnd_num[wnd_num_idx] - 1; 848 block_vsize = arg->meas_window.v_size / hist_wnd_num[wnd_num_idx] - 1; 849 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_SIZE_V12, 850 RKISP1_CIF_ISP_HIST_SIZE_SET_V12(block_hsize, block_vsize)); 851 852 for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) { 853 for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) { 854 weight15x15[i * RKISP1_CIF_ISP_HIST_ROW_NUM_V12 + j] = 855 arg->hist_weight[i * hist_wnd_num[wnd_num_idx] + j]; 856 } 857 } 858 859 hist_weight_num = RKISP1_CIF_ISP_HIST_WEIGHT_REG_SIZE_V12; 860 for (i = 0; i < (hist_weight_num / 4); i++) { 861 value = RKISP1_CIF_ISP_HIST_WEIGHT_SET_V12( 862 weight15x15[4 * i + 0], 863 weight15x15[4 * i + 1], 864 weight15x15[4 * i + 2], 865 weight15x15[4 * i + 3]); 866 rkisp1_write(params->rkisp1, 867 RKISP1_CIF_ISP_HIST_WEIGHT_V12 + 4 * i, value); 868 } 869 value = RKISP1_CIF_ISP_HIST_WEIGHT_SET_V12(weight15x15[4 * i + 0], 0, 0, 0); 870 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_HIST_WEIGHT_V12 + 4 * i, 871 value); 872 } 873 874 static void 875 rkisp1_hst_enable_v10(struct rkisp1_params *params, 876 const struct rkisp1_cif_isp_hst_config *arg, bool en) 877 { 878 if (en) { 879 u32 hist_prop = rkisp1_read(params->rkisp1, 880 RKISP1_CIF_ISP_HIST_PROP_V10); 881 882 hist_prop &= ~RKISP1_CIF_ISP_HIST_PROP_MODE_MASK_V10; 883 hist_prop |= arg->mode; 884 rkisp1_param_set_bits(params, RKISP1_CIF_ISP_HIST_PROP_V10, 885 hist_prop); 886 } else { 887 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_HIST_PROP_V10, 888 RKISP1_CIF_ISP_HIST_PROP_MODE_MASK_V10); 889 } 890 } 891 892 static void 893 rkisp1_hst_enable_v12(struct rkisp1_params *params, 894 const struct rkisp1_cif_isp_hst_config *arg, bool en) 895 { 896 if (en) { 897 u32 hist_ctrl = rkisp1_read(params->rkisp1, 898 RKISP1_CIF_ISP_HIST_CTRL_V12); 899 900 hist_ctrl &= ~RKISP1_CIF_ISP_HIST_CTRL_MODE_MASK_V12; 901 hist_ctrl |= RKISP1_CIF_ISP_HIST_CTRL_MODE_SET_V12(arg->mode); 902 hist_ctrl |= RKISP1_CIF_ISP_HIST_CTRL_EN_SET_V12(1); 903 rkisp1_param_set_bits(params, RKISP1_CIF_ISP_HIST_CTRL_V12, 904 hist_ctrl); 905 } else { 906 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_HIST_CTRL_V12, 907 RKISP1_CIF_ISP_HIST_CTRL_MODE_MASK_V12 | 908 RKISP1_CIF_ISP_HIST_CTRL_EN_MASK_V12); 909 } 910 } 911 912 static void rkisp1_afm_config_v10(struct rkisp1_params *params, 913 const struct rkisp1_cif_isp_afc_config *arg) 914 { 915 size_t num_of_win = min_t(size_t, ARRAY_SIZE(arg->afm_win), 916 arg->num_afm_win); 917 u32 afm_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AFM_CTRL); 918 unsigned int i; 919 920 /* Switch off to configure. */ 921 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_AFM_CTRL, 922 RKISP1_CIF_ISP_AFM_ENA); 923 924 for (i = 0; i < num_of_win; i++) { 925 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_LT_A + i * 8, 926 RKISP1_CIF_ISP_AFM_WINDOW_X(arg->afm_win[i].h_offs) | 927 RKISP1_CIF_ISP_AFM_WINDOW_Y(arg->afm_win[i].v_offs)); 928 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_RB_A + i * 8, 929 RKISP1_CIF_ISP_AFM_WINDOW_X(arg->afm_win[i].h_size + 930 arg->afm_win[i].h_offs) | 931 RKISP1_CIF_ISP_AFM_WINDOW_Y(arg->afm_win[i].v_size + 932 arg->afm_win[i].v_offs)); 933 } 934 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_THRES, arg->thres); 935 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_VAR_SHIFT, 936 arg->var_shift); 937 /* restore afm status */ 938 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_CTRL, afm_ctrl); 939 } 940 941 static void rkisp1_afm_config_v12(struct rkisp1_params *params, 942 const struct rkisp1_cif_isp_afc_config *arg) 943 { 944 size_t num_of_win = min_t(size_t, ARRAY_SIZE(arg->afm_win), 945 arg->num_afm_win); 946 u32 afm_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_ISP_AFM_CTRL); 947 u32 lum_var_shift, afm_var_shift; 948 unsigned int i; 949 950 /* Switch off to configure. */ 951 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_AFM_CTRL, 952 RKISP1_CIF_ISP_AFM_ENA); 953 954 for (i = 0; i < num_of_win; i++) { 955 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_LT_A + i * 8, 956 RKISP1_CIF_ISP_AFM_WINDOW_X(arg->afm_win[i].h_offs) | 957 RKISP1_CIF_ISP_AFM_WINDOW_Y(arg->afm_win[i].v_offs)); 958 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_RB_A + i * 8, 959 RKISP1_CIF_ISP_AFM_WINDOW_X(arg->afm_win[i].h_size + 960 arg->afm_win[i].h_offs) | 961 RKISP1_CIF_ISP_AFM_WINDOW_Y(arg->afm_win[i].v_size + 962 arg->afm_win[i].v_offs)); 963 } 964 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_THRES, arg->thres); 965 966 lum_var_shift = RKISP1_CIF_ISP_AFM_GET_LUM_SHIFT_a_V12(arg->var_shift); 967 afm_var_shift = RKISP1_CIF_ISP_AFM_GET_AFM_SHIFT_a_V12(arg->var_shift); 968 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_VAR_SHIFT, 969 RKISP1_CIF_ISP_AFM_SET_SHIFT_a_V12(lum_var_shift, afm_var_shift) | 970 RKISP1_CIF_ISP_AFM_SET_SHIFT_b_V12(lum_var_shift, afm_var_shift) | 971 RKISP1_CIF_ISP_AFM_SET_SHIFT_c_V12(lum_var_shift, afm_var_shift)); 972 973 /* restore afm status */ 974 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_AFM_CTRL, afm_ctrl); 975 } 976 977 static void rkisp1_ie_config(struct rkisp1_params *params, 978 const struct rkisp1_cif_isp_ie_config *arg) 979 { 980 u32 eff_ctrl; 981 982 eff_ctrl = rkisp1_read(params->rkisp1, RKISP1_CIF_IMG_EFF_CTRL); 983 eff_ctrl &= ~RKISP1_CIF_IMG_EFF_CTRL_MODE_MASK; 984 985 if (params->quantization == V4L2_QUANTIZATION_FULL_RANGE) 986 eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_YCBCR_FULL; 987 988 switch (arg->effect) { 989 case V4L2_COLORFX_SEPIA: 990 eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_SEPIA; 991 break; 992 case V4L2_COLORFX_SET_CBCR: 993 rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_TINT, 994 arg->eff_tint); 995 eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_SEPIA; 996 break; 997 /* 998 * Color selection is similar to water color(AQUA): 999 * grayscale + selected color w threshold 1000 */ 1001 case V4L2_COLORFX_AQUA: 1002 eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_COLOR_SEL; 1003 rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_COLOR_SEL, 1004 arg->color_sel); 1005 break; 1006 case V4L2_COLORFX_EMBOSS: 1007 eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_EMBOSS; 1008 rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_MAT_1, 1009 arg->eff_mat_1); 1010 rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_MAT_2, 1011 arg->eff_mat_2); 1012 rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_MAT_3, 1013 arg->eff_mat_3); 1014 break; 1015 case V4L2_COLORFX_SKETCH: 1016 eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_SKETCH; 1017 rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_MAT_3, 1018 arg->eff_mat_3); 1019 rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_MAT_4, 1020 arg->eff_mat_4); 1021 rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_MAT_5, 1022 arg->eff_mat_5); 1023 break; 1024 case V4L2_COLORFX_BW: 1025 eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_BLACKWHITE; 1026 break; 1027 case V4L2_COLORFX_NEGATIVE: 1028 eff_ctrl |= RKISP1_CIF_IMG_EFF_CTRL_MODE_NEGATIVE; 1029 break; 1030 default: 1031 break; 1032 } 1033 1034 rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_CTRL, eff_ctrl); 1035 } 1036 1037 static void rkisp1_ie_enable(struct rkisp1_params *params, bool en) 1038 { 1039 if (en) { 1040 rkisp1_param_set_bits(params, RKISP1_CIF_VI_ICCL, 1041 RKISP1_CIF_VI_ICCL_IE_CLK); 1042 rkisp1_write(params->rkisp1, RKISP1_CIF_IMG_EFF_CTRL, 1043 RKISP1_CIF_IMG_EFF_CTRL_ENABLE); 1044 rkisp1_param_set_bits(params, RKISP1_CIF_IMG_EFF_CTRL, 1045 RKISP1_CIF_IMG_EFF_CTRL_CFG_UPD); 1046 } else { 1047 rkisp1_param_clear_bits(params, RKISP1_CIF_IMG_EFF_CTRL, 1048 RKISP1_CIF_IMG_EFF_CTRL_ENABLE); 1049 rkisp1_param_clear_bits(params, RKISP1_CIF_VI_ICCL, 1050 RKISP1_CIF_VI_ICCL_IE_CLK); 1051 } 1052 } 1053 1054 static void rkisp1_csm_config(struct rkisp1_params *params) 1055 { 1056 struct csm_coeffs { 1057 u16 limited[9]; 1058 u16 full[9]; 1059 }; 1060 static const struct csm_coeffs rec601_coeffs = { 1061 .limited = { 1062 0x0021, 0x0042, 0x000d, 1063 0x01ed, 0x01db, 0x0038, 1064 0x0038, 0x01d1, 0x01f7, 1065 }, 1066 .full = { 1067 0x0026, 0x004b, 0x000f, 1068 0x01ea, 0x01d6, 0x0040, 1069 0x0040, 0x01ca, 0x01f6, 1070 }, 1071 }; 1072 static const struct csm_coeffs rec709_coeffs = { 1073 .limited = { 1074 0x0018, 0x0050, 0x0008, 1075 0x01f3, 0x01d5, 0x0038, 1076 0x0038, 0x01cd, 0x01fb, 1077 }, 1078 .full = { 1079 0x001b, 0x005c, 0x0009, 1080 0x01f1, 0x01cf, 0x0040, 1081 0x0040, 0x01c6, 0x01fa, 1082 }, 1083 }; 1084 static const struct csm_coeffs rec2020_coeffs = { 1085 .limited = { 1086 0x001d, 0x004c, 0x0007, 1087 0x01f0, 0x01d8, 0x0038, 1088 0x0038, 0x01cd, 0x01fb, 1089 }, 1090 .full = { 1091 0x0022, 0x0057, 0x0008, 1092 0x01ee, 0x01d2, 0x0040, 1093 0x0040, 0x01c5, 0x01fb, 1094 }, 1095 }; 1096 static const struct csm_coeffs smpte240m_coeffs = { 1097 .limited = { 1098 0x0018, 0x004f, 0x000a, 1099 0x01f3, 0x01d5, 0x0038, 1100 0x0038, 0x01ce, 0x01fa, 1101 }, 1102 .full = { 1103 0x001b, 0x005a, 0x000b, 1104 0x01f1, 0x01cf, 0x0040, 1105 0x0040, 0x01c7, 0x01f9, 1106 }, 1107 }; 1108 1109 const struct csm_coeffs *coeffs; 1110 const u16 *csm; 1111 unsigned int i; 1112 1113 switch (params->ycbcr_encoding) { 1114 case V4L2_YCBCR_ENC_601: 1115 default: 1116 coeffs = &rec601_coeffs; 1117 break; 1118 case V4L2_YCBCR_ENC_709: 1119 coeffs = &rec709_coeffs; 1120 break; 1121 case V4L2_YCBCR_ENC_BT2020: 1122 coeffs = &rec2020_coeffs; 1123 break; 1124 case V4L2_YCBCR_ENC_SMPTE240M: 1125 coeffs = &smpte240m_coeffs; 1126 break; 1127 } 1128 1129 if (params->quantization == V4L2_QUANTIZATION_FULL_RANGE) { 1130 csm = coeffs->full; 1131 rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL, 1132 RKISP1_CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA | 1133 RKISP1_CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA); 1134 } else { 1135 csm = coeffs->limited; 1136 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL, 1137 RKISP1_CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA | 1138 RKISP1_CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA); 1139 } 1140 1141 for (i = 0; i < 9; i++) 1142 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_CC_COEFF_0 + i * 4, 1143 csm[i]); 1144 } 1145 1146 /* ISP De-noise Pre-Filter(DPF) function */ 1147 static void rkisp1_dpf_config(struct rkisp1_params *params, 1148 const struct rkisp1_cif_isp_dpf_config *arg) 1149 { 1150 unsigned int isp_dpf_mode, spatial_coeff, i; 1151 1152 switch (arg->gain.mode) { 1153 case RKISP1_CIF_ISP_DPF_GAIN_USAGE_NF_GAINS: 1154 isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_USE_NF_GAIN | 1155 RKISP1_CIF_ISP_DPF_MODE_AWB_GAIN_COMP; 1156 break; 1157 case RKISP1_CIF_ISP_DPF_GAIN_USAGE_LSC_GAINS: 1158 isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_LSC_GAIN_COMP; 1159 break; 1160 case RKISP1_CIF_ISP_DPF_GAIN_USAGE_NF_LSC_GAINS: 1161 isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_USE_NF_GAIN | 1162 RKISP1_CIF_ISP_DPF_MODE_AWB_GAIN_COMP | 1163 RKISP1_CIF_ISP_DPF_MODE_LSC_GAIN_COMP; 1164 break; 1165 case RKISP1_CIF_ISP_DPF_GAIN_USAGE_AWB_GAINS: 1166 isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_AWB_GAIN_COMP; 1167 break; 1168 case RKISP1_CIF_ISP_DPF_GAIN_USAGE_AWB_LSC_GAINS: 1169 isp_dpf_mode = RKISP1_CIF_ISP_DPF_MODE_LSC_GAIN_COMP | 1170 RKISP1_CIF_ISP_DPF_MODE_AWB_GAIN_COMP; 1171 break; 1172 case RKISP1_CIF_ISP_DPF_GAIN_USAGE_DISABLED: 1173 default: 1174 isp_dpf_mode = 0; 1175 break; 1176 } 1177 1178 if (arg->nll.scale_mode == RKISP1_CIF_ISP_NLL_SCALE_LOGARITHMIC) 1179 isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_NLL_SEGMENTATION; 1180 if (arg->rb_flt.fltsize == RKISP1_CIF_ISP_DPF_RB_FILTERSIZE_9x9) 1181 isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_RB_FLTSIZE_9x9; 1182 if (!arg->rb_flt.r_enable) 1183 isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_R_FLT_DIS; 1184 if (!arg->rb_flt.b_enable) 1185 isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_B_FLT_DIS; 1186 if (!arg->g_flt.gb_enable) 1187 isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_GB_FLT_DIS; 1188 if (!arg->g_flt.gr_enable) 1189 isp_dpf_mode |= RKISP1_CIF_ISP_DPF_MODE_GR_FLT_DIS; 1190 1191 rkisp1_param_set_bits(params, RKISP1_CIF_ISP_DPF_MODE, 1192 isp_dpf_mode); 1193 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_NF_GAIN_B, 1194 arg->gain.nf_b_gain); 1195 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_NF_GAIN_R, 1196 arg->gain.nf_r_gain); 1197 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_NF_GAIN_GB, 1198 arg->gain.nf_gb_gain); 1199 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_NF_GAIN_GR, 1200 arg->gain.nf_gr_gain); 1201 1202 for (i = 0; i < RKISP1_CIF_ISP_DPF_MAX_NLF_COEFFS; i++) { 1203 rkisp1_write(params->rkisp1, 1204 RKISP1_CIF_ISP_DPF_NULL_COEFF_0 + i * 4, 1205 arg->nll.coeff[i]); 1206 } 1207 1208 spatial_coeff = arg->g_flt.spatial_coeff[0] | 1209 (arg->g_flt.spatial_coeff[1] << 8) | 1210 (arg->g_flt.spatial_coeff[2] << 16) | 1211 (arg->g_flt.spatial_coeff[3] << 24); 1212 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_S_WEIGHT_G_1_4, 1213 spatial_coeff); 1214 1215 spatial_coeff = arg->g_flt.spatial_coeff[4] | 1216 (arg->g_flt.spatial_coeff[5] << 8); 1217 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_S_WEIGHT_G_5_6, 1218 spatial_coeff); 1219 1220 spatial_coeff = arg->rb_flt.spatial_coeff[0] | 1221 (arg->rb_flt.spatial_coeff[1] << 8) | 1222 (arg->rb_flt.spatial_coeff[2] << 16) | 1223 (arg->rb_flt.spatial_coeff[3] << 24); 1224 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_S_WEIGHT_RB_1_4, 1225 spatial_coeff); 1226 1227 spatial_coeff = arg->rb_flt.spatial_coeff[4] | 1228 (arg->rb_flt.spatial_coeff[5] << 8); 1229 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_S_WEIGHT_RB_5_6, 1230 spatial_coeff); 1231 } 1232 1233 static void 1234 rkisp1_dpf_strength_config(struct rkisp1_params *params, 1235 const struct rkisp1_cif_isp_dpf_strength_config *arg) 1236 { 1237 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_STRENGTH_B, arg->b); 1238 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_STRENGTH_G, arg->g); 1239 rkisp1_write(params->rkisp1, RKISP1_CIF_ISP_DPF_STRENGTH_R, arg->r); 1240 } 1241 1242 static void 1243 rkisp1_isp_isr_other_config(struct rkisp1_params *params, 1244 const struct rkisp1_params_cfg *new_params) 1245 { 1246 unsigned int module_en_update, module_cfg_update, module_ens; 1247 1248 module_en_update = new_params->module_en_update; 1249 module_cfg_update = new_params->module_cfg_update; 1250 module_ens = new_params->module_ens; 1251 1252 /* update dpc config */ 1253 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_DPCC) 1254 rkisp1_dpcc_config(params, 1255 &new_params->others.dpcc_config); 1256 1257 if (module_en_update & RKISP1_CIF_ISP_MODULE_DPCC) { 1258 if (module_ens & RKISP1_CIF_ISP_MODULE_DPCC) 1259 rkisp1_param_set_bits(params, 1260 RKISP1_CIF_ISP_DPCC_MODE, 1261 RKISP1_CIF_ISP_DPCC_MODE_DPCC_ENABLE); 1262 else 1263 rkisp1_param_clear_bits(params, 1264 RKISP1_CIF_ISP_DPCC_MODE, 1265 RKISP1_CIF_ISP_DPCC_MODE_DPCC_ENABLE); 1266 } 1267 1268 /* update bls config */ 1269 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_BLS) 1270 rkisp1_bls_config(params, 1271 &new_params->others.bls_config); 1272 1273 if (module_en_update & RKISP1_CIF_ISP_MODULE_BLS) { 1274 if (module_ens & RKISP1_CIF_ISP_MODULE_BLS) 1275 rkisp1_param_set_bits(params, 1276 RKISP1_CIF_ISP_BLS_CTRL, 1277 RKISP1_CIF_ISP_BLS_ENA); 1278 else 1279 rkisp1_param_clear_bits(params, 1280 RKISP1_CIF_ISP_BLS_CTRL, 1281 RKISP1_CIF_ISP_BLS_ENA); 1282 } 1283 1284 /* update sdg config */ 1285 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_SDG) 1286 rkisp1_sdg_config(params, 1287 &new_params->others.sdg_config); 1288 1289 if (module_en_update & RKISP1_CIF_ISP_MODULE_SDG) { 1290 if (module_ens & RKISP1_CIF_ISP_MODULE_SDG) 1291 rkisp1_param_set_bits(params, 1292 RKISP1_CIF_ISP_CTRL, 1293 RKISP1_CIF_ISP_CTRL_ISP_GAMMA_IN_ENA); 1294 else 1295 rkisp1_param_clear_bits(params, 1296 RKISP1_CIF_ISP_CTRL, 1297 RKISP1_CIF_ISP_CTRL_ISP_GAMMA_IN_ENA); 1298 } 1299 1300 /* update lsc config */ 1301 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_LSC) 1302 rkisp1_lsc_config(params, 1303 &new_params->others.lsc_config); 1304 1305 if (module_en_update & RKISP1_CIF_ISP_MODULE_LSC) { 1306 if (module_ens & RKISP1_CIF_ISP_MODULE_LSC) 1307 rkisp1_param_set_bits(params, 1308 RKISP1_CIF_ISP_LSC_CTRL, 1309 RKISP1_CIF_ISP_LSC_CTRL_ENA); 1310 else 1311 rkisp1_param_clear_bits(params, 1312 RKISP1_CIF_ISP_LSC_CTRL, 1313 RKISP1_CIF_ISP_LSC_CTRL_ENA); 1314 } 1315 1316 /* update awb gains */ 1317 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_AWB_GAIN) 1318 params->ops->awb_gain_config(params, &new_params->others.awb_gain_config); 1319 1320 if (module_en_update & RKISP1_CIF_ISP_MODULE_AWB_GAIN) { 1321 if (module_ens & RKISP1_CIF_ISP_MODULE_AWB_GAIN) 1322 rkisp1_param_set_bits(params, 1323 RKISP1_CIF_ISP_CTRL, 1324 RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA); 1325 else 1326 rkisp1_param_clear_bits(params, 1327 RKISP1_CIF_ISP_CTRL, 1328 RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA); 1329 } 1330 1331 /* update bdm config */ 1332 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_BDM) 1333 rkisp1_bdm_config(params, 1334 &new_params->others.bdm_config); 1335 1336 if (module_en_update & RKISP1_CIF_ISP_MODULE_BDM) { 1337 if (module_ens & RKISP1_CIF_ISP_MODULE_BDM) 1338 rkisp1_param_set_bits(params, 1339 RKISP1_CIF_ISP_DEMOSAIC, 1340 RKISP1_CIF_ISP_DEMOSAIC_BYPASS); 1341 else 1342 rkisp1_param_clear_bits(params, 1343 RKISP1_CIF_ISP_DEMOSAIC, 1344 RKISP1_CIF_ISP_DEMOSAIC_BYPASS); 1345 } 1346 1347 /* update filter config */ 1348 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_FLT) 1349 rkisp1_flt_config(params, 1350 &new_params->others.flt_config); 1351 1352 if (module_en_update & RKISP1_CIF_ISP_MODULE_FLT) { 1353 if (module_ens & RKISP1_CIF_ISP_MODULE_FLT) 1354 rkisp1_param_set_bits(params, 1355 RKISP1_CIF_ISP_FILT_MODE, 1356 RKISP1_CIF_ISP_FLT_ENA); 1357 else 1358 rkisp1_param_clear_bits(params, 1359 RKISP1_CIF_ISP_FILT_MODE, 1360 RKISP1_CIF_ISP_FLT_ENA); 1361 } 1362 1363 /* update ctk config */ 1364 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_CTK) 1365 rkisp1_ctk_config(params, 1366 &new_params->others.ctk_config); 1367 1368 if (module_en_update & RKISP1_CIF_ISP_MODULE_CTK) 1369 rkisp1_ctk_enable(params, !!(module_ens & RKISP1_CIF_ISP_MODULE_CTK)); 1370 1371 /* update goc config */ 1372 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_GOC) 1373 params->ops->goc_config(params, &new_params->others.goc_config); 1374 1375 if (module_en_update & RKISP1_CIF_ISP_MODULE_GOC) { 1376 if (module_ens & RKISP1_CIF_ISP_MODULE_GOC) 1377 rkisp1_param_set_bits(params, 1378 RKISP1_CIF_ISP_CTRL, 1379 RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA); 1380 else 1381 rkisp1_param_clear_bits(params, 1382 RKISP1_CIF_ISP_CTRL, 1383 RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA); 1384 } 1385 1386 /* update cproc config */ 1387 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_CPROC) 1388 rkisp1_cproc_config(params, 1389 &new_params->others.cproc_config); 1390 1391 if (module_en_update & RKISP1_CIF_ISP_MODULE_CPROC) { 1392 if (module_ens & RKISP1_CIF_ISP_MODULE_CPROC) 1393 rkisp1_param_set_bits(params, 1394 RKISP1_CIF_C_PROC_CTRL, 1395 RKISP1_CIF_C_PROC_CTR_ENABLE); 1396 else 1397 rkisp1_param_clear_bits(params, 1398 RKISP1_CIF_C_PROC_CTRL, 1399 RKISP1_CIF_C_PROC_CTR_ENABLE); 1400 } 1401 1402 /* update ie config */ 1403 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_IE) 1404 rkisp1_ie_config(params, &new_params->others.ie_config); 1405 1406 if (module_en_update & RKISP1_CIF_ISP_MODULE_IE) 1407 rkisp1_ie_enable(params, !!(module_ens & RKISP1_CIF_ISP_MODULE_IE)); 1408 1409 /* update dpf config */ 1410 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_DPF) 1411 rkisp1_dpf_config(params, &new_params->others.dpf_config); 1412 1413 if (module_en_update & RKISP1_CIF_ISP_MODULE_DPF) { 1414 if (module_ens & RKISP1_CIF_ISP_MODULE_DPF) 1415 rkisp1_param_set_bits(params, 1416 RKISP1_CIF_ISP_DPF_MODE, 1417 RKISP1_CIF_ISP_DPF_MODE_EN); 1418 else 1419 rkisp1_param_clear_bits(params, 1420 RKISP1_CIF_ISP_DPF_MODE, 1421 RKISP1_CIF_ISP_DPF_MODE_EN); 1422 } 1423 1424 if ((module_en_update & RKISP1_CIF_ISP_MODULE_DPF_STRENGTH) || 1425 (module_cfg_update & RKISP1_CIF_ISP_MODULE_DPF_STRENGTH)) { 1426 /* update dpf strength config */ 1427 rkisp1_dpf_strength_config(params, 1428 &new_params->others.dpf_strength_config); 1429 } 1430 } 1431 1432 static void rkisp1_isp_isr_meas_config(struct rkisp1_params *params, 1433 struct rkisp1_params_cfg *new_params) 1434 { 1435 unsigned int module_en_update, module_cfg_update, module_ens; 1436 1437 module_en_update = new_params->module_en_update; 1438 module_cfg_update = new_params->module_cfg_update; 1439 module_ens = new_params->module_ens; 1440 1441 /* update awb config */ 1442 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_AWB) 1443 params->ops->awb_meas_config(params, &new_params->meas.awb_meas_config); 1444 1445 if (module_en_update & RKISP1_CIF_ISP_MODULE_AWB) 1446 params->ops->awb_meas_enable(params, 1447 &new_params->meas.awb_meas_config, 1448 !!(module_ens & RKISP1_CIF_ISP_MODULE_AWB)); 1449 1450 /* update afc config */ 1451 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_AFC) 1452 params->ops->afm_config(params, 1453 &new_params->meas.afc_config); 1454 1455 if (module_en_update & RKISP1_CIF_ISP_MODULE_AFC) { 1456 if (module_ens & RKISP1_CIF_ISP_MODULE_AFC) 1457 rkisp1_param_set_bits(params, 1458 RKISP1_CIF_ISP_AFM_CTRL, 1459 RKISP1_CIF_ISP_AFM_ENA); 1460 else 1461 rkisp1_param_clear_bits(params, 1462 RKISP1_CIF_ISP_AFM_CTRL, 1463 RKISP1_CIF_ISP_AFM_ENA); 1464 } 1465 1466 /* update hst config */ 1467 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_HST) 1468 params->ops->hst_config(params, 1469 &new_params->meas.hst_config); 1470 1471 if (module_en_update & RKISP1_CIF_ISP_MODULE_HST) 1472 params->ops->hst_enable(params, 1473 &new_params->meas.hst_config, 1474 !!(module_ens & RKISP1_CIF_ISP_MODULE_HST)); 1475 1476 /* update aec config */ 1477 if (module_cfg_update & RKISP1_CIF_ISP_MODULE_AEC) 1478 params->ops->aec_config(params, 1479 &new_params->meas.aec_config); 1480 1481 if (module_en_update & RKISP1_CIF_ISP_MODULE_AEC) { 1482 if (module_ens & RKISP1_CIF_ISP_MODULE_AEC) 1483 rkisp1_param_set_bits(params, 1484 RKISP1_CIF_ISP_EXP_CTRL, 1485 RKISP1_CIF_ISP_EXP_ENA); 1486 else 1487 rkisp1_param_clear_bits(params, 1488 RKISP1_CIF_ISP_EXP_CTRL, 1489 RKISP1_CIF_ISP_EXP_ENA); 1490 } 1491 } 1492 1493 static void rkisp1_params_apply_params_cfg(struct rkisp1_params *params, 1494 unsigned int frame_sequence) 1495 { 1496 struct rkisp1_params_cfg *new_params; 1497 struct rkisp1_buffer *cur_buf = NULL; 1498 1499 if (list_empty(¶ms->params)) 1500 return; 1501 1502 cur_buf = list_first_entry(¶ms->params, 1503 struct rkisp1_buffer, queue); 1504 1505 new_params = (struct rkisp1_params_cfg *)vb2_plane_vaddr(&cur_buf->vb.vb2_buf, 0); 1506 1507 rkisp1_isp_isr_other_config(params, new_params); 1508 rkisp1_isp_isr_meas_config(params, new_params); 1509 1510 /* update shadow register immediately */ 1511 rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL, RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD); 1512 1513 list_del(&cur_buf->queue); 1514 1515 cur_buf->vb.sequence = frame_sequence; 1516 vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); 1517 } 1518 1519 void rkisp1_params_isr(struct rkisp1_device *rkisp1) 1520 { 1521 /* 1522 * This isr is called when the ISR finishes processing a frame (RKISP1_CIF_ISP_FRAME). 1523 * Configurations performed here will be applied on the next frame. 1524 * Since frame_sequence is updated on the vertical sync signal, we should use 1525 * frame_sequence + 1 here to indicate to userspace on which frame these parameters 1526 * are being applied. 1527 */ 1528 unsigned int frame_sequence = rkisp1->isp.frame_sequence + 1; 1529 struct rkisp1_params *params = &rkisp1->params; 1530 1531 spin_lock(¶ms->config_lock); 1532 rkisp1_params_apply_params_cfg(params, frame_sequence); 1533 1534 spin_unlock(¶ms->config_lock); 1535 } 1536 1537 static const struct rkisp1_cif_isp_awb_meas_config rkisp1_awb_params_default_config = { 1538 { 1539 0, 0, RKISP1_DEFAULT_WIDTH, RKISP1_DEFAULT_HEIGHT 1540 }, 1541 RKISP1_CIF_ISP_AWB_MODE_YCBCR, 200, 30, 20, 20, 0, 128, 128 1542 }; 1543 1544 static const struct rkisp1_cif_isp_aec_config rkisp1_aec_params_default_config = { 1545 RKISP1_CIF_ISP_EXP_MEASURING_MODE_0, 1546 RKISP1_CIF_ISP_EXP_CTRL_AUTOSTOP_0, 1547 { 1548 RKISP1_DEFAULT_WIDTH >> 2, RKISP1_DEFAULT_HEIGHT >> 2, 1549 RKISP1_DEFAULT_WIDTH >> 1, RKISP1_DEFAULT_HEIGHT >> 1 1550 } 1551 }; 1552 1553 static const struct rkisp1_cif_isp_hst_config rkisp1_hst_params_default_config = { 1554 RKISP1_CIF_ISP_HISTOGRAM_MODE_RGB_COMBINED, 1555 3, 1556 { 1557 RKISP1_DEFAULT_WIDTH >> 2, RKISP1_DEFAULT_HEIGHT >> 2, 1558 RKISP1_DEFAULT_WIDTH >> 1, RKISP1_DEFAULT_HEIGHT >> 1 1559 }, 1560 { 1561 0, /* To be filled in with 0x01 at runtime. */ 1562 } 1563 }; 1564 1565 static const struct rkisp1_cif_isp_afc_config rkisp1_afc_params_default_config = { 1566 1, 1567 { 1568 { 1569 300, 225, 200, 150 1570 } 1571 }, 1572 4, 1573 14 1574 }; 1575 1576 static void rkisp1_params_config_parameter(struct rkisp1_params *params) 1577 { 1578 struct rkisp1_cif_isp_hst_config hst = rkisp1_hst_params_default_config; 1579 1580 params->ops->awb_meas_config(params, &rkisp1_awb_params_default_config); 1581 params->ops->awb_meas_enable(params, &rkisp1_awb_params_default_config, 1582 true); 1583 1584 params->ops->aec_config(params, &rkisp1_aec_params_default_config); 1585 rkisp1_param_set_bits(params, RKISP1_CIF_ISP_EXP_CTRL, 1586 RKISP1_CIF_ISP_EXP_ENA); 1587 1588 params->ops->afm_config(params, &rkisp1_afc_params_default_config); 1589 rkisp1_param_set_bits(params, RKISP1_CIF_ISP_AFM_CTRL, 1590 RKISP1_CIF_ISP_AFM_ENA); 1591 1592 memset(hst.hist_weight, 0x01, sizeof(hst.hist_weight)); 1593 params->ops->hst_config(params, &hst); 1594 rkisp1_param_set_bits(params, RKISP1_CIF_ISP_HIST_PROP_V10, 1595 rkisp1_hst_params_default_config.mode); 1596 1597 rkisp1_csm_config(params); 1598 1599 spin_lock_irq(¶ms->config_lock); 1600 1601 /* apply the first buffer if there is one already */ 1602 rkisp1_params_apply_params_cfg(params, 0); 1603 1604 spin_unlock_irq(¶ms->config_lock); 1605 } 1606 1607 void rkisp1_params_configure(struct rkisp1_params *params, 1608 enum rkisp1_fmt_raw_pat_type bayer_pat, 1609 enum v4l2_quantization quantization, 1610 enum v4l2_ycbcr_encoding ycbcr_encoding) 1611 { 1612 params->quantization = quantization; 1613 params->ycbcr_encoding = ycbcr_encoding; 1614 params->raw_type = bayer_pat; 1615 rkisp1_params_config_parameter(params); 1616 } 1617 1618 /* 1619 * Not called when the camera is active, therefore there is no need to acquire 1620 * a lock. 1621 */ 1622 void rkisp1_params_disable(struct rkisp1_params *params) 1623 { 1624 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_DPCC_MODE, 1625 RKISP1_CIF_ISP_DPCC_MODE_DPCC_ENABLE); 1626 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_LSC_CTRL, 1627 RKISP1_CIF_ISP_LSC_CTRL_ENA); 1628 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_BLS_CTRL, 1629 RKISP1_CIF_ISP_BLS_ENA); 1630 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL, 1631 RKISP1_CIF_ISP_CTRL_ISP_GAMMA_IN_ENA); 1632 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL, 1633 RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA); 1634 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_DEMOSAIC, 1635 RKISP1_CIF_ISP_DEMOSAIC_BYPASS); 1636 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_FILT_MODE, 1637 RKISP1_CIF_ISP_FLT_ENA); 1638 params->ops->awb_meas_enable(params, NULL, false); 1639 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_CTRL, 1640 RKISP1_CIF_ISP_CTRL_ISP_AWB_ENA); 1641 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_EXP_CTRL, 1642 RKISP1_CIF_ISP_EXP_ENA); 1643 rkisp1_ctk_enable(params, false); 1644 rkisp1_param_clear_bits(params, RKISP1_CIF_C_PROC_CTRL, 1645 RKISP1_CIF_C_PROC_CTR_ENABLE); 1646 params->ops->hst_enable(params, NULL, false); 1647 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_AFM_CTRL, 1648 RKISP1_CIF_ISP_AFM_ENA); 1649 rkisp1_ie_enable(params, false); 1650 rkisp1_param_clear_bits(params, RKISP1_CIF_ISP_DPF_MODE, 1651 RKISP1_CIF_ISP_DPF_MODE_EN); 1652 } 1653 1654 static const struct rkisp1_params_ops rkisp1_v10_params_ops = { 1655 .lsc_matrix_config = rkisp1_lsc_matrix_config_v10, 1656 .goc_config = rkisp1_goc_config_v10, 1657 .awb_meas_config = rkisp1_awb_meas_config_v10, 1658 .awb_meas_enable = rkisp1_awb_meas_enable_v10, 1659 .awb_gain_config = rkisp1_awb_gain_config_v10, 1660 .aec_config = rkisp1_aec_config_v10, 1661 .hst_config = rkisp1_hst_config_v10, 1662 .hst_enable = rkisp1_hst_enable_v10, 1663 .afm_config = rkisp1_afm_config_v10, 1664 }; 1665 1666 static struct rkisp1_params_ops rkisp1_v12_params_ops = { 1667 .lsc_matrix_config = rkisp1_lsc_matrix_config_v12, 1668 .goc_config = rkisp1_goc_config_v12, 1669 .awb_meas_config = rkisp1_awb_meas_config_v12, 1670 .awb_meas_enable = rkisp1_awb_meas_enable_v12, 1671 .awb_gain_config = rkisp1_awb_gain_config_v12, 1672 .aec_config = rkisp1_aec_config_v12, 1673 .hst_config = rkisp1_hst_config_v12, 1674 .hst_enable = rkisp1_hst_enable_v12, 1675 .afm_config = rkisp1_afm_config_v12, 1676 }; 1677 1678 static int rkisp1_params_enum_fmt_meta_out(struct file *file, void *priv, 1679 struct v4l2_fmtdesc *f) 1680 { 1681 struct video_device *video = video_devdata(file); 1682 struct rkisp1_params *params = video_get_drvdata(video); 1683 1684 if (f->index > 0 || f->type != video->queue->type) 1685 return -EINVAL; 1686 1687 f->pixelformat = params->vdev_fmt.fmt.meta.dataformat; 1688 1689 return 0; 1690 } 1691 1692 static int rkisp1_params_g_fmt_meta_out(struct file *file, void *fh, 1693 struct v4l2_format *f) 1694 { 1695 struct video_device *video = video_devdata(file); 1696 struct rkisp1_params *params = video_get_drvdata(video); 1697 struct v4l2_meta_format *meta = &f->fmt.meta; 1698 1699 if (f->type != video->queue->type) 1700 return -EINVAL; 1701 1702 memset(meta, 0, sizeof(*meta)); 1703 meta->dataformat = params->vdev_fmt.fmt.meta.dataformat; 1704 meta->buffersize = params->vdev_fmt.fmt.meta.buffersize; 1705 1706 return 0; 1707 } 1708 1709 static int rkisp1_params_querycap(struct file *file, 1710 void *priv, struct v4l2_capability *cap) 1711 { 1712 struct video_device *vdev = video_devdata(file); 1713 1714 strscpy(cap->driver, RKISP1_DRIVER_NAME, sizeof(cap->driver)); 1715 strscpy(cap->card, vdev->name, sizeof(cap->card)); 1716 strscpy(cap->bus_info, RKISP1_BUS_INFO, sizeof(cap->bus_info)); 1717 1718 return 0; 1719 } 1720 1721 /* ISP params video device IOCTLs */ 1722 static const struct v4l2_ioctl_ops rkisp1_params_ioctl = { 1723 .vidioc_reqbufs = vb2_ioctl_reqbufs, 1724 .vidioc_querybuf = vb2_ioctl_querybuf, 1725 .vidioc_create_bufs = vb2_ioctl_create_bufs, 1726 .vidioc_qbuf = vb2_ioctl_qbuf, 1727 .vidioc_dqbuf = vb2_ioctl_dqbuf, 1728 .vidioc_prepare_buf = vb2_ioctl_prepare_buf, 1729 .vidioc_expbuf = vb2_ioctl_expbuf, 1730 .vidioc_streamon = vb2_ioctl_streamon, 1731 .vidioc_streamoff = vb2_ioctl_streamoff, 1732 .vidioc_enum_fmt_meta_out = rkisp1_params_enum_fmt_meta_out, 1733 .vidioc_g_fmt_meta_out = rkisp1_params_g_fmt_meta_out, 1734 .vidioc_s_fmt_meta_out = rkisp1_params_g_fmt_meta_out, 1735 .vidioc_try_fmt_meta_out = rkisp1_params_g_fmt_meta_out, 1736 .vidioc_querycap = rkisp1_params_querycap, 1737 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, 1738 .vidioc_unsubscribe_event = v4l2_event_unsubscribe, 1739 }; 1740 1741 static int rkisp1_params_vb2_queue_setup(struct vb2_queue *vq, 1742 unsigned int *num_buffers, 1743 unsigned int *num_planes, 1744 unsigned int sizes[], 1745 struct device *alloc_devs[]) 1746 { 1747 *num_buffers = clamp_t(u32, *num_buffers, 1748 RKISP1_ISP_PARAMS_REQ_BUFS_MIN, 1749 RKISP1_ISP_PARAMS_REQ_BUFS_MAX); 1750 1751 *num_planes = 1; 1752 1753 sizes[0] = sizeof(struct rkisp1_params_cfg); 1754 1755 return 0; 1756 } 1757 1758 static void rkisp1_params_vb2_buf_queue(struct vb2_buffer *vb) 1759 { 1760 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); 1761 struct rkisp1_buffer *params_buf = 1762 container_of(vbuf, struct rkisp1_buffer, vb); 1763 struct vb2_queue *vq = vb->vb2_queue; 1764 struct rkisp1_params *params = vq->drv_priv; 1765 1766 spin_lock_irq(¶ms->config_lock); 1767 list_add_tail(¶ms_buf->queue, ¶ms->params); 1768 spin_unlock_irq(¶ms->config_lock); 1769 } 1770 1771 static int rkisp1_params_vb2_buf_prepare(struct vb2_buffer *vb) 1772 { 1773 if (vb2_plane_size(vb, 0) < sizeof(struct rkisp1_params_cfg)) 1774 return -EINVAL; 1775 1776 vb2_set_plane_payload(vb, 0, sizeof(struct rkisp1_params_cfg)); 1777 1778 return 0; 1779 } 1780 1781 static void rkisp1_params_vb2_stop_streaming(struct vb2_queue *vq) 1782 { 1783 struct rkisp1_params *params = vq->drv_priv; 1784 struct rkisp1_buffer *buf; 1785 LIST_HEAD(tmp_list); 1786 1787 /* 1788 * we first move the buffers into a local list 'tmp_list' 1789 * and then we can iterate it and call vb2_buffer_done 1790 * without holding the lock 1791 */ 1792 spin_lock_irq(¶ms->config_lock); 1793 list_splice_init(¶ms->params, &tmp_list); 1794 spin_unlock_irq(¶ms->config_lock); 1795 1796 list_for_each_entry(buf, &tmp_list, queue) 1797 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); 1798 } 1799 1800 static const struct vb2_ops rkisp1_params_vb2_ops = { 1801 .queue_setup = rkisp1_params_vb2_queue_setup, 1802 .wait_prepare = vb2_ops_wait_prepare, 1803 .wait_finish = vb2_ops_wait_finish, 1804 .buf_queue = rkisp1_params_vb2_buf_queue, 1805 .buf_prepare = rkisp1_params_vb2_buf_prepare, 1806 .stop_streaming = rkisp1_params_vb2_stop_streaming, 1807 1808 }; 1809 1810 static const struct v4l2_file_operations rkisp1_params_fops = { 1811 .mmap = vb2_fop_mmap, 1812 .unlocked_ioctl = video_ioctl2, 1813 .poll = vb2_fop_poll, 1814 .open = v4l2_fh_open, 1815 .release = vb2_fop_release 1816 }; 1817 1818 static int rkisp1_params_init_vb2_queue(struct vb2_queue *q, 1819 struct rkisp1_params *params) 1820 { 1821 struct rkisp1_vdev_node *node; 1822 1823 node = container_of(q, struct rkisp1_vdev_node, buf_queue); 1824 1825 q->type = V4L2_BUF_TYPE_META_OUTPUT; 1826 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF; 1827 q->drv_priv = params; 1828 q->ops = &rkisp1_params_vb2_ops; 1829 q->mem_ops = &vb2_vmalloc_memops; 1830 q->buf_struct_size = sizeof(struct rkisp1_buffer); 1831 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; 1832 q->lock = &node->vlock; 1833 1834 return vb2_queue_init(q); 1835 } 1836 1837 static void rkisp1_init_params(struct rkisp1_params *params) 1838 { 1839 params->vdev_fmt.fmt.meta.dataformat = 1840 V4L2_META_FMT_RK_ISP1_PARAMS; 1841 params->vdev_fmt.fmt.meta.buffersize = 1842 sizeof(struct rkisp1_params_cfg); 1843 1844 if (params->rkisp1->info->isp_ver == RKISP1_V12) 1845 params->ops = &rkisp1_v12_params_ops; 1846 else 1847 params->ops = &rkisp1_v10_params_ops; 1848 } 1849 1850 int rkisp1_params_register(struct rkisp1_device *rkisp1) 1851 { 1852 struct rkisp1_params *params = &rkisp1->params; 1853 struct rkisp1_vdev_node *node = ¶ms->vnode; 1854 struct video_device *vdev = &node->vdev; 1855 int ret; 1856 1857 params->rkisp1 = rkisp1; 1858 mutex_init(&node->vlock); 1859 INIT_LIST_HEAD(¶ms->params); 1860 spin_lock_init(¶ms->config_lock); 1861 1862 strscpy(vdev->name, RKISP1_PARAMS_DEV_NAME, sizeof(vdev->name)); 1863 1864 video_set_drvdata(vdev, params); 1865 vdev->ioctl_ops = &rkisp1_params_ioctl; 1866 vdev->fops = &rkisp1_params_fops; 1867 vdev->release = video_device_release_empty; 1868 /* 1869 * Provide a mutex to v4l2 core. It will be used 1870 * to protect all fops and v4l2 ioctls. 1871 */ 1872 vdev->lock = &node->vlock; 1873 vdev->v4l2_dev = &rkisp1->v4l2_dev; 1874 vdev->queue = &node->buf_queue; 1875 vdev->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_META_OUTPUT; 1876 vdev->vfl_dir = VFL_DIR_TX; 1877 rkisp1_params_init_vb2_queue(vdev->queue, params); 1878 rkisp1_init_params(params); 1879 video_set_drvdata(vdev, params); 1880 1881 node->pad.flags = MEDIA_PAD_FL_SOURCE; 1882 ret = media_entity_pads_init(&vdev->entity, 1, &node->pad); 1883 if (ret) 1884 goto error; 1885 1886 ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); 1887 if (ret) { 1888 dev_err(rkisp1->dev, 1889 "failed to register %s, ret=%d\n", vdev->name, ret); 1890 goto error; 1891 } 1892 1893 return 0; 1894 1895 error: 1896 media_entity_cleanup(&vdev->entity); 1897 mutex_destroy(&node->vlock); 1898 return ret; 1899 } 1900 1901 void rkisp1_params_unregister(struct rkisp1_device *rkisp1) 1902 { 1903 struct rkisp1_params *params = &rkisp1->params; 1904 struct rkisp1_vdev_node *node = ¶ms->vnode; 1905 struct video_device *vdev = &node->vdev; 1906 1907 if (!video_is_registered(vdev)) 1908 return; 1909 1910 vb2_video_unregister_device(vdev); 1911 media_entity_cleanup(&vdev->entity); 1912 mutex_destroy(&node->vlock); 1913 } 1914