diff options
author | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-04-17 18:42:14 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-04-17 18:42:14 -0300 |
commit | 1ba2e262c1859c889ff2c472357b092da3e77298 (patch) | |
tree | b6f4590a5f0538e6d12a7317115d33038ccac104 /linux/drivers | |
parent | ae3fc98c477de56e87e3720f441b274ae6e0927a (diff) | |
download | mediapointer-dvb-s2-1ba2e262c1859c889ff2c472357b092da3e77298.tar.gz mediapointer-dvb-s2-1ba2e262c1859c889ff2c472357b092da3e77298.tar.bz2 |
em28xx: Select reg wait time based on chip ID
From: Mauro Carvalho Chehab <mchehab@infradead.org>
This is more conservative than just removing the msleep() from
em28xx_write_regs_req(), since some old hardware may still need it.
So, it will remove the sleep time only for those chips where this
removal were tested.
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'linux/drivers')
-rw-r--r-- | linux/drivers/media/video/em28xx/em28xx-cards.c | 14 | ||||
-rw-r--r-- | linux/drivers/media/video/em28xx/em28xx-core.c | 3 | ||||
-rw-r--r-- | linux/drivers/media/video/em28xx/em28xx-video.c | 4 | ||||
-rw-r--r-- | linux/drivers/media/video/em28xx/em28xx.h | 3 |
4 files changed, 20 insertions, 4 deletions
diff --git a/linux/drivers/media/video/em28xx/em28xx-cards.c b/linux/drivers/media/video/em28xx/em28xx-cards.c index 3ad6cfb82..cf59a16d1 100644 --- a/linux/drivers/media/video/em28xx/em28xx-cards.c +++ b/linux/drivers/media/video/em28xx/em28xx-cards.c @@ -528,6 +528,20 @@ static void em28xx_set_model(struct em28xx *dev) */ void em28xx_pre_card_setup(struct em28xx *dev) { + int rc; + + dev->wait_after_write = 5; + rc = em28xx_read_reg(dev, CHIPID_REG); + if (rc > 0) { + switch (rc) { + case 36: + em28xx_info("chip ID is em2882/em2883\n"); + dev->wait_after_write = 0; + break; + default: + em28xx_info("em28xx chip ID = %d\n", rc); + } + } em28xx_set_model(dev); /* request some modules */ diff --git a/linux/drivers/media/video/em28xx/em28xx-core.c b/linux/drivers/media/video/em28xx/em28xx-core.c index baf3ad22f..ea86974e3 100644 --- a/linux/drivers/media/video/em28xx/em28xx-core.c +++ b/linux/drivers/media/video/em28xx/em28xx-core.c @@ -153,6 +153,9 @@ int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf, ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), req, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0x0000, reg, bufs, len, HZ); + if (dev->wait_after_write) + msleep(dev->wait_after_write); + kfree(bufs); return ret; } diff --git a/linux/drivers/media/video/em28xx/em28xx-video.c b/linux/drivers/media/video/em28xx/em28xx-video.c index 1c0449b65..648aefc63 100644 --- a/linux/drivers/media/video/em28xx/em28xx-video.c +++ b/linux/drivers/media/video/em28xx/em28xx-video.c @@ -2008,10 +2008,6 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, dev->em28xx_read_reg_req = em28xx_read_reg_req; dev->is_em2800 = em28xx_boards[dev->model].is_em2800; - errCode = em28xx_read_reg(dev, CHIPID_REG); - if (errCode >= 0) - em28xx_info("em28xx chip ID = %d\n", errCode); - em28xx_pre_card_setup(dev); errCode = em28xx_config(dev); diff --git a/linux/drivers/media/video/em28xx/em28xx.h b/linux/drivers/media/video/em28xx/em28xx.h index da90cd36f..ac3e7a44b 100644 --- a/linux/drivers/media/video/em28xx/em28xx.h +++ b/linux/drivers/media/video/em28xx/em28xx.h @@ -342,6 +342,9 @@ struct em28xx { unsigned int max_range_640_480:1; unsigned int has_dvb:1; + /* Some older em28xx chips needs a waiting time after writing */ + unsigned int wait_after_write; + /* GPIO sequences for tuner callback */ struct em28xx_reg_seq *analog_gpio, *digital_gpio; |