[PORT FROM R2] atomisp: optimize DVS
authorJozef Kruger <jozef.kruger@intel.com>
Thu, 15 Dec 2011 19:07:06 +0000 (11:07 -0800)
committerbuildbot <buildbot@intel.com>
Thu, 22 Dec 2011 08:03:00 +0000 (00:03 -0800)
BZ: 18089

This patch optimizes the DVS code.

Change-Id: I4e630e5687e47237edb94989d3887417f1f745a2
Orig-Change-Id: Ie3efeda5d26d4a6c4783d7d343607083d0b18bdd
Signed-off-by: Jozef Kruger <jozef.kruger@intel.com>
Reviewed-on: http://android.intel.com:8080/27836
Reviewed-by: Bhat, Sheethal <sheethal.bhat@intel.com>
Reviewed-by: Toivonen, Tuukka <tuukka.toivonen@intel.com>
Reviewed-by: Wang, Wen W <wen.w.wang@intel.com>
Reviewed-by: Cohen, David A <david.a.cohen@intel.com>
Tested-by: Koski, Anttu <anttu.koski@intel.com>
Reviewed-on: http://android.intel.com:8080/29600
Reviewed-by: Lampila, KalleX <kallex.lampila@intel.com>
Reviewed-by: Koski, Anttu <anttu.koski@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/media/video/atomisp/atomisp_cmd.c
drivers/media/video/atomisp/atomisp_cmd.h
drivers/media/video/atomisp/atomisp_ioctl.c
drivers/media/video/atomisp/css/sh_css_binary.c
drivers/media/video/atomisp/css/sh_css_params.c
drivers/media/video/atomisp/css/sh_css_types.h
drivers/media/video/atomisp/include/atomisp/atomisp_internal.h
include/linux/atomisp.h

index 5921e34..8e153ca 100644 (file)
@@ -338,7 +338,6 @@ irqreturn_t atomisp_isr(int irq, void *dev)
                } else {
                        isp->sw_contex.invalid_frame = false;
                }
-
                ret = atomisp_start_binary(isp);
                if (ret)
                        goto no_frame_done;
@@ -536,10 +535,6 @@ static int atomisp_start_binary(struct atomisp_device *isp)
                }
                break;
        case CI_MODE_VIDEO:
