Commit b48592e4 authored by Jarod Wilson's avatar Jarod Wilson Committed by Mauro Carvalho Chehab

V4L/DVB: IR/mceusb: unify and simplify different gen device init

Started out as an effort to try to tackle the last remaining issue I'm
having with this damned pinnacle device getting wedged the first time
its plugged in after an indeterminate length of not being plugged in.
Didn't get that solved yet, but did streamline the init code a bit more
and remove some superfluous gunk. Nukes a completely unneeded call to
usb_device_init() and several lines of overly complex crap in the gen1
device init path.
Signed-off-by: default avatarJarod Wilson <jarod@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 95c5d605
...@@ -768,47 +768,18 @@ static void mceusb_gen1_init(struct mceusb_dev *ir) ...@@ -768,47 +768,18 @@ static void mceusb_gen1_init(struct mceusb_dev *ir)
int i, ret; int i, ret;
int partial = 0; int partial = 0;
struct device *dev = ir->dev; struct device *dev = ir->dev;
char *junk, *data; char *data;
junk = kmalloc(2 * USB_BUFLEN, GFP_KERNEL);
if (!junk) {
dev_err(dev, "%s: memory allocation failed!\n", __func__);
return;
}
data = kzalloc(USB_CTRL_MSG_SZ, GFP_KERNEL); data = kzalloc(USB_CTRL_MSG_SZ, GFP_KERNEL);
if (!data) { if (!data) {
dev_err(dev, "%s: memory allocation failed!\n", __func__); dev_err(dev, "%s: memory allocation failed!\n", __func__);
kfree(junk);
return; return;
} }
/* /*
* Clear off the first few messages. These look like calibration * This is a strange one. Windows issues a set address to the device
* or test data, I can't really tell. This also flushes in case
* we have random ir data queued up.
*/
for (i = 0; i < MCE_G1_INIT_MSGS; i++)
usb_bulk_msg(ir->usbdev,
usb_rcvbulkpipe(ir->usbdev,
ir->usb_ep_in->bEndpointAddress),
junk, sizeof(junk), &partial, HZ * 10);
/* Get Status */
ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0),
USB_REQ_GET_STATUS, USB_DIR_IN,
0, 0, data, USB_CTRL_MSG_SZ, HZ * 3);
/* ret = usb_get_status( ir->usbdev, 0, 0, data ); */
dev_dbg(dev, "%s - ret = %d status = 0x%x 0x%x\n", __func__,
ret, data[0], data[1]);
/*
* This is a strange one. They issue a set address to the device
* on the receive control pipe and expect a certain value pair back * on the receive control pipe and expect a certain value pair back
*/ */
memset(data, 0, sizeof(data));
ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0), ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0),
USB_REQ_SET_ADDRESS, USB_TYPE_VENDOR, 0, 0, USB_REQ_SET_ADDRESS, USB_TYPE_VENDOR, 0, 0,
data, USB_CTRL_MSG_SZ, HZ * 3); data, USB_CTRL_MSG_SZ, HZ * 3);
...@@ -836,19 +807,12 @@ static void mceusb_gen1_init(struct mceusb_dev *ir) ...@@ -836,19 +807,12 @@ static void mceusb_gen1_init(struct mceusb_dev *ir)
dev_dbg(dev, "%s - retC = %d\n", __func__, ret); dev_dbg(dev, "%s - retC = %d\n", __func__, ret);
kfree(data); kfree(data);
kfree(junk);
}; };
static void mceusb_gen2_init(struct mceusb_dev *ir) static void mceusb_gen2_init(struct mceusb_dev *ir)
{ {
int maxp = ir->len_in; int maxp = ir->len_in;
mce_sync_in(ir, NULL, maxp);
mce_sync_in(ir, NULL, maxp);
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(msecs_to_jiffies(100));
/* device reset */ /* device reset */
mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET)); mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET));
mce_sync_in(ir, NULL, maxp); mce_sync_in(ir, NULL, maxp);
...@@ -866,8 +830,6 @@ static void mceusb_gen3_init(struct mceusb_dev *ir) ...@@ -866,8 +830,6 @@ static void mceusb_gen3_init(struct mceusb_dev *ir)
{ {
int maxp = ir->len_in; int maxp = ir->len_in;
mce_sync_in(ir, NULL, maxp);
/* device reset */ /* device reset */
mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET)); mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET));
mce_sync_in(ir, NULL, maxp); mce_sync_in(ir, NULL, maxp);
...@@ -974,8 +936,6 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf, ...@@ -974,8 +936,6 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
dev_dbg(&intf->dev, ": %s called\n", __func__); dev_dbg(&intf->dev, ": %s called\n", __func__);
usb_reset_device(dev);
config = dev->actconfig; config = dev->actconfig;
idesc = intf->cur_altsetting; idesc = intf->cur_altsetting;
...@@ -1062,7 +1022,11 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf, ...@@ -1062,7 +1022,11 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
if (!ir->idev) if (!ir->idev)
goto input_dev_fail; goto input_dev_fail;
/* inbound data */ /* flush buffers on the device */
mce_sync_in(ir, NULL, maxp);
mce_sync_in(ir, NULL, maxp);
/* wire up inbound data handler */
usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in, usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in,
maxp, (usb_complete_t) mceusb_dev_recv, ir, ep_in->bInterval); maxp, (usb_complete_t) mceusb_dev_recv, ir, ep_in->bInterval);
ir->urb_in->transfer_dma = ir->dma_in; ir->urb_in->transfer_dma = ir->dma_in;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment