V4L/DVB (9585): Skip reading eeprom in newer Empia devices
authorDevin Heitmueller <devin.heitmueller@gmail.com>
Wed, 12 Nov 2008 05:05:10 +0000 (02:05 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 29 Dec 2008 19:53:32 +0000 (17:53 -0200)
Empia switched to a 16-bit addressable eeprom in newer devices.  While we
could certainly write a routine to read the eeprom, there is nothing of use
in there that cannot be accessed through registers, and there is the risk that
we could corrupt the eeprom (since a 16-bit read call is interpreted as a
write call by 8-bit eeproms).  So just be safe and bail out of the function.

Thanks for Ray Lu from Empia for providing the em2874 datasheet.

Signed-off-by: Devin Heitmueller <devin.heitmueller@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/em28xx/em28xx-i2c.c

index 2360c61ddca97e2930a69ab646648da96337d86a..ec3e3b157ba868fb51e402df4d75424dcbafba81 100644 (file)
@@ -332,6 +332,17 @@ static int em28xx_i2c_eeprom(struct em28xx *dev, unsigned char *eedata, int len)
        struct em28xx_eeprom *em_eeprom = (void *)eedata;
        int i, err, size = len, block;
 
+       if (dev->chip_id == CHIP_ID_EM2874) {
+               /* Empia switched to a 16-bit addressable eeprom in newer
+                  devices.  While we could certainly write a routine to read
+                  the eeprom, there is nothing of use in there that cannot be
+                  accessed through registers, and there is the risk that we
+                  could corrupt the eeprom (since a 16-bit read call is
+                  interpreted as a write call by 8-bit eeproms).
+               */
+               return 0;
+       }
+
        dev->i2c_client.addr = 0xa0 >> 1;
 
        /* Check if board has eeprom */