[media] gspca - ov534: Add Saturation control
authorAntonio Ospite <ospite@studenti.unina.it>
Mon, 14 May 2012 11:07:43 +0000 (08:07 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 14 May 2012 12:45:48 +0000 (09:45 -0300)
Also merge the "COLORS" control into it as it was V4L2_CID_SATURATION
anyway.

Signed-off-by: Antonio Ospite <ospite@studenti.unina.it>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/ov534.c

index 04753391de3e479a6acc57a4edd901a4722fa054..c15cf23d7758102d4caa833790408daeddb8587e 100644 (file)
@@ -53,6 +53,7 @@ MODULE_LICENSE("GPL");
 
 /* controls */
 enum e_ctrl {
+       SATURATION,
        BRIGHTNESS,
        CONTRAST,
        GAIN,
@@ -63,7 +64,6 @@ enum e_ctrl {
        SHARPNESS,
        HFLIP,
        VFLIP,
-       COLORS,
        LIGHTFREQ,
        NCTRLS          /* number of controls */
 };
@@ -87,6 +87,7 @@ enum sensors {
 };
 
 /* V4L2 controls supported by the driver */
+static void setsaturation(struct gspca_dev *gspca_dev);
 static void setbrightness(struct gspca_dev *gspca_dev);
 static void setcontrast(struct gspca_dev *gspca_dev);
 static void setgain(struct gspca_dev *gspca_dev);
@@ -96,13 +97,24 @@ 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);
 static void sd_stopN(struct gspca_dev *gspca_dev);
 
 static const struct ctrl sd_ctrls[] = {
+[SATURATION] = {
+               {
+                       .id      = V4L2_CID_SATURATION,
+                       .type    = V4L2_CTRL_TYPE_INTEGER,
+                       .name    = "Saturation",
+                       .minimum = 0,
+                       .maximum = 255,
+                       .step    = 1,
+                       .default_value = 64,
+               },
+               .set_control = setsaturation
+       },
 [BRIGHTNESS] = {
                {
                        .id      = V4L2_CID_BRIGHTNESS,
@@ -223,18 +235,6 @@ 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,
@@ -684,7 +684,7 @@ static const u8 sensor_init_772x[][2] = {
        { 0x9c, 0x20 },
        { 0x9e, 0x81 },
 
-       { 0xa6, 0x04 },
+       { 0xa6, 0x06 },
        { 0x7e, 0x0c },
        { 0x7f, 0x16 },
        { 0x80, 0x2a },
@@ -955,6 +955,32 @@ static void set_frame_rate(struct gspca_dev *gspca_dev)
        PDEBUG(D_PROBE, "frame_rate: %d", r->fps);
 }
 
+static void setsaturation(struct gspca_dev *gspca_dev)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+       int val;
+
+       val = sd->ctrls[SATURATION].val;
+       if (sd->sensor == SENSOR_OV767x) {
+               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},
+               };
+
+               for (i = 0; i < ARRAY_SIZE(color_tb[0]); i++)
+                       sccb_reg_write(gspca_dev, 0x4f + i, color_tb[val][i]);
+       } else {
+               sccb_reg_write(gspca_dev, 0xa7, val); /* U saturation */
+               sccb_reg_write(gspca_dev, 0xa8, val); /* V saturation */
+       }
+}
+
 static void setbrightness(struct gspca_dev *gspca_dev)
 {
        struct sd *sd = (struct sd *) gspca_dev;
@@ -1132,26 +1158,6 @@ 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;
@@ -1228,6 +1234,9 @@ static int sd_init(struct gspca_dev *gspca_dev)
                gspca_dev->ctrl_dis = (1 << GAIN) |
                                        (1 << AGC) |
                                        (1 << SHARPNESS);       /* auto */
+               sd->ctrls[SATURATION].min = 0,
+               sd->ctrls[SATURATION].max = 6,
+               sd->ctrls[SATURATION].def = 3,
                sd->ctrls[BRIGHTNESS].min = -127;
                sd->ctrls[BRIGHTNESS].max = 127;
                sd->ctrls[BRIGHTNESS].def = 0;
@@ -1243,7 +1252,6 @@ 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;
@@ -1302,6 +1310,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
 
        set_frame_rate(gspca_dev);
 
+       setsaturation(gspca_dev);
        if (!(gspca_dev->ctrl_dis & (1 << AGC)))
                setagc(gspca_dev);
        setawb(gspca_dev);
@@ -1314,8 +1323,6 @@ 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);