The Xceive 3028 is a programmable digital tuner, and one of the things you have to do is load microcode into the device. For some reason, it was taking 13 seconds to load the firmware, which is only about 60 KB. Bear in mind that this is a tuner chip that normally transfers data at around 19 Mb/s.
I thought perhaps there was some limitation on the speed of the i2c bus in the em28xx bridge, or perhaps there was some magic register you had to set to change the bus speed. In the end, the answer was MUCH simpler:
From: Devin Heitmueller
em28xx-core.c:
- Remove sleep in i2c message routine which slows down i2c by a factor
10x. Load time for BASE firmware went from 13s to .973s
Signed-off-by: Devin Heitmueller
diff -ur a/v4l/em28xx-core.c b/v4l/em28xx-core.c
--- a/v4l/em28xx-core.c 2008-04-16 00:34:32.000000000 -0400
+++ b/v4l/em28xx-core.c 2008-04-17 01:48:04.000000000 -0400
@@ -153,7 +153,6 @@
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);
- msleep(5); /* FIXME: magic number */
kfree(bufs);
return ret;
}
Yup, somebody stuck a 5 millisecond sleep into a low level function that sends commands onto the USB bus. While .005 seconds doesn't sound like much, try doing that around 2600 times, and you magically end up with around 13 seconds...