xref: /linux/drivers/staging/media/atomisp/include/linux/atomisp.h (revision 3fd6c59042dbba50391e30862beac979491145fe)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Support for Medifield PNW Camera Imaging ISP subsystem.
4  *
5  * Copyright (c) 2010 Intel Corporation. All Rights Reserved.
6  */
7 
8 #ifndef _ATOM_ISP_H
9 #define _ATOM_ISP_H
10 
11 #include <linux/types.h>
12 
13 /* struct media_device_info.hw_revision */
14 #define ATOMISP_HW_REVISION_MASK	0x0000ff00
15 #define ATOMISP_HW_REVISION_SHIFT	8
16 #define ATOMISP_HW_REVISION_ISP2300	0x00
17 #define ATOMISP_HW_REVISION_ISP2400	0x10
18 #define ATOMISP_HW_REVISION_ISP2401_LEGACY 0x11
19 #define ATOMISP_HW_REVISION_ISP2401	0x20
20 
21 #define ATOMISP_HW_STEPPING_MASK	0x000000ff
22 #define ATOMISP_HW_STEPPING_A0		0x00
23 #define ATOMISP_HW_STEPPING_B0		0x10
24 
25 /*ISP binary running mode*/
26 #define CI_MODE_PREVIEW		0x8000
27 #define CI_MODE_VIDEO		0x4000
28 #define CI_MODE_STILL_CAPTURE	0x2000
29 #define CI_MODE_NONE		0x0000
30 
31 #define OUTPUT_MODE_FILE 0x0100
32 #define OUTPUT_MODE_TEXT 0x0200
33 
34 /*
35  * Camera HAL sets this flag in v4l2_buffer reserved2 to indicate this
36  * buffer has a per-frame parameter.
37  */
38 #define ATOMISP_BUFFER_HAS_PER_FRAME_SETTING	0x80000000
39 
40 /* Custom format for RAW capture from M10MO 0x3130314d */
41 #define V4L2_PIX_FMT_CUSTOM_M10MO_RAW	v4l2_fourcc('M', '1', '0', '1')
42 
43 /* Custom media bus formats being used in atomisp */
44 #define V4L2_MBUS_FMT_CUSTOM_YUV420	0x8001
45 #define V4L2_MBUS_FMT_CUSTOM_YVU420	0x8002
46 #define V4L2_MBUS_FMT_CUSTOM_YUV422P	0x8003
47 #define V4L2_MBUS_FMT_CUSTOM_YUV444	0x8004
48 #define V4L2_MBUS_FMT_CUSTOM_NV12	0x8005
49 #define V4L2_MBUS_FMT_CUSTOM_NV21	0x8006
50 #define V4L2_MBUS_FMT_CUSTOM_NV16	0x8007
51 #define V4L2_MBUS_FMT_CUSTOM_YUYV	0x8008
52 #define V4L2_MBUS_FMT_CUSTOM_SBGGR16	0x8009
53 #define V4L2_MBUS_FMT_CUSTOM_RGB32	0x800a
54 
55 /* Custom media bus format for M10MO RAW capture */
56 #if 0
57 #define V4L2_MBUS_FMT_CUSTOM_M10MO_RAW	0x800b
58 #endif
59 
60 /* Configuration used by Bayer noise reduction and YCC noise reduction */
61 struct atomisp_nr_config {
62 	/* [gain] Strength of noise reduction for Bayer NR (Used by Bayer NR) */
63 	unsigned int bnr_gain;
64 	/* [gain] Strength of noise reduction for YCC NR (Used by YCC NR) */
65 	unsigned int ynr_gain;
66 	/* [intensity] Sensitivity of Edge (Used by Bayer NR) */
67 	unsigned int direction;
68 	/* [intensity] coring threshold for Cb (Used by YCC NR) */
69 	unsigned int threshold_cb;
70 	/* [intensity] coring threshold for Cr (Used by YCC NR) */
71 	unsigned int threshold_cr;
72 };
73 
74 /* Temporal noise reduction configuration */
75 struct atomisp_tnr_config {
76 	unsigned int gain;	 /* [gain] Strength of NR */
77 	unsigned int threshold_y;/* [intensity] Motion sensitivity for Y */
78 	unsigned int threshold_uv;/* [intensity] Motion sensitivity for U/V */
79 };
80 
81 /* Histogram. This contains num_elements values of type unsigned int.
82  * The data pointer is a DDR pointer (virtual address).
83  */
84 struct atomisp_histogram {
85 	unsigned int num_elements;
86 	void __user *data;
87 };
88 
89 enum atomisp_ob_mode {
90 	atomisp_ob_mode_none,
91 	atomisp_ob_mode_fixed,
92 	atomisp_ob_mode_raster
93 };
94 
95 /* Optical black level configuration */
96 struct atomisp_ob_config {
97 	/* Obtical black level mode (Fixed / Raster) */
98 	enum atomisp_ob_mode mode;
99 	/* [intensity] optical black level for GR (relevant for fixed mode) */
100 	unsigned int level_gr;
101 	/* [intensity] optical black level for R (relevant for fixed mode) */
102 	unsigned int level_r;
103 	/* [intensity] optical black level for B (relevant for fixed mode) */
104 	unsigned int level_b;
105 	/* [intensity] optical black level for GB (relevant for fixed mode) */
106 	unsigned int level_gb;
107 	/* [BQ] 0..63 start position of OB area (relevant for raster mode) */
108 	unsigned short start_position;
109 	/* [BQ] start..63 end position of OB area (relevant for raster mode) */
110 	unsigned short end_position;
111 };
112 
113 /* Edge enhancement (sharpen) configuration */
114 struct atomisp_ee_config {
115 	/* [gain] The strength of sharpness. u5_11 */
116 	unsigned int gain;
117 	/* [intensity] The threshold that divides noises from edge. u8_8 */
118 	unsigned int threshold;
119 	/* [gain] The strength of sharpness in pell-mell area. u5_11 */
120 	unsigned int detail_gain;
121 };
122 
123 struct atomisp_3a_output {
124 	int ae_y;
125 	int awb_cnt;
126 	int awb_gr;
127 	int awb_r;
128 	int awb_b;
129 	int awb_gb;
130 	int af_hpf1;
131 	int af_hpf2;
132 };
133 
134 enum atomisp_calibration_type {
135 	calibration_type1,
136 	calibration_type2,
137 	calibration_type3
138 };
139 
140 struct atomisp_gc_config {
141 	__u16 gain_k1;
142 	__u16 gain_k2;
143 };
144 
145 struct atomisp_3a_config {
146 	unsigned int ae_y_coef_r;	/* [gain] Weight of R for Y */
147 	unsigned int ae_y_coef_g;	/* [gain] Weight of G for Y */
148 	unsigned int ae_y_coef_b;	/* [gain] Weight of B for Y */
149 	unsigned int awb_lg_high_raw;	/* [intensity]
150 					   AWB level gate high for raw */
151 	unsigned int awb_lg_low;	/* [intensity] AWB level gate low */
152 	unsigned int awb_lg_high;	/* [intensity] AWB level gate high */
153 	int af_fir1_coef[7];	/* [factor] AF FIR coefficients of fir1 */
154 	int af_fir2_coef[7];	/* [factor] AF FIR coefficients of fir2 */
155 };
156 
157 struct atomisp_dvs_grid_info {
158 	u32 enable;
159 	u32 width;
160 	u32 aligned_width;
161 	u32 height;
162 	u32 aligned_height;
163 	u32 bqs_per_grid_cell;
164 	u32 num_hor_coefs;
165 	u32 num_ver_coefs;
166 };
167 
168 struct atomisp_dvs_envelop {
169 	unsigned int width;
170 	unsigned int height;
171 };
172 
173 struct atomisp_grid_info {
174 	u32 enable;
175 	u32 use_dmem;
176 	u32 has_histogram;
177 	u32 s3a_width;
178 	u32 s3a_height;
179 	u32 aligned_width;
180 	u32 aligned_height;
181 	u32 s3a_bqs_per_grid_cell;
182 	u32 deci_factor_log2;
183 	u32 elem_bit_depth;
184 };
185 
186 struct atomisp_dis_vector {
187 	int x;
188 	int y;
189 };
190 
191 /* DVS 2.0 Coefficient types. This structure contains 4 pointers to
192  *  arrays that contain the coefficients for each type.
193  */
194 struct atomisp_dvs2_coef_types {
195 	short __user *odd_real; /** real part of the odd coefficients*/
196 	short __user *odd_imag; /** imaginary part of the odd coefficients*/
197 	short __user *even_real;/** real part of the even coefficients*/
198 	short __user *even_imag;/** imaginary part of the even coefficients*/
199 };
200 
201 /*
202  * DVS 2.0 Statistic types. This structure contains 4 pointers to
203  * arrays that contain the statistics for each type.
204  */
205 struct atomisp_dvs2_stat_types {
206 	int __user *odd_real; /** real part of the odd statistics*/
207 	int __user *odd_imag; /** imaginary part of the odd statistics*/
208 	int __user *even_real;/** real part of the even statistics*/
209 	int __user *even_imag;/** imaginary part of the even statistics*/
210 };
211 
212 struct atomisp_dis_coefficients {
213 	struct atomisp_dvs_grid_info grid_info;
214 	struct atomisp_dvs2_coef_types hor_coefs;
215 	struct atomisp_dvs2_coef_types ver_coefs;
216 };
217 
218 struct atomisp_dvs2_statistics {
219 	struct atomisp_dvs_grid_info grid_info;
220 	struct atomisp_dvs2_stat_types hor_prod;
221 	struct atomisp_dvs2_stat_types ver_prod;
222 };
223 
224 struct atomisp_dis_statistics {
225 	struct atomisp_dvs2_statistics dvs2_stat;
226 	u32 exp_id;
227 };
228 
229 struct atomisp_3a_rgby_output {
230 	u32 r;
231 	u32 g;
232 	u32 b;
233 	u32 y;
234 };
235 
236 /*
237  * Because we have 2 pipes at max to output metadata, therefore driver will use
238  * ATOMISP_MAIN_METADATA to specify the metadata from the pipe which keeps
239  * streaming always and use ATOMISP_SEC_METADATA to specify the metadata from
240  * the pipe which is streaming by request like capture pipe of ZSL or SDV mode
241  * as secondary metadata. And for the use case which has only one pipe
242  * streaming like online capture, ATOMISP_MAIN_METADATA will be used.
243  */
244 enum atomisp_metadata_type {
245 	ATOMISP_MAIN_METADATA = 0,
246 	ATOMISP_SEC_METADATA,
247 	ATOMISP_METADATA_TYPE_NUM,
248 };
249 
250 struct atomisp_ext_isp_ctrl {
251 	u32 id;
252 	u32 data;
253 };
254 
255 struct atomisp_3a_statistics {
256 	struct atomisp_grid_info  grid_info;
257 	struct atomisp_3a_output __user *data;
258 	struct atomisp_3a_rgby_output __user *rgby_data;
259 	u32 exp_id; /* exposure ID */
260 	u32 isp_config_id; /* isp config ID */
261 };
262 
263 /* White Balance (Gain Adjust) */
264 struct atomisp_wb_config {
265 	unsigned int integer_bits;
266 	unsigned int gr;	/* unsigned <integer_bits>.<16-integer_bits> */
267 	unsigned int r;		/* unsigned <integer_bits>.<16-integer_bits> */
268 	unsigned int b;		/* unsigned <integer_bits>.<16-integer_bits> */
269 	unsigned int gb;	/* unsigned <integer_bits>.<16-integer_bits> */
270 };
271 
272 /* Color Space Conversion settings */
273 struct atomisp_cc_config {
274 	unsigned int fraction_bits;
275 	int matrix[3 * 3];	/* RGB2YUV Color matrix, signed
276 				   <13-fraction_bits>.<fraction_bits> */
277 };
278 
279 /* De pixel noise configuration */
280 struct atomisp_de_config {
281 	unsigned int pixelnoise;
282 	unsigned int c1_coring_threshold;
283 	unsigned int c2_coring_threshold;
284 };
285 
286 /* Chroma enhancement */
287 struct atomisp_ce_config {
288 	unsigned char uv_level_min;
289 	unsigned char uv_level_max;
290 };
291 
292 /* Defect pixel correction configuration */
293 struct atomisp_dp_config {
294 	/* [intensity] The threshold of defect Pixel Correction, representing
295 	 * the permissible difference of intensity between one pixel and its
296 	 * surrounding pixels. Smaller values result in more frequent pixel
297 	 * corrections. u0_16
298 	 */
299 	unsigned int threshold;
300 	/* [gain] The sensitivity of mis-correction. ISP will miss a lot of
301 	 * defects if the value is set too large. u8_8
302 	 */
303 	unsigned int gain;
304 	unsigned int gr;
305 	unsigned int r;
306 	unsigned int b;
307 	unsigned int gb;
308 };
309 
310 /* XNR threshold */
311 struct atomisp_xnr_config {
312 	__u16 threshold;
313 };
314 
315 /* metadata config */
316 struct atomisp_metadata_config {
317 	u32 metadata_height;
318 	u32 metadata_stride;
319 };
320 
321 /*
322  * Generic resolution structure.
323  */
324 struct atomisp_resolution {
325 	u32 width;  /** Width */
326 	u32 height; /** Height */
327 };
328 
329 /*
330  * This specifies the coordinates (x,y)
331  */
332 struct atomisp_zoom_point {
333 	s32 x; /** x coordinate */
334 	s32 y; /** y coordinate */
335 };
336 
337 /*
338  * This specifies the region
339  */
340 struct atomisp_zoom_region {
341 	struct atomisp_zoom_point
342 		origin; /* Starting point coordinates for the region */
343 	struct atomisp_resolution resolution; /* Region resolution */
344 };
345 
346 struct atomisp_dz_config {
347 	u32 dx; /** Horizontal zoom factor */
348 	u32 dy; /** Vertical zoom factor */
349 	struct atomisp_zoom_region zoom_region; /** region for zoom */
350 };
351 
352 struct atomisp_parm {
353 	struct atomisp_grid_info info;
354 	struct atomisp_dvs_grid_info dvs_grid;
355 	struct atomisp_dvs_envelop dvs_envelop;
356 	struct atomisp_wb_config wb_config;
357 	struct atomisp_cc_config cc_config;
358 	struct atomisp_ob_config ob_config;
359 	struct atomisp_de_config de_config;
360 	struct atomisp_dz_config dz_config;
361 	struct atomisp_ce_config ce_config;
362 	struct atomisp_dp_config dp_config;
363 	struct atomisp_nr_config nr_config;
364 	struct atomisp_ee_config ee_config;
365 	struct atomisp_tnr_config tnr_config;
366 	struct atomisp_metadata_config metadata_config;
367 };
368 
369 struct dvs2_bq_resolution {
370 	int width_bq;         /* width [BQ] */
371 	int height_bq;        /* height [BQ] */
372 };
373 
374 struct atomisp_dvs2_bq_resolutions {
375 	/* GDC source image size [BQ] */
376 	struct dvs2_bq_resolution source_bq;
377 	/* GDC output image size [BQ] */
378 	struct dvs2_bq_resolution output_bq;
379 	/* GDC effective envelope size [BQ] */
380 	struct dvs2_bq_resolution envelope_bq;
381 	/* isp pipe filter size [BQ] */
382 	struct dvs2_bq_resolution ispfilter_bq;
383 	/* GDC shit size [BQ] */
384 	struct dvs2_bq_resolution gdc_shift_bq;
385 };
386 
387 struct atomisp_dvs_6axis_config {
388 	u32 exp_id;
389 	u32 width_y;
390 	u32 height_y;
391 	u32 width_uv;
392 	u32 height_uv;
393 	u32 *xcoords_y;
394 	u32 *ycoords_y;
395 	u32 *xcoords_uv;
396 	u32 *ycoords_uv;
397 };
398 
399 struct atomisp_formats_config {
400 	u32 video_full_range_flag;
401 };
402 
403 struct atomisp_parameters {
404 	struct atomisp_wb_config   *wb_config;  /* White Balance config */
405 	struct atomisp_cc_config   *cc_config;  /* Color Correction config */
406 	struct atomisp_tnr_config  *tnr_config; /* Temporal Noise Reduction */
407 	struct atomisp_ecd_config  *ecd_config; /* Eigen Color Demosaicing */
408 	struct atomisp_ynr_config  *ynr_config; /* Y(Luma) Noise Reduction */
409 	struct atomisp_fc_config   *fc_config;  /* Fringe Control */
410 	struct atomisp_formats_config *formats_config; /* Formats Control */
411 	struct atomisp_cnr_config  *cnr_config; /* Chroma Noise Reduction */
412 	struct atomisp_macc_config *macc_config;  /* MACC */
413 	struct atomisp_ctc_config  *ctc_config; /* Chroma Tone Control */
414 	struct atomisp_aa_config   *aa_config;  /* Anti-Aliasing */
415 	struct atomisp_aa_config   *baa_config;  /* Anti-Aliasing */
416 	struct atomisp_ce_config   *ce_config;
417 	struct atomisp_dvs_6axis_config *dvs_6axis_config;
418 	struct atomisp_ob_config   *ob_config;  /* Objective Black config */
419 	struct atomisp_dp_config   *dp_config;  /* Dead Pixel config */
420 	struct atomisp_nr_config   *nr_config;  /* Noise Reduction config */
421 	struct atomisp_ee_config   *ee_config;  /* Edge Enhancement config */
422 	struct atomisp_de_config   *de_config;  /* Demosaic config */
423 	struct atomisp_gc_config   *gc_config;  /* Gamma Correction config */
424 	struct atomisp_anr_config  *anr_config; /* Advanced Noise Reduction */
425 	struct atomisp_3a_config   *a3a_config; /* 3A Statistics config */
426 	struct atomisp_xnr_config  *xnr_config; /* eXtra Noise Reduction */
427 	struct atomisp_dz_config   *dz_config;  /* Digital Zoom */
428 	struct atomisp_cc_config *yuv2rgb_cc_config; /* Color
429 							Correction config */
430 	struct atomisp_cc_config *rgb2yuv_cc_config; /* Color
431 							Correction config */
432 	struct atomisp_macc_table  *macc_table;
433 	struct atomisp_gamma_table *gamma_table;
434 	struct atomisp_ctc_table   *ctc_table;
435 	struct atomisp_xnr_table   *xnr_table;
436 	struct atomisp_rgb_gamma_table *r_gamma_table;
437 	struct atomisp_rgb_gamma_table *g_gamma_table;
438 	struct atomisp_rgb_gamma_table *b_gamma_table;
439 	struct atomisp_vector      *motion_vector; /* For 2-axis DVS */
440 	struct atomisp_shading_table *shading_table;
441 	struct atomisp_morph_table   *morph_table;
442 	struct atomisp_dvs_coefficients *dvs_coefs; /* DVS 1.0 coefficients */
443 	struct atomisp_dis_coefficients *dvs2_coefs; /* DVS 2.0 coefficients */
444 	struct atomisp_capture_config   *capture_config;
445 	struct atomisp_anr_thres   *anr_thres;
446 
447 	void	*lin_2500_config;       /* Skylake: Linearization config */
448 	void	*obgrid_2500_config;    /* Skylake: OBGRID config */
449 	void	*bnr_2500_config;       /* Skylake: bayer denoise config */
450 	void	*shd_2500_config;       /* Skylake: shading config */
451 	void	*dm_2500_config;        /* Skylake: demosaic config */
452 	void	*rgbpp_2500_config;     /* Skylake: RGBPP config */
453 	void	*dvs_stat_2500_config;  /* Skylake: DVS STAT config */
454 	void	*lace_stat_2500_config; /* Skylake: LACE STAT config */
455 	void	*yuvp1_2500_config;     /* Skylake: yuvp1 config */
456 	void	*yuvp2_2500_config;     /* Skylake: yuvp2 config */
457 	void	*tnr_2500_config;       /* Skylake: TNR config */
458 	void	*dpc_2500_config;       /* Skylake: DPC config */
459 	void	*awb_2500_config;       /* Skylake: auto white balance config */
460 	void	*awb_fr_2500_config;    /* Skylake: auto white balance filter response config */
461 	void	*anr_2500_config;       /* Skylake: ANR config */
462 	void	*af_2500_config;        /* Skylake: auto focus config */
463 	void	*ae_2500_config;        /* Skylake: auto exposure config */
464 	void	*bds_2500_config;       /* Skylake: bayer downscaler config */
465 	void	*dvs_2500_config;       /* Skylake: digital video stabilization config */
466 	void	*res_mgr_2500_config;
467 
468 	/*
469 	 * Output frame pointer the config is to be applied to (optional),
470 	 * set to NULL to make this config is applied as global.
471 	 */
472 	void	*output_frame;
473 	/*
474 	 * Unique ID to track which config was actually applied to a particular
475 	 * frame, driver will send this id back with output frame together.
476 	 */
477 	u32	isp_config_id;
478 
479 	/*
480 	 * Switch to control per_frame setting:
481 	 * 0: this is a global setting
482 	 * 1: this is a per_frame setting
483 	 * PLEASE KEEP THIS AT THE END OF THE STRUCTURE!!
484 	 */
485 	u32	per_frame_setting;
486 };
487 
488 #define ATOMISP_GAMMA_TABLE_SIZE        1024
489 struct atomisp_gamma_table {
490 	unsigned short data[ATOMISP_GAMMA_TABLE_SIZE];
491 };
492 
493 /* Morphing table for advanced ISP.
494  * Each line of width elements takes up COORD_TABLE_EXT_WIDTH elements
495  * in memory.
496  */
497 #define ATOMISP_MORPH_TABLE_NUM_PLANES  6
498 struct atomisp_morph_table {
499 	unsigned int enabled;
500 
501 	unsigned int height;
502 	unsigned int width;	/* number of valid elements per line */
503 	unsigned short __user *coordinates_x[ATOMISP_MORPH_TABLE_NUM_PLANES];
504 	unsigned short __user *coordinates_y[ATOMISP_MORPH_TABLE_NUM_PLANES];
505 };
506 
507 #define ATOMISP_NUM_SC_COLORS	4
508 #define ATOMISP_SC_FLAG_QUERY	BIT(0)
509 
510 struct atomisp_shading_table {
511 	__u32 enable;
512 
513 	__u32 sensor_width;
514 	__u32 sensor_height;
515 	__u32 width;
516 	__u32 height;
517 	__u32 fraction_bits;
518 
519 	__u16 *data[ATOMISP_NUM_SC_COLORS];
520 };
521 
522 /* parameter for MACC */
523 #define ATOMISP_NUM_MACC_AXES           16
524 struct atomisp_macc_table {
525 	short data[4 * ATOMISP_NUM_MACC_AXES];
526 };
527 
528 struct atomisp_macc_config {
529 	int color_effect;
530 	struct atomisp_macc_table table;
531 };
532 
533 /* Parameter for ctc parameter control */
534 #define ATOMISP_CTC_TABLE_SIZE          1024
535 struct atomisp_ctc_table {
536 	unsigned short data[ATOMISP_CTC_TABLE_SIZE];
537 };
538 
539 /* Parameter for overlay image loading */
540 struct atomisp_overlay {
541 	/* the frame containing the overlay data The overlay frame width should
542 	 * be the multiples of 2*ISP_VEC_NELEMS. The overlay frame height
543 	 * should be the multiples of 2.
544 	 */
545 	struct v4l2_framebuffer *frame;
546 	/* Y value of overlay background */
547 	unsigned char bg_y;
548 	/* U value of overlay background */
549 	char bg_u;
550 	/* V value of overlay background */
551 	char bg_v;
552 	/* the blending percent of input data for Y subpixels */
553 	unsigned char blend_input_perc_y;
554 	/* the blending percent of input data for U subpixels */
555 	unsigned char blend_input_perc_u;
556 	/* the blending percent of input data for V subpixels */
557 	unsigned char blend_input_perc_v;
558 	/* the blending percent of overlay data for Y subpixels */
559 	unsigned char blend_overlay_perc_y;
560 	/* the blending percent of overlay data for U subpixels */
561 	unsigned char blend_overlay_perc_u;
562 	/* the blending percent of overlay data for V subpixels */
563 	unsigned char blend_overlay_perc_v;
564 	/* the overlay start x pixel position on output frame It should be the
565 	   multiples of 2*ISP_VEC_NELEMS. */
566 	unsigned int overlay_start_x;
567 	/* the overlay start y pixel position on output frame It should be the
568 	   multiples of 2. */
569 	unsigned int overlay_start_y;
570 };
571 
572 struct atomisp_exposure {
573 	unsigned int integration_time[8];
574 	unsigned int shutter_speed[8];
575 	unsigned int gain[4];
576 	unsigned int aperture;
577 };
578 
579 /* For texture streaming. */
580 struct atomisp_bc_video_package {
581 	int ioctl_cmd;
582 	int device_id;
583 	int inputparam;
584 	int outputparam;
585 };
586 
587 enum atomisp_focus_hp {
588 	ATOMISP_FOCUS_HP_IN_PROGRESS = (1U << 2),
589 	ATOMISP_FOCUS_HP_COMPLETE    = (2U << 2),
590 	ATOMISP_FOCUS_HP_FAILED      = (3U << 2)
591 };
592 
593 /* Masks */
594 #define ATOMISP_FOCUS_STATUS_MOVING           BIT(0)
595 #define ATOMISP_FOCUS_STATUS_ACCEPTS_NEW_MOVE BIT(1)
596 #define ATOMISP_FOCUS_STATUS_HOME_POSITION    (3U << 2)
597 
598 enum atomisp_camera_port {
599 	ATOMISP_CAMERA_PORT_SECONDARY,
600 	ATOMISP_CAMERA_PORT_PRIMARY,
601 	ATOMISP_CAMERA_PORT_TERTIARY,
602 	ATOMISP_CAMERA_NR_PORTS
603 };
604 
605 enum atomisp_ext_isp_id {
606 	EXT_ISP_CID_ISO = 0,
607 	EXT_ISP_CID_CAPTURE_HDR,
608 	EXT_ISP_CID_CAPTURE_LLS,
609 	EXT_ISP_CID_FOCUS_MODE,
610 	EXT_ISP_CID_FOCUS_EXECUTION,
611 	EXT_ISP_CID_TOUCH_POSX,
612 	EXT_ISP_CID_TOUCH_POSY,
613 	EXT_ISP_CID_CAF_STATUS,
614 	EXT_ISP_CID_AF_STATUS,
615 	EXT_ISP_CID_GET_AF_MODE,
616 	EXT_ISP_CID_CAPTURE_BURST,
617 	EXT_ISP_CID_ZOOM,
618 	EXT_ISP_CID_SHOT_MODE
619 };
620 
621 #define EXT_ISP_FOCUS_MODE_NORMAL	0
622 #define EXT_ISP_FOCUS_MODE_MACRO	1
623 #define EXT_ISP_FOCUS_MODE_TOUCH_AF	2
624 #define EXT_ISP_FOCUS_MODE_PREVIEW_CAF	3
625 #define EXT_ISP_FOCUS_MODE_MOVIE_CAF	4
626 #define EXT_ISP_FOCUS_MODE_FACE_CAF	5
627 #define EXT_ISP_FOCUS_MODE_TOUCH_MACRO	6
628 #define EXT_ISP_FOCUS_MODE_TOUCH_CAF	7
629 
630 #define EXT_ISP_FOCUS_STOP		0
631 #define EXT_ISP_FOCUS_SEARCH		1
632 #define EXT_ISP_PAN_FOCUSING		2
633 
634 #define EXT_ISP_CAF_RESTART_CHECK	1
635 #define EXT_ISP_CAF_STATUS_FOCUSING	2
636 #define EXT_ISP_CAF_STATUS_SUCCESS	3
637 #define EXT_ISP_CAF_STATUS_FAIL         4
638 
639 #define EXT_ISP_AF_STATUS_INVALID	1
640 #define EXT_ISP_AF_STATUS_FOCUSING	2
641 #define EXT_ISP_AF_STATUS_SUCCESS	3
642 #define EXT_ISP_AF_STATUS_FAIL		4
643 
644 enum atomisp_burst_capture_options {
645 	EXT_ISP_BURST_CAPTURE_CTRL_START = 0,
646 	EXT_ISP_BURST_CAPTURE_CTRL_STOP
647 };
648 
649 #define EXT_ISP_SHOT_MODE_AUTO		0
650 #define EXT_ISP_SHOT_MODE_BEAUTY_FACE	1
651 #define EXT_ISP_SHOT_MODE_BEST_PHOTO	2
652 #define EXT_ISP_SHOT_MODE_DRAMA		3
653 #define EXT_ISP_SHOT_MODE_BEST_FACE	4
654 #define EXT_ISP_SHOT_MODE_ERASER	5
655 #define EXT_ISP_SHOT_MODE_PANORAMA	6
656 #define EXT_ISP_SHOT_MODE_RICH_TONE_HDR	7
657 #define EXT_ISP_SHOT_MODE_NIGHT		8
658 #define EXT_ISP_SHOT_MODE_SOUND_SHOT	9
659 #define EXT_ISP_SHOT_MODE_ANIMATED_PHOTO	10
660 #define EXT_ISP_SHOT_MODE_SPORTS	11
661 
662 /*Private IOCTLs for ISP */
663 #define ATOMISP_IOC_G_XNR \
664 	_IOR('v', BASE_VIDIOC_PRIVATE + 0, int)
665 #define ATOMISP_IOC_S_XNR \
666 	_IOW('v', BASE_VIDIOC_PRIVATE + 0, int)
667 #define ATOMISP_IOC_G_NR \
668 	_IOR('v', BASE_VIDIOC_PRIVATE + 1, struct atomisp_nr_config)
669 #define ATOMISP_IOC_S_NR \
670 	_IOW('v', BASE_VIDIOC_PRIVATE + 1, struct atomisp_nr_config)
671 #define ATOMISP_IOC_G_TNR \
672 	_IOR('v', BASE_VIDIOC_PRIVATE + 2, struct atomisp_tnr_config)
673 #define ATOMISP_IOC_S_TNR \
674 	_IOW('v', BASE_VIDIOC_PRIVATE + 2, struct atomisp_tnr_config)
675 #define ATOMISP_IOC_G_HISTOGRAM \
676 	_IOWR('v', BASE_VIDIOC_PRIVATE + 3, struct atomisp_histogram)
677 #define ATOMISP_IOC_S_HISTOGRAM \
678 	_IOW('v', BASE_VIDIOC_PRIVATE + 3, struct atomisp_histogram)
679 #define ATOMISP_IOC_G_BLACK_LEVEL_COMP \
680 	_IOR('v', BASE_VIDIOC_PRIVATE + 4, struct atomisp_ob_config)
681 #define ATOMISP_IOC_S_BLACK_LEVEL_COMP \
682 	_IOW('v', BASE_VIDIOC_PRIVATE + 4, struct atomisp_ob_config)
683 #define ATOMISP_IOC_G_EE \
684 	_IOR('v', BASE_VIDIOC_PRIVATE + 5, struct atomisp_ee_config)
685 #define ATOMISP_IOC_S_EE \
686 	_IOW('v', BASE_VIDIOC_PRIVATE + 5, struct atomisp_ee_config)
687 /* Digital Image Stabilization:
688  * 1. get dis statistics: reads DIS statistics from ISP (every frame)
689  * 2. set dis coefficients: set DIS filter coefficients (one time)
690  * 3. set dis motion vector: set motion vector (result of DIS, every frame)
691  */
692 #define ATOMISP_IOC_G_DIS_STAT \
693 	_IOWR('v', BASE_VIDIOC_PRIVATE + 6, struct atomisp_dis_statistics)
694 
695 #define ATOMISP_IOC_G_DVS2_BQ_RESOLUTIONS \
696 	_IOR('v', BASE_VIDIOC_PRIVATE + 6, struct atomisp_dvs2_bq_resolutions)
697 
698 #define ATOMISP_IOC_S_DIS_COEFS \
699 	_IOW('v', BASE_VIDIOC_PRIVATE + 6, struct atomisp_dis_coefficients)
700 
701 #define ATOMISP_IOC_S_DIS_VECTOR \
702 	_IOW('v', BASE_VIDIOC_PRIVATE + 6, struct atomisp_dvs_6axis_config)
703 
704 #define ATOMISP_IOC_G_3A_STAT \
705 	_IOWR('v', BASE_VIDIOC_PRIVATE + 7, struct atomisp_3a_statistics)
706 #define ATOMISP_IOC_G_ISP_PARM \
707 	_IOR('v', BASE_VIDIOC_PRIVATE + 8, struct atomisp_parm)
708 #define ATOMISP_IOC_S_ISP_PARM \
709 	_IOW('v', BASE_VIDIOC_PRIVATE + 8, struct atomisp_parm)
710 #define ATOMISP_IOC_G_ISP_GAMMA \
711 	_IOR('v', BASE_VIDIOC_PRIVATE + 9, struct atomisp_gamma_table)
712 #define ATOMISP_IOC_S_ISP_GAMMA \
713 	_IOW('v', BASE_VIDIOC_PRIVATE + 9, struct atomisp_gamma_table)
714 #define ATOMISP_IOC_G_ISP_GDC_TAB \
715 	_IOR('v', BASE_VIDIOC_PRIVATE + 10, struct atomisp_morph_table)
716 #define ATOMISP_IOC_S_ISP_GDC_TAB \
717 	_IOW('v', BASE_VIDIOC_PRIVATE + 10, struct atomisp_morph_table)
718 
719 /* macc parameter control*/
720 #define ATOMISP_IOC_G_ISP_MACC \
721 	_IOR('v', BASE_VIDIOC_PRIVATE + 12, struct atomisp_macc_config)
722 #define ATOMISP_IOC_S_ISP_MACC \
723 	_IOW('v', BASE_VIDIOC_PRIVATE + 12, struct atomisp_macc_config)
724 
725 /* Defect pixel detection & Correction */
726 #define ATOMISP_IOC_G_ISP_BAD_PIXEL_DETECTION \
727 	_IOR('v', BASE_VIDIOC_PRIVATE + 13, struct atomisp_dp_config)
728 #define ATOMISP_IOC_S_ISP_BAD_PIXEL_DETECTION \
729 	_IOW('v', BASE_VIDIOC_PRIVATE + 13, struct atomisp_dp_config)
730 
731 /* False Color Correction */
732 #define ATOMISP_IOC_G_ISP_FALSE_COLOR_CORRECTION \
733 	_IOR('v', BASE_VIDIOC_PRIVATE + 14, struct atomisp_de_config)
734 #define ATOMISP_IOC_S_ISP_FALSE_COLOR_CORRECTION \
735 	_IOW('v', BASE_VIDIOC_PRIVATE + 14, struct atomisp_de_config)
736 
737 /* ctc parameter control */
738 #define ATOMISP_IOC_G_ISP_CTC \
739 	_IOR('v', BASE_VIDIOC_PRIVATE + 15, struct atomisp_ctc_table)
740 #define ATOMISP_IOC_S_ISP_CTC \
741 	_IOW('v', BASE_VIDIOC_PRIVATE + 15, struct atomisp_ctc_table)
742 
743 /* white balance Correction */
744 #define ATOMISP_IOC_G_ISP_WHITE_BALANCE \
745 	_IOR('v', BASE_VIDIOC_PRIVATE + 16, struct atomisp_wb_config)
746 #define ATOMISP_IOC_S_ISP_WHITE_BALANCE \
747 	_IOW('v', BASE_VIDIOC_PRIVATE + 16, struct atomisp_wb_config)
748 
749 /* fpn table loading */
750 #define ATOMISP_IOC_S_ISP_FPN_TABLE \
751 	_IOW('v', BASE_VIDIOC_PRIVATE + 17, struct v4l2_framebuffer)
752 
753 /* overlay image loading */
754 #define ATOMISP_IOC_G_ISP_OVERLAY \
755 	_IOWR('v', BASE_VIDIOC_PRIVATE + 18, struct atomisp_overlay)
756 #define ATOMISP_IOC_S_ISP_OVERLAY \
757 	_IOW('v', BASE_VIDIOC_PRIVATE + 18, struct atomisp_overlay)
758 
759 /* bcd driver bridge */
760 #define ATOMISP_IOC_CAMERA_BRIDGE \
761 	_IOWR('v', BASE_VIDIOC_PRIVATE + 19, struct atomisp_bc_video_package)
762 
763 #define ATOMISP_IOC_S_EXPOSURE \
764 	_IOW('v', BASE_VIDIOC_PRIVATE + 21, struct atomisp_exposure)
765 
766 /* white balance Correction */
767 #define ATOMISP_IOC_G_3A_CONFIG \
768 	_IOR('v', BASE_VIDIOC_PRIVATE + 23, struct atomisp_3a_config)
769 #define ATOMISP_IOC_S_3A_CONFIG \
770 	_IOW('v', BASE_VIDIOC_PRIVATE + 23, struct atomisp_3a_config)
771 
772 /* LCS (shading) table write */
773 #define ATOMISP_IOC_S_ISP_SHD_TAB \
774 	_IOWR('v', BASE_VIDIOC_PRIVATE + 27, struct atomisp_shading_table)
775 
776 /* Gamma Correction */
777 #define ATOMISP_IOC_G_ISP_GAMMA_CORRECTION \
778 	_IOR('v', BASE_VIDIOC_PRIVATE + 28, struct atomisp_gc_config)
779 
780 #define ATOMISP_IOC_S_ISP_GAMMA_CORRECTION \
781 	_IOW('v', BASE_VIDIOC_PRIVATE + 28, struct atomisp_gc_config)
782 
783 #define ATOMISP_IOC_S_PARAMETERS \
784 	_IOW('v', BASE_VIDIOC_PRIVATE + 32, struct atomisp_parameters)
785 
786 #define ATOMISP_IOC_EXP_ID_UNLOCK \
787 	_IOW('v', BASE_VIDIOC_PRIVATE + 36, int)
788 
789 #define ATOMISP_IOC_EXP_ID_CAPTURE \
790 	_IOW('v', BASE_VIDIOC_PRIVATE + 37, int)
791 
792 #define ATOMISP_IOC_S_ENABLE_DZ_CAPT_PIPE \
793 	_IOWR('v', BASE_VIDIOC_PRIVATE + 38, unsigned int)
794 
795 #define ATOMISP_IOC_G_FORMATS_CONFIG \
796 	_IOR('v', BASE_VIDIOC_PRIVATE + 39, struct atomisp_formats_config)
797 
798 #define ATOMISP_IOC_S_FORMATS_CONFIG \
799 	_IOW('v', BASE_VIDIOC_PRIVATE + 39, struct atomisp_formats_config)
800 
801 #define ATOMISP_IOC_INJECT_A_FAKE_EVENT \
802 	_IOW('v', BASE_VIDIOC_PRIVATE + 42, int)
803 
804 #define ATOMISP_IOC_S_ARRAY_RESOLUTION \
805 	_IOW('v', BASE_VIDIOC_PRIVATE + 45, struct atomisp_resolution)
806 
807 /* for depth mode sensor frame sync compensation */
808 #define ATOMISP_IOC_G_DEPTH_SYNC_COMP \
809 	_IOR('v', BASE_VIDIOC_PRIVATE + 46, unsigned int)
810 
811 #define ATOMISP_IOC_S_SENSOR_EE_CONFIG \
812 	_IOW('v', BASE_VIDIOC_PRIVATE + 47, unsigned int)
813 
814 /*
815  * Reserved ioctls. We have customer implementing it internally.
816  * We can't use both numbers to not cause ABI conflict.
817  * Anyway, those ioctls are hacks and not implemented by us:
818  *
819  * #define ATOMISP_IOC_G_SENSOR_REG \
820  *	_IOW('v', BASE_VIDIOC_PRIVATE + 55, struct atomisp_sensor_regs)
821  * #define ATOMISP_IOC_S_SENSOR_REG \
822  *	_IOW('v', BASE_VIDIOC_PRIVATE + 56, struct atomisp_sensor_regs)
823  */
824 
825 /*  ISP Private control IDs */
826 #define V4L2_CID_ATOMISP_BAD_PIXEL_DETECTION \
827 	(V4L2_CID_PRIVATE_BASE + 0)
828 #define V4L2_CID_ATOMISP_POSTPROCESS_GDC_CAC \
829 	(V4L2_CID_PRIVATE_BASE + 1)
830 #define V4L2_CID_ATOMISP_VIDEO_STABLIZATION \
831 	(V4L2_CID_PRIVATE_BASE + 2)
832 #define V4L2_CID_ATOMISP_FIXED_PATTERN_NR \
833 	(V4L2_CID_PRIVATE_BASE + 3)
834 #define V4L2_CID_ATOMISP_FALSE_COLOR_CORRECTION \
835 	(V4L2_CID_PRIVATE_BASE + 4)
836 #define V4L2_CID_ATOMISP_LOW_LIGHT \
837 	(V4L2_CID_PRIVATE_BASE + 5)
838 
839 /* Camera class:
840  * Exposure, Flash and privacy (indicator) light controls, to be upstreamed */
841 #define V4L2_CID_CAMERA_LASTP1             (V4L2_CID_CAMERA_CLASS_BASE + 1024)
842 
843 #define V4L2_CID_RUN_MODE			(V4L2_CID_CAMERA_LASTP1 + 20)
844 #define ATOMISP_RUN_MODE_VIDEO			1
845 #define ATOMISP_RUN_MODE_STILL_CAPTURE		2
846 #define ATOMISP_RUN_MODE_PREVIEW		3
847 #define ATOMISP_RUN_MODE_MIN			1
848 #define ATOMISP_RUN_MODE_MAX			3
849 
850 #define V4L2_CID_ENABLE_VFPP			(V4L2_CID_CAMERA_LASTP1 + 21)
851 #define V4L2_CID_ATOMISP_CONTINUOUS_MODE	(V4L2_CID_CAMERA_LASTP1 + 22)
852 #define V4L2_CID_ATOMISP_CONTINUOUS_RAW_BUFFER_SIZE \
853 						(V4L2_CID_CAMERA_LASTP1 + 23)
854 #define V4L2_CID_ATOMISP_CONTINUOUS_VIEWFINDER \
855 						(V4L2_CID_CAMERA_LASTP1 + 24)
856 
857 #define V4L2_CID_VFPP				(V4L2_CID_CAMERA_LASTP1 + 25)
858 #define ATOMISP_VFPP_ENABLE			0
859 #define ATOMISP_VFPP_DISABLE_SCALER		1
860 #define ATOMISP_VFPP_DISABLE_LOWLAT		2
861 
862 #define V4L2_CID_START_ZSL_CAPTURE	(V4L2_CID_CAMERA_LASTP1 + 28)
863 /* Lock and unlock raw buffer */
864 #define V4L2_CID_ENABLE_RAW_BUFFER_LOCK (V4L2_CID_CAMERA_LASTP1 + 29)
865 
866 #define V4L2_CID_EXPOSURE_ZONE_NUM	(V4L2_CID_CAMERA_LASTP1 + 31)
867 /* Disable digital zoom */
868 #define V4L2_CID_DISABLE_DZ		(V4L2_CID_CAMERA_LASTP1 + 32)
869 
870 #define V4L2_CID_ATOMISP_SELECT_ISP_VERSION	(V4L2_CID_CAMERA_LASTP1 + 38)
871 
872 #define V4L2_BUF_FLAG_BUFFER_INVALID       0x0400
873 #define V4L2_BUF_FLAG_BUFFER_VALID         0x0800
874 
875 #define V4L2_BUF_TYPE_VIDEO_CAPTURE_ION  (V4L2_BUF_TYPE_PRIVATE + 1024)
876 
877 #define V4L2_EVENT_ATOMISP_3A_STATS_READY   (V4L2_EVENT_PRIVATE_START + 1)
878 #define V4L2_EVENT_ATOMISP_METADATA_READY   (V4L2_EVENT_PRIVATE_START + 2)
879 #define V4L2_EVENT_ATOMISP_ACC_COMPLETE     (V4L2_EVENT_PRIVATE_START + 4)
880 #define V4L2_EVENT_ATOMISP_PAUSE_BUFFER	    (V4L2_EVENT_PRIVATE_START + 5)
881 #define V4L2_EVENT_ATOMISP_CSS_RESET	    (V4L2_EVENT_PRIVATE_START + 6)
882 /* Nonstandard color effects for V4L2_CID_COLORFX */
883 enum {
884 	V4L2_COLORFX_SKIN_WHITEN_LOW = 1001,
885 	V4L2_COLORFX_SKIN_WHITEN_HIGH = 1002,
886 	V4L2_COLORFX_WARM = 1003,
887 	V4L2_COLORFX_COLD = 1004,
888 	V4L2_COLORFX_WASHED = 1005,
889 	V4L2_COLORFX_RED = 1006,
890 	V4L2_COLORFX_GREEN = 1007,
891 	V4L2_COLORFX_BLUE = 1008,
892 	V4L2_COLORFX_PINK = 1009,
893 	V4L2_COLORFX_YELLOW = 1010,
894 	V4L2_COLORFX_PURPLE = 1011,
895 };
896 
897 #endif /* _ATOM_ISP_H */
898