Message ID | 20210602145424.3132-1-hui.wang@canonical.com (mailing list archive) |
---|---|
State | Accepted |
Commit | b8b90c17602689eeaa5b219d104bbc215d1225cc |
Headers | show |
Series | ALSA: hda: update the power_state during the direct-complete | expand |
On Wed, 02 Jun 2021 16:54:24 +0200, Hui Wang wrote: > > The patch_realtek.c needs to check if the power_state.event equals > PM_EVENT_SUSPEND, after using the direct-complete, the suspend() and > resume() will be skipped if the codec is already rt_suspended, in this > case, the patch_realtek.c will always get PM_EVENT_ON even the system > is really resumed from S3. > > We could set power_state to PMSG_SUSPEND in the prepare(), if other > PM functions are called before complete(), those functions will > override power_state; if no other PM functions are called before > complete(), we could know the suspend() and resume() are skipped since > only S3 pm functions could be skipped by direct-complete, in this case > set power_state to PMSG_RESUME in the complete(). This could guarantee > the first time of calling hda_codec_runtime_resume() after complete() > has the correct power_state. > > Fixes: 215a22ed31a1 ("ALSA: hda: Refactor codec PM to use direct-complete optimization") > Signed-off-by: Hui Wang <hui.wang@canonical.com> Thanks, applied. Takashi
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index a31009afc025..5462f771c2f9 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -2917,6 +2917,7 @@ static int hda_codec_runtime_resume(struct device *dev) #ifdef CONFIG_PM_SLEEP static int hda_codec_pm_prepare(struct device *dev) { + dev->power.power_state = PMSG_SUSPEND; return pm_runtime_suspended(dev); } @@ -2924,6 +2925,10 @@ static void hda_codec_pm_complete(struct device *dev) { struct hda_codec *codec = dev_to_hda_codec(dev); + /* If no other pm-functions are called between prepare() and complete() */ + if (dev->power.power_state.event == PM_EVENT_SUSPEND) + dev->power.power_state = PMSG_RESUME; + if (pm_runtime_suspended(dev) && (codec->jackpoll_interval || hda_codec_need_resume(codec) || codec->forced_resume)) pm_request_resume(dev);
The patch_realtek.c needs to check if the power_state.event equals PM_EVENT_SUSPEND, after using the direct-complete, the suspend() and resume() will be skipped if the codec is already rt_suspended, in this case, the patch_realtek.c will always get PM_EVENT_ON even the system is really resumed from S3. We could set power_state to PMSG_SUSPEND in the prepare(), if other PM functions are called before complete(), those functions will override power_state; if no other PM functions are called before complete(), we could know the suspend() and resume() are skipped since only S3 pm functions could be skipped by direct-complete, in this case set power_state to PMSG_RESUME in the complete(). This could guarantee the first time of calling hda_codec_runtime_resume() after complete() has the correct power_state. Fixes: 215a22ed31a1 ("ALSA: hda: Refactor codec PM to use direct-complete optimization") Signed-off-by: Hui Wang <hui.wang@canonical.com> --- sound/pci/hda/hda_codec.c | 5 +++++ 1 file changed, 5 insertions(+)