[alsa-devel] Broken powersave in 3.5.2, codec is always active

Takashi Iwai tiwai at suse.de
Mon Aug 20 18:21:31 CEST 2012


[Re-added Cc to ML; please don't drop it]

At Mon, 20 Aug 2012 22:23:02 +0700,
ValdikSS wrote:
> 
> Takashi Iwai <tiwai at suse.de> писал(а) в своём письме Mon, 20 Aug 2012  
> 16:17:04 +0700:
> 
> > At Sat, 18 Aug 2012 12:44:29 +0700,
> > ValdikSS wrote:
> >>
> >> Hello!
> >> I have a Lenovo ThinkPad X220 laptop with a conexant codec and recently
> >> (after kernel 3.5.2) it is active all the time after KDE login, as
> >> powertop says. This couldn't be fixed by logging of from KDE or playing
> >> some music in mplayer from console. The only kernel I tried in 3.5.x is
> >> 3.5.2, so I can't say is this bug reproducible in 3.5.0 or 3.5.1, but
> >> everything is fine with 3.4.9. This never happens if you don't start KDE
> >> after reboot, you can listen to some music in mplayer in console and
> >> everything seems to be fine. lsof and fuser /dev/snd/* shows nothing.
> >
> > Just to be sure, check /sys/module/snd_hda_intel/parameters/power_save
> > value after logging into KDE.  This value can be changed dynamically.
> >
> > If the value is still set properly, try to build the kernel with the
> > tracing option with the patch below.  Then try to trace the power
> > up/down sequences in the tracing buffer.  Some brief description is
> > found in Documentation/sound/alsa/HD-Audio.txt Tracepoints section.
> >
> >
> > thanks,
> >
> > Takashi
> >
> > ---
> > From: Takashi Iwai <tiwai at suse.de>
> > Subject: [PATCH] ALSA: hda - Add tracepoints at snd_hda_power_up/down  
> > entrances.
> >
> > Signed-off-by: Takashi Iwai <tiwai at suse.de>
> > ---
> >  sound/pci/hda/hda_codec.c |  2 ++
> >  sound/pci/hda/hda_trace.h | 24 ++++++++++++++++++++++++
> >  2 files changed, 26 insertions(+)
> >
> > diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
> > index 408babc..ad0101e 100644
> > --- a/sound/pci/hda/hda_codec.c
> > +++ b/sound/pci/hda/hda_codec.c
> > @@ -4417,6 +4417,7 @@ static void __snd_hda_power_up(struct hda_codec  
> > *codec, bool wait_power_down)
> > 	spin_lock(&codec->power_lock);
> >  	codec->power_count++;
> > +	trace_hda_power_count(codec);
> >  	/* Return if power_on or transitioning to power_on, unless currently
> >  	 * powering down. */
> >  	if ((codec->power_on || codec->power_transition > 0) &&
> > @@ -4496,6 +4497,7 @@ void snd_hda_power_down(struct hda_codec *codec)
> >  {
> >  	spin_lock(&codec->power_lock);
> >  	--codec->power_count;
> > +	trace_hda_power_count(codec);
> >  	if (!codec->power_on || codec->power_count || codec->power_transition)  
> > {
> >  		spin_unlock(&codec->power_lock);
> >  		return;
> > diff --git a/sound/pci/hda/hda_trace.h b/sound/pci/hda/hda_trace.h
> > index 9884871..9a34b86 100644
> > --- a/sound/pci/hda/hda_trace.h
> > +++ b/sound/pci/hda/hda_trace.h
> > @@ -87,6 +87,30 @@ DEFINE_EVENT(hda_power, hda_power_up,
> >  	TP_ARGS(codec)
> >  );
> > +TRACE_EVENT(hda_power_count,
> > +	TP_PROTO(struct hda_codec *codec),
> > +	TP_ARGS(codec),
> > +	TP_STRUCT__entry(
> > +		__field( unsigned int, card )
> > +		__field( unsigned int, addr )
> > +		__field( int, power_count )
> > +		__field( int, power_on )
> > +		__field( int, power_transition )
> > +	),
> > +
> > +	TP_fast_assign(
> > +		__entry->card = (codec)->bus->card->number;
> > +		__entry->addr = (codec)->addr;
> > +		__entry->power_count = (codec)->power_count;
> > +		__entry->power_on = (codec)->power_on;
> > +		__entry->power_transition = (codec)->power_transition;
> > +	),
> > +
> > +	TP_printk("[%d:%d] power_count=%d, power_on=%d, power_transition=%d",
> > +		  __entry->card, __entry->addr, __entry->power_count,
> > +		  __entry->power_on, __entry->power_transition)
> > +);
> > +
> >  TRACE_EVENT(hda_unsol_event,
> > 	TP_PROTO(struct hda_bus *bus, u32 res, u32 res_ex),
> 
> Thanks for the quick reply! I compiled 3.5.2 kernel with this patch,  
> enabled hda tracing, ran mplayer once in the console and started KDE. Once  
> KDE is started, card is used 100% of time, which can be seen in powertop.  
> When I logout from KDE and kill kdm, no events are generated in trace  
> since KDE start (no sounds are played from KDE start till KDM kill) and  
> card is still used 100% of time. If you play any sounds in mplayer in  
> console after kdm kill, the card is still used 100% time. This can be  
> fixed by laptop suspend.
> 
> The traces are quite huge so I pasted it to pastebin:
> 01-trace-just-enabled http://pastebin.com/JNRWXUPy
> 02-mplayer-played-and-stopped-card-is-normal http://pastebin.com/r0jZLDey
> 03-kde-started-and-stopped-100-percent-card http://pastebin.com/Z7mzbY4c
> The last log begins with latest rows from 02

It's still not clear from the log.  You can reduce the trace pattern
to hda_power_* for reducing the trace log size.

In anyway, could you try the patch below?


thanks,

Takashi

---
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 88a9c20..b94e04d 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -4433,6 +4433,8 @@ static void __snd_hda_power_up(struct hda_codec *codec, bool wait_power_down)
 	 * then there is no need to go through power up here.
 	 */
 	if (codec->power_on) {
+		if (codec->power_transition < 0)
+			codec->power_transition = 0;
 		spin_unlock(&codec->power_lock);
 		return;
 	}


More information about the Alsa-devel mailing list