aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJean-François Moine <moinejf@free.fr>2012-03-24 08:23:56 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-05-03 14:29:55 -0400
commitc4407fe86d3856f60ec711e025bbe9a0159354a3 (patch)
treef21ecb7f4e0fc4c986c1a2fea14773c6f13e8ae8 /drivers
parentdae1de645e41a5d7f36686ebcb62987545f95e94 (diff)
[media] gspca - sn9c20x: Set the i2c interface speed
The i2c interface speed was set to 400 Kb/s while it is 100 Kb/s for most sensors. Signed-off-by: Jean-François Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/gspca/sn9c20x.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/drivers/media/video/gspca/sn9c20x.c b/drivers/media/video/gspca/sn9c20x.c
index 0958a93e0b82..c5b42e4ac9b4 100644
--- a/drivers/media/video/gspca/sn9c20x.c
+++ b/drivers/media/video/gspca/sn9c20x.c
@@ -105,6 +105,7 @@ struct sd {
105 u8 exposure_step; 105 u8 exposure_step;
106 106
107 u8 i2c_addr; 107 u8 i2c_addr;
108 u8 i2c_intf;
108 u8 sensor; 109 u8 sensor;
109 u8 hstart; 110 u8 hstart;
110 u8 vstart; 111 u8 vstart;
@@ -1168,7 +1169,7 @@ static void i2c_w1(struct gspca_dev *gspca_dev, u8 reg, u8 val)
1168 * from the point of view of the bridge, the length 1169 * from the point of view of the bridge, the length
1169 * includes the address 1170 * includes the address
1170 */ 1171 */
1171 row[0] = 0x81 | (2 << 4); 1172 row[0] = sd->i2c_intf | (2 << 4);
1172 row[1] = sd->i2c_addr; 1173 row[1] = sd->i2c_addr;
1173 row[2] = reg; 1174 row[2] = reg;
1174 row[3] = val; 1175 row[3] = val;
@@ -1198,7 +1199,7 @@ static void i2c_w2(struct gspca_dev *gspca_dev, u8 reg, u16 val)
1198 * from the point of view of the bridge, the length 1199 * from the point of view of the bridge, the length
1199 * includes the address 1200 * includes the address
1200 */ 1201 */
1201 row[0] = 0x81 | (3 << 4); 1202 row[0] = sd->i2c_intf | (3 << 4);
1202 row[1] = sd->i2c_addr; 1203 row[1] = sd->i2c_addr;
1203 row[2] = reg; 1204 row[2] = reg;
1204 row[3] = val >> 8; 1205 row[3] = val >> 8;
@@ -1224,7 +1225,7 @@ static void i2c_r1(struct gspca_dev *gspca_dev, u8 reg, u8 *val)
1224 struct sd *sd = (struct sd *) gspca_dev; 1225 struct sd *sd = (struct sd *) gspca_dev;
1225 u8 row[8]; 1226 u8 row[8];
1226 1227
1227 row[0] = 0x81 | (1 << 4); 1228 row[0] = sd->i2c_intf | (1 << 4);
1228 row[1] = sd->i2c_addr; 1229 row[1] = sd->i2c_addr;
1229 row[2] = reg; 1230 row[2] = reg;
1230 row[3] = 0; 1231 row[3] = 0;
@@ -1233,7 +1234,7 @@ static void i2c_r1(struct gspca_dev *gspca_dev, u8 reg, u8 *val)
1233 row[6] = 0; 1234 row[6] = 0;
1234 row[7] = 0x10; 1235 row[7] = 0x10;
1235 i2c_w(gspca_dev, row); 1236 i2c_w(gspca_dev, row);
1236 row[0] = 0x81 | (1 << 4) | 0x02; 1237 row[0] = sd->i2c_intf | (1 << 4) | 0x02;
1237 row[2] = 0; 1238 row[2] = 0;
1238 i2c_w(gspca_dev, row); 1239 i2c_w(gspca_dev, row);
1239 reg_r(gspca_dev, 0x10c2, 5); 1240 reg_r(gspca_dev, 0x10c2, 5);
@@ -1245,7 +1246,7 @@ static void i2c_r2(struct gspca_dev *gspca_dev, u8 reg, u16 *val)
1245 struct sd *sd = (struct sd *) gspca_dev; 1246 struct sd *sd = (struct sd *) gspca_dev;
1246 u8 row[8]; 1247 u8 row[8];
1247 1248
1248 row[0] = 0x81 | (1 << 4); 1249 row[0] = sd->i2c_intf | (1 << 4);
1249 row[1] = sd->i2c_addr; 1250 row[1] = sd->i2c_addr;
1250 row[2] = reg; 1251 row[2] = reg;
1251 row[3] = 0; 1252 row[3] = 0;
@@ -1254,7 +1255,7 @@ static void i2c_r2(struct gspca_dev *gspca_dev, u8 reg, u16 *val)
1254 row[6] = 0; 1255 row[6] = 0;
1255 row[7] = 0x10; 1256 row[7] = 0x10;
1256 i2c_w(gspca_dev, row); 1257 i2c_w(gspca_dev, row);
1257 row[0] = 0x81 | (2 << 4) | 0x02; 1258 row[0] = sd->i2c_intf | (2 << 4) | 0x02;
1258 row[2] = 0; 1259 row[2] = 0;
1259 i2c_w(gspca_dev, row); 1260 i2c_w(gspca_dev, row);
1260 reg_r(gspca_dev, 0x10c2, 5); 1261 reg_r(gspca_dev, 0x10c2, 5);
@@ -1642,7 +1643,8 @@ static void set_hvflip(struct gspca_dev *gspca_dev)
1642static void set_exposure(struct gspca_dev *gspca_dev) 1643static void set_exposure(struct gspca_dev *gspca_dev)
1643{ 1644{
1644 struct sd *sd = (struct sd *) gspca_dev; 1645 struct sd *sd = (struct sd *) gspca_dev;
1645 u8 exp[8] = {0x81, sd->i2c_addr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e}; 1646 u8 exp[8] = {sd->i2c_intf, sd->i2c_addr,
1647 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e};
1646 int expo; 1648 int expo;
1647 1649
1648 expo = sd->ctrls[EXPOSURE].val; 1650 expo = sd->ctrls[EXPOSURE].val;
@@ -1680,7 +1682,8 @@ static void set_exposure(struct gspca_dev *gspca_dev)
1680static void set_gain(struct gspca_dev *gspca_dev) 1682static void set_gain(struct gspca_dev *gspca_dev)
1681{ 1683{
1682 struct sd *sd = (struct sd *) gspca_dev; 1684 struct sd *sd = (struct sd *) gspca_dev;
1683 u8 gain[8] = {0x81, sd->i2c_addr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d}; 1685 u8 gain[8] = {sd->i2c_intf, sd->i2c_addr,
1686 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d};
1684 int g; 1687 int g;
1685 1688
1686 g = sd->ctrls[GAIN].val; 1689 g = sd->ctrls[GAIN].val;
@@ -1828,6 +1831,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
1828 sd->sensor = id->driver_info >> 8; 1831 sd->sensor = id->driver_info >> 8;
1829 sd->i2c_addr = id->driver_info; 1832 sd->i2c_addr = id->driver_info;
1830 sd->flags = id->driver_info >> 16; 1833 sd->flags = id->driver_info >> 16;
1834 sd->i2c_intf = 0x80; /* i2c 100 Kb/s */
1831 1835
1832 switch (sd->sensor) { 1836 switch (sd->sensor) {
1833 case SENSOR_MT9M112: 1837 case SENSOR_MT9M112:
@@ -1841,6 +1845,9 @@ static int sd_config(struct gspca_dev *gspca_dev,
1841 cam->cam_mode = mono_mode; 1845 cam->cam_mode = mono_mode;
1842 cam->nmodes = ARRAY_SIZE(mono_mode); 1846 cam->nmodes = ARRAY_SIZE(mono_mode);
1843 break; 1847 break;
1848 case SENSOR_HV7131R:
1849 sd->i2c_intf = 0x81; /* i2c 400 Kb/s */
1850 /* fall thru */
1844 default: 1851 default:
1845 cam->cam_mode = vga_mode; 1852 cam->cam_mode = vga_mode;
1846 cam->nmodes = ARRAY_SIZE(vga_mode); 1853 cam->nmodes = ARRAY_SIZE(vga_mode);