[alsa-devel] [PATCH] ALSA: hda - Fix runtime PM accounting
Takashi Iwai
tiwai at suse.de
Wed Aug 29 15:34:35 CEST 2012
At Wed, 29 Aug 2012 12:19:32 +0000,
Lin, Mengdong wrote:
>
> > Now I introduced codec->epss flag that is initialized once in
> > snd_hda_codec_new(), and let the codec driver overrides this flag.
> > One bonus is that you can avoid the unnecessary codec parameter read at
> > each power change.
>
> Yes, this is better. And the patch works well for me - [PATCH 1/2] ALSA: hda - Avoid unnecessary parameter read for EPSS.
>
> > In anyway, there are a few issues:
> > - The refcounting gets broken after module unload. It's because we
> > leave the codec's pm_runtime usages after removal.
>
> Thanks for pointing out this! But I think the following codec can introduce risk of race among multiple codecs to modify ' chip->power_count',
> because only one codec's power on/off is serialized.
> static void azx_power_notify(struct hda_bus *bus, struct hda_codec *codec)
> {
> ...
> if (codec->power_on) {
> pm_runtime_get_sync(&chip->pci->dev);
> chip->power_count++;
> } else {
> pm_runtime_put_sync(&chip->pci->dev);
> chip->power_count--;
> }
> }
>
> How about calling pm_runtime_put_noidle() when freeing a codec in D0?
> Maybe we can add a bus notify function like this:
> Static void azx_codec_free_notify(struct hda_codec *codec)
> {
> If(codec->power_on)
> pm_runtime_put_noidle(&codec->bus->pci->dev);
> }
> And snd_hda_codec_free() can trigger this notify.
That's my second idea but I didn't want to introduce yet another op
point. But maybe it shall be the choice in the end...
> > - The D3-stop-clock check isn't done properly for the codecs providing
> > own set_power_state ops.
>
> I cannot test the branch 'if (codec->patch_ops.set_power_state)' in hda_set_power_state() for lack of such a codec.
> But the logic seems right and the other branch works well for me :-)
>
> > - Ditto for the repeated power-set sequence, the error check, etc.
> In hda_sync_power_state(),
> if ((state & 0xff) == power_state) ... should be if ((state & 0xf0)>> 4 == power_state), because PS-Act is bits 7:4
> break;
Ah thanks, I forgot that.
> And would you please explain why changing to D3 need not wait? One of my codec does have a delay on change from D0 to D3.
It was skipped because the driver doesn't need to wait. It's just a
power down and doesn't matter even if you proceed if you go to the
next codec. But as we are checking stop-clock bit, D3 should be
sync'ed as well, indeed. I'm going to remove the exception of D3,
too.
thanks,
Takashi
More information about the Alsa-devel
mailing list