Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / include / media / davinci / isif.h
diff --git a/kernel/include/media/davinci/isif.h b/kernel/include/media/davinci/isif.h
new file mode 100644 (file)
index 0000000..7f3d76a
--- /dev/null
@@ -0,0 +1,531 @@
+/*
+ * Copyright (C) 2008-2009 Texas Instruments Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * isif header file
+ */
+#ifndef _ISIF_H
+#define _ISIF_H
+
+#include <media/davinci/ccdc_types.h>
+#include <media/davinci/vpfe_types.h>
+
+/* isif float type S8Q8/U8Q8 */
+struct isif_float_8 {
+       /* 8 bit integer part */
+       __u8 integer;
+       /* 8 bit decimal part */
+       __u8 decimal;
+};
+
+/* isif float type U16Q16/S16Q16 */
+struct isif_float_16 {
+       /* 16 bit integer part */
+       __u16 integer;
+       /* 16 bit decimal part */
+       __u16 decimal;
+};
+
+/************************************************************************
+ *   Vertical Defect Correction parameters
+ ***********************************************************************/
+/* Defect Correction (DFC) table entry */
+struct isif_vdfc_entry {
+       /* vertical position of defect */
+       __u16 pos_vert;
+       /* horizontal position of defect */
+       __u16 pos_horz;
+       /*
+        * Defect level of Vertical line defect position. This is subtracted
+        * from the data at the defect position
+        */
+       __u8 level_at_pos;
+       /*
+        * Defect level of the pixels upper than the vertical line defect.
+        * This is subtracted from the data
+        */
+       __u8 level_up_pixels;
+       /*
+        * Defect level of the pixels lower than the vertical line defect.
+        * This is subtracted from the data
+        */
+       __u8 level_low_pixels;
+};
+
+#define ISIF_VDFC_TABLE_SIZE           8
+struct isif_dfc {
+       /* enable vertical defect correction */
+       __u8 en;
+       /* Defect level subtraction. Just fed through if saturating */
+#define        ISIF_VDFC_NORMAL                0
+       /*
+        * Defect level subtraction. Horizontal interpolation ((i-2)+(i+2))/2
+        * if data saturating
+        */
+#define ISIF_VDFC_HORZ_INTERPOL_IF_SAT 1
+       /* Horizontal interpolation (((i-2)+(i+2))/2) */
+#define        ISIF_VDFC_HORZ_INTERPOL         2
+       /* one of the vertical defect correction modes above */
+       __u8 corr_mode;
+       /* 0 - whole line corrected, 1 - not pixels upper than the defect */
+       __u8 corr_whole_line;
+#define ISIF_VDFC_NO_SHIFT             0
+#define ISIF_VDFC_SHIFT_1              1
+#define ISIF_VDFC_SHIFT_2              2
+#define ISIF_VDFC_SHIFT_3              3
+#define ISIF_VDFC_SHIFT_4              4
+       /*
+        * defect level shift value. level_at_pos, level_upper_pos,
+        * and level_lower_pos can be shifted up by this value. Choose
+        * one of the values above
+        */
+       __u8 def_level_shift;
+       /* defect saturation level */
+       __u16 def_sat_level;
+       /* number of vertical defects. Max is ISIF_VDFC_TABLE_SIZE */
+       __u16 num_vdefects;
+       /* VDFC table ptr */
+       struct isif_vdfc_entry table[ISIF_VDFC_TABLE_SIZE];
+};
+
+struct isif_horz_bclamp {
+
+       /* Horizontal clamp disabled. Only vertical clamp value is subtracted */
+#define        ISIF_HORZ_BC_DISABLE            0
+       /*
+        * Horizontal clamp value is calculated and subtracted from image data
+        * along with vertical clamp value
+        */
+#define ISIF_HORZ_BC_CLAMP_CALC_ENABLED        1
+       /*
+        * Horizontal clamp value calculated from previous image is subtracted
+        * from image data along with vertical clamp value.
+        */
+#define ISIF_HORZ_BC_CLAMP_NOT_UPDATED 2
+       /* horizontal clamp mode. One of the values above */
+       __u8 mode;
+       /*
+        * pixel value limit enable.
+        *  0 - limit disabled
+        *  1 - pixel value limited to 1023
+        */
+       __u8 clamp_pix_limit;
+       /* Select Most left window for bc calculation */
+#define        ISIF_SEL_MOST_LEFT_WIN          0
+       /* Select Most right window for bc calculation */
+#define ISIF_SEL_MOST_RIGHT_WIN                1
+       /* Select most left or right window for clamp val calculation */
+       __u8 base_win_sel_calc;
+       /* Window count per color for calculation. range 1-32 */
+       __u8 win_count_calc;
+       /* Window start position - horizontal for calculation. 0 - 8191 */
+       __u16 win_start_h_calc;
+       /* Window start position - vertical for calculation 0 - 8191 */
+       __u16 win_start_v_calc;
+#define ISIF_HORZ_BC_SZ_H_2PIXELS      0
+#define ISIF_HORZ_BC_SZ_H_4PIXELS      1
+#define ISIF_HORZ_BC_SZ_H_8PIXELS      2
+#define ISIF_HORZ_BC_SZ_H_16PIXELS     3
+       /* Width of the sample window in pixels for calculation */
+       __u8 win_h_sz_calc;
+#define ISIF_HORZ_BC_SZ_V_32PIXELS     0
+#define ISIF_HORZ_BC_SZ_V_64PIXELS     1
+#define        ISIF_HORZ_BC_SZ_V_128PIXELS     2
+#define ISIF_HORZ_BC_SZ_V_256PIXELS    3
+       /* Height of the sample window in pixels for calculation */
+       __u8 win_v_sz_calc;
+};
+
+/************************************************************************
+ *  Black Clamp parameters
+ ***********************************************************************/
+struct isif_vert_bclamp {
+       /* Reset value used is the clamp value calculated */
+#define        ISIF_VERT_BC_USE_HORZ_CLAMP_VAL         0
+       /* Reset value used is reset_clamp_val configured */
+#define        ISIF_VERT_BC_USE_CONFIG_CLAMP_VAL       1
+       /* No update, previous image value is used */
+#define        ISIF_VERT_BC_NO_UPDATE                  2
+       /*
+        * Reset value selector for vertical clamp calculation. Use one of
+        * the above values
+        */
+       __u8 reset_val_sel;
+       /* U8Q8. Line average coefficient used in vertical clamp calculation */
+       __u8 line_ave_coef;
+       /* Height of the optical black region for calculation */
+       __u16 ob_v_sz_calc;
+       /* Optical black region start position - horizontal. 0 - 8191 */
+       __u16 ob_start_h;
+       /* Optical black region start position - vertical 0 - 8191 */
+       __u16 ob_start_v;
+};
+
+struct isif_black_clamp {
+       /*
+        * This offset value is added irrespective of the clamp enable status.
+        * S13
+        */
+       __u16 dc_offset;
+       /*
+        * Enable black/digital clamp value to be subtracted from the image data
+        */
+       __u8 en;
+       /*
+        * black clamp mode. same/separate clamp for 4 colors
+        * 0 - disable - same clamp value for all colors
+        * 1 - clamp value calculated separately for all colors
+        */
+       __u8 bc_mode_color;
+       /* Vrtical start position for bc subtraction */
+       __u16 vert_start_sub;
+       /* Black clamp for horizontal direction */
+       struct isif_horz_bclamp horz;
+       /* Black clamp for vertical direction */
+       struct isif_vert_bclamp vert;
+};
+
+/*************************************************************************
+** Color Space Conversion (CSC)
+*************************************************************************/
+#define ISIF_CSC_NUM_COEFF     16
+struct isif_color_space_conv {
+       /* Enable color space conversion */
+       __u8 en;
+       /*
+        * csc coeffient table. S8Q5, M00 at index 0, M01 at index 1, and
+        * so forth
+        */
+       struct isif_float_8 coeff[ISIF_CSC_NUM_COEFF];
+};
+
+
+/*************************************************************************
+**  Black  Compensation parameters
+*************************************************************************/
+struct isif_black_comp {
+       /* Comp for Red */
+       __s8 r_comp;
+       /* Comp for Gr */
+       __s8 gr_comp;
+       /* Comp for Blue */
+       __s8 b_comp;
+       /* Comp for Gb */
+       __s8 gb_comp;
+};
+
+/*************************************************************************
+**  Gain parameters
+*************************************************************************/
+struct isif_gain {
+       /* Gain for Red or ye */
+       struct isif_float_16 r_ye;
+       /* Gain for Gr or cy */
+       struct isif_float_16 gr_cy;
+       /* Gain for Gb or g */
+       struct isif_float_16 gb_g;
+       /* Gain for Blue or mg */
+       struct isif_float_16 b_mg;
+};
+
+#define ISIF_LINEAR_TAB_SIZE   192
+/*************************************************************************
+**  Linearization parameters
+*************************************************************************/
+struct isif_linearize {
+       /* Enable or Disable linearization of data */
+       __u8 en;
+       /* Shift value applied */
+       __u8 corr_shft;
+       /* scale factor applied U11Q10 */
+       struct isif_float_16 scale_fact;
+       /* Size of the linear table */
+       __u16 table[ISIF_LINEAR_TAB_SIZE];
+};
+
+/* Color patterns */
+#define ISIF_RED       0
+#define        ISIF_GREEN_RED  1
+#define ISIF_GREEN_BLUE        2
+#define ISIF_BLUE      3
+struct isif_col_pat {
+       __u8 olop;
+       __u8 olep;
+       __u8 elop;
+       __u8 elep;
+};
+
+/*************************************************************************
+**  Data formatter parameters
+*************************************************************************/
+struct isif_fmtplen {
+       /*
+        * number of program entries for SET0, range 1 - 16
+        * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
+        * ISIF_COMBINE
+        */
+       __u16 plen0;
+       /*
+        * number of program entries for SET1, range 1 - 16
+        * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
+        * ISIF_COMBINE
+        */
+       __u16 plen1;
+       /**
+        * number of program entries for SET2, range 1 - 16
+        * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
+        * ISIF_COMBINE
+        */
+       __u16 plen2;
+       /**
+        * number of program entries for SET3, range 1 - 16
+        * when fmtmode is ISIF_SPLIT, 1 - 8 when fmtmode is
+        * ISIF_COMBINE
+        */
+       __u16 plen3;
+};
+
+struct isif_fmt_cfg {
+#define ISIF_SPLIT             0
+#define ISIF_COMBINE           1
+       /* Split or combine or line alternate */
+       __u8 fmtmode;
+       /* enable or disable line alternating mode */
+       __u8 ln_alter_en;
+#define ISIF_1LINE             0
+#define        ISIF_2LINES             1
+#define        ISIF_3LINES             2
+#define        ISIF_4LINES             3
+       /* Split/combine line number */
+       __u8 lnum;
+       /* Address increment Range 1 - 16 */
+       __u8 addrinc;
+};
+
+struct isif_fmt_addr_ptr {
+       /* Initial address */
+       __u32 init_addr;
+       /* output line number */
+#define ISIF_1STLINE           0
+#define        ISIF_2NDLINE            1
+#define        ISIF_3RDLINE            2
+#define        ISIF_4THLINE            3
+       __u8 out_line;
+};
+
+struct isif_fmtpgm_ap {
+       /* program address pointer */
+       __u8 pgm_aptr;
+       /* program address increment or decrement */
+       __u8 pgmupdt;
+};
+
+struct isif_data_formatter {
+       /* Enable/Disable data formatter */
+       __u8 en;
+       /* data formatter configuration */
+       struct isif_fmt_cfg cfg;
+       /* Formatter program entries length */
+       struct isif_fmtplen plen;
+       /* first pixel in a line fed to formatter */
+       __u16 fmtrlen;
+       /* HD interval for output line. Only valid when split line */
+       __u16 fmthcnt;
+       /* formatter address pointers */
+       struct isif_fmt_addr_ptr fmtaddr_ptr[16];
+       /* program enable/disable */
+       __u8 pgm_en[32];
+       /* program address pointers */
+       struct isif_fmtpgm_ap fmtpgm_ap[32];
+};
+
+struct isif_df_csc {
+       /* Color Space Conversion confguration, 0 - csc, 1 - df */
+       __u8 df_or_csc;
+       /* csc configuration valid if df_or_csc is 0 */
+       struct isif_color_space_conv csc;
+       /* data formatter configuration valid if df_or_csc is 1 */
+       struct isif_data_formatter df;
+       /* start pixel in a line at the input */
+       __u32 start_pix;
+       /* number of pixels in input line */
+       __u32 num_pixels;
+       /* start line at the input */
+       __u32 start_line;
+       /* number of lines at the input */
+       __u32 num_lines;
+};
+
+struct isif_gain_offsets_adj {
+       /* Gain adjustment per color */
+       struct isif_gain gain;
+       /* Offset adjustment */
+       __u16 offset;
+       /* Enable or Disable Gain adjustment for SDRAM data */
+       __u8 gain_sdram_en;
+       /* Enable or Disable Gain adjustment for IPIPE data */
+       __u8 gain_ipipe_en;
+       /* Enable or Disable Gain adjustment for H3A data */
+       __u8 gain_h3a_en;
+       /* Enable or Disable Gain adjustment for SDRAM data */
+       __u8 offset_sdram_en;
+       /* Enable or Disable Gain adjustment for IPIPE data */
+       __u8 offset_ipipe_en;
+       /* Enable or Disable Gain adjustment for H3A data */
+       __u8 offset_h3a_en;
+};
+
+struct isif_cul {
+       /* Horizontal Cull pattern for odd lines */
+       __u8 hcpat_odd;
+       /* Horizontal Cull pattern for even lines */
+       __u8 hcpat_even;
+       /* Vertical Cull pattern */
+       __u8 vcpat;
+       /* Enable or disable lpf. Apply when cull is enabled */
+       __u8 en_lpf;
+};
+
+struct isif_compress {
+#define ISIF_ALAW              0
+#define ISIF_DPCM              1
+#define ISIF_NO_COMPRESSION    2
+       /* Compression Algorithm used */
+       __u8 alg;
+       /* Choose Predictor1 for DPCM compression */
+#define ISIF_DPCM_PRED1                0
+       /* Choose Predictor2 for DPCM compression */
+#define ISIF_DPCM_PRED2                1
+       /* Predictor for DPCM compression */
+       __u8 pred;
+};
+
+/* all the stuff in this struct will be provided by userland */
+struct isif_config_params_raw {
+       /* Linearization parameters for image sensor data input */
+       struct isif_linearize linearize;
+       /* Data formatter or CSC */
+       struct isif_df_csc df_csc;
+       /* Defect Pixel Correction (DFC) confguration */
+       struct isif_dfc dfc;
+       /* Black/Digital Clamp configuration */
+       struct isif_black_clamp bclamp;
+       /* Gain, offset adjustments */
+       struct isif_gain_offsets_adj gain_offset;
+       /* Culling */
+       struct isif_cul culling;
+       /* A-Law and DPCM compression options */
+       struct isif_compress compress;
+       /* horizontal offset for Gain/LSC/DFC */
+       __u16 horz_offset;
+       /* vertical offset for Gain/LSC/DFC */
+       __u16 vert_offset;
+       /* color pattern for field 0 */
+       struct isif_col_pat col_pat_field0;
+       /* color pattern for field 1 */
+       struct isif_col_pat col_pat_field1;
+#define ISIF_NO_SHIFT          0
+#define        ISIF_1BIT_SHIFT         1
+#define        ISIF_2BIT_SHIFT         2
+#define        ISIF_3BIT_SHIFT         3
+#define        ISIF_4BIT_SHIFT         4
+#define ISIF_5BIT_SHIFT                5
+#define ISIF_6BIT_SHIFT                6
+       /* Data shift applied before storing to SDRAM */
+       __u8 data_shift;
+       /* enable input test pattern generation */
+       __u8 test_pat_gen;
+};
+
+#ifdef __KERNEL__
+struct isif_ycbcr_config {
+       /* isif pixel format */
+       enum ccdc_pixfmt pix_fmt;
+       /* isif frame format */
+       enum ccdc_frmfmt frm_fmt;
+       /* ISIF crop window */
+       struct v4l2_rect win;
+       /* field polarity */
+       enum vpfe_pin_pol fid_pol;
+       /* interface VD polarity */
+       enum vpfe_pin_pol vd_pol;
+       /* interface HD polarity */
+       enum vpfe_pin_pol hd_pol;
+       /* isif pix order. Only used for ycbcr capture */
+       enum ccdc_pixorder pix_order;
+       /* isif buffer type. Only used for ycbcr capture */
+       enum ccdc_buftype buf_type;
+};
+
+/* MSB of image data connected to sensor port */
+enum isif_data_msb {
+       ISIF_BIT_MSB_15,
+       ISIF_BIT_MSB_14,
+       ISIF_BIT_MSB_13,
+       ISIF_BIT_MSB_12,
+       ISIF_BIT_MSB_11,
+       ISIF_BIT_MSB_10,
+       ISIF_BIT_MSB_9,
+       ISIF_BIT_MSB_8,
+       ISIF_BIT_MSB_7
+};
+
+enum isif_cfa_pattern {
+       ISIF_CFA_PAT_MOSAIC,
+       ISIF_CFA_PAT_STRIPE
+};
+
+struct isif_params_raw {
+       /* isif pixel format */
+       enum ccdc_pixfmt pix_fmt;
+       /* isif frame format */
+       enum ccdc_frmfmt frm_fmt;
+       /* video window */
+       struct v4l2_rect win;
+       /* field polarity */
+       enum vpfe_pin_pol fid_pol;
+       /* interface VD polarity */
+       enum vpfe_pin_pol vd_pol;
+       /* interface HD polarity */
+       enum vpfe_pin_pol hd_pol;
+       /* buffer type. Applicable for interlaced mode */
+       enum ccdc_buftype buf_type;
+       /* Gain values */
+       struct isif_gain gain;
+       /* cfa pattern */
+       enum isif_cfa_pattern cfa_pat;
+       /* Data MSB position */
+       enum isif_data_msb data_msb;
+       /* Enable horizontal flip */
+       unsigned char horz_flip_en;
+       /* Enable image invert vertically */
+       unsigned char image_invert_en;
+
+       /* all the userland defined stuff*/
+       struct isif_config_params_raw config_params;
+};
+
+enum isif_data_pack {
+       ISIF_PACK_16BIT,
+       ISIF_PACK_12BIT,
+       ISIF_PACK_8BIT
+};
+
+#define ISIF_WIN_NTSC                          {0, 0, 720, 480}
+#define ISIF_WIN_VGA                           {0, 0, 640, 480}
+
+#endif
+#endif