1 /* 2 * Copyright (C) 2012 Texas Instruments Inc 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License as 6 * published by the Free Software Foundation version 2. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program; if not, write to the Free Software 15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 * 17 * Contributors: 18 * Manjunath Hadli <manjunath.hadli@ti.com> 19 * Prabhakar Lad <prabhakar.lad@ti.com> 20 */ 21 22 #ifndef _DAVINCI_VPFE_USER_H 23 #define _DAVINCI_VPFE_USER_H 24 25 #include <linux/types.h> 26 #include <linux/videodev2.h> 27 28 /* 29 * Private IOCTL 30 * 31 * VIDIOC_VPFE_ISIF_S_RAW_PARAMS: Set raw params in isif 32 * VIDIOC_VPFE_ISIF_G_RAW_PARAMS: Get raw params from isif 33 * VIDIOC_VPFE_PRV_S_CONFIG: Set ipipe engine configuration 34 * VIDIOC_VPFE_PRV_G_CONFIG: Get ipipe engine configuration 35 * VIDIOC_VPFE_RSZ_S_CONFIG: Set resizer engine configuration 36 * VIDIOC_VPFE_RSZ_G_CONFIG: Get resizer engine configuration 37 */ 38 39 #define VIDIOC_VPFE_ISIF_S_RAW_PARAMS \ 40 _IOW('V', BASE_VIDIOC_PRIVATE + 1, struct vpfe_isif_raw_config) 41 #define VIDIOC_VPFE_ISIF_G_RAW_PARAMS \ 42 _IOR('V', BASE_VIDIOC_PRIVATE + 2, struct vpfe_isif_raw_config) 43 #define VIDIOC_VPFE_IPIPE_S_CONFIG \ 44 _IOWR('P', BASE_VIDIOC_PRIVATE + 3, struct vpfe_ipipe_config) 45 #define VIDIOC_VPFE_IPIPE_G_CONFIG \ 46 _IOWR('P', BASE_VIDIOC_PRIVATE + 4, struct vpfe_ipipe_config) 47 #define VIDIOC_VPFE_RSZ_S_CONFIG \ 48 _IOWR('R', BASE_VIDIOC_PRIVATE + 5, struct vpfe_rsz_config) 49 #define VIDIOC_VPFE_RSZ_G_CONFIG \ 50 _IOWR('R', BASE_VIDIOC_PRIVATE + 6, struct vpfe_rsz_config) 51 52 /* 53 * Private Control's for ISIF 54 */ 55 #define VPFE_ISIF_CID_CRGAIN (V4L2_CID_USER_BASE | 0xa001) 56 #define VPFE_ISIF_CID_CGRGAIN (V4L2_CID_USER_BASE | 0xa002) 57 #define VPFE_ISIF_CID_CGBGAIN (V4L2_CID_USER_BASE | 0xa003) 58 #define VPFE_ISIF_CID_CBGAIN (V4L2_CID_USER_BASE | 0xa004) 59 #define VPFE_ISIF_CID_GAIN_OFFSET (V4L2_CID_USER_BASE | 0xa005) 60 61 /* 62 * Private Control's for ISIF and IPIPEIF 63 */ 64 #define VPFE_CID_DPCM_PREDICTOR (V4L2_CID_USER_BASE | 0xa006) 65 66 /************************************************************************ 67 * Vertical Defect Correction parameters 68 ***********************************************************************/ 69 70 /** 71 * vertical defect correction methods 72 */ 73 enum vpfe_isif_vdfc_corr_mode { 74 /* Defect level subtraction. Just fed through if saturating */ 75 VPFE_ISIF_VDFC_NORMAL, 76 /** 77 * Defect level subtraction. Horizontal interpolation ((i-2)+(i+2))/2 78 * if data saturating 79 */ 80 VPFE_ISIF_VDFC_HORZ_INTERPOL_IF_SAT, 81 /* Horizontal interpolation (((i-2)+(i+2))/2) */ 82 VPFE_ISIF_VDFC_HORZ_INTERPOL 83 }; 84 85 /** 86 * Max Size of the Vertical Defect Correction table 87 */ 88 #define VPFE_ISIF_VDFC_TABLE_SIZE 8 89 90 /** 91 * Values used for shifting up the vdfc defect level 92 */ 93 enum vpfe_isif_vdfc_shift { 94 /* No Shift */ 95 VPFE_ISIF_VDFC_NO_SHIFT, 96 /* Shift by 1 bit */ 97 VPFE_ISIF_VDFC_SHIFT_1, 98 /* Shift by 2 bit */ 99 VPFE_ISIF_VDFC_SHIFT_2, 100 /* Shift by 3 bit */ 101 VPFE_ISIF_VDFC_SHIFT_3, 102 /* Shift by 4 bit */ 103 VPFE_ISIF_VDFC_SHIFT_4 104 }; 105 106 /** 107 * Defect Correction (DFC) table entry 108 */ 109 struct vpfe_isif_vdfc_entry { 110 /* vertical position of defect */ 111 unsigned short pos_vert; 112 /* horizontal position of defect */ 113 unsigned short pos_horz; 114 /** 115 * Defect level of Vertical line defect position. This is subtracted 116 * from the data at the defect position 117 */ 118 unsigned char level_at_pos; 119 /** 120 * Defect level of the pixels upper than the vertical line defect. 121 * This is subtracted from the data 122 */ 123 unsigned char level_up_pixels; 124 /** 125 * Defect level of the pixels lower than the vertical line defect. 126 * This is subtracted from the data 127 */ 128 unsigned char level_low_pixels; 129 }; 130 131 /** 132 * Structure for Defect Correction (DFC) parameter 133 */ 134 struct vpfe_isif_dfc { 135 /* enable vertical defect correction */ 136 unsigned char en; 137 /* Correction methods */ 138 enum vpfe_isif_vdfc_corr_mode corr_mode; 139 /** 140 * 0 - whole line corrected, 1 - not 141 * pixels upper than the defect 142 */ 143 unsigned char corr_whole_line; 144 /** 145 * defect level shift value. level_at_pos, level_upper_pos, 146 * and level_lower_pos can be shifted up by this value 147 */ 148 enum vpfe_isif_vdfc_shift def_level_shift; 149 /* defect saturation level */ 150 unsigned short def_sat_level; 151 /* number of vertical defects. Max is VPFE_ISIF_VDFC_TABLE_SIZE */ 152 short num_vdefects; 153 /* VDFC table ptr */ 154 struct vpfe_isif_vdfc_entry table[VPFE_ISIF_VDFC_TABLE_SIZE]; 155 }; 156 157 /************************************************************************ 158 * Digital/Black clamp or DC Subtract parameters 159 ************************************************************************/ 160 /** 161 * Horizontal Black Clamp modes 162 */ 163 enum vpfe_isif_horz_bc_mode { 164 /** 165 * Horizontal clamp disabled. Only vertical clamp 166 * value is subtracted 167 */ 168 VPFE_ISIF_HORZ_BC_DISABLE, 169 /** 170 * Horizontal clamp value is calculated and subtracted 171 * from image data along with vertical clamp value 172 */ 173 VPFE_ISIF_HORZ_BC_CLAMP_CALC_ENABLED, 174 /** 175 * Horizontal clamp value calculated from previous image 176 * is subtracted from image data along with vertical clamp 177 * value. How the horizontal clamp value for the first image 178 * is calculated in this case ??? 179 */ 180 VPFE_ISIF_HORZ_BC_CLAMP_NOT_UPDATED 181 }; 182 183 /** 184 * Base window selection for Horizontal Black Clamp calculations 185 */ 186 enum vpfe_isif_horz_bc_base_win_sel { 187 /* Select Most left window for bc calculation */ 188 VPFE_ISIF_SEL_MOST_LEFT_WIN, 189 190 /* Select Most right window for bc calculation */ 191 VPFE_ISIF_SEL_MOST_RIGHT_WIN, 192 }; 193 194 /* Size of window in horizontal direction for horizontal bc */ 195 enum vpfe_isif_horz_bc_sz_h { 196 VPFE_ISIF_HORZ_BC_SZ_H_2PIXELS, 197 VPFE_ISIF_HORZ_BC_SZ_H_4PIXELS, 198 VPFE_ISIF_HORZ_BC_SZ_H_8PIXELS, 199 VPFE_ISIF_HORZ_BC_SZ_H_16PIXELS 200 }; 201 202 /* Size of window in vertcal direction for vertical bc */ 203 enum vpfe_isif_horz_bc_sz_v { 204 VPFE_ISIF_HORZ_BC_SZ_H_32PIXELS, 205 VPFE_ISIF_HORZ_BC_SZ_H_64PIXELS, 206 VPFE_ISIF_HORZ_BC_SZ_H_128PIXELS, 207 VPFE_ISIF_HORZ_BC_SZ_H_256PIXELS 208 }; 209 210 /** 211 * Structure for Horizontal Black Clamp config params 212 */ 213 struct vpfe_isif_horz_bclamp { 214 /* horizontal clamp mode */ 215 enum vpfe_isif_horz_bc_mode mode; 216 /** 217 * pixel value limit enable. 218 * 0 - limit disabled 219 * 1 - pixel value limited to 1023 220 */ 221 unsigned char clamp_pix_limit; 222 /** 223 * Select most left or right window for clamp val 224 * calculation 225 */ 226 enum vpfe_isif_horz_bc_base_win_sel base_win_sel_calc; 227 /* Window count per color for calculation. range 1-32 */ 228 unsigned char win_count_calc; 229 /* Window start position - horizontal for calculation. 0 - 8191 */ 230 unsigned short win_start_h_calc; 231 /* Window start position - vertical for calculation 0 - 8191 */ 232 unsigned short win_start_v_calc; 233 /* Width of the sample window in pixels for calculation */ 234 enum vpfe_isif_horz_bc_sz_h win_h_sz_calc; 235 /* Height of the sample window in pixels for calculation */ 236 enum vpfe_isif_horz_bc_sz_v win_v_sz_calc; 237 }; 238 239 /** 240 * Black Clamp vertical reset values 241 */ 242 enum vpfe_isif_vert_bc_reset_val_sel { 243 /* Reset value used is the clamp value calculated */ 244 VPFE_ISIF_VERT_BC_USE_HORZ_CLAMP_VAL, 245 /* Reset value used is reset_clamp_val configured */ 246 VPFE_ISIF_VERT_BC_USE_CONFIG_CLAMP_VAL, 247 /* No update, previous image value is used */ 248 VPFE_ISIF_VERT_BC_NO_UPDATE 249 }; 250 251 enum vpfe_isif_vert_bc_sz_h { 252 VPFE_ISIF_VERT_BC_SZ_H_2PIXELS, 253 VPFE_ISIF_VERT_BC_SZ_H_4PIXELS, 254 VPFE_ISIF_VERT_BC_SZ_H_8PIXELS, 255 VPFE_ISIF_VERT_BC_SZ_H_16PIXELS, 256 VPFE_ISIF_VERT_BC_SZ_H_32PIXELS, 257 VPFE_ISIF_VERT_BC_SZ_H_64PIXELS 258 }; 259 260 /** 261 * Structure for Vertical Black Clamp configuration params 262 */ 263 struct vpfe_isif_vert_bclamp { 264 /* Reset value selection for vertical clamp calculation */ 265 enum vpfe_isif_vert_bc_reset_val_sel reset_val_sel; 266 /* U12 value if reset_sel = ISIF_BC_VERT_USE_CONFIG_CLAMP_VAL */ 267 unsigned short reset_clamp_val; 268 /** 269 * U8Q8. Line average coefficient used in vertical clamp 270 * calculation 271 */ 272 unsigned char line_ave_coef; 273 /* Width in pixels of the optical black region used for calculation. */ 274 enum vpfe_isif_vert_bc_sz_h ob_h_sz_calc; 275 /* Height of the optical black region for calculation */ 276 unsigned short ob_v_sz_calc; 277 /* Optical black region start position - horizontal. 0 - 8191 */ 278 unsigned short ob_start_h; 279 /* Optical black region start position - vertical 0 - 8191 */ 280 unsigned short ob_start_v; 281 }; 282 283 /** 284 * Structure for Black Clamp configuration params 285 */ 286 struct vpfe_isif_black_clamp { 287 /** 288 * this offset value is added irrespective of the clamp 289 * enable status. S13 290 */ 291 unsigned short dc_offset; 292 /** 293 * Enable black/digital clamp value to be subtracted 294 * from the image data 295 */ 296 unsigned char en; 297 /** 298 * black clamp mode. same/separate clamp for 4 colors 299 * 0 - disable - same clamp value for all colors 300 * 1 - clamp value calculated separately for all colors 301 */ 302 unsigned char bc_mode_color; 303 /* Vertical start position for bc subtraction */ 304 unsigned short vert_start_sub; 305 /* Black clamp for horizontal direction */ 306 struct vpfe_isif_horz_bclamp horz; 307 /* Black clamp for vertical direction */ 308 struct vpfe_isif_vert_bclamp vert; 309 }; 310 311 /************************************************************************* 312 ** Color Space Conversion (CSC) 313 *************************************************************************/ 314 /** 315 * Number of Coefficient values used for CSC 316 */ 317 #define VPFE_ISIF_CSC_NUM_COEFF 16 318 319 struct float_8_bit { 320 /* 8 bit integer part */ 321 __u8 integer; 322 /* 8 bit decimal part */ 323 __u8 decimal; 324 }; 325 326 struct float_16_bit { 327 /* 16 bit integer part */ 328 __u16 integer; 329 /* 16 bit decimal part */ 330 __u16 decimal; 331 }; 332 333 /************************************************************************* 334 ** Color Space Conversion parameters 335 *************************************************************************/ 336 /** 337 * Structure used for CSC config params 338 */ 339 struct vpfe_isif_color_space_conv { 340 /* Enable color space conversion */ 341 unsigned char en; 342 /** 343 * csc coefficient table. S8Q5, M00 at index 0, M01 at index 1, and 344 * so forth 345 */ 346 struct float_8_bit coeff[VPFE_ISIF_CSC_NUM_COEFF]; 347 }; 348 349 enum vpfe_isif_datasft { 350 /* No Shift */ 351 VPFE_ISIF_NO_SHIFT, 352 /* 1 bit Shift */ 353 VPFE_ISIF_1BIT_SHIFT, 354 /* 2 bit Shift */ 355 VPFE_ISIF_2BIT_SHIFT, 356 /* 3 bit Shift */ 357 VPFE_ISIF_3BIT_SHIFT, 358 /* 4 bit Shift */ 359 VPFE_ISIF_4BIT_SHIFT, 360 /* 5 bit Shift */ 361 VPFE_ISIF_5BIT_SHIFT, 362 /* 6 bit Shift */ 363 VPFE_ISIF_6BIT_SHIFT 364 }; 365 366 #define VPFE_ISIF_LINEAR_TAB_SIZE 192 367 /************************************************************************* 368 ** Linearization parameters 369 *************************************************************************/ 370 /** 371 * Structure for Sensor data linearization 372 */ 373 struct vpfe_isif_linearize { 374 /* Enable or Disable linearization of data */ 375 unsigned char en; 376 /* Shift value applied */ 377 enum vpfe_isif_datasft corr_shft; 378 /* scale factor applied U11Q10 */ 379 struct float_16_bit scale_fact; 380 /* Size of the linear table */ 381 unsigned short table[VPFE_ISIF_LINEAR_TAB_SIZE]; 382 }; 383 384 /************************************************************************* 385 ** ISIF Raw configuration parameters 386 *************************************************************************/ 387 enum vpfe_isif_fmt_mode { 388 VPFE_ISIF_SPLIT, 389 VPFE_ISIF_COMBINE 390 }; 391 392 enum vpfe_isif_lnum { 393 VPFE_ISIF_1LINE, 394 VPFE_ISIF_2LINES, 395 VPFE_ISIF_3LINES, 396 VPFE_ISIF_4LINES 397 }; 398 399 enum vpfe_isif_line { 400 VPFE_ISIF_1STLINE, 401 VPFE_ISIF_2NDLINE, 402 VPFE_ISIF_3RDLINE, 403 VPFE_ISIF_4THLINE 404 }; 405 406 struct vpfe_isif_fmtplen { 407 /** 408 * number of program entries for SET0, range 1 - 16 409 * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is 410 * ISIF_COMBINE 411 */ 412 unsigned short plen0; 413 /** 414 * number of program entries for SET1, range 1 - 16 415 * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is 416 * ISIF_COMBINE 417 */ 418 unsigned short plen1; 419 /** 420 * number of program entries for SET2, range 1 - 16 421 * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is 422 * ISIF_COMBINE 423 */ 424 unsigned short plen2; 425 /** 426 * number of program entries for SET3, range 1 - 16 427 * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is 428 * ISIF_COMBINE 429 */ 430 unsigned short plen3; 431 }; 432 433 struct vpfe_isif_fmt_cfg { 434 /* Split or combine or line alternate */ 435 enum vpfe_isif_fmt_mode fmtmode; 436 /* enable or disable line alternating mode */ 437 unsigned char ln_alter_en; 438 /* Split/combine line number */ 439 enum vpfe_isif_lnum lnum; 440 /* Address increment Range 1 - 16 */ 441 unsigned int addrinc; 442 }; 443 444 struct vpfe_isif_fmt_addr_ptr { 445 /* Initial address */ 446 unsigned int init_addr; 447 /* output line number */ 448 enum vpfe_isif_line out_line; 449 }; 450 451 struct vpfe_isif_fmtpgm_ap { 452 /* program address pointer */ 453 unsigned char pgm_aptr; 454 /* program address increment or decrement */ 455 unsigned char pgmupdt; 456 }; 457 458 struct vpfe_isif_data_formatter { 459 /* Enable/Disable data formatter */ 460 unsigned char en; 461 /* data formatter configuration */ 462 struct vpfe_isif_fmt_cfg cfg; 463 /* Formatter program entries length */ 464 struct vpfe_isif_fmtplen plen; 465 /* first pixel in a line fed to formatter */ 466 unsigned short fmtrlen; 467 /* HD interval for output line. Only valid when split line */ 468 unsigned short fmthcnt; 469 /* formatter address pointers */ 470 struct vpfe_isif_fmt_addr_ptr fmtaddr_ptr[16]; 471 /* program enable/disable */ 472 unsigned char pgm_en[32]; 473 /* program address pointers */ 474 struct vpfe_isif_fmtpgm_ap fmtpgm_ap[32]; 475 }; 476 477 struct vpfe_isif_df_csc { 478 /* Color Space Conversion configuration, 0 - csc, 1 - df */ 479 unsigned int df_or_csc; 480 /* csc configuration valid if df_or_csc is 0 */ 481 struct vpfe_isif_color_space_conv csc; 482 /* data formatter configuration valid if df_or_csc is 1 */ 483 struct vpfe_isif_data_formatter df; 484 /* start pixel in a line at the input */ 485 unsigned int start_pix; 486 /* number of pixels in input line */ 487 unsigned int num_pixels; 488 /* start line at the input */ 489 unsigned int start_line; 490 /* number of lines at the input */ 491 unsigned int num_lines; 492 }; 493 494 struct vpfe_isif_gain_offsets_adj { 495 /* Enable or Disable Gain adjustment for SDRAM data */ 496 unsigned char gain_sdram_en; 497 /* Enable or Disable Gain adjustment for IPIPE data */ 498 unsigned char gain_ipipe_en; 499 /* Enable or Disable Gain adjustment for H3A data */ 500 unsigned char gain_h3a_en; 501 /* Enable or Disable Gain adjustment for SDRAM data */ 502 unsigned char offset_sdram_en; 503 /* Enable or Disable Gain adjustment for IPIPE data */ 504 unsigned char offset_ipipe_en; 505 /* Enable or Disable Gain adjustment for H3A data */ 506 unsigned char offset_h3a_en; 507 }; 508 509 struct vpfe_isif_cul { 510 /* Horizontal Cull pattern for odd lines */ 511 unsigned char hcpat_odd; 512 /* Horizontal Cull pattern for even lines */ 513 unsigned char hcpat_even; 514 /* Vertical Cull pattern */ 515 unsigned char vcpat; 516 /* Enable or disable lpf. Apply when cull is enabled */ 517 unsigned char en_lpf; 518 }; 519 520 /* all the stuff in this struct will be provided by userland */ 521 struct vpfe_isif_raw_config { 522 /* Linearization parameters for image sensor data input */ 523 struct vpfe_isif_linearize linearize; 524 /* Data formatter or CSC */ 525 struct vpfe_isif_df_csc df_csc; 526 /* Defect Pixel Correction (DFC) confguration */ 527 struct vpfe_isif_dfc dfc; 528 /* Black/Digital Clamp configuration */ 529 struct vpfe_isif_black_clamp bclamp; 530 /* Gain, offset adjustments */ 531 struct vpfe_isif_gain_offsets_adj gain_offset; 532 /* Culling */ 533 struct vpfe_isif_cul culling; 534 /* horizontal offset for Gain/LSC/DFC */ 535 unsigned short horz_offset; 536 /* vertical offset for Gain/LSC/DFC */ 537 unsigned short vert_offset; 538 }; 539 540 /********************************************************************** 541 IPIPE API Structures 542 **********************************************************************/ 543 544 /* IPIPE module configurations */ 545 546 /* IPIPE input configuration */ 547 #define VPFE_IPIPE_INPUT_CONFIG (1 << 0) 548 /* LUT based Defect Pixel Correction */ 549 #define VPFE_IPIPE_LUTDPC (1 << 1) 550 /* On the fly (OTF) Defect Pixel Correction */ 551 #define VPFE_IPIPE_OTFDPC (1 << 2) 552 /* Noise Filter - 1 */ 553 #define VPFE_IPIPE_NF1 (1 << 3) 554 /* Noise Filter - 2 */ 555 #define VPFE_IPIPE_NF2 (1 << 4) 556 /* White Balance. Also a control ID */ 557 #define VPFE_IPIPE_WB (1 << 5) 558 /* 1st RGB to RBG Blend module */ 559 #define VPFE_IPIPE_RGB2RGB_1 (1 << 6) 560 /* 2nd RGB to RBG Blend module */ 561 #define VPFE_IPIPE_RGB2RGB_2 (1 << 7) 562 /* Gamma Correction */ 563 #define VPFE_IPIPE_GAMMA (1 << 8) 564 /* 3D LUT color conversion */ 565 #define VPFE_IPIPE_3D_LUT (1 << 9) 566 /* RGB to YCbCr module */ 567 #define VPFE_IPIPE_RGB2YUV (1 << 10) 568 /* YUV 422 conversion module */ 569 #define VPFE_IPIPE_YUV422_CONV (1 << 11) 570 /* Edge Enhancement */ 571 #define VPFE_IPIPE_YEE (1 << 12) 572 /* Green Imbalance Correction */ 573 #define VPFE_IPIPE_GIC (1 << 13) 574 /* CFA Interpolation */ 575 #define VPFE_IPIPE_CFA (1 << 14) 576 /* Chroma Artifact Reduction */ 577 #define VPFE_IPIPE_CAR (1 << 15) 578 /* Chroma Gain Suppression */ 579 #define VPFE_IPIPE_CGS (1 << 16) 580 /* Global brightness and contrast control */ 581 #define VPFE_IPIPE_GBCE (1 << 17) 582 583 #define VPFE_IPIPE_MAX_MODULES 18 584 585 struct ipipe_float_u16 { 586 unsigned short integer; 587 unsigned short decimal; 588 }; 589 590 struct ipipe_float_s16 { 591 short integer; 592 unsigned short decimal; 593 }; 594 595 struct ipipe_float_u8 { 596 unsigned char integer; 597 unsigned char decimal; 598 }; 599 600 /* Copy method selection for vertical correction 601 * Used when ipipe_dfc_corr_meth is IPIPE_DPC_CTORB_AFTER_HINT 602 */ 603 enum vpfe_ipipe_dpc_corr_meth { 604 /* replace by black or white dot specified by repl_white */ 605 VPFE_IPIPE_DPC_REPL_BY_DOT = 0, 606 /* Copy from left */ 607 VPFE_IPIPE_DPC_CL = 1, 608 /* Copy from right */ 609 VPFE_IPIPE_DPC_CR = 2, 610 /* Horizontal interpolation */ 611 VPFE_IPIPE_DPC_H_INTP = 3, 612 /* Vertical interpolation */ 613 VPFE_IPIPE_DPC_V_INTP = 4, 614 /* Copy from top */ 615 VPFE_IPIPE_DPC_CT = 5, 616 /* Copy from bottom */ 617 VPFE_IPIPE_DPC_CB = 6, 618 /* 2D interpolation */ 619 VPFE_IPIPE_DPC_2D_INTP = 7, 620 }; 621 622 struct vpfe_ipipe_lutdpc_entry { 623 /* Horizontal position */ 624 unsigned short horz_pos; 625 /* vertical position */ 626 unsigned short vert_pos; 627 enum vpfe_ipipe_dpc_corr_meth method; 628 }; 629 630 #define VPFE_IPIPE_MAX_SIZE_DPC 256 631 632 /* Structure for configuring DPC module */ 633 struct vpfe_ipipe_lutdpc { 634 /* 0 - disable, 1 - enable */ 635 unsigned char en; 636 /* 0 - replace with black dot, 1 - white dot when correction 637 * method is IPIPE_DFC_REPL_BY_DOT=0, 638 */ 639 unsigned char repl_white; 640 /* number of entries in the correction table. Currently only 641 * support up-to 256 entries. infinite mode is not supported 642 */ 643 unsigned short dpc_size; 644 struct vpfe_ipipe_lutdpc_entry table[VPFE_IPIPE_MAX_SIZE_DPC]; 645 }; 646 647 enum vpfe_ipipe_otfdpc_det_meth { 648 VPFE_IPIPE_DPC_OTF_MIN_MAX, 649 VPFE_IPIPE_DPC_OTF_MIN_MAX2 650 }; 651 652 struct vpfe_ipipe_otfdpc_thr { 653 unsigned short r; 654 unsigned short gr; 655 unsigned short gb; 656 unsigned short b; 657 }; 658 659 enum vpfe_ipipe_otfdpc_alg { 660 VPFE_IPIPE_OTFDPC_2_0, 661 VPFE_IPIPE_OTFDPC_3_0 662 }; 663 664 struct vpfe_ipipe_otfdpc_2_0_cfg { 665 /* defect detection threshold for MIN_MAX2 method (DPC 2.0 alg) */ 666 struct vpfe_ipipe_otfdpc_thr det_thr; 667 /* defect correction threshold for MIN_MAX2 method (DPC 2.0 alg) or 668 * maximum value for MIN_MAX method 669 */ 670 struct vpfe_ipipe_otfdpc_thr corr_thr; 671 }; 672 673 struct vpfe_ipipe_otfdpc_3_0_cfg { 674 /* DPC3.0 activity adj shf. activity = (max2-min2) >> (6 -shf) 675 */ 676 unsigned char act_adj_shf; 677 /* DPC3.0 detection threshold, THR */ 678 unsigned short det_thr; 679 /* DPC3.0 detection threshold slope, SLP */ 680 unsigned short det_slp; 681 /* DPC3.0 detection threshold min, MIN */ 682 unsigned short det_thr_min; 683 /* DPC3.0 detection threshold max, MAX */ 684 unsigned short det_thr_max; 685 /* DPC3.0 correction threshold, THR */ 686 unsigned short corr_thr; 687 /* DPC3.0 correction threshold slope, SLP */ 688 unsigned short corr_slp; 689 /* DPC3.0 correction threshold min, MIN */ 690 unsigned short corr_thr_min; 691 /* DPC3.0 correction threshold max, MAX */ 692 unsigned short corr_thr_max; 693 }; 694 695 struct vpfe_ipipe_otfdpc { 696 /* 0 - disable, 1 - enable */ 697 unsigned char en; 698 /* defect detection method */ 699 enum vpfe_ipipe_otfdpc_det_meth det_method; 700 /* Algorithm used. Applicable only when IPIPE_DPC_OTF_MIN_MAX2 is 701 * used 702 */ 703 enum vpfe_ipipe_otfdpc_alg alg; 704 union { 705 /* if alg is IPIPE_OTFDPC_2_0 */ 706 struct vpfe_ipipe_otfdpc_2_0_cfg dpc_2_0; 707 /* if alg is IPIPE_OTFDPC_3_0 */ 708 struct vpfe_ipipe_otfdpc_3_0_cfg dpc_3_0; 709 } alg_cfg; 710 }; 711 712 /* Threshold values table size */ 713 #define VPFE_IPIPE_NF_THR_TABLE_SIZE 8 714 /* Intensity values table size */ 715 #define VPFE_IPIPE_NF_STR_TABLE_SIZE 8 716 717 /* NF, sampling method for green pixels */ 718 enum vpfe_ipipe_nf_sampl_meth { 719 /* Same as R or B */ 720 VPFE_IPIPE_NF_BOX, 721 /* Diamond mode */ 722 VPFE_IPIPE_NF_DIAMOND 723 }; 724 725 /* Structure for configuring NF module */ 726 struct vpfe_ipipe_nf { 727 /* 0 - disable, 1 - enable */ 728 unsigned char en; 729 /* Sampling method for green pixels */ 730 enum vpfe_ipipe_nf_sampl_meth gr_sample_meth; 731 /* Down shift value in LUT reference address 732 */ 733 unsigned char shft_val; 734 /* Spread value in NF algorithm 735 */ 736 unsigned char spread_val; 737 /* Apply LSC gain to threshold. Enable this only if 738 * LSC is enabled in ISIF 739 */ 740 unsigned char apply_lsc_gain; 741 /* Threshold values table */ 742 unsigned short thr[VPFE_IPIPE_NF_THR_TABLE_SIZE]; 743 /* intensity values table */ 744 unsigned char str[VPFE_IPIPE_NF_STR_TABLE_SIZE]; 745 /* Edge detection minimum threshold */ 746 unsigned short edge_det_min_thr; 747 /* Edge detection maximum threshold */ 748 unsigned short edge_det_max_thr; 749 }; 750 751 enum vpfe_ipipe_gic_alg { 752 VPFE_IPIPE_GIC_ALG_CONST_GAIN, 753 VPFE_IPIPE_GIC_ALG_ADAPT_GAIN 754 }; 755 756 enum vpfe_ipipe_gic_thr_sel { 757 VPFE_IPIPE_GIC_THR_REG, 758 VPFE_IPIPE_GIC_THR_NF 759 }; 760 761 enum vpfe_ipipe_gic_wt_fn_type { 762 /* Use difference as index */ 763 VPFE_IPIPE_GIC_WT_FN_TYP_DIF, 764 /* Use weight function as index */ 765 VPFE_IPIPE_GIC_WT_FN_TYP_HP_VAL 766 }; 767 768 /* structure for Green Imbalance Correction */ 769 struct vpfe_ipipe_gic { 770 /* 0 - disable, 1 - enable */ 771 unsigned char en; 772 /* 0 - Constant gain , 1 - Adaptive gain algorithm */ 773 enum vpfe_ipipe_gic_alg gic_alg; 774 /* GIC gain or weight. Used for Constant gain and Adaptive algorithms 775 */ 776 unsigned short gain; 777 /* Threshold selection. GIC register values or NF2 thr table */ 778 enum vpfe_ipipe_gic_thr_sel thr_sel; 779 /* thr1. Used when thr_sel is IPIPE_GIC_THR_REG */ 780 unsigned short thr; 781 /* this value is used for thr2-thr1, thr3-thr2 or 782 * thr4-thr3 when wt_fn_type is index. Otherwise it 783 * is the 784 */ 785 unsigned short slope; 786 /* Apply LSC gain to threshold. Enable this only if 787 * LSC is enabled in ISIF & thr_sel is IPIPE_GIC_THR_REG 788 */ 789 unsigned char apply_lsc_gain; 790 /* Multiply Nf2 threshold by this gain. Use this when thr_sel 791 * is IPIPE_GIC_THR_NF 792 */ 793 struct ipipe_float_u8 nf2_thr_gain; 794 /* Weight function uses difference as index or high pass value. 795 * Used for adaptive gain algorithm 796 */ 797 enum vpfe_ipipe_gic_wt_fn_type wt_fn_type; 798 }; 799 800 /* Structure for configuring WB module */ 801 struct vpfe_ipipe_wb { 802 /* Offset (S12) for R */ 803 short ofst_r; 804 /* Offset (S12) for Gr */ 805 short ofst_gr; 806 /* Offset (S12) for Gb */ 807 short ofst_gb; 808 /* Offset (S12) for B */ 809 short ofst_b; 810 /* Gain (U13Q9) for Red */ 811 struct ipipe_float_u16 gain_r; 812 /* Gain (U13Q9) for Gr */ 813 struct ipipe_float_u16 gain_gr; 814 /* Gain (U13Q9) for Gb */ 815 struct ipipe_float_u16 gain_gb; 816 /* Gain (U13Q9) for Blue */ 817 struct ipipe_float_u16 gain_b; 818 }; 819 820 enum vpfe_ipipe_cfa_alg { 821 /* Algorithm is 2DirAC */ 822 VPFE_IPIPE_CFA_ALG_2DIRAC, 823 /* Algorithm is 2DirAC + Digital Antialiasing (DAA) */ 824 VPFE_IPIPE_CFA_ALG_2DIRAC_DAA, 825 /* Algorithm is DAA */ 826 VPFE_IPIPE_CFA_ALG_DAA 827 }; 828 829 /* Structure for CFA Interpolation */ 830 struct vpfe_ipipe_cfa { 831 /* 2DirAC or 2DirAC + DAA */ 832 enum vpfe_ipipe_cfa_alg alg; 833 /* 2Dir CFA HP value Low Threshold */ 834 unsigned short hpf_thr_2dir; 835 /* 2Dir CFA HP value slope */ 836 unsigned short hpf_slp_2dir; 837 /* 2Dir CFA HP mix threshold */ 838 unsigned short hp_mix_thr_2dir; 839 /* 2Dir CFA HP mix slope */ 840 unsigned short hp_mix_slope_2dir; 841 /* 2Dir Direction threshold */ 842 unsigned short dir_thr_2dir; 843 /* 2Dir Direction slope */ 844 unsigned short dir_slope_2dir; 845 /* 2Dir Non Directional Weight */ 846 unsigned short nd_wt_2dir; 847 /* DAA Mono Hue Fraction */ 848 unsigned short hue_fract_daa; 849 /* DAA Mono Edge threshold */ 850 unsigned short edge_thr_daa; 851 /* DAA Mono threshold minimum */ 852 unsigned short thr_min_daa; 853 /* DAA Mono threshold slope */ 854 unsigned short thr_slope_daa; 855 /* DAA Mono slope minimum */ 856 unsigned short slope_min_daa; 857 /* DAA Mono slope slope */ 858 unsigned short slope_slope_daa; 859 /* DAA Mono LP wight */ 860 unsigned short lp_wt_daa; 861 }; 862 863 /* Struct for configuring RGB2RGB blending module */ 864 struct vpfe_ipipe_rgb2rgb { 865 /* Matrix coefficient for RR S12Q8 for ID = 1 and S11Q8 for ID = 2 */ 866 struct ipipe_float_s16 coef_rr; 867 /* Matrix coefficient for GR S12Q8/S11Q8 */ 868 struct ipipe_float_s16 coef_gr; 869 /* Matrix coefficient for BR S12Q8/S11Q8 */ 870 struct ipipe_float_s16 coef_br; 871 /* Matrix coefficient for RG S12Q8/S11Q8 */ 872 struct ipipe_float_s16 coef_rg; 873 /* Matrix coefficient for GG S12Q8/S11Q8 */ 874 struct ipipe_float_s16 coef_gg; 875 /* Matrix coefficient for BG S12Q8/S11Q8 */ 876 struct ipipe_float_s16 coef_bg; 877 /* Matrix coefficient for RB S12Q8/S11Q8 */ 878 struct ipipe_float_s16 coef_rb; 879 /* Matrix coefficient for GB S12Q8/S11Q8 */ 880 struct ipipe_float_s16 coef_gb; 881 /* Matrix coefficient for BB S12Q8/S11Q8 */ 882 struct ipipe_float_s16 coef_bb; 883 /* Output offset for R S13/S11 */ 884 int out_ofst_r; 885 /* Output offset for G S13/S11 */ 886 int out_ofst_g; 887 /* Output offset for B S13/S11 */ 888 int out_ofst_b; 889 }; 890 891 #define VPFE_IPIPE_MAX_SIZE_GAMMA 512 892 893 enum vpfe_ipipe_gamma_tbl_size { 894 VPFE_IPIPE_GAMMA_TBL_SZ_64 = 64, 895 VPFE_IPIPE_GAMMA_TBL_SZ_128 = 128, 896 VPFE_IPIPE_GAMMA_TBL_SZ_256 = 256, 897 VPFE_IPIPE_GAMMA_TBL_SZ_512 = 512, 898 }; 899 900 enum vpfe_ipipe_gamma_tbl_sel { 901 VPFE_IPIPE_GAMMA_TBL_RAM = 0, 902 VPFE_IPIPE_GAMMA_TBL_ROM = 1, 903 }; 904 905 struct vpfe_ipipe_gamma_entry { 906 /* 10 bit slope */ 907 short slope; 908 /* 10 bit offset */ 909 unsigned short offset; 910 }; 911 912 /* Structure for configuring Gamma correction module */ 913 struct vpfe_ipipe_gamma { 914 /* 0 - Enable Gamma correction for Red 915 * 1 - bypass Gamma correction. Data is divided by 16 916 */ 917 unsigned char bypass_r; 918 /* 0 - Enable Gamma correction for Blue 919 * 1 - bypass Gamma correction. Data is divided by 16 920 */ 921 unsigned char bypass_b; 922 /* 0 - Enable Gamma correction for Green 923 * 1 - bypass Gamma correction. Data is divided by 16 924 */ 925 unsigned char bypass_g; 926 /* IPIPE_GAMMA_TBL_RAM or IPIPE_GAMMA_TBL_ROM */ 927 enum vpfe_ipipe_gamma_tbl_sel tbl_sel; 928 /* Table size for RAM gamma table. 929 */ 930 enum vpfe_ipipe_gamma_tbl_size tbl_size; 931 /* R table */ 932 struct vpfe_ipipe_gamma_entry table_r[VPFE_IPIPE_MAX_SIZE_GAMMA]; 933 /* Blue table */ 934 struct vpfe_ipipe_gamma_entry table_b[VPFE_IPIPE_MAX_SIZE_GAMMA]; 935 /* Green table */ 936 struct vpfe_ipipe_gamma_entry table_g[VPFE_IPIPE_MAX_SIZE_GAMMA]; 937 }; 938 939 #define VPFE_IPIPE_MAX_SIZE_3D_LUT 729 940 941 struct vpfe_ipipe_3d_lut_entry { 942 /* 10 bit entry for red */ 943 unsigned short r; 944 /* 10 bit entry for green */ 945 unsigned short g; 946 /* 10 bit entry for blue */ 947 unsigned short b; 948 }; 949 950 /* structure for 3D-LUT */ 951 struct vpfe_ipipe_3d_lut { 952 /* enable/disable 3D lut */ 953 unsigned char en; 954 /* 3D - LUT table entry */ 955 struct vpfe_ipipe_3d_lut_entry table[VPFE_IPIPE_MAX_SIZE_3D_LUT]; 956 }; 957 958 /* Struct for configuring rgb2ycbcr module */ 959 struct vpfe_ipipe_rgb2yuv { 960 /* Matrix coefficient for RY S12Q8 */ 961 struct ipipe_float_s16 coef_ry; 962 /* Matrix coefficient for GY S12Q8 */ 963 struct ipipe_float_s16 coef_gy; 964 /* Matrix coefficient for BY S12Q8 */ 965 struct ipipe_float_s16 coef_by; 966 /* Matrix coefficient for RCb S12Q8 */ 967 struct ipipe_float_s16 coef_rcb; 968 /* Matrix coefficient for GCb S12Q8 */ 969 struct ipipe_float_s16 coef_gcb; 970 /* Matrix coefficient for BCb S12Q8 */ 971 struct ipipe_float_s16 coef_bcb; 972 /* Matrix coefficient for RCr S12Q8 */ 973 struct ipipe_float_s16 coef_rcr; 974 /* Matrix coefficient for GCr S12Q8 */ 975 struct ipipe_float_s16 coef_gcr; 976 /* Matrix coefficient for BCr S12Q8 */ 977 struct ipipe_float_s16 coef_bcr; 978 /* Output offset for R S11 */ 979 int out_ofst_y; 980 /* Output offset for Cb S11 */ 981 int out_ofst_cb; 982 /* Output offset for Cr S11 */ 983 int out_ofst_cr; 984 }; 985 986 enum vpfe_ipipe_gbce_type { 987 VPFE_IPIPE_GBCE_Y_VAL_TBL = 0, 988 VPFE_IPIPE_GBCE_GAIN_TBL = 1, 989 }; 990 991 #define VPFE_IPIPE_MAX_SIZE_GBCE_LUT 1024 992 993 /* structure for Global brightness and Contrast */ 994 struct vpfe_ipipe_gbce { 995 /* enable/disable GBCE */ 996 unsigned char en; 997 /* Y - value table or Gain table */ 998 enum vpfe_ipipe_gbce_type type; 999 /* ptr to LUT for GBCE with 1024 entries */ 1000 unsigned short table[VPFE_IPIPE_MAX_SIZE_GBCE_LUT]; 1001 }; 1002 1003 /* Chrominance position. Applicable only for YCbCr input 1004 * Applied after edge enhancement 1005 */ 1006 enum vpfe_chr_pos { 1007 /* Co-siting, same position with luminance */ 1008 VPFE_IPIPE_YUV422_CHR_POS_COSITE = 0, 1009 /* Centering, In the middle of luminance */ 1010 VPFE_IPIPE_YUV422_CHR_POS_CENTRE = 1, 1011 }; 1012 1013 /* Structure for configuring yuv422 conversion module */ 1014 struct vpfe_ipipe_yuv422_conv { 1015 /* Max Chrominance value */ 1016 unsigned char en_chrom_lpf; 1017 /* 1 - enable LPF for chrminance, 0 - disable */ 1018 enum vpfe_chr_pos chrom_pos; 1019 }; 1020 1021 #define VPFE_IPIPE_MAX_SIZE_YEE_LUT 1024 1022 1023 enum vpfe_ipipe_yee_merge_meth { 1024 VPFE_IPIPE_YEE_ABS_MAX = 0, 1025 VPFE_IPIPE_YEE_EE_ES = 1, 1026 }; 1027 1028 /* Structure for configuring YUV Edge Enhancement module */ 1029 struct vpfe_ipipe_yee { 1030 /* 1 - enable enhancement, 0 - disable */ 1031 unsigned char en; 1032 /* enable/disable halo reduction in edge sharpner */ 1033 unsigned char en_halo_red; 1034 /* Merge method between Edge Enhancer and Edge sharpner */ 1035 enum vpfe_ipipe_yee_merge_meth merge_meth; 1036 /* HPF Shift length */ 1037 unsigned char hpf_shft; 1038 /* HPF Coefficient 00, S10 */ 1039 short hpf_coef_00; 1040 /* HPF Coefficient 01, S10 */ 1041 short hpf_coef_01; 1042 /* HPF Coefficient 02, S10 */ 1043 short hpf_coef_02; 1044 /* HPF Coefficient 10, S10 */ 1045 short hpf_coef_10; 1046 /* HPF Coefficient 11, S10 */ 1047 short hpf_coef_11; 1048 /* HPF Coefficient 12, S10 */ 1049 short hpf_coef_12; 1050 /* HPF Coefficient 20, S10 */ 1051 short hpf_coef_20; 1052 /* HPF Coefficient 21, S10 */ 1053 short hpf_coef_21; 1054 /* HPF Coefficient 22, S10 */ 1055 short hpf_coef_22; 1056 /* Lower threshold before referring to LUT */ 1057 unsigned short yee_thr; 1058 /* Edge sharpener Gain */ 1059 unsigned short es_gain; 1060 /* Edge sharpener lower threshold */ 1061 unsigned short es_thr1; 1062 /* Edge sharpener upper threshold */ 1063 unsigned short es_thr2; 1064 /* Edge sharpener gain on gradient */ 1065 unsigned short es_gain_grad; 1066 /* Edge sharpener offset on gradient */ 1067 unsigned short es_ofst_grad; 1068 /* Ptr to EE table. Must have 1024 entries */ 1069 short table[VPFE_IPIPE_MAX_SIZE_YEE_LUT]; 1070 }; 1071 1072 enum vpfe_ipipe_car_meth { 1073 /* Chromatic Gain Control */ 1074 VPFE_IPIPE_CAR_CHR_GAIN_CTRL = 0, 1075 /* Dynamic switching between CHR_GAIN_CTRL 1076 * and MED_FLTR 1077 */ 1078 VPFE_IPIPE_CAR_DYN_SWITCH = 1, 1079 /* Median Filter */ 1080 VPFE_IPIPE_CAR_MED_FLTR = 2, 1081 }; 1082 1083 enum vpfe_ipipe_car_hpf_type { 1084 VPFE_IPIPE_CAR_HPF_Y = 0, 1085 VPFE_IPIPE_CAR_HPF_H = 1, 1086 VPFE_IPIPE_CAR_HPF_V = 2, 1087 VPFE_IPIPE_CAR_HPF_2D = 3, 1088 /* 2D HPF from YUV Edge Enhancement */ 1089 VPFE_IPIPE_CAR_HPF_2D_YEE = 4, 1090 }; 1091 1092 struct vpfe_ipipe_car_gain { 1093 /* csup_gain */ 1094 unsigned char gain; 1095 /* csup_shf. */ 1096 unsigned char shft; 1097 /* gain minimum */ 1098 unsigned short gain_min; 1099 }; 1100 1101 /* Structure for Chromatic Artifact Reduction */ 1102 struct vpfe_ipipe_car { 1103 /* enable/disable */ 1104 unsigned char en; 1105 /* Gain control or Dynamic switching */ 1106 enum vpfe_ipipe_car_meth meth; 1107 /* Gain1 function configuration for Gain control */ 1108 struct vpfe_ipipe_car_gain gain1; 1109 /* Gain2 function configuration for Gain control */ 1110 struct vpfe_ipipe_car_gain gain2; 1111 /* HPF type used for CAR */ 1112 enum vpfe_ipipe_car_hpf_type hpf; 1113 /* csup_thr: HPF threshold for Gain control */ 1114 unsigned char hpf_thr; 1115 /* Down shift value for hpf. 2 bits */ 1116 unsigned char hpf_shft; 1117 /* switch limit for median filter */ 1118 unsigned char sw0; 1119 /* switch coefficient for Gain control */ 1120 unsigned char sw1; 1121 }; 1122 1123 /* structure for Chromatic Gain Suppression */ 1124 struct vpfe_ipipe_cgs { 1125 /* enable/disable */ 1126 unsigned char en; 1127 /* gain1 bright side threshold */ 1128 unsigned char h_thr; 1129 /* gain1 bright side slope */ 1130 unsigned char h_slope; 1131 /* gain1 down shift value for bright side */ 1132 unsigned char h_shft; 1133 /* gain1 bright side minimum gain */ 1134 unsigned char h_min; 1135 }; 1136 1137 /* Max pixels allowed in the input. If above this either decimation 1138 * or frame division mode to be enabled 1139 */ 1140 #define VPFE_IPIPE_MAX_INPUT_WIDTH 2600 1141 1142 struct vpfe_ipipe_input_config { 1143 unsigned int vst; 1144 unsigned int hst; 1145 }; 1146 1147 /** 1148 * struct vpfe_ipipe_config - IPIPE engine configuration (user) 1149 * @input_config: Pointer to structure for ipipe configuration. 1150 * @flag: Specifies which ISP IPIPE functions should be enabled. 1151 * @lutdpc: Pointer to luma enhancement structure. 1152 * @otfdpc: Pointer to structure for defect correction. 1153 * @nf1: Pointer to structure for Noise Filter. 1154 * @nf2: Pointer to structure for Noise Filter. 1155 * @gic: Pointer to structure for Green Imbalance. 1156 * @wbal: Pointer to structure for White Balance. 1157 * @cfa: Pointer to structure containing the CFA interpolation. 1158 * @rgb2rgb1: Pointer to structure for RGB to RGB Blending. 1159 * @rgb2rgb2: Pointer to structure for RGB to RGB Blending. 1160 * @gamma: Pointer to gamma structure. 1161 * @lut: Pointer to structure for 3D LUT. 1162 * @rgb2yuv: Pointer to structure for RGB-YCbCr conversion. 1163 * @gbce: Pointer to structure for Global Brightness,Contrast Control. 1164 * @yuv422_conv: Pointer to structure for YUV 422 conversion. 1165 * @yee: Pointer to structure for Edge Enhancer. 1166 * @car: Pointer to structure for Chromatic Artifact Reduction. 1167 * @cgs: Pointer to structure for Chromatic Gain Suppression. 1168 */ 1169 struct vpfe_ipipe_config { 1170 __u32 flag; 1171 struct vpfe_ipipe_input_config __user *input_config; 1172 struct vpfe_ipipe_lutdpc __user *lutdpc; 1173 struct vpfe_ipipe_otfdpc __user *otfdpc; 1174 struct vpfe_ipipe_nf __user *nf1; 1175 struct vpfe_ipipe_nf __user *nf2; 1176 struct vpfe_ipipe_gic __user *gic; 1177 struct vpfe_ipipe_wb __user *wbal; 1178 struct vpfe_ipipe_cfa __user *cfa; 1179 struct vpfe_ipipe_rgb2rgb __user *rgb2rgb1; 1180 struct vpfe_ipipe_rgb2rgb __user *rgb2rgb2; 1181 struct vpfe_ipipe_gamma __user *gamma; 1182 struct vpfe_ipipe_3d_lut __user *lut; 1183 struct vpfe_ipipe_rgb2yuv __user *rgb2yuv; 1184 struct vpfe_ipipe_gbce __user *gbce; 1185 struct vpfe_ipipe_yuv422_conv __user *yuv422_conv; 1186 struct vpfe_ipipe_yee __user *yee; 1187 struct vpfe_ipipe_car __user *car; 1188 struct vpfe_ipipe_cgs __user *cgs; 1189 }; 1190 1191 /******************************************************************* 1192 ** Resizer API structures 1193 *******************************************************************/ 1194 /* Interpolation types used for horizontal rescale */ 1195 enum vpfe_rsz_intp_t { 1196 VPFE_RSZ_INTP_CUBIC, 1197 VPFE_RSZ_INTP_LINEAR 1198 }; 1199 1200 /* Horizontal LPF intensity selection */ 1201 enum vpfe_rsz_h_lpf_lse_t { 1202 VPFE_RSZ_H_LPF_LSE_INTERN, 1203 VPFE_RSZ_H_LPF_LSE_USER_VAL 1204 }; 1205 1206 enum vpfe_rsz_down_scale_ave_sz { 1207 VPFE_IPIPE_DWN_SCALE_1_OVER_2, 1208 VPFE_IPIPE_DWN_SCALE_1_OVER_4, 1209 VPFE_IPIPE_DWN_SCALE_1_OVER_8, 1210 VPFE_IPIPE_DWN_SCALE_1_OVER_16, 1211 VPFE_IPIPE_DWN_SCALE_1_OVER_32, 1212 VPFE_IPIPE_DWN_SCALE_1_OVER_64, 1213 VPFE_IPIPE_DWN_SCALE_1_OVER_128, 1214 VPFE_IPIPE_DWN_SCALE_1_OVER_256 1215 }; 1216 1217 struct vpfe_rsz_output_spec { 1218 /* enable horizontal flip */ 1219 unsigned char h_flip; 1220 /* enable vertical flip */ 1221 unsigned char v_flip; 1222 /* line start offset for y. */ 1223 unsigned int vst_y; 1224 /* line start offset for c. Only for 420 */ 1225 unsigned int vst_c; 1226 /* vertical rescale interpolation type, YCbCr or Luminance */ 1227 enum vpfe_rsz_intp_t v_typ_y; 1228 /* vertical rescale interpolation type for Chrominance */ 1229 enum vpfe_rsz_intp_t v_typ_c; 1230 /* vertical lpf intensity - Luminance */ 1231 unsigned char v_lpf_int_y; 1232 /* vertical lpf intensity - Chrominance */ 1233 unsigned char v_lpf_int_c; 1234 /* horizontal rescale interpolation types, YCbCr or Luminance */ 1235 enum vpfe_rsz_intp_t h_typ_y; 1236 /* horizontal rescale interpolation types, Chrominance */ 1237 enum vpfe_rsz_intp_t h_typ_c; 1238 /* horizontal lpf intensity - Luminance */ 1239 unsigned char h_lpf_int_y; 1240 /* horizontal lpf intensity - Chrominance */ 1241 unsigned char h_lpf_int_c; 1242 /* Use down scale mode for scale down */ 1243 unsigned char en_down_scale; 1244 /* if downscale, set the downscale more average size for horizontal 1245 * direction. Used only if output width and height is less than 1246 * input sizes 1247 */ 1248 enum vpfe_rsz_down_scale_ave_sz h_dscale_ave_sz; 1249 /* if downscale, set the downscale more average size for vertical 1250 * direction. Used only if output width and height is less than 1251 * input sizes 1252 */ 1253 enum vpfe_rsz_down_scale_ave_sz v_dscale_ave_sz; 1254 /* Y offset. If set, the offset would be added to the base address 1255 */ 1256 unsigned int user_y_ofst; 1257 /* C offset. If set, the offset would be added to the base address 1258 */ 1259 unsigned int user_c_ofst; 1260 }; 1261 1262 struct vpfe_rsz_config_params { 1263 unsigned int vst; 1264 /* horizontal start position of the image 1265 * data to IPIPE 1266 */ 1267 unsigned int hst; 1268 /* output spec of the image data coming out of resizer - 0(UYVY). 1269 */ 1270 struct vpfe_rsz_output_spec output1; 1271 /* output spec of the image data coming out of resizer - 1(UYVY). 1272 */ 1273 struct vpfe_rsz_output_spec output2; 1274 /* 0 , chroma sample at odd pixel, 1 - even pixel */ 1275 unsigned char chroma_sample_even; 1276 unsigned char frame_div_mode_en; 1277 unsigned char yuv_y_min; 1278 unsigned char yuv_y_max; 1279 unsigned char yuv_c_min; 1280 unsigned char yuv_c_max; 1281 enum vpfe_chr_pos out_chr_pos; 1282 unsigned char bypass; 1283 }; 1284 1285 /* Structure for VIDIOC_VPFE_RSZ_[S/G]_CONFIG IOCTLs */ 1286 struct vpfe_rsz_config { 1287 struct vpfe_rsz_config_params *config; 1288 }; 1289 1290 #endif /* _DAVINCI_VPFE_USER_H */ 1291