Re: [PATCH 0/4] More aggressive PM for HD-audio

Takashi Iwai
2015-03-26T13:52:40Z

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;
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org