[media] gspca - ov534: Add saturation control for ov767x
authorJean-François Moine <moinejf@free.fr>
Thu, 10 Feb 2011 13:15:45 +0000 (10:15 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 21 Mar 2011 23:32:08 +0000 (20:32 -0300)
Signed-off-by: Jean-François Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/ov534.c

index 8dada2b..0c6369b 100644 (file)
@@ -61,6 +61,7 @@ enum e_ctrl {
        SHARPNESS,
        HFLIP,
        VFLIP,
+       COLORS,
        LIGHTFREQ,
        NCTRLS          /* number of controls */
 };
@@ -93,6 +94,7 @@ static void setawb(struct gspca_dev *gspca_dev);
 static void setaec(struct gspca_dev *gspca_dev);
 static void setsharpness(struct gspca_dev *gspca_dev);
 static void sethvflip(struct gspca_dev *gspca_dev);
+static void setcolors(struct gspca_dev *gspca_dev);
 static void setlightfreq(struct gspca_dev *gspca_dev);
 
 static int sd_start(struct gspca_dev *gspca_dev);
@@ -219,6 +221,18 @@ static const struct ctrl sd_ctrls[] = {
                },
                .set_control = sethvflip
        },
+[COLORS] = {
+               {
+                       .id      = V4L2_CID_SATURATION,
+                       .type    = V4L2_CTRL_TYPE_INTEGER,
+                       .name    = "Saturation",
+                       .minimum = 0,
+                       .maximum = 6,
+                       .step    = 1,
+                       .default_value = 3,
+               },
+               .set_control = setcolors
+       },
 [LIGHTFREQ] = {
                {
                        .id      = V4L2_CID_POWER_LINE_FREQUENCY,
@@ -1116,6 +1130,26 @@ static void sethvflip(struct gspca_dev *gspca_dev)
        }
 }
 
+static void setcolors(struct gspca_dev *gspca_dev)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+       u8 val;
+       int i;
+       static u8 color_tb[][6] = {
+               {0x42, 0x42, 0x00, 0x11, 0x30, 0x41},
+               {0x52, 0x52, 0x00, 0x16, 0x3c, 0x52},
+               {0x66, 0x66, 0x00, 0x1b, 0x4b, 0x66},
+               {0x80, 0x80, 0x00, 0x22, 0x5e, 0x80},
+               {0x9a, 0x9a, 0x00, 0x29, 0x71, 0x9a},
+               {0xb8, 0xb8, 0x00, 0x31, 0x87, 0xb8},
+               {0xdd, 0xdd, 0x00, 0x3b, 0xa2, 0xdd},
+       };
+
+       val = sd->ctrls[COLORS].val;
+       for (i = 0; i < ARRAY_SIZE(color_tb[0]); i++)
+               sccb_reg_write(gspca_dev, 0x4f + i, color_tb[val][i]);
+}
+
 static void setlightfreq(struct gspca_dev *gspca_dev)
 {
        struct sd *sd = (struct sd *) gspca_dev;
@@ -1207,6 +1241,7 @@ static int sd_init(struct gspca_dev *gspca_dev)
                gspca_dev->cam.nmodes = ARRAY_SIZE(ov767x_mode);
        } else {
                sd->sensor = SENSOR_OV772x;
+               gspca_dev->ctrl_dis = (1 << COLORS);
                gspca_dev->cam.bulk = 1;
                gspca_dev->cam.bulk_size = 16384;
                gspca_dev->cam.bulk_nurbs = 2;
@@ -1277,6 +1312,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
        if (!(gspca_dev->ctrl_dis & (1 << SHARPNESS)))
                setsharpness(gspca_dev);
        sethvflip(gspca_dev);
+       if (!(gspca_dev->ctrl_dis & (1 << COLORS)))
+               setcolors(gspca_dev);
        setlightfreq(gspca_dev);
 
        ov534_set_led(gspca_dev, 1);