-               if (isp->params.video_dis_en) {
-                       sh_css_video_set_dis_vector(isp->params.dis_x,
-                                                   isp->params.dis_y);
-               }
                ret = sh_css_video_start(NULL, isp->regular_output_frame,
                                   isp->vf_frame);
                if (sh_css_success != ret) {
@@ -1746,12 +1741,12 @@ static void atomisp_update_grid_info(struct atomisp_device *isp)
 
                /* DIS projections. */
                isp->params.dis_hor_proj_bytes =
-                               isp->params.curr_grid_info.dis_height *
+                               isp->params.curr_grid_info.dis_aligned_height *
                                SH_CSS_DIS_NUM_COEF_TYPES *
                                sizeof(*isp->params.dis_hor_proj_buf);
 
                isp->params.dis_ver_proj_bytes =
-                               isp->params.curr_grid_info.dis_width *
+                               isp->params.curr_grid_info.dis_aligned_width *
                                SH_CSS_DIS_NUM_COEF_TYPES *
                                sizeof(*isp->params.dis_ver_proj_buf);
 
@@ -1786,14 +1781,18 @@ static void atomisp_curr_user_grid_info(struct atomisp_device *isp,
        info->s3a_height            = isp->params.curr_grid_info.s3a_height;
        info->s3a_bqs_per_grid_cell =
            isp->params.curr_grid_info.s3a_bqs_per_grid_cell;
-       info->dis_width             = isp->params.curr_grid_info.dis_width;
-       info->dis_height            = isp->params.curr_grid_info.dis_height;
+
+       info->dis_width          = isp->params.curr_grid_info.dis_width;
+       info->dis_aligned_width  = isp->params.curr_grid_info.dis_aligned_width;
+       info->dis_height         = isp->params.curr_grid_info.dis_height;
+       info->dis_aligned_height =
+               isp->params.curr_grid_info.dis_aligned_height;
        info->dis_bqs_per_grid_cell =
-           isp->params.curr_grid_info.dis_bqs_per_grid_cell;
+               isp->params.curr_grid_info.dis_bqs_per_grid_cell;
        info->dis_hor_coef_num      =
-           isp->params.curr_grid_info.dis_hor_coef_num;
+               isp->params.curr_grid_info.dis_hor_coef_num;
        info->dis_ver_coef_num      =
-           isp->params.curr_grid_info.dis_ver_coef_num;
+               isp->params.curr_grid_info.dis_ver_coef_num;
 }
 
 /*
@@ -1927,93 +1926,91 @@ int atomisp_macc_table(struct atomisp_device *isp, int flag,
        return 0;
 }
 
-int atomisp_dis_vector(struct atomisp_device *isp,
-                      void *config)
+int atomisp_set_dis_vector(struct atomisp_device *isp,
+                          struct atomisp_dis_vector *vector)
 {
-       struct atomisp_dis_config *arg = (struct atomisp_dis_config *)config;
+       unsigned long irqflags;
+
+       /* Avoid race conditions with ISR */
+       spin_lock_irqsave(&isp->irq_lock, irqflags);
+       sh_css_video_set_dis_vector(vector->x, vector->y);
+       spin_unlock_irqrestore(&isp->irq_lock, irqflags);
 
-       /* The dis parameter is initialized at start_video_capture
-        * in atomisp_work
-        */
-       mutex_lock(&isp->isp_lock);
-       isp->params.dis_x = arg->dis_x;
-       isp->params.dis_y = arg->dis_y;
-       mutex_unlock(&isp->isp_lock);
        return 0;
 }
 
 /*
  * Function to set/get image stablization statistics
  */
