Commit 91494182 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

media: staging: media: zoran: fix various V4L2 compliance errors

This fixes several issues found with 'v4l2-compliance -s':

1) read()/write() is supported, but not reported in the capabilities
2) S_STD(G_STD()) failed: setting the same standard should just return 0.
3) G_PARM failed to set readbuffers.
4) different field values in the format vs. what v4l2_buffer reported.
5) zero the sequence number when starting streaming.
6) drop VB_USERPTR: makes no sense with dma_contig streaming.
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarCorentin Labbe <clabbe@baylibre.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent e3b86f4e
...@@ -879,7 +879,7 @@ static int zoran_init_video_device(struct zoran *zr, struct video_device *video_ ...@@ -879,7 +879,7 @@ static int zoran_init_video_device(struct zoran *zr, struct video_device *video_
*video_dev = zoran_template; *video_dev = zoran_template;
video_dev->v4l2_dev = &zr->v4l2_dev; video_dev->v4l2_dev = &zr->v4l2_dev;
video_dev->lock = &zr->lock; video_dev->lock = &zr->lock;
video_dev->device_caps = V4L2_CAP_STREAMING | dir; video_dev->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_READWRITE | dir;
strscpy(video_dev->name, ZR_DEVNAME(zr), sizeof(video_dev->name)); strscpy(video_dev->name, ZR_DEVNAME(zr), sizeof(video_dev->name));
/* /*
......
...@@ -253,8 +253,6 @@ static int zoran_querycap(struct file *file, void *__fh, struct v4l2_capability ...@@ -253,8 +253,6 @@ static int zoran_querycap(struct file *file, void *__fh, struct v4l2_capability
strscpy(cap->card, ZR_DEVNAME(zr), sizeof(cap->card)); strscpy(cap->card, ZR_DEVNAME(zr), sizeof(cap->card));
strscpy(cap->driver, "zoran", sizeof(cap->driver)); strscpy(cap->driver, "zoran", sizeof(cap->driver));
snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s", pci_name(zr->pci_dev)); snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s", pci_name(zr->pci_dev));
cap->device_caps = zr->video_dev->device_caps;
cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
return 0; return 0;
} }
...@@ -580,6 +578,9 @@ static int zoran_s_std(struct file *file, void *__fh, v4l2_std_id std) ...@@ -580,6 +578,9 @@ static int zoran_s_std(struct file *file, void *__fh, v4l2_std_id std)
struct zoran *zr = video_drvdata(file); struct zoran *zr = video_drvdata(file);
int res = 0; int res = 0;
if (zr->norm == std)
return 0;
if (zr->running != ZORAN_MAP_MODE_NONE) if (zr->running != ZORAN_MAP_MODE_NONE)
return -EBUSY; return -EBUSY;
...@@ -737,6 +738,7 @@ static int zoran_g_parm(struct file *file, void *priv, struct v4l2_streamparm *p ...@@ -737,6 +738,7 @@ static int zoran_g_parm(struct file *file, void *priv, struct v4l2_streamparm *p
if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL; return -EINVAL;
parm->parm.capture.readbuffers = 9;
return 0; return 0;
} }
...@@ -867,6 +869,10 @@ int zr_set_buf(struct zoran *zr) ...@@ -867,6 +869,10 @@ int zr_set_buf(struct zoran *zr)
vbuf = &buf->vbuf; vbuf = &buf->vbuf;
buf->vbuf.field = V4L2_FIELD_INTERLACED; buf->vbuf.field = V4L2_FIELD_INTERLACED;
if (BUZ_MAX_HEIGHT < (zr->v4l_settings.height * 2))
buf->vbuf.field = V4L2_FIELD_INTERLACED;
else
buf->vbuf.field = V4L2_FIELD_TOP;
vb2_set_plane_payload(&buf->vbuf.vb2_buf, 0, zr->buffer_size); vb2_set_plane_payload(&buf->vbuf.vb2_buf, 0, zr->buffer_size);
vb2_buffer_done(&buf->vbuf.vb2_buf, VB2_BUF_STATE_DONE); vb2_buffer_done(&buf->vbuf.vb2_buf, VB2_BUF_STATE_DONE);
zr->inuse[0] = NULL; zr->inuse[0] = NULL;
...@@ -927,6 +933,7 @@ static int zr_vb2_start_streaming(struct vb2_queue *vq, unsigned int count) ...@@ -927,6 +933,7 @@ static int zr_vb2_start_streaming(struct vb2_queue *vq, unsigned int count)
zr->stat_com[j] = cpu_to_le32(1); zr->stat_com[j] = cpu_to_le32(1);
zr->inuse[j] = NULL; zr->inuse[j] = NULL;
} }
zr->vbseq = 0;
if (zr->map_mode != ZORAN_MAP_MODE_RAW) { if (zr->map_mode != ZORAN_MAP_MODE_RAW) {
pci_info(zr->pci_dev, "START JPG\n"); pci_info(zr->pci_dev, "START JPG\n");
...@@ -1017,7 +1024,7 @@ int zoran_queue_init(struct zoran *zr, struct vb2_queue *vq, int dir) ...@@ -1017,7 +1024,7 @@ int zoran_queue_init(struct zoran *zr, struct vb2_queue *vq, int dir)
vq->dev = &zr->pci_dev->dev; vq->dev = &zr->pci_dev->dev;
vq->type = dir; vq->type = dir;
vq->io_modes = VB2_USERPTR | VB2_DMABUF | VB2_MMAP | VB2_READ | VB2_WRITE; vq->io_modes = VB2_DMABUF | VB2_MMAP | VB2_READ | VB2_WRITE;
vq->drv_priv = zr; vq->drv_priv = zr;
vq->buf_struct_size = sizeof(struct zr_buffer); vq->buf_struct_size = sizeof(struct zr_buffer);
vq->ops = &zr_video_qops; vq->ops = &zr_video_qops;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment