| From 7d489482ee2b04ce8ed2192f66389024fd520bbe Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 25 Aug 2020 16:50:35 -0700 |
| Subject: ASoC: SOF: fix a runtime pm issue in SOF when HDMI codec doesn't work |
| |
| From: Rander Wang <rander.wang@intel.com> |
| |
| [ Upstream commit 6c63c954e1c52f1262f986f36d95f557c6f8fa94 ] |
| |
| When hda_codec_probe() doesn't initialize audio component, we disable |
| the codec and keep going. However,the resources are not released. The |
| child_count of SOF device is increased in snd_hdac_ext_bus_device_init |
| but is not decrease in error case, so SOF can't get suspended. |
| |
| snd_hdac_ext_bus_device_exit will be invoked in HDA framework if it |
| gets a error. Now copy this behavior to release resources and decrease |
| SOF device child_count to release SOF device. |
| |
| Signed-off-by: Rander Wang <rander.wang@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: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> |
| Link: https://lore.kernel.org/r/20200825235040.1586478-3-ranjani.sridharan@linux.intel.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/soc/sof/intel/hda-codec.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c |
| index 2c5c451fa19d7..c475955c6eeba 100644 |
| --- a/sound/soc/sof/intel/hda-codec.c |
| +++ b/sound/soc/sof/intel/hda-codec.c |
| @@ -151,7 +151,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address, |
| if (!hdev->bus->audio_component) { |
| dev_dbg(sdev->dev, |
| "iDisp hw present but no driver\n"); |
| - return -ENOENT; |
| + goto error; |
| } |
| hda_priv->need_display_power = true; |
| } |
| @@ -174,7 +174,7 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address, |
| * other return codes without modification |
| */ |
| if (ret == 0) |
| - ret = -ENOENT; |
| + goto error; |
| } |
| |
| return ret; |
| -- |
| 2.27.0 |
| |