diff options
Diffstat (limited to 'drivers/media/usb/au0828/au0828-video.c')
-rw-r--r-- | drivers/media/usb/au0828/au0828-video.c | 104 |
1 files changed, 36 insertions, 68 deletions
diff --git a/drivers/media/usb/au0828/au0828-video.c b/drivers/media/usb/au0828/au0828-video.c index a27cb5fcdef8..1a362a041ab3 100644 --- a/drivers/media/usb/au0828/au0828-video.c +++ b/drivers/media/usb/au0828/au0828-video.c | |||
@@ -299,29 +299,23 @@ static int au0828_init_isoc(struct au0828_dev *dev, int max_packets, | |||
299 | * Announces that a buffer were filled and request the next | 299 | * Announces that a buffer were filled and request the next |
300 | */ | 300 | */ |
301 | static inline void buffer_filled(struct au0828_dev *dev, | 301 | static inline void buffer_filled(struct au0828_dev *dev, |
302 | struct au0828_dmaqueue *dma_q, | 302 | struct au0828_dmaqueue *dma_q, |
303 | struct au0828_buffer *buf) | 303 | struct au0828_buffer *buf) |
304 | { | 304 | { |
305 | /* Advice that buffer was filled */ | 305 | struct vb2_buffer *vb = &buf->vb; |
306 | au0828_isocdbg("[%p/%d] wakeup\n", buf, buf->top_field); | 306 | struct vb2_queue *q = vb->vb2_queue; |
307 | 307 | ||
308 | buf->vb.v4l2_buf.sequence = dev->frame_count++; | ||
309 | buf->vb.v4l2_buf.field = V4L2_FIELD_INTERLACED; | ||
310 | v4l2_get_timestamp(&buf->vb.v4l2_buf.timestamp); | ||
311 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE); | ||
312 | } | ||
313 | |||
314 | static inline void vbi_buffer_filled(struct au0828_dev *dev, | ||
315 | struct au0828_dmaqueue *dma_q, | ||
316 | struct au0828_buffer *buf) | ||
317 | { | ||
318 | /* Advice that buffer was filled */ | 308 | /* Advice that buffer was filled */ |
319 | au0828_isocdbg("[%p/%d] wakeup\n", buf, buf->top_field); | 309 | au0828_isocdbg("[%p/%d] wakeup\n", buf, buf->top_field); |
320 | 310 | ||
321 | buf->vb.v4l2_buf.sequence = dev->vbi_frame_count++; | 311 | if (q->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) |
322 | buf->vb.v4l2_buf.field = V4L2_FIELD_INTERLACED; | 312 | vb->v4l2_buf.sequence = dev->frame_count++; |
323 | v4l2_get_timestamp(&buf->vb.v4l2_buf.timestamp); | 313 | else |
324 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE); | 314 | vb->v4l2_buf.sequence = dev->vbi_frame_count++; |
315 | |||
316 | vb->v4l2_buf.field = V4L2_FIELD_INTERLACED; | ||
317 | v4l2_get_timestamp(&vb->v4l2_buf.timestamp); | ||
318 | vb2_buffer_done(vb, VB2_BUF_STATE_DONE); | ||
325 | } | 319 | } |
326 | 320 | ||
327 | /* | 321 | /* |
@@ -574,9 +568,7 @@ static inline int au0828_isoc_copy(struct au0828_dev *dev, struct urb *urb) | |||
574 | if (fbyte & 0x40) { | 568 | if (fbyte & 0x40) { |
575 | /* VBI */ | 569 | /* VBI */ |
576 | if (vbi_buf != NULL) | 570 | if (vbi_buf != NULL) |
577 | vbi_buffer_filled(dev, | 571 | buffer_filled(dev, vbi_dma_q, vbi_buf); |
578 | vbi_dma_q, | ||
579 | vbi_buf); | ||
580 | vbi_get_next_buf(vbi_dma_q, &vbi_buf); | 572 | vbi_get_next_buf(vbi_dma_q, &vbi_buf); |
581 | if (vbi_buf == NULL) | 573 | if (vbi_buf == NULL) |
582 | vbioutp = NULL; | 574 | vbioutp = NULL; |
@@ -899,12 +891,8 @@ void au0828_analog_unregister(struct au0828_dev *dev) | |||
899 | { | 891 | { |
900 | dprintk(1, "au0828_analog_unregister called\n"); | 892 | dprintk(1, "au0828_analog_unregister called\n"); |
901 | mutex_lock(&au0828_sysfs_lock); | 893 | mutex_lock(&au0828_sysfs_lock); |
902 | 894 | video_unregister_device(&dev->vdev); | |
903 | if (dev->vdev) | 895 | video_unregister_device(&dev->vbi_dev); |
904 | video_unregister_device(dev->vdev); | ||
905 | if (dev->vbi_dev) | ||
906 | video_unregister_device(dev->vbi_dev); | ||
907 | |||
908 | mutex_unlock(&au0828_sysfs_lock); | 896 | mutex_unlock(&au0828_sysfs_lock); |
909 | } | 897 | } |
910 | 898 | ||
@@ -949,7 +937,7 @@ static void au0828_vbi_buffer_timeout(unsigned long data) | |||
949 | if (buf != NULL) { | 937 | if (buf != NULL) { |
950 | vbi_data = vb2_plane_vaddr(&buf->vb, 0); | 938 | vbi_data = vb2_plane_vaddr(&buf->vb, 0); |
951 | memset(vbi_data, 0x00, buf->length); | 939 | memset(vbi_data, 0x00, buf->length); |
952 | vbi_buffer_filled(dev, dma_q, buf); | 940 | buffer_filled(dev, dma_q, buf); |
953 | } | 941 | } |
954 | vbi_get_next_buf(dma_q, &buf); | 942 | vbi_get_next_buf(dma_q, &buf); |
955 | 943 | ||
@@ -1286,7 +1274,7 @@ static int vidioc_enum_input(struct file *file, void *priv, | |||
1286 | input->audioset = 2; | 1274 | input->audioset = 2; |
1287 | } | 1275 | } |
1288 | 1276 | ||
1289 | input->std = dev->vdev->tvnorms; | 1277 | input->std = dev->vdev.tvnorms; |
1290 | 1278 | ||
1291 | return 0; | 1279 | return 0; |
1292 | } | 1280 | } |
@@ -1704,7 +1692,7 @@ static const struct v4l2_ioctl_ops video_ioctl_ops = { | |||
1704 | 1692 | ||
1705 | static const struct video_device au0828_video_template = { | 1693 | static const struct video_device au0828_video_template = { |
1706 | .fops = &au0828_v4l_fops, | 1694 | .fops = &au0828_v4l_fops, |
1707 | .release = video_device_release, | 1695 | .release = video_device_release_empty, |
1708 | .ioctl_ops = &video_ioctl_ops, | 1696 | .ioctl_ops = &video_ioctl_ops, |
1709 | .tvnorms = V4L2_STD_NTSC_M | V4L2_STD_PAL_M, | 1697 | .tvnorms = V4L2_STD_NTSC_M | V4L2_STD_PAL_M, |
1710 | }; | 1698 | }; |
@@ -1814,52 +1802,36 @@ int au0828_analog_register(struct au0828_dev *dev, | |||
1814 | dev->std = V4L2_STD_NTSC_M; | 1802 | dev->std = V4L2_STD_NTSC_M; |
1815 | au0828_s_input(dev, 0); | 1803 | au0828_s_input(dev, 0); |
1816 | 1804 | ||
1817 | /* allocate and fill v4l2 video struct */ | ||
1818 | dev->vdev = video_device_alloc(); | ||
1819 | if (NULL == dev->vdev) { | ||
1820 | dprintk(1, "Can't allocate video_device.\n"); | ||
1821 | return -ENOMEM; | ||
1822 | } | ||
1823 | |||
1824 | /* allocate the VBI struct */ | ||
1825 | dev->vbi_dev = video_device_alloc(); | ||
1826 | if (NULL == dev->vbi_dev) { | ||
1827 | dprintk(1, "Can't allocate vbi_device.\n"); | ||
1828 | ret = -ENOMEM; | ||
1829 | goto err_vdev; | ||
1830 | } | ||
1831 | |||
1832 | mutex_init(&dev->vb_queue_lock); | 1805 | mutex_init(&dev->vb_queue_lock); |
1833 | mutex_init(&dev->vb_vbi_queue_lock); | 1806 | mutex_init(&dev->vb_vbi_queue_lock); |
1834 | 1807 | ||
1835 | /* Fill the video capture device struct */ | 1808 | /* Fill the video capture device struct */ |
1836 | *dev->vdev = au0828_video_template; | 1809 | dev->vdev = au0828_video_template; |
1837 | dev->vdev->v4l2_dev = &dev->v4l2_dev; | 1810 | dev->vdev.v4l2_dev = &dev->v4l2_dev; |
1838 | dev->vdev->lock = &dev->lock; | 1811 | dev->vdev.lock = &dev->lock; |
1839 | dev->vdev->queue = &dev->vb_vidq; | 1812 | dev->vdev.queue = &dev->vb_vidq; |
1840 | dev->vdev->queue->lock = &dev->vb_queue_lock; | 1813 | dev->vdev.queue->lock = &dev->vb_queue_lock; |
1841 | strcpy(dev->vdev->name, "au0828a video"); | 1814 | strcpy(dev->vdev.name, "au0828a video"); |
1842 | 1815 | ||
1843 | /* Setup the VBI device */ | 1816 | /* Setup the VBI device */ |
1844 | *dev->vbi_dev = au0828_video_template; | 1817 | dev->vbi_dev = au0828_video_template; |
1845 | dev->vbi_dev->v4l2_dev = &dev->v4l2_dev; | 1818 | dev->vbi_dev.v4l2_dev = &dev->v4l2_dev; |
1846 | dev->vbi_dev->lock = &dev->lock; | 1819 | dev->vbi_dev.lock = &dev->lock; |
1847 | dev->vbi_dev->queue = &dev->vb_vbiq; | 1820 | dev->vbi_dev.queue = &dev->vb_vbiq; |
1848 | dev->vbi_dev->queue->lock = &dev->vb_vbi_queue_lock; | 1821 | dev->vbi_dev.queue->lock = &dev->vb_vbi_queue_lock; |
1849 | strcpy(dev->vbi_dev->name, "au0828a vbi"); | 1822 | strcpy(dev->vbi_dev.name, "au0828a vbi"); |
1850 | 1823 | ||
1851 | /* initialize videobuf2 stuff */ | 1824 | /* initialize videobuf2 stuff */ |
1852 | retval = au0828_vb2_setup(dev); | 1825 | retval = au0828_vb2_setup(dev); |
1853 | if (retval != 0) { | 1826 | if (retval != 0) { |
1854 | dprintk(1, "unable to setup videobuf2 queues (error = %d).\n", | 1827 | dprintk(1, "unable to setup videobuf2 queues (error = %d).\n", |
1855 | retval); | 1828 | retval); |
1856 | ret = -ENODEV; | 1829 | return -ENODEV; |
1857 | goto err_vbi_dev; | ||
1858 | } | 1830 | } |
1859 | 1831 | ||
1860 | /* Register the v4l2 device */ | 1832 | /* Register the v4l2 device */ |
1861 | video_set_drvdata(dev->vdev, dev); | 1833 | video_set_drvdata(&dev->vdev, dev); |
1862 | retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER, -1); | 1834 | retval = video_register_device(&dev->vdev, VFL_TYPE_GRABBER, -1); |
1863 | if (retval != 0) { | 1835 | if (retval != 0) { |
1864 | dprintk(1, "unable to register video device (error = %d).\n", | 1836 | dprintk(1, "unable to register video device (error = %d).\n", |
1865 | retval); | 1837 | retval); |
@@ -1868,8 +1840,8 @@ int au0828_analog_register(struct au0828_dev *dev, | |||
1868 | } | 1840 | } |
1869 | 1841 | ||
1870 | /* Register the vbi device */ | 1842 | /* Register the vbi device */ |
1871 | video_set_drvdata(dev->vbi_dev, dev); | 1843 | video_set_drvdata(&dev->vbi_dev, dev); |
1872 | retval = video_register_device(dev->vbi_dev, VFL_TYPE_VBI, -1); | 1844 | retval = video_register_device(&dev->vbi_dev, VFL_TYPE_VBI, -1); |
1873 | if (retval != 0) { | 1845 | if (retval != 0) { |
1874 | dprintk(1, "unable to register vbi device (error = %d).\n", | 1846 | dprintk(1, "unable to register vbi device (error = %d).\n", |
1875 | retval); | 1847 | retval); |
@@ -1882,14 +1854,10 @@ int au0828_analog_register(struct au0828_dev *dev, | |||
1882 | return 0; | 1854 | return 0; |
1883 | 1855 | ||
1884 | err_reg_vbi_dev: | 1856 | err_reg_vbi_dev: |
1885 | video_unregister_device(dev->vdev); | 1857 | video_unregister_device(&dev->vdev); |
1886 | err_reg_vdev: | 1858 | err_reg_vdev: |
1887 | vb2_queue_release(&dev->vb_vidq); | 1859 | vb2_queue_release(&dev->vb_vidq); |
1888 | vb2_queue_release(&dev->vb_vbiq); | 1860 | vb2_queue_release(&dev->vb_vbiq); |
1889 | err_vbi_dev: | ||
1890 | video_device_release(dev->vbi_dev); | ||
1891 | err_vdev: | ||
1892 | video_device_release(dev->vdev); | ||
1893 | return ret; | 1861 | return ret; |
1894 | } | 1862 | } |
1895 | 1863 | ||