[media] snd_tea575x: Add a cannot_mute flag
Hans de Goede [Fri, 18 May 2012 15:21:57 +0000 (12:21 -0300)]
Some devices which use the tea575x tuner chip don't allow direct control
over the IO pins, and thus cannot mute the audio output.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
CC: Ondrej Zary <linux@rainbow-software.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

include/sound/tea575x-tuner.h
sound/i2c/other/tea575x-tuner.c

index 7bd6f61..fe8590c 100644 (file)
@@ -53,6 +53,7 @@ struct snd_tea575x {
        int radio_nr;                   /* radio_nr */
        bool tea5759;                   /* 5759 chip is present */
        bool cannot_read_data;          /* Device cannot read the data pin */
+       bool cannot_mute;               /* Device cannot mute */
        bool mute;                      /* Device is muted? */
        bool stereo;                    /* receiving stereo */
        bool tuned;                     /* tuned to a station */
index 080aae9..d14edb7 100644 (file)
@@ -385,7 +385,6 @@ int snd_tea575x_init(struct snd_tea575x *tea, struct module *owner)
        strlcpy(tea->vd.name, tea->v4l2_dev->name, sizeof(tea->vd.name));
        tea->vd.lock = &tea->mutex;
        tea->vd.v4l2_dev = tea->v4l2_dev;
-       tea->vd.ctrl_handler = &tea->ctrl_handler;
        tea->fops = tea575x_fops;
        tea->fops.owner = owner;
        tea->vd.fops = &tea->fops;
@@ -394,29 +393,33 @@ int snd_tea575x_init(struct snd_tea575x *tea, struct module *owner)
        if (tea->cannot_read_data)
                v4l2_disable_ioctl(&tea->vd, VIDIOC_S_HW_FREQ_SEEK);
 
-       v4l2_ctrl_handler_init(&tea->ctrl_handler, 1);
-       v4l2_ctrl_new_std(&tea->ctrl_handler, &tea575x_ctrl_ops, V4L2_CID_AUDIO_MUTE, 0, 1, 1, 1);
-       retval = tea->ctrl_handler.error;
-       if (retval) {
-               v4l2_err(tea->v4l2_dev, "can't initialize controls\n");
-               v4l2_ctrl_handler_free(&tea->ctrl_handler);
-               return retval;
-       }
-
-       if (tea->ext_init) {
-               retval = tea->ext_init(tea);
+       if (!tea->cannot_mute) {
+               tea->vd.ctrl_handler = &tea->ctrl_handler;
+               v4l2_ctrl_handler_init(&tea->ctrl_handler, 1);
+               v4l2_ctrl_new_std(&tea->ctrl_handler, &tea575x_ctrl_ops,
+                                 V4L2_CID_AUDIO_MUTE, 0, 1, 1, 1);
+               retval = tea->ctrl_handler.error;
                if (retval) {
+                       v4l2_err(tea->v4l2_dev, "can't initialize controls\n");
                        v4l2_ctrl_handler_free(&tea->ctrl_handler);
                        return retval;
                }
-       }
 
-       v4l2_ctrl_handler_setup(&tea->ctrl_handler);
+               if (tea->ext_init) {
+                       retval = tea->ext_init(tea);
+                       if (retval) {
+                               v4l2_ctrl_handler_free(&tea->ctrl_handler);
+                               return retval;
+                       }
+               }
+
+               v4l2_ctrl_handler_setup(&tea->ctrl_handler);
+       }
 
        retval = video_register_device(&tea->vd, VFL_TYPE_RADIO, tea->radio_nr);
        if (retval) {
                v4l2_err(tea->v4l2_dev, "can't register video device!\n");
-               v4l2_ctrl_handler_free(&tea->ctrl_handler);
+               v4l2_ctrl_handler_free(tea->vd.ctrl_handler);
                return retval;
        }
 
@@ -426,7 +429,7 @@ int snd_tea575x_init(struct snd_tea575x *tea, struct module *owner)
 void snd_tea575x_exit(struct snd_tea575x *tea)
 {
        video_unregister_device(&tea->vd);
-       v4l2_ctrl_handler_free(&tea->ctrl_handler);
+       v4l2_ctrl_handler_free(tea->vd.ctrl_handler);
 }
 
 static int __init alsa_tea575x_module_init(void)