Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 21615365 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

media: media/pci: set device_caps in struct video_device



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: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 374d62e7
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -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++)
	for (i = 0; i < dev->ext_vv_data->num_stds; i++)
		vfd->tvnorms |= dev->ext_vv_data->stds[i].id;
		vfd->tvnorms |= dev->ext_vv_data->stds[i].id;
	strscpy(vfd->name, name, sizeof(vfd->name));
	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);
	video_set_drvdata(vfd, dev);


	err = video_register_device(vfd, type, -1);
	err = video_register_device(vfd, type, -1);
+4 −14
Original line number Original line Diff line number Diff line
@@ -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)
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;
	struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;


	strscpy((char *)cap->driver, "saa7146 v4l2", sizeof(cap->driver));
	strscpy((char *)cap->driver, "saa7146 v4l2", sizeof(cap->driver));
	strscpy((char *)cap->card, dev->ext->name, sizeof(cap->card));
	strscpy((char *)cap->card, dev->ext->name, sizeof(cap->card));
	sprintf((char *)cap->bus_info, "PCI:%s", pci_name(dev->pci));
	sprintf((char *)cap->bus_info, "PCI:%s", pci_name(dev->pci));
	cap->device_caps =
	cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OVERLAY |
		V4L2_CAP_VIDEO_CAPTURE |
			    V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
		V4L2_CAP_VIDEO_OVERLAY |
			    V4L2_CAP_DEVICE_CAPS;
		V4L2_CAP_READWRITE |
	cap->capabilities |= dev->ext_vv_data->capabilities;
		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);
	return 0;
	return 0;
}
}


+22 −28
Original line number Original line Diff line number Diff line
@@ -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,
static int bttv_querycap(struct file *file, void  *priv,
				struct v4l2_capability *cap)
				struct v4l2_capability *cap)
{
{
	struct video_device *vdev = video_devdata(file);
	struct bttv_fh *fh = priv;
	struct bttv_fh *fh = priv;
	struct bttv *btv = fh->btv;
	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));
	strscpy(cap->card, btv->video_dev.name, sizeof(cap->card));
	snprintf(cap->bus_info, sizeof(cap->bus_info),
	snprintf(cap->bus_info, sizeof(cap->bus_info),
		 "PCI:%s", pci_name(btv->c.pci));
		 "PCI:%s", pci_name(btv->c.pci));
	cap->capabilities =
	cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
		V4L2_CAP_VIDEO_CAPTURE |
			    V4L2_CAP_STREAMING | V4L2_CAP_DEVICE_CAPS;
		V4L2_CAP_READWRITE |
		V4L2_CAP_STREAMING |
		V4L2_CAP_DEVICE_CAPS;
	if (no_overlay <= 0)
	if (no_overlay <= 0)
		cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY;
		cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY;
	if (video_is_registered(&btv->vbi_dev))
	if (video_is_registered(&btv->vbi_dev))
		cap->capabilities |= V4L2_CAP_VBI_CAPTURE;
		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;
		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
	 * 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;
		cap->capabilities |= V4L2_CAP_RDS_CAPTURE;
	if (btv->tuner_type != TUNER_ABSENT)
	if (btv->tuner_type != TUNER_ABSENT)
		cap->capabilities |= V4L2_CAP_TUNER;
		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;
	return 0;
}
}


@@ -3939,6 +3917,12 @@ static int bttv_register_video(struct bttv *btv)


	/* video */
	/* video */
	vdev_init(btv, &btv->video_dev, &bttv_video_template, "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,
	if (video_register_device(&btv->video_dev, VFL_TYPE_GRABBER,
				  video_nr[btv->c.nr]) < 0)
				  video_nr[btv->c.nr]) < 0)
