From 35f33378721e6f823dde92b83dd9f37348905cd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Andr=C3=A9n?= Date: Wed, 26 Nov 2008 17:32:46 +0100 Subject: Add flush control to each sensor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Erik Andrén Priority: normal Signed-off-by: Erik Andrén --- linux/drivers/media/video/gspca/m5602/m5602_core.c | 11 ++++++++--- linux/drivers/media/video/gspca/m5602/m5602_mt9m111.h | 1 + linux/drivers/media/video/gspca/m5602/m5602_ov9650.h | 2 ++ linux/drivers/media/video/gspca/m5602/m5602_po1030.h | 1 + linux/drivers/media/video/gspca/m5602/m5602_s5k4aa.h | 5 ++++- linux/drivers/media/video/gspca/m5602/m5602_s5k83a.h | 3 +++ linux/drivers/media/video/gspca/m5602/m5602_sensor.h | 2 ++ 7 files changed, 21 insertions(+), 4 deletions(-) (limited to 'linux/drivers') diff --git a/linux/drivers/media/video/gspca/m5602/m5602_core.c b/linux/drivers/media/video/gspca/m5602/m5602_core.c index 1d1fb541f..d86b905cb 100644 --- a/linux/drivers/media/video/gspca/m5602/m5602_core.c +++ b/linux/drivers/media/video/gspca/m5602/m5602_core.c @@ -85,6 +85,9 @@ 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); @@ -102,9 +105,11 @@ int m5602_read_sensor(struct sd *sd, const u8 address, if (err < 0) goto out; - err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x08); - if (err < 0) - goto out; + if (sd->sensor->i2c_need_flush) { + err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x08); + if (err < 0) + goto out; + } for (i = 0; (i < len) && !err; i++) { err = m5602_read_bridge(sd, M5602_XB_I2C_DATA, &(i2c_data[i])); diff --git a/linux/drivers/media/video/gspca/m5602/m5602_mt9m111.h b/linux/drivers/media/video/gspca/m5602/m5602_mt9m111.h index 763b17ee6..db64c122b 100644 --- a/linux/drivers/media/video/gspca/m5602/m5602_mt9m111.h +++ b/linux/drivers/media/video/gspca/m5602/m5602_mt9m111.h @@ -102,6 +102,7 @@ static struct m5602_sensor mt9m111 = { .i2c_slave_id = 0xba, .i2c_regW = 2, + .i2c_need_flush = 0, .probe = mt9m111_probe, .init = mt9m111_init, diff --git a/linux/drivers/media/video/gspca/m5602/m5602_ov9650.h b/linux/drivers/media/video/gspca/m5602/m5602_ov9650.h index 1f33a7b8d..732447932 100644 --- a/linux/drivers/media/video/gspca/m5602/m5602_ov9650.h +++ b/linux/drivers/media/video/gspca/m5602/m5602_ov9650.h @@ -152,6 +152,8 @@ static struct m5602_sensor ov9650 = { .name = "OV9650", .i2c_slave_id = 0x60, .i2c_regW = 1, + .i2c_need_flush = 1, + .probe = ov9650_probe, .init = ov9650_init, .power_down = ov9650_power_down, diff --git a/linux/drivers/media/video/gspca/m5602/m5602_po1030.h b/linux/drivers/media/video/gspca/m5602/m5602_po1030.h index c4dad6449..a44a4ac6b 100644 --- a/linux/drivers/media/video/gspca/m5602/m5602_po1030.h +++ b/linux/drivers/media/video/gspca/m5602/m5602_po1030.h @@ -149,6 +149,7 @@ static struct m5602_sensor po1030 = { .i2c_slave_id = 0xdc, .i2c_regW = 1, + .i2c_need_flush = 1, .probe = po1030_probe, .init = po1030_init, diff --git a/linux/drivers/media/video/gspca/m5602/m5602_s5k4aa.h b/linux/drivers/media/video/gspca/m5602/m5602_s5k4aa.h index a38103a88..8088e8ea4 100644 --- a/linux/drivers/media/video/gspca/m5602/m5602_s5k4aa.h +++ b/linux/drivers/media/video/gspca/m5602/m5602_s5k4aa.h @@ -83,9 +83,12 @@ static struct m5602_sensor s5k4aa = { .name = "S5K4AA", .probe = s5k4aa_probe, .init = s5k4aa_init, - .power_down = s5k4aa_power_down, + .i2c_slave_id = 0x5a, .i2c_regW = 2, + .i2c_need_flush = 1, + + .power_down = s5k4aa_power_down, .nctrls = 4, .ctrls = { { diff --git a/linux/drivers/media/video/gspca/m5602/m5602_s5k83a.h b/linux/drivers/media/video/gspca/m5602/m5602_s5k83a.h index 735701127..e721229eb 100644 --- a/linux/drivers/media/video/gspca/m5602/m5602_s5k83a.h +++ b/linux/drivers/media/video/gspca/m5602/m5602_s5k83a.h @@ -65,8 +65,11 @@ static struct m5602_sensor s5k83a = { .probe = s5k83a_probe, .init = s5k83a_init, .power_down = s5k83a_power_down, + .i2c_slave_id = 0x5a, .i2c_regW = 2, + .i2c_need_flush = 0, + .nctrls = 5, .ctrls = { { diff --git a/linux/drivers/media/video/gspca/m5602/m5602_sensor.h b/linux/drivers/media/video/gspca/m5602/m5602_sensor.h index 23c0ef948..0f6e1d83f 100644 --- a/linux/drivers/media/video/gspca/m5602/m5602_sensor.h +++ b/linux/drivers/media/video/gspca/m5602/m5602_sensor.h @@ -52,6 +52,8 @@ struct m5602_sensor { /* Width of each i2c register (in bytes) */ u8 i2c_regW; + u8 i2c_need_flush; + /* Probes if the sensor is connected */ int (*probe)(struct sd *sd); -- cgit v1.2.3