V4L/DVB (10432): gspca - vc032x: Cleanup source, optimize and check i2c_write.
authorJean-Francois Moine <moinejf@free.fr>
Mon, 2 Feb 2009 09:33:31 +0000 (06:33 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:42:37 +0000 (12:42 -0300)
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/vc032x.c

index be1507ac0262e77589e17f0b909b5f1fedb3f88d..f8d535ce90814d658c5cdb3d1d75182607c6b348 100644 (file)
@@ -1927,44 +1927,40 @@ static void reg_w(struct usb_device *dev,
                        500);
 }
 
-static void read_sensor_register(struct gspca_dev *gspca_dev,
-                               __u16 address, __u16 *value)
+static u16 read_sensor_register(struct gspca_dev *gspca_dev,
+                               u16 address)
 {
        struct usb_device *dev = gspca_dev->dev;
        __u8 ldata, mdata, hdata;
        int retry = 50;
 
-       *value = 0;
-
        reg_r(gspca_dev, 0xa1, 0xb33f, 1);
-       /*PDEBUG(D_PROBE, " I2c Bus Busy Wait  0x%02X ", tmpvalue); */
        if (!(gspca_dev->usb_buf[0] & 0x02)) {
-               PDEBUG(D_ERR, "I2c Bus Busy Wait %d",
-                       gspca_dev->usb_buf[0] & 0x02);
-               return;
+               PDEBUG(D_ERR, "I2c Bus Busy Wait %02x",
+                       gspca_dev->usb_buf[0]);
+               return 0;
        }
        reg_w(dev, 0xa0, address, 0xb33a);
        reg_w(dev, 0xa0, 0x02, 0xb339);
 
-       reg_r(gspca_dev, 0xa1, 0xb33b, 1);
-       while (retry-- && gspca_dev->usb_buf[0]) {
+       do {
+               msleep(8);
                reg_r(gspca_dev, 0xa1, 0xb33b, 1);
-/*             PDEBUG(D_PROBE, "Read again 0xb33b %d", tmpvalue); */
-               msleep(1);
-       }
+       } while (retry-- && gspca_dev->usb_buf[0]);
+
        reg_r(gspca_dev, 0xa1, 0xb33e, 1);
        ldata = gspca_dev->usb_buf[0];
        reg_r(gspca_dev, 0xa1, 0xb33d, 1);
        mdata = gspca_dev->usb_buf[0];
        reg_r(gspca_dev, 0xa1, 0xb33c, 1);
        hdata = gspca_dev->usb_buf[0];
-       PDEBUG(D_PROBE, "Read Sensor %02x%02x %02x",
-               hdata, mdata, ldata);
+       if (hdata != 0 && mdata != 0 && ldata != 0)
+               PDEBUG(D_PROBE, "Read Sensor %02x%02x %02x",
+                       hdata, mdata, ldata);
        reg_r(gspca_dev, 0xa1, 0xb334, 1);
        if (gspca_dev->usb_buf[0] == 0x02)
-               *value = (hdata << 8) + mdata;
-       else
-               *value = hdata;
+               return (hdata << 8) + mdata;
+       return hdata;
 }
 
 static int vc032x_probe_sensor(struct gspca_dev *gspca_dev)
@@ -1985,7 +1981,7 @@ static int vc032x_probe_sensor(struct gspca_dev *gspca_dev)
                reg_w(dev, 0xa0, 0x0c, 0xb309);
                reg_w(dev, 0xa0, ptsensor_info->I2cAdd, 0xb335);
                reg_w(dev, 0xa0, ptsensor_info->op, 0xb301);
-               read_sensor_register(gspca_dev, ptsensor_info->IdAdd, &value);
+               value = read_sensor_register(gspca_dev, ptsensor_info->IdAdd);
                if (value == ptsensor_info->VpId)
                        return ptsensor_info->sensorId;
 
@@ -1997,13 +1993,16 @@ static int vc032x_probe_sensor(struct gspca_dev *gspca_dev)
        return -1;
 }
 
