Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 76374
b: refs/heads/master
c: fad7b95
h: refs/heads/master
v: v3
  • Loading branch information
Sascha Sommer authored and Mauro Carvalho Chehab committed Jan 25, 2008
1 parent f586dcd commit 58da042
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f1f32849d65ab1eacfedbabb624876ac06c1af9f
refs/heads/master: fad7b958e753e18ff443786360f7846da50a3085
30 changes: 30 additions & 0 deletions trunk/drivers/media/video/em28xx/em28xx-cards.c
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,11 @@ static struct em28xx_hash_table em28xx_hash [] = {
{ 0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF },
};

static struct em28xx_hash_table em28xx_i2c_hash[] = {
{ 0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC },
{ 0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC },
};

/* Since em28xx_pre_card_setup() requires a proper dev->model,
* this won't work for boards with generic PCI IDs
*/
Expand Down Expand Up @@ -498,13 +503,38 @@ static int em28xx_hint_board(struct em28xx *dev)
return 0;
}
}

/* user did not request i2c scanning => do it now */
if (!dev->i2c_hash)
em28xx_do_i2c_scan(dev);

for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
dev->model = em28xx_i2c_hash[i].model;
dev->tuner_type = em28xx_i2c_hash[i].tuner;
em28xx_errdev("Your board has no unique USB ID.\n");
em28xx_errdev("A hint were successfully done, "
"based on i2c devicelist hash.\n");
em28xx_errdev("This method is not 100%% failproof.\n");
em28xx_errdev("If the board were missdetected, "
"please email this log to:\n");
em28xx_errdev("\tV4L Mailing List "
" <video4linux-list@redhat.com>\n");
em28xx_errdev("Board detected as %s\n",
em28xx_boards[dev->model].name);

return 0;
}
}

em28xx_errdev("Your board has no unique USB ID and thus need a "
"hint to be detected.\n");
em28xx_errdev("You may try to use card=<n> insmod option to "
"workaround that.\n");
em28xx_errdev("Please send an email with this log to:\n");
em28xx_errdev("\tV4L Mailing List <video4linux-list@redhat.com>\n");
em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash);
em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash);

em28xx_errdev("Here is a list of valid choices for the card=<n>"
" insmod option:\n");
Expand Down
19 changes: 13 additions & 6 deletions trunk/drivers/media/video/em28xx/em28xx-i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -533,19 +533,26 @@ static char *i2c_devs[128] = {
* do_i2c_scan()
* check i2c address range for devices
*/
static void do_i2c_scan(char *name, struct i2c_client *c)
void em28xx_do_i2c_scan(struct em28xx *dev)
{
u8 i2c_devicelist[128];
unsigned char buf;
int i, rc;

memset(i2c_devicelist, 0, ARRAY_SIZE(i2c_devicelist));

for (i = 0; i < ARRAY_SIZE(i2c_devs); i++) {
c->addr = i;
rc = i2c_master_recv(c, &buf, 0);
dev->i2c_client.addr = i;
rc = i2c_master_recv(&dev->i2c_client, &buf, 0);
if (rc < 0)
continue;
printk(KERN_INFO "%s: found i2c device @ 0x%x [%s]\n", name,
i << 1, i2c_devs[i] ? i2c_devs[i] : "???");
i2c_devicelist[i] = i;
printk(KERN_INFO "%s: found i2c device @ 0x%x [%s]\n",
dev->name, i << 1, i2c_devs[i] ? i2c_devs[i] : "???");
}

dev->i2c_hash = em28xx_hash_mem(i2c_devicelist,
ARRAY_SIZE(i2c_devicelist), 32);
}

/*
Expand Down Expand Up @@ -578,7 +585,7 @@ int em28xx_i2c_register(struct em28xx *dev)
em28xx_i2c_eeprom(dev, dev->eedata, sizeof(dev->eedata));

if (i2c_scan)
do_i2c_scan(dev->name, &dev->i2c_client);
em28xx_do_i2c_scan(dev);
return 0;
}

Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/media/video/em28xx/em28xx-video.c
Original file line number Diff line number Diff line change
Expand Up @@ -1510,6 +1510,7 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
dev->em28xx_write_regs_req = em28xx_write_regs_req;
dev->em28xx_read_reg_req = em28xx_read_reg_req;
dev->is_em2800 = em28xx_boards[dev->model].is_em2800;

/* setup video picture settings for saa7113h */
memset(&dev->vpic, 0, sizeof(dev->vpic));
Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/media/video/em28xx/em28xx.h
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ struct em28xx {
int type;

unsigned long hash; /* eeprom hash - for boards with generic ID */
unsigned long i2c_hash; /* i2c devicelist hash - for boards with generic ID */

/* states */
enum em28xx_dev_state state;
Expand Down Expand Up @@ -296,6 +297,7 @@ struct em28xx {
/* Provided by em28xx-i2c.c */

void em28xx_i2c_call_clients(struct em28xx *dev, unsigned int cmd, void *arg);
void em28xx_do_i2c_scan(struct em28xx *dev);
int em28xx_i2c_register(struct em28xx *dev);
int em28xx_i2c_unregister(struct em28xx *dev);

Expand Down

0 comments on commit 58da042

Please sign in to comment.