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  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License version
9  * 2 as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  *
17  */
18 
19 #ifndef _ATOM_ISP_H
20 #define _ATOM_ISP_H
21 
22 #include <linux/types.h>
23 #include <linux/version.h>
24 
25 /* struct media_device_info.hw_revision */
26 #define ATOMISP_HW_REVISION_MASK	0x0000ff00
27 #define ATOMISP_HW_REVISION_SHIFT	8
28 #define ATOMISP_HW_REVISION_ISP2300	0x00
29 #define ATOMISP_HW_REVISION_ISP2400	0x10
30 #define ATOMISP_HW_REVISION_ISP2401_LEGACY 0x11
31 #define ATOMISP_HW_REVISION_ISP2401	0x20
32 
33 #define ATOMISP_HW_STEPPING_MASK	0x000000ff
34 #define ATOMISP_HW_STEPPING_A0		0x00
35 #define ATOMISP_HW_STEPPING_B0		0x10
36 
37 /*ISP binary running mode*/
38 #define CI_MODE_PREVIEW		0x8000
39 #define CI_MODE_VIDEO		0x4000
40 #define CI_MODE_STILL_CAPTURE	0x2000
41 #define CI_MODE_CONTINUOUS	0x1000
42 #define CI_MODE_NONE		0x0000
43 
44 #define OUTPUT_MODE_FILE 0x0100
45 #define OUTPUT_MODE_TEXT 0x0200
46 
47 /*
48  * Camera HAL sets this flag in v4l2_buffer reserved2 to indicate this
49  * buffer has a per-frame parameter.
50  */
51 #define ATOMISP_BUFFER_HAS_PER_FRAME_SETTING	0x80000000
52 
53 /* Custom format for RAW capture from M10MO 0x3130314d */
54 #define V4L2_PIX_FMT_CUSTOM_M10MO_RAW	v4l2_fourcc('M', '1', '0', '1')
55 
56 /* Custom media bus formats being used in atomisp */
57 #define V4L2_MBUS_FMT_CUSTOM_YUV420	0x8001
58 #define V4L2_MBUS_FMT_CUSTOM_YVU420	0x8002
59 #define V4L2_MBUS_FMT_CUSTOM_YUV422P	0x8003
60 #define V4L2_MBUS_FMT_CUSTOM_YUV444	0x8004
61 #define V4L2_MBUS_FMT_CUSTOM_NV12	0x8005
62 #define V4L2_MBUS_FMT_CUSTOM_NV21	0x8006
63 #define V4L2_MBUS_FMT_CUSTOM_NV16	0x8007
64 #define V4L2_MBUS_FMT_CUSTOM_YUYV	0x8008
65 #define V4L2_MBUS_FMT_CUSTOM_SBGGR16	0x8009
66 #define V4L2_MBUS_FMT_CUSTOM_RGB32	0x800a
67 
68 /* Custom media bus format for M10MO RAW capture */
69 #if 0
70 #define V4L2_MBUS_FMT_CUSTOM_M10MO_RAW	0x800b
71 #endif
72 
73 /* Configuration used by Bayer noise reduction and YCC noise reduction */
74 struct atomisp_nr_config {
75 	/* [gain] Strength of noise reduction for Bayer NR (Used by Bayer NR) */
76 	unsigned int bnr_gain;
77 	/* [gain] Strength of noise reduction for YCC NR (Used by YCC NR) */
78 	unsigned int ynr_gain;
79 	/* [intensity] Sensitivity of Edge (Used by Bayer NR) */
80 	unsigned int direction;
81 	/* [intensity] coring threshold for Cb (Used by YCC NR) */
82 	unsigned int threshold_cb;
83 	/* [intensity] coring threshold for Cr (Used by YCC NR) */
84 	unsigned int threshold_cr;
85 };
86 
87 /* Temporal noise reduction configuration */
88 struct atomisp_tnr_config {
89 	unsigned int gain;	 /* [gain] Strength of NR */
90 	unsigned int threshold_y;/* [intensity] Motion sensitivity for Y */
91 	unsigned int threshold_uv;/* [intensity] Motion sensitivity for U/V */
92 };
93 
94 /* Histogram. This contains num_elements values of type unsigned int.
95  * The data pointer is a DDR pointer (virtual address).
96  */
97 struct atomisp_histogram {
98 	unsigned int num_elements;
99 	void __user *data;
100 };
101 
102 enum atomisp_ob_mode {
103 	atomisp_ob_mode_none,
104 	atomisp_ob_mode_fixed,
105 	atomisp_ob_mode_raster
106 };
107 
108 /* Optical black level configuration */
109 struct atomisp_ob_config {
110 	/* Obtical black level mode (Fixed / Raster) */
111 	enum atomisp_ob_mode mode;
112 	/* [intensity] optical black level for GR (relevant for fixed mode) */
113 	unsigned int level_gr;
114 	/* [intensity] optical black level for R (relevant for fixed mode) */
115 	unsigned int level_r;
116 	/* [intensity] optical black level for B (relevant for fixed mode) */
117 	unsigned int level_b;
118 	/* [intensity] optical black level for GB (relevant for fixed mode) */
119 	unsigned int level_gb;
120 	/* [BQ] 0..63 start position of OB area (relevant for raster mode) */
121 	unsigned short start_position;
122 	/* [BQ] start..63 end position of OB area (relevant for raster mode) */
123 	unsigned short end_position;
124 };
125 
126 /* Edge enhancement (sharpen) configuration */
127 struct atomisp_ee_config {
128 	/* [gain] The strength of sharpness. u5_11 */
129 	unsigned int gain;
130 	/* [intensity] The threshold that divides noises from edge. u8_8 */
131 	unsigned int threshold;
132 	/* [gain] The strength of sharpness in pell-mell area. u5_11 */
133 	unsigned int detail_gain;
134 };
135 
136 struct atomisp_3a_output {
137 	int ae_y;
138 	int awb_cnt;
139 	int awb_gr;
140 	int awb_r;
141 	int awb_b;
142 	int awb_gb;
143 	int af_hpf1;
144 	int af_hpf2;
145 };
146 
147 enum atomisp_calibration_type {
148 	calibration_type1,
149 	calibration_type2,
150 	calibration_type3
151 };
152 
153 struct atomisp_calibration_group {
154 	unsigned int size;
155 	unsigned int type;
156 	unsigned short *calb_grp_values;
157 };
158 
159 struct atomisp_gc_config {
160 	__u16 gain_k1;
161 	__u16 gain_k2;
162 };
163 
164 struct atomisp_3a_config {
165 	unsigned int ae_y_coef_r;	/* [gain] Weight of R for Y */
166 	unsigned int ae_y_coef_g;	/* [gain] Weight of G for Y */
167 	unsigned int ae_y_coef_b;	/* [gain] Weight of B for Y */
168 	unsigned int awb_lg_high_raw;	/* [intensity]
169 					   AWB level gate high for raw */
170 	unsigned int awb_lg_low;	/* [intensity] AWB level gate low */
171 	unsigned int awb_lg_high;	/* [intensity] AWB level gate high */
172 	int af_fir1_coef[7];	/* [factor] AF FIR coefficients of fir1 */
173 	int af_fir2_coef[7];	/* [factor] AF FIR coefficients of fir2 */
174 };
175 
176 struct atomisp_dvs_grid_info {
177 	u32 enable;
178 	u32 width;
179 	u32 aligned_width;
180 	u32 height;
181 	u32 aligned_height;
182 	u32 bqs_per_grid_cell;
183 	u32 num_hor_coefs;
184 	u32 num_ver_coefs;
185 };
186 
187 struct atomisp_dvs_envelop {
188 	unsigned int width;
189 	unsigned int height;
190 };
191 
192 struct atomisp_grid_info {
193 	u32 enable;
194 	u32 use_dmem;
195 	u32 has_histogram;
196 	u32 s3a_width;
197 	u32 s3a_height;
198 	u32 aligned_width;
199 	u32 aligned_height;
200 	u32 s3a_bqs_per_grid_cell;
201 	u32 deci_factor_log2;
202 	u32 elem_bit_depth;
203 };
204 
205 struct atomisp_dis_vector {
206 	int x;
207 	int y;
208 };
209 
210 /* DVS 2.0 Coefficient types. This structure contains 4 pointers to
211  *  arrays that contain the coeffients for each type.
212  */
213 struct atomisp_dvs2_coef_types {
214 	short __user *odd_real; /** real part of the odd coefficients*/
215 	short __user *odd_imag; /** imaginary part of the odd coefficients*/
216 	short __user *even_real;/** real part of the even coefficients*/
217 	short __user *even_imag;/** imaginary part of the even coefficients*/
218 };
219 
220 /*
221  * DVS 2.0 Statistic types. This structure contains 4 pointers to
222  * arrays that contain the statistics for each type.
223  */
224 struct atomisp_dvs2_stat_types {
225 	int __user *odd_real; /** real part of the odd statistics*/
226 	int __user *odd_imag; /** imaginary part of the odd statistics*/
227 	int __user *even_real;/** real part of the even statistics*/
228 	int __user *even_imag;/** imaginary part of the even statistics*/
229 };
230 
231 struct atomisp_dis_coefficients {
232 	struct atomisp_dvs_grid_info grid_info;
233 	struct atomisp_dvs2_coef_types hor_coefs;
234 	struct atomisp_dvs2_coef_types ver_coefs;
235 };
236 
237 struct atomisp_dvs2_statistics {
238 	struct atomisp_dvs_grid_info grid_info;
239 	struct atomisp_dvs2_stat_types hor_prod;
240 	struct atomisp_dvs2_stat_types ver_prod;
241 };
242 
243 struct atomisp_dis_statistics {
244 	struct atomisp_dvs2_statistics dvs2_stat;
245 	u32 exp_id;
246 };
247 
248 struct atomisp_3a_rgby_output {
249 	u32 r;
250 	u32 g;
251 	u32 b;
252 	u32 y;
253 };
254 
255 /*
256  * Because we have 2 pipes at max to output metadata, therefore driver will use
257  * ATOMISP_MAIN_METADATA to specify the metadata from the pipe which keeps
258  * streaming always and use ATOMISP_SEC_METADATA to specify the metadata from
259  * the pipe which is streaming by request like capture pipe of ZSL or SDV mode
260  * as secondary metadata. And for the use case which has only one pipe
261  * streaming like online capture, ATOMISP_MAIN_METADATA will be used.
262  */
263 enum atomisp_metadata_type {
264 	ATOMISP_MAIN_METADATA = 0,
265 	ATOMISP_SEC_METADATA,
266 	ATOMISP_METADATA_TYPE_NUM,
267 };
268 
269 struct atomisp_metadata_with_type {
270 	/* to specify which type of metadata to get */
271 	enum atomisp_metadata_type type;
272 	void __user *data;
273 	u32 width;
274 	u32 height;
275 	u32 stride; /* in bytes */
276 	u32 exp_id; /* exposure ID */
277 	u32 *effective_width; /* mipi packets valid data size */
278 };
279 
280 struct atomisp_metadata {
281 	void __user *data;
282 	u32 width;
283 	u32 height;
284 	u32 stride; /* in bytes */
285 	u32 exp_id; /* exposure ID */
286 	u32 *effective_width; /* mipi packets valid data size */
287 };
288 
289 struct atomisp_ext_isp_ctrl {
290 	u32 id;
291 	u32 data;
292 };
293 
294 struct atomisp_3a_statistics {
295 	struct atomisp_grid_info  grid_info;
296 	struct atomisp_3a_output __user *data;
297 	struct atomisp_3a_rgby_output __user *rgby_data;
298 	u32 exp_id; /* exposure ID */
299 	u32 isp_config_id; /* isp config ID */
300 };
301 
302 /**
303  * struct atomisp_cont_capture_conf - continuous capture parameters
304  * @num_captures: number of still images to capture
305  * @skip_frames: number of frames to skip between 2 captures
306  * @offset: offset in ring buffer to start capture
307  *
308  * For example, to capture 1 frame from past, current, and 1 from future
309  * and skip one frame between each capture, parameters would be:
310  * num_captures:3
311  * skip_frames:1
312  * offset:-2
313  */
314 
315 struct atomisp_cont_capture_conf {
316 	int num_captures;
317 	unsigned int skip_frames;
318 	int offset;
319 	__u32 reserved[5];
320 };
321 
322 struct atomisp_ae_window {
323 	int x_left;
324 	int x_right;
325 	int y_top;
326 	int y_bottom;
327 	int weight;
328 };
329 
330 /* White Balance (Gain Adjust) */
331 struct atomisp_wb_config {
332 	unsigned int integer_bits;
333 	unsigned int gr;	/* unsigned <integer_bits>.<16-integer_bits> */
334 	unsigned int r;		/* unsigned <integer_bits>.<16-integer_bits> */
335 	unsigned int b;		/* unsigned <integer_bits>.<16-integer_bits> */
336 	unsigned int gb;	/* unsigned <integer_bits>.<16-integer_bits> */
337 };
338 
339 /* Color Space Conversion settings */
340 struct atomisp_cc_config {
341 	unsigned int fraction_bits;
342 	int matrix[3 * 3];	/* RGB2YUV Color matrix, signed
343 				   <13-fraction_bits>.<fraction_bits> */
344 };
345 
346 /* De pixel noise configuration */
347 struct atomisp_de_config {
348 	unsigned int pixelnoise;
349 	unsigned int c1_coring_threshold;
350 	unsigned int c2_coring_threshold;
351 };
352 
353 /* Chroma enhancement */
354 struct atomisp_ce_config {
355 	unsigned char uv_level_min;
356 	unsigned char uv_level_max;
357 };
358 
359 /* Defect pixel correction configuration */
360 struct atomisp_dp_config {
361 	/* [intensity] The threshold of defect Pixel Correction, representing
362 	 * the permissible difference of intensity between one pixel and its
363 	 * surrounding pixels. Smaller values result in more frequent pixel
364 	 * corrections. u0_16
365 	 */
366 	unsigned int threshold;
367 	/* [gain] The sensitivity of mis-correction. ISP will miss a lot of
368 	 * defects if the value is set too large. u8_8
369 	 */
370 	unsigned int gain;
371 	unsigned int gr;
372 	unsigned int r;
373 	unsigned int b;
374 	unsigned int gb;
375 };
376 
377 /* XNR threshold */
378 struct atomisp_xnr_config {
379 	__u16 threshold;
380 };
381 
382 /* metadata config */
383 struct atomisp_metadata_config {
384 	u32 metadata_height;
385 	u32 metadata_stride;
386 };
387 
388 /*
389  * Generic resolution structure.
390  */
391 struct atomisp_resolution {
392 	u32 width;  /** Width */
393 	u32 height; /** Height */
394 };
395 
396 /*
397  * This specifies the coordinates (x,y)
398  */
399 struct atomisp_zoom_point {
400 	s32 x; /** x coordinate */
401 	s32 y; /** y coordinate */
402 };
403 
404 /*
405  * This specifies the region
406  */
407 struct atomisp_zoom_region {
408 	struct atomisp_zoom_point
409 		origin; /* Starting point coordinates for the region */
410 	struct atomisp_resolution resolution; /* Region resolution */
411 };
412 
413 struct atomisp_dz_config {
414 	u32 dx; /** Horizontal zoom factor */
415 	u32 dy; /** Vertical zoom factor */
416 	struct atomisp_zoom_region zoom_region; /** region for zoom */
417 };
418 
419 struct atomisp_parm {
420 	struct atomisp_grid_info info;
421 	struct atomisp_dvs_grid_info dvs_grid;
422 	struct atomisp_dvs_envelop dvs_envelop;
423 	struct atomisp_wb_config wb_config;
424 	struct atomisp_cc_config cc_config;
425 	struct atomisp_ob_config ob_config;
426 	struct atomisp_de_config de_config;
427 	struct atomisp_dz_config dz_config;
428 	struct atomisp_ce_config ce_config;
429 	struct atomisp_dp_config dp_config;
430 	struct atomisp_nr_config nr_config;
431 	struct atomisp_ee_config ee_config;
432 	struct atomisp_tnr_config tnr_config;
433 	struct atomisp_metadata_config metadata_config;
434 };
435 
436 struct dvs2_bq_resolution {
437 	int width_bq;         /* width [BQ] */
438 	int height_bq;        /* height [BQ] */
439 };
440 
441 struct atomisp_dvs2_bq_resolutions {
442 	/* GDC source image size [BQ] */
443 	struct dvs2_bq_resolution source_bq;
444 	/* GDC output image size [BQ] */
445 	struct dvs2_bq_resolution output_bq;
446 	/* GDC effective envelope size [BQ] */
447 	struct dvs2_bq_resolution envelope_bq;
448 	/* isp pipe filter size [BQ] */
449 	struct dvs2_bq_resolution ispfilter_bq;
450 	/* GDC shit size [BQ] */
451 	struct dvs2_bq_resolution gdc_shift_bq;
452 };
453 
454 struct atomisp_dvs_6axis_config {
455 	u32 exp_id;
456 	u32 width_y;
457 	u32 height_y;
458 	u32 width_uv;
459 	u32 height_uv;
460 	u32 *xcoords_y;
461 	u32 *ycoords_y;
462 	u32 *xcoords_uv;
463 	u32 *ycoords_uv;
464 };
465 
466 struct atomisp_formats_config {
467 	u32 video_full_range_flag;
468 };
469 
470 struct atomisp_parameters {
471 	struct atomisp_wb_config   *wb_config;  /* White Balance config */
472 	struct atomisp_cc_config   *cc_config;  /* Color Correction config */
473 	struct atomisp_tnr_config  *tnr_config; /* Temporal Noise Reduction */
474 	struct atomisp_ecd_config  *ecd_config; /* Eigen Color Demosaicing */
475 	struct atomisp_ynr_config  *ynr_config; /* Y(Luma) Noise Reduction */
476 	struct atomisp_fc_config   *fc_config;  /* Fringe Control */
477 	struct atomisp_formats_config *formats_config; /* Formats Control */
478 	struct atomisp_cnr_config  *cnr_config; /* Chroma Noise Reduction */
479 	struct atomisp_macc_config *macc_config;  /* MACC */
480 	struct atomisp_ctc_config  *ctc_config; /* Chroma Tone Control */
481 	struct atomisp_aa_config   *aa_config;  /* Anti-Aliasing */
482 	struct atomisp_aa_config   *baa_config;  /* Anti-Aliasing */
483 	struct atomisp_ce_config   *ce_config;
484 	struct atomisp_dvs_6axis_config *dvs_6axis_config;
485 	struct atomisp_ob_config   *ob_config;  /* Objective Black config */
486 	struct atomisp_dp_config   *dp_config;  /* Dead Pixel config */
487 	struct atomisp_nr_config   *nr_config;  /* Noise Reduction config */
488 	struct atomisp_ee_config   *ee_config;  /* Edge Enhancement config */
489 	struct atomisp_de_config   *de_config;  /* Demosaic config */
490 	struct atomisp_gc_config   *gc_config;  /* Gamma Correction config */
491 	struct atomisp_anr_config  *anr_config; /* Advanced Noise Reduction */
492 	struct atomisp_3a_config   *a3a_config; /* 3A Statistics config */
493 	struct atomisp_xnr_config  *xnr_config; /* eXtra Noise Reduction */
494 	struct atomisp_dz_config   *dz_config;  /* Digital Zoom */
495 	struct atomisp_cc_config *yuv2rgb_cc_config; /* Color
496 							Correction config */
497 	struct atomisp_cc_config *rgb2yuv_cc_config; /* Color
498 							Correction config */
499 	struct atomisp_macc_table  *macc_table;
500 	struct atomisp_gamma_table *gamma_table;
501 	struct atomisp_ctc_table   *ctc_table;
502 	struct atomisp_xnr_table   *xnr_table;
503 	struct atomisp_rgb_gamma_table *r_gamma_table;
504 	struct atomisp_rgb_gamma_table *g_gamma_table;
505 	struct atomisp_rgb_gamma_table *b_gamma_table;
506 	struct atomisp_vector      *motion_vector; /* For 2-axis DVS */
507 	struct atomisp_shading_table *shading_table;
508 	struct atomisp_morph_table   *morph_table;
509 	struct atomisp_dvs_coefficients *dvs_coefs; /* DVS 1.0 coefficients */
510 	struct atomisp_dis_coefficients *dvs2_coefs; /* DVS 2.0 coefficients */
511 	struct atomisp_capture_config   *capture_config;
512 	struct atomisp_anr_thres   *anr_thres;
513 
514 	void	*lin_2500_config;       /* Skylake: Linearization config */
515 	void	*obgrid_2500_config;    /* Skylake: OBGRID config */
516 	void	*bnr_2500_config;       /* Skylake: bayer denoise config */
517 	void	*shd_2500_config;       /* Skylake: shading config */
518 	void	*dm_2500_config;        /* Skylake: demosaic config */
519 	void	*rgbpp_2500_config;     /* Skylake: RGBPP config */
520 	void	*dvs_stat_2500_config;  /* Skylake: DVS STAT config */
521 	void	*lace_stat_2500_config; /* Skylake: LACE STAT config */
522 	void	*yuvp1_2500_config;     /* Skylake: yuvp1 config */
523 	void	*yuvp2_2500_config;     /* Skylake: yuvp2 config */
524 	void	*tnr_2500_config;       /* Skylake: TNR config */
525 	void	*dpc_2500_config;       /* Skylake: DPC config */
526 	void	*awb_2500_config;       /* Skylake: auto white balance config */
527 	void	*awb_fr_2500_config;    /* Skylake: auto white balance filter response config */
528 	void	*anr_2500_config;       /* Skylake: ANR config */
529 	void	*af_2500_config;        /* Skylake: auto focus config */
530 	void	*ae_2500_config;        /* Skylake: auto exposure config */
531 	void	*bds_2500_config;       /* Skylake: bayer downscaler config */
532 	void	*dvs_2500_config;       /* Skylake: digital video stabilization config */
533 	void	*res_mgr_2500_config;
534 
535 	/*
536 	 * Output frame pointer the config is to be applied to (optional),
537 	 * set to NULL to make this config is applied as global.
538 	 */
539 	void	*output_frame;
540 	/*
541 	 * Unique ID to track which config was actually applied to a particular
542 	 * frame, driver will send this id back with output frame together.
543 	 */
544 	u32	isp_config_id;
545 
546 	/*
547 	 * Switch to control per_frame setting:
548 	 * 0: this is a global setting
549 	 * 1: this is a per_frame setting
550 	 * PLEASE KEEP THIS AT THE END OF THE STRUCTURE!!
551 	 */
552 	u32	per_frame_setting;
553 };
554 
555 #define ATOMISP_GAMMA_TABLE_SIZE        1024
556 struct atomisp_gamma_table {
557 	unsigned short data[ATOMISP_GAMMA_TABLE_SIZE];
558 };
559 
560 /* Morphing table for advanced ISP.
561  * Each line of width elements takes up COORD_TABLE_EXT_WIDTH elements
562  * in memory.
563  */
564 #define ATOMISP_MORPH_TABLE_NUM_PLANES  6
565 struct atomisp_morph_table {
566 	unsigned int enabled;
567 
568 	unsigned int height;
569 	unsigned int width;	/* number of valid elements per line */
570 	unsigned short __user *coordinates_x[ATOMISP_MORPH_TABLE_NUM_PLANES];
571 	unsigned short __user *coordinates_y[ATOMISP_MORPH_TABLE_NUM_PLANES];
572 };
573 
574 #define ATOMISP_NUM_SC_COLORS	4
575 #define ATOMISP_SC_FLAG_QUERY	BIT(0)
576 
577 struct atomisp_shading_table {
578 	__u32 enable;
579 
580 	__u32 sensor_width;
581 	__u32 sensor_height;
582 	__u32 width;
583 	__u32 height;
584 	__u32 fraction_bits;
585 
586 	__u16 *data[ATOMISP_NUM_SC_COLORS];
587 };
588 
589 struct atomisp_makernote_info {
590 	/* bits 31-16: numerator, bits 15-0: denominator */
591 	unsigned int focal_length;
592 	/* bits 31-16: numerator, bits 15-0: denominator*/
593 	unsigned int f_number_curr;
594 	/*
595 	* bits 31-24: max f-number numerator
596 	* bits 23-16: max f-number denominator
597 	* bits 15-8: min f-number numerator
598 	* bits 7-0: min f-number denominator
599 	*/
600 	unsigned int f_number_range;
601 };
602 
603 /* parameter for MACC */
604 #define ATOMISP_NUM_MACC_AXES           16
605 struct atomisp_macc_table {
606 	short data[4 * ATOMISP_NUM_MACC_AXES];
607 };
608 
609 struct atomisp_macc_config {
610 	int color_effect;
611 	struct atomisp_macc_table table;
612 };
613 
614 /* Parameter for ctc parameter control */
615 #define ATOMISP_CTC_TABLE_SIZE          1024
616 struct atomisp_ctc_table {
617 	unsigned short data[ATOMISP_CTC_TABLE_SIZE];
618 };
619 
620 /* Parameter for overlay image loading */
621 struct atomisp_overlay {
622 	/* the frame containing the overlay data The overlay frame width should
623 	 * be the multiples of 2*ISP_VEC_NELEMS. The overlay frame height
624 	 * should be the multiples of 2.
625 	 */
626 	struct v4l2_framebuffer *frame;
627 	/* Y value of overlay background */
628 	unsigned char bg_y;
629 	/* U value of overlay background */
630 	char bg_u;
631 	/* V value of overlay background */
632 	char bg_v;
633 	/* the blending percent of input data for Y subpixels */
634 	unsigned char blend_input_perc_y;
635 	/* the blending percent of input data for U subpixels */
636 	unsigned char blend_input_perc_u;
637 	/* the blending percent of input data for V subpixels */
638 	unsigned char blend_input_perc_v;
639 	/* the blending percent of overlay data for Y subpixels */
640 	unsigned char blend_overlay_perc_y;
641 	/* the blending percent of overlay data for U subpixels */
642 	unsigned char blend_overlay_perc_u;
643 	/* the blending percent of overlay data for V subpixels */
644 	unsigned char blend_overlay_perc_v;
645 	/* the overlay start x pixel position on output frame It should be the
646 	   multiples of 2*ISP_VEC_NELEMS. */
647 	unsigned int overlay_start_x;
648 	/* the overlay start y pixel position on output frame It should be the
649 	   multiples of 2. */
650 	unsigned int overlay_start_y;
651 };
652 
653 /* Sensor resolution specific data for AE calculation.*/
654 struct atomisp_sensor_mode_data {
655 	unsigned int coarse_integration_time_min;
656 	unsigned int coarse_integration_time_max_margin;
657 	unsigned int fine_integration_time_min;
658 	unsigned int fine_integration_time_max_margin;
659 	unsigned int fine_integration_time_def;
660 	unsigned int frame_length_lines;
661 	unsigned int line_length_pck;
662 	unsigned int read_mode;
663 	unsigned int vt_pix_clk_freq_mhz;
664 	unsigned int crop_horizontal_start; /* Sensor crop start cord. (x0,y0)*/
665 	unsigned int crop_vertical_start;
666 	unsigned int crop_horizontal_end; /* Sensor crop end cord. (x1,y1)*/
667 	unsigned int crop_vertical_end;
668 	unsigned int output_width; /* input size to ISP after binning/scaling */
669 	unsigned int output_height;
670 	u8 binning_factor_x; /* horizontal binning factor used */
671 	u8 binning_factor_y; /* vertical binning factor used */
672 	u16 hts;
673 };
674 
675 struct atomisp_exposure {
676 	unsigned int integration_time[8];
677 	unsigned int shutter_speed[8];
678 	unsigned int gain[4];
679 	unsigned int aperture;
680 };
681 
682 /* For texture streaming. */
683 struct atomisp_bc_video_package {
684 	int ioctl_cmd;
685 	int device_id;
686 	int inputparam;
687 	int outputparam;
688 };
689 
690 enum atomisp_focus_hp {
691 	ATOMISP_FOCUS_HP_IN_PROGRESS = (1U << 2),
692 	ATOMISP_FOCUS_HP_COMPLETE    = (2U << 2),
693 	ATOMISP_FOCUS_HP_FAILED      = (3U << 2)
694 };
695 
696 /* Masks */
697 #define ATOMISP_FOCUS_STATUS_MOVING           BIT(0)
698 #define ATOMISP_FOCUS_STATUS_ACCEPTS_NEW_MOVE BIT(1)
699 #define ATOMISP_FOCUS_STATUS_HOME_POSITION    (3U << 2)
700 
701 enum atomisp_camera_port {
702 	ATOMISP_CAMERA_PORT_SECONDARY,
703 	ATOMISP_CAMERA_PORT_PRIMARY,
704 	ATOMISP_CAMERA_PORT_TERTIARY,
705 	ATOMISP_CAMERA_NR_PORTS
706 };
707 
708 /* Flash modes. Default is off.
709  * Setting a flash to TORCH or INDICATOR mode will automatically
710  * turn it on. Setting it to FLASH mode will not turn on the flash
711  * until the FLASH_STROBE command is sent. */
712 enum atomisp_flash_mode {
713 	ATOMISP_FLASH_MODE_OFF,
714 	ATOMISP_FLASH_MODE_FLASH,
715 	ATOMISP_FLASH_MODE_TORCH,
716 	ATOMISP_FLASH_MODE_INDICATOR,
717 };
718 
719 /* Flash statuses, used by atomisp driver to check before starting
720  * flash and after having started flash. */
721 enum atomisp_flash_status {
722 	ATOMISP_FLASH_STATUS_OK,
723 	ATOMISP_FLASH_STATUS_HW_ERROR,
724 	ATOMISP_FLASH_STATUS_INTERRUPTED,
725 	ATOMISP_FLASH_STATUS_TIMEOUT,
726 };
727 
728 /* Frame status. This is used to detect corrupted frames and flash
729  * exposed frames. Usually, the first 2 frames coming out of the sensor
730  * are corrupted. When using flash, the frame before and the frame after
731  * the flash exposed frame may be partially exposed by flash. The ISP
732  * statistics for these frames should not be used by the 3A library.
733  * The frame status value can be found in the "reserved" field in the
734  * v4l2_buffer struct. */
735 enum atomisp_frame_status {
736 	ATOMISP_FRAME_STATUS_OK,
737 	ATOMISP_FRAME_STATUS_CORRUPTED,
738 	ATOMISP_FRAME_STATUS_FLASH_EXPOSED,
739 	ATOMISP_FRAME_STATUS_FLASH_PARTIAL,
740 	ATOMISP_FRAME_STATUS_FLASH_FAILED,
741 };
742 
743 enum atomisp_acc_type {
744 	ATOMISP_ACC_STANDALONE,	/* Stand-alone acceleration */
745 	ATOMISP_ACC_OUTPUT,	/* Accelerator stage on output frame */
746 	ATOMISP_ACC_VIEWFINDER	/* Accelerator stage on viewfinder frame */
747 };
748 
749 enum atomisp_acc_arg_type {
750 	ATOMISP_ACC_ARG_SCALAR_IN,    /* Scalar input argument */
751 	ATOMISP_ACC_ARG_SCALAR_OUT,   /* Scalar output argument */
752 	ATOMISP_ACC_ARG_SCALAR_IO,    /* Scalar in/output argument */
753 	ATOMISP_ACC_ARG_PTR_IN,	     /* Pointer input argument */
754 	ATOMISP_ACC_ARG_PTR_OUT,	     /* Pointer output argument */
755 	ATOMISP_ACC_ARG_PTR_IO,	     /* Pointer in/output argument */
756 	ATOMISP_ARG_PTR_NOFLUSH,  /* Pointer argument will not be flushed */
757 	ATOMISP_ARG_PTR_STABLE,   /* Pointer input argument that is stable */
758 	ATOMISP_ACC_ARG_FRAME	     /* Frame argument */
759 };
760 
761 /* ISP memories, isp2400 */
762 enum atomisp_acc_memory {
763 	ATOMISP_ACC_MEMORY_PMEM0 = 0,
764 	ATOMISP_ACC_MEMORY_DMEM0,
765 	/* for backward compatibility */
766 	ATOMISP_ACC_MEMORY_DMEM = ATOMISP_ACC_MEMORY_DMEM0,
767 	ATOMISP_ACC_MEMORY_VMEM0,
768 	ATOMISP_ACC_MEMORY_VAMEM0,
769 	ATOMISP_ACC_MEMORY_VAMEM1,
770 	ATOMISP_ACC_MEMORY_VAMEM2,
771 	ATOMISP_ACC_MEMORY_HMEM0,
772 	ATOMISP_ACC_NR_MEMORY
773 };
774 
775 enum atomisp_ext_isp_id {
776 	EXT_ISP_CID_ISO = 0,
777 	EXT_ISP_CID_CAPTURE_HDR,
778 	EXT_ISP_CID_CAPTURE_LLS,
779 	EXT_ISP_CID_FOCUS_MODE,
780 	EXT_ISP_CID_FOCUS_EXECUTION,
781 	EXT_ISP_CID_TOUCH_POSX,
782 	EXT_ISP_CID_TOUCH_POSY,
783 	EXT_ISP_CID_CAF_STATUS,
784 	EXT_ISP_CID_AF_STATUS,
785 	EXT_ISP_CID_GET_AF_MODE,
786 	EXT_ISP_CID_CAPTURE_BURST,
787 	EXT_ISP_CID_FLASH_MODE,
788 	EXT_ISP_CID_ZOOM,
789 	EXT_ISP_CID_SHOT_MODE
790 };
791 
792 #define EXT_ISP_FOCUS_MODE_NORMAL	0
793 #define EXT_ISP_FOCUS_MODE_MACRO	1
794 #define EXT_ISP_FOCUS_MODE_TOUCH_AF	2
795 #define EXT_ISP_FOCUS_MODE_PREVIEW_CAF	3
796 #define EXT_ISP_FOCUS_MODE_MOVIE_CAF	4
797 #define EXT_ISP_FOCUS_MODE_FACE_CAF	5
798 #define EXT_ISP_FOCUS_MODE_TOUCH_MACRO	6
799 #define EXT_ISP_FOCUS_MODE_TOUCH_CAF	7
800 
801 #define EXT_ISP_FOCUS_STOP		0
802 #define EXT_ISP_FOCUS_SEARCH		1
803 #define EXT_ISP_PAN_FOCUSING		2
804 
805 #define EXT_ISP_CAF_RESTART_CHECK	1
806 #define EXT_ISP_CAF_STATUS_FOCUSING	2
807 #define EXT_ISP_CAF_STATUS_SUCCESS	3
808 #define EXT_ISP_CAF_STATUS_FAIL         4
809 
810 #define EXT_ISP_AF_STATUS_INVALID	1
811 #define EXT_ISP_AF_STATUS_FOCUSING	2
812 #define EXT_ISP_AF_STATUS_SUCCESS	3
813 #define EXT_ISP_AF_STATUS_FAIL		4
814 
815 enum atomisp_burst_capture_options {
816 	EXT_ISP_BURST_CAPTURE_CTRL_START = 0,
817 	EXT_ISP_BURST_CAPTURE_CTRL_STOP
818 };
819 
820 #define EXT_ISP_FLASH_MODE_OFF		0
821 #define EXT_ISP_FLASH_MODE_ON		1
822 #define EXT_ISP_FLASH_MODE_AUTO		2
823 #define EXT_ISP_LED_TORCH_OFF		3
824 #define EXT_ISP_LED_TORCH_ON		4
825 
826 #define EXT_ISP_SHOT_MODE_AUTO		0
827 #define EXT_ISP_SHOT_MODE_BEAUTY_FACE	1
828 #define EXT_ISP_SHOT_MODE_BEST_PHOTO	2
829 #define EXT_ISP_SHOT_MODE_DRAMA		3
830 #define EXT_ISP_SHOT_MODE_BEST_FACE	4
831 #define EXT_ISP_SHOT_MODE_ERASER	5
832 #define EXT_ISP_SHOT_MODE_PANORAMA	6
833 #define EXT_ISP_SHOT_MODE_RICH_TONE_HDR	7
834 #define EXT_ISP_SHOT_MODE_NIGHT		8
835 #define EXT_ISP_SHOT_MODE_SOUND_SHOT	9
836 #define EXT_ISP_SHOT_MODE_ANIMATED_PHOTO	10
837 #define EXT_ISP_SHOT_MODE_SPORTS	11
838 
839 struct atomisp_sp_arg {
840 	enum atomisp_acc_arg_type type;	/* Type  of SP argument */
841 	void                    *value;	/* Value of SP argument */
842 	unsigned int             size;	/* Size  of SP argument */
843 };
844 
845 /* Acceleration API */
846 
847 /* For CSS 1.0 only */
848 struct atomisp_acc_fw_arg {
849 	unsigned int fw_handle;
850 	unsigned int index;
851 	void __user *value;
852 	size_t size;
853 };
854 
855 /*
856  * Set arguments after first mapping with ATOMISP_IOC_ACC_S_MAPPED_ARG.
857  */
858 struct atomisp_acc_s_mapped_arg {
859 	unsigned int fw_handle;
860 	__u32 memory;			/* one of enum atomisp_acc_memory */
861 	size_t length;
862 	unsigned long css_ptr;
863 };
864 
865 struct atomisp_acc_fw_abort {
866 	unsigned int fw_handle;
867 	/* Timeout in us */
868 	unsigned int timeout;
869 };
870 
871 struct atomisp_acc_fw_load {
872 	unsigned int size;
873 	unsigned int fw_handle;
874 	void __user *data;
875 };
876 
877 /*
878  * Load firmware to specified pipeline.
879  */
880 struct atomisp_acc_fw_load_to_pipe {
881 	__u32 flags;			/* Flags, see below for valid values */
882 	unsigned int fw_handle;		/* Handle, filled by kernel. */
883 	__u32 size;			/* Firmware binary size */
884 	void __user *data;		/* Pointer to firmware */
885 	__u32 type;			/* Binary type */
886 	__u32 reserved[3];		/* Set to zero */
887 };
888 
889 /*
890  * Set Senor run mode
891  */
892 struct atomisp_s_runmode {
893 	__u32 mode;
894 };
895 
896 #define ATOMISP_ACC_FW_LOAD_FL_PREVIEW		BIT(0)
897 #define ATOMISP_ACC_FW_LOAD_FL_COPY		BIT(1)
898 #define ATOMISP_ACC_FW_LOAD_FL_VIDEO		BIT(2)
899 #define ATOMISP_ACC_FW_LOAD_FL_CAPTURE		BIT(3)
900 #define ATOMISP_ACC_FW_LOAD_FL_ACC		BIT(4)
901 #define ATOMISP_ACC_FW_LOAD_FL_ENABLE		BIT(16)
902 
903 #define ATOMISP_ACC_FW_LOAD_TYPE_NONE		0 /* Normal binary: don't use */
904 #define ATOMISP_ACC_FW_LOAD_TYPE_OUTPUT		1 /* Stage on output */
905 #define ATOMISP_ACC_FW_LOAD_TYPE_VIEWFINDER	2 /* Stage on viewfinder */
906 #define ATOMISP_ACC_FW_LOAD_TYPE_STANDALONE	3 /* Stand-alone acceleration */
907 
908 struct atomisp_acc_map {
909 	__u32 flags;			/* Flags, see list below */
910 	__u32 length;			/* Length of data in bytes */
911 	void __user *user_ptr;		/* Pointer into user space */
912 	unsigned long css_ptr;		/* Pointer into CSS address space */
913 	__u32 reserved[4];		/* Set to zero */
914 };
915 
916 #define ATOMISP_MAP_FLAG_NOFLUSH	0x0001	/* Do not flush cache */
917 #define ATOMISP_MAP_FLAG_CACHED		0x0002	/* Enable cache */
918 #define ATOMISP_MAP_FLAG_CONTIGUOUS	0x0004
919 #define ATOMISP_MAP_FLAG_CLEARED	0x0008
920 
921 struct atomisp_acc_state {
922 	__u32 flags;			/* Flags, see list below */
923 #define ATOMISP_STATE_FLAG_ENABLE	ATOMISP_ACC_FW_LOAD_FL_ENABLE
924 	unsigned int fw_handle;
925 };
926 
927 struct atomisp_update_exposure {
928 	unsigned int gain;
929 	unsigned int digi_gain;
930 	unsigned int update_gain;
931 	unsigned int update_digi_gain;
932 };
933 
934 /*
935  * V4L2 private internal data interface.
936  * -----------------------------------------------------------------------------
937  * struct v4l2_private_int_data - request private data stored in video device
938  * internal memory.
939  * @size: sanity check to ensure userspace's buffer fits whole private data.
940  *	  If not, kernel will make partial copy (or nothing if @size == 0).
941  *	  @size is always corrected for the minimum necessary if IOCTL returns
942  *	  no error.
943  * @data: pointer to userspace buffer.
944  */
945 struct v4l2_private_int_data {
946 	__u32 size;
947 	void __user *data;
948 	__u32 reserved[2];
949 };
950 
951 enum atomisp_sensor_ae_bracketing_mode {
952 	SENSOR_AE_BRACKETING_MODE_OFF = 0,
953 	SENSOR_AE_BRACKETING_MODE_SINGLE, /* back to SW standby after bracketing */
954 	SENSOR_AE_BRACKETING_MODE_SINGLE_TO_STREAMING, /* back to normal streaming after bracketing */
955 	SENSOR_AE_BRACKETING_MODE_LOOP, /* continue AE bracketing in loop mode */
956 };
957 
958 struct atomisp_sensor_ae_bracketing_info {
959 	unsigned int modes; /* bit mask to indicate supported modes  */
960 	unsigned int lut_depth;
961 };
962 
963 struct atomisp_sensor_ae_bracketing_lut_entry {
964 	__u16 coarse_integration_time;
965 	__u16 analog_gain;
966 	__u16 digital_gain;
967 };
968 
969 struct atomisp_sensor_ae_bracketing_lut {
970 	struct atomisp_sensor_ae_bracketing_lut_entry *lut;
971 	unsigned int lut_size;
972 };
973 
974 /*Private IOCTLs for ISP */
975 #define ATOMISP_IOC_G_XNR \
976 	_IOR('v', BASE_VIDIOC_PRIVATE + 0, int)
977 #define ATOMISP_IOC_S_XNR \
978 	_IOW('v', BASE_VIDIOC_PRIVATE + 0, int)
979 #define ATOMISP_IOC_G_NR \
980 	_IOR('v', BASE_VIDIOC_PRIVATE + 1, struct atomisp_nr_config)
981 #define ATOMISP_IOC_S_NR \
982 	_IOW('v', BASE_VIDIOC_PRIVATE + 1, struct atomisp_nr_config)
983 #define ATOMISP_IOC_G_TNR \
984 	_IOR('v', BASE_VIDIOC_PRIVATE + 2, struct atomisp_tnr_config)
985 #define ATOMISP_IOC_S_TNR \
986 	_IOW('v', BASE_VIDIOC_PRIVATE + 2, struct atomisp_tnr_config)
987 #define ATOMISP_IOC_G_HISTOGRAM \
988 	_IOWR('v', BASE_VIDIOC_PRIVATE + 3, struct atomisp_histogram)
989 #define ATOMISP_IOC_S_HISTOGRAM \
990 	_IOW('v', BASE_VIDIOC_PRIVATE + 3, struct atomisp_histogram)
991 #define ATOMISP_IOC_G_BLACK_LEVEL_COMP \
992 	_IOR('v', BASE_VIDIOC_PRIVATE + 4, struct atomisp_ob_config)
993 #define ATOMISP_IOC_S_BLACK_LEVEL_COMP \
994 	_IOW('v', BASE_VIDIOC_PRIVATE + 4, struct atomisp_ob_config)
995 #define ATOMISP_IOC_G_EE \
996 	_IOR('v', BASE_VIDIOC_PRIVATE + 5, struct atomisp_ee_config)
997 #define ATOMISP_IOC_S_EE \
998 	_IOW('v', BASE_VIDIOC_PRIVATE + 5, struct atomisp_ee_config)
999 /* Digital Image Stabilization:
1000  * 1. get dis statistics: reads DIS statistics from ISP (every frame)
1001  * 2. set dis coefficients: set DIS filter coefficients (one time)
1002  * 3. set dis motion vecotr: set motion vector (result of DIS, every frame)
1003  */
1004 #define ATOMISP_IOC_G_DIS_STAT \
1005 	_IOWR('v', BASE_VIDIOC_PRIVATE + 6, struct atomisp_dis_statistics)
1006 
1007 #define ATOMISP_IOC_G_DVS2_BQ_RESOLUTIONS \
1008 	_IOR('v', BASE_VIDIOC_PRIVATE + 6, struct atomisp_dvs2_bq_resolutions)
1009 
1010 #define ATOMISP_IOC_S_DIS_COEFS \
1011 	_IOW('v', BASE_VIDIOC_PRIVATE + 6, struct atomisp_dis_coefficients)
1012 
1013 #define ATOMISP_IOC_S_DIS_VECTOR \
1014 	_IOW('v', BASE_VIDIOC_PRIVATE + 6, struct atomisp_dvs_6axis_config)
1015 
1016 #define ATOMISP_IOC_G_3A_STAT \
1017 	_IOWR('v', BASE_VIDIOC_PRIVATE + 7, struct atomisp_3a_statistics)
1018 #define ATOMISP_IOC_G_ISP_PARM \
1019 	_IOR('v', BASE_VIDIOC_PRIVATE + 8, struct atomisp_parm)
1020 #define ATOMISP_IOC_S_ISP_PARM \
1021 	_IOW('v', BASE_VIDIOC_PRIVATE + 8, struct atomisp_parm)
1022 #define ATOMISP_IOC_G_ISP_GAMMA \
1023 	_IOR('v', BASE_VIDIOC_PRIVATE + 9, struct atomisp_gamma_table)
1024 #define ATOMISP_IOC_S_ISP_GAMMA \
1025 	_IOW('v', BASE_VIDIOC_PRIVATE + 9, struct atomisp_gamma_table)
1026 #define ATOMISP_IOC_G_ISP_GDC_TAB \
1027 	_IOR('v', BASE_VIDIOC_PRIVATE + 10, struct atomisp_morph_table)
1028 #define ATOMISP_IOC_S_ISP_GDC_TAB \
1029 	_IOW('v', BASE_VIDIOC_PRIVATE + 10, struct atomisp_morph_table)
1030 #define ATOMISP_IOC_ISP_MAKERNOTE \
1031 	_IOWR('v', BASE_VIDIOC_PRIVATE + 11, struct atomisp_makernote_info)
1032 
1033 /* macc parameter control*/
1034 #define ATOMISP_IOC_G_ISP_MACC \
1035 	_IOR('v', BASE_VIDIOC_PRIVATE + 12, struct atomisp_macc_config)
1036 #define ATOMISP_IOC_S_ISP_MACC \
1037 	_IOW('v', BASE_VIDIOC_PRIVATE + 12, struct atomisp_macc_config)
1038 
1039 /* Defect pixel detection & Correction */
1040 #define ATOMISP_IOC_G_ISP_BAD_PIXEL_DETECTION \
1041 	_IOR('v', BASE_VIDIOC_PRIVATE + 13, struct atomisp_dp_config)
1042 #define ATOMISP_IOC_S_ISP_BAD_PIXEL_DETECTION \
1043 	_IOW('v', BASE_VIDIOC_PRIVATE + 13, struct atomisp_dp_config)
1044 
1045 /* False Color Correction */
1046 #define ATOMISP_IOC_G_ISP_FALSE_COLOR_CORRECTION \
1047 	_IOR('v', BASE_VIDIOC_PRIVATE + 14, struct atomisp_de_config)
1048 #define ATOMISP_IOC_S_ISP_FALSE_COLOR_CORRECTION \
1049 	_IOW('v', BASE_VIDIOC_PRIVATE + 14, struct atomisp_de_config)
1050 
1051 /* ctc parameter control */
1052 #define ATOMISP_IOC_G_ISP_CTC \
1053 	_IOR('v', BASE_VIDIOC_PRIVATE + 15, struct atomisp_ctc_table)
1054 #define ATOMISP_IOC_S_ISP_CTC \
1055 	_IOW('v', BASE_VIDIOC_PRIVATE + 15, struct atomisp_ctc_table)
1056 
1057 /* white balance Correction */
1058 #define ATOMISP_IOC_G_ISP_WHITE_BALANCE \
1059 	_IOR('v', BASE_VIDIOC_PRIVATE + 16, struct atomisp_wb_config)
1060 #define ATOMISP_IOC_S_ISP_WHITE_BALANCE \
1061 	_IOW('v', BASE_VIDIOC_PRIVATE + 16, struct atomisp_wb_config)
1062 
1063 /* fpn table loading */
1064 #define ATOMISP_IOC_S_ISP_FPN_TABLE \
1065 	_IOW('v', BASE_VIDIOC_PRIVATE + 17, struct v4l2_framebuffer)
1066 
1067 /* overlay image loading */
1068 #define ATOMISP_IOC_G_ISP_OVERLAY \
1069 	_IOWR('v', BASE_VIDIOC_PRIVATE + 18, struct atomisp_overlay)
1070 #define ATOMISP_IOC_S_ISP_OVERLAY \
1071 	_IOW('v', BASE_VIDIOC_PRIVATE + 18, struct atomisp_overlay)
1072 
1073 /* bcd driver bridge */
1074 #define ATOMISP_IOC_CAMERA_BRIDGE \
1075 	_IOWR('v', BASE_VIDIOC_PRIVATE + 19, struct atomisp_bc_video_package)
1076 
1077 /* Sensor resolution specific info for AE */
1078 #define ATOMISP_IOC_G_SENSOR_MODE_DATA \
1079 	_IOR('v', BASE_VIDIOC_PRIVATE + 20, struct atomisp_sensor_mode_data)
1080 
1081 #define ATOMISP_IOC_S_EXPOSURE \
1082 	_IOW('v', BASE_VIDIOC_PRIVATE + 21, struct atomisp_exposure)
1083 
1084 /* sensor calibration registers group */
1085 #define ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP \
1086 	_IOWR('v', BASE_VIDIOC_PRIVATE + 22, struct atomisp_calibration_group)
1087 
1088 /* white balance Correction */
1089 #define ATOMISP_IOC_G_3A_CONFIG \
1090 	_IOR('v', BASE_VIDIOC_PRIVATE + 23, struct atomisp_3a_config)
1091 #define ATOMISP_IOC_S_3A_CONFIG \
1092 	_IOW('v', BASE_VIDIOC_PRIVATE + 23, struct atomisp_3a_config)
1093 
1094 /* Accelerate ioctls */
1095 #define ATOMISP_IOC_ACC_LOAD \
1096 	_IOWR('v', BASE_VIDIOC_PRIVATE + 24, struct atomisp_acc_fw_load)
1097 
1098 #define ATOMISP_IOC_ACC_UNLOAD \
1099 	_IOWR('v', BASE_VIDIOC_PRIVATE + 24, unsigned int)
1100 
1101 /* For CSS 1.0 only */
1102 #define ATOMISP_IOC_ACC_S_ARG \
1103 	_IOW('v', BASE_VIDIOC_PRIVATE + 24, struct atomisp_acc_fw_arg)
1104 
1105 #define ATOMISP_IOC_ACC_START \
1106 	_IOW('v', BASE_VIDIOC_PRIVATE + 24, unsigned int)
1107 
1108 #define ATOMISP_IOC_ACC_WAIT \
1109 	_IOW('v', BASE_VIDIOC_PRIVATE + 25, unsigned int)
1110 
1111 #define ATOMISP_IOC_ACC_ABORT \
1112 	_IOW('v', BASE_VIDIOC_PRIVATE + 25, struct atomisp_acc_fw_abort)
1113 
1114 #define ATOMISP_IOC_ACC_DESTAB \
1115 	_IOW('v', BASE_VIDIOC_PRIVATE + 25, struct atomisp_acc_fw_arg)
1116 
1117 /* sensor OTP memory read */
1118 #define ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA \
1119 	_IOWR('v', BASE_VIDIOC_PRIVATE + 26, struct v4l2_private_int_data)
1120 
1121 /* LCS (shading) table write */
1122 #define ATOMISP_IOC_S_ISP_SHD_TAB \
1123 	_IOWR('v', BASE_VIDIOC_PRIVATE + 27, struct atomisp_shading_table)
1124 
1125 /* Gamma Correction */
1126 #define ATOMISP_IOC_G_ISP_GAMMA_CORRECTION \
1127 	_IOR('v', BASE_VIDIOC_PRIVATE + 28, struct atomisp_gc_config)
1128 
1129 #define ATOMISP_IOC_S_ISP_GAMMA_CORRECTION \
1130 	_IOW('v', BASE_VIDIOC_PRIVATE + 28, struct atomisp_gc_config)
1131 
1132 /* motor internal memory read */
1133 #define ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA \
1134 	_IOWR('v', BASE_VIDIOC_PRIVATE + 29, struct v4l2_private_int_data)
1135 
1136 /*
1137  * Ioctls to map and unmap user buffers to CSS address space for acceleration.
1138  * User fills fields length and user_ptr and sets other fields to zero,
1139  * kernel may modify the flags and sets css_ptr.
1140  */
1141 #define ATOMISP_IOC_ACC_MAP \
1142 	_IOWR('v', BASE_VIDIOC_PRIVATE + 30, struct atomisp_acc_map)
1143 
1144 /* User fills fields length, user_ptr, and css_ptr and zeroes other fields. */
1145 #define ATOMISP_IOC_ACC_UNMAP \
1146 	_IOW('v', BASE_VIDIOC_PRIVATE + 30, struct atomisp_acc_map)
1147 
1148 #define ATOMISP_IOC_ACC_S_MAPPED_ARG \
1149 	_IOW('v', BASE_VIDIOC_PRIVATE + 30, struct atomisp_acc_s_mapped_arg)
1150 
1151 #define ATOMISP_IOC_ACC_LOAD_TO_PIPE \
1152 	_IOWR('v', BASE_VIDIOC_PRIVATE + 31, struct atomisp_acc_fw_load_to_pipe)
1153 
1154 #define ATOMISP_IOC_S_PARAMETERS \
1155 	_IOW('v', BASE_VIDIOC_PRIVATE + 32, struct atomisp_parameters)
1156 
1157 #define ATOMISP_IOC_S_CONT_CAPTURE_CONFIG \
1158 	_IOWR('v', BASE_VIDIOC_PRIVATE + 33, struct atomisp_cont_capture_conf)
1159 
1160 #define ATOMISP_IOC_G_METADATA \
1161 	_IOWR('v', BASE_VIDIOC_PRIVATE + 34, struct atomisp_metadata)
1162 
1163 #define ATOMISP_IOC_G_METADATA_BY_TYPE \
1164 	_IOWR('v', BASE_VIDIOC_PRIVATE + 34, struct atomisp_metadata_with_type)
1165 
1166 #define ATOMISP_IOC_EXT_ISP_CTRL \
1167 	_IOWR('v', BASE_VIDIOC_PRIVATE + 35, struct atomisp_ext_isp_ctrl)
1168 
1169 #define ATOMISP_IOC_EXP_ID_UNLOCK \
1170 	_IOW('v', BASE_VIDIOC_PRIVATE + 36, int)
1171 
1172 #define ATOMISP_IOC_EXP_ID_CAPTURE \
1173 	_IOW('v', BASE_VIDIOC_PRIVATE + 37, int)
1174 
1175 #define ATOMISP_IOC_S_ENABLE_DZ_CAPT_PIPE \
1176 	_IOWR('v', BASE_VIDIOC_PRIVATE + 38, unsigned int)
1177 
1178 #define ATOMISP_IOC_G_FORMATS_CONFIG \
1179 	_IOR('v', BASE_VIDIOC_PRIVATE + 39, struct atomisp_formats_config)
1180 
1181 #define ATOMISP_IOC_S_FORMATS_CONFIG \
1182 	_IOW('v', BASE_VIDIOC_PRIVATE + 39, struct atomisp_formats_config)
1183 
1184 #define ATOMISP_IOC_S_EXPOSURE_WINDOW \
1185 	_IOW('v', BASE_VIDIOC_PRIVATE + 40, struct atomisp_ae_window)
1186 
1187 #define ATOMISP_IOC_S_ACC_STATE \
1188 	_IOW('v', BASE_VIDIOC_PRIVATE + 41, struct atomisp_acc_state)
1189 
1190 #define ATOMISP_IOC_G_ACC_STATE \
1191 	_IOR('v', BASE_VIDIOC_PRIVATE + 41, struct atomisp_acc_state)
1192 
1193 #define ATOMISP_IOC_INJECT_A_FAKE_EVENT \
1194 	_IOW('v', BASE_VIDIOC_PRIVATE + 42, int)
1195 
1196 #define ATOMISP_IOC_G_SENSOR_AE_BRACKETING_INFO \
1197 	_IOR('v', BASE_VIDIOC_PRIVATE + 43, struct atomisp_sensor_ae_bracketing_info)
1198 
1199 #define ATOMISP_IOC_S_SENSOR_AE_BRACKETING_MODE \
1200 	_IOW('v', BASE_VIDIOC_PRIVATE + 43, unsigned int)
1201 
1202 #define ATOMISP_IOC_G_SENSOR_AE_BRACKETING_MODE \
1203 	_IOR('v', BASE_VIDIOC_PRIVATE + 43, unsigned int)
1204 
1205 #define ATOMISP_IOC_S_SENSOR_AE_BRACKETING_LUT \
1206 	_IOW('v', BASE_VIDIOC_PRIVATE + 43, struct atomisp_sensor_ae_bracketing_lut)
1207 
1208 #define ATOMISP_IOC_G_INVALID_FRAME_NUM \
1209 	_IOR('v', BASE_VIDIOC_PRIVATE + 44, unsigned int)
1210 
1211 #define ATOMISP_IOC_S_ARRAY_RESOLUTION \
1212 	_IOW('v', BASE_VIDIOC_PRIVATE + 45, struct atomisp_resolution)
1213 
1214 /* for depth mode sensor frame sync compensation */
1215 #define ATOMISP_IOC_G_DEPTH_SYNC_COMP \
1216 	_IOR('v', BASE_VIDIOC_PRIVATE + 46, unsigned int)
1217 
1218 #define ATOMISP_IOC_S_SENSOR_EE_CONFIG \
1219 	_IOW('v', BASE_VIDIOC_PRIVATE + 47, unsigned int)
1220 
1221 #define ATOMISP_IOC_S_SENSOR_RUNMODE \
1222 	_IOW('v', BASE_VIDIOC_PRIVATE + 48, struct atomisp_s_runmode)
1223 
1224 #define ATOMISP_IOC_G_UPDATE_EXPOSURE \
1225 	_IOWR('v', BASE_VIDIOC_PRIVATE + 49, struct atomisp_update_exposure)
1226 
1227 /*
1228  * Reserved ioctls. We have customer implementing it internally.
1229  * We can't use both numbers to not cause ABI conflict.
1230  * Anyway, those ioctls are hacks and not implemented by us:
1231  *
1232  * #define ATOMISP_IOC_G_SENSOR_REG \
1233  *	_IOW('v', BASE_VIDIOC_PRIVATE + 55, struct atomisp_sensor_regs)
1234  * #define ATOMISP_IOC_S_SENSOR_REG \
1235  *	_IOW('v', BASE_VIDIOC_PRIVATE + 56, struct atomisp_sensor_regs)
1236  */
1237 
1238 /*  ISP Private control IDs */
1239 #define V4L2_CID_ATOMISP_BAD_PIXEL_DETECTION \
1240 	(V4L2_CID_PRIVATE_BASE + 0)
1241 #define V4L2_CID_ATOMISP_POSTPROCESS_GDC_CAC \
1242 	(V4L2_CID_PRIVATE_BASE + 1)
1243 #define V4L2_CID_ATOMISP_VIDEO_STABLIZATION \
1244 	(V4L2_CID_PRIVATE_BASE + 2)
1245 #define V4L2_CID_ATOMISP_FIXED_PATTERN_NR \
1246 	(V4L2_CID_PRIVATE_BASE + 3)
1247 #define V4L2_CID_ATOMISP_FALSE_COLOR_CORRECTION \
1248 	(V4L2_CID_PRIVATE_BASE + 4)
1249 #define V4L2_CID_ATOMISP_LOW_LIGHT \
1250 	(V4L2_CID_PRIVATE_BASE + 5)
1251 
1252 /* Camera class:
1253  * Exposure, Flash and privacy (indicator) light controls, to be upstreamed */
1254 #define V4L2_CID_CAMERA_LASTP1             (V4L2_CID_CAMERA_CLASS_BASE + 1024)
1255 
1256 #define V4L2_CID_FOCAL_ABSOLUTE            (V4L2_CID_CAMERA_LASTP1 + 0)
1257 #define V4L2_CID_FNUMBER_ABSOLUTE          (V4L2_CID_CAMERA_LASTP1 + 1)
1258 #define V4L2_CID_FNUMBER_RANGE             (V4L2_CID_CAMERA_LASTP1 + 2)
1259 
1260 /* Flash related CIDs, see also:
1261  * http://linuxtv.org/downloads/v4l-dvb-apis/extended-controls.html\
1262  * #flash-controls */
1263 
1264 /* Request a number of flash-exposed frames. The frame status can be
1265  * found in the reserved field in the v4l2_buffer struct. */
1266 #define V4L2_CID_REQUEST_FLASH             (V4L2_CID_CAMERA_LASTP1 + 3)
1267 /* Query flash driver status. See enum atomisp_flash_status above. */
1268 #define V4L2_CID_FLASH_STATUS              (V4L2_CID_CAMERA_LASTP1 + 5)
1269 /* Set the flash mode (see enum atomisp_flash_mode) */
1270 #define V4L2_CID_FLASH_MODE                (V4L2_CID_CAMERA_LASTP1 + 10)
1271 
1272 /* VCM slew control */
1273 #define V4L2_CID_VCM_SLEW                  (V4L2_CID_CAMERA_LASTP1 + 11)
1274 /* VCM step time */
1275 #define V4L2_CID_VCM_TIMING                (V4L2_CID_CAMERA_LASTP1 + 12)
1276 
1277 /* Query Focus Status */
1278 #define V4L2_CID_FOCUS_STATUS              (V4L2_CID_CAMERA_LASTP1 + 14)
1279 
1280 /* Query sensor's binning factor */
1281 #define V4L2_CID_BIN_FACTOR_HORZ	   (V4L2_CID_CAMERA_LASTP1 + 15)
1282 #define V4L2_CID_BIN_FACTOR_VERT	   (V4L2_CID_CAMERA_LASTP1 + 16)
1283 
1284 /* number of frames to skip at stream start */
1285 #define V4L2_CID_G_SKIP_FRAMES		   (V4L2_CID_CAMERA_LASTP1 + 17)
1286 
1287 /* Query sensor's 2A status */
1288 #define V4L2_CID_2A_STATUS                 (V4L2_CID_CAMERA_LASTP1 + 18)
1289 #define V4L2_2A_STATUS_AE_READY            BIT(0)
1290 #define V4L2_2A_STATUS_AWB_READY           BIT(1)
1291 
1292 #define V4L2_CID_FMT_AUTO			(V4L2_CID_CAMERA_LASTP1 + 19)
1293 
1294 #define V4L2_CID_RUN_MODE			(V4L2_CID_CAMERA_LASTP1 + 20)
1295 #define ATOMISP_RUN_MODE_VIDEO			1
1296 #define ATOMISP_RUN_MODE_STILL_CAPTURE		2
1297 #define ATOMISP_RUN_MODE_CONTINUOUS_CAPTURE	3
1298 #define ATOMISP_RUN_MODE_PREVIEW		4
1299 #define ATOMISP_RUN_MODE_SDV			5
1300 
1301 #define V4L2_CID_ENABLE_VFPP			(V4L2_CID_CAMERA_LASTP1 + 21)
1302 #define V4L2_CID_ATOMISP_CONTINUOUS_MODE	(V4L2_CID_CAMERA_LASTP1 + 22)
1303 #define V4L2_CID_ATOMISP_CONTINUOUS_RAW_BUFFER_SIZE \
1304 						(V4L2_CID_CAMERA_LASTP1 + 23)
1305 #define V4L2_CID_ATOMISP_CONTINUOUS_VIEWFINDER \
1306 						(V4L2_CID_CAMERA_LASTP1 + 24)
1307 
1308 #define V4L2_CID_VFPP				(V4L2_CID_CAMERA_LASTP1 + 25)
1309 #define ATOMISP_VFPP_ENABLE			0
1310 #define ATOMISP_VFPP_DISABLE_SCALER		1
1311 #define ATOMISP_VFPP_DISABLE_LOWLAT		2
1312 
1313 /* Query real flash status register value */
1314 #define V4L2_CID_FLASH_STATUS_REGISTER  (V4L2_CID_CAMERA_LASTP1 + 26)
1315 
1316 #define V4L2_CID_START_ZSL_CAPTURE	(V4L2_CID_CAMERA_LASTP1 + 28)
1317 /* Lock and unlock raw buffer */
1318 #define V4L2_CID_ENABLE_RAW_BUFFER_LOCK (V4L2_CID_CAMERA_LASTP1 + 29)
1319 
1320 #define V4L2_CID_DEPTH_MODE		(V4L2_CID_CAMERA_LASTP1 + 30)
1321 
1322 #define V4L2_CID_EXPOSURE_ZONE_NUM	(V4L2_CID_CAMERA_LASTP1 + 31)
1323 /* Disable digital zoom */
1324 #define V4L2_CID_DISABLE_DZ		(V4L2_CID_CAMERA_LASTP1 + 32)
1325 
1326 #define V4L2_CID_TEST_PATTERN_COLOR_R	(V4L2_CID_CAMERA_LASTP1 + 33)
1327 #define V4L2_CID_TEST_PATTERN_COLOR_GR	(V4L2_CID_CAMERA_LASTP1 + 34)
1328 #define V4L2_CID_TEST_PATTERN_COLOR_GB	(V4L2_CID_CAMERA_LASTP1 + 35)
1329 #define V4L2_CID_TEST_PATTERN_COLOR_B	(V4L2_CID_CAMERA_LASTP1 + 36)
1330 
1331 #define V4L2_CID_ATOMISP_SELECT_ISP_VERSION	(V4L2_CID_CAMERA_LASTP1 + 38)
1332 
1333 #define V4L2_BUF_FLAG_BUFFER_INVALID       0x0400
1334 #define V4L2_BUF_FLAG_BUFFER_VALID         0x0800
1335 
1336 #define V4L2_BUF_TYPE_VIDEO_CAPTURE_ION  (V4L2_BUF_TYPE_PRIVATE + 1024)
1337 
1338 #define V4L2_EVENT_ATOMISP_3A_STATS_READY   (V4L2_EVENT_PRIVATE_START + 1)
1339 #define V4L2_EVENT_ATOMISP_METADATA_READY   (V4L2_EVENT_PRIVATE_START + 2)
1340 #define V4L2_EVENT_ATOMISP_RAW_BUFFERS_ALLOC_DONE   (V4L2_EVENT_PRIVATE_START + 3)
1341 #define V4L2_EVENT_ATOMISP_ACC_COMPLETE     (V4L2_EVENT_PRIVATE_START + 4)
1342 #define V4L2_EVENT_ATOMISP_PAUSE_BUFFER	    (V4L2_EVENT_PRIVATE_START + 5)
1343 #define V4L2_EVENT_ATOMISP_CSS_RESET	    (V4L2_EVENT_PRIVATE_START + 6)
1344 /* Nonstandard color effects for V4L2_CID_COLORFX */
1345 enum {
1346 	V4L2_COLORFX_SKIN_WHITEN_LOW = 1001,
1347 	V4L2_COLORFX_SKIN_WHITEN_HIGH = 1002,
1348 	V4L2_COLORFX_WARM = 1003,
1349 	V4L2_COLORFX_COLD = 1004,
1350 	V4L2_COLORFX_WASHED = 1005,
1351 	V4L2_COLORFX_RED = 1006,
1352 	V4L2_COLORFX_GREEN = 1007,
1353 	V4L2_COLORFX_BLUE = 1008,
1354 	V4L2_COLORFX_PINK = 1009,
1355 	V4L2_COLORFX_YELLOW = 1010,
1356 	V4L2_COLORFX_PURPLE = 1011,
1357 };
1358 
1359 #endif /* _ATOM_ISP_H */
1360