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