summaryrefslogtreecommitdiff
path: root/linux/drivers
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@infradead.org>2008-04-17 18:42:14 -0300
committerMauro Carvalho Chehab <mchehab@infradead.org>2008-04-17 18:42:14 -0300
commit1ba2e262c1859c889ff2c472357b092da3e77298 (patch)
treeb6f4590a5f0538e6d12a7317115d33038ccac104 /linux/drivers
parentae3fc98c477de56e87e3720f441b274ae6e0927a (diff)
downloadmediapointer-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.c14
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-core.c3
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-video.c4
-rw-r--r--linux/drivers/media/video/em28xx/em28xx.h3
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;