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