V4L/DVB (13449): gspca - ov534: The AWB control works only when autogain is set.
authorJean-Francois Moine <moinejf@free.fr>
Thu, 12 Nov 2009 19:15:44 +0000 (16:15 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 5 Dec 2009 20:41:58 +0000 (18:41 -0200)
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/ov534.c

index f2f844a..26d98b1 100644 (file)
@@ -101,7 +101,7 @@ static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val);
 static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val);
 
 static struct ctrl sd_ctrls_ov772x[] = {
-    {
+    {                                                  /* 0 */
        {
                .id      = V4L2_CID_BRIGHTNESS,
                .type    = V4L2_CTRL_TYPE_INTEGER,
@@ -115,7 +115,7 @@ static struct ctrl sd_ctrls_ov772x[] = {
        .set = sd_setbrightness,
        .get = sd_getbrightness,
     },
-    {
+    {                                                  /* 1 */
        {
                .id      = V4L2_CID_CONTRAST,
                .type    = V4L2_CTRL_TYPE_INTEGER,
@@ -129,7 +129,7 @@ static struct ctrl sd_ctrls_ov772x[] = {
        .set = sd_setcontrast,
        .get = sd_getcontrast,
     },
-    {
+    {                                                  /* 2 */
        {
            .id      = V4L2_CID_GAIN,
            .type    = V4L2_CTRL_TYPE_INTEGER,
@@ -143,7 +143,7 @@ static struct ctrl sd_ctrls_ov772x[] = {
        .set = sd_setgain,
        .get = sd_getgain,
     },
-    {
+    {                                                  /* 3 */
        {
            .id      = V4L2_CID_EXPOSURE,
            .type    = V4L2_CTRL_TYPE_INTEGER,
@@ -157,7 +157,7 @@ static struct ctrl sd_ctrls_ov772x[] = {
        .set = sd_setexposure,
        .get = sd_getexposure,
     },
-    {
+    {                                                  /* 4 */
        {
            .id      = V4L2_CID_RED_BALANCE,
            .type    = V4L2_CTRL_TYPE_INTEGER,
@@ -171,7 +171,7 @@ static struct ctrl sd_ctrls_ov772x[] = {
        .set = sd_setredblc,
        .get = sd_getredblc,
     },
-    {
+    {                                                  /* 5 */
        {
            .id      = V4L2_CID_BLUE_BALANCE,
            .type    = V4L2_CTRL_TYPE_INTEGER,
@@ -185,7 +185,7 @@ static struct ctrl sd_ctrls_ov772x[] = {
        .set = sd_setblueblc,
        .get = sd_getblueblc,
     },
-    {
+    {                                                  /* 6 */
        {
                .id      = V4L2_CID_HUE,
                .type    = V4L2_CTRL_TYPE_INTEGER,
@@ -199,7 +199,7 @@ static struct ctrl sd_ctrls_ov772x[] = {
        .set = sd_sethue,
        .get = sd_gethue,
     },
-    {
+    {                                                  /* 7 */
        {
            .id      = V4L2_CID_AUTOGAIN,
            .type    = V4L2_CTRL_TYPE_BOOLEAN,
@@ -213,7 +213,8 @@ static struct ctrl sd_ctrls_ov772x[] = {
        .set = sd_setautogain,
        .get = sd_getautogain,
     },
-    {
+#define AWB_IDX 8
+    {                                                  /* 8 */
        {
                .id      = V4L2_CID_AUTO_WHITE_BALANCE,
                .type    = V4L2_CTRL_TYPE_BOOLEAN,
@@ -227,7 +228,7 @@ static struct ctrl sd_ctrls_ov772x[] = {
        .set = sd_setawb,
        .get = sd_getawb,
     },
-    {
+    {                                                  /* 9 */
        {
            .id      = V4L2_CID_SHARPNESS,
            .type    = V4L2_CTRL_TYPE_INTEGER,
@@ -241,7 +242,7 @@ static struct ctrl sd_ctrls_ov772x[] = {
        .set = sd_setsharpness,
        .get = sd_getsharpness,
     },
-    {
+    {                                                  /* 10 */
        {
            .id      = V4L2_CID_HFLIP,
            .type    = V4L2_CTRL_TYPE_BOOLEAN,
@@ -255,7 +256,7 @@ static struct ctrl sd_ctrls_ov772x[] = {
        .set = sd_sethflip,
        .get = sd_gethflip,
     },
-    {
+    {                                                  /* 11 */
        {
            .id      = V4L2_CID_VFLIP,
            .type    = V4L2_CTRL_TYPE_BOOLEAN,
@@ -1237,6 +1238,8 @@ static int sd_config(struct gspca_dev *gspca_dev,
        sd->hue = HUE_DEF;
 #if AUTOGAIN_DEF != 0
        sd->autogain = AUTOGAIN_DEF;
+#else
+       gspca_dev->ctrl_inac |= (1 << AWB_IDX);
 #endif
 #if AWB_DEF != 0
        sd->awb = AWB_DEF
@@ -1606,6 +1609,13 @@ static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val)
        struct sd *sd = (struct sd *) gspca_dev;
 
        sd->autogain = val;
+
+       /* the auto white balance control works only when auto gain is set */
+       if (val)
+               gspca_dev->ctrl_inac &= ~(1 << AWB_IDX);
+       else
+               gspca_dev->ctrl_inac |= (1 << AWB_IDX);
+
        if (gspca_dev->streaming)
                setautogain(gspca_dev);
        return 0;