[alsa-devel] [PATCH] ALSA: hda - More pop noise fixes for Dell XPS 13 9333

Gabriele Mazzotta gabriele.mzt at gmail.com
Fri Aug 8 17:01:44 CEST 2014


On Friday 08 August 2014 12:13:38 you wrote:
> At Fri, 08 Aug 2014 10:49:25 +0200,
> Gabriele Mazzotta wrote:
> > 
> > On Friday 08 August 2014 08:11:18 Takashi Iwai wrote:
> > > At Thu, 07 Aug 2014 18:35:39 +0200,
> > > Gabriele Mazzotta wrote:
> > > > 
> > > > On init, mic-in is always set as input source, indipendently on what
> > > > is plugged in. Since setting/unsetting mic-in as input source causes
> > > > a pop noise, make sure the internal microphone is selected as input
> > > > source on boot.
> > > > 
> > > > On shutdown, make sure the codec is not suspended as that would cause
> > > > a pop noise.
> > > > 
> > > > Signed-off-by: Gabriele Mazzotta <gabriele.mzt at gmail.com>
> > > > ---
> > > >  sound/pci/hda/hda_codec.c     |  2 ++
> > > >  sound/pci/hda/hda_codec.h     |  1 +
> > > >  sound/pci/hda/patch_realtek.c | 12 ++++++++++++
> > > >  3 files changed, 15 insertions(+)
> > > > 
> > > > diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
> > > > index 4c20277..92d8292 100644
> > > > --- a/sound/pci/hda/hda_codec.c
> > > > +++ b/sound/pci/hda/hda_codec.c
> > > > @@ -5348,6 +5348,8 @@ void snd_hda_bus_reboot_notify(struct hda_bus *bus)
> > > >  	if (!bus)
> > > >  		return;
> > > >  	list_for_each_entry(codec, &bus->codec_list, list) {
> > > > +		if (codec->resume_at_reboot)
> > > > +			hda_call_codec_resume(codec);
> > > 
> > > Do you really need the resume at reboot?  I thought the codec needs
> > > power down at reboot, i.e. rather it needs suspend.
> > 
> > Yes, the pop noise happens if it's suspended.
> 
> Then the patch is wrong in anyway.  You cannot call it
> unconditionally.  The codec might be still active, and calling resume
> in that state does re-initialize the whole things doubly.

Now I see that it's wrong. In addition, I guess it also breaks the build 
when CONFIG_PM is not set.

> > Now that I payed more attention, the pop noise happens only when 
> > rebooting the laptop and not when powering it down.
> > Also, the noise is heard quite late, I think the kernel is no longer 
> > running when I hear it.
> > I will try to better understand what is actually happening and why
> > resuming prevents the noise.
> 
> If so, it might be BIOS causes the noise by re-initializing the
> codec.

It seems that if 0x15 (Headphone playback switch) is in D0, the pop noise 
cannot be heard.
I tried to see using powertop whether it's worth making the current code more 
complex and force nid 0x15 in D0 only at reboot or not and I couldn't notice 
any major difference. Between 0x02, 0x15 and AFG only the last is causing a 
noticeable difference in the power consumption.

That said, I would simply add 0x15 to alc_power_filter_xps13(). I will send the 
patches soon.

Gabriele

> Takashi
> 
> > > Since you apply actually two individual changes, it's better to split
> > > patches: one for adding the power-down at reboot, another for
> > > initializing cur_mux properly.
> > > 
> > > Also, it's recommended to put a bugzilla link in the changelog, so
> > > that other people can follow the information and discussion.
> > > 
> > > Last but not least, please put maintainers to Cc at the next time, so
> > > that it won't be missed.
> > 
> > I will do it.
> > 
> > Thanks,
> > 
> > Gabriele
> > 
> > > 
> > > thanks,
> > > 
> > > Takashi
> > > 
> > > >  		if (hda_codec_is_power_on(codec) &&
> > > >  		    codec->patch_ops.reboot_notify)
> > > >  			codec->patch_ops.reboot_notify(codec);
> > > > diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
> > > > index 5825aa1..5c3c66e 100644
> > > > --- a/sound/pci/hda/hda_codec.h
> > > > +++ b/sound/pci/hda/hda_codec.h
> > > > @@ -366,6 +366,7 @@ struct hda_codec {
> > > >  	unsigned int cached_write:1;	/* write only to caches */
> > > >  	unsigned int dp_mst:1; /* support DP1.2 Multi-stream transport */
> > > >  	unsigned int dump_coef:1; /* dump processing coefs in codec proc file */
> > > > +	unsigned int resume_at_reboot:1; /* resume codec at reboot */
> > > >  #ifdef CONFIG_PM
> > > >  	unsigned int power_on :1;	/* current (global) power-state */
> > > >  	unsigned int d3_stop_clk:1;	/* support D3 operation without BCLK */
> > > > diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> > > > index b60824e..defaa2a 100644
> > > > --- a/sound/pci/hda/patch_realtek.c
> > > > +++ b/sound/pci/hda/patch_realtek.c
> > > > @@ -4018,8 +4018,20 @@ static void alc_fixup_dell_xps13(struct hda_codec *codec,
> > > >  {
> > > >  	if (action == HDA_FIXUP_ACT_PROBE) {
> > > >  		struct alc_spec *spec = codec->spec;
> > > > +		struct hda_input_mux *imux = &spec->gen.input_mux;
> > > > +		int i;
> > > > +
> > > >  		spec->shutup = alc_no_shutup;
> > > >  		codec->power_filter = alc_power_filter_xps13;
> > > > +		codec->resume_at_reboot = 1;
> > > > +
> > > > +		/* Make the internal mic the default input source. */
> > > > +		for (i = 0; i < imux->num_items; i++) {
> > > > +			if (spec->gen.imux_pins[i] == 0x12) {
> > > > +				spec->gen.cur_mux[0] = i;
> > > > +				break;
> > > > +			}
> > > > +		}
> > > >  	}
> > > >  }
> > > >  
> > > 
> > 



More information about the Alsa-devel mailing list