-int atomisp_dis_stat(struct atomisp_device *isp, int flag,
-                    void *config)
+int atomisp_get_dis_stat(struct atomisp_device *isp,
+                        struct atomisp_dis_statistics *stats)
 {
        int error;
-       struct atomisp_dis_config *arg = (struct atomisp_dis_config *)config;
+       long left;
 
-       if (flag == 0) {
-               long time_left;
+       if (stats->vertical_projections   == NULL ||
+           stats->horizontal_projections == NULL ||
+           isp->params.dis_hor_proj_buf  == NULL ||
+           isp->params.dis_ver_proj_buf  == NULL)
+               return -EINVAL;
 
-               if (arg->w_sdis_vertproj_tbl == NULL ||
-                   arg->w_sdis_horiproj_tbl == NULL ||
-                   isp->params.dis_hor_proj_buf    == NULL ||
-                   isp->params.dis_ver_proj_buf    == NULL)
-                       return -EINVAL;
+       /* isp needs to be streaming to get DIS statistics */
+       if (!isp->sw_contex.isp_streaming)
+               return -EINVAL;
+       if (!isp->params.video_dis_en)
+               return -EINVAL;
 
-               /* isp need to be streaming to get DIS statistics */
-               if (!isp->sw_contex.isp_streaming)
-                       return -EINVAL;
-               if (!isp->params.video_dis_en)
-                       return -EINVAL;
+       INIT_COMPLETION(isp->dis_state_complete);
 
-               INIT_COMPLETION(isp->dis_state_complete);
+       left = wait_for_completion_timeout(&isp->dis_state_complete, 1 * HZ);
+
+       /* Timeout to get the statistics */
+       if (left == 0) {
+               v4l2_err(&atomisp_dev, "Failed to wait frame DIS state\n");
+               return -EINVAL;
+       }
 
-               time_left =
-                   wait_for_completion_timeout(&isp->dis_state_complete,
-                                               1 * HZ);
+       sh_css_get_dis_projections(isp->params.dis_hor_proj_buf,
+                                  isp->params.dis_ver_proj_buf);
 
-               /* Timeout to get the statistics */
-               if (time_left == 0) {
-                       v4l2_err(&atomisp_dev,
-                                "Failed to wait frame DIS state\n");
-                       return -EINVAL;
-               }
+       error = copy_to_user(stats->vertical_projections,
+                            isp->params.dis_ver_proj_buf,
+                            isp->params.dis_ver_proj_bytes);
+       if (error)
+               return -EFAULT;
 
+       error = copy_to_user(stats->horizontal_projections,
+                            isp->params.dis_hor_proj_buf,
+                            isp->params.dis_hor_proj_bytes);
+       if (error)
+               return -EFAULT;
 
-               sh_css_get_dis_projections(isp->params.dis_hor_proj_buf,
-                                          isp->params.dis_ver_proj_buf);
+       return 0;
+}
 
-               error = copy_to_user(arg->w_sdis_vertproj_tbl,
-                                    isp->params.dis_ver_proj_buf,
-                                    isp->params.dis_ver_proj_bytes);
-               if (error)
-                       return -EFAULT;
+int atomisp_set_dis_coefs(struct atomisp_device *isp,
+                         struct atomisp_dis_coefficients *coefs)
+{
+       int error;
 
-               error = copy_to_user(arg->w_sdis_horiproj_tbl,
-                                    isp->params.dis_hor_proj_buf,
-                                    isp->params.dis_hor_proj_bytes);
-               if (error)
-                       return -EFAULT;
-       } else {
-               if (arg->sdis_vertcoef_tbl == NULL ||
-                   arg->sdis_horicoef_tbl == NULL ||
-                   isp->params.dis_hor_coef_buf  == NULL ||
-                   isp->params.dis_ver_coef_buf  == NULL)
-                       return -EINVAL;
+       if (coefs->horizontal_coefficients == NULL ||
+           coefs->vertical_coefficients   == NULL ||
+           isp->params.dis_hor_coef_buf   == NULL ||
+           isp->params.dis_ver_coef_buf   == NULL)
+               return -EINVAL;
 
-               error = copy_from_user(isp->params.dis_hor_coef_buf,
-                                      (void __user *)arg->sdis_horicoef_tbl,
-                                      isp->params.dis_hor_coef_bytes);
-               if (error)
-                       return -EFAULT;
-               error = copy_from_user(isp->params.dis_ver_coef_buf,
-                                      (void __user *)arg->sdis_vertcoef_tbl,
-                                      isp->params.dis_ver_coef_bytes);
-               if (error)
-                       return -EFAULT;
-               sh_css_set_dis_coefficients(isp->params.dis_hor_coef_buf,
-                                           isp->params.dis_ver_coef_buf);
-       }
+       error = copy_from_user(isp->params.dis_hor_coef_buf,
+                              (void __user *)coefs->horizontal_coefficients,
+                              isp->params.dis_hor_coef_bytes);
+       if (error)
+               return -EFAULT;
+       error = copy_from_user(isp->params.dis_ver_coef_buf,
+                              (void __user *)coefs->vertical_coefficients,
+                              isp->params.dis_ver_coef_bytes);
+       if (error)
+               return -EFAULT;
+       sh_css_set_dis_coefficients(isp->params.dis_hor_coef_buf,
+                                   isp->params.dis_ver_coef_buf);
        return 0;
 }
 
