]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
media: media/pci: set device_caps in struct video_device
authorHans Verkuil <hverkuil@xs4all.nl>
Mon, 17 Jun 2019 09:36:16 +0000 (05:36 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 24 Jun 2019 18:57:12 +0000 (14:57 -0400)
Instead of filling in the struct v4l2_capability device_caps
field, fill in the struct video_device device_caps field.

That way the V4L2 core knows what the capabilities of the
video device are.

But this only really works if all drivers use this, so convert
all pci drivers in this patch.

Tested with cx88-blackbird and ivtv PVR-350.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
27 files changed:
drivers/media/common/saa7146/saa7146_fops.c
drivers/media/common/saa7146/saa7146_video.c
drivers/media/pci/bt8xx/bttv-driver.c
drivers/media/pci/cobalt/cobalt-v4l2.c
drivers/media/pci/cx18/cx18-ioctl.c
drivers/media/pci/cx18/cx18-streams.c
drivers/media/pci/cx23885/cx23885-417.c
drivers/media/pci/cx23885/cx23885-video.c
drivers/media/pci/cx25821/cx25821-video.c
drivers/media/pci/cx88/cx88-blackbird.c
drivers/media/pci/cx88/cx88-video.c
drivers/media/pci/dt3155/dt3155.c
drivers/media/pci/ivtv/ivtv-cards.h
drivers/media/pci/ivtv/ivtv-ioctl.c
drivers/media/pci/ivtv/ivtv-streams.c
drivers/media/pci/ivtv/ivtvfb.c
drivers/media/pci/meye/meye.c
drivers/media/pci/saa7134/saa7134-core.c
drivers/media/pci/saa7134/saa7134-empress.c
drivers/media/pci/saa7134/saa7134-video.c
drivers/media/pci/saa7164/saa7164-encoder.c
drivers/media/pci/saa7164/saa7164-vbi.c
drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c
drivers/media/pci/solo6x10/solo6x10-v4l2.c
drivers/media/pci/sta2x11/sta2x11_vip.c
drivers/media/pci/tw68/tw68-video.c
drivers/media/pci/tw686x/tw686x-video.c

index be4f80a40214f222f9ae968994a0c6bca6187811..aabb830e746891a489d7f78dba39abb00b6e3fcb 100644 (file)
@@ -608,6 +608,15 @@ int saa7146_register_device(struct video_device *vfd, struct saa7146_dev *dev,
        for (i = 0; i < dev->ext_vv_data->num_stds; i++)
                vfd->tvnorms |= dev->ext_vv_data->stds[i].id;
        strscpy(vfd->name, name, sizeof(vfd->name));
+       vfd->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OVERLAY |
+                          V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
+       vfd->device_caps |= dev->ext_vv_data->capabilities;
+       if (type == VFL_TYPE_GRABBER)
+               vfd->device_caps &=
+                       ~(V4L2_CAP_VBI_CAPTURE | V4L2_CAP_SLICED_VBI_OUTPUT);
+       else
+               vfd->device_caps &=
+                       ~(V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_AUDIO);
        video_set_drvdata(vfd, dev);
 
        err = video_register_device(vfd, type, -1);
index a0f0b5eef0bd8fc04461dc45de949593ddc8ce28..4c399a42e874c2157975e89c3f95884d9597b9e2 100644 (file)
@@ -448,25 +448,15 @@ static int video_end(struct saa7146_fh *fh, struct file *file)
 
 static int vidioc_querycap(struct file *file, void *fh, struct v4l2_capability *cap)
 {
-       struct video_device *vdev = video_devdata(file);
        struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
 
        strscpy((char *)cap->driver, "saa7146 v4l2", sizeof(cap->driver));
        strscpy((char *)cap->card, dev->ext->name, sizeof(cap->card));
        sprintf((char *)cap->bus_info, "PCI:%s", pci_name(dev->pci));
-       cap->device_caps =
-               V4L2_CAP_VIDEO_CAPTURE |
-               V4L2_CAP_VIDEO_OVERLAY |
-               V4L2_CAP_READWRITE |
-               V4L2_CAP_STREAMING;
-       cap->device_caps |= dev->ext_vv_data->capabilities;
-       cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
-       if (vdev->vfl_type == VFL_TYPE_GRABBER)
-               cap->device_caps &=
-                       ~(V4L2_CAP_VBI_CAPTURE | V4L2_CAP_SLICED_VBI_OUTPUT);
-       else
-               cap->device_caps &=
-                       ~(V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_AUDIO);
+       cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OVERLAY |
+                           V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
+                           V4L2_CAP_DEVICE_CAPS;
+       cap->capabilities |= dev->ext_vv_data->capabilities;
        return 0;
 }
 
index 636e6a2549a9dab720a29d29b762e1cf4bbfa60b..612d1c0010c19a5047f2021eed45c2713f6c9549 100644 (file)
@@ -2453,7 +2453,6 @@ static int bttv_s_fmt_vid_overlay(struct file *file, void *priv,
 static int bttv_querycap(struct file *file, void  *priv,
                                struct v4l2_capability *cap)
 {
-       struct video_device *vdev = video_devdata(file);
        struct bttv_fh *fh = priv;
        struct bttv *btv = fh->btv;
 
@@ -2464,17 +2463,17 @@ static int bttv_querycap(struct file *file, void  *priv,
        strscpy(cap->card, btv->video_dev.name, sizeof(cap->card));
        snprintf(cap->bus_info, sizeof(cap->bus_info),
                 "PCI:%s", pci_name(btv->c.pci));
-       cap->capabilities =
-               V4L2_CAP_VIDEO_CAPTURE |
-               V4L2_CAP_READWRITE |
-               V4L2_CAP_STREAMING |
-               V4L2_CAP_DEVICE_CAPS;
+       cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
+                           V4L2_CAP_STREAMING | V4L2_CAP_DEVICE_CAPS;
        if (no_overlay <= 0)
                cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY;
        if (video_is_registered(&btv->vbi_dev))
                cap->capabilities |= V4L2_CAP_VBI_CAPTURE;
-       if (video_is_registered(&btv->radio_dev))
+       if (video_is_registered(&btv->radio_dev)) {
                cap->capabilities |= V4L2_CAP_RADIO;
+               if (btv->has_tea575x)
+                       cap->capabilities |= V4L2_CAP_HW_FREQ_SEEK;
+       }
 
        /*
         * No need to lock here: those vars are initialized during board
@@ -2484,27 +2483,6 @@ static int bttv_querycap(struct file *file, void  *priv,
                cap->capabilities |= V4L2_CAP_RDS_CAPTURE;
        if (btv->tuner_type != TUNER_ABSENT)
                cap->capabilities |= V4L2_CAP_TUNER;
-       if (vdev->vfl_type == VFL_TYPE_GRABBER)
-               cap->device_caps = cap->capabilities &
-                       (V4L2_CAP_VIDEO_CAPTURE |
-                        V4L2_CAP_READWRITE |
-                        V4L2_CAP_STREAMING |
-                        V4L2_CAP_VIDEO_OVERLAY |
-                        V4L2_CAP_TUNER);
-       else if (vdev->vfl_type == VFL_TYPE_VBI)
-               cap->device_caps = cap->capabilities &
-                       (V4L2_CAP_VBI_CAPTURE |
-                        V4L2_CAP_READWRITE |
-                        V4L2_CAP_STREAMING |
-                        V4L2_CAP_TUNER);
-       else {
-               cap->device_caps = V4L2_CAP_RADIO | V4L2_CAP_TUNER;
-               if (btv->has_saa6588)
-                       cap->device_caps |= V4L2_CAP_READWRITE |
-                                               V4L2_CAP_RDS_CAPTURE;
-               if (btv->has_tea575x)
-                       cap->device_caps |= V4L2_CAP_HW_FREQ_SEEK;
-       }
        return 0;
 }
 
@@ -3939,6 +3917,12 @@ static int bttv_register_video(struct bttv *btv)
 
        /* video */
        vdev_init(btv, &btv->video_dev, &bttv_video_template, "video");
+       btv->video_dev.device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER |
+                                    V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
+       if (btv->tuner_type != TUNER_ABSENT)
+               btv->video_dev.device_caps |= V4L2_CAP_TUNER;
+       if (no_overlay <= 0)
+               btv->video_dev.device_caps |= V4L2_CAP_VIDEO_OVERLAY;
 
        if (video_register_device(&btv->video_dev, VFL_TYPE_GRABBER,
                                  video_nr[btv->c.nr]) < 0)
@@ -3953,6 +3937,10 @@ static int bttv_register_video(struct bttv *btv)
 
        /* vbi */
        vdev_init(btv, &btv->vbi_dev, &bttv_video_template, "vbi");
+       btv->vbi_dev.device_caps = V4L2_CAP_VBI_CAPTURE | V4L2_CAP_READWRITE |
+                                  V4L2_CAP_STREAMING | V4L2_CAP_TUNER;
+       if (btv->tuner_type != TUNER_ABSENT)
+               btv->vbi_dev.device_caps |= V4L2_CAP_TUNER;
 
        if (video_register_device(&btv->vbi_dev, VFL_TYPE_VBI,
                                  vbi_nr[btv->c.nr]) < 0)
@@ -3964,6 +3952,12 @@ static int bttv_register_video(struct bttv *btv)
                return 0;
        /* radio */
        vdev_init(btv, &btv->radio_dev, &radio_template, "radio");
+       btv->radio_dev.device_caps = V4L2_CAP_RADIO | V4L2_CAP_TUNER;
+       if (btv->has_saa6588)
+               btv->radio_dev.device_caps |= V4L2_CAP_READWRITE |
+                                             V4L2_CAP_RDS_CAPTURE;
+       if (btv->has_tea575x)
+               btv->radio_dev.device_caps |= V4L2_CAP_HW_FREQ_SEEK;
        btv->radio_dev.ctrl_handler = &btv->radio_ctrl_handler;
        if (video_register_device(&btv->radio_dev, VFL_TYPE_RADIO,
                                  radio_nr[btv->c.nr]) < 0)
index f9fa3a7c3b8f86fded93f5056ee44982534d5145..39dabd4da60fd2f9bac4f558846602a92380cb78 100644 (file)
@@ -483,13 +483,8 @@ static int cobalt_querycap(struct file *file, void *priv_fh,
        strscpy(vcap->card, "cobalt", sizeof(vcap->card));
        snprintf(vcap->bus_info, sizeof(vcap->bus_info),
                 "PCIe:%s", pci_name(cobalt->pci_dev));
-       vcap->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
-       if (s->is_output)
-               vcap->device_caps |= V4L2_CAP_VIDEO_OUTPUT;
-       else
-               vcap->device_caps |= V4L2_CAP_VIDEO_CAPTURE;
-       vcap->capabilities = vcap->device_caps | V4L2_CAP_DEVICE_CAPS |
-               V4L2_CAP_VIDEO_CAPTURE;
+       vcap->capabilities = V4L2_CAP_STREAMING | V4L2_CAP_READWRITE |
+               V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_DEVICE_CAPS;
        if (cobalt->have_hsma_tx)
                vcap->capabilities |= V4L2_CAP_VIDEO_OUTPUT;
        return 0;
@@ -1274,6 +1269,11 @@ static int cobalt_node_register(struct cobalt *cobalt, int node)
        q->lock = &s->lock;
        q->dev = &cobalt->pci_dev->dev;
        vdev->queue = q;
+       vdev->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
+       if (s->is_output)
+               vdev->device_caps |= V4L2_CAP_VIDEO_OUTPUT;
+       else
+               vdev->device_caps |= V4L2_CAP_VIDEO_CAPTURE;
 
        video_set_drvdata(vdev, s);
        ret = vb2_queue_init(q);
index 9f5972f6d3a6a0a242e25138852df1cf45be2b73..d9ffc9c359ca81253436cb062b753aea950bc821 100644 (file)
@@ -385,16 +385,13 @@ static int cx18_querycap(struct file *file, void *fh,
                                struct v4l2_capability *vcap)
 {
        struct cx18_open_id *id = fh2id(fh);
-       struct cx18_stream *s = video_drvdata(file);
        struct cx18 *cx = id->cx;
 
        strscpy(vcap->driver, CX18_DRIVER_NAME, sizeof(vcap->driver));
        strscpy(vcap->card, cx->card_name, sizeof(vcap->card));
        snprintf(vcap->bus_info, sizeof(vcap->bus_info),
                 "PCI:%s", pci_name(cx->pci_dev));
-       vcap->capabilities = cx->v4l2_cap;      /* capabilities */
-       vcap->device_caps = s->v4l2_dev_caps;   /* device capabilities */
-       vcap->capabilities |= V4L2_CAP_DEVICE_CAPS;
+       vcap->capabilities = cx->v4l2_cap | V4L2_CAP_DEVICE_CAPS;
        return 0;
 }
 
index 9805e50c2477fefd79330c40c6005994fec3a281..b79718519b9ba895ca4e4700fd7ac865695be59b 100644 (file)
@@ -411,6 +411,7 @@ static int cx18_reg_dev(struct cx18 *cx, int type)
                return 0;
 
        num = s->video_dev.num;
+       s->video_dev.device_caps = s->v4l2_dev_caps;    /* device capabilities */
        /* card number + user defined offset + device offset */
        if (type != CX18_ENC_STREAM_TYPE_MPG) {
                struct cx18_stream *s_mpg = &cx->streams[CX18_ENC_STREAM_TYPE_MPG];
index 8aa5f9b1498aa1b1e3e0ac811f9bef56f1b68cb9..82f96a4091aca56084d005a5e5d3b72a3dd1009a 100644 (file)
@@ -1324,12 +1324,11 @@ static int vidioc_querycap(struct file *file, void  *priv,
        strscpy(cap->card, cx23885_boards[tsport->dev->board].name,
                sizeof(cap->card));
        sprintf(cap->bus_info, "PCIe:%s", pci_name(dev->pci));
-       cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
-                          V4L2_CAP_STREAMING;
+       cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
+                           V4L2_CAP_STREAMING | V4L2_CAP_VBI_CAPTURE |
+                           V4L2_CAP_AUDIO | V4L2_CAP_DEVICE_CAPS;
        if (dev->tuner_type != TUNER_ABSENT)
-               cap->device_caps |= V4L2_CAP_TUNER;
-       cap->capabilities = cap->device_caps | V4L2_CAP_VBI_CAPTURE |
-               V4L2_CAP_AUDIO | V4L2_CAP_DEVICE_CAPS;
+               cap->capabilities |= V4L2_CAP_TUNER;
 
        return 0;
 }
@@ -1542,6 +1541,10 @@ int cx23885_417_register(struct cx23885_dev *dev)
        video_set_drvdata(dev->v4l_device, dev);
        dev->v4l_device->lock = &dev->lock;
        dev->v4l_device->queue = q;
+       dev->v4l_device->device_caps = V4L2_CAP_VIDEO_CAPTURE |
+                                      V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
+       if (dev->tuner_type != TUNER_ABSENT)
+               dev->v4l_device->device_caps |= V4L2_CAP_TUNER;
        err = video_register_device(dev->v4l_device,
                VFL_TYPE_GRABBER, -1);
        if (err < 0) {
index 0c59ecccc38ae7e4cfc7041e19497c4a687f5f61..b254473db9a3849725bd31f69b947df5542ec277 100644 (file)
@@ -627,21 +627,17 @@ static int vidioc_querycap(struct file *file, void  *priv,
        struct v4l2_capability *cap)
 {
        struct cx23885_dev *dev = video_drvdata(file);
-       struct video_device *vdev = video_devdata(file);
 
        strscpy(cap->driver, "cx23885", sizeof(cap->driver));
        strscpy(cap->card, cx23885_boards[dev->board].name,
                sizeof(cap->card));
        sprintf(cap->bus_info, "PCIe:%s", pci_name(dev->pci));
-       cap->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING | V4L2_CAP_AUDIO;
+       cap->capabilities = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
+                           V4L2_CAP_AUDIO | V4L2_CAP_VBI_CAPTURE |
+                           V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VBI_CAPTURE |
+                           V4L2_CAP_DEVICE_CAPS;
        if (dev->tuner_type != TUNER_ABSENT)
-               cap->device_caps |= V4L2_CAP_TUNER;
-       if (vdev->vfl_type == VFL_TYPE_VBI)
-               cap->device_caps |= V4L2_CAP_VBI_CAPTURE;
-       else
-               cap->device_caps |= V4L2_CAP_VIDEO_CAPTURE;
-       cap->capabilities = cap->device_caps | V4L2_CAP_VBI_CAPTURE |
-               V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_DEVICE_CAPS;
+               cap->capabilities |= V4L2_CAP_TUNER;
        return 0;
 }
 
@@ -1306,6 +1302,10 @@ int cx23885_video_register(struct cx23885_dev *dev)
        dev->video_dev = cx23885_vdev_init(dev, dev->pci,
                &cx23885_video_template, "video");
        dev->video_dev->queue = &dev->vb2_vidq;
+       dev->video_dev->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
+                                     V4L2_CAP_AUDIO | V4L2_CAP_VIDEO_CAPTURE;
+       if (dev->tuner_type != TUNER_ABSENT)
+               dev->video_dev->device_caps |= V4L2_CAP_TUNER;
        err = video_register_device(dev->video_dev, VFL_TYPE_GRABBER,
                                    video_nr[dev->nr]);
        if (err < 0) {
@@ -1320,6 +1320,10 @@ int cx23885_video_register(struct cx23885_dev *dev)
        dev->vbi_dev = cx23885_vdev_init(dev, dev->pci,
                &cx23885_vbi_template, "vbi");
        dev->vbi_dev->queue = &dev->vb2_vbiq;
+       dev->vbi_dev->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
+                                   V4L2_CAP_AUDIO | V4L2_CAP_VBI_CAPTURE;
+       if (dev->tuner_type != TUNER_ABSENT)
+               dev->vbi_dev->device_caps |= V4L2_CAP_TUNER;
        err = video_register_device(dev->vbi_dev, VFL_TYPE_VBI,
                                    vbi_nr[dev->nr]);
        if (err < 0) {
index 1bb5dfc74e27b623b4a189f3a70c4db04d138ccc..de76411704782f8b0630262bb887bfd710d0f775 100644 (file)
@@ -426,18 +426,13 @@ static int cx25821_vidioc_querycap(struct file *file, void *priv,
 {
        struct cx25821_channel *chan = video_drvdata(file);
        struct cx25821_dev *dev = chan->dev;
-       const u32 cap_input = V4L2_CAP_VIDEO_CAPTURE |
-                       V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
-       const u32 cap_output = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_READWRITE;
 
        strscpy(cap->driver, "cx25821", sizeof(cap->driver));
        strscpy(cap->card, cx25821_boards[dev->board].name, sizeof(cap->card));
        sprintf(cap->bus_info, "PCIe:%s", pci_name(dev->pci));
-       if (chan->id >= VID_CHANNEL_NUM)
-               cap->device_caps = cap_output;
-       else
-               cap->device_caps = cap_input;
-       cap->capabilities = cap_input | cap_output | V4L2_CAP_DEVICE_CAPS;
+       cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT |
+                           V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
+                           V4L2_CAP_DEVICE_CAPS;
        return 0;
 }
 
@@ -624,6 +619,8 @@ static const struct video_device cx25821_video_device = {
        .minor = -1,
        .ioctl_ops = &video_ioctl_ops,
        .tvnorms = CX25821_NORMS,
+       .device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
+                      V4L2_CAP_STREAMING,
 };
 
 static const struct v4l2_file_operations video_out_fops = {
@@ -657,6 +654,7 @@ static const struct video_device cx25821_video_out_device = {
        .minor = -1,
        .ioctl_ops = &video_out_ioctl_ops,
        .tvnorms = CX25821_NORMS,
+       .device_caps = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_READWRITE,
 };
 
 void cx25821_video_unregister(struct cx25821_dev *dev, int chan_num)
index 64dd8b6cf808cfd097b571a864664f2261a6532d..200d688270738d9f1f9954c86dcfbebc67d550ab 100644 (file)
@@ -1136,6 +1136,10 @@ static int blackbird_register_video(struct cx8802_dev *dev)
        dev->mpeg_dev.ctrl_handler = &dev->cxhdl.hdl;
        video_set_drvdata(&dev->mpeg_dev, dev);
        dev->mpeg_dev.queue = &dev->vb2_mpegq;
+       dev->mpeg_dev.device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
+                                   V4L2_CAP_VIDEO_CAPTURE;
+       if (dev->core->board.tuner_type != UNSET)
+               dev->mpeg_dev.device_caps |= V4L2_CAP_TUNER;
        err = video_register_device(&dev->mpeg_dev, VFL_TYPE_GRABBER, -1);
        if (err < 0) {
                pr_info("can't register mpeg device\n");
index 5256ad7ead3894c5bc927ffc201096c93ae0c838..e59a74514c7c8c26456776876ae99594076243a7 100644 (file)
@@ -800,27 +800,12 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
 int cx88_querycap(struct file *file, struct cx88_core *core,
                  struct v4l2_capability *cap)
 {
-       struct video_device *vdev = video_devdata(file);
-
        strscpy(cap->card, core->board.name, sizeof(cap->card));
-       cap->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
+       cap->capabilities = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
+                           V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VBI_CAPTURE |
+                           V4L2_CAP_DEVICE_CAPS;
        if (core->board.tuner_type != UNSET)
-               cap->device_caps |= V4L2_CAP_TUNER;
-       switch (vdev->vfl_type) {
-       case VFL_TYPE_RADIO:
-               cap->device_caps = V4L2_CAP_RADIO | V4L2_CAP_TUNER;
-               break;
-       case VFL_TYPE_GRABBER:
-               cap->device_caps |= V4L2_CAP_VIDEO_CAPTURE;
-               break;
-       case VFL_TYPE_VBI:
-               cap->device_caps |= V4L2_CAP_VBI_CAPTURE;
-               break;
-       default:
-               return -EINVAL;
-       }
-       cap->capabilities = cap->device_caps | V4L2_CAP_VIDEO_CAPTURE |
-               V4L2_CAP_VBI_CAPTURE | V4L2_CAP_DEVICE_CAPS;
+               cap->capabilities |= V4L2_CAP_TUNER;
        if (core->board.radio.type == CX88_RADIO)
                cap->capabilities |= V4L2_CAP_RADIO;
        return 0;
@@ -1473,6 +1458,10 @@ static int cx8800_initdev(struct pci_dev *pci_dev,
        video_set_drvdata(&dev->video_dev, dev);
        dev->video_dev.ctrl_handler = &core->video_hdl;
        dev->video_dev.queue = &dev->vb2_vidq;
+       dev->video_dev.device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
+                                    V4L2_CAP_VIDEO_CAPTURE;
+       if (core->board.tuner_type != UNSET)
+               dev->video_dev.device_caps |= V4L2_CAP_TUNER;
        err = video_register_device(&dev->video_dev, VFL_TYPE_GRABBER,
                                    video_nr[core->nr]);
        if (err < 0) {
@@ -1486,6 +1475,10 @@ static int cx8800_initdev(struct pci_dev *pci_dev,
                       &cx8800_vbi_template, "vbi");
        video_set_drvdata(&dev->vbi_dev, dev);
        dev->vbi_dev.queue = &dev->vb2_vbiq;
+       dev->vbi_dev.device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
+                                  V4L2_CAP_VBI_CAPTURE;
+       if (core->board.tuner_type != UNSET)
+               dev->vbi_dev.device_caps |= V4L2_CAP_TUNER;
        err = video_register_device(&dev->vbi_dev, VFL_TYPE_VBI,
                                    vbi_nr[core->nr]);
        if (err < 0) {
@@ -1500,6 +1493,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev,
                               &cx8800_radio_template, "radio");
                video_set_drvdata(&dev->radio_dev, dev);
                dev->radio_dev.ctrl_handler = &core->audio_hdl;
+               dev->radio_dev.device_caps = V4L2_CAP_RADIO | V4L2_CAP_TUNER;
                err = video_register_device(&dev->radio_dev, VFL_TYPE_RADIO,
                                            radio_nr[core->nr]);
                if (err < 0) {
index d6d29e61aae93e8bf40970489d0d41d1459b4836..b4cdda50e742984d4d74093be751ea2121dc50da 100644 (file)
@@ -297,9 +297,6 @@ static int dt3155_querycap(struct file *filp, void *p,
        strscpy(cap->driver, DT3155_NAME, sizeof(cap->driver));
        strscpy(cap->card, DT3155_NAME " frame grabber", sizeof(cap->card));
        sprintf(cap->bus_info, "PCI:%s", pci_name(pd->pdev));
-       cap->device_caps = V4L2_CAP_VIDEO_CAPTURE |
-               V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
-       cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
        return 0;
 }
 
@@ -490,6 +487,8 @@ static const struct video_device dt3155_vdev = {
        .minor = -1,
        .release = video_device_release_empty,
        .tvnorms = V4L2_STD_ALL,
+       .device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING |
+                      V4L2_CAP_READWRITE,
 };
 
 static int dt3155_probe(struct pci_dev *pdev, const struct pci_device_id *id)
index 965def0cbfaaac80cc9ebb7207d1b0c9b250bb78..f3e2c5634962be764007cfd2803b43fb0b9f886f 100644 (file)
 #define IVTV_CAP_ENCODER (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER | \
                          V4L2_CAP_AUDIO | V4L2_CAP_READWRITE | V4L2_CAP_VBI_CAPTURE | \
                          V4L2_CAP_SLICED_VBI_CAPTURE)
-#define IVTV_CAP_DECODER (V4L2_CAP_VIDEO_OUTPUT | \
-                         V4L2_CAP_SLICED_VBI_OUTPUT | V4L2_CAP_VIDEO_OUTPUT_OVERLAY)
+#define IVTV_CAP_DECODER (V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_SLICED_VBI_OUTPUT)
 
 struct ivtv_card_video_input {
        u8  video_type;         /* video input type */
index d1e358a2273ee118fa7961357dc9b8877df76861..5595f6a274e766c3755e3870bf343300d26e8e13 100644 (file)
@@ -734,18 +734,11 @@ static int ivtv_querycap(struct file *file, void *fh, struct v4l2_capability *vc
 {
        struct ivtv_open_id *id = fh2id(file->private_data);
        struct ivtv *itv = id->itv;
-       struct ivtv_stream *s = &itv->streams[id->type];
 
        strscpy(vcap->driver, IVTV_DRIVER_NAME, sizeof(vcap->driver));
        strscpy(vcap->card, itv->card_name, sizeof(vcap->card));
        snprintf(vcap->bus_info, sizeof(vcap->bus_info), "PCI:%s", pci_name(itv->pdev));
        vcap->capabilities = itv->v4l2_cap | V4L2_CAP_DEVICE_CAPS;
-       vcap->device_caps = s->caps;
-       if ((s->caps & V4L2_CAP_VIDEO_OUTPUT_OVERLAY) &&
-           !itv->osd_video_pbase) {
-               vcap->capabilities &= ~V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
-               vcap->device_caps &= ~V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
-       }
        return 0;
 }
 
index a641f20e3f86fb00d9880af19beddb3dc3120348..f7de9118f609dd482a65a06b4e6f6d3cd08aa91b 100644 (file)
@@ -139,8 +139,7 @@ static struct {
                "decoder MPG",
                VFL_TYPE_GRABBER, IVTV_V4L2_DEC_MPG_OFFSET,
                PCI_DMA_TODEVICE, 0,
-               V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE |
-               V4L2_CAP_VIDEO_OUTPUT_OVERLAY,
+               V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
                &ivtv_v4l2_dec_fops
        },
        {       /* IVTV_DEC_STREAM_TYPE_VBI */
@@ -161,8 +160,7 @@ static struct {
                "decoder YUV",
                VFL_TYPE_GRABBER, IVTV_V4L2_DEC_YUV_OFFSET,
                PCI_DMA_TODEVICE, 0,
-               V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE |
-               V4L2_CAP_VIDEO_OUTPUT_OVERLAY,
+               V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_AUDIO | V4L2_CAP_READWRITE,
                &ivtv_v4l2_dec_fops
        }
 };
@@ -301,6 +299,14 @@ static int ivtv_reg_dev(struct ivtv *itv, int type)
                if (s_mpg->vdev.v4l2_dev)
                        num = s_mpg->vdev.num + ivtv_stream_info[type].num_offset;
        }
+       s->vdev.device_caps = s->caps;
+       if (itv->osd_video_pbase) {
+               itv->streams[IVTV_DEC_STREAM_TYPE_YUV].vdev.device_caps |=
+                       V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
+               itv->streams[IVTV_DEC_STREAM_TYPE_MPG].vdev.device_caps |=
+                       V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
+               itv->v4l2_cap |= V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
+       }
        video_set_drvdata(&s->vdev, s);
 
        /* Register device. First try the desired minor, then any free one. */
index 66be490ec56306c732611a5dc659101d4056b0d6..800b3654cac518f19c8b5ae4484282db07d7c3fb 100644 (file)
@@ -1220,6 +1220,11 @@ static int ivtvfb_init_card(struct ivtv *itv)
 
        /* Allocate DMA */
        ivtv_udma_alloc(itv);
+       itv->streams[IVTV_DEC_STREAM_TYPE_YUV].vdev.device_caps |=
+               V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
+       itv->streams[IVTV_DEC_STREAM_TYPE_MPG].vdev.device_caps |=
+               V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
+       itv->v4l2_cap |= V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
        return 0;
 
 }
@@ -1246,6 +1251,11 @@ static int ivtvfb_callback_cleanup(struct device *dev, void *p)
        struct osd_info *oi = itv->osd_info;
 
        if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) {
+               itv->streams[IVTV_DEC_STREAM_TYPE_YUV].vdev.device_caps &=
+                       ~V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
+               itv->streams[IVTV_DEC_STREAM_TYPE_MPG].vdev.device_caps &=
+                       ~V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
+               itv->v4l2_cap &= ~V4L2_CAP_VIDEO_OUTPUT_OVERLAY;
                if (unregister_framebuffer(&itv->osd_info->ivtvfb_info)) {
                        IVTVFB_WARN("Framebuffer %d is in use, cannot unload\n",
                                       itv->instance);
index bbe91b0f256525c592b9c2d808cfcf336b3cdc38..8218810c899eca193490c85fcd1ab458ea49618b 100644 (file)
@@ -1013,11 +1013,6 @@ static int vidioc_querycap(struct file *file, void *fh,
        strscpy(cap->driver, "meye", sizeof(cap->driver));
        strscpy(cap->card, "meye", sizeof(cap->card));
        sprintf(cap->bus_info, "PCI:%s", pci_name(meye.mchip_dev));
-
-       cap->device_caps = V4L2_CAP_VIDEO_CAPTURE |
-                           V4L2_CAP_STREAMING;
-       cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
-
        return 0;
 }
 
@@ -1529,6 +1524,7 @@ static const struct video_device meye_template = {
        .fops           = &meye_fops,
        .ioctl_ops      = &meye_ioctl_ops,
        .release        = video_device_release_empty,
+       .device_caps    = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING,
 };
 
 static const struct v4l2_ctrl_ops meye_ctrl_ops = {
index fa9a0ead46d5c63a3242d4958a934d507a261990..2d582c02adbf92068ac1160baa3e2be0a550b074 100644 (file)
@@ -1206,6 +1206,14 @@ static int saa7134_initdev(struct pci_dev *pci_dev,
        dev->video_dev->ctrl_handler = &dev->ctrl_handler;
        dev->video_dev->lock = &dev->lock;
        dev->video_dev->queue = &dev->video_vbq;
+       dev->video_dev->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
+                                     V4L2_CAP_VIDEO_CAPTURE;
+       if (dev->tuner_type != TUNER_ABSENT && dev->tuner_type != UNSET)
+               dev->video_dev->device_caps |= V4L2_CAP_TUNER;
+
+       if (saa7134_no_overlay <= 0)
+               dev->video_dev->device_caps |= V4L2_CAP_VIDEO_OVERLAY;
+
        err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER,
                                    video_nr[dev->nr]);
        if (err < 0) {
@@ -1220,6 +1228,10 @@ static int saa7134_initdev(struct pci_dev *pci_dev,
        dev->vbi_dev->ctrl_handler = &dev->ctrl_handler;
        dev->vbi_dev->lock = &dev->lock;
        dev->vbi_dev->queue = &dev->vbi_vbq;
+       dev->vbi_dev->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
+                                   V4L2_CAP_VBI_CAPTURE;
+       if (dev->tuner_type != TUNER_ABSENT && dev->tuner_type != UNSET)
+               dev->vbi_dev->device_caps |= V4L2_CAP_TUNER;
 
        err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI,
                                    vbi_nr[dev->nr]);
@@ -1232,6 +1244,9 @@ static int saa7134_initdev(struct pci_dev *pci_dev,
                dev->radio_dev = vdev_init(dev,&saa7134_radio_template,"radio");
                dev->radio_dev->ctrl_handler = &dev->radio_ctrl_handler;
                dev->radio_dev->lock = &dev->lock;
+               dev->radio_dev->device_caps = V4L2_CAP_RADIO | V4L2_CAP_TUNER;
+               if (dev->has_rds)
+                       dev->radio_dev->device_caps |= V4L2_CAP_RDS_CAPTURE;
                err = video_register_device(dev->radio_dev,VFL_TYPE_RADIO,
                                            radio_nr[dev->nr]);
                if (err < 0)
index 17eafaa5bf02d80d59b94acd65fce59757151951..1a41a56afec6485ed41ceccf96507196e486c50d 100644 (file)
@@ -287,6 +287,10 @@ static int empress_init(struct saa7134_dev *dev)
        if (err)
                return err;
        dev->empress_dev->queue = q;
+       dev->empress_dev->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
+                                       V4L2_CAP_VIDEO_CAPTURE;
+       if (dev->tuner_type != TUNER_ABSENT && dev->tuner_type != UNSET)
+               dev->empress_dev->device_caps |= V4L2_CAP_TUNER;
 
        video_set_drvdata(dev->empress_dev, dev);
        err = video_register_device(dev->empress_dev,VFL_TYPE_GRABBER,
index 89c1271476c7ce5f7e3c9b45e2702c11bdbad70f..606df51bb636b00b392dda3ec4eff6d43678f983 100644 (file)
@@ -1489,50 +1489,20 @@ int saa7134_querycap(struct file *file, void *priv,
                                        struct v4l2_capability *cap)
 {
        struct saa7134_dev *dev = video_drvdata(file);
-       struct video_device *vdev = video_devdata(file);
-       u32 radio_caps, video_caps, vbi_caps;
-
-       unsigned int tuner_type = dev->tuner_type;
 
        strscpy(cap->driver, "saa7134", sizeof(cap->driver));
        strscpy(cap->card, saa7134_boards[dev->board].name,
                sizeof(cap->card));
        sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci));
-
-       cap->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
-       if ((tuner_type != TUNER_ABSENT) && (tuner_type != UNSET))
-               cap->device_caps |= V4L2_CAP_TUNER;
-
-       radio_caps = V4L2_CAP_RADIO;
+       cap->capabilities = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
+                           V4L2_CAP_RADIO | V4L2_CAP_VIDEO_CAPTURE |
+                           V4L2_CAP_VBI_CAPTURE | V4L2_CAP_DEVICE_CAPS;
+       if (dev->tuner_type != TUNER_ABSENT && dev->tuner_type != UNSET)
+               cap->capabilities |= V4L2_CAP_TUNER;
        if (dev->has_rds)
-               radio_caps |= V4L2_CAP_RDS_CAPTURE;
-
-       video_caps = V4L2_CAP_VIDEO_CAPTURE;
-       if (saa7134_no_overlay <= 0 && !is_empress(file))
-               video_caps |= V4L2_CAP_VIDEO_OVERLAY;
-
-       vbi_caps = V4L2_CAP_VBI_CAPTURE;
-
-       switch (vdev->vfl_type) {
-       case VFL_TYPE_RADIO:
-               cap->device_caps |= radio_caps;
-               break;
-       case VFL_TYPE_GRABBER:
-               cap->device_caps |= video_caps;
-               break;
-       case VFL_TYPE_VBI:
-               cap->device_caps |= vbi_caps;
-               break;
-       default:
-               return -EINVAL;
-       }
-       cap->capabilities = radio_caps | video_caps | vbi_caps |
-               cap->device_caps | V4L2_CAP_DEVICE_CAPS;
-       if (vdev->vfl_type == VFL_TYPE_RADIO) {
-               cap->device_caps &= ~V4L2_CAP_STREAMING;
-               if (!dev->has_rds)
-                       cap->device_caps &= ~V4L2_CAP_READWRITE;
-       }
+               cap->capabilities |= V4L2_CAP_RDS_CAPTURE;
+       if (saa7134_no_overlay <= 0)
+               cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY;
 
        return 0;
 }
index dcfabad8b284ac3d0e5f765486deb3ffd999edae..43fdaa2d32bd73d329deb792ecd6460935e6a103 100644 (file)
@@ -491,16 +491,9 @@ static int vidioc_querycap(struct file *file, void  *priv,
        strscpy(cap->card, saa7164_boards[dev->board].name,
                sizeof(cap->card));
        sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci));
-
-       cap->device_caps =
-               V4L2_CAP_VIDEO_CAPTURE |
-               V4L2_CAP_READWRITE |
-               V4L2_CAP_TUNER;
-
-       cap->capabilities = cap->device_caps |
-               V4L2_CAP_VBI_CAPTURE |
-               V4L2_CAP_DEVICE_CAPS;
-
+       cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
+                           V4L2_CAP_TUNER | V4L2_CAP_VBI_CAPTURE |
+                           V4L2_CAP_DEVICE_CAPS;
        return 0;
 }
 
@@ -973,6 +966,8 @@ static struct video_device saa7164_mpeg_template = {
        .ioctl_ops     = &mpeg_ioctl_ops,
        .minor         = -1,
        .tvnorms       = SAA7164_NORMS,
+       .device_caps   = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
+                        V4L2_CAP_TUNER,
 };
 
 static struct video_device *saa7164_encoder_alloc(
index 154a04d17ce57b3434c0eb589253c8ba91cb7a0d..49d61a64c8cbe17f96d28df72674716c8043a206 100644 (file)
@@ -202,16 +202,9 @@ static int vidioc_querycap(struct file *file, void  *priv,
        strscpy(cap->card, saa7164_boards[dev->board].name,
                sizeof(cap->card));
        sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci));
-
-       cap->device_caps =
-               V4L2_CAP_VBI_CAPTURE |
-               V4L2_CAP_READWRITE |
-               V4L2_CAP_TUNER;
-
-       cap->capabilities = cap->device_caps |
-               V4L2_CAP_VIDEO_CAPTURE |
-               V4L2_CAP_DEVICE_CAPS;
-
+       cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
+                           V4L2_CAP_TUNER | V4L2_CAP_VBI_CAPTURE |
+                           V4L2_CAP_DEVICE_CAPS;
        return 0;
 }
 
@@ -675,6 +668,8 @@ static struct video_device saa7164_vbi_template = {
        .ioctl_ops     = &vbi_ioctl_ops,
        .minor         = -1,
        .tvnorms       = SAA7164_NORMS,
+       .device_caps   = V4L2_CAP_VBI_CAPTURE | V4L2_CAP_READWRITE |
+                        V4L2_CAP_TUNER,
 };
 
 static struct video_device *saa7164_vbi_alloc(
index 73698cc26dd504a7b9171b4f07778b765973ad49..609100a46ff842a1fec3ccf6e33a5bab0bf8f672 100644 (file)
@@ -771,9 +771,6 @@ static int solo_enc_querycap(struct file *file, void  *priv,
                 solo_enc->ch);
        snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s",
                 pci_name(solo_dev->pdev));
-       cap->device_caps = V4L2_CAP_VIDEO_CAPTURE |
-                       V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
-       cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
        return 0;
 }
 
@@ -1191,6 +1188,8 @@ static const struct video_device solo_enc_template = {
        .minor                  = -1,
        .release                = video_device_release,
        .tvnorms                = V4L2_STD_NTSC_M | V4L2_STD_PAL,
+       .device_caps            = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
+                                 V4L2_CAP_STREAMING,
 };
 
 static const struct v4l2_ctrl_ops solo_ctrl_ops = {
index 1ce431af8fc6f110c5f11f6354cc1fe414dd9917..a968f75920b522657662eb21ca4781a08d1fc086 100644 (file)
@@ -378,9 +378,6 @@ static int solo_querycap(struct file *file, void  *priv,
        strscpy(cap->card, "Softlogic 6x10", sizeof(cap->card));
        snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s",
                 pci_name(solo_dev->pdev));
-       cap->device_caps = V4L2_CAP_VIDEO_CAPTURE |
-                       V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
-       cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
        return 0;
 }
 
@@ -628,6 +625,8 @@ static const struct video_device solo_v4l2_template = {
        .minor                  = -1,
        .release                = video_device_release,
        .tvnorms                = V4L2_STD_NTSC_M | V4L2_STD_PAL,
+       .device_caps            = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
+                                 V4L2_CAP_STREAMING,
 };
 
 static const struct v4l2_ctrl_ops solo_ctrl_ops = {
index 9de5b2a355192ae307af82704b721c1e89680579..e52e29814378cb1364e79de64ade1c4769afecd4 100644 (file)
@@ -407,10 +407,6 @@ static int vidioc_querycap(struct file *file, void *priv,
        strscpy(cap->card, KBUILD_MODNAME, sizeof(cap->card));
        snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s",
                 pci_name(vip->pdev));
-       cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
-                          V4L2_CAP_STREAMING;
-       cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
-
        return 0;
 }
 
@@ -759,6 +755,8 @@ static const struct video_device video_dev_template = {
        .fops = &vip_fops,
        .ioctl_ops = &vip_ioctl_ops,
        .tvnorms = V4L2_STD_ALL,
+       .device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
+                      V4L2_CAP_STREAMING,
 };
 
 /**
index 5b469cf578f546a5c20b3fa1ba9f5dae965d532c..8e0952d65ad4f9f8e19d53767de98b030b673849 100644 (file)
@@ -729,12 +729,6 @@ static int tw68_querycap(struct file *file, void  *priv,
        strscpy(cap->card, "Techwell Capture Card",
                sizeof(cap->card));
        sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci));
-       cap->device_caps =
-               V4L2_CAP_VIDEO_CAPTURE |
-               V4L2_CAP_READWRITE |
-               V4L2_CAP_STREAMING;
-
-       cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
        return 0;
 }
 
@@ -913,6 +907,8 @@ static const struct video_device tw68_video_template = {
        .ioctl_ops              = &video_ioctl_ops,
        .release                = video_device_release_empty,
        .tvnorms                = TW68_NORMS,
+       .device_caps            = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
+                                 V4L2_CAP_STREAMING,
 };
 
 /* ------------------------------------------------------------------ */
index 377fb1e453fa14e269ed9730bdd1fb5e80122738..9be8c6e4fb6930203c59ada7b4293e2f72e42caf 100644 (file)
@@ -765,9 +765,6 @@ static int tw686x_querycap(struct file *file, void *priv,
        strscpy(cap->card, dev->name, sizeof(cap->card));
        snprintf(cap->bus_info, sizeof(cap->bus_info),
                 "PCI:%s", pci_name(dev->pci_dev));
-       cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING |
-                          V4L2_CAP_READWRITE;
-       cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
        return 0;
 }
 
@@ -1280,6 +1277,8 @@ int tw686x_video_init(struct tw686x_dev *dev)
                vdev->minor = -1;
                vdev->lock = &vc->vb_mutex;
                vdev->ctrl_handler = &vc->ctrl_handler;
+               vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE |
+                                   V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
                vc->device = vdev;
                video_set_drvdata(vdev, vc);