V4L/DVB (10018): gspca - m5602 - ov9650: Use generic read_sensor function
authorErik Andrén <erik.andren@gmail.com>
Thu, 27 Nov 2008 16:41:55 +0000 (13:41 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 30 Dec 2008 11:39:53 +0000 (09:39 -0200)
Toggle read sensor sequence depending on type of sensor. Check that no
more than max width of a sensor is read.

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/m5602/m5602_core.c

index aaba42058181469e6b6f23d5e3c6d32080b9f935..691b09a94e85e57c47707c2fb6ce0035c1fda89d 100644 (file)
@@ -85,9 +85,14 @@ int m5602_read_sensor(struct sd *sd, const u8 address,
 {
        int err, i;
 
+       if (!len || len > sd->sensor->i2c_regW)
+               return -EINVAL;
+
        do {
                err = m5602_read_bridge(sd, M5602_XB_I2C_STATUS, i2c_data);
        } while ((*i2c_data & I2C_BUSY) && !err);
+       if (err < 0)
+               goto out;
 
        err = m5602_write_bridge(sd, M5602_XB_I2C_DEV_ADDR,
                                 sd->sensor->i2c_slave_id);
@@ -98,13 +103,19 @@ int m5602_read_sensor(struct sd *sd, const u8 address,
        if (err < 0)
                goto out;
 
-       err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x10 + len);
-       if (err < 0)
-               goto out;
+       if (sd->sensor->i2c_regW == 1) {
+               err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, len);
+               if (err < 0)
+                       goto out;
 
-       err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x08);
-       if (err < 0)
-               goto out;
+               err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x08);
+               if (err < 0)
+                       goto out;
+       } else {
+               err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x18 + len);
+               if (err < 0)
+                       goto out;
+       }
 
        for (i = 0; (i < len) && !err; i++) {
                err = m5602_read_bridge(sd, M5602_XB_I2C_DATA, &(i2c_data[i]));