[media] tm6000: improve loading speed on hauppauge 900H
authormatthieu castet <castet.matthieu@free.fr>
Fri, 16 Dec 2011 17:15:07 +0000 (14:15 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 4 Jan 2012 22:37:54 +0000 (20:37 -0200)
- enable fast usb quirk
- use usleep_range instead on msleep for short sleep
- merge i2c out and usb delay
- do like the windows driver that upload the tuner firmware
  with 80 bytes packets

Signed-off-by: Matthieu CASTET <castet.matthieu@free.fr>
CC: Thierry Reding <thierry.reding@avionic-design.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/tm6000/tm6000-cards.c
drivers/media/video/tm6000/tm6000-core.c
drivers/media/video/tm6000/tm6000-i2c.c

index 6b74259cd5c89da5a7c77e769020a478c300a8e2..3678918821b08690c3e1dd8bc3304b7010f386a1 100644 (file)
@@ -943,6 +943,7 @@ static void tm6000_config_tuner(struct tm6000_core *dev)
                case TM6010_BOARD_HAUPPAUGE_900H:
                case TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE:
                case TM6010_BOARD_TWINHAN_TU501:
+                       ctl.max_len = 80;
                        ctl.fname = "xc3028L-v36.fw";
                        break;
                default:
@@ -1004,6 +1005,7 @@ static int fill_board_specific_data(struct tm6000_core *dev)
        /* setup per-model quirks */
        switch (dev->model) {
        case TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE:
+       case TM6010_BOARD_HAUPPAUGE_900H:
                dev->quirks |= TM6000_QUIRK_NO_USB_DELAY;
                break;
 
index 979c85b73814d0ae731c391d46d984a11387a891..22cc0116deb65e9f9e26f8b2ba844c778d6a5c57 100644 (file)
@@ -38,6 +38,7 @@ int tm6000_read_write_usb(struct tm6000_core *dev, u8 req_type, u8 req,
        int          ret, i;
        unsigned int pipe;
        u8           *data = NULL;
+       int delay = 5000;
 
        mutex_lock(&dev->usb_lock);
 
@@ -89,8 +90,19 @@ int tm6000_read_write_usb(struct tm6000_core *dev, u8 req_type, u8 req,
 
        kfree(data);
 
-       if ((dev->quirks & TM6000_QUIRK_NO_USB_DELAY) == 0)
-               msleep(5);
+       if (dev->quirks & TM6000_QUIRK_NO_USB_DELAY)
+               delay = 0;
+
+       if (req == REQ_16_SET_GET_I2C_WR1_RDN && !(req_type & USB_DIR_IN)) {
+               unsigned int tsleep;
+               /* Calculate delay time, 14000us for 64 bytes */
+               tsleep = (len * 200) + 200;
+               if (tsleep < delay)
+                       tsleep = delay;
+               usleep_range(tsleep, tsleep + 1000);
+       }
+       else if (delay)
+               usleep_range(delay, delay + 1000);
 
        mutex_unlock(&dev->usb_lock);
        return ret;
index 0290bbf00c3e68c0541e87803d98963b721e8a41..c7e23e3dd75ed4f47276ace2f8480b461a9131fe 100644 (file)
@@ -46,11 +46,10 @@ static int tm6000_i2c_send_regs(struct tm6000_core *dev, unsigned char addr,
                                __u8 reg, char *buf, int len)
 {
        int rc;
-       unsigned int tsleep;
        unsigned int i2c_packet_limit = 16;
 
        if (dev->dev_type == TM6010)
-               i2c_packet_limit = 64;
+               i2c_packet_limit = 80;
 
        if (!buf)
                return -1;
@@ -71,10 +70,6 @@ static int tm6000_i2c_send_regs(struct tm6000_core *dev, unsigned char addr,
                return rc;
        }
 
-       /* Calculate delay time, 14000us for 64 bytes */
-       tsleep = ((len * 200) + 200 + 1000) / 1000;
-       msleep(tsleep);
-
        /* release mutex */
        return rc;
 }
@@ -145,7 +140,6 @@ static int tm6000_i2c_recv_regs16(struct tm6000_core *dev, unsigned char addr,
                        return rc;
                }
 
-               msleep(1400 / 1000);
                rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
                        USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
                        reg, 0, buf, len);