Skip to content

Commit

Permalink
[media] tm6000: bugfix at interrupt reset
Browse files Browse the repository at this point in the history
Signed-off-by: Stefan Ringel <linuxtv@stefanringel.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Stefan Ringel authored and Mauro Carvalho Chehab committed Nov 28, 2011
1 parent c00ecc9 commit 8159c18
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 53 deletions.
49 changes: 0 additions & 49 deletions drivers/media/video/tm6000/tm6000-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -599,55 +599,6 @@ int tm6000_init(struct tm6000_core *dev)
return rc;
}

int tm6000_reset(struct tm6000_core *dev)
{
int pipe;
int err;

msleep(500);

err = usb_set_interface(dev->udev, dev->isoc_in.bInterfaceNumber, 0);
if (err < 0) {
tm6000_err("failed to select interface %d, alt. setting 0\n",
dev->isoc_in.bInterfaceNumber);
return err;
}

err = usb_reset_configuration(dev->udev);
if (err < 0) {
tm6000_err("failed to reset configuration\n");
return err;
}

if ((dev->quirks & TM6000_QUIRK_NO_USB_DELAY) == 0)
msleep(5);

/*
* Not all devices have int_in defined
*/
if (!dev->int_in.endp)
return 0;

err = usb_set_interface(dev->udev, dev->isoc_in.bInterfaceNumber, 2);
if (err < 0) {
tm6000_err("failed to select interface %d, alt. setting 2\n",
dev->isoc_in.bInterfaceNumber);
return err;
}

msleep(5);

pipe = usb_rcvintpipe(dev->udev,
dev->int_in.endp->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);

err = usb_clear_halt(dev->udev, pipe);
if (err < 0) {
tm6000_err("usb_clear_halt failed: %d\n", err);
return err;
}

return 0;
}

int tm6000_set_audio_bitrate(struct tm6000_core *dev, int bitrate)
{
Expand Down
21 changes: 17 additions & 4 deletions drivers/media/video/tm6000/tm6000-video.c
Original file line number Diff line number Diff line change
Expand Up @@ -1609,12 +1609,25 @@ static int tm6000_release(struct file *file)

tm6000_uninit_isoc(dev);

/* Stop interrupt USB pipe */
tm6000_ir_int_stop(dev);

usb_reset_configuration(dev->udev);

if (&dev->int_in)
usb_set_interface(dev->udev,
dev->isoc_in.bInterfaceNumber,
2);
else
usb_set_interface(dev->udev,
dev->isoc_in.bInterfaceNumber,
0);

/* Start interrupt USB pipe */
tm6000_ir_int_start(dev);

if (!fh->radio)
videobuf_mmap_free(&fh->vb_vidq);

err = tm6000_reset(dev);
if (err < 0)
dev_err(&vdev->dev, "reset failed: %d\n", err);
}

kfree(fh);
Expand Down

0 comments on commit 8159c18

Please sign in to comment.