V4L/DVB (6551): tda8290: rule out tda988x before detecting tda8290/tda8295
authorMichael Krufky <mkrufky@linuxtv.org>
Sun, 4 Nov 2007 14:03:22 +0000 (11:03 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Fri, 25 Jan 2008 21:01:58 +0000 (19:01 -0200)
To ensure prevention of detecting a tda9885/6/7 as a tda8290 or tda8295, we
will rule out the tda988x before testing the tda8290 / tda8295 id registers.

We read 8 bytes from the chip.  If they are all equal, then it is not a
tda829x, or some other error has occurred.

Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/tda8290.c

index 18e6a09642fa1e925567bc1184c2aab9b2c23772..f0191babe40cfe78ee9ebf2f8cb77a4e9b721860 100644 (file)
@@ -746,6 +746,22 @@ int tda829x_probe(struct tuner *t)
        unsigned char restore_9886[] = { 0x00, 0xd6, 0x30 };
        unsigned char addr_dto_lsb = 0x07;
        unsigned char data;
+#define PROBE_BUFFER_SIZE 8
+       unsigned char buf[PROBE_BUFFER_SIZE];
+       int i;
+
+       /* rule out tda9887, which would return the same byte repeatedly */
+       tuner_i2c_xfer_send(&i2c_props, soft_reset, 1);
+       tuner_i2c_xfer_recv(&i2c_props, buf, PROBE_BUFFER_SIZE);
+       for (i = 1; i < PROBE_BUFFER_SIZE; i++) {
+               if (buf[i] == buf[0])
+                       continue;
+               break;
+       }
+
+       /* all bytes are equal, not a tda829x - probably a tda9887 */
+       if (i == PROBE_BUFFER_SIZE)
+               return -ENODEV;
 
        if ((tda8290_probe(&i2c_props) == 0) ||
            (tda8295_probe(&i2c_props) == 0))