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