linux/drivers/staging/media/atomisp/include/linux/atomisp.h
<<
>>
Prefs
   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 */
  74struct 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 */
  88struct 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 */
  97struct atomisp_histogram {
  98        unsigned int num_elements;
  99        void __user *data;
 100};
 101
 102enum 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 */
 109struct 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 */
 127struct 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
 136struct 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
 147enum atomisp_calibration_type {
 148        calibration_type1,
 149        calibration_type2,
 150        calibration_type3
 151};
 152
 153struct atomisp_calibration_group {
 154        unsigned int size;
 155        unsigned int type;
 156        unsigned short *calb_grp_values;
 157};
 158
 159struct atomisp_gc_config {
 160        __u16 gain_k1;
 161        __u16 gain_k2;
 162};
 163
 164struct 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
 176struct 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
 187struct atomisp_dvs_envelop {
 188        unsigned int width;
 189        unsigned int height;
 190};
 191
 192struct 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
 205struct 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 */
 213struct 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 */
 224struct 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
 231struct 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
 237struct 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
 243struct atomisp_dis_statistics {
 244        struct atomisp_dvs2_statistics dvs2_stat;
 245        u32 exp_id;
 246};
 247
 248struct 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 */
 263enum atomisp_metadata_type {
 264        ATOMISP_MAIN_METADATA = 0,
 265        ATOMISP_SEC_METADATA,
 266        ATOMISP_METADATA_TYPE_NUM,
 267};
 268
 269struct 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
 280struct 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
 289struct atomisp_ext_isp_ctrl {
 290        u32 id;
 291        u32 data;
 292};
 293
 294struct 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
 315struct atomisp_cont_capture_conf {
 316        int num_captures;
 317        unsigned int skip_frames;
 318        int offset;
 319        __u32 reserved[5];
 320};
 321
 322struct 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) */
 331struct 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 */
 340struct 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 */
 347struct atomisp_de_config {
 348        unsigned int pixelnoise;
 349        unsigned int c1_coring_threshold;
 350        unsigned int c2_coring_threshold;
 351};
 352
 353/* Chroma enhancement */
 354struct atomisp_ce_config {
 355        unsigned char uv_level_min;
 356        unsigned char uv_level_max;
 357};
 358
 359/* Defect pixel correction configuration */
 360struct 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 */
 378struct atomisp_xnr_config {
 379        __u16 threshold;
 380};
 381
 382/* metadata config */
 383struct atomisp_metadata_config {
 384        u32 metadata_height;
 385        u32 metadata_stride;
 386};
 387
 388/*
 389 * Generic resolution structure.
 390 */
 391struct atomisp_resolution {
 392        u32 width;  /** Width */
 393        u32 height; /** Height */
 394};
 395
 396/*
 397 * This specifies the coordinates (x,y)
 398 */
 399struct atomisp_zoom_point {
 400        s32 x; /** x coordinate */
 401        s32 y; /** y coordinate */
 402};
 403
 404/*
 405 * This specifies the region
 406 */
 407struct 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
 413struct 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
 419struct 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
 436struct dvs2_bq_resolution {
 437        int width_bq;         /* width [BQ] */
 438        int height_bq;        /* height [BQ] */
 439};
 440
 441struct 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
 454struct 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
 466struct atomisp_formats_config {
 467        u32 video_full_range_flag;
 468};
 469
 470struct 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
 556struct 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
 565struct 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
 577struct 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
 589struct 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
 605struct atomisp_macc_table {
 606        short data[4 * ATOMISP_NUM_MACC_AXES];
 607};
 608
 609struct 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
 616struct atomisp_ctc_table {
 617        unsigned short data[ATOMISP_CTC_TABLE_SIZE];
 618};
 619
 620/* Parameter for overlay image loading */
 621struct 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.*/
 654struct 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
 675struct 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. */
 683struct atomisp_bc_video_package {
 684        int ioctl_cmd;
 685        int device_id;
 686        int inputparam;
 687        int outputparam;
 688};
 689
 690enum 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
 701enum 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. */
 712enum 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. */
 721enum 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. */
 735enum 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
 743enum 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
 749enum 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 */
 762enum 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
 775enum 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
 815enum 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
 839struct 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 */
 848struct 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 */
 858struct 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
 865struct atomisp_acc_fw_abort {
 866        unsigned int fw_handle;
 867        /* Timeout in us */
 868        unsigned int timeout;
 869};
 870
 871struct 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 */
 880struct 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 */
 892struct 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
 908struct 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
 921struct 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
 927struct 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 */
 945struct v4l2_private_int_data {
 946        __u32 size;
 947        void __user *data;
 948        __u32 reserved[2];
 949};
 950
 951enum 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
 958struct atomisp_sensor_ae_bracketing_info {
 959        unsigned int modes; /* bit mask to indicate supported modes  */
 960        unsigned int lut_depth;
 961};
 962
 963struct atomisp_sensor_ae_bracketing_lut_entry {
 964        __u16 coarse_integration_time;
 965        __u16 analog_gain;
 966        __u16 digital_gain;
 967};
 968
 969struct 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 */
1345enum {
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