1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Copyright (C) 2005-2009 Texas Instruments Inc 4 */ 5 #ifndef _DM355_CCDC_H 6 #define _DM355_CCDC_H 7 #include <media/davinci/ccdc_types.h> 8 #include <media/davinci/vpfe_types.h> 9 10 /* enum for No of pixel per line to be avg. in Black Clamping */ 11 enum ccdc_sample_length { 12 CCDC_SAMPLE_1PIXELS, 13 CCDC_SAMPLE_2PIXELS, 14 CCDC_SAMPLE_4PIXELS, 15 CCDC_SAMPLE_8PIXELS, 16 CCDC_SAMPLE_16PIXELS 17 }; 18 19 /* enum for No of lines in Black Clamping */ 20 enum ccdc_sample_line { 21 CCDC_SAMPLE_1LINES, 22 CCDC_SAMPLE_2LINES, 23 CCDC_SAMPLE_4LINES, 24 CCDC_SAMPLE_8LINES, 25 CCDC_SAMPLE_16LINES 26 }; 27 28 /* enum for Alaw gamma width */ 29 enum ccdc_gamma_width { 30 CCDC_GAMMA_BITS_13_4, 31 CCDC_GAMMA_BITS_12_3, 32 CCDC_GAMMA_BITS_11_2, 33 CCDC_GAMMA_BITS_10_1, 34 CCDC_GAMMA_BITS_09_0 35 }; 36 37 enum ccdc_colpats { 38 CCDC_RED, 39 CCDC_GREEN_RED, 40 CCDC_GREEN_BLUE, 41 CCDC_BLUE 42 }; 43 44 struct ccdc_col_pat { 45 enum ccdc_colpats olop; 46 enum ccdc_colpats olep; 47 enum ccdc_colpats elop; 48 enum ccdc_colpats elep; 49 }; 50 51 enum ccdc_datasft { 52 CCDC_DATA_NO_SHIFT, 53 CCDC_DATA_SHIFT_1BIT, 54 CCDC_DATA_SHIFT_2BIT, 55 CCDC_DATA_SHIFT_3BIT, 56 CCDC_DATA_SHIFT_4BIT, 57 CCDC_DATA_SHIFT_5BIT, 58 CCDC_DATA_SHIFT_6BIT 59 }; 60 61 enum ccdc_data_size { 62 CCDC_DATA_16BITS, 63 CCDC_DATA_15BITS, 64 CCDC_DATA_14BITS, 65 CCDC_DATA_13BITS, 66 CCDC_DATA_12BITS, 67 CCDC_DATA_11BITS, 68 CCDC_DATA_10BITS, 69 CCDC_DATA_8BITS 70 }; 71 enum ccdc_mfilt1 { 72 CCDC_NO_MEDIAN_FILTER1, 73 CCDC_AVERAGE_FILTER1, 74 CCDC_MEDIAN_FILTER1 75 }; 76 77 enum ccdc_mfilt2 { 78 CCDC_NO_MEDIAN_FILTER2, 79 CCDC_AVERAGE_FILTER2, 80 CCDC_MEDIAN_FILTER2 81 }; 82 83 /* structure for ALaw */ 84 struct ccdc_a_law { 85 /* Enable/disable A-Law */ 86 unsigned char enable; 87 /* Gamma Width Input */ 88 enum ccdc_gamma_width gamma_wd; 89 }; 90 91 /* structure for Black Clamping */ 92 struct ccdc_black_clamp { 93 /* only if bClampEnable is TRUE */ 94 unsigned char b_clamp_enable; 95 /* only if bClampEnable is TRUE */ 96 enum ccdc_sample_length sample_pixel; 97 /* only if bClampEnable is TRUE */ 98 enum ccdc_sample_line sample_ln; 99 /* only if bClampEnable is TRUE */ 100 unsigned short start_pixel; 101 /* only if bClampEnable is FALSE */ 102 unsigned short sgain; 103 unsigned short dc_sub; 104 }; 105 106 /* structure for Black Level Compensation */ 107 struct ccdc_black_compensation { 108 /* Constant value to subtract from Red component */ 109 unsigned char r; 110 /* Constant value to subtract from Gr component */ 111 unsigned char gr; 112 /* Constant value to subtract from Blue component */ 113 unsigned char b; 114 /* Constant value to subtract from Gb component */ 115 unsigned char gb; 116 }; 117 118 struct ccdc_float { 119 int integer; 120 unsigned int decimal; 121 }; 122 123 #define CCDC_CSC_COEFF_TABLE_SIZE 16 124 /* structure for color space converter */ 125 struct ccdc_csc { 126 unsigned char enable; 127 /* 128 * S8Q5. Use 2 decimal precision, user values range from -3.00 to 3.99. 129 * example - to use 1.03, set integer part as 1, and decimal part as 3 130 * to use -1.03, set integer part as -1 and decimal part as 3 131 */ 132 struct ccdc_float coeff[CCDC_CSC_COEFF_TABLE_SIZE]; 133 }; 134 135 /* Structures for Vertical Defect Correction*/ 136 enum ccdc_vdf_csl { 137 CCDC_VDF_NORMAL, 138 CCDC_VDF_HORZ_INTERPOL_SAT, 139 CCDC_VDF_HORZ_INTERPOL 140 }; 141 142 enum ccdc_vdf_cuda { 143 CCDC_VDF_WHOLE_LINE_CORRECT, 144 CCDC_VDF_UPPER_DISABLE 145 }; 146 147 enum ccdc_dfc_mwr { 148 CCDC_DFC_MWR_WRITE_COMPLETE, 149 CCDC_DFC_WRITE_REG 150 }; 151 152 enum ccdc_dfc_mrd { 153 CCDC_DFC_READ_COMPLETE, 154 CCDC_DFC_READ_REG 155 }; 156 157 enum ccdc_dfc_ma_rst { 158 CCDC_DFC_INCR_ADDR, 159 CCDC_DFC_CLR_ADDR 160 }; 161 162 enum ccdc_dfc_mclr { 163 CCDC_DFC_CLEAR_COMPLETE, 164 CCDC_DFC_CLEAR 165 }; 166 167 struct ccdc_dft_corr_ctl { 168 enum ccdc_vdf_csl vdfcsl; 169 enum ccdc_vdf_cuda vdfcuda; 170 unsigned int vdflsft; 171 }; 172 173 struct ccdc_dft_corr_mem_ctl { 174 enum ccdc_dfc_mwr dfcmwr; 175 enum ccdc_dfc_mrd dfcmrd; 176 enum ccdc_dfc_ma_rst dfcmarst; 177 enum ccdc_dfc_mclr dfcmclr; 178 }; 179 180 #define CCDC_DFT_TABLE_SIZE 16 181 /* 182 * Main Structure for vertical defect correction. Vertical defect 183 * correction can correct up to 16 defects if defects less than 16 184 * then pad the rest with 0 185 */ 186 struct ccdc_vertical_dft { 187 unsigned char ver_dft_en; 188 unsigned char gen_dft_en; 189 unsigned int saturation_ctl; 190 struct ccdc_dft_corr_ctl dft_corr_ctl; 191 struct ccdc_dft_corr_mem_ctl dft_corr_mem_ctl; 192 int table_size; 193 unsigned int dft_corr_horz[CCDC_DFT_TABLE_SIZE]; 194 unsigned int dft_corr_vert[CCDC_DFT_TABLE_SIZE]; 195 unsigned int dft_corr_sub1[CCDC_DFT_TABLE_SIZE]; 196 unsigned int dft_corr_sub2[CCDC_DFT_TABLE_SIZE]; 197 unsigned int dft_corr_sub3[CCDC_DFT_TABLE_SIZE]; 198 }; 199 200 struct ccdc_data_offset { 201 unsigned char horz_offset; 202 unsigned char vert_offset; 203 }; 204 205 /* 206 * Structure for CCDC configuration parameters for raw capture mode passed 207 * by application 208 */ 209 struct ccdc_config_params_raw { 210 /* data shift to be applied before storing */ 211 enum ccdc_datasft datasft; 212 /* data size value from 8 to 16 bits */ 213 enum ccdc_data_size data_sz; 214 /* median filter for sdram */ 215 enum ccdc_mfilt1 mfilt1; 216 enum ccdc_mfilt2 mfilt2; 217 /* low pass filter enable/disable */ 218 unsigned char lpf_enable; 219 /* Threshold of median filter */ 220 int med_filt_thres; 221 /* 222 * horz and vertical data offset. Applicable for defect correction 223 * and lsc 224 */ 225 struct ccdc_data_offset data_offset; 226 /* Structure for Optional A-Law */ 227 struct ccdc_a_law alaw; 228 /* Structure for Optical Black Clamp */ 229 struct ccdc_black_clamp blk_clamp; 230 /* Structure for Black Compensation */ 231 struct ccdc_black_compensation blk_comp; 232 /* structure for vertical Defect Correction Module Configuration */ 233 struct ccdc_vertical_dft vertical_dft; 234 /* structure for color space converter Module Configuration */ 235 struct ccdc_csc csc; 236 /* color patters for bayer capture */ 237 struct ccdc_col_pat col_pat_field0; 238 struct ccdc_col_pat col_pat_field1; 239 }; 240 241 #ifdef __KERNEL__ 242 #include <linux/io.h> 243 244 #define CCDC_WIN_PAL {0, 0, 720, 576} 245 #define CCDC_WIN_VGA {0, 0, 640, 480} 246 247 struct ccdc_params_ycbcr { 248 /* pixel format */ 249 enum ccdc_pixfmt pix_fmt; 250 /* progressive or interlaced frame */ 251 enum ccdc_frmfmt frm_fmt; 252 /* video window */ 253 struct v4l2_rect win; 254 /* field id polarity */ 255 enum vpfe_pin_pol fid_pol; 256 /* vertical sync polarity */ 257 enum vpfe_pin_pol vd_pol; 258 /* horizontal sync polarity */ 259 enum vpfe_pin_pol hd_pol; 260 /* enable BT.656 embedded sync mode */ 261 int bt656_enable; 262 /* cb:y:cr:y or y:cb:y:cr in memory */ 263 enum ccdc_pixorder pix_order; 264 /* interleaved or separated fields */ 265 enum ccdc_buftype buf_type; 266 }; 267 268 /* Gain applied to Raw Bayer data */ 269 struct ccdc_gain { 270 unsigned short r_ye; 271 unsigned short gr_cy; 272 unsigned short gb_g; 273 unsigned short b_mg; 274 }; 275 276 /* Structure for CCDC configuration parameters for raw capture mode */ 277 struct ccdc_params_raw { 278 /* pixel format */ 279 enum ccdc_pixfmt pix_fmt; 280 /* progressive or interlaced frame */ 281 enum ccdc_frmfmt frm_fmt; 282 /* video window */ 283 struct v4l2_rect win; 284 /* field id polarity */ 285 enum vpfe_pin_pol fid_pol; 286 /* vertical sync polarity */ 287 enum vpfe_pin_pol vd_pol; 288 /* horizontal sync polarity */ 289 enum vpfe_pin_pol hd_pol; 290 /* interleaved or separated fields */ 291 enum ccdc_buftype buf_type; 292 /* Gain values */ 293 struct ccdc_gain gain; 294 /* offset */ 295 unsigned int ccdc_offset; 296 /* horizontal flip enable */ 297 unsigned char horz_flip_enable; 298 /* 299 * enable to store the image in inverse order in memory 300 * (bottom to top) 301 */ 302 unsigned char image_invert_enable; 303 /* Configurable part of raw data */ 304 struct ccdc_config_params_raw config_params; 305 }; 306 307 #endif 308 #endif /* DM355_CCDC_H */ 309