[alsa-devel] ALC262 - HDA-Intel

Takashi Iwai tiwai at suse.de
Wed Jul 25 12:24:46 CEST 2007


At Tue, 24 Jul 2007 18:08:24 +0100 (BST),
Andy wrote:
> 
> Thank-you Takashi,
> 
> I applied the patch (to the in-kernel version from
> 2.6.22.1) but sadly it did not fix the problem.  
> 
> I noticed that my XFCE mixer wasn't broken before I
> plugged the 'phones in this time, not sure if the
> patch fixed that, but it seems like a step in the
> right direction!

I don't understand how XFCE mixer behavior changes, but you mean that
the playback still doesn't work without replugging the jack?
If yes, add a debug printk in alc262_hippo_automute() to check whether
this function gets really called without replugging at loading the
module.  (And you can check the variable "preset" there which
indicates the presence of the jack.)


Takashi

> 
> Regards,
> Andy.
> 
> 
> --- Takashi Iwai <tiwai at suse.de> wrote:
> 
> > 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,
> > 
> === message truncated ===
> 
> 
> 
>       ___________________________________________________________
> Yahoo! Answers - Got a question? Someone out there knows the answer. Try it
> now.
> http://uk.answers.yahoo.com/ 
> 


More information about the Alsa-devel mailing list