V4L/DVB (7610): em28xx: Select reg wait time based on chip ID
authorMauro Carvalho Chehab <mchehab@infradead.org>
Fri, 18 Apr 2008 00:42:14 +0000 (21:42 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Thu, 24 Apr 2008 17:09:42 +0000 (14:09 -0300)
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>
drivers/media/video/em28xx/em28xx-cards.c
drivers/media/video/em28xx/em28xx-core.c
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/em28xx/em28xx.h

index 7dfea3ac9b2f392e70473db89b5bbe31f2fc99b0..0c71e599c140289fb01734795eec77e83a05ab64 100644 (file)
@@ -525,6 +525,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 */
index 9cbc4788090c958847cd83359a3941a5a95a5105..e47b206187b5de6edaba5ee0aa9a6a3b880fe418 100644 (file)
@@ -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;
 }
index 1ac90322d681341b47ea5f6685ce2caca403ad5c..a8aa09c5bc5f41f4ad0e778a9150a186b8290542 100644 (file)
@@ -1927,10 +1927,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);
index 5b21efaf7844a1031f10863c9db80bb7b285893e..8f12b848b1d1ca52f736e183e710d4fd5a1c9d37 100644 (file)
@@ -331,6 +331,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;