-static __u8 i2c_write(struct gspca_dev *gspca_dev,
+static void i2c_write(struct gspca_dev *gspca_dev,
                        __u8 reg, const __u8 *val, __u8 size)
 {
        struct usb_device *dev = gspca_dev->dev;
+       int retry;
 
+#ifdef GSPCA_DEBUG
        if (size > 3 || size < 1)
-               return -EINVAL;
+               return;
+#endif
        reg_r(gspca_dev, 0xa1, 0xb33f, 1);
        reg_w(dev, 0xa0, size, 0xb334);
        reg_w(dev, 0xa0, reg, 0xb33a);
@@ -2015,18 +2014,23 @@ static __u8 i2c_write(struct gspca_dev *gspca_dev,
                reg_w(dev, 0xa0, val[0], 0xb336);
                reg_w(dev, 0xa0, val[1], 0xb337);
                break;
-       case 3:
+       default:
+/*     case 3: */
                reg_w(dev, 0xa0, val[0], 0xb336);
                reg_w(dev, 0xa0, val[1], 0xb337);
                reg_w(dev, 0xa0, val[2], 0xb338);
                break;
-       default:
-               reg_w(dev, 0xa0, 0x01, 0xb334);
-               return -EINVAL;
        }
        reg_w(dev, 0xa0, 0x01, 0xb339);
-       reg_r(gspca_dev, 0xa1, 0xb33b, 1);
-       return gspca_dev->usb_buf[0] == 0;
+       retry = 4;
+       do {
+               reg_r(gspca_dev, 0xa1, 0xb33b, 1);
+               if (gspca_dev->usb_buf[0] == 0)
+                       break;
+               msleep(20);
+       } while (--retry > 0);
+       if (retry <= 0)
+               PDEBUG(D_ERR, "i2c_write failed");
 }
 
 static void put_tab_to_reg(struct gspca_dev *gspca_dev,
@@ -2051,7 +2055,7 @@ static void usb_exchange(struct gspca_dev *gspca_dev,
                        return;
                case 0xcc:                      /* normal write */
                        reg_w(dev, 0xa0, data[i][2],
-                                       ((data[i][0])<<8) | data[i][1]);
+                                       (data[i][0]) << 8 | data[i][1]);
                        break;
                case 0xaa:                      /* i2c op */
                        i2c_write(gspca_dev, data[i][1], &data[i][2], 1);
@@ -2068,11 +2072,6 @@ static void usb_exchange(struct gspca_dev *gspca_dev,
        /*not reached*/
 }
 
-/*
- "GammaT"=hex:04,17,31,4f,6a,83,99,ad,bf,ce,da,e5,ee,f5,fb,ff,ff
- "MatrixT"=hex:60,f9,e5,e7,50,05,f3,e6,66
- */
-
 static void vc0321_reset(struct gspca_dev *gspca_dev)
 {
        reg_w(gspca_dev->dev, 0xa0, 0x00, 0xb04d);
@@ -2176,7 +2175,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
        return 0;
 }
 
-/* this function is called at probe and time */
+/* this function is called at probe and resume time */
 static int sd_init(struct gspca_dev *gspca_dev)
 {
        return 0;
@@ -2332,27 +2331,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
                put_tab_to_reg(gspca_dev, GammaT, 17, 0xb85b);
                put_tab_to_reg(gspca_dev, GammaT, 17, 0xb86c);
                put_tab_to_reg(gspca_dev, MatrixT, 9, 0xb82c);
-               /* Seem SHARPNESS */
-               /*
-               reg_w(gspca_dev->dev, 0xa0, 0x80, 0xb80a);
-               reg_w(gspca_dev->dev, 0xa0, 0xff, 0xb80b);
-               reg_w(gspca_dev->dev, 0xa0, 0xff, 0xb80e);
-               */
-               /* all 0x40 ??? do nothing
-               reg_w(gspca_dev->dev, 0xa0, 0x40, 0xb822);
-               reg_w(gspca_dev->dev, 0xa0, 0x40, 0xb823);
-               reg_w(gspca_dev->dev, 0xa0, 0x40, 0xb824);
-               */
-               /* Only works for HV7131R ??
-               reg_r (gspca_dev, 0xa1, 0xb881, 1);
-               reg_w(gspca_dev->dev, 0xa0, 0xfe01, 0xb881);
-               reg_w(gspca_dev->dev, 0xa0, 0x79, 0xb801);
-               */
-               /* only hv7131r et ov7660
-               reg_w(gspca_dev->dev, 0xa0, 0x20, 0xb827);
-               reg_w(gspca_dev->dev, 0xa0, 0xff, 0xb826); * ISP_GAIN 80
-               reg_w(gspca_dev->dev, 0xa0, 0x23, 0xb800); * ISP CTRL_BAS
-               */
+
                /* set the led on 0x0892 0x0896 */
                if (sd->sensor != SENSOR_PO1200) {
                        reg_w(gspca_dev->dev, 0x89, 0xffff, 0xfdff);
@@ -2502,7 +2481,8 @@ static int sd_querymenu(struct gspca_dev *gspca_dev,
                case 1:         /* V4L2_CID_POWER_LINE_FREQUENCY_50HZ */
                        strcpy((char *) menu->name, "50 Hz");
                        return 0;
-               case 2:         /* V4L2_CID_POWER_LINE_FREQUENCY_60HZ */
+               default:
+/*             case 2:          * V4L2_CID_POWER_LINE_FREQUENCY_60HZ */
                        strcpy((char *) menu->name, "60 Hz");
                        return 0;
                }
@@ -2565,6 +2545,7 @@ static struct usb_driver sd_driver = {
 static int __init sd_mod_init(void)
 {
        int ret;
+
        ret = usb_register(&sd_driver);
        if (ret < 0)
                return ret;