ALSA: hda - Fix memory leaks at error path in patch_cirrus.c
[pandora-kernel.git] / sound / pci / hda / patch_cirrus.c
index 70a7abd..e449278 100644 (file)
@@ -920,16 +920,14 @@ static void cs_automute(struct hda_codec *codec)
 
        /* mute speakers if spdif or hp jack is plugged in */
        for (i = 0; i < cfg->speaker_outs; i++) {
+               int pin_ctl = hp_present ? 0 : PIN_OUT;
+               /* detect on spdif is specific to CS421x */
+               if (spdif_present && (spec->vendor_nid == CS421X_VENDOR_NID))
+                       pin_ctl = 0;
+
                nid = cfg->speaker_pins[i];
                snd_hda_codec_write(codec, nid, 0,
-                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
-                                   hp_present ? 0 : PIN_OUT);
-               /* detect on spdif is specific to CS421x */
-               if (spec->vendor_nid == CS421X_VENDOR_NID) {
-                       snd_hda_codec_write(codec, nid, 0,
-                                       AC_VERB_SET_PIN_WIDGET_CONTROL,
-                                       spdif_present ? 0 : PIN_OUT);
-               }
+                                   AC_VERB_SET_PIN_WIDGET_CONTROL, pin_ctl);
        }
        if (spec->gpio_eapd_hp) {
                unsigned int gpio = hp_present ?
@@ -978,8 +976,10 @@ static void cs_automic(struct hda_codec *codec)
        /* specific to CS421x, single ADC */
        if (spec->vendor_nid == CS421X_VENDOR_NID) {
                if (present) {
-                       spec->last_input = spec->cur_input;
-                       spec->cur_input = spec->automic_idx;
+                       if (spec->cur_input != spec->automic_idx) {
+                               spec->last_input = spec->cur_input;
+                               spec->cur_input = spec->automic_idx;
+                       }
                } else  {
                        spec->cur_input = spec->last_input;
                }
@@ -1404,7 +1404,7 @@ static int patch_cs420x(struct hda_codec *codec)
        return 0;
 
  error:
-       kfree(codec->spec);
+       cs_free(codec);
        codec->spec = NULL;
        return err;
 }
@@ -1771,30 +1771,19 @@ static int build_cs421x_output(struct hda_codec *codec)
        struct auto_pin_cfg *cfg = &spec->autocfg;
        struct snd_kcontrol *kctl;
        int err;
-       char *name = "HP/Speakers";
+       char *name = "Master";
 
        fix_volume_caps(codec, dac);
-       if (!spec->vmaster_sw) {
-               err = add_vmaster(codec, dac);
-               if (err < 0)
-                       return err;
-       }
 
        err = add_mute(codec, name, 0,
                        HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT), 0, &kctl);
        if (err < 0)
                return err;
-       err = snd_ctl_add_slave(spec->vmaster_sw, kctl);
-       if (err < 0)
-               return err;
 
        err = add_volume(codec, name, 0,
                        HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT), 0, &kctl);
        if (err < 0)
                return err;
-       err = snd_ctl_add_slave(spec->vmaster_vol, kctl);
-       if (err < 0)
-               return err;
 
        if (cfg->speaker_outs) {
                err = snd_hda_ctl_add(codec, 0,
@@ -1960,7 +1949,7 @@ static int patch_cs421x(struct hda_codec *codec)
        return 0;
 
  error:
-       kfree(codec->spec);
+       cs_free(codec);
        codec->spec = NULL;
        return err;
 }