Linux-libre 5.7.3-gnu
[librecmc/linux-libre.git] / include / media / davinci / isif.h
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