[alsa-devel] [PATCH 0/4] More aggressive PM for HD-audio

Takashi Iwai tiwai at suse.de
Thu Mar 26 14:52:40 CET 2015


At Thu, 26 Mar 2015 14:10:17 +0100,
Takashi Iwai wrote:
> 
> At Thu, 26 Mar 2015 20:24:43 +0800,
> Hui Wang wrote:
> > 
> > On 03/21/2015 02:38 PM, Hui Wang wrote:
> > > On 03/21/2015 12:20 AM, David Henningsson wrote:
> > >>
> > >> On 2015-03-18 09:50, Takashi Iwai wrote:
> > >>> Hi,
> > >>>
> > >>> here is a patchset for supporting more aggressive PM for HD-audio.
> > >>> This allows to change the power state of each widget more dynamically
> > >>> with jack and stream states.  It's activated only when the codec
> > >>> driver (or via sysfs or f/w patch) sets codec->power_mgmt flag.
> > >>>
> > >>> In theory, this should work for the recent Realtek codecs, but
> > >>> currently I have no machine for test.
> > >>>
> > >>> David, could you or your team check whether this works for ALC282 or
> > >>> such?  Just add like:
> > >>>
> > >>> --- a/sound/pci/hda/patch_realtek.c
> > >>> +++ b/sound/pci/hda/patch_realtek.c
> > >>> @@ -5415,6 +5415,7 @@ static int patch_alc269(struct hda_codec *codec)
> > >>>
> > >>>       spec = codec->spec;
> > >>>       spec->gen.shared_mic_vref_pin = 0x18;
> > >>> +    codec->power_mgmt = 1;
> > >>>
> > >>>       snd_hda_pick_fixup(codec, alc269_fixup_models,
> > >>>                  alc269_fixup_tbl, alc269_fixups);
> > >>>
> > >>>
> > >>> The patchset is for for-next branch of sound git tree, but they might
> > >>> be applicable to 4.0-rc (or even older), too.  The current patches are
> > >>> found in topic/hda-power branch.
> > >>
> > >> So I hoped to be able to look at this today, but it turns out the 
> > >> machine I was thinking of using for testing has an ALC262 codec, 
> > >> which hardly counts as "new".
> > >>
> > >> Hui, is this something you feel like taking on? Otherwise I'll try to 
> > >> talk to someone in Taipei.
> > >>
> > > OK, I will look for the machine to do the test next week.
> > >
> > > Regards,
> > > Hui.
> > >
> > Sorry for late response, today is my first day in the office back from 
> > vacation, I checked all machines in the Beijing office, none of them has 
> > the ALC282 codec, I will continue to look for the machine from other office.
> > 
> > And I did the test on the machines with the alc283, alc255, alc292 and 
> > alc269, the testing result were same, there were no sound output from 
> > internal speaker or headphone, and the internal mic or external mic 
> > can't record any sound. The test steps as below:
> > 
> > 1. power_save_node = 0
> > checkout the hda-power branch, build the kernel based on this branch.
> > Install the kernel to the above machines and boot into the desktop
> > test internal speaker and internal mic, works very well, plug a headset, 
> > test headphone and external mic, works very well.
> > run pm_suspend, wait 5 seconds, wakeup the system, redo the above test, 
> > everything works very well.
> 
> OK, this is expected.  The patch shouldn't touch this case.
> 
> > 2. power_save_node = 1
> > enable the power_save_node as below:
> > @@ -5426,6 +5426,8 @@ static int patch_alc269(struct hda_codec *codec)
> > 
> >          alc_auto_parse_customize_define(codec);
> > 
> > +       codec->power_save_node = 1;
> > +
> >          if (has_cdefine_beep(codec))
> >                  spec->gen.beep_nid = 0x01;
> > rebuild the kernel, install the kernel to the above machines and boot 
> > into the desktop
> > test internal speaker and internal mic, we can play sound to internal 
> > speaker without any errors, but I can't hear any sound from the speaker; 
> > I can use the internal mic to record without errors, but recorded file 
> > did not include any sound pcm (maybe all 0x00 or 0xff)
> > I plug a headset into the headset jack, the detection works very well, 
> > but I can't hear sound from headphone when play a sound, and I can't use 
> > headset mic to record any sound as well.
> > 
> > 
> > And I attached 2 alsa-info.txt, one is the power_save_node=0, the other 
> > is the power_save_node=1
> 
> Thanks.  The alsa-info.sh outputs show no difference but the power
> state, so the widget attributes seem kept with the power state change,
> as it seems.
> 
> Could you give alsa-info.sh output *during* playing with
> power_save_node=1?

Also, try to pull topic/hda-regmap branch in addition, and apply the
patch below.  This implements the partial sync for the widget path.
Note that the patch is totally untested.


thanks,

Takashi

diff --git a/include/sound/hda_regmap.h b/include/sound/hda_regmap.h
index 76648ccfbbf8..727a5801e298 100644
--- a/include/sound/hda_regmap.h
+++ b/include/sound/hda_regmap.h
@@ -202,4 +202,16 @@ snd_hdac_regmap_update_amp_stereo(struct hdac_device *codec, hda_nid_t nid,
 	return snd_hdac_regmap_update_raw(codec, cmd, mask, val);
 }
 
+/**
+ * snd_hdac_regmap_sync_node - sync the widget node attributes
+ * @codec: HD-audio codec
+ * @nid: NID to sync
+ */
+static inline void
+snd_hdac_regmap_sync_node(struct hdac_device *codec, hda_nid_t nid)
+{
+	regcache_mark_dirty(codec->regmap);
+	regcache_sync_region(codec->regmap, nid << 20, ((nid + 1) << 20) -1);
+}
+
 #endif /* __SOUND_HDA_REGMAP_H */
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
index f7ccef5559de..1f2ca7be1468 100644
--- a/sound/pci/hda/hda_generic.c
+++ b/sound/pci/hda/hda_generic.c
@@ -842,10 +842,8 @@ static hda_nid_t path_power_update(struct hda_codec *codec,
 			snd_hda_codec_write(codec, nid, 0,
 					    AC_VERB_SET_POWER_STATE, state);
 			changed = nid;
-			/* here we assume that widget attributes (e.g. amp,
-			 * pinctl connection) don't change with local power
-			 * state change.  If not, need to sync the cache.
-			 */
+			if (state == AC_PWRST_D0)
+				snd_hdac_regmap_sync_node(&codec->core, nid);
 		}
 	}
 	return changed;


More information about the Alsa-devel mailing list