[media] tm6000: improve loading speed on hauppauge 900H

- 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>
This commit is contained in:
matthieu castet 2011-12-16 14:15:07 -03:00 committed by Mauro Carvalho Chehab
parent 7581e61d8d
commit 3874cd7796
3 changed files with 17 additions and 9 deletions

View File

@ -943,6 +943,7 @@ static void tm6000_config_tuner(struct tm6000_core *dev)
case TM6010_BOARD_HAUPPAUGE_900H: case TM6010_BOARD_HAUPPAUGE_900H:
case TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE: case TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE:
case TM6010_BOARD_TWINHAN_TU501: case TM6010_BOARD_TWINHAN_TU501:
ctl.max_len = 80;
ctl.fname = "xc3028L-v36.fw"; ctl.fname = "xc3028L-v36.fw";
break; break;
default: default:
@ -1004,6 +1005,7 @@ static int fill_board_specific_data(struct tm6000_core *dev)
/* setup per-model quirks */ /* setup per-model quirks */
switch (dev->model) { switch (dev->model) {
case TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE: case TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE:
case TM6010_BOARD_HAUPPAUGE_900H:
dev->quirks |= TM6000_QUIRK_NO_USB_DELAY; dev->quirks |= TM6000_QUIRK_NO_USB_DELAY;
break; break;

View File

@ -38,6 +38,7 @@ int tm6000_read_write_usb(struct tm6000_core *dev, u8 req_type, u8 req,
int ret, i; int ret, i;
unsigned int pipe; unsigned int pipe;
u8 *data = NULL; u8 *data = NULL;
int delay = 5000;
mutex_lock(&dev->usb_lock); 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); kfree(data);
if ((dev->quirks & TM6000_QUIRK_NO_USB_DELAY) == 0) if (dev->quirks & TM6000_QUIRK_NO_USB_DELAY)
msleep(5); 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); mutex_unlock(&dev->usb_lock);
return ret; return ret;

View File

@ -46,11 +46,10 @@ static int tm6000_i2c_send_regs(struct tm6000_core *dev, unsigned char addr,
__u8 reg, char *buf, int len) __u8 reg, char *buf, int len)
{ {
int rc; int rc;
unsigned int tsleep;
unsigned int i2c_packet_limit = 16; unsigned int i2c_packet_limit = 16;
if (dev->dev_type == TM6010) if (dev->dev_type == TM6010)
i2c_packet_limit = 64; i2c_packet_limit = 80;
if (!buf) if (!buf)
return -1; return -1;
@ -71,10 +70,6 @@ static int tm6000_i2c_send_regs(struct tm6000_core *dev, unsigned char addr,
return rc; return rc;
} }
/* Calculate delay time, 14000us for 64 bytes */
tsleep = ((len * 200) + 200 + 1000) / 1000;
msleep(tsleep);
/* release mutex */ /* release mutex */
return rc; return rc;
} }
@ -145,7 +140,6 @@ static int tm6000_i2c_recv_regs16(struct tm6000_core *dev, unsigned char addr,
return rc; return rc;
} }
msleep(1400 / 1000);
rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR |
USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ, USB_RECIP_DEVICE, REQ_35_AFTEK_TUNER_READ,
reg, 0, buf, len); reg, 0, buf, len);