[media] gspca_sonixb: Fix OV7630 gain control
authorHans de Goede <hdegoede@redhat.com>
Wed, 16 May 2012 10:14:54 +0000 (07:14 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Jul 2012 21:18:50 +0000 (18:18 -0300)
The ov7630's gain is weird, at 32 the gain drops to the same level as at 16,
so skip 32-47 (of the 0-63 scale).

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/sonixb.c

index 1bfe5f8..dfc7077 100644 (file)
@@ -630,6 +630,13 @@ static void setgain(struct gspca_dev *gspca_dev)
        case SENSOR_OV7630: {
                __u8 i2c[] = {0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
 
+               /*
+                * The ov7630's gain is weird, at 32 the gain drops to the
+                * same level as at 16, so skip 32-47 (of the 0-63 scale).
+                */
+               if (sd->sensor == SENSOR_OV7630 && gain >= 32)
+                       gain += 16;
+
                i2c[1] = sensor_data[sd->sensor].sensor_addr;
                i2c[3] = gain;
                i2c_w(gspca_dev, i2c);
@@ -1017,9 +1024,12 @@ static int sd_init_controls(struct gspca_dev *gspca_dev)
                gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
                                        V4L2_CID_GAIN, 0, 31, 1, 15);
                break;
-       case SENSOR_HV7131D:
        case SENSOR_OV7630:
                gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
+                                       V4L2_CID_GAIN, 0, 47, 1, 31);
+               break;
+       case SENSOR_HV7131D:
+               gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
                                        V4L2_CID_GAIN, 0, 63, 1, 31);
                break;
        case SENSOR_TAS5110C: