[media] gspca_ov519: Fix support for the Terratec Terracam USB Pro
authorHans de Goede <hdegoede@redhat.com>
Thu, 22 Aug 2013 15:41:14 +0000 (12:41 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Sat, 24 Aug 2013 07:49:56 +0000 (04:49 -0300)
This is a camera with an ov518+ revision 0 bridge + ov7620ae sensor,
which appearently needs different handling then the Trust spacecam 320, which
has an ov518+ revision 2 + ov7620ae sensor. The Terracam USB Pro used to write
this patch has kindly been provided by
Dr. Tilmann Bubeck <t.bubeck@reinform.de>.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/usb/gspca/ov519.c

index a3958ee..8937d79 100644 (file)
@@ -75,6 +75,8 @@ struct sd {
                struct v4l2_ctrl *brightness;
        };
 
+       u8 revision;
+
        u8 packet_nr;
 
        char bridge;
@@ -3080,8 +3082,8 @@ static void ov518_configure(struct gspca_dev *gspca_dev)
        };
 
        /* First 5 bits of custom ID reg are a revision ID on OV518 */
-       PDEBUG(D_PROBE, "Device revision %d",
-               0x1f & reg_r(sd, R51x_SYS_CUST_ID));
+       sd->revision = reg_r(sd, R51x_SYS_CUST_ID) & 0x1f;
+       PDEBUG(D_PROBE, "Device revision %d", sd->revision);
 
        write_regvals(sd, init_518, ARRAY_SIZE(init_518));
 
@@ -3657,7 +3659,11 @@ static void ov518_mode_init_regs(struct sd *sd)
        reg_w(sd, 0x2f, 0x80);
 
        /******** Set the framerate ********/
-       sd->clockdiv = 1;
+       if (sd->bridge == BRIDGE_OV518PLUS && sd->revision == 0 &&
+                                             sd->sensor == SEN_OV7620AE)
+               sd->clockdiv = 0;
+       else
+               sd->clockdiv = 1;
 
        /* Mode independent, but framerate dependent, regs */
        /* 0x51: Clock divider; Only works on some cams which use 2 crystals */
@@ -3668,12 +3674,24 @@ static void ov518_mode_init_regs(struct sd *sd)
        if (sd->bridge == BRIDGE_OV518PLUS) {
                switch (sd->sensor) {
                case SEN_OV7620AE:
-                       if (sd->gspca_dev.width == 320) {
-                               reg_w(sd, 0x20, 0x00);
-                               reg_w(sd, 0x21, 0x19);
-                       } else {
+                       /*
+                        * HdG: 640x480 needs special handling on device
+                        * revision 2, we check for device revison > 0 to
+                        * avoid regressions, as we don't know the correct
+                        * thing todo for revision 1.
+                        *
+                        * Also this likely means we don't need to
+                        * differentiate between the OV7620 and OV7620AE,
+                        * earlier testing hitting this same problem likely
+                        * happened to be with revision < 2 cams using an
+                        * OV7620 and revision 2 cams using an OV7620AE.
+                        */
+                       if (sd->revision > 0 && sd->gspca_dev.width == 640) {
                                reg_w(sd, 0x20, 0x60);
                                reg_w(sd, 0x21, 0x1f);
+                       } else {
+                               reg_w(sd, 0x20, 0x00);
+                               reg_w(sd, 0x21, 0x19);
                        }
                        break;
                case SEN_OV7620: