Hi,

On Mon, Apr 8, 2013 at 6:47 AM, Hans Verkuil <hverk...@xs4all.nl> wrote:
> From: Hans Verkuil <hans.verk...@cisco.com>
>
> - check for invalid modulators.
> - clamp frequency to valid range.
>
> Signed-off-by: Hans Verkuil <hans.verk...@cisco.com>

Acked-by: Eduardo Valentin <edubez...@gmail.com>
Tested-by: Eduardo Valentin <edubez...@gmail.com>

Here is the output of v4l2-compliant:
is radio
Driver Info:
        Driver name   : radio-si4713
        Card type     : Silicon Labs Si4713 Modulator
        Bus info      : platform:radio-si4713
        Driver version: 3.9.0
        Capabilities  : 0x80080800
                RDS Output
                Modulator
                Device Capabilities
        Device Caps   : 0x00080800
                RDS Output
                Modulator

Compliance test for device /dev/radio0 (not using libv4l2):

Required ioctls:
                fail: v4l2-compliance.cpp(321): !(dcaps & io_caps)
        test VIDIOC_QUERYCAP: FAIL

Allow for multiple opens:
        test second radio open: OK
                fail: v4l2-compliance.cpp(321): !(dcaps & io_caps)
        test VIDIOC_QUERYCAP: FAIL
                fail: v4l2-compliance.cpp(335): doioctl(node, 
VIDIOC_G_PRIORITY, &prio)
        test VIDIOC_G/S_PRIORITY: FAIL

Debug ioctls:
        test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
        test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
        test VIDIOC_G/S_TUNER: OK (Not Supported)
        test VIDIOC_G/S_FREQUENCY: OK
        test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
        test VIDIOC_ENUMAUDIO: OK (Not Supported)
        test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
        test VIDIOC_G/S_AUDIO: OK (Not Supported)
        Inputs: 0 Audio Inputs: 0 Tuners: 0

Output ioctls:
        test VIDIOC_G/S_MODULATOR: OK
        test VIDIOC_G/S_FREQUENCY: OK
        test VIDIOC_ENUMAUDOUT: OK (Not Supported)
        test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
        test VIDIOC_G/S_AUDOUT: OK (Not Supported)
        Outputs: 0 Audio Outputs: 0 Modulators: 1

Control ioctls:
                fail: v4l2-test-controls.cpp(145): can do querymenu on a 
non-menu control
                fail: v4l2-test-controls.cpp(201): invalid control 00980001
        test VIDIOC_QUERYCTRL/MENU: FAIL
                fail: v4l2-test-controls.cpp(442): g_ctrl accepted invalid 
control ID
        test VIDIOC_G/S_CTRL: FAIL
                fail: v4l2-test-controls.cpp(511): g_ext_ctrls does not support 
count == 0
        test VIDIOC_G/S/TRY_EXT_CTRLS: FAIL
        test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported)
        test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
        Standard Controls: 0 Private Controls: 0

Input/Output configuration ioctls:
        test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
        test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
        test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)

Format ioctls:
        test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK (Not Supported)
        test VIDIOC_G/S_PARM: OK (Not Supported)
        test VIDIOC_G_FBUF: OK (Not Supported)
        test VIDIOC_G_FMT: OK (Not Supported)
        test VIDIOC_TRY_FMT: OK (Not Supported)
        test VIDIOC_S_FMT: OK (Not Supported)
        test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)

Codec ioctls:
        test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
        test VIDIOC_G_ENC_INDEX: OK (Not Supported)
        test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls:
        test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK (Not Supported)

Total: 36, Succeeded: 30, Failed: 6, Warnings: 0

> ---
>  drivers/media/radio/si4713-i2c.c |    9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/media/radio/si4713-i2c.c 
> b/drivers/media/radio/si4713-i2c.c
> index 1cb9a2e..facd669 100644
> --- a/drivers/media/radio/si4713-i2c.c
> +++ b/drivers/media/radio/si4713-i2c.c
> @@ -1852,7 +1852,8 @@ static int si4713_g_frequency(struct v4l2_subdev *sd, 
> struct v4l2_frequency *f)
>         struct si4713_device *sdev = to_si4713_device(sd);
>         int rval = 0;
>
> -       f->type = V4L2_TUNER_RADIO;
> +       if (f->tuner)
> +               return -EINVAL;
>
>         if (sdev->power_state) {
>                 u16 freq;
> @@ -1877,9 +1878,11 @@ static int si4713_s_frequency(struct v4l2_subdev *sd, 
> const struct v4l2_frequenc
>         int rval = 0;
>         u16 frequency = v4l2_to_si4713(f->frequency);
>
> +       if (f->tuner)
> +               return -EINVAL;
> +
>         /* Check frequency range */
> -       if (frequency < FREQ_RANGE_LOW || frequency > FREQ_RANGE_HIGH)
> -               return -EDOM;
> +       frequency = clamp_t(u16, frequency, FREQ_RANGE_LOW, FREQ_RANGE_HIGH);
>
>         if (sdev->power_state) {
>                 rval = si4713_tx_tune_freq(sdev, frequency);
> --
> 1.7.10.4
>



-- 
Eduardo Bezerra Valentin
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to