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