ALSA: hda/tegra: runtime power management support

This change “ALSA: hda/tegra: runtime power management support” in Linux kernel is authored by Sameer Pujar <spujar [at]> on Tue Jan 22 13:03:16 2019 +0530.

ALSA: hda/tegra: runtime power management support

This patch enables runtime power management(runtime PM) support for
hda. pm_runtime_enable() and pm_runtime_disable() are added during
device probe and remove respectively. The runtime PM callbacks will
be forbidden if hda controller does not have support for runtime PM.
pm_runtime_get_sync() and pm_runtime_put() are added for hda register
access. The callbacks for above will be added in subsequent patches.

Signed-off-by: Sameer Pujar <>
Reviewed-by: Ravindra Lokhande <>
Reviewed-by: Mohan Kumar D <>
Signed-off-by: Takashi Iwai <>

This Linux change may have been applied to various maintained Linux releases and you can find Linux releases including commit 3f7e94e.

There are 15 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 sound/pci/hda/hda_tegra.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/sound/pci/hda/hda_tegra.c b/sound/pci/hda/hda_tegra.c
index 97a176d..2f9dd23 100644
--- a/sound/pci/hda/hda_tegra.c
+++ b/sound/pci/hda/hda_tegra.c
@@ -32,6 +32,7 @@
 #include <linux/slab.h>
 #include <linux/time.h>
 #include <linux/string.h>
+#include <linux/pm_runtime.h>
 #include <sound/core.h>
 #include <sound/initval.h>
@@ -512,6 +513,11 @@ static int hda_tegra_probe(struct platform_device *pdev)
 	card->private_data = chip;
 	dev_set_drvdata(&pdev->dev, card);
+	pm_runtime_enable(hda->dev);
+	if (!azx_has_pm_runtime(chip))
+		pm_runtime_forbid(hda->dev);
 	return 0;
@@ -528,6 +534,7 @@ static void hda_tegra_probe_work(struct work_struct *work)
 	struct platform_device *pdev = to_platform_device(hda->dev);
 	int err;
+	pm_runtime_get_sync(hda->dev);
 	err = hda_tegra_first_init(chip, pdev);
 	if (err < 0)
 		goto out_free;
@@ -549,12 +556,18 @@ static void hda_tegra_probe_work(struct work_struct *work)
 	snd_hda_set_power_save(&chip->bus, power_save * 1000);
+	pm_runtime_put(hda->dev);
 	return; /* no error return from async probe */
 static int hda_tegra_remove(struct platform_device *pdev)
-	return snd_card_free(dev_get_drvdata(&pdev->dev));
+	int ret;
+	ret = snd_card_free(dev_get_drvdata(&pdev->dev));
+	pm_runtime_disable(&pdev->dev);
+	return ret;
 static void hda_tegra_shutdown(struct platform_device *pdev)

The commit for this change in Linux stable tree is 3f7e94e (patch).

Leave a Reply

Your email address will not be published. Required fields are marked *