Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3874cd77 authored by Matthieu CASTET's avatar Matthieu CASTET Committed by Mauro Carvalho Chehab
Browse files

[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: default avatarMatthieu CASTET <castet.matthieu@free.fr>
CC: Thierry Reding <thierry.reding@avionic-design.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 7581e61d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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;

+14 −2
Original line number Diff line number Diff line
@@ -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;
+1 −7
Original line number Diff line number Diff line
@@ -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);