From 339e840e2cc836acc7010033551e510733cd8fea Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Thu, 22 Feb 2024 14:16:29 +0800 Subject: [PATCH 1/2] ASoC: Intel: disable hda sdw int after sdw_intel_exit Codecs may need to access sdw registers via sdw bus in the exit process. Disabling sdw interrupt will block sdw IO transfer. Signed-off-by: Bard Liao --- sound/soc/sof/intel/hda.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c index 66126fb31d52db..eb1b90c55f0a35 100644 --- a/sound/soc/sof/intel/hda.c +++ b/sound/soc/sof/intel/hda.c @@ -220,12 +220,11 @@ static int hda_sdw_exit(struct snd_sof_dev *sdev) hdev = sdev->pdata->hw_pdata; - hda_sdw_int_enable(sdev, false); - if (hdev->sdw) sdw_intel_exit(hdev->sdw); hdev->sdw = NULL; + hda_sdw_int_enable(sdev, false); return 0; } From 9fc1dfe4e0ae19360d2e675d52ab96fedae3f259 Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Thu, 22 Feb 2024 14:43:27 +0800 Subject: [PATCH 2/2] soundwire: intel_init: Disable pm runtime before removing link device Peripherals are not able to access the sdw link after the link device is unregistered. Disable pm runtime to precent the peripheral from being resume. Signed-off-by: Bard Liao --- drivers/soundwire/intel_init.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/soundwire/intel_init.c b/drivers/soundwire/intel_init.c index 534c8795e7e85d..e7a067d61a64fe 100644 --- a/drivers/soundwire/intel_init.c +++ b/drivers/soundwire/intel_init.c @@ -117,6 +117,7 @@ static void intel_link_dev_unregister(struct sdw_intel_link_dev *ldev) static int sdw_intel_cleanup(struct sdw_intel_ctx *ctx) { struct sdw_intel_link_dev *ldev; + struct sdw_slave *slave; u32 link_mask; int i; @@ -132,6 +133,13 @@ static int sdw_intel_cleanup(struct sdw_intel_ctx *ctx) if (!ldev->link_res.clock_stop_quirks) pm_runtime_put_noidle(ldev->link_res.dev); + /* + * Disable runtime PM to prevent peripherals from being resume in the + * link device unregistering process. + */ + list_for_each_entry(slave, &ldev->link_res.cdns->bus.slaves, node) + pm_runtime_disable(&slave->dev); + intel_link_dev_unregister(ldev); }