Yep, I'm happy to report that does indeed fix it! Thank-you Takashi! :) Andy. --- Takashi Iwai <tiwai@xxxxxxx> wrote: > At Wed, 25 Jul 2007 16:51:25 +0100 (BST), > Andy wrote: > > > > Hello again Takashi, > > > > I put in some printks, and indeed the function > does > > run and it correctly detects that there are no > > headphones present, but the speakers are not > unmuted. > > > > (the 'mute' variable both times is reported as > being > > 0x80 after it is set with snd_hda_codec_amp_read) > > Ah, it means that this intiailization gets called > before restoring the > mixer elements. Since sony model doesn't have the > mixer element for > the NID 0x14 that is linked with 0x15, 0x14 isn't > restored properly in > the end. > > How about the patch below? It's a bit too ad hoc, > but better than > buggy. > > > Takashi > > diff -r 43059389c583 pci/hda/patch_realtek.c > --- a/pci/hda/patch_realtek.c Tue Jul 24 18:04:05 > 2007 +0200 > +++ b/pci/hda/patch_realtek.c Wed Jul 25 18:35:06 > 2007 +0200 > @@ -7140,9 +7140,28 @@ static struct > snd_kcontrol_new alc262_HP > { } /* end */ > }; > > +static int alc262_sony_sw_put(struct snd_kcontrol > *kcontrol, > + struct snd_ctl_elem_value *ucontrol) > +{ > + unsigned long private_save = > kcontrol->private_value; > + int change; > + kcontrol->private_value = > HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT); > + change = snd_hda_mixer_amp_switch_put(kcontrol, > ucontrol); > + kcontrol->private_value = private_save; > + change |= snd_hda_mixer_amp_switch_put(kcontrol, > ucontrol); > + return change; > +} > + > static struct snd_kcontrol_new alc262_sony_mixer[] > = { > HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, > 0x0, HDA_OUTPUT), > - HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, > HDA_OUTPUT), > + { > + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, > + .name = "Front Playback Switch", > + .info = snd_hda_mixer_amp_switch_info, > + .get = snd_hda_mixer_amp_switch_get, > + .put = alc262_sony_sw_put, > + .private_value = HDA_COMPOSE_AMP_VAL(0x15, 3, 0, > HDA_OUTPUT), > + }, > HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, > HDA_INPUT), > HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, > HDA_INPUT), > HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", > 0x0b, 0x01, HDA_INPUT), > @@ -7269,20 +7288,17 @@ static struct hda_verb > alc262_sony_unsol > }; > > /* mute/unmute internal speaker according to the hp > jack and mute state */ > -static void alc262_hippo_automute(struct hda_codec > *codec, int force) > +static void alc262_hippo_automute(struct hda_codec > *codec) > { > struct alc_spec *spec = codec->spec; > unsigned int mute; > - > - if (force || !spec->sense_updated) { > - unsigned int present; > - /* need to execute and sync at first */ > - snd_hda_codec_read(codec, 0x15, 0, > AC_VERB_SET_PIN_SENSE, 0); > - present = snd_hda_codec_read(codec, 0x15, 0, > - AC_VERB_GET_PIN_SENSE, 0); > - spec->jack_present = (present & 0x80000000) != 0; > - spec->sense_updated = 1; > - } > + unsigned int present; > + > + /* need to execute and sync at first */ > + snd_hda_codec_read(codec, 0x15, 0, > AC_VERB_SET_PIN_SENSE, 0); > + present = snd_hda_codec_read(codec, 0x15, 0, > + AC_VERB_GET_PIN_SENSE, 0); > + spec->jack_present = (present & 0x80000000) != 0; > if (spec->jack_present) { > /* mute internal speaker */ > snd_hda_codec_amp_update(codec, 0x14, 0, > HDA_OUTPUT, 0, > @@ -7306,24 +7322,19 @@ static void > alc262_hippo_unsol_event(str > { > if ((res >> 26) != ALC880_HP_EVENT) > return; > - alc262_hippo_automute(codec, 1); > -} > - > -static void alc262_hippo1_automute(struct hda_codec > *codec, int force) > -{ > - struct alc_spec *spec = codec->spec; > + alc262_hippo_automute(codec); > +} > + > +static void alc262_hippo1_automute(struct hda_codec > *codec) > +{ > unsigned int mute; > - > - if (force || !spec->sense_updated) { > - unsigned int present; > - /* need to execute and sync at first */ > - snd_hda_codec_read(codec, 0x1b, 0, > AC_VERB_SET_PIN_SENSE, 0); > - present = snd_hda_codec_read(codec, 0x1b, 0, > - AC_VERB_GET_PIN_SENSE, 0); > - spec->jack_present = (present & 0x80000000) != 0; > - spec->sense_updated = 1; > - } > - if (spec->jack_present) { > + unsigned int present; > + > + snd_hda_codec_read(codec, 0x1b, 0, > AC_VERB_SET_PIN_SENSE, 0); > + present = snd_hda_codec_read(codec, 0x1b, 0, > + AC_VERB_GET_PIN_SENSE, 0); > + present = (present & 0x80000000) != 0; > + if (present) { > /* mute internal speaker */ > snd_hda_codec_amp_update(codec, 0x14, 0, > HDA_OUTPUT, 0, > 0x80, 0x80); > @@ -7346,7 +7357,7 @@ static void > alc262_hippo1_unsol_event(st > { > if ((res >> 26) != ALC880_HP_EVENT) > return; > - alc262_hippo1_automute(codec, 1); > + alc262_hippo1_automute(codec); > } > > /* > @@ -7923,6 +7934,7 @@ static struct snd_pci_quirk > alc262_cfg_t > SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", > ALC262_HIPPO_1), > SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", > ALC262_BENQ_ED8), > SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", > ALC262_BENQ_T31), > + SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", > ALC262_SONY_ASSAMD), > SND_PCI_QUIRK(0x104d, 0x9015, "Sony 0x9015", > ALC262_SONY_ASSAMD), > SND_PCI_QUIRK(0x104d, 0x900e, "Sony ASSAMD", > ALC262_SONY_ASSAMD), > SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", > ALC262_SONY_ASSAMD), > @@ -7951,6 +7963,7 @@ static struct > alc_config_preset alc262_p > .channel_mode = alc262_modes, > .input_mux = &alc262_capture_source, > .unsol_event = alc262_hippo_unsol_event, > + .init_hook = alc262_hippo_automute, > }, > [ALC262_HIPPO_1] = { > .mixers = { alc262_hippo1_mixer }, > @@ -7963,6 +7976,7 @@ static struct > alc_config_preset alc262_p > .channel_mode = alc262_modes, > .input_mux = &alc262_capture_source, > .unsol_event = alc262_hippo1_unsol_event, > + .init_hook = alc262_hippo1_automute, > }, > [ALC262_FUJITSU] = { > .mixers = { alc262_fujitsu_mixer }, > === message truncated === ___________________________________________________________ Yahoo! Mail is the world's favourite email. Don't settle for less, sign up for your free account today http://uk.rd.yahoo.com/evt=44106/*http://uk.docs.yahoo.com/mail/winter07.html _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel