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