From a9b281ca94e2cfa921dd90f52d3bf96cd7259238 Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:11:06 +0800 Subject: [PATCH 01/17] Revert "ASoC: rt1017: wait codec init in hw_params" This reverts commit a759a73126e8f770c272a6db66520ac7c7c3df12. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt1017-sdca-sdw.c | 32 +++++++++++------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/sound/soc/codecs/rt1017-sdca-sdw.c b/sound/soc/codecs/rt1017-sdca-sdw.c index bd9eb1854aa57f..88fc23a4999fbc 100644 --- a/sound/soc/codecs/rt1017-sdca-sdw.c +++ b/sound/soc/codecs/rt1017-sdca-sdw.c @@ -373,7 +373,6 @@ static int rt1017_sdca_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt1017_sdca_priv *rt1017 = dev_get_drvdata(&slave->dev); - int ret; if (status == SDW_SLAVE_UNATTACHED) rt1017->hw_init = false; @@ -386,18 +385,7 @@ static int rt1017_sdca_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt1017_sdca_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "IO init failed: %d\n", ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt1017->regmap, false); - regcache_sync(rt1017->regmap); - } - - return ret; + return rt1017_sdca_io_init(&slave->dev, slave); } static const char * const rt1017_rx_data_ch_select[] = { @@ -581,8 +569,6 @@ static void rt1017_sdca_shutdown(struct snd_pcm_substream *substream, snd_soc_dai_set_dma_data(dai, substream, NULL); } -#define RT1017_PROBE_TIMEOUT 5000 - static int rt1017_sdca_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -630,10 +616,6 @@ static int rt1017_sdca_pcm_hw_params(struct snd_pcm_substream *substream, params_rate(params), num_channels, snd_pcm_format_width(params_format(params)), direction, ch_mask, port); - retval = sdw_slave_wait_for_initialization(rt1017->sdw_slave, RT1017_PROBE_TIMEOUT); - if (retval < 0) - return retval; - retval = sdw_stream_add_slave(rt1017->sdw_slave, &stream_config, &port_config, 1, sdw_stream); if (retval) { @@ -788,10 +770,13 @@ static int rt1017_sdca_dev_suspend(struct device *dev) return 0; } +#define RT1017_PROBE_TIMEOUT 5000 + static int rt1017_sdca_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt1017_sdca_priv *rt1017 = dev_get_drvdata(dev); + unsigned long time; if (!rt1017->first_hw_init) return 0; @@ -799,7 +784,14 @@ static int rt1017_sdca_dev_resume(struct device *dev) if (!slave->unattach_request) goto regmap_sync; - return 0; + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT1017_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "Initialization not complete, timed out\n"); + sdw_show_ping_status(slave->bus, true); + + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; From af56fa50495a45559d092683773ed64c8dfeaf22 Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:12:14 +0800 Subject: [PATCH 02/17] Revert "ASoC: rt5682: wait codec init in hw_params" This reverts commit c579ace677d5030a1107d4eaae48d637ead05b94. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt5682-sdw.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/sound/soc/codecs/rt5682-sdw.c b/sound/soc/codecs/rt5682-sdw.c index 1c140691945f70..aa229894129bfd 100644 --- a/sound/soc/codecs/rt5682-sdw.c +++ b/sound/soc/codecs/rt5682-sdw.c @@ -129,10 +129,6 @@ static int rt5682_sdw_hw_params(struct snd_pcm_substream *substream, else port_config.num = 2; - retval = sdw_slave_wait_for_initialization(rt5682->slave, RT5682_PROBE_TIMEOUT); - if (retval < 0) - return retval; - retval = sdw_stream_add_slave(rt5682->slave, &stream_config, &port_config, 1, sdw_stream); if (retval) { @@ -517,7 +513,6 @@ static int rt5682_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt5682_priv *rt5682 = dev_get_drvdata(&slave->dev); - int ret; if (status == SDW_SLAVE_UNATTACHED) rt5682->hw_init = false; @@ -530,19 +525,7 @@ static int rt5682_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt5682_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "IO init Failed: %d\n", ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt5682->sdw_regmap, false); - regcache_cache_only(rt5682->regmap, false); - regcache_sync(rt5682->regmap); - } - - return ret; + return rt5682_io_init(&slave->dev, slave); } static int rt5682_read_prop(struct sdw_slave *slave) @@ -774,6 +757,7 @@ static int rt5682_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt5682_priv *rt5682 = dev_get_drvdata(dev); + unsigned long time; if (!rt5682->first_hw_init) return 0; @@ -788,7 +772,14 @@ static int rt5682_dev_resume(struct device *dev) goto regmap_sync; } - return 0; + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT5682_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__); + sdw_show_ping_status(slave->bus, true); + + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; From 07b204888c44de8c06f42f31cb898b0ecdaa0395 Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:12:37 +0800 Subject: [PATCH 03/17] Revert "ASoC: rt1308: wait codec init in hw_params" This reverts commit f7ad3f625b8180a1423251112a59e12f041fe577. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt1308-sdw.c | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/sound/soc/codecs/rt1308-sdw.c b/sound/soc/codecs/rt1308-sdw.c index 3579189b49b611..ea708068f0e8ed 100644 --- a/sound/soc/codecs/rt1308-sdw.c +++ b/sound/soc/codecs/rt1308-sdw.c @@ -303,7 +303,6 @@ static int rt1308_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt1308_sdw_priv *rt1308 = dev_get_drvdata(&slave->dev); - int ret; if (status == SDW_SLAVE_UNATTACHED) rt1308->hw_init = false; @@ -316,18 +315,7 @@ static int rt1308_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt1308_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "IO init failed %d\n", ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt1308->regmap, false); - regcache_sync_region(rt1308->regmap, 0xc000, 0xcfff); - } - - return ret; + return rt1308_io_init(&slave->dev, slave); } static int rt1308_bus_config(struct sdw_slave *slave, @@ -538,8 +526,6 @@ static int rt1308_sdw_set_tdm_slot(struct snd_soc_dai *dai, return 0; } -#define RT1308_PROBE_TIMEOUT 5000 - static int rt1308_sdw_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { @@ -574,10 +560,6 @@ static int rt1308_sdw_hw_params(struct snd_pcm_substream *substream, port_config.ch_mask = rt1308->rx_mask; } - retval = sdw_slave_wait_for_initialization(rt1308->sdw_slave, RT1308_PROBE_TIMEOUT); - if (retval < 0) - return retval; - retval = sdw_stream_add_slave(rt1308->sdw_slave, &stream_config, &port_config, 1, sdw_stream); if (retval) { @@ -783,10 +765,13 @@ static int rt1308_dev_suspend(struct device *dev) return 0; } +#define RT1308_PROBE_TIMEOUT 5000 + static int rt1308_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt1308_sdw_priv *rt1308 = dev_get_drvdata(dev); + unsigned long time; if (!rt1308->first_hw_init) return 0; @@ -794,7 +779,14 @@ static int rt1308_dev_resume(struct device *dev) if (!slave->unattach_request) goto regmap_sync; - return 0; + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT1308_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "Initialization not complete, timed out\n"); + sdw_show_ping_status(slave->bus, true); + + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; From bbdf28f78ddf6774ff2e3be0226c7f210c50e59c Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:12:51 +0800 Subject: [PATCH 04/17] Revert "ASoC: rt1318: wait codec init in hw_params" This reverts commit 128f65c511fce4fa317abc883def55fc4db616ec. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt1318-sdw.c | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/sound/soc/codecs/rt1318-sdw.c b/sound/soc/codecs/rt1318-sdw.c index 6add687b5f6a8e..4eb636e0c9ed1c 100644 --- a/sound/soc/codecs/rt1318-sdw.c +++ b/sound/soc/codecs/rt1318-sdw.c @@ -445,7 +445,6 @@ static int rt1318_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt1318_sdw_priv *rt1318 = dev_get_drvdata(&slave->dev); - int ret; if (status == SDW_SLAVE_UNATTACHED) rt1318->hw_init = false; @@ -458,18 +457,7 @@ static int rt1318_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt1318_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "%s: I/O init failed: %d\n", __func__, ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt1318->regmap, false); - regcache_sync(rt1318->regmap); - } - - return ret; + return rt1318_io_init(&slave->dev, slave); } static int rt1318_classd_event(struct snd_soc_dapm_widget *w, @@ -572,8 +560,6 @@ static void rt1318_sdw_shutdown(struct snd_pcm_substream *substream, snd_soc_dai_set_dma_data(dai, substream, NULL); } -#define RT1318_PROBE_TIMEOUT 5000 - static int rt1318_sdw_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { @@ -617,10 +603,6 @@ static int rt1318_sdw_hw_params(struct snd_pcm_substream *substream, port_config.ch_mask = ch_mask; port_config.num = port; - retval = sdw_slave_wait_for_initialization(rt1318->sdw_slave, RT1318_PROBE_TIMEOUT); - if (retval < 0) - return retval; - retval = sdw_stream_add_slave(rt1318->sdw_slave, &stream_config, &port_config, 1, sdw_stream); if (retval) { @@ -836,10 +818,13 @@ static int rt1318_dev_suspend(struct device *dev) return 0; } +#define RT1318_PROBE_TIMEOUT 5000 + static int rt1318_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt1318_sdw_priv *rt1318 = dev_get_drvdata(dev); + unsigned long time; if (!rt1318->first_hw_init) return 0; @@ -847,7 +832,12 @@ static int rt1318_dev_resume(struct device *dev) if (!slave->unattach_request) goto regmap_sync; - return 0; + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT1318_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__); + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; From a7f01af6276aacc2daf81db628b48d72793d8a5a Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:13:20 +0800 Subject: [PATCH 05/17] Revert "ASoC: rt1316: wait codec init in hw_params" This reverts commit bd1d8a55155c2d3eb5c691f830e4f8c9f6fd2d9f. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt1316-sdw.c | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/sound/soc/codecs/rt1316-sdw.c b/sound/soc/codecs/rt1316-sdw.c index 56e82c0f648d97..960b6c4f5a6680 100644 --- a/sound/soc/codecs/rt1316-sdw.c +++ b/sound/soc/codecs/rt1316-sdw.c @@ -313,7 +313,6 @@ static int rt1316_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt1316_sdw_priv *rt1316 = dev_get_drvdata(&slave->dev); - int ret; if (status == SDW_SLAVE_UNATTACHED) rt1316->hw_init = false; @@ -326,18 +325,7 @@ static int rt1316_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt1316_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "%s: I/O init failed: %d\n", __func__, ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt1316->regmap, false); - regcache_sync(rt1316->regmap); - } - - return ret; + return rt1316_io_init(&slave->dev, slave); } static int rt1316_classd_event(struct snd_soc_dapm_widget *w, @@ -517,8 +505,6 @@ static void rt1316_sdw_shutdown(struct snd_pcm_substream *substream, snd_soc_dai_set_dma_data(dai, substream, NULL); } -#define RT1316_PROBE_TIMEOUT 5000 - static int rt1316_sdw_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { @@ -548,10 +534,6 @@ static int rt1316_sdw_hw_params(struct snd_pcm_substream *substream, else port_config.num = 2; - retval = sdw_slave_wait_for_initialization(rt1316->sdw_slave, RT1316_PROBE_TIMEOUT); - if (retval < 0) - return retval; - retval = sdw_stream_add_slave(rt1316->sdw_slave, &stream_config, &port_config, 1, sdw_stream); if (retval) { @@ -760,10 +742,13 @@ static int rt1316_dev_suspend(struct device *dev) return 0; } +#define RT1316_PROBE_TIMEOUT 5000 + static int rt1316_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt1316_sdw_priv *rt1316 = dev_get_drvdata(dev); + unsigned long time; if (!rt1316->first_hw_init) return 0; @@ -771,7 +756,14 @@ static int rt1316_dev_resume(struct device *dev) if (!slave->unattach_request) goto regmap_sync; - return 0; + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT1316_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__); + sdw_show_ping_status(slave->bus, true); + + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; From 48126ca113b11e49d41a219a58bd921275bf469c Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:13:36 +0800 Subject: [PATCH 06/17] Revert "ASoC: rt700: wait codec init in hw_params" This reverts commit 26d3e48cab608d7e00a84309649882f122dafdaf. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt700-sdw.c | 27 ++++++++++++--------------- sound/soc/codecs/rt700.c | 6 ------ 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/sound/soc/codecs/rt700-sdw.c b/sound/soc/codecs/rt700-sdw.c index dd775788c2ee43..44543c0da17724 100644 --- a/sound/soc/codecs/rt700-sdw.c +++ b/sound/soc/codecs/rt700-sdw.c @@ -314,7 +314,6 @@ static int rt700_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt700_priv *rt700 = dev_get_drvdata(&slave->dev); - int ret; if (status == SDW_SLAVE_UNATTACHED) rt700->hw_init = false; @@ -327,19 +326,7 @@ static int rt700_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt700_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "I/O init failed: %d\n", ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt700->regmap, false); - regcache_sync_region(rt700->regmap, 0x3000, 0x8fff); - regcache_sync_region(rt700->regmap, 0x752010, 0x75206b); - } - - return ret; + return rt700_io_init(&slave->dev, slave); } static int rt700_read_prop(struct sdw_slave *slave) @@ -531,10 +518,13 @@ static int rt700_dev_system_suspend(struct device *dev) return rt700_dev_suspend(dev); } +#define RT700_PROBE_TIMEOUT 5000 + static int rt700_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt700_priv *rt700 = dev_get_drvdata(dev); + unsigned long time; if (!rt700->first_hw_init) return 0; @@ -542,7 +532,14 @@ static int rt700_dev_resume(struct device *dev) if (!slave->unattach_request) goto regmap_sync; - return 0; + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT700_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "Initialization not complete, timed out\n"); + sdw_show_ping_status(slave->bus, true); + + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; diff --git a/sound/soc/codecs/rt700.c b/sound/soc/codecs/rt700.c index 4a5338f7ad92e5..434b926f96c837 100644 --- a/sound/soc/codecs/rt700.c +++ b/sound/soc/codecs/rt700.c @@ -893,8 +893,6 @@ static void rt700_shutdown(struct snd_pcm_substream *substream, snd_soc_dai_set_dma_data(dai, substream, NULL); } -#define RT700_PROBE_TIMEOUT 5000 - static int rt700_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -936,10 +934,6 @@ static int rt700_pcm_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - retval = sdw_slave_wait_for_initialization(rt700->slave, RT700_PROBE_TIMEOUT); - if (retval < 0) - return retval; - retval = sdw_stream_add_slave(rt700->slave, &stream_config, &port_config, 1, sdw_stream); if (retval) { From fa7d3aafd28fd7e27fdf53bbf345adc3be155e7d Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:13:52 +0800 Subject: [PATCH 07/17] Revert "ASoC: rt715: wait codec init in hw_params" This reverts commit 63e9bd4912b2938d06eb5495491a8bf9d4f7e248. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt715-sdw.c | 27 ++++++++++++--------------- sound/soc/codecs/rt715.c | 6 ------ 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/sound/soc/codecs/rt715-sdw.c b/sound/soc/codecs/rt715-sdw.c index 8276ff9958c423..a3df4bbedf864b 100644 --- a/sound/soc/codecs/rt715-sdw.c +++ b/sound/soc/codecs/rt715-sdw.c @@ -376,7 +376,6 @@ static int rt715_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt715_priv *rt715 = dev_get_drvdata(&slave->dev); - int ret; /* * Perform initialization only if slave status is present and @@ -386,19 +385,7 @@ static int rt715_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt715_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "%s: I/O init failed: %d\n", __func__, ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt715->regmap, false); - regcache_sync_region(rt715->regmap, 0x3000, 0x8fff); - regcache_sync_region(rt715->regmap, 0x752039, 0x752039); - } - - return ret; + return rt715_io_init(&slave->dev, slave); } static int rt715_read_prop(struct sdw_slave *slave) @@ -510,10 +497,13 @@ static int rt715_dev_suspend(struct device *dev) return 0; } +#define RT715_PROBE_TIMEOUT 5000 + static int rt715_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt715_priv *rt715 = dev_get_drvdata(dev); + unsigned long time; if (!rt715->first_hw_init) return 0; @@ -521,7 +511,14 @@ static int rt715_dev_resume(struct device *dev) if (!slave->unattach_request) goto regmap_sync; - return 0; + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT715_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__); + sdw_show_ping_status(slave->bus, true); + + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; diff --git a/sound/soc/codecs/rt715.c b/sound/soc/codecs/rt715.c index bf523a39bdcf31..2cf4618520918b 100644 --- a/sound/soc/codecs/rt715.c +++ b/sound/soc/codecs/rt715.c @@ -822,8 +822,6 @@ static void rt715_shutdown(struct snd_pcm_substream *substream, snd_soc_dai_set_dma_data(dai, substream, NULL); } -#define RT715_PROBE_TIMEOUT 5000 - static int rt715_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -860,10 +858,6 @@ static int rt715_pcm_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - retval = sdw_slave_wait_for_initialization(rt715->slave, RT715_PROBE_TIMEOUT); - if (retval < 0) - return retval; - retval = sdw_stream_add_slave(rt715->slave, &stream_config, &port_config, 1, sdw_stream); if (retval) { From 702ce00eb6688060802ac64bdf71cc7dbb870e76 Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:14:06 +0800 Subject: [PATCH 08/17] Revert "ASoC: rt711: wait codec init in hw_params" This reverts commit e9d722107fee994353552471a409f74088f7f23e. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt711-sdw.c | 26 ++++++++++---------------- sound/soc/codecs/rt711.c | 6 ------ 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/sound/soc/codecs/rt711-sdw.c b/sound/soc/codecs/rt711-sdw.c index 884206850b4635..93a5a89a96b1e1 100644 --- a/sound/soc/codecs/rt711-sdw.c +++ b/sound/soc/codecs/rt711-sdw.c @@ -320,7 +320,6 @@ static int rt711_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt711_priv *rt711 = dev_get_drvdata(&slave->dev); - int ret; if (status == SDW_SLAVE_UNATTACHED) rt711->hw_init = false; @@ -333,20 +332,7 @@ static int rt711_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt711_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "%s: I/O init failed: %d\n", - __func__, ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt711->regmap, false); - regcache_sync_region(rt711->regmap, 0x3000, 0x8fff); - regcache_sync_region(rt711->regmap, 0x752009, 0x752091); - } - - return ret; + return rt711_io_init(&slave->dev, slave); } static int rt711_read_prop(struct sdw_slave *slave) @@ -540,10 +526,13 @@ static int rt711_dev_system_suspend(struct device *dev) return rt711_dev_suspend(dev); } +#define RT711_PROBE_TIMEOUT 5000 + static int rt711_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt711_priv *rt711 = dev_get_drvdata(dev); + unsigned long time; if (!rt711->first_hw_init) return 0; @@ -558,7 +547,12 @@ static int rt711_dev_resume(struct device *dev) goto regmap_sync; } - return 0; + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT711_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__); + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; diff --git a/sound/soc/codecs/rt711.c b/sound/soc/codecs/rt711.c index 2fbd7c0227ff2d..5446f9506a1672 100644 --- a/sound/soc/codecs/rt711.c +++ b/sound/soc/codecs/rt711.c @@ -982,8 +982,6 @@ static void rt711_shutdown(struct snd_pcm_substream *substream, snd_soc_dai_set_dma_data(dai, substream, NULL); } -#define RT711_PROBE_TIMEOUT 5000 - static int rt711_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -1019,10 +1017,6 @@ static int rt711_pcm_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - retval = sdw_slave_wait_for_initialization(rt711->slave, RT711_PROBE_TIMEOUT); - if (retval < 0) - return retval; - retval = sdw_stream_add_slave(rt711->slave, &stream_config, &port_config, 1, sdw_stream); if (retval) { From b06aeb31eb55de4cc0a73c5f7ebfb8fbb400e0b4 Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:14:22 +0800 Subject: [PATCH 09/17] Revert "ASoC: rt711-sdca: wait codec init in hw_params" This reverts commit f97e7f4397a8788a87dbbeee01eb0b2cc44ca69b. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt711-sdca-sdw.c | 28 ++++++++++++---------------- sound/soc/codecs/rt711-sdca.c | 6 ------ 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/sound/soc/codecs/rt711-sdca-sdw.c b/sound/soc/codecs/rt711-sdca-sdw.c index ec11e0033a288d..6eb05871db3792 100644 --- a/sound/soc/codecs/rt711-sdca-sdw.c +++ b/sound/soc/codecs/rt711-sdca-sdw.c @@ -142,7 +142,6 @@ static int rt711_sdca_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt711_sdca_priv *rt711 = dev_get_drvdata(&slave->dev); - int ret; if (status == SDW_SLAVE_UNATTACHED) rt711->hw_init = false; @@ -170,20 +169,7 @@ static int rt711_sdca_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt711_sdca_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "IO init failed: %d\n", ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt711->regmap, false); - regcache_sync(rt711->regmap); - regcache_cache_only(rt711->mbq_regmap, false); - regcache_sync(rt711->mbq_regmap); - } - - return ret; + return rt711_sdca_io_init(&slave->dev, slave); } static int rt711_sdca_read_prop(struct sdw_slave *slave) @@ -448,10 +434,13 @@ static int rt711_sdca_dev_system_suspend(struct device *dev) return rt711_sdca_dev_suspend(dev); } +#define RT711_PROBE_TIMEOUT 5000 + static int rt711_sdca_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt711_sdca_priv *rt711 = dev_get_drvdata(dev); + unsigned long time; if (!rt711->first_hw_init) return 0; @@ -467,7 +456,14 @@ static int rt711_sdca_dev_resume(struct device *dev) goto regmap_sync; } - return 0; + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT711_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__); + sdw_show_ping_status(slave->bus, true); + + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; diff --git a/sound/soc/codecs/rt711-sdca.c b/sound/soc/codecs/rt711-sdca.c index a4027796dafc03..dd6ccf17afd439 100644 --- a/sound/soc/codecs/rt711-sdca.c +++ b/sound/soc/codecs/rt711-sdca.c @@ -1327,8 +1327,6 @@ static void rt711_sdca_shutdown(struct snd_pcm_substream *substream, snd_soc_dai_set_dma_data(dai, substream, NULL); } -#define RT711_PROBE_TIMEOUT 5000 - static int rt711_sdca_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -1364,10 +1362,6 @@ static int rt711_sdca_pcm_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - retval = sdw_slave_wait_for_initialization(rt711->slave, RT711_PROBE_TIMEOUT); - if (retval < 0) - return retval; - retval = sdw_stream_add_slave(rt711->slave, &stream_config, &port_config, 1, sdw_stream); if (retval) { From c84a1ec7e664fdea2321fe840003f430798396a7 Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:15:50 +0800 Subject: [PATCH 10/17] Revert "fixup! ASoC: rt715-sdca: wait codec init in hw_params" This reverts commit 70457a54575c093746a574a3e0aac424a7526adf. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt715-sdca-sdw.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sound/soc/codecs/rt715-sdca-sdw.c b/sound/soc/codecs/rt715-sdca-sdw.c index ed0e230fc00977..cd4d01ef22ac4d 100644 --- a/sound/soc/codecs/rt715-sdca-sdw.c +++ b/sound/soc/codecs/rt715-sdca-sdw.c @@ -139,17 +139,17 @@ static int rt715_sdca_update_status(struct sdw_slave *slave, if (slave->unattach_request) { regcache_cache_only(rt715->regmap, false); regcache_sync_region(rt715->regmap, - SDW_SDCA_CTL(FUN_JACK_CODEC, RT715_SDCA_ST_EN, - RT715_SDCA_ST_CTRL, CH_00), - SDW_SDCA_CTL(FUN_MIC_ARRAY, RT715_SDCA_SMPU_TRIG_ST_EN, - RT715_SDCA_SMPU_TRIG_ST_CTRL, CH_00)); + SDW_SDCA_CTL(FUN_JACK_CODEC, RT715_SDCA_ST_EN, RT715_SDCA_ST_CTRL, + CH_00), + SDW_SDCA_CTL(FUN_MIC_ARRAY, RT715_SDCA_SMPU_TRIG_ST_EN, + RT715_SDCA_SMPU_TRIG_ST_CTRL, CH_00)); regcache_cache_only(rt715->mbq_regmap, false); regcache_sync_region(rt715->mbq_regmap, 0x2000000, 0x61020ff); regcache_sync_region(rt715->mbq_regmap, - SDW_SDCA_CTL(FUN_JACK_CODEC, RT715_SDCA_ST_EN, - RT715_SDCA_ST_CTRL, CH_00), - SDW_SDCA_CTL(FUN_MIC_ARRAY, RT715_SDCA_SMPU_TRIG_ST_EN, - RT715_SDCA_SMPU_TRIG_ST_CTRL, CH_00)); + SDW_SDCA_CTL(FUN_JACK_CODEC, RT715_SDCA_ST_EN, RT715_SDCA_ST_CTRL, + CH_00), + SDW_SDCA_CTL(FUN_MIC_ARRAY, RT715_SDCA_SMPU_TRIG_ST_EN, + RT715_SDCA_SMPU_TRIG_ST_CTRL, CH_00)); } return ret; From 286ecfdb9ee110be9068bd08402b62ae638cbc97 Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:16:01 +0800 Subject: [PATCH 11/17] Revert "ASoC: rt715-sdca: wait codec init in hw_params" This reverts commit 47f6c5dceb55c290b4c89c94554dec5683791d17. Signed-off-by: Bard Liao --- sound/soc/codecs/rt715-sdca-sdw.c | 37 ++++++++++--------------------- sound/soc/codecs/rt715-sdca.c | 6 ----- 2 files changed, 12 insertions(+), 31 deletions(-) diff --git a/sound/soc/codecs/rt715-sdca-sdw.c b/sound/soc/codecs/rt715-sdca-sdw.c index cd4d01ef22ac4d..ce7d8955efc353 100644 --- a/sound/soc/codecs/rt715-sdca-sdw.c +++ b/sound/soc/codecs/rt715-sdca-sdw.c @@ -120,7 +120,6 @@ static int rt715_sdca_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt715_sdca_priv *rt715 = dev_get_drvdata(&slave->dev); - int ret; /* * Perform initialization only if slave status is present and @@ -130,29 +129,7 @@ static int rt715_sdca_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt715_sdca_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "IO init failed: %d\n", ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt715->regmap, false); - regcache_sync_region(rt715->regmap, - SDW_SDCA_CTL(FUN_JACK_CODEC, RT715_SDCA_ST_EN, RT715_SDCA_ST_CTRL, - CH_00), - SDW_SDCA_CTL(FUN_MIC_ARRAY, RT715_SDCA_SMPU_TRIG_ST_EN, - RT715_SDCA_SMPU_TRIG_ST_CTRL, CH_00)); - regcache_cache_only(rt715->mbq_regmap, false); - regcache_sync_region(rt715->mbq_regmap, 0x2000000, 0x61020ff); - regcache_sync_region(rt715->mbq_regmap, - SDW_SDCA_CTL(FUN_JACK_CODEC, RT715_SDCA_ST_EN, RT715_SDCA_ST_CTRL, - CH_00), - SDW_SDCA_CTL(FUN_MIC_ARRAY, RT715_SDCA_SMPU_TRIG_ST_EN, - RT715_SDCA_SMPU_TRIG_ST_CTRL, CH_00)); - } - - return ret; + return rt715_sdca_io_init(&slave->dev, slave); } static int rt715_sdca_read_prop(struct sdw_slave *slave) @@ -243,10 +220,13 @@ static int rt715_dev_suspend(struct device *dev) return 0; } +#define RT715_PROBE_TIMEOUT 5000 + static int rt715_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt715_sdca_priv *rt715 = dev_get_drvdata(dev); + unsigned long time; if (!rt715->first_hw_init) return 0; @@ -254,7 +234,14 @@ static int rt715_dev_resume(struct device *dev) if (!slave->unattach_request) goto regmap_sync; - return 0; + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT715_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__); + sdw_show_ping_status(slave->bus, true); + + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; diff --git a/sound/soc/codecs/rt715-sdca.c b/sound/soc/codecs/rt715-sdca.c index c2a08ae8df95a8..7fb02654c16bd9 100644 --- a/sound/soc/codecs/rt715-sdca.c +++ b/sound/soc/codecs/rt715-sdca.c @@ -792,8 +792,6 @@ static void rt715_sdca_shutdown(struct snd_pcm_substream *substream, snd_soc_dai_set_dma_data(dai, substream, NULL); } -#define RT715_PROBE_TIMEOUT 5000 - static int rt715_sdca_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -832,10 +830,6 @@ static int rt715_sdca_pcm_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - retval = sdw_slave_wait_for_initialization(rt715->slave, RT715_PROBE_TIMEOUT); - if (retval < 0) - return retval; - retval = sdw_stream_add_slave(rt715->slave, &stream_config, &port_config, 1, sdw_stream); if (retval) { From 38786f151c08c2d8fdd4254031d734373a7cd9a2 Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:16:25 +0800 Subject: [PATCH 12/17] Revert "ASoC: rt721: wait codec init in hw_params" This reverts commit bf9d692c9e5867fddde63ef589401c1e5033f334. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt721-sdca-sdw.c | 29 +++++++++++++---------------- sound/soc/codecs/rt721-sdca.c | 6 ------ 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/sound/soc/codecs/rt721-sdca-sdw.c b/sound/soc/codecs/rt721-sdca-sdw.c index 342a5511677128..582b47d692783a 100644 --- a/sound/soc/codecs/rt721-sdca-sdw.c +++ b/sound/soc/codecs/rt721-sdca-sdw.c @@ -190,7 +190,6 @@ static int rt721_sdca_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt721_sdca_priv *rt721 = dev_get_drvdata(&slave->dev); - int ret; if (status == SDW_SLAVE_UNATTACHED) rt721->hw_init = false; @@ -218,20 +217,7 @@ static int rt721_sdca_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt721_sdca_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "IO init failed: %d\n", ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt721->regmap, false); - regcache_sync(rt721->regmap); - regcache_cache_only(rt721->mbq_regmap, false); - regcache_sync(rt721->mbq_regmap); - } - - return ret; + return rt721_sdca_io_init(&slave->dev, slave); } static int rt721_sdca_read_prop(struct sdw_slave *slave) @@ -497,10 +483,13 @@ static int rt721_sdca_dev_system_suspend(struct device *dev) return rt721_sdca_dev_suspend(dev); } +#define RT721_PROBE_TIMEOUT 5000 + static int rt721_sdca_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt721_sdca_priv *rt721 = dev_get_drvdata(dev); + unsigned long time; if (!rt721->first_hw_init) return 0; @@ -515,7 +504,15 @@ static int rt721_sdca_dev_resume(struct device *dev) mutex_unlock(&rt721->disable_irq_lock); goto regmap_sync; } - return 0; + + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT721_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "Initialization not complete, timed out\n"); + sdw_show_ping_status(slave->bus, true); + + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; diff --git a/sound/soc/codecs/rt721-sdca.c b/sound/soc/codecs/rt721-sdca.c index 91a7b6f672c618..ba080957e93361 100644 --- a/sound/soc/codecs/rt721-sdca.c +++ b/sound/soc/codecs/rt721-sdca.c @@ -1261,8 +1261,6 @@ static void rt721_sdca_shutdown(struct snd_pcm_substream *substream, snd_soc_dai_set_dma_data(dai, substream, NULL); } -#define RT721_PROBE_TIMEOUT 5000 - static int rt721_sdca_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -1317,10 +1315,6 @@ static int rt721_sdca_pcm_hw_params(struct snd_pcm_substream *substream, port_config.ch_mask = GENMASK(num_channels - 1, 0); port_config.num = port; - retval = sdw_slave_wait_for_initialization(rt721->slave, RT721_PROBE_TIMEOUT); - if (retval < 0) - return retval; - retval = sdw_stream_add_slave(rt721->slave, &stream_config, &port_config, 1, sdw_stream); if (retval) { From 76e9b83130ee268faaf737acc817a05f34c08a2b Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:16:36 +0800 Subject: [PATCH 13/17] Revert "ASoC: rt1320: wait codec init in hw_params" This reverts commit 2334b9b22042d2c474ce68c1aca7af8f60d7aad3. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt1320-sdw.c | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/sound/soc/codecs/rt1320-sdw.c b/sound/soc/codecs/rt1320-sdw.c index e4b208be492c50..015cc710e6dc08 100644 --- a/sound/soc/codecs/rt1320-sdw.c +++ b/sound/soc/codecs/rt1320-sdw.c @@ -774,7 +774,6 @@ static int rt1320_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt1320_sdw_priv *rt1320 = dev_get_drvdata(&slave->dev); - int ret; if (status == SDW_SLAVE_UNATTACHED) rt1320->hw_init = false; @@ -787,20 +786,7 @@ static int rt1320_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt1320_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "IO init failed: %d\n", ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt1320->regmap, false); - regcache_sync(rt1320->regmap); - regcache_cache_only(rt1320->mbq_regmap, false); - regcache_sync(rt1320->mbq_regmap); - } - - return ret; + return rt1320_io_init(&slave->dev, slave); } static int rt1320_pde11_event(struct snd_soc_dapm_widget *w, @@ -1197,8 +1183,6 @@ static void rt1320_sdw_shutdown(struct snd_pcm_substream *substream, snd_soc_dai_set_dma_data(dai, substream, NULL); } -#define RT1320_PROBE_TIMEOUT 5000 - static int rt1320_sdw_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { @@ -1241,10 +1225,6 @@ static int rt1320_sdw_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - retval = sdw_slave_wait_for_initialization(rt1320->sdw_slave, RT1320_PROBE_TIMEOUT); - if (retval < 0) - return retval; - if (dai->id == RT1320_AIF1) retval = sdw_stream_add_slave(rt1320->sdw_slave, &stream_config, &port_config, 1, sdw_stream); @@ -1505,10 +1485,13 @@ static int rt1320_dev_suspend(struct device *dev) return 0; } +#define RT1320_PROBE_TIMEOUT 5000 + static int rt1320_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt1320_sdw_priv *rt1320 = dev_get_drvdata(dev); + unsigned long time; if (!rt1320->first_hw_init) return 0; @@ -1516,7 +1499,12 @@ static int rt1320_dev_resume(struct device *dev) if (!slave->unattach_request) goto regmap_sync; - return 0; + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT1320_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__); + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; From bac48411b6a3126cce2bdc4b96174d902dc527b1 Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:16:48 +0800 Subject: [PATCH 14/17] Revert "ASoC: rt712: wait codec init in hw_params" This reverts commit 78bcf2cde8a21a8822543077295f9dfad3113eb8. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt712-sdca-sdw.c | 28 ++++++++++++---------------- sound/soc/codecs/rt712-sdca.c | 6 ------ 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/sound/soc/codecs/rt712-sdca-sdw.c b/sound/soc/codecs/rt712-sdca-sdw.c index 183496505e901b..ea07131edfa268 100644 --- a/sound/soc/codecs/rt712-sdca-sdw.c +++ b/sound/soc/codecs/rt712-sdca-sdw.c @@ -157,7 +157,6 @@ static int rt712_sdca_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt712_sdca_priv *rt712 = dev_get_drvdata(&slave->dev); - int ret; if (status == SDW_SLAVE_UNATTACHED) rt712->hw_init = false; @@ -185,20 +184,7 @@ static int rt712_sdca_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt712_sdca_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "IO init failed: %d\n", ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt712->regmap, false); - regcache_sync(rt712->regmap); - regcache_cache_only(rt712->mbq_regmap, false); - regcache_sync(rt712->mbq_regmap); - } - - return ret; + return rt712_sdca_io_init(&slave->dev, slave); } static int rt712_sdca_read_prop(struct sdw_slave *slave) @@ -460,10 +446,13 @@ static int rt712_sdca_dev_system_suspend(struct device *dev) return rt712_sdca_dev_suspend(dev); } +#define RT712_PROBE_TIMEOUT 5000 + static int rt712_sdca_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt712_sdca_priv *rt712 = dev_get_drvdata(dev); + unsigned long time; if (!rt712->first_hw_init) return 0; @@ -480,7 +469,14 @@ static int rt712_sdca_dev_resume(struct device *dev) goto regmap_sync; } - return 0; + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT712_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__); + sdw_show_ping_status(slave->bus, true); + + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; diff --git a/sound/soc/codecs/rt712-sdca.c b/sound/soc/codecs/rt712-sdca.c index c8c68fda5c207e..570c2af1245d64 100644 --- a/sound/soc/codecs/rt712-sdca.c +++ b/sound/soc/codecs/rt712-sdca.c @@ -1451,8 +1451,6 @@ static void rt712_sdca_shutdown(struct snd_pcm_substream *substream, snd_soc_dai_set_dma_data(dai, substream, NULL); } -#define RT712_PROBE_TIMEOUT 5000 - static int rt712_sdca_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -1507,10 +1505,6 @@ static int rt712_sdca_pcm_hw_params(struct snd_pcm_substream *substream, port_config.ch_mask = GENMASK(num_channels - 1, 0); port_config.num = port; - retval = sdw_slave_wait_for_initialization(rt712->slave, RT712_PROBE_TIMEOUT); - if (retval < 0) - return retval; - retval = sdw_stream_add_slave(rt712->slave, &stream_config, &port_config, 1, sdw_stream); if (retval) { From 7bbde8ffd69cb41821786c85654c42745d17be19 Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:17:02 +0800 Subject: [PATCH 15/17] Revert "ASoC: rt722: wait codec init in hw_params" This reverts commit 8cec2a595c7cc91b2a7fc1d1378ef9e498178ca4. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- sound/soc/codecs/rt722-sdca-sdw.c | 26 ++++++++++++-------------- sound/soc/codecs/rt722-sdca.c | 6 ------ 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/sound/soc/codecs/rt722-sdca-sdw.c b/sound/soc/codecs/rt722-sdca-sdw.c index b72d169bf15e91..70700bdb80a143 100644 --- a/sound/soc/codecs/rt722-sdca-sdw.c +++ b/sound/soc/codecs/rt722-sdca-sdw.c @@ -209,7 +209,6 @@ static int rt722_sdca_update_status(struct sdw_slave *slave, enum sdw_slave_status status) { struct rt722_sdca_priv *rt722 = dev_get_drvdata(&slave->dev); - int ret; if (status == SDW_SLAVE_UNATTACHED) rt722->hw_init = false; @@ -237,18 +236,7 @@ static int rt722_sdca_update_status(struct sdw_slave *slave, return 0; /* perform I/O transfers required for Slave initialization */ - ret = rt722_sdca_io_init(&slave->dev, slave); - if (ret < 0) { - dev_err(&slave->dev, "IO init failed: %d\n", ret); - return ret; - } - - if (slave->unattach_request) { - regcache_cache_only(rt722->regmap, false); - regcache_sync(rt722->regmap); - } - - return ret; + return rt722_sdca_io_init(&slave->dev, slave); } static int rt722_sdca_read_prop(struct sdw_slave *slave) @@ -507,10 +495,13 @@ static int rt722_sdca_dev_system_suspend(struct device *dev) return rt722_sdca_dev_suspend(dev); } +#define RT722_PROBE_TIMEOUT 5000 + static int rt722_sdca_dev_resume(struct device *dev) { struct sdw_slave *slave = dev_to_sdw_dev(dev); struct rt722_sdca_priv *rt722 = dev_get_drvdata(dev); + unsigned long time; if (!rt722->first_hw_init) return 0; @@ -526,7 +517,14 @@ static int rt722_sdca_dev_resume(struct device *dev) goto regmap_sync; } - return 0; + time = wait_for_completion_timeout(&slave->initialization_complete, + msecs_to_jiffies(RT722_PROBE_TIMEOUT)); + if (!time) { + dev_err(&slave->dev, "Initialization not complete, timed out\n"); + sdw_show_ping_status(slave->bus, true); + + return -ETIMEDOUT; + } regmap_sync: slave->unattach_request = 0; diff --git a/sound/soc/codecs/rt722-sdca.c b/sound/soc/codecs/rt722-sdca.c index 68ba252467d022..ac9588284a955c 100644 --- a/sound/soc/codecs/rt722-sdca.c +++ b/sound/soc/codecs/rt722-sdca.c @@ -1114,8 +1114,6 @@ static void rt722_sdca_shutdown(struct snd_pcm_substream *substream, snd_soc_dai_set_dma_data(dai, substream, NULL); } -#define RT722_PROBE_TIMEOUT 5000 - static int rt722_sdca_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -1170,10 +1168,6 @@ static int rt722_sdca_pcm_hw_params(struct snd_pcm_substream *substream, port_config.ch_mask = GENMASK(num_channels - 1, 0); port_config.num = port; - retval = sdw_slave_wait_for_initialization(rt722->slave, RT722_PROBE_TIMEOUT); - if (retval < 0) - return retval; - retval = sdw_stream_add_slave(rt722->slave, &stream_config, &port_config, 1, sdw_stream); if (retval) { From 4eb2b60399eebedb7dd9ee7830d9734035669d17 Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:17:44 +0800 Subject: [PATCH 16/17] Revert "fixup! soundwire: add sdw_slave_wait_for_initialization helper" This reverts commit 6b549fc296715b13a9e407c1ec1491c44b00cbd5. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- drivers/soundwire/slave.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/soundwire/slave.c b/drivers/soundwire/slave.c index 5d45adb2849121..c25e317c891d3c 100644 --- a/drivers/soundwire/slave.c +++ b/drivers/soundwire/slave.c @@ -109,7 +109,7 @@ int sdw_slave_wait_for_initialization(struct sdw_slave *slave, unsigned int time unsigned long time; time = wait_for_completion_timeout(&slave->initialization_complete, - msecs_to_jiffies(timeout)); + msecs_to_jiffies(timeout)); if (!time) { dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__); sdw_show_ping_status(slave->bus, true); From 6347038be930f9a4513b6813341d503868a19935 Mon Sep 17 00:00:00 2001 From: Bard Liao Date: Wed, 2 Jul 2025 15:17:53 +0800 Subject: [PATCH 17/17] Revert "soundwire: add sdw_slave_wait_for_initialization helper" This reverts commit e7706a44342f921c29617f304efa54e557e80657. We should ensure the device is fully operational when it is resumed. Signed-off-by: Bard Liao --- drivers/soundwire/slave.c | 17 ----------------- include/linux/soundwire/sdw.h | 1 - 2 files changed, 18 deletions(-) diff --git a/drivers/soundwire/slave.c b/drivers/soundwire/slave.c index c25e317c891d3c..d2d99555ec5a50 100644 --- a/drivers/soundwire/slave.c +++ b/drivers/soundwire/slave.c @@ -104,23 +104,6 @@ int sdw_slave_add(struct sdw_bus *bus, } EXPORT_SYMBOL(sdw_slave_add); -int sdw_slave_wait_for_initialization(struct sdw_slave *slave, unsigned int timeout) -{ - unsigned long time; - - time = wait_for_completion_timeout(&slave->initialization_complete, - msecs_to_jiffies(timeout)); - if (!time) { - dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__); - sdw_show_ping_status(slave->bus, true); - - return -ETIMEDOUT; - } - - return 0; -} -EXPORT_SYMBOL(sdw_slave_wait_for_initialization); - #if IS_ENABLED(CONFIG_ACPI) static bool find_slave(struct sdw_bus *bus, diff --git a/include/linux/soundwire/sdw.h b/include/linux/soundwire/sdw.h index 961a10af12c10c..0832776262ac3b 100644 --- a/include/linux/soundwire/sdw.h +++ b/include/linux/soundwire/sdw.h @@ -1087,7 +1087,6 @@ int sdw_stream_remove_slave(struct sdw_slave *slave, struct sdw_stream_runtime *stream); int sdw_slave_get_scale_index(struct sdw_slave *slave, u8 *base); -int sdw_slave_wait_for_initialization(struct sdw_slave *slave, unsigned int timeout); /* messaging and data APIs */ int sdw_read(struct sdw_slave *slave, u32 addr);