OSDN Git Service

[media] ivtv: fix v4l2-compliance errors for the radio device
authorHans Verkuil <hans.verkuil@cisco.com>
Mon, 1 Oct 2012 09:23:53 +0000 (06:23 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 1 Oct 2012 20:14:27 +0000 (17:14 -0300)
- fix error code when attempting to read from write-only streams.
- fix error code when attempting to write to read-only streams.
- don't start capturing when polling on a radio node.
- give the radio node its own file operations struct.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/pci/ivtv/ivtv-fileops.c
drivers/media/pci/ivtv/ivtv-streams.c

index 7f2eb5f..9caffd8 100644 (file)
@@ -435,7 +435,7 @@ int ivtv_start_capture(struct ivtv_open_id *id)
            s->type == IVTV_DEC_STREAM_TYPE_YUV ||
            s->type == IVTV_DEC_STREAM_TYPE_VOUT) {
                /* you cannot read from these stream types. */
-               return -EPERM;
+               return -EINVAL;
        }
 
        /* Try to claim this stream. */
@@ -564,7 +564,7 @@ static ssize_t ivtv_write(struct file *filp, const char __user *user_buf, size_t
            s->type != IVTV_DEC_STREAM_TYPE_YUV &&
            s->type != IVTV_DEC_STREAM_TYPE_VOUT)
                /* not decoder streams */
-               return -EPERM;
+               return -EINVAL;
 
        /* Try to claim this stream */
        if (ivtv_claim_stream(id, s->type))
@@ -775,6 +775,7 @@ unsigned int ivtv_v4l2_enc_poll(struct file *filp, poll_table *wait)
 
        /* Start a capture if there is none */
        if (!eof && !test_bit(IVTV_F_S_STREAMING, &s->s_flags) &&
+                       s->type != IVTV_ENC_STREAM_TYPE_RAD &&
                        (req_events & (POLLIN | POLLRDNORM))) {
                int rc;
 
index 7b8648a..3455f46 100644 (file)
@@ -65,6 +65,14 @@ static const struct v4l2_file_operations ivtv_v4l2_dec_fops = {
        .poll = ivtv_v4l2_dec_poll,
 };
 
+static const struct v4l2_file_operations ivtv_v4l2_radio_fops = {
+       .owner = THIS_MODULE,
+       .open = ivtv_v4l2_open,
+       .unlocked_ioctl = video_ioctl2,
+       .release = ivtv_v4l2_close,
+       .poll = ivtv_v4l2_enc_poll,
+};
+
 #define IVTV_V4L2_DEC_MPG_OFFSET  16   /* offset from 0 to register decoder mpg v4l2 minors on */
 #define IVTV_V4L2_ENC_PCM_OFFSET  24   /* offset from 0 to register pcm v4l2 minors on */
 #define IVTV_V4L2_ENC_YUV_OFFSET  32   /* offset from 0 to register yuv v4l2 minors on */
@@ -116,7 +124,7 @@ static struct {
                VFL_TYPE_RADIO, 0,
                PCI_DMA_NONE, 1,
                V4L2_CAP_RADIO | V4L2_CAP_TUNER,
-               &ivtv_v4l2_enc_fops
+               &ivtv_v4l2_radio_fops
        },
        {       /* IVTV_DEC_STREAM_TYPE_MPG */
                "decoder MPG",