diff options
author | Jean-François Moine <moinejf@free.fr> | 2010-04-25 13:41:51 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-05-19 11:58:14 -0400 |
commit | e3302cad9bc111e158e03eff763dff36bce02fe6 (patch) | |
tree | 62e80750af97d5ef26a5c35e805e8adeb6057608 | |
parent | 0a85c74b5d48f6cb41770ec3951a582738446b33 (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.c | 41 |
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) | |||
1498 | static void ov7648_probe(struct gspca_dev *gspca_dev) | 1498 | static 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 */ |
1534 | static void po2030n_probe(struct gspca_dev *gspca_dev) | 1534 | static 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 | ||
1573 | static void bridge_init(struct gspca_dev *gspca_dev, | 1570 | static void bridge_init(struct gspca_dev *gspca_dev, |