[PORT FROM R2] atomisp: set sensor's binning factor to ISP before streaming
authorDavid Cohen <david.a.cohen@intel.com>
Wed, 2 Nov 2011 19:35:36 +0000 (21:35 +0200)
committerbuildbot <buildbot@intel.com>
Mon, 19 Dec 2011 13:29:25 +0000 (05:29 -0800)
BZ: 17272

When Atomisp changes sensor's format, it needs to ask for sensor's
binning factor which necessary for internal operations. This patch
implements such functionality.

Change-Id: I0a2f47f58da270c6f62b08c6f3d4534da17e0113
Orig-Change-Id: Id5754ad893b0e91628f6407b650f0532cb6fc52f
Signed-off-by: David Cohen <david.a.cohen@intel.com>
Reviewed-on: http://android.intel.com:8080/22979
Reviewed-by: Wang, Wen W <wen.w.wang@intel.com>
Tested-by: Koski, Anttu <anttu.koski@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
Reviewed-on: http://android.intel.com:8080/28000
Reviewed-by: Tuominen, TeemuX <teemux.tuominen@intel.com>
Reviewed-by: Koski, Anttu <anttu.koski@intel.com>
drivers/media/video/atomisp/atomisp_cmd.c

index 2230f1a..45af7ab 100644 (file)
@@ -2966,6 +2966,35 @@ static void atomisp_set_dis_envelop(struct atomisp_device *isp,
        }
 }
 
+static int atomisp_get_sensor_bin_factor(struct atomisp_device *isp)
+{
+       struct v4l2_control ctrl;
+       int hbin, vbin;
+       int ret;
+
+       memset(&ctrl, 0, sizeof(ctrl));
+
+       ctrl.id = V4L2_CID_BIN_FACTOR_HORZ;
+       ret = v4l2_subdev_call(isp->inputs[isp->input_curr].camera, core,
+                              g_ctrl, &ctrl);
+       hbin = ctrl.value;
+       ctrl.id = V4L2_CID_BIN_FACTOR_VERT;
+       ret |= v4l2_subdev_call(isp->inputs[isp->input_curr].camera, core,
+                               g_ctrl, &ctrl);
+       vbin = ctrl.value;
+
+       /*
+        * ISP needs to know binning factor from sensor.
+        * In case horizontal and vertical sensor's binning factors
+        * are different or sensor does not support binning factor CID,
+        * ISP will apply default 0 value.
+        */
+       if (ret || (hbin != vbin))
+               hbin = 0;
+
+       return hbin;
+}
+
 static int atomisp_set_fmt_to_snr(struct atomisp_device *isp,
                          struct v4l2_format *f, unsigned int pixelformat,
                          unsigned int padding_w, unsigned int padding_h,
@@ -3011,6 +3040,8 @@ static int atomisp_set_fmt_to_snr(struct atomisp_device *isp,
            isp->input_format->out.height < ATOM_ISP_STEP_HEIGHT)
                        return -EINVAL;
 
+       sh_css_input_set_binning_factor(atomisp_get_sensor_bin_factor(isp));
+
        return 0;
 }
 void atomisp_get_yuv_ds_status(struct atomisp_device *isp,