aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-François Moine <moinejf@free.fr>2010-04-25 13:41:51 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-05-19 11:58:14 -0400
commite3302cad9bc111e158e03eff763dff36bce02fe6 (patch)
tree62e80750af97d5ef26a5c35e805e8adeb6057608
parent0a85c74b5d48f6cb41770ec3951a582738446b33 (diff)
V4L/DVB: gspca - sonixj: Reset the bridge after sensor probe
Signed-off-by: Jean-François Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/video/gspca/sonixj.c41
1 files changed, 19 insertions, 22 deletions
diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c
index a4ca3c11c429..19ae4f5ca73c 100644
--- a/drivers/media/video/gspca/sonixj.c
+++ b/drivers/media/video/gspca/sonixj.c
@@ -1498,42 +1498,43 @@ static void mi0360_probe(struct gspca_dev *gspca_dev)
1498static void ov7648_probe(struct gspca_dev *gspca_dev) 1498static void ov7648_probe(struct gspca_dev *gspca_dev)
1499{ 1499{
1500 struct sd *sd = (struct sd *) gspca_dev; 1500 struct sd *sd = (struct sd *) gspca_dev;
1501 u16 val;
1501 1502
1502 /* check ov76xx */ 1503 /* check ov76xx */
1503 reg_w1(gspca_dev, 0x17, 0x62); 1504 reg_w1(gspca_dev, 0x17, 0x62);
1504 reg_w1(gspca_dev, 0x01, 0x08); 1505 reg_w1(gspca_dev, 0x01, 0x08);
1505 sd->i2c_addr = 0x21; 1506 sd->i2c_addr = 0x21;
1506 i2c_r(gspca_dev, 0x0a, 2); 1507 i2c_r(gspca_dev, 0x0a, 2);
1507 if (gspca_dev->usb_buf[3] == 0x76) { /* ov76xx */ 1508 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
1508 PDEBUG(D_PROBE, "Sensor ov%02x%02x",
1509 gspca_dev->usb_buf[3], gspca_dev->usb_buf[4]);
1510 return;
1511 }
1512
1513 /* reset */
1514 reg_w1(gspca_dev, 0x01, 0x29); 1509 reg_w1(gspca_dev, 0x01, 0x29);
1515 reg_w1(gspca_dev, 0x17, 0x42); 1510 reg_w1(gspca_dev, 0x17, 0x42);
1511 if ((val & 0xff00) == 0x7600) { /* ov76xx */
1512 PDEBUG(D_PROBE, "Sensor ov%04x", val);
1513 return;
1514 }
1516 1515
1517 /* check po1030 */ 1516 /* check po1030 */
1518 reg_w1(gspca_dev, 0x17, 0x62); 1517 reg_w1(gspca_dev, 0x17, 0x62);
1519 reg_w1(gspca_dev, 0x01, 0x08); 1518 reg_w1(gspca_dev, 0x01, 0x08);
1520 sd->i2c_addr = 0x6e; 1519 sd->i2c_addr = 0x6e;
1521 i2c_r(gspca_dev, 0x00, 2); 1520 i2c_r(gspca_dev, 0x00, 2);
1522 if (gspca_dev->usb_buf[3] == 0x10 /* po1030 */ 1521 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
1523 && gspca_dev->usb_buf[4] == 0x30) { 1522 reg_w1(gspca_dev, 0x01, 0x29);
1523 reg_w1(gspca_dev, 0x17, 0x42);
1524 if (val == 0x1030) { /* po1030 */
1524 PDEBUG(D_PROBE, "Sensor po1030"); 1525 PDEBUG(D_PROBE, "Sensor po1030");
1525 sd->sensor = SENSOR_PO1030; 1526 sd->sensor = SENSOR_PO1030;
1526 return; 1527 return;
1527 } 1528 }
1528 1529
1529 PDEBUG(D_PROBE, "Unknown sensor %02x%02x", 1530 PDEBUG(D_PROBE, "Unknown sensor %04x", val);
1530 gspca_dev->usb_buf[3], gspca_dev->usb_buf[4]);
1531} 1531}
1532 1532
1533/* 0c45:6142 sensor may be po2030n, gc0305 or gc0307 */ 1533/* 0c45:6142 sensor may be po2030n, gc0305 or gc0307 */
1534static void po2030n_probe(struct gspca_dev *gspca_dev) 1534static void po2030n_probe(struct gspca_dev *gspca_dev)
1535{ 1535{
1536 struct sd *sd = (struct sd *) gspca_dev; 1536 struct sd *sd = (struct sd *) gspca_dev;
1537 u16 val;
1537 1538
1538 /* check gc0307 */ 1539 /* check gc0307 */
1539 reg_w1(gspca_dev, 0x17, 0x62); 1540 reg_w1(gspca_dev, 0x17, 0x62);
@@ -1541,11 +1542,10 @@ static void po2030n_probe(struct gspca_dev *gspca_dev)
1541 reg_w1(gspca_dev, 0x02, 0x22); 1542 reg_w1(gspca_dev, 0x02, 0x22);
1542 sd->i2c_addr = 0x21; 1543 sd->i2c_addr = 0x21;
1543 i2c_r(gspca_dev, 0x00, 1); 1544 i2c_r(gspca_dev, 0x00, 1);
1544 1545 val = gspca_dev->usb_buf[4];
1545 reg_w1(gspca_dev, 0x01, 0x29); /* reset */ 1546 reg_w1(gspca_dev, 0x01, 0x29); /* reset */
1546 reg_w1(gspca_dev, 0x17, 0x42); 1547 reg_w1(gspca_dev, 0x17, 0x42);
1547 1548 if (val == 0x99) { /* gc0307 (?) */
1548 if (gspca_dev->usb_buf[4] == 0x99) { /* gc0307 (?) */
1549 PDEBUG(D_PROBE, "Sensor gc0307"); 1549 PDEBUG(D_PROBE, "Sensor gc0307");
1550 sd->sensor = SENSOR_GC0307; 1550 sd->sensor = SENSOR_GC0307;
1551 return; 1551 return;
@@ -1556,18 +1556,15 @@ static void po2030n_probe(struct gspca_dev *gspca_dev)
1556 reg_w1(gspca_dev, 0x01, 0x0a); 1556 reg_w1(gspca_dev, 0x01, 0x0a);
1557 sd->i2c_addr = 0x6e; 1557 sd->i2c_addr = 0x6e;
1558 i2c_r(gspca_dev, 0x00, 2); 1558 i2c_r(gspca_dev, 0x00, 2);
1559 1559 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
1560 reg_w1(gspca_dev, 0x01, 0x29); 1560 reg_w1(gspca_dev, 0x01, 0x29);
1561 reg_w1(gspca_dev, 0x17, 0x42); 1561 reg_w1(gspca_dev, 0x17, 0x42);
1562 1562 if (val == 0x2030) {
1563 if (gspca_dev->usb_buf[3] == 0x20
1564 && gspca_dev->usb_buf[4] == 0x30)
1565 PDEBUG(D_PROBE, "Sensor po2030n"); 1563 PDEBUG(D_PROBE, "Sensor po2030n");
1566/* sd->sensor = SENSOR_PO2030N; */ 1564/* sd->sensor = SENSOR_PO2030N; */
1567 else 1565 } else {
1568 PDEBUG(D_PROBE, "Unknown sensor ID %02x%02x", 1566 PDEBUG(D_PROBE, "Unknown sensor ID %04x", val);
1569 gspca_dev->usb_buf[3], 1567 }
1570 gspca_dev->usb_buf[4]);
1571} 1568}
1572 1569
1573static void bridge_init(struct gspca_dev *gspca_dev, 1570static void bridge_init(struct gspca_dev *gspca_dev,