| From f57f30b096335935aca00ab578b6be7ed9426624 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 2 Sep 2020 18:42:18 +0300 |
| Subject: ALSA: hda: fix a runtime pm issue in SOF when integrated GPU is |
| disabled |
| |
| From: Rander Wang <rander.wang@intel.com> |
| |
| [ Upstream commit 13774d81f38538c5fa2924bdcdfa509155480fa6 ] |
| |
| In snd_hdac_device_init pm_runtime_set_active is called to |
| increase child_count in parent device. But when it is failed |
| to build connection with GPU for one case that integrated |
| graphic gpu is disabled, snd_hdac_ext_bus_device_exit will be |
| invoked to clean up a HD-audio extended codec base device. At |
| this time the child_count of parent is not decreased, which |
| makes parent device can't get suspended. |
| |
| This patch calls pm_runtime_set_suspended to decrease child_count |
| in parent device in snd_hdac_device_exit to match with |
| snd_hdac_device_init. pm_runtime_set_suspended can make sure that |
| it will not decrease child_count if the device is already suspended. |
| |
| Signed-off-by: Rander Wang <rander.wang@intel.com> |
| Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> |
| Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> |
| Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com> |
| Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> |
| Link: https://lore.kernel.org/r/20200902154218.1440441-1-kai.vehmanen@linux.intel.com |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/hda/hdac_device.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| diff --git a/sound/hda/hdac_device.c b/sound/hda/hdac_device.c |
| index c946fd8beebca..b84e12f4f8046 100644 |
| --- a/sound/hda/hdac_device.c |
| +++ b/sound/hda/hdac_device.c |
| @@ -127,6 +127,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_device_init); |
| void snd_hdac_device_exit(struct hdac_device *codec) |
| { |
| pm_runtime_put_noidle(&codec->dev); |
| + /* keep balance of runtime PM child_count in parent device */ |
| + pm_runtime_set_suspended(&codec->dev); |
| snd_hdac_bus_remove_device(codec->bus, codec); |
| kfree(codec->vendor_name); |
| kfree(codec->chip_name); |
| -- |
| 2.25.1 |
| |