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