diff --git a/drivers/media/usb/uvc/Kconfig b/drivers/media/usb/uvc/Kconfig index 6ed85efa..d7eb610 100644 --- a/drivers/media/usb/uvc/Kconfig +++ b/drivers/media/usb/uvc/Kconfig @@ -1,7 +1,8 @@ config USB_VIDEO_CLASS tristate "USB Video Class (UVC)" depends on VIDEO_V4L2 - select VIDEOBUF2_VMALLOC +#select VIDEOBUF2_VMALLOC + select VIDEOBUF2_DMA_CONTIG ---help--- Support for the USB Video Class (UVC). Currently only video input devices, such as webcams, are supported. diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c index d11fd6a..ed04bcc 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -23,6 +23,7 @@ #include #include +#include #include #include "uvcvideo.h" @@ -1924,6 +1925,8 @@ static int uvc_probe(struct usb_interface *intf, if (v4l2_device_register(&intf->dev, &dev->vdev) < 0) goto error; + dev->alloc_ctx = vb2_dma_contig_init_ctx(&intf->dev); + intf->dev.coherent_dma_mask = DMA_BIT_MASK(32); /* Initialize controls. */ if (uvc_ctrl_init_device(dev) < 0) goto error; diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_queue.c index cfb868a..b3278c0 100644 --- a/drivers/media/usb/uvc/uvc_queue.c +++ b/drivers/media/usb/uvc/uvc_queue.c @@ -18,10 +18,11 @@ #include #include #include -#include +//#include #include #include -#include +//#include +#include #include "uvcvideo.h" @@ -80,7 +81,7 @@ static int uvc_queue_setup(struct vb2_queue *vq, const void *parg, /* Make sure the image size is large enough. */ if (fmt && fmt->fmt.pix.sizeimage < stream->ctrl.dwMaxVideoFrameSize) return -EINVAL; - + alloc_ctxs[0] = stream->dev->alloc_ctx; *nplanes = 1; sizes[0] = fmt ? fmt->fmt.pix.sizeimage @@ -202,7 +203,7 @@ int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type, queue->queue.drv_priv = queue; queue->queue.buf_struct_size = sizeof(struct uvc_buffer); queue->queue.ops = &uvc_queue_qops; - queue->queue.mem_ops = &vb2_vmalloc_memops; + queue->queue.mem_ops = &vb2_dma_contig_memops;//&vb2_vmalloc_memops; queue->queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC | V4L2_BUF_FLAG_TSTAMP_SRC_SOE; queue->queue.lock = &queue->mutex; diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h index f0f2391..d2ba071 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -549,6 +549,7 @@ struct uvc_device { struct urb *int_urb; __u8 *status; struct input_dev *input; + struct vb2_alloc_ctx *alloc_ctx; char input_phys[64]; };