[media] cx231xx: fix bulk transfer mode
The current cx231xx driver doesn't work with bulk transfer mode. This patch makes it possible to use bulk transfer mode. Signed-off-by: Terry Heo <terryheo@google.com> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:
parent
18a8560cbd
commit
ce3556bde3
@ -914,6 +914,7 @@ EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc);
|
|||||||
*/
|
*/
|
||||||
void cx231xx_uninit_bulk(struct cx231xx *dev)
|
void cx231xx_uninit_bulk(struct cx231xx *dev)
|
||||||
{
|
{
|
||||||
|
struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
|
||||||
struct urb *urb;
|
struct urb *urb;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -931,7 +932,7 @@ void cx231xx_uninit_bulk(struct cx231xx *dev)
|
|||||||
if (dev->video_mode.bulk_ctl.transfer_buffer[i]) {
|
if (dev->video_mode.bulk_ctl.transfer_buffer[i]) {
|
||||||
usb_free_coherent(dev->udev,
|
usb_free_coherent(dev->udev,
|
||||||
urb->transfer_buffer_length,
|
urb->transfer_buffer_length,
|
||||||
dev->video_mode.isoc_ctl.
|
dev->video_mode.bulk_ctl.
|
||||||
transfer_buffer[i],
|
transfer_buffer[i],
|
||||||
urb->transfer_dma);
|
urb->transfer_dma);
|
||||||
}
|
}
|
||||||
@ -943,10 +944,12 @@ void cx231xx_uninit_bulk(struct cx231xx *dev)
|
|||||||
|
|
||||||
kfree(dev->video_mode.bulk_ctl.urb);
|
kfree(dev->video_mode.bulk_ctl.urb);
|
||||||
kfree(dev->video_mode.bulk_ctl.transfer_buffer);
|
kfree(dev->video_mode.bulk_ctl.transfer_buffer);
|
||||||
|
kfree(dma_q->p_left_data);
|
||||||
|
|
||||||
dev->video_mode.bulk_ctl.urb = NULL;
|
dev->video_mode.bulk_ctl.urb = NULL;
|
||||||
dev->video_mode.bulk_ctl.transfer_buffer = NULL;
|
dev->video_mode.bulk_ctl.transfer_buffer = NULL;
|
||||||
dev->video_mode.bulk_ctl.num_bufs = 0;
|
dev->video_mode.bulk_ctl.num_bufs = 0;
|
||||||
|
dma_q->p_left_data = NULL;
|
||||||
|
|
||||||
if (dev->mode_tv == 0)
|
if (dev->mode_tv == 0)
|
||||||
cx231xx_capture_start(dev, 0, Raw_Video);
|
cx231xx_capture_start(dev, 0, Raw_Video);
|
||||||
@ -1196,6 +1199,16 @@ int cx231xx_init_bulk(struct cx231xx *dev, int max_packets,
|
|||||||
sb_size, cx231xx_bulk_irq_callback, dma_q);
|
sb_size, cx231xx_bulk_irq_callback, dma_q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* clear halt */
|
||||||
|
rc = usb_clear_halt(dev->udev, dev->video_mode.bulk_ctl.urb[0]->pipe);
|
||||||
|
if (rc < 0) {
|
||||||
|
dev_err(dev->dev,
|
||||||
|
"failed to clear USB bulk endpoint stall/halt condition (error=%i)\n",
|
||||||
|
rc);
|
||||||
|
cx231xx_uninit_bulk(dev);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
init_waitqueue_head(&dma_q->wq);
|
init_waitqueue_head(&dma_q->wq);
|
||||||
|
|
||||||
/* submit urbs and enables IRQ */
|
/* submit urbs and enables IRQ */
|
||||||
|
Loading…
Reference in New Issue
Block a user