brcm2708: update against latest rpi-3.10.y branch
[openwrt.git] / target / linux / brcm2708 / patches-3.10 / 0135-V4L2-Add-flicker-avoidance-controls.patch
1 From 9d80a4ce15c265530d8372a3577748123e365ee3 Mon Sep 17 00:00:00 2001
2 From: Dave Stevenson <dsteve@broadcom.com>
3 Date: Mon, 9 Dec 2013 16:40:24 +0000
4 Subject: [PATCH 135/174] V4L2: Add flicker avoidance controls
5
6 Add support for V4L2_CID_POWER_LINE_FREQUENCY to set flicker
7 avoidance frequencies.
8
9 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
10 ---
11  drivers/media/platform/bcm2835/bcm2835-camera.h  |  2 +-
12  drivers/media/platform/bcm2835/controls.c        | 42 ++++++++++++++++++++++++
13  drivers/media/platform/bcm2835/mmal-parameters.h |  8 +++++
14  3 files changed, 51 insertions(+), 1 deletion(-)
15
16 --- a/drivers/media/platform/bcm2835/bcm2835-camera.h
17 +++ b/drivers/media/platform/bcm2835/bcm2835-camera.h
18 @@ -15,7 +15,7 @@
19   * core driver device
20   */
21  
22 -#define V4L2_CTRL_COUNT 19 /* number of v4l controls */
23 +#define V4L2_CTRL_COUNT 20 /* number of v4l controls */
24  
25  enum {
26         MMAL_COMPONENT_CAMERA = 0,
27 --- a/drivers/media/platform/bcm2835/controls.c
28 +++ b/drivers/media/platform/bcm2835/controls.c
29 @@ -56,6 +56,13 @@ static const s64 iso_qmenu[] = {
30         0, 100, 200, 400, 800,
31  };
32  
33 +static const s64 mains_freq_qmenu[] = {
34 +       V4L2_CID_POWER_LINE_FREQUENCY_DISABLED,
35 +       V4L2_CID_POWER_LINE_FREQUENCY_50HZ,
36 +       V4L2_CID_POWER_LINE_FREQUENCY_60HZ,
37 +       V4L2_CID_POWER_LINE_FREQUENCY_AUTO
38 +};
39 +
40  /* Supported video encode modes */
41  static const s64 bitrate_mode_qmenu[] = {
42         (s64)V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
43 @@ -373,6 +380,35 @@ static int ctrl_set_metering_mode(struct
44                                              &u32_value, sizeof(u32_value));
45  }
46  
47 +static int ctrl_set_flicker_avoidance(struct bm2835_mmal_dev *dev,
48 +                          struct v4l2_ctrl *ctrl,
49 +                          const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
50 +{
51 +       u32 u32_value;
52 +       struct vchiq_mmal_port *control;
53 +
54 +       control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
55 +
56 +       switch (ctrl->val) {
57 +       case V4L2_CID_POWER_LINE_FREQUENCY_DISABLED:
58 +               u32_value = MMAL_PARAM_FLICKERAVOID_OFF;
59 +               break;
60 +       case V4L2_CID_POWER_LINE_FREQUENCY_50HZ:
61 +               u32_value = MMAL_PARAM_FLICKERAVOID_50HZ;
62 +               break;
63 +       case V4L2_CID_POWER_LINE_FREQUENCY_60HZ:
64 +               u32_value = MMAL_PARAM_FLICKERAVOID_60HZ;
65 +               break;
66 +       case V4L2_CID_POWER_LINE_FREQUENCY_AUTO:
67 +               u32_value = MMAL_PARAM_FLICKERAVOID_AUTO;
68 +               break;
69 +       }
70 +
71 +       return vchiq_mmal_port_parameter_set(dev->instance, control,
72 +                                            mmal_ctrl->mmal_id,
73 +                                            &u32_value, sizeof(u32_value));
74 +}
75 +
76  static int ctrl_set_awb_mode(struct bm2835_mmal_dev *dev,
77                       struct v4l2_ctrl *ctrl,
78                       const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
79 @@ -706,6 +742,12 @@ static const struct bm2835_mmal_v4l2_ctr
80                 30, 1, NULL,
81                 MMAL_PARAMETER_JPEG_Q_FACTOR, &ctrl_set_image_encode_output
82         },
83 +       {
84 +               V4L2_CID_POWER_LINE_FREQUENCY, MMAL_CONTROL_TYPE_STD_MENU,
85 +               0, ARRAY_SIZE(mains_freq_qmenu) - 1,
86 +               1, 1, NULL,
87 +               MMAL_PARAMETER_FLICKER_AVOID, &ctrl_set_flicker_avoidance
88 +       },
89  };
90  
91  int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev)
92 --- a/drivers/media/platform/bcm2835/mmal-parameters.h
93 +++ b/drivers/media/platform/bcm2835/mmal-parameters.h
94 @@ -271,6 +271,14 @@ enum mmal_parameter_imagefx {
95         MMAL_PARAM_IMAGEFX_CARTOON,
96  };
97  
98 +enum MMAL_PARAM_FLICKERAVOID_T {
99 +       MMAL_PARAM_FLICKERAVOID_OFF,
100 +       MMAL_PARAM_FLICKERAVOID_AUTO,
101 +       MMAL_PARAM_FLICKERAVOID_50HZ,
102 +       MMAL_PARAM_FLICKERAVOID_60HZ,
103 +       MMAL_PARAM_FLICKERAVOID_MAX = 0x7FFFFFFF
104 +};
105 +
106  /** Manner of video rate control */
107  enum mmal_parameter_rate_control_mode {
108         MMAL_VIDEO_RATECONTROL_DEFAULT,