index 9cc3dd1..6587abd 100644 (file)
@@ -150,10 +150,22 @@ int atomisp_gdc_cac_table(struct atomisp_device *isp, int flag,
 int atomisp_macc_table(struct atomisp_device *isp, int flag,
        void *config);
 /*
- * Function to set/get image stablization statistics
+ * Function to get DIS statistics.
  */
-int atomisp_dis_stat(struct atomisp_device *isp, int flag,
-       void *config);
+int atomisp_get_dis_stat(struct atomisp_device *isp,
+                        struct atomisp_dis_statistics *stats);
+
+/*
+ * Function to set the DIS coefficients.
+ */
+int atomisp_set_dis_coefs(struct atomisp_device *isp,
+                         struct atomisp_dis_coefficients *coefs);
+
+/*
+ * Function to set the DIS motion vector.
+ */
+int atomisp_set_dis_vector(struct atomisp_device *isp,
+                          struct atomisp_dis_vector *vector);
 
 /*
  * Function to set/get 3A stat from isp
@@ -183,9 +195,6 @@ int atomisp_bad_pixel(struct atomisp_device *isp, int flag, __s32 *value);
 int atomisp_bad_pixel_param(struct atomisp_device *isp, int flag,
        void *config);
 
-int atomisp_dis_vector(struct atomisp_device *isp,
-                      void *arg);
-
 /*
  * Function to enable/disable video image stablization
  */
index da6a7d7..269a8c4 100644 (file)
@@ -1650,13 +1650,16 @@ static long atomisp_vidioc_default(struct file *file, void *fh,
                return atomisp_ee(isp, 1, arg);
 
        case ATOMISP_IOC_G_DIS_STAT:
-               return atomisp_dis_stat(isp, 0, arg);
+               return atomisp_get_dis_stat(isp,
+                               (struct atomisp_dis_statistics *)arg);
 
-       case ATOMISP_IOC_S_DIS_STAT:
-               return atomisp_dis_stat(isp, 1, arg);
+       case ATOMISP_IOC_S_DIS_COEFS:
+               return atomisp_set_dis_coefs(isp,
+                               (struct atomisp_dis_coefficients *)arg);
 
        case ATOMISP_IOC_S_DIS_VECTOR:
-               return atomisp_dis_vector(isp, arg);
+               return atomisp_set_dis_vector(isp,
+                               (struct atomisp_dis_vector*) arg);
 
        case ATOMISP_IOC_G_ISP_PARM:
                return atomisp_param(isp, 0, arg);
index 6b4fae0..bbc5ebc 100644 (file)
@@ -37,12 +37,10 @@ enum sh_css_err
 sh_css_binary_grid_info(struct sh_css_binary *binary,
                        struct sh_css_grid_info *info)
 {
-       /* for DIS, we use a division instead of a ceil_div. If this is smaller
-        * than the 3a grid size, it indicates that the outer values are not
-        * valid for DIS.
-        */
        info->dis_width             = binary->dis_ver_proj_num_3a;
+       info->dis_aligned_width     = binary->dis_ver_proj_num_isp;
        info->dis_height            = binary->dis_hor_proj_num_3a;
+       info->dis_aligned_height    = binary->dis_hor_proj_num_isp;
        info->dis_bqs_per_grid_cell = 1 << binary->dis_deci_factor_log2;
        info->dis_hor_coef_num      = binary->dis_hor_coef_num_3a;
        info->dis_ver_coef_num      = binary->dis_ver_coef_num_3a;
index ebe139d..8790bbc 100644 (file)
@@ -652,6 +652,35 @@ sh_css_set_dis_coefficients(const short *horizontal_coefficients,
        dis_coef_table_changed = true;
 }
 
+#if 0
+/* This is the optimized code that uses the aligned_width and aligned_height
+ * for the projections. This should be enabled in the same patch set that
+ * adds the correct handling of these strides to the DIS IA code.
+ */
+void
+sh_css_get_dis_projections(int *horizontal_projections,
+                          int *vertical_projections)
+{
+       unsigned int hor_num_isp, ver_num_isp,
+                    hor_bytes, ver_bytes;
+       int *hor_ptr_isp = dis_hor_projections[curr_valid_buffer],
+           *ver_ptr_isp = dis_ver_projections[curr_valid_buffer];
+
+       if (current_3a_binary == NULL)
+               return;
+
+       hor_num_isp = current_3a_binary->dis_hor_proj_num_isp;
+       ver_num_isp = current_3a_binary->dis_ver_proj_num_isp;
+
+       hor_bytes = hor_num_isp * sizeof(*horizontal_projections) *
+                   SH_CSS_DIS_NUM_COEF_TYPES;
+       ver_bytes = ver_num_isp * sizeof(*vertical_projections) *
+                   SH_CSS_DIS_NUM_COEF_TYPES;
+
+       hrt_isp_css_mm_load(hor_ptr_isp, horizontal_projections, hor_bytes);
+       hrt_isp_css_mm_load(ver_ptr_isp, vertical_projections, ver_bytes);
+}
+#else
 void
 sh_css_get_dis_projections(int *horizontal_projections,
                           int *vertical_projections)
@@ -673,7 +702,7 @@ sh_css_get_dis_projections(int *horizontal_projections,
 
        for (i = 0; i < SH_CSS_DIS_NUM_COEF_TYPES; i++) {
                hrt_isp_css_mm_load(hor_ptr_isp, hor_ptr_3a,
-                                   hor_num_3a * sizeof(int));
+                               hor_num_3a * sizeof(int));
                hor_ptr_isp += hor_num_isp;
                hor_ptr_3a  += hor_num_3a;
 
@@ -683,6 +712,7 @@ sh_css_get_dis_projections(int *horizontal_projections,
                ver_ptr_3a  += ver_num_3a;
        }
 }
+#endif
 
 static void
 get_3a_stats_from_dmem(struct sh_css_3a_output *output)
index 86a5247..956ea58 100644 (file)
@@ -470,7 +470,9 @@ struct sh_css_grid_info {
        unsigned int s3a_bqs_per_grid_cell;
        /* DIS grid: */
        unsigned int dis_width;  /* also used for vertical projections */
+       unsigned int dis_aligned_width;
        unsigned int dis_height; /* also used for horizontal projections */
+       unsigned int dis_aligned_height;
        unsigned int dis_bqs_per_grid_cell;
        unsigned int dis_hor_coef_num;
        unsigned int dis_ver_coef_num;
index 1c5532b..7eacf18 100644 (file)
@@ -194,10 +194,6 @@ struct atomisp_css_params {
        /* Current grid info */
        struct sh_css_grid_info curr_grid_info;
 
-       /* DIS coefficients, must remain alive during execution */
-       int dis_x;
-       int dis_y;
-
        /* Intermediate buffers used to communicate data between
           CSS and user space. These are needed to perform the
           copy_to_user. */
index cd992f4..4928505 100644 (file)
@@ -97,15 +97,6 @@ struct atomisp_ee_config {
        unsigned int detail_gain;
 };
 
-struct atomisp_dis_config {
-       int *w_sdis_vertproj_tbl;
-       int *w_sdis_horiproj_tbl;
-       short *sdis_vertcoef_tbl;
-       short *sdis_horicoef_tbl;
-       int dis_x;
-       int dis_y;
-};
-
 struct atomisp_3a_output {
        int ae_y;
        int awb_cnt;
@@ -150,12 +141,31 @@ struct atomisp_grid_info {
        unsigned int s3a_bqs_per_grid_cell;
        /* DIS grid: */
        unsigned int dis_width;  /* also used for vertical projections */
+       unsigned int dis_aligned_width;
        unsigned int dis_height; /* also used for horizontal projections */
+       unsigned int dis_aligned_height;
        unsigned int dis_bqs_per_grid_cell;
        unsigned int dis_hor_coef_num;
        unsigned int dis_ver_coef_num;
 };
 
+struct atomisp_dis_vector {
+       int x;
+       int y;
+};
+
+struct atomisp_dis_coefficients {
+       struct atomisp_grid_info grid_info;
+       short *vertical_coefficients;
+       short *horizontal_coefficients;
+};
+
+struct atomisp_dis_statistics {
+       struct atomisp_grid_info grid_info;
+       int   *vertical_projections;
+       int   *horizontal_projections;
+};
+
 struct atomisp_3a_statistics {
        struct atomisp_grid_info  grid_info;
        struct atomisp_3a_output *data;
@@ -484,56 +494,64 @@ struct v4l2_private_int_data {
        _IOR('v', BASE_VIDIOC_PRIVATE + 12, struct atomisp_ee_config)
 #define ATOMISP_IOC_S_EE \
        _IOW('v', BASE_VIDIOC_PRIVATE + 13, struct atomisp_ee_config)
+/* Digital Image Stabilization:
+ * 1. get dis statistics: reads DIS statistics from ISP (every frame)
+ * 2. set dis coefficients: set DIS filter coefficients (one time)
+ * 3. set dis motion vecotr: set motion vector (result of DIS, every frame)
+ */
 #define ATOMISP_IOC_G_DIS_STAT \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 14, struct atomisp_dis_config)
-#define ATOMISP_IOC_S_DIS_STAT \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 15, struct atomisp_dis_config)
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 14, struct atomisp_dis_statistics)
+#define ATOMISP_IOC_S_DIS_COEFS \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 15, struct atomisp_dis_coefficients)
+#define ATOMISP_IOC_S_DIS_VECTOR \
+       _IOW('v', BASE_VIDIOC_PRIVATE + 16, struct atomisp_dis_vector)
+
 #define ATOMISP_IOC_G_3A_STAT \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 16, struct atomisp_3a_statistics)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 17, struct atomisp_3a_statistics)
 #define ATOMISP_IOC_G_ISP_PARM \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 17, struct atomisp_parm)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 18, struct atomisp_parm)
 #define ATOMISP_IOC_S_ISP_PARM \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 18, struct atomisp_parm)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 19, struct atomisp_parm)
 #define ATOMISP_IOC_G_ISP_GAMMA \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 19, struct atomisp_gamma_table)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 20, struct atomisp_gamma_table)
 #define ATOMISP_IOC_S_ISP_GAMMA \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 20, struct atomisp_gamma_table)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 21, struct atomisp_gamma_table)
 #define ATOMISP_IOC_G_ISP_GDC_TAB \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 21, struct atomisp_morph_table)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 22, struct atomisp_morph_table)
 #define ATOMISP_IOC_S_ISP_GDC_TAB \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 22, struct atomisp_morph_table)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 23, struct atomisp_morph_table)
 #define ATOMISP_IOC_ISP_MAKERNOTE \
-       _IOWR('v', BASE_VIDIOC_PRIVATE + 23, struct atomisp_makernote_info)
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 24, struct atomisp_makernote_info)
 
 /* macc parameter control*/
 #define ATOMISP_IOC_G_ISP_MACC \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 24, struct atomisp_macc_config)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 25, struct atomisp_macc_config)
 #define ATOMISP_IOC_S_ISP_MACC \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 25, struct atomisp_macc_config)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 26, struct atomisp_macc_config)
 
 /* Defect pixel detection & Correction */
 #define ATOMISP_IOC_G_ISP_BAD_PIXEL_DETECTION \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 26, struct atomisp_dp_config)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 27, struct atomisp_dp_config)
 #define ATOMISP_IOC_S_ISP_BAD_PIXEL_DETECTION \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 27, struct atomisp_dp_config)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 28, struct atomisp_dp_config)
 
 /* False Color Correction */
 #define ATOMISP_IOC_G_ISP_FALSE_COLOR_CORRECTION \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 28, struct atomisp_de_config)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 29, struct atomisp_de_config)
 #define ATOMISP_IOC_S_ISP_FALSE_COLOR_CORRECTION \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 29, struct atomisp_de_config)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 30, struct atomisp_de_config)
 
 /* ctc parameter control */
 #define ATOMISP_IOC_G_ISP_CTC \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 30, struct atomisp_ctc_table)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 31, struct atomisp_ctc_table)
 #define ATOMISP_IOC_S_ISP_CTC \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 31, struct atomisp_ctc_table)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 32, struct atomisp_ctc_table)
 
 /* white balance Correction */
 #define ATOMISP_IOC_G_ISP_WHITE_BALANCE \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 32, struct atomisp_wb_config)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 33, struct atomisp_wb_config)
 #define ATOMISP_IOC_S_ISP_WHITE_BALANCE \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 33, struct atomisp_wb_config)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 34, struct atomisp_wb_config)
 
 /* fpn table loading */
 #define ATOMISP_IOC_S_ISP_FPN_TABLE \
@@ -553,55 +571,52 @@ struct v4l2_private_int_data {
 #define ATOMISP_IOC_G_SENSOR_MODE_DATA \
        _IOR('v', BASE_VIDIOC_PRIVATE + 39, struct atomisp_sensor_mode_data)
 
-#define ATOMISP_IOC_S_DIS_VECTOR \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 40, struct atomisp_dis_config)
-
 #define ATOMISP_IOC_S_EXPOSURE \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 41, struct atomisp_exposure)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 40, struct atomisp_exposure)
 
 /* sensor calibration registers group */
 #define ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP \
-       _IOWR('v', BASE_VIDIOC_PRIVATE + 42, struct atomisp_calibration_group)
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 41, struct atomisp_calibration_group)
 
 /* white balance Correction */
 #define ATOMISP_IOC_G_3A_CONFIG \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 43, struct atomisp_3a_config)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 42, struct atomisp_3a_config)
 #define ATOMISP_IOC_S_3A_CONFIG \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 44, struct atomisp_3a_config)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 43, struct atomisp_3a_config)
 
 /* Accelerate ioctls */
 #define ATOMISP_IOC_ACC_LOAD \
-       _IOWR('v', BASE_VIDIOC_PRIVATE + 45, struct atomisp_acc_fw_load)
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 44, struct atomisp_acc_fw_load)
 
 #define ATOMISP_IOC_ACC_UNLOAD \
-       _IOWR('v', BASE_VIDIOC_PRIVATE + 46, unsigned int)
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 45, unsigned int)
 
 #define ATOMISP_IOC_ACC_S_ARG \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 47, struct atomisp_acc_fw_arg)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 46, struct atomisp_acc_fw_arg)
 
 #define ATOMISP_IOC_ACC_START \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 48, unsigned int)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 47, unsigned int)
 
 #define ATOMISP_IOC_ACC_WAIT \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 49, unsigned int)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 48, unsigned int)
 
 #define ATOMISP_IOC_ACC_ABORT \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 50, struct atomisp_acc_fw_abort)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 49, struct atomisp_acc_fw_abort)
 
 /* sensor OTP memory read */
 #define ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA \
-       _IOWR('v', BASE_VIDIOC_PRIVATE + 51, struct v4l2_private_int_data)
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 50, struct v4l2_private_int_data)
 
 /* LCS (shading) table write */
 #define ATOMISP_IOC_S_ISP_SHD_TAB \
-       _IOWR('v', BASE_VIDIOC_PRIVATE + 52, struct atomisp_shading_table)
+       _IOWR('v', BASE_VIDIOC_PRIVATE + 51, struct atomisp_shading_table)
 
 /* Gamma Correction */
 #define ATOMISP_IOC_G_ISP_GAMMA_CORRECTION \
-       _IOR('v', BASE_VIDIOC_PRIVATE + 53, struct atomisp_gc_config)
+       _IOR('v', BASE_VIDIOC_PRIVATE + 52, struct atomisp_gc_config)
 
 #define ATOMISP_IOC_S_ISP_GAMMA_CORRECTION \
-       _IOW('v', BASE_VIDIOC_PRIVATE + 54, struct atomisp_gc_config)
+       _IOW('v', BASE_VIDIOC_PRIVATE + 53, struct atomisp_gc_config)
 
 /*  ISP Private control IDs */
 #define V4L2_CID_ATOMISP_BAD_PIXEL_DETECTION \