brcm2708: switch to 3.14
[15.05/openwrt.git] / target / linux / brcm2708 / patches-3.10 / 0183-V4L2-Add-manual-white-balance-control.patch
1 From 9f0bd5e194e2aca372c7dd4b0911fabf5b9ae80c Mon Sep 17 00:00:00 2001
2 From: Dave Stevenson <dsteve@broadcom.com>
3 Date: Tue, 25 Mar 2014 11:48:01 +0000
4 Subject: [PATCH 183/196] V4L2: Add manual white balance control.
5
6 Adds support for V4L2_CID_RED_BALANCE and
7 V4L2_CID_BLUE_BALANCE. Only has an effect if
8 V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE has
9 V4L2_WHITE_BALANCE_MANUAL selected.
10
11 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
12 ---
13  drivers/media/platform/bcm2835/bcm2835-camera.h  |  4 ++-
14  drivers/media/platform/bcm2835/controls.c        | 39 +++++++++++++++++++++++-
15  drivers/media/platform/bcm2835/mmal-parameters.h |  8 ++++-
16  3 files changed, 48 insertions(+), 3 deletions(-)
17
18 diff --git a/drivers/media/platform/bcm2835/bcm2835-camera.h b/drivers/media/platform/bcm2835/bcm2835-camera.h
19 index f389bea..4ddd687 100644
20 --- a/drivers/media/platform/bcm2835/bcm2835-camera.h
21 +++ b/drivers/media/platform/bcm2835/bcm2835-camera.h
22 @@ -15,7 +15,7 @@
23   * core driver device
24   */
25  
26 -#define V4L2_CTRL_COUNT 25 /* number of v4l controls */
27 +#define V4L2_CTRL_COUNT 27 /* number of v4l controls */
28  
29  enum {
30         MMAL_COMPONENT_CAMERA = 0,
31 @@ -49,6 +49,8 @@ struct bm2835_mmal_dev {
32         struct mmal_colourfx      colourfx;
33         int                       hflip;
34         int                       vflip;
35 +       int                       red_gain;
36 +       int                       blue_gain;
37         enum mmal_parameter_exposuremode exposure_mode_user;
38         enum v4l2_exposure_auto_type exposure_mode_v4l2_user;
39         /* active exposure mode may differ if selected via a scene mode */
40 diff --git a/drivers/media/platform/bcm2835/controls.c b/drivers/media/platform/bcm2835/controls.c
41 index b7a7e88..9a40bd0 100644
42 --- a/drivers/media/platform/bcm2835/controls.c
43 +++ b/drivers/media/platform/bcm2835/controls.c
44 @@ -491,6 +491,29 @@ static int ctrl_set_awb_mode(struct bm2835_mmal_dev *dev,
45                                              &u32_value, sizeof(u32_value));
46  }
47  
48 +static int ctrl_set_awb_gains(struct bm2835_mmal_dev *dev,
49 +                     struct v4l2_ctrl *ctrl,
50 +                     const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
51 +{
52 +       struct vchiq_mmal_port *control;
53 +       struct mmal_parameter_awbgains gains;
54 +
55 +       control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
56 +
57 +       if (ctrl->id == V4L2_CID_RED_BALANCE)
58 +               dev->red_gain = ctrl->val;
59 +       else if (ctrl->id == V4L2_CID_BLUE_BALANCE)
60 +               dev->blue_gain = ctrl->val;
61 +
62 +       gains.r_gain.num = dev->red_gain;
63 +       gains.b_gain.num = dev->blue_gain;
64 +       gains.r_gain.den = gains.b_gain.den = 1000;
65 +
66 +       return vchiq_mmal_port_parameter_set(dev->instance, control,
67 +                                            mmal_ctrl->mmal_id,
68 +                                            &gains, sizeof(gains));
69 +}
70 +
71  static int ctrl_set_image_effect(struct bm2835_mmal_dev *dev,
72                    struct v4l2_ctrl *ctrl,
73                    const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
74 @@ -991,12 +1014,26 @@ static const struct bm2835_mmal_v4l2_ctrl v4l2_ctrls[V4L2_CTRL_COUNT] = {
75         {
76                 V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE,
77                 MMAL_CONTROL_TYPE_STD_MENU,
78 -               ~0x3fe, 9, V4L2_WHITE_BALANCE_AUTO, 0, NULL,
79 +               ~0x3ff, 9, V4L2_WHITE_BALANCE_AUTO, 0, NULL,
80                 MMAL_PARAMETER_AWB_MODE,
81                 &ctrl_set_awb_mode,
82                 false
83         },
84         {
85 +               V4L2_CID_RED_BALANCE, MMAL_CONTROL_TYPE_STD,
86 +               1, 7999, 1000, 1, NULL,
87 +               MMAL_PARAMETER_CUSTOM_AWB_GAINS,
88 +               &ctrl_set_awb_gains,
89 +               false
90 +       },
91 +       {
92 +               V4L2_CID_BLUE_BALANCE, MMAL_CONTROL_TYPE_STD,
93 +               1, 7999, 1000, 1, NULL,
94 +               MMAL_PARAMETER_CUSTOM_AWB_GAINS,
95 +               &ctrl_set_awb_gains,
96 +               false
97 +       },
98 +       {
99                 V4L2_CID_COLORFX, MMAL_CONTROL_TYPE_STD_MENU,
100                 0, 15, V4L2_COLORFX_NONE, 0, NULL,
101                 MMAL_PARAMETER_IMAGE_EFFECT,
102 diff --git a/drivers/media/platform/bcm2835/mmal-parameters.h b/drivers/media/platform/bcm2835/mmal-parameters.h
103 index ae8fef9..089f949 100644
104 --- a/drivers/media/platform/bcm2835/mmal-parameters.h
105 +++ b/drivers/media/platform/bcm2835/mmal-parameters.h
106 @@ -161,7 +161,8 @@ enum mmal_parameter_camera_type {
107         MMAL_PARAMETER_SW_SHARPEN_DISABLE, /**< @ref MMAL_PARAMETER_BOOLEAN_T */
108         MMAL_PARAMETER_FLASH_REQUIRED, /**< @ref MMAL_PARAMETER_BOOLEAN_T */
109         MMAL_PARAMETER_SW_SATURATION_DISABLE, /**< @ref MMAL_PARAMETER_BOOLEAN_T */
110 -       MMAL_PARAMETER_SHUTTER_SPEED              /**< Takes a @ref MMAL_PARAMETER_UINT32_T */
111 +       MMAL_PARAMETER_SHUTTER_SPEED,             /**< Takes a @ref MMAL_PARAMETER_UINT32_T */
112 +       MMAL_PARAMETER_CUSTOM_AWB_GAINS,          /**< Takes a @ref MMAL_PARAMETER_AWB_GAINS_T */
113  };
114  
115  struct mmal_parameter_rational {
116 @@ -292,6 +293,11 @@ enum MMAL_PARAM_FLICKERAVOID_T {
117         MMAL_PARAM_FLICKERAVOID_MAX = 0x7FFFFFFF
118  };
119  
120 +struct mmal_parameter_awbgains {
121 +       struct mmal_parameter_rational r_gain;  /**< Red gain */
122 +       struct mmal_parameter_rational b_gain;  /**< Blue gain */
123 +};
124 +
125  /** Manner of video rate control */
126  enum mmal_parameter_rate_control_mode {
127         MMAL_VIDEO_RATECONTROL_DEFAULT,
128 -- 
129 1.9.1
130