Commit c6d664fe authored by Kieran Bingham's avatar Kieran Bingham Committed by Mauro Carvalho Chehab

media: uvcvideo: Convert decode functions to use new context structure

The URB completion handlers currently reference the stream context.

Now that each URB has its own context structure, convert the decode (and
one encode) functions to utilise this context for URB management.
Signed-off-by: default avatarKieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 811496c9
...@@ -99,9 +99,11 @@ static int isight_decode(struct uvc_video_queue *queue, struct uvc_buffer *buf, ...@@ -99,9 +99,11 @@ static int isight_decode(struct uvc_video_queue *queue, struct uvc_buffer *buf,
return 0; return 0;
} }
void uvc_video_decode_isight(struct urb *urb, struct uvc_streaming *stream, void uvc_video_decode_isight(struct uvc_urb *uvc_urb, struct uvc_buffer *buf,
struct uvc_buffer *buf, struct uvc_buffer *meta_buf) struct uvc_buffer *meta_buf)
{ {
struct urb *urb = uvc_urb->urb;
struct uvc_streaming *stream = uvc_urb->stream;
int ret, i; int ret, i;
for (i = 0; i < urb->number_of_packets; ++i) { for (i = 0; i < urb->number_of_packets; ++i) {
......
...@@ -1291,9 +1291,11 @@ static void uvc_video_next_buffers(struct uvc_streaming *stream, ...@@ -1291,9 +1291,11 @@ static void uvc_video_next_buffers(struct uvc_streaming *stream,
*video_buf = uvc_queue_next_buffer(&stream->queue, *video_buf); *video_buf = uvc_queue_next_buffer(&stream->queue, *video_buf);
} }
static void uvc_video_decode_isoc(struct urb *urb, struct uvc_streaming *stream, static void uvc_video_decode_isoc(struct uvc_urb *uvc_urb,
struct uvc_buffer *buf, struct uvc_buffer *meta_buf) struct uvc_buffer *buf, struct uvc_buffer *meta_buf)
{ {
struct urb *urb = uvc_urb->urb;
struct uvc_streaming *stream = uvc_urb->stream;
u8 *mem; u8 *mem;
int ret, i; int ret, i;
...@@ -1334,9 +1336,11 @@ static void uvc_video_decode_isoc(struct urb *urb, struct uvc_streaming *stream, ...@@ -1334,9 +1336,11 @@ static void uvc_video_decode_isoc(struct urb *urb, struct uvc_streaming *stream,
} }
} }
static void uvc_video_decode_bulk(struct urb *urb, struct uvc_streaming *stream, static void uvc_video_decode_bulk(struct uvc_urb *uvc_urb,
struct uvc_buffer *buf, struct uvc_buffer *meta_buf) struct uvc_buffer *buf, struct uvc_buffer *meta_buf)
{ {
struct urb *urb = uvc_urb->urb;
struct uvc_streaming *stream = uvc_urb->stream;
u8 *mem; u8 *mem;
int len, ret; int len, ret;
...@@ -1402,9 +1406,12 @@ static void uvc_video_decode_bulk(struct urb *urb, struct uvc_streaming *stream, ...@@ -1402,9 +1406,12 @@ static void uvc_video_decode_bulk(struct urb *urb, struct uvc_streaming *stream,
} }
} }
static void uvc_video_encode_bulk(struct urb *urb, struct uvc_streaming *stream, static void uvc_video_encode_bulk(struct uvc_urb *uvc_urb,
struct uvc_buffer *buf, struct uvc_buffer *meta_buf) struct uvc_buffer *buf, struct uvc_buffer *meta_buf)
{ {
struct urb *urb = uvc_urb->urb;
struct uvc_streaming *stream = uvc_urb->stream;
u8 *mem = urb->transfer_buffer; u8 *mem = urb->transfer_buffer;
int len = stream->urb_size, ret; int len = stream->urb_size, ret;
...@@ -1447,7 +1454,8 @@ static void uvc_video_encode_bulk(struct urb *urb, struct uvc_streaming *stream, ...@@ -1447,7 +1454,8 @@ static void uvc_video_encode_bulk(struct urb *urb, struct uvc_streaming *stream,
static void uvc_video_complete(struct urb *urb) static void uvc_video_complete(struct urb *urb)
{ {
struct uvc_streaming *stream = urb->context; struct uvc_urb *uvc_urb = urb->context;
struct uvc_streaming *stream = uvc_urb->stream;
struct uvc_video_queue *queue = &stream->queue; struct uvc_video_queue *queue = &stream->queue;
struct uvc_video_queue *qmeta = &stream->meta.queue; struct uvc_video_queue *qmeta = &stream->meta.queue;
struct vb2_queue *vb2_qmeta = stream->meta.vdev.queue; struct vb2_queue *vb2_qmeta = stream->meta.vdev.queue;
...@@ -1490,7 +1498,7 @@ static void uvc_video_complete(struct urb *urb) ...@@ -1490,7 +1498,7 @@ static void uvc_video_complete(struct urb *urb)
spin_unlock_irqrestore(&qmeta->irqlock, flags); spin_unlock_irqrestore(&qmeta->irqlock, flags);
} }
stream->decode(urb, stream, buf, buf_meta); stream->decode(uvc_urb, buf, buf_meta);
if ((ret = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { if ((ret = usb_submit_urb(urb, GFP_ATOMIC)) < 0) {
uvc_printk(KERN_ERR, "Failed to resubmit video URB (%d).\n", uvc_printk(KERN_ERR, "Failed to resubmit video URB (%d).\n",
...@@ -1568,6 +1576,8 @@ static int uvc_alloc_urb_buffers(struct uvc_streaming *stream, ...@@ -1568,6 +1576,8 @@ static int uvc_alloc_urb_buffers(struct uvc_streaming *stream,
uvc_free_urb_buffers(stream); uvc_free_urb_buffers(stream);
break; break;
} }
uvc_urb->stream = stream;
} }
if (i == UVC_URBS) { if (i == UVC_URBS) {
...@@ -1666,7 +1676,7 @@ static int uvc_init_video_isoc(struct uvc_streaming *stream, ...@@ -1666,7 +1676,7 @@ static int uvc_init_video_isoc(struct uvc_streaming *stream,
} }
urb->dev = stream->dev->udev; urb->dev = stream->dev->udev;
urb->context = stream; urb->context = uvc_urb;
urb->pipe = usb_rcvisocpipe(stream->dev->udev, urb->pipe = usb_rcvisocpipe(stream->dev->udev,
ep->desc.bEndpointAddress); ep->desc.bEndpointAddress);
#ifndef CONFIG_DMA_NONCOHERENT #ifndef CONFIG_DMA_NONCOHERENT
...@@ -1733,8 +1743,8 @@ static int uvc_init_video_bulk(struct uvc_streaming *stream, ...@@ -1733,8 +1743,8 @@ static int uvc_init_video_bulk(struct uvc_streaming *stream,
return -ENOMEM; return -ENOMEM;
} }
usb_fill_bulk_urb(urb, stream->dev->udev, pipe, uvc_urb->buffer, usb_fill_bulk_urb(urb, stream->dev->udev, pipe, uvc_urb->buffer,
size, uvc_video_complete, stream); size, uvc_video_complete, uvc_urb);
#ifndef CONFIG_DMA_NONCOHERENT #ifndef CONFIG_DMA_NONCOHERENT
urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
urb->transfer_dma = uvc_urb->dma; urb->transfer_dma = uvc_urb->dma;
......
...@@ -494,11 +494,13 @@ struct uvc_stats_stream { ...@@ -494,11 +494,13 @@ struct uvc_stats_stream {
* struct uvc_urb - URB context management structure * struct uvc_urb - URB context management structure
* *
* @urb: the URB described by this context structure * @urb: the URB described by this context structure
* @stream: UVC streaming context
* @buffer: memory storage for the URB * @buffer: memory storage for the URB
* @dma: DMA coherent addressing for the urb_buffer * @dma: DMA coherent addressing for the urb_buffer
*/ */
struct uvc_urb { struct uvc_urb {
struct urb *urb; struct urb *urb;
struct uvc_streaming *stream;
char *buffer; char *buffer;
dma_addr_t dma; dma_addr_t dma;
...@@ -534,8 +536,8 @@ struct uvc_streaming { ...@@ -534,8 +536,8 @@ struct uvc_streaming {
/* Buffers queue. */ /* Buffers queue. */
unsigned int frozen : 1; unsigned int frozen : 1;
struct uvc_video_queue queue; struct uvc_video_queue queue;
void (*decode) (struct urb *urb, struct uvc_streaming *video, void (*decode)(struct uvc_urb *uvc_urb, struct uvc_buffer *buf,
struct uvc_buffer *buf, struct uvc_buffer *meta_buf); struct uvc_buffer *meta_buf);
struct { struct {
struct video_device vdev; struct video_device vdev;
...@@ -822,7 +824,7 @@ struct usb_host_endpoint *uvc_find_endpoint(struct usb_host_interface *alts, ...@@ -822,7 +824,7 @@ struct usb_host_endpoint *uvc_find_endpoint(struct usb_host_interface *alts,
u8 epaddr); u8 epaddr);
/* Quirks support */ /* Quirks support */
void uvc_video_decode_isight(struct urb *urb, struct uvc_streaming *stream, void uvc_video_decode_isight(struct uvc_urb *uvc_urb,
struct uvc_buffer *buf, struct uvc_buffer *buf,
struct uvc_buffer *meta_buf); struct uvc_buffer *meta_buf);
......
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