1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Copyright (C) 2008-2009 Texas Instruments Inc
4  *
5  * isif header file
6  */
7 #ifndef _ISIF_H
8 #define _ISIF_H
9 
10 #include <media/davinci/ccdc_types.h>
11 #include <media/davinci/vpfe_types.h>
12 
13 /* isif float type S8Q8/U8Q8 */
14 struct isif_float_8 {
15 	/* 8 bit integer part */
16 	__u8 integer;
17 	/* 8 bit decimal part */
18 	__u8 decimal;
19 };
20 
21 /* isif float type U16Q16/S16Q16 */
22 struct isif_float_16 {
23 	/* 16 bit integer part */
24 	__u16 integer;
25 	/* 16 bit decimal part */
26 	__u16 decimal;
27 };
28 
29 /************************************************************************
30  *   Vertical Defect Correction parameters
31  ***********************************************************************/
32 /* Defect Correction (DFC) table entry */
33 struct isif_vdfc_entry {
34 	/* vertical position of defect */
35 	__u16 pos_vert;
36 	/* horizontal position of defect */
37 	__u16 pos_horz;
38 	/*
39 	 * Defect level of Vertical line defect position. This is subtracted
40 	 * from the data at the defect position
41 	 */
42 	__u8 level_at_pos;
43 	/*
44 	 * Defect level of the pixels upper than the vertical line defect.
45 	 * This is subtracted from the data
46 	 */
47 	__u8 level_up_pixels;
48 	/*
49 	 * Defect level of the pixels lower than the vertical line defect.
50 	 * This is subtracted from the data
51 	 */
52 	__u8 level_low_pixels;
53 };
54 
55 #define ISIF_VDFC_TABLE_SIZE		8
56 struct isif_dfc {
57 	/* enable vertical defect correction */
58 	__u8 en;
59 	/* Defect level subtraction. Just fed through if saturating */
60 #define	ISIF_VDFC_NORMAL		0
61 	/*
62 	 * Defect level subtraction. Horizontal interpolation ((i-2)+(i+2))/2
63 	 * if data saturating
64 	 */
65 #define ISIF_VDFC_HORZ_INTERPOL_IF_SAT	1
66 	/* Horizontal interpolation (((i-2)+(i+2))/2) */
67 #define	ISIF_VDFC_HORZ_INTERPOL		2
68 	/* one of the vertical defect correction modes above */
69 	__u8 corr_mode;
70 	/* 0 - whole line corrected, 1 - not pixels upper than the defect */
71 	__u8 corr_whole_line;
72 #define ISIF_VDFC_NO_SHIFT		0
73 #define ISIF_VDFC_SHIFT_1		1
74 #define ISIF_VDFC_SHIFT_2		2
75 #define ISIF_VDFC_SHIFT_3		3
76 #define ISIF_VDFC_SHIFT_4		4
77 	/*
78 	 * defect level shift value. level_at_pos, level_upper_pos,
79 	 * and level_lower_pos can be shifted up by this value. Choose
80 	 * one of the values above
81 	 */
82 	__u8 def_level_shift;
83 	/* defect saturation level */
84 	__u16 def_sat_level;
85 	/* number of vertical defects. Max is ISIF_VDFC_TABLE_SIZE */
86 	__u16 num_vdefects;
87 	/* VDFC table ptr */
88 	struct isif_vdfc_entry table[ISIF_VDFC_TABLE_SIZE];
89 };
90 
91 struct isif_horz_bclamp {
92 
93 	/* Horizontal clamp disabled. Only vertical clamp value is subtracted */
94 #define	ISIF_HORZ_BC_DISABLE		0
95 	/*
96 	 * Horizontal clamp value is calculated and subtracted from image data
97 	 * along with vertical clamp value
98 	 */
99 #define ISIF_HORZ_BC_CLAMP_CALC_ENABLED	1
100 	/*
101 	 * Horizontal clamp value calculated from previous image is subtracted
102 	 * from image data along with vertical clamp value.
103 	 */
104 #define ISIF_HORZ_BC_CLAMP_NOT_UPDATED	2
105 	/* horizontal clamp mode. One of the values above */
106 	__u8 mode;
107 	/*
108 	 * pixel value limit enable.
109 	 *  0 - limit disabled
110 	 *  1 - pixel value limited to 1023
111 	 */
112 	__u8 clamp_pix_limit;
113 	/* Select Most left window for bc calculation */
114 #define	ISIF_SEL_MOST_LEFT_WIN		0
115 	/* Select Most right window for bc calculation */
116 #define ISIF_SEL_MOST_RIGHT_WIN		1
117 	/* Select most left or right window for clamp val calculation */
118 	__u8 base_win_sel_calc;
119 	/* Window count per color for calculation. range 1-32 */
120 	__u8 win_count_calc;
121 	/* Window start position - horizontal for calculation. 0 - 8191 */
122 	__u16 win_start_h_calc;
123 	/* Window start position - vertical for calculation 0 - 8191 */
124 	__u16 win_start_v_calc;
125 #define ISIF_HORZ_BC_SZ_H_2PIXELS	0
126 #define ISIF_HORZ_BC_SZ_H_4PIXELS	1
127 #define ISIF_HORZ_BC_SZ_H_8PIXELS	2
128 #define ISIF_HORZ_BC_SZ_H_16PIXELS	3
129 	/* Width of the sample window in pixels for calculation */
130 	__u8 win_h_sz_calc;
131 #define ISIF_HORZ_BC_SZ_V_32PIXELS	0
132 #define ISIF_HORZ_BC_SZ_V_64PIXELS	1
133 #define	ISIF_HORZ_BC_SZ_V_128PIXELS	2
134 #define ISIF_HORZ_BC_SZ_V_256PIXELS	3
135 	/* Height of the sample window in pixels for calculation */
136 	__u8 win_v_sz_calc;
137 };
138 
139 /************************************************************************
140  *  Black Clamp parameters
141  ***********************************************************************/
142 struct isif_vert_bclamp {
143 	/* Reset value used is the clamp value calculated */
144 #define	ISIF_VERT_BC_USE_HORZ_CLAMP_VAL		0
145 	/* Reset value used is reset_clamp_val configured */
146 #define	ISIF_VERT_BC_USE_CONFIG_CLAMP_VAL	1
147 	/* No update, previous image value is used */
148 #define	ISIF_VERT_BC_NO_UPDATE			2
149 	/*
150 	 * Reset value selector for vertical clamp calculation. Use one of
151 	 * the above values
152 	 */
153 	__u8 reset_val_sel;
154 	/* U8Q8. Line average coefficient used in vertical clamp calculation */
155 	__u8 line_ave_coef;
156 	/* Height of the optical black region for calculation */
157 	__u16 ob_v_sz_calc;
158 	/* Optical black region start position - horizontal. 0 - 8191 */
159 	__u16 ob_start_h;
160 	/* Optical black region start position - vertical 0 - 8191 */
161 	__u16 ob_start_v;
162 };
163 
164 struct isif_black_clamp {
165 	/*
166 	 * This offset value is added irrespective of the clamp enable status.
167 	 * S13
168 	 */
169 	__u16 dc_offset;
170 	/*
171 	 * Enable black/digital clamp value to be subtracted from the image data
172 	 */
173 	__u8 en;
174 	/*
175 	 * black clamp mode. same/separate clamp for 4 colors
176 	 * 0 - disable - same clamp value for all colors
177 	 * 1 - clamp value calculated separately for all colors
178 	 */
179 	__u8 bc_mode_color;
180 	/* Vrtical start position for bc subtraction */
181 	__u16 vert_start_sub;
182 	/* Black clamp for horizontal direction */
183 	struct isif_horz_bclamp horz;
184 	/* Black clamp for vertical direction */
185 	struct isif_vert_bclamp vert;
186 };
187 
188 /*************************************************************************
189 ** Color Space Conversion (CSC)
190 *************************************************************************/
191 #define ISIF_CSC_NUM_COEFF	16
192 struct isif_color_space_conv {
193 	/* Enable color space conversion */
194 	__u8 en;
195 	/*
196 	 * csc coeffient table. S8Q5, M00 at index 0, M01 at index 1, and
197 	 * so forth
198 	 */
199 	struct isif_float_8 coeff[ISIF_CSC_NUM_COEFF];
200 };
201 
202 
203 /*************************************************************************
204 **  Black  Compensation parameters
205 *************************************************************************/
206 struct isif_black_comp {
207 	/* Comp for Red */
208 	__s8 r_comp;
209 	/* Comp for Gr */
210 	__s8 gr_comp;
211 	/* Comp for Blue */
212 	__s8 b_comp;
213 	/* Comp for Gb */
214 	__s8 gb_comp;
215 };
216 
217 /*************************************************************************
218 **  Gain parameters
219 *************************************************************************/
220 struct isif_gain {
221 	/* Gain for Red or ye */
222 	struct isif_float_16 r_ye;
223 	/* Gain for Gr or cy */
224 	struct isif_float_16 gr_cy;
225 	/* Gain for Gb or g */
226 	struct isif_float_16 gb_g;
227 	/* Gain for Blue or mg */
228 	struct isif_float_16 b_mg;
229 };
230 
231 #define ISIF_LINEAR_TAB_SIZE	192
232 /*************************************************************************
233 **  Linearization parameters
234 *************************************************************************/
235 struct isif_linearize {
236 	/* Enable or Disable linearization of data */
237 	__u8 en;
238 	/* Shift value applied */
239 	__u8 corr_shft;
240 	/* scale factor applied U11Q10 */
241 	struct isif_float_16 scale_fact;
242 	/* Size of the linear table */
243 	__u16 table[ISIF_LINEAR_TAB_SIZE];
244 };
245 
246 /* Color patterns */
247 #define ISIF_RED	0
248 #define	ISIF_GREEN_RED	1
249 #define ISIF_GREEN_BLUE	2
250 #define ISIF_BLUE	3
251 struct isif_col_pat {
252 	__u8 olop;
253 	__u8 olep;
254 	__u8 elop;
255 	__u8 elep;
256 };
257 
258 /*************************************************************************
259 **  Data formatter parameters
260 *************************************************************************/
261 struct isif_fmtplen {
262 	/*
263 	 * number of program entries for SET0, range 1 - 16
264 	 * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
265 	 * ISIF_COMBINE
266 	 */
267 	__u16 plen0;
268 	/*
269 	 * number of program entries for SET1, range 1 - 16
270 	 * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
271 	 * ISIF_COMBINE
272 	 */
273 	__u16 plen1;
274 	/**
275 	 * number of program entries for SET2, range 1 - 16
276 	 * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
277 	 * ISIF_COMBINE
278 	 */
279 	__u16 plen2;
280 	/**
281 	 * number of program entries for SET3, range 1 - 16
282 	 * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
283 	 * ISIF_COMBINE
284 	 */
285 	__u16 plen3;
286 };
287 
288 struct isif_fmt_cfg {
289 #define ISIF_SPLIT		0
290 #define ISIF_COMBINE		1
291 	/* Split or combine or line alternate */
292 	__u8 fmtmode;
293 	/* enable or disable line alternating mode */
294 	__u8 ln_alter_en;
295 #define ISIF_1LINE		0
296 #define	ISIF_2LINES		1
297 #define	ISIF_3LINES		2
298 #define	ISIF_4LINES		3
299 	/* Split/combine line number */
300 	__u8 lnum;
301 	/* Address increment Range 1 - 16 */
302 	__u8 addrinc;
303 };
304 
305 struct isif_fmt_addr_ptr {
306 	/* Initial address */
307 	__u32 init_addr;
308 	/* output line number */
309 #define ISIF_1STLINE		0
310 #define	ISIF_2NDLINE		1
311 #define	ISIF_3RDLINE		2
312 #define	ISIF_4THLINE		3
313 	__u8 out_line;
314 };
315 
316 struct isif_fmtpgm_ap {
317 	/* program address pointer */
318 	__u8 pgm_aptr;
319 	/* program address increment or decrement */
320 	__u8 pgmupdt;
321 };
322 
323 struct isif_data_formatter {
324 	/* Enable/Disable data formatter */
325 	__u8 en;
326 	/* data formatter configuration */
327 	struct isif_fmt_cfg cfg;
328 	/* Formatter program entries length */
329 	struct isif_fmtplen plen;
330 	/* first pixel in a line fed to formatter */
331 	__u16 fmtrlen;
332 	/* HD interval for output line. Only valid when split line */
333 	__u16 fmthcnt;
334 	/* formatter address pointers */
335 	struct isif_fmt_addr_ptr fmtaddr_ptr[16];
336 	/* program enable/disable */
337 	__u8 pgm_en[32];
338 	/* program address pointers */
339 	struct isif_fmtpgm_ap fmtpgm_ap[32];
340 };
341 
342 struct isif_df_csc {
343 	/* Color Space Conversion confguration, 0 - csc, 1 - df */
344 	__u8 df_or_csc;
345 	/* csc configuration valid if df_or_csc is 0 */
346 	struct isif_color_space_conv csc;
347 	/* data formatter configuration valid if df_or_csc is 1 */
348 	struct isif_data_formatter df;
349 	/* start pixel in a line at the input */
350 	__u32 start_pix;
351 	/* number of pixels in input line */
352 	__u32 num_pixels;
353 	/* start line at the input */
354 	__u32 start_line;
355 	/* number of lines at the input */
356 	__u32 num_lines;
357 };
358 
359 struct isif_gain_offsets_adj {
360 	/* Gain adjustment per color */
361 	struct isif_gain gain;
362 	/* Offset adjustment */
363 	__u16 offset;
364 	/* Enable or Disable Gain adjustment for SDRAM data */
365 	__u8 gain_sdram_en;
366 	/* Enable or Disable Gain adjustment for IPIPE data */
367 	__u8 gain_ipipe_en;
368 	/* Enable or Disable Gain adjustment for H3A data */
369 	__u8 gain_h3a_en;
370 	/* Enable or Disable Gain adjustment for SDRAM data */
371 	__u8 offset_sdram_en;
372 	/* Enable or Disable Gain adjustment for IPIPE data */
373 	__u8 offset_ipipe_en;
374 	/* Enable or Disable Gain adjustment for H3A data */
375 	__u8 offset_h3a_en;
376 };
377 
378 struct isif_cul {
379 	/* Horizontal Cull pattern for odd lines */
380 	__u8 hcpat_odd;
381 	/* Horizontal Cull pattern for even lines */
382 	__u8 hcpat_even;
383 	/* Vertical Cull pattern */
384 	__u8 vcpat;
385 	/* Enable or disable lpf. Apply when cull is enabled */
386 	__u8 en_lpf;
387 };
388 
389 struct isif_compress {
390 #define ISIF_ALAW		0
391 #define ISIF_DPCM		1
392 #define ISIF_NO_COMPRESSION	2
393 	/* Compression Algorithm used */
394 	__u8 alg;
395 	/* Choose Predictor1 for DPCM compression */
396 #define ISIF_DPCM_PRED1		0
397 	/* Choose Predictor2 for DPCM compression */
398 #define ISIF_DPCM_PRED2		1
399 	/* Predictor for DPCM compression */
400 	__u8 pred;
401 };
402 
403 /* all the stuff in this struct will be provided by userland */
404 struct isif_config_params_raw {
405 	/* Linearization parameters for image sensor data input */
406 	struct isif_linearize linearize;
407 	/* Data formatter or CSC */
408 	struct isif_df_csc df_csc;
409 	/* Defect Pixel Correction (DFC) confguration */
410 	struct isif_dfc dfc;
411 	/* Black/Digital Clamp configuration */
412 	struct isif_black_clamp bclamp;
413 	/* Gain, offset adjustments */
414 	struct isif_gain_offsets_adj gain_offset;
415 	/* Culling */
416 	struct isif_cul culling;
417 	/* A-Law and DPCM compression options */
418 	struct isif_compress compress;
419 	/* horizontal offset for Gain/LSC/DFC */
420 	__u16 horz_offset;
421 	/* vertical offset for Gain/LSC/DFC */
422 	__u16 vert_offset;
423 	/* color pattern for field 0 */
424 	struct isif_col_pat col_pat_field0;
425 	/* color pattern for field 1 */
426 	struct isif_col_pat col_pat_field1;
427 #define ISIF_NO_SHIFT		0
428 #define	ISIF_1BIT_SHIFT		1
429 #define	ISIF_2BIT_SHIFT		2
430 #define	ISIF_3BIT_SHIFT		3
431 #define	ISIF_4BIT_SHIFT		4
432 #define ISIF_5BIT_SHIFT		5
433 #define ISIF_6BIT_SHIFT		6
434 	/* Data shift applied before storing to SDRAM */
435 	__u8 data_shift;
436 	/* enable input test pattern generation */
437 	__u8 test_pat_gen;
438 };
439 
440 #ifdef __KERNEL__
441 struct isif_ycbcr_config {
442 	/* isif pixel format */
443 	enum ccdc_pixfmt pix_fmt;
444 	/* isif frame format */
445 	enum ccdc_frmfmt frm_fmt;
446 	/* ISIF crop window */
447 	struct v4l2_rect win;
448 	/* field polarity */
449 	enum vpfe_pin_pol fid_pol;
450 	/* interface VD polarity */
451 	enum vpfe_pin_pol vd_pol;
452 	/* interface HD polarity */
453 	enum vpfe_pin_pol hd_pol;
454 	/* isif pix order. Only used for ycbcr capture */
455 	enum ccdc_pixorder pix_order;
456 	/* isif buffer type. Only used for ycbcr capture */
457 	enum ccdc_buftype buf_type;
458 };
459 
460 /* MSB of image data connected to sensor port */
461 enum isif_data_msb {
462 	ISIF_BIT_MSB_15,
463 	ISIF_BIT_MSB_14,
464 	ISIF_BIT_MSB_13,
465 	ISIF_BIT_MSB_12,
466 	ISIF_BIT_MSB_11,
467 	ISIF_BIT_MSB_10,
468 	ISIF_BIT_MSB_9,
469 	ISIF_BIT_MSB_8,
470 	ISIF_BIT_MSB_7
471 };
472 
473 enum isif_cfa_pattern {
474 	ISIF_CFA_PAT_MOSAIC,
475 	ISIF_CFA_PAT_STRIPE
476 };
477 
478 struct isif_params_raw {
479 	/* isif pixel format */
480 	enum ccdc_pixfmt pix_fmt;
481 	/* isif frame format */
482 	enum ccdc_frmfmt frm_fmt;
483 	/* video window */
484 	struct v4l2_rect win;
485 	/* field polarity */
486 	enum vpfe_pin_pol fid_pol;
487 	/* interface VD polarity */
488 	enum vpfe_pin_pol vd_pol;
489 	/* interface HD polarity */
490 	enum vpfe_pin_pol hd_pol;
491 	/* buffer type. Applicable for interlaced mode */
492 	enum ccdc_buftype buf_type;
493 	/* Gain values */
494 	struct isif_gain gain;
495 	/* cfa pattern */
496 	enum isif_cfa_pattern cfa_pat;
497 	/* Data MSB position */
498 	enum isif_data_msb data_msb;
499 	/* Enable horizontal flip */
500 	unsigned char horz_flip_en;
501 	/* Enable image invert vertically */
502 	unsigned char image_invert_en;
503 
504 	/* all the userland defined stuff*/
505 	struct isif_config_params_raw config_params;
506 };
507 
508 enum isif_data_pack {
509 	ISIF_PACK_16BIT,
510 	ISIF_PACK_12BIT,
511 	ISIF_PACK_8BIT
512 };
513 
514 #define ISIF_WIN_NTSC				{0, 0, 720, 480}
515 #define ISIF_WIN_VGA				{0, 0, 640, 480}
516 
517 #endif
518 #endif
519