V4L/DVB (11426): gspca - m5602: Don't touch hflip/vflip register on Read/Modify/Write
authorErik Andr?n <erik.andren@gmail.com>
Sun, 4 Jan 2009 10:28:42 +0000 (07:28 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 7 Apr 2009 00:44:47 +0000 (21:44 -0300)
Touching the hflip/vflip register while doing the read/modify/write corrupts the image. Just read from the sensor ctrl cache instead and all is good.

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_ov9650.c

index 9c79a516db6140d7ffcf966494d24f6bdd660ef1..7967a651c4dbe59c1a94cf82a837f4b38e92a580 100644 (file)
@@ -662,12 +662,7 @@ int ov9650_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
        PDEBUG(D_V4L2, "Set horizontal flip to %d", val);
 
        sensor_settings[HFLIP_IDX] = val;
-       err = m5602_read_sensor(sd, OV9650_MVFP, &i2c_data, 1);
-       if (err < 0)
-               return err;
-
-       i2c_data = ((i2c_data & 0xdf) | ((val & 0x01) << 5));
-
+       i2c_data = ((val & 0x01) << 5) | (sensor_settings[VFLIP_IDX] << 4);
        err = m5602_write_sensor(sd, OV9650_MVFP, &i2c_data, 1);
 
        return err;
@@ -692,19 +687,14 @@ int ov9650_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
        s32 *sensor_settings = sd->sensor_priv;
 
        PDEBUG(D_V4L2, "Set vertical flip to %d", val);
-
        sensor_settings[VFLIP_IDX] = val;
-       err = m5602_read_sensor(sd, OV9650_MVFP, &i2c_data, 1);
-       if (err < 0)
-               return err;
-
-       i2c_data = ((i2c_data & 0xef) | ((val & 0x01) << 4));
 
+       i2c_data = ((val & 0x01) << 4) | (sensor_settings[VFLIP_IDX] << 5);
        err = m5602_write_sensor(sd, OV9650_MVFP, &i2c_data, 1);
-
        if (err < 0)
                return err;
 
+       /* When vflip is toggled we need to readjust the bridge hsync/vsync */
        if (gspca_dev->streaming)
                err = ov9650_start(sd);