aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/common/saa7146_video.c
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2012-05-01 11:57:57 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-05-14 14:00:49 -0400
commitab49ae0f201f1e7e07250d011fffde8ed2530175 (patch)
tree0fb1a572c621f44b3974c994b65e4a7ba9902201 /drivers/media/common/saa7146_video.c
parent537fa492e084af58d16899f8d0f3f3516a4fbe7c (diff)
[media] saa7146: fix querycap, vbi/video separation and g/s_register
The querycap ioctl returned an incorrect version number and incorrect capabilities (mixing up vbi and video caps). The reason for that was that video nodes could do vbi activities: that should be separated between the vbi and video nodes. There were also a few minor problems with dbg_g/s_register that have been resolved. The mxb/saa7146 driver now passes the v4l2_compliance tests. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/common/saa7146_video.c')
-rw-r--r--drivers/media/common/saa7146_video.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/drivers/media/common/saa7146_video.c b/drivers/media/common/saa7146_video.c
index 4ca9a256151..9d193208b89 100644
--- a/drivers/media/common/saa7146_video.c
+++ b/drivers/media/common/saa7146_video.c
@@ -446,18 +446,24 @@ static int video_end(struct saa7146_fh *fh, struct file *file)
446 446
447static int vidioc_querycap(struct file *file, void *fh, struct v4l2_capability *cap) 447static int vidioc_querycap(struct file *file, void *fh, struct v4l2_capability *cap)
448{ 448{
449 struct video_device *vdev = video_devdata(file);
449 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev; 450 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
450 451
451 strcpy((char *)cap->driver, "saa7146 v4l2"); 452 strcpy((char *)cap->driver, "saa7146 v4l2");
452 strlcpy((char *)cap->card, dev->ext->name, sizeof(cap->card)); 453 strlcpy((char *)cap->card, dev->ext->name, sizeof(cap->card));
453 sprintf((char *)cap->bus_info, "PCI:%s", pci_name(dev->pci)); 454 sprintf((char *)cap->bus_info, "PCI:%s", pci_name(dev->pci));
454 cap->version = SAA7146_VERSION_CODE;
455 cap->device_caps = 455 cap->device_caps =
456 V4L2_CAP_VIDEO_CAPTURE | 456 V4L2_CAP_VIDEO_CAPTURE |
457 V4L2_CAP_VIDEO_OVERLAY | 457 V4L2_CAP_VIDEO_OVERLAY |
458 V4L2_CAP_READWRITE | 458 V4L2_CAP_READWRITE |
459 V4L2_CAP_STREAMING; 459 V4L2_CAP_STREAMING;
460 cap->device_caps |= dev->ext_vv_data->capabilities; 460 cap->device_caps |= dev->ext_vv_data->capabilities;
461 if (vdev->vfl_type == VFL_TYPE_GRABBER)
462 cap->device_caps &=
463 ~(V4L2_CAP_VBI_CAPTURE | V4L2_CAP_SLICED_VBI_OUTPUT);
464 else
465 cap->device_caps &=
466 ~(V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OVERLAY);
461 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; 467 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
462 return 0; 468 return 0;
463} 469}
@@ -990,10 +996,14 @@ static int vidioc_g_chip_ident(struct file *file, void *__fh,
990 996
991 chip->ident = V4L2_IDENT_NONE; 997 chip->ident = V4L2_IDENT_NONE;
992 chip->revision = 0; 998 chip->revision = 0;
993 if (chip->match.type == V4L2_CHIP_MATCH_HOST && !chip->match.addr) { 999 if (chip->match.type == V4L2_CHIP_MATCH_HOST) {
994 chip->ident = V4L2_IDENT_SAA7146; 1000 if (v4l2_chip_match_host(&chip->match))
1001 chip->ident = V4L2_IDENT_SAA7146;
995 return 0; 1002 return 0;
996 } 1003 }
1004 if (chip->match.type != V4L2_CHIP_MATCH_I2C_DRIVER &&
1005 chip->match.type != V4L2_CHIP_MATCH_I2C_ADDR)
1006 return -EINVAL;
997 return v4l2_device_call_until_err(&dev->v4l2_dev, 0, 1007 return v4l2_device_call_until_err(&dev->v4l2_dev, 0,
998 core, g_chip_ident, chip); 1008 core, g_chip_ident, chip);
999} 1009}
@@ -1008,7 +1018,6 @@ const struct v4l2_ioctl_ops saa7146_video_ioctl_ops = {
1008 .vidioc_g_fmt_vid_overlay = vidioc_g_fmt_vid_overlay, 1018 .vidioc_g_fmt_vid_overlay = vidioc_g_fmt_vid_overlay,
1009 .vidioc_try_fmt_vid_overlay = vidioc_try_fmt_vid_overlay, 1019 .vidioc_try_fmt_vid_overlay = vidioc_try_fmt_vid_overlay,
1010 .vidioc_s_fmt_vid_overlay = vidioc_s_fmt_vid_overlay, 1020 .vidioc_s_fmt_vid_overlay = vidioc_s_fmt_vid_overlay,
1011 .vidioc_g_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
1012 .vidioc_g_chip_ident = vidioc_g_chip_ident, 1021 .vidioc_g_chip_ident = vidioc_g_chip_ident,
1013 1022
1014 .vidioc_overlay = vidioc_overlay, 1023 .vidioc_overlay = vidioc_overlay,
@@ -1027,6 +1036,24 @@ const struct v4l2_ioctl_ops saa7146_video_ioctl_ops = {
1027 .vidioc_unsubscribe_event = v4l2_event_unsubscribe, 1036 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1028}; 1037};
1029 1038
1039const struct v4l2_ioctl_ops saa7146_vbi_ioctl_ops = {
1040 .vidioc_querycap = vidioc_querycap,
1041 .vidioc_g_fmt_vbi_cap = vidioc_g_fmt_vbi_cap,
1042 .vidioc_g_chip_ident = vidioc_g_chip_ident,
1043
1044 .vidioc_reqbufs = vidioc_reqbufs,
1045 .vidioc_querybuf = vidioc_querybuf,
1046 .vidioc_qbuf = vidioc_qbuf,
1047 .vidioc_dqbuf = vidioc_dqbuf,
1048 .vidioc_g_std = vidioc_g_std,
1049 .vidioc_s_std = vidioc_s_std,
1050 .vidioc_streamon = vidioc_streamon,
1051 .vidioc_streamoff = vidioc_streamoff,
1052 .vidioc_g_parm = vidioc_g_parm,
1053 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1054 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1055};
1056
1030/*********************************************************************************/ 1057/*********************************************************************************/
1031/* buffer handling functions */ 1058/* buffer handling functions */
1032 1059