@@ -3953,6 +3937,10 @@ static int bttv_register_video(struct bttv *btv)


	/* vbi */
	/* vbi */
	vdev_init(btv, &btv->vbi_dev, &bttv_video_template, "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,
	if (video_register_device(&btv->vbi_dev, VFL_TYPE_VBI,
				  vbi_nr[btv->c.nr]) < 0)
				  vbi_nr[btv->c.nr]) < 0)
@@ -3964,6 +3952,12 @@ static int bttv_register_video(struct bttv *btv)
		return 0;
		return 0;
	/* radio */
	/* radio */
	vdev_init(btv, &btv->radio_dev, &radio_template, "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;
	btv->radio_dev.ctrl_handler = &btv->radio_ctrl_handler;
	if (video_register_device(&btv->radio_dev, VFL_TYPE_RADIO,
	if (video_register_device(&btv->radio_dev, VFL_TYPE_RADIO,
				  radio_nr[btv->c.nr]) < 0)
				  radio_nr[btv->c.nr]) < 0)
+7 −7
Original line number Original line Diff line number Diff line
@@ -483,13 +483,8 @@ static int cobalt_querycap(struct file *file, void *priv_fh,
	strscpy(vcap->card, "cobalt", sizeof(vcap->card));
	strscpy(vcap->card, "cobalt", sizeof(vcap->card));
	snprintf(vcap->bus_info, sizeof(vcap->bus_info),
	snprintf(vcap->bus_info, sizeof(vcap->bus_info),
		 "PCIe:%s", pci_name(cobalt->pci_dev));
		 "PCIe:%s", pci_name(cobalt->pci_dev));
	vcap->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
	vcap->capabilities = V4L2_CAP_STREAMING | V4L2_CAP_READWRITE |
	if (s->is_output)
		V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_DEVICE_CAPS;
		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;
	if (cobalt->have_hsma_tx)
	if (cobalt->have_hsma_tx)
		vcap->capabilities |= V4L2_CAP_VIDEO_OUTPUT;
		vcap->capabilities |= V4L2_CAP_VIDEO_OUTPUT;
	return 0;
	return 0;
@@ -1274,6 +1269,11 @@ static int cobalt_node_register(struct cobalt *cobalt, int node)
	q->lock = &s->lock;
	q->lock = &s->lock;
	q->dev = &cobalt->pci_dev->dev;
	q->dev = &cobalt->pci_dev->dev;
	vdev->queue = q;
	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);
	video_set_drvdata(vdev, s);
	ret = vb2_queue_init(q);
	ret = vb2_queue_init(q);
+1 −4
Original line number Original line Diff line number Diff line
@@ -385,16 +385,13 @@ static int cx18_querycap(struct file *file, void *fh,
				struct v4l2_capability *vcap)
				struct v4l2_capability *vcap)
{
{
	struct cx18_open_id *id = fh2id(fh);
	struct cx18_open_id *id = fh2id(fh);
	struct cx18_stream *s = video_drvdata(file);
	struct cx18 *cx = id->cx;
	struct cx18 *cx = id->cx;


	strscpy(vcap->driver, CX18_DRIVER_NAME, sizeof(vcap->driver));
	strscpy(vcap->driver, CX18_DRIVER_NAME, sizeof(vcap->driver));
	strscpy(vcap->card, cx->card_name, sizeof(vcap->card));
	strscpy(vcap->card, cx->card_name, sizeof(vcap->card));
	snprintf(vcap->bus_info, sizeof(vcap->bus_info),
	snprintf(vcap->bus_info, sizeof(vcap->bus_info),
		 "PCI:%s", pci_name(cx->pci_dev));
		 "PCI:%s", pci_name(cx->pci_dev));
	vcap->capabilities = cx->v4l2_cap;	/* capabilities */
	vcap->capabilities = cx->v4l2_cap | V4L2_CAP_DEVICE_CAPS;
	vcap->device_caps = s->v4l2_dev_caps;	/* device capabilities */
	vcap->capabilities |= V4L2_CAP_DEVICE_CAPS;
	return 0;
	return 0;
}
}


Loading