[Sound-open-firmware] [SOF][KERNEL] pm_runtime flow in sof

Daniel Baluta daniel.baluta at nxp.com
Thu Oct 21 16:48:33 CEST 2021


Hi Allen,

After our discussion today I tested the  patch below and everything works OK:


diff --git a/sound/soc/sof/sof-of-dev.c b/sound/soc/sof/sof-of-dev.c
index 403b393528eb..f358435aca21 100644
--- a/sound/soc/sof/sof-of-dev.c
+++ b/sound/soc/sof/sof-of-dev.c
@@ -73,7 +73,6 @@ static void sof_of_probe_complete(struct device *dev)
        pm_runtime_enable(dev);

        pm_runtime_mark_last_busy(dev);
-       pm_runtime_put_autosuspend(dev);
 }

I wonder why it previously worked! 🙂

Please send a patch as we've discussed to fix this. Also, as Pierre said
for consistency please reorder of PM calls as follows:

pm_runtime_set_autosuspend_delay(dev, DELAY_MS);
pm_runtime_use_autosuspend(dev);
pm_runtime_mark_last_busy(dev);
pm_runtime_set_active(dev);
pm_runtime_enable(dev);
________________________________
From: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
Sent: Wednesday, October 20, 2021 7:44 PM
To: Allen-KH Cheng (程冠勳) <Allen-KH.Cheng at mediatek.com>; Daniel Baluta <daniel.baluta at nxp.com>
Cc: sound-open-firmware at alsa-project.org <sound-open-firmware at alsa-project.org>; YC Hung (洪堯俊) <yc.hung at mediatek.com>; Nathan Chung (仲崇寧) <nathan.chung at mediatek.com>; Randy Wu (吳柏樹) <Randy.Wu at mediatek.com>
Subject: Re: [Sound-open-firmware] [SOF][KERNEL] pm_runtime flow in sof


> In sof-of-dev.c
> static void sof_of_probe_complete(struct device *dev)
> {
> /* allow runtime_pm */
> pm_runtime_set_autosuspend_delay(dev, SND_SOF_SUSPEND_DELAY_MS);
> pm_runtime_use_autosuspend(dev);
> pm_runtime_set_active(dev);
> pm_runtime_enable(dev);
>
> pm_runtime_mark_last_busy(dev);
> pm_runtime_put_autosuspend(dev);

this last line looks wrong

it looks like the code in sof-of-dev.c is imbalanced. The last
pm_runtime_put_autosuspend() is not matching any pm_runtime_get_sync(),
is it?

> }
>
>
> After pm_runtime_put_autosuspend,  the current device power usage count should minus one. (1->0)
>
> And wait SND_SOF_SUSPEND_DELAY_MS seconds, sof device will autosuspend (because the power usage count is 0 ).

Indeed.

We have this comment for the PCI case:

/* follow recommendation in pci-driver.c to decrement usage counter */
pm_runtime_put_noidle(dev);

and a matching one for remove:
/* follow recommendation in pci-driver.c to increment usage counter */
        if (snd_sof_device_probe_completed(&pci->dev) &&
            !(sof_pci_debug & SOF_PCI_DISABLE_PM_RUNTIME))
                pm_runtime_get_noresume(&pci->dev);

In the general case, I don't know why you would need to add a
put_autosuspend in the probe complete, even for cases where the device
does support pm_runtime.

Having a mark_last_busy() is fine though, it would reset the counters
and let the autosuspend happen at a later time. But I would call this
before enable for consistency.

Can you try with the sequence below in probe_complete?

pm_runtime_set_autosuspend_delay(dev, DELAY_MS);
pm_runtime_use_autosuspend(dev);
pm_runtime_mark_last_busy(dev);
pm_runtime_set_active(dev);
pm_runtime_enable(dev);


More information about the Sound-open-firmware mailing list