summaryrefslogtreecommitdiff
path: root/linux
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2007-11-05 16:39:41 -0200
committerMauro Carvalho Chehab <mchehab@redhat.com>2007-11-05 16:39:41 -0200
commit5c8e36a5860b09fe0257d73844e52333433bb58a (patch)
tree1ace906205dcd870d220b265cfcb97900183e591 /linux
parent46852e874f94c5e33832b5560a4545e53c34fc15 (diff)
downloadmediapointer-dvb-s2-5c8e36a5860b09fe0257d73844e52333433bb58a.tar.gz
mediapointer-dvb-s2-5c8e36a5860b09fe0257d73844e52333433bb58a.tar.bz2
tm6000: fix eeprom reading on tm6000
From: Mauro Carvalho Chehab <mchehab@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'linux')
-rw-r--r--linux/drivers/staging/tm6000/tm6000-i2c.c78
1 files changed, 36 insertions, 42 deletions
diff --git a/linux/drivers/staging/tm6000/tm6000-i2c.c b/linux/drivers/staging/tm6000/tm6000-i2c.c
index 13ac3840f..751093eb7 100644
--- a/linux/drivers/staging/tm6000/tm6000-i2c.c
+++ b/linux/drivers/staging/tm6000/tm6000-i2c.c
@@ -168,8 +168,8 @@ err:
}
-static int tm6000_i2c_eeprom( struct tm6000_core *dev,
- unsigned char *eedata, int len )
+static int tm6000_i2c_eeprom(struct tm6000_core *dev,
+ unsigned char *eedata, int len)
{
int i, rc;
unsigned char *p = eedata;
@@ -177,32 +177,20 @@ static int tm6000_i2c_eeprom( struct tm6000_core *dev,
dev->i2c_client.addr = 0xa0 >> 1;
-//006779: OUT: 000006 ms 089867 ms c0 0e a0 00 00 00 01 00 <<< 00
-//006780: OUT: 000005 ms 089873 ms c0 10 a0 00 00 00 01 00 <<< 00
-//006781: OUT: 000108 ms 089878 ms 40 0e a0 00 00 00 01 00 >>> 99
-//006782: OUT: 000015 ms 089986 ms c0 0e a0 00 01 00 01 00 <<< 99
-//006783: OUT: 000004 ms 090001 ms c0 0e a0 00 10 00 01 00 <<< 99
-//006784: OUT: 000005 ms 090005 ms 40 10 a0 00 00 00 01 00 >>> 00
-//006785: OUT: 000308 ms 090010 ms 40 0e a0 00 00 00 01 00 >>> 00
-
+ bytes[16] = '\0';
+ for (i = 0; i < len; ) {
#if 0
- bytes[0] = 0x99;
- if (1 != (rc = i2c_master_send(&dev->i2c_client,bytes,1))) {
- printk(KERN_INFO "%s: Huh, no eeprom present (err=%d)?\n",
- dev->name,rc);
- return rc;
- }
-#endif
-
- for (i = 0; i < len; i++) {
- bytes[0x14+i] = 0;
-
rc = i2c_master_recv(&dev->i2c_client, p, 1);
- if (rc<1) {
- if (p==eedata) {
- printk (KERN_WARNING "%s doesn't have eeprom",
- dev->name);
- } else {
+#else
+ *p = i;
+ rc = tm6000_read_write_usb (dev,
+ USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+ REQ_16_SET_GET_I2CSEQ, 0xa0 | i<<8, 0, p, 1);
+#endif
+ if (rc < 1) {
+ if (p == eedata)
+ goto noeeprom;
+ else {
printk(KERN_WARNING
"%s: i2c eeprom read error (err=%d)\n",
dev->name, rc);
@@ -213,21 +201,32 @@ static int tm6000_i2c_eeprom( struct tm6000_core *dev,
if (0 == (i % 16))
printk(KERN_INFO "%s: i2c eeprom %02x:", dev->name, i);
printk(" %02x", eedata[i]);
- if ((eedata[i]>=' ')&&(eedata[i]<='z')) {
- bytes[i%16]=eedata[i];
+ if ((eedata[i] >= ' ') && (eedata[i] <= 'z')) {
+ bytes[i%16] = eedata[i];
} else {
bytes[i%16]='.';
}
- if (15 == (i % 16)) {
- bytes[i%16]='\0';
+
+ i++;
+
+ if (0 == (i % 16)) {
+ bytes[16] = '\0';
printk(" %s\n", bytes);
}
}
- if ((i%16)!=15) {
- bytes[i%16]='\0';
- printk(" %s\n", bytes);
+ if (0 != (i%16)) {
+ bytes[i%16] = '\0';
+ for (i %= 16; i < 16; i++)
+ printk(" ");
}
+ printk(" %s\n", bytes);
+
return 0;
+
+noeeprom:
+ printk(KERN_INFO "%s: Huh, no eeprom present (err=%d)?\n",
+ dev->name, rc);
+ return rc;
}
/* ----------------------------------------------------------- */
@@ -332,20 +331,11 @@ static int attach_inform(struct i2c_client *client)
{
struct tm6000_core *dev = client->adapter->algo_data;
struct tuner_setup tun_setup;
- unsigned char eedata[11];
i2c_dprintk(1, "%s i2c attach [addr=0x%x,client=%s]\n",
client->driver->driver.name, client->addr, client->name);
switch (client->addr<<1) {
-#if 0
- case 0xa0:
- tm6000_i2c_eeprom(dev, eedata, sizeof(eedata)-1);
- eedata[sizeof(eedata)]='\0';
-
- printk("Board string ID = %s\n",eedata);
- return 0;
-#endif
case 0xb0:
request_module("tvaudio");
return 0;
@@ -442,6 +432,8 @@ void tm6000_i2c_call_clients(struct tm6000_core *dev, unsigned int cmd, void *ar
*/
int tm6000_i2c_register(struct tm6000_core *dev)
{
+ unsigned char eedata[256];
+
dev->i2c_adap = tm6000_adap_template;
dev->i2c_adap.dev.parent = &dev->udev->dev;
strcpy(dev->i2c_adap.name, dev->name);
@@ -454,6 +446,8 @@ int tm6000_i2c_register(struct tm6000_core *dev)
if (i2c_scan)
do_i2c_scan(dev->name, &dev->i2c_client);
+ tm6000_i2c_eeprom(dev, eedata, sizeof(eedata));
+
return 0;
}