aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorErik Andrén <erik.andren@gmail.com>2008-11-27 11:41:55 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-12-30 06:39:53 -0500
commitedbfbdb3bdcf9ae90ce06b92636a07c05224fe45 (patch)
tree53b1eb77e6b0199f4356da1a459ab3cd7fd4f540 /drivers/media
parente7a7f5103bddf2491760677cdd715a865b889072 (diff)
V4L/DVB (10018): gspca - m5602 - ov9650: Use generic read_sensor function
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>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/video/gspca/m5602/m5602_core.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/media/video/gspca/m5602/m5602_core.c b/drivers/media/video/gspca/m5602/m5602_core.c
index aaba42058181..691b09a94e85 100644
--- a/drivers/media/video/gspca/m5602/m5602_core.c
+++ b/drivers/media/video/gspca/m5602/m5602_core.c
@@ -85,9 +85,14 @@ int m5602_read_sensor(struct sd *sd, const u8 address,
85{ 85{
86 int err, i; 86 int err, i;
87 87
88 if (!len || len > sd->sensor->i2c_regW)
89 return -EINVAL;
90
88 do { 91 do {
89 err = m5602_read_bridge(sd, M5602_XB_I2C_STATUS, i2c_data); 92 err = m5602_read_bridge(sd, M5602_XB_I2C_STATUS, i2c_data);
90 } while ((*i2c_data & I2C_BUSY) && !err); 93 } while ((*i2c_data & I2C_BUSY) && !err);
94 if (err < 0)
95 goto out;
91 96
92 err = m5602_write_bridge(sd, M5602_XB_I2C_DEV_ADDR, 97 err = m5602_write_bridge(sd, M5602_XB_I2C_DEV_ADDR,
93 sd->sensor->i2c_slave_id); 98 sd->sensor->i2c_slave_id);
@@ -98,13 +103,19 @@ int m5602_read_sensor(struct sd *sd, const u8 address,
98 if (err < 0) 103 if (err < 0)
99 goto out; 104 goto out;
100 105
101 err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x10 + len); 106 if (sd->sensor->i2c_regW == 1) {
102 if (err < 0) 107 err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, len);
103 goto out; 108 if (err < 0)
109 goto out;
104 110
105 err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x08); 111 err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x08);
106 if (err < 0) 112 if (err < 0)
107 goto out; 113 goto out;
114 } else {
115 err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x18 + len);
116 if (err < 0)
117 goto out;
118 }
108 119
109 for (i = 0; (i < len) && !err; i++) { 120 for (i = 0; (i < len) && !err; i++) {
110 err = m5602_read_bridge(sd, M5602_XB_I2C_DATA, &(i2c_data[i])); 121 err = m5602_read_bridge(sd, M5602_XB_I2C_DATA, &(i2c_data[i]));