At Tue, 24 Jul 2007 11:08:29 +0100 (BST), Andy wrote: > > I have a ALC262 hda-intel card which doesn't function > quite correctly. Details can be found at > https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.20/+bug/110145 > > I got bored of waiting for it to be fixed, and had a > go myself. My knowledge of ALSA is very limited, but > nevertheless it was really simple to add my device ids > to the quirks list in the patch_realtek.c file - eg: > > ... > SND_PCI_QUIRK(0x104d, 0x900e, "Sony ASSAMD", > ALC262_SONY_ASSAMD), > SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", > ALC262_SONY_ASSAMD), > /* My card... */ > SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", > ALC262_SONY_ASSAMD), > ... > > I found by trial and error that ALC262_SONY_ASSAMD > almost works. Connecting headphones disables built-in > speakers and unplugging them re-enables them. > > However, something does not get initialised until this > is done. That is, every bootup using > ALC262_SONY_ASSAMD, I must plug in and remove my > headphones before the device is initialised properly. > > Until this is done, I get no sound and the little GUI > mixer in XFCE doesn't show the list of supported > outputs on the device. > > I'm posting this to the devel list as I'm more > interested the code side of things rather than > actually having working sound :) Could you try the patch below? thanks, Takashi diff -r 2250b8a4b66a pci/hda/patch_realtek.c --- a/pci/hda/patch_realtek.c Tue Jul 24 12:49:39 2007 +0200 +++ b/pci/hda/patch_realtek.c Tue Jul 24 15:00:15 2007 +0200 @@ -7269,21 +7269,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) -{ - struct alc_spec *spec = codec->spec; +static void alc262_hippo_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, 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; - } - if (spec->jack_present) { + 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); + present = (present & 0x80000000) != 0; + if (present) { /* mute internal speaker */ snd_hda_codec_amp_update(codec, 0x14, 0, HDA_OUTPUT, 0, 0x80, 0x80); @@ -7306,24 +7302,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 +7337,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 +7914,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 +7943,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 +7956,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 }, @@ -8027,6 +8021,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_BENQ_T31] = { .mixers = { alc262_benq_t31_mixer }, @@ -8038,6 +8033,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, }, }; _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel