linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/10] ASoC: codec: add pm runtime support for Qualcomm codecs
@ 2022-02-21 13:10 Srinivas Kandagatla
  2022-02-21 13:10 ` [PATCH 01/10] ASoC: codecs: va-macro: add runtime pm support Srinivas Kandagatla
                   ` (9 more replies)
  0 siblings, 10 replies; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-21 13:10 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam, Srinivas Kandagatla

This patchset adds support for runtime pm on tx/rx/wsa/wcd lpass macro, wsa881x
and wcd938x codecs that are wired up on SoundWire bus.
During pm testing it was also found that soundwire clks enabled by lpass macros
are not enabling all the required clocks correctly, so last 3 patches corrects them.

Tested this on SM8250 MTP along SoundWire In band Headset Button wakeup interrupts.

Srinivas Kandagatla (10):
  ASoC: codecs: va-macro: add runtime pm support
  ASoC: codecs: wsa-macro: add runtime pm support
  ASoC: codecs: rx-macro: add runtime pm support
  ASoC: codecs: tx-macro: add runtime pm support
  ASoC: codecs: wsa881x: add runtime pm support
  ASoC: codecs: wcd938x: add simple clk stop support
  ASoC: codecs: wcd-mbhc: add runtime pm support
  ASoC: codecs: wsa-macro: setup soundwire clks correctly
  ASoC: codecs: tx-macro: setup soundwire clks correctly
  ASoC: codecs: rx-macro: setup soundwire clks correctly

 sound/soc/codecs/lpass-rx-macro.c  | 49 +++++++++++++++++++++++++--
 sound/soc/codecs/lpass-tx-macro.c  | 45 ++++++++++++++++++++++++-
 sound/soc/codecs/lpass-va-macro.c  | 36 ++++++++++++++++++++
 sound/soc/codecs/lpass-wsa-macro.c | 43 +++++++++++++++++++++++-
 sound/soc/codecs/wcd-mbhc-v2.c     | 26 ++++++++++++++
 sound/soc/codecs/wcd938x-sdw.c     |  1 +
 sound/soc/codecs/wsa881x.c         | 54 ++++++++++++++++++++++++++++++
 7 files changed, 250 insertions(+), 4 deletions(-)

-- 
2.21.0


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH 01/10] ASoC: codecs: va-macro: add runtime pm support
  2022-02-21 13:10 [PATCH 00/10] ASoC: codec: add pm runtime support for Qualcomm codecs Srinivas Kandagatla
@ 2022-02-21 13:10 ` Srinivas Kandagatla
  2022-02-21 15:24   ` Mark Brown
  2022-02-21 13:10 ` [PATCH 02/10] ASoC: codecs: wsa-macro: " Srinivas Kandagatla
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-21 13:10 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam, Srinivas Kandagatla

Add pm runtime support to VA Macro.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 sound/soc/codecs/lpass-va-macro.c | 36 +++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/sound/soc/codecs/lpass-va-macro.c b/sound/soc/codecs/lpass-va-macro.c
index e14c277e6a8b..0fd0139e8229 100644
--- a/sound/soc/codecs/lpass-va-macro.c
+++ b/sound/soc/codecs/lpass-va-macro.c
@@ -9,6 +9,7 @@
 #include <linux/of_clk.h>
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <linux/regulator/consumer.h>
 #include <sound/soc.h>
@@ -1454,6 +1455,12 @@ static int va_macro_probe(struct platform_device *pdev)
 	if (ret)
 		goto err;
 
+	pm_runtime_set_autosuspend_delay(dev, 3000);
+	pm_runtime_use_autosuspend(dev);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_set_active(dev);
+	pm_runtime_enable(dev);
+
 	return ret;
 
 err:
@@ -1471,6 +1478,34 @@ static int va_macro_remove(struct platform_device *pdev)
 	return 0;
 }
 
+static int __maybe_unused va_macro_runtime_suspend(struct device *dev)
+{
+	struct va_macro *va = dev_get_drvdata(dev);
+
+	regcache_cache_only(va->regmap, true);
+	regcache_mark_dirty(va->regmap);
+
+	clk_disable_unprepare(va->clks[2].clk);
+
+	return 0;
+}
+
+static int __maybe_unused va_macro_runtime_resume(struct device *dev)
+{
+	struct va_macro *va = dev_get_drvdata(dev);
+
+	clk_prepare_enable(va->clks[2].clk);
+
+	regcache_cache_only(va->regmap, false);
+	regcache_sync(va->regmap);
+	return 0;
+}
+
+
+static const struct dev_pm_ops va_macro_pm_ops = {
+	SET_RUNTIME_PM_OPS(va_macro_runtime_suspend, va_macro_runtime_resume, NULL)
+};
+
 static const struct of_device_id va_macro_dt_match[] = {
 	{ .compatible = "qcom,sc7280-lpass-va-macro" },
 	{ .compatible = "qcom,sm8250-lpass-va-macro" },
@@ -1483,6 +1518,7 @@ static struct platform_driver va_macro_driver = {
 		.name = "va_macro",
 		.of_match_table = va_macro_dt_match,
 		.suppress_bind_attrs = true,
+		.pm = &va_macro_pm_ops,
 	},
 	.probe = va_macro_probe,
 	.remove = va_macro_remove,
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 02/10] ASoC: codecs: wsa-macro: add runtime pm support
  2022-02-21 13:10 [PATCH 00/10] ASoC: codec: add pm runtime support for Qualcomm codecs Srinivas Kandagatla
  2022-02-21 13:10 ` [PATCH 01/10] ASoC: codecs: va-macro: add runtime pm support Srinivas Kandagatla
@ 2022-02-21 13:10 ` Srinivas Kandagatla
  2022-02-21 13:10 ` [PATCH 03/10] ASoC: codecs: rx-macro: " Srinivas Kandagatla
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-21 13:10 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam, Srinivas Kandagatla

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 sound/soc/codecs/lpass-wsa-macro.c | 39 ++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/sound/soc/codecs/lpass-wsa-macro.c b/sound/soc/codecs/lpass-wsa-macro.c
index 21a4b8cc4a0a..a8d30f3b3fdf 100644
--- a/sound/soc/codecs/lpass-wsa-macro.c
+++ b/sound/soc/codecs/lpass-wsa-macro.c
@@ -10,6 +10,7 @@
 #include <linux/clk-provider.h>
 #include <sound/soc.h>
 #include <sound/soc-dapm.h>
+#include <linux/pm_runtime.h>
 #include <linux/of_platform.h>
 #include <sound/tlv.h>
 #include "lpass-wsa-macro.h"
@@ -2429,6 +2430,12 @@ static int wsa_macro_probe(struct platform_device *pdev)
 	if (ret)
 		goto err;
 
+	pm_runtime_set_autosuspend_delay(dev, 3000);
+	pm_runtime_use_autosuspend(dev);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_set_active(dev);
+	pm_runtime_enable(dev);
+
 	return ret;
 err:
 	clk_bulk_disable_unprepare(WSA_NUM_CLKS_MAX, wsa->clks);
@@ -2446,6 +2453,37 @@ static int wsa_macro_remove(struct platform_device *pdev)
 	return 0;
 }
 
+static int __maybe_unused wsa_macro_runtime_suspend(struct device *dev)
+{
+	struct wsa_macro *wsa = dev_get_drvdata(dev);
+
+	regcache_cache_only(wsa->regmap, true);
+	regcache_mark_dirty(wsa->regmap);
+
+	clk_disable_unprepare(wsa->clks[2].clk);
+	clk_disable_unprepare(wsa->clks[3].clk);
+	clk_disable_unprepare(wsa->clks[4].clk);
+
+	return 0;
+}
+
+static int __maybe_unused wsa_macro_runtime_resume(struct device *dev)
+{
+	struct wsa_macro *wsa = dev_get_drvdata(dev);
+
+	clk_prepare_enable(wsa->clks[2].clk);
+	clk_prepare_enable(wsa->clks[3].clk);
+	clk_prepare_enable(wsa->clks[4].clk);
+	regcache_cache_only(wsa->regmap, false);
+	regcache_sync(wsa->regmap);
+
+	return 0;
+}
+
+static const struct dev_pm_ops wsa_macro_pm_ops = {
+	SET_RUNTIME_PM_OPS(wsa_macro_runtime_suspend, wsa_macro_runtime_resume, NULL)
+};
+
 static const struct of_device_id wsa_macro_dt_match[] = {
 	{.compatible = "qcom,sc7280-lpass-wsa-macro"},
 	{.compatible = "qcom,sm8250-lpass-wsa-macro"},
@@ -2457,6 +2495,7 @@ static struct platform_driver wsa_macro_driver = {
 	.driver = {
 		.name = "wsa_macro",
 		.of_match_table = wsa_macro_dt_match,
+		.pm = &wsa_macro_pm_ops,
 	},
 	.probe = wsa_macro_probe,
 	.remove = wsa_macro_remove,
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 03/10] ASoC: codecs: rx-macro: add runtime pm support
  2022-02-21 13:10 [PATCH 00/10] ASoC: codec: add pm runtime support for Qualcomm codecs Srinivas Kandagatla
  2022-02-21 13:10 ` [PATCH 01/10] ASoC: codecs: va-macro: add runtime pm support Srinivas Kandagatla
  2022-02-21 13:10 ` [PATCH 02/10] ASoC: codecs: wsa-macro: " Srinivas Kandagatla
@ 2022-02-21 13:10 ` Srinivas Kandagatla
  2022-02-21 13:10 ` [PATCH 04/10] ASoC: codecs: tx-macro: " Srinivas Kandagatla
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-21 13:10 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam, Srinivas Kandagatla

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 sound/soc/codecs/lpass-rx-macro.c | 45 ++++++++++++++++++++++++++++++-
 1 file changed, 44 insertions(+), 1 deletion(-)

diff --git a/sound/soc/codecs/lpass-rx-macro.c b/sound/soc/codecs/lpass-rx-macro.c
index 0ed032b220a4..fb5d4bb8bd8b 100644
--- a/sound/soc/codecs/lpass-rx-macro.c
+++ b/sound/soc/codecs/lpass-rx-macro.c
@@ -5,6 +5,7 @@
 #include <linux/init.h>
 #include <linux/io.h>
 #include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
 #include <linux/clk.h>
 #include <sound/soc.h>
 #include <sound/pcm.h>
@@ -3568,8 +3569,17 @@ static int rx_macro_probe(struct platform_device *pdev)
 					      rx_macro_dai,
 					      ARRAY_SIZE(rx_macro_dai));
 	if (ret)
-		clk_bulk_disable_unprepare(RX_NUM_CLKS_MAX, rx->clks);
+		goto err;
+
+	pm_runtime_set_autosuspend_delay(dev, 3000);
+	pm_runtime_use_autosuspend(dev);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_set_active(dev);
+	pm_runtime_enable(dev);
 
+	return ret;
+err:
+	clk_bulk_disable_unprepare(RX_NUM_CLKS_MAX, rx->clks);
 	return ret;
 }
 
@@ -3589,11 +3599,44 @@ static const struct of_device_id rx_macro_dt_match[] = {
 };
 MODULE_DEVICE_TABLE(of, rx_macro_dt_match);
 
+static int __maybe_unused rx_macro_runtime_suspend(struct device *dev)
+{
+	struct rx_macro *rx = dev_get_drvdata(dev);
+
+	regcache_cache_only(rx->regmap, true);
+	regcache_mark_dirty(rx->regmap);
+
+	clk_disable_unprepare(rx->clks[2].clk);
+	clk_disable_unprepare(rx->clks[3].clk);
+	clk_disable_unprepare(rx->clks[4].clk);
+
+	return 0;
+}
+
+static int __maybe_unused rx_macro_runtime_resume(struct device *dev)
+{
+	struct rx_macro *rx = dev_get_drvdata(dev);
+
+	clk_prepare_enable(rx->clks[2].clk);
+	clk_prepare_enable(rx->clks[3].clk);
+	clk_prepare_enable(rx->clks[4].clk);
+	regcache_cache_only(rx->regmap, false);
+	regcache_sync(rx->regmap);
+	rx->reset_swr = true;
+
+	return 0;
+}
+
+static const struct dev_pm_ops rx_macro_pm_ops = {
+	SET_RUNTIME_PM_OPS(rx_macro_runtime_suspend, rx_macro_runtime_resume, NULL)
+};
+
 static struct platform_driver rx_macro_driver = {
 	.driver = {
 		.name = "rx_macro",
 		.of_match_table = rx_macro_dt_match,
 		.suppress_bind_attrs = true,
+		.pm = &rx_macro_pm_ops,
 	},
 	.probe = rx_macro_probe,
 	.remove = rx_macro_remove,
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 04/10] ASoC: codecs: tx-macro: add runtime pm support
  2022-02-21 13:10 [PATCH 00/10] ASoC: codec: add pm runtime support for Qualcomm codecs Srinivas Kandagatla
                   ` (2 preceding siblings ...)
  2022-02-21 13:10 ` [PATCH 03/10] ASoC: codecs: rx-macro: " Srinivas Kandagatla
@ 2022-02-21 13:10 ` Srinivas Kandagatla
  2022-02-21 13:10 ` [PATCH 05/10] ASoC: codecs: wsa881x: " Srinivas Kandagatla
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-21 13:10 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam, Srinivas Kandagatla

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 sound/soc/codecs/lpass-tx-macro.c | 41 +++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/sound/soc/codecs/lpass-tx-macro.c b/sound/soc/codecs/lpass-tx-macro.c
index 7347d79a6329..1c0f0d27ed42 100644
--- a/sound/soc/codecs/lpass-tx-macro.c
+++ b/sound/soc/codecs/lpass-tx-macro.c
@@ -6,6 +6,7 @@
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <sound/soc.h>
 #include <sound/soc-dapm.h>
@@ -1844,6 +1845,13 @@ static int tx_macro_probe(struct platform_device *pdev)
 					      ARRAY_SIZE(tx_macro_dai));
 	if (ret)
 		goto err;
+
+	pm_runtime_set_autosuspend_delay(dev, 3000);
+	pm_runtime_use_autosuspend(dev);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_set_active(dev);
+	pm_runtime_enable(dev);
+
 	return ret;
 err:
 	clk_bulk_disable_unprepare(TX_NUM_CLKS_MAX, tx->clks);
@@ -1862,6 +1870,38 @@ static int tx_macro_remove(struct platform_device *pdev)
 	return 0;
 }
 
+static int __maybe_unused tx_macro_runtime_suspend(struct device *dev)
+{
+	struct tx_macro *tx = dev_get_drvdata(dev);
+
+	regcache_cache_only(tx->regmap, true);
+	regcache_mark_dirty(tx->regmap);
+
+	clk_disable_unprepare(tx->clks[2].clk);
+	clk_disable_unprepare(tx->clks[3].clk);
+	clk_disable_unprepare(tx->clks[4].clk);
+
+	return 0;
+}
+
+static int __maybe_unused tx_macro_runtime_resume(struct device *dev)
+{
+	struct tx_macro *tx = dev_get_drvdata(dev);
+
+	clk_prepare_enable(tx->clks[2].clk);
+	clk_prepare_enable(tx->clks[3].clk);
+	clk_prepare_enable(tx->clks[4].clk);
+	regcache_cache_only(tx->regmap, false);
+	regcache_sync(tx->regmap);
+	tx->reset_swr = true;
+
+	return 0;
+}
+
+static const struct dev_pm_ops tx_macro_pm_ops = {
+	SET_RUNTIME_PM_OPS(tx_macro_runtime_suspend, tx_macro_runtime_resume, NULL)
+};
+
 static const struct of_device_id tx_macro_dt_match[] = {
 	{ .compatible = "qcom,sc7280-lpass-tx-macro" },
 	{ .compatible = "qcom,sm8250-lpass-tx-macro" },
@@ -1873,6 +1913,7 @@ static struct platform_driver tx_macro_driver = {
 		.name = "tx_macro",
 		.of_match_table = tx_macro_dt_match,
 		.suppress_bind_attrs = true,
+		.pm = &tx_macro_pm_ops,
 	},
 	.probe = tx_macro_probe,
 	.remove = tx_macro_remove,
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 05/10] ASoC: codecs: wsa881x: add runtime pm support
  2022-02-21 13:10 [PATCH 00/10] ASoC: codec: add pm runtime support for Qualcomm codecs Srinivas Kandagatla
                   ` (3 preceding siblings ...)
  2022-02-21 13:10 ` [PATCH 04/10] ASoC: codecs: tx-macro: " Srinivas Kandagatla
@ 2022-02-21 13:10 ` Srinivas Kandagatla
  2022-02-22 19:53   ` Pierre-Louis Bossart
  2022-02-21 13:10 ` [PATCH 06/10] ASoC: codecs: wcd938x: add simple clk stop support Srinivas Kandagatla
                   ` (4 subsequent siblings)
  9 siblings, 1 reply; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-21 13:10 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam, Srinivas Kandagatla

WSA881x codecs can not cope up with clk stop and requires a full reset after suspend.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 sound/soc/codecs/wsa881x.c | 54 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/sound/soc/codecs/wsa881x.c b/sound/soc/codecs/wsa881x.c
index 0222370ff95d..d851ba14fbdd 100644
--- a/sound/soc/codecs/wsa881x.c
+++ b/sound/soc/codecs/wsa881x.c
@@ -11,6 +11,7 @@
 #include <linux/of_gpio.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
+#include <linux/pm_runtime.h>
 #include <linux/soundwire/sdw.h>
 #include <linux/soundwire/sdw_registers.h>
 #include <linux/soundwire/sdw_type.h>
@@ -198,6 +199,7 @@
 #define WSA881X_OCP_CTL_TIMER_SEC 2
 #define WSA881X_OCP_CTL_TEMP_CELSIUS 25
 #define WSA881X_OCP_CTL_POLL_TIMER_SEC 60
+#define WSA881X_PROBE_TIMEOUT 1000
 
 #define WSA881X_PA_GAIN_TLV(xname, reg, shift, max, invert, tlv_array) \
 {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
@@ -747,6 +749,12 @@ static int wsa881x_put_pa_gain(struct snd_kcontrol *kc,
 	unsigned int mask = (1 << fls(max)) - 1;
 	int val, ret, min_gain, max_gain;
 
+	ret = pm_runtime_get_sync(comp->dev);
+	if (ret < 0 && ret != -EACCES) {
+		pm_runtime_put_noidle(comp->dev);
+		return ret;
+	}
+
 	max_gain = (max - ucontrol->value.integer.value[0]) & mask;
 	/*
 	 * Gain has to set incrementally in 4 steps
@@ -773,6 +781,9 @@ static int wsa881x_put_pa_gain(struct snd_kcontrol *kc,
 		usleep_range(1000, 1010);
 	}
 
+	pm_runtime_mark_last_busy(comp->dev);
+	pm_runtime_put_autosuspend(comp->dev);
+
 	return 1;
 }
 
@@ -1101,6 +1112,7 @@ static int wsa881x_probe(struct sdw_slave *pdev,
 			 const struct sdw_device_id *id)
 {
 	struct wsa881x_priv *wsa881x;
+	struct device *dev = &pdev->dev;
 
 	wsa881x = devm_kzalloc(&pdev->dev, sizeof(*wsa881x), GFP_KERNEL);
 	if (!wsa881x)
@@ -1124,6 +1136,7 @@ static int wsa881x_probe(struct sdw_slave *pdev,
 	pdev->prop.sink_ports = GENMASK(WSA881X_MAX_SWR_PORTS, 0);
 	pdev->prop.sink_dpn_prop = wsa_sink_dpn_prop;
 	pdev->prop.scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY;
+	pdev->prop.simple_clk_stop_capable = true;
 	gpiod_direction_output(wsa881x->sd_n, 1);
 
 	wsa881x->regmap = devm_regmap_init_sdw(pdev, &wsa881x_regmap_config);
@@ -1132,12 +1145,52 @@ static int wsa881x_probe(struct sdw_slave *pdev,
 		return PTR_ERR(wsa881x->regmap);
 	}
 
+	pm_runtime_set_autosuspend_delay(dev, 3000);
+	pm_runtime_use_autosuspend(dev);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_set_active(dev);
+	pm_runtime_enable(dev);
+
 	return devm_snd_soc_register_component(&pdev->dev,
 					       &wsa881x_component_drv,
 					       wsa881x_dais,
 					       ARRAY_SIZE(wsa881x_dais));
 }
 
+static int __maybe_unused wsa881x_runtime_suspend(struct device *dev)
+{
+	struct regmap *regmap = dev_get_regmap(dev, NULL);
+	struct wsa881x_priv *wsa881x = dev_get_drvdata(dev);
+
+	gpiod_direction_output(wsa881x->sd_n, 0);
+
+	regcache_cache_only(regmap, true);
+	regcache_mark_dirty(regmap);
+
+	return 0;
+}
+
+static int __maybe_unused wsa881x_runtime_resume(struct device *dev)
+{
+	struct sdw_slave *slave = dev_to_sdw_dev(dev);
+	struct regmap *regmap = dev_get_regmap(dev, NULL);
+	struct wsa881x_priv *wsa881x = dev_get_drvdata(dev);
+
+	gpiod_direction_output(wsa881x->sd_n, 1);
+
+	wait_for_completion_timeout(&slave->initialization_complete,
+				    msecs_to_jiffies(WSA881X_PROBE_TIMEOUT));
+
+	regcache_cache_only(regmap, false);
+	regcache_sync(regmap);
+
+	return 0;
+}
+
+static const struct dev_pm_ops wsa881x_pm_ops = {
+	SET_RUNTIME_PM_OPS(wsa881x_runtime_suspend, wsa881x_runtime_resume, NULL)
+};
+
 static const struct sdw_device_id wsa881x_slave_id[] = {
 	SDW_SLAVE_ENTRY(0x0217, 0x2010, 0),
 	SDW_SLAVE_ENTRY(0x0217, 0x2110, 0),
@@ -1151,6 +1204,7 @@ static struct sdw_driver wsa881x_codec_driver = {
 	.id_table = wsa881x_slave_id,
 	.driver = {
 		.name	= "wsa881x-codec",
+		.pm = &wsa881x_pm_ops,
 	}
 };
 module_sdw_driver(wsa881x_codec_driver);
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 06/10] ASoC: codecs: wcd938x: add simple clk stop support
  2022-02-21 13:10 [PATCH 00/10] ASoC: codec: add pm runtime support for Qualcomm codecs Srinivas Kandagatla
                   ` (4 preceding siblings ...)
  2022-02-21 13:10 ` [PATCH 05/10] ASoC: codecs: wsa881x: " Srinivas Kandagatla
@ 2022-02-21 13:10 ` Srinivas Kandagatla
  2022-02-21 13:10 ` [PATCH 07/10] ASoC: codecs: wcd-mbhc: add runtime pm support Srinivas Kandagatla
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-21 13:10 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam, Srinivas Kandagatla

mark WCD938x as clock stop capable.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 sound/soc/codecs/wcd938x-sdw.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/sound/soc/codecs/wcd938x-sdw.c b/sound/soc/codecs/wcd938x-sdw.c
index 1fa05ec7459a..1bf3c06a2b62 100644
--- a/sound/soc/codecs/wcd938x-sdw.c
+++ b/sound/soc/codecs/wcd938x-sdw.c
@@ -249,6 +249,7 @@ static int wcd9380_probe(struct sdw_slave *pdev,
 					SDW_SCP_INT1_BUS_CLASH |
 					SDW_SCP_INT1_PARITY;
 	pdev->prop.lane_control_support = true;
+	pdev->prop.simple_clk_stop_capable = true;
 	if (wcd->is_tx) {
 		pdev->prop.source_ports = GENMASK(WCD938X_MAX_SWR_PORTS, 0);
 		pdev->prop.src_dpn_prop = wcd938x_dpn_prop;
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 07/10] ASoC: codecs: wcd-mbhc: add runtime pm support
  2022-02-21 13:10 [PATCH 00/10] ASoC: codec: add pm runtime support for Qualcomm codecs Srinivas Kandagatla
                   ` (5 preceding siblings ...)
  2022-02-21 13:10 ` [PATCH 06/10] ASoC: codecs: wcd938x: add simple clk stop support Srinivas Kandagatla
@ 2022-02-21 13:10 ` Srinivas Kandagatla
  2022-02-21 13:10 ` [PATCH 08/10] ASoC: codecs: wsa-macro: setup soundwire clks correctly Srinivas Kandagatla
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-21 13:10 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam, Srinivas Kandagatla

under low power state a SoundWire Wake IRQ could trigger MBHC interrupts
so make sure that codec is not in suspended state when this happens.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 sound/soc/codecs/wcd-mbhc-v2.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/sound/soc/codecs/wcd-mbhc-v2.c b/sound/soc/codecs/wcd-mbhc-v2.c
index 7488a150a138..c53c2ef33e1a 100644
--- a/sound/soc/codecs/wcd-mbhc-v2.c
+++ b/sound/soc/codecs/wcd-mbhc-v2.c
@@ -5,6 +5,7 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/device.h>
+#include <linux/pm_runtime.h>
 #include <linux/printk.h>
 #include <linux/delay.h>
 #include <linux/kernel.h>
@@ -711,6 +712,16 @@ static irqreturn_t wcd_mbhc_hphr_ocp_irq(int irq, void *data)
 static int wcd_mbhc_initialise(struct wcd_mbhc *mbhc)
 {
 	struct snd_soc_component *component = mbhc->component;
+	int ret;
+
+	ret = pm_runtime_get_sync(component->dev);
+	if (ret < 0 && ret != -EACCES) {
+		dev_err_ratelimited(component->dev,
+				    "pm_runtime_get_sync failed in %s, ret %d\n",
+				    __func__, ret);
+		pm_runtime_put_noidle(component->dev);
+		return ret;
+	}
 
 	mutex_lock(&mbhc->lock);
 
@@ -751,6 +762,9 @@ static int wcd_mbhc_initialise(struct wcd_mbhc *mbhc)
 
 	mutex_unlock(&mbhc->lock);
 
+	pm_runtime_mark_last_busy(component->dev);
+	pm_runtime_put_autosuspend(component->dev);
+
 	return 0;
 }
 
@@ -1078,10 +1092,19 @@ static void wcd_correct_swch_plug(struct work_struct *work)
 	int output_mv, cross_conn, hs_threshold, try = 0, micbias_mv;
 	bool is_spl_hs = false;
 	bool is_pa_on;
+	int ret;
 
 	mbhc = container_of(work, struct wcd_mbhc, correct_plug_swch);
 	component = mbhc->component;
 
+	ret = pm_runtime_get_sync(component->dev);
+	if (ret < 0 && ret != -EACCES) {
+		dev_err_ratelimited(component->dev,
+				    "pm_runtime_get_sync failed in %s, ret %d\n",
+				    __func__, ret);
+		pm_runtime_put_noidle(component->dev);
+		return;
+	}
 	micbias_mv = wcd_mbhc_get_micbias(mbhc);
 	hs_threshold = wcd_mbhc_adc_get_hs_thres(mbhc);
 
@@ -1232,6 +1255,9 @@ static void wcd_correct_swch_plug(struct work_struct *work)
 
 	if (mbhc->mbhc_cb->hph_pull_down_ctrl)
 		mbhc->mbhc_cb->hph_pull_down_ctrl(component, true);
+
+	pm_runtime_mark_last_busy(component->dev);
+	pm_runtime_put_autosuspend(component->dev);
 }
 
 static irqreturn_t wcd_mbhc_adc_hs_rem_irq(int irq, void *data)
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 08/10] ASoC: codecs: wsa-macro: setup soundwire clks correctly
  2022-02-21 13:10 [PATCH 00/10] ASoC: codec: add pm runtime support for Qualcomm codecs Srinivas Kandagatla
                   ` (6 preceding siblings ...)
  2022-02-21 13:10 ` [PATCH 07/10] ASoC: codecs: wcd-mbhc: add runtime pm support Srinivas Kandagatla
@ 2022-02-21 13:10 ` Srinivas Kandagatla
  2022-02-21 13:10 ` [PATCH 09/10] ASoC: codecs: tx-macro: " Srinivas Kandagatla
  2022-02-21 13:10 ` [PATCH 10/10] ASoC: codecs: rx-macro: " Srinivas Kandagatla
  9 siblings, 0 replies; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-21 13:10 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam, Srinivas Kandagatla

For SoundWire Frame sync to be generated correctly we need both MCLK
and MCLKx2 (npl). Without pm runtime enabled these two clocks will remain on,
however after adding pm runtime support its possible that NPl clock could be
turned off even when SoundWire controller is active.

Fix this by enabling mclk and npl clk when SoundWire clks are enabled.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 sound/soc/codecs/lpass-wsa-macro.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/sound/soc/codecs/lpass-wsa-macro.c b/sound/soc/codecs/lpass-wsa-macro.c
index a8d30f3b3fdf..d51d6acac28b 100644
--- a/sound/soc/codecs/lpass-wsa-macro.c
+++ b/sound/soc/codecs/lpass-wsa-macro.c
@@ -2257,6 +2257,7 @@ static int wsa_swrm_clock(struct wsa_macro *wsa, bool enable)
 	struct regmap *regmap = wsa->regmap;
 
 	if (enable) {
+		clk_prepare_enable(wsa->clks[2].clk);
 		wsa_macro_mclk_enable(wsa, true);
 
 		/* reset swr ip */
@@ -2281,6 +2282,7 @@ static int wsa_swrm_clock(struct wsa_macro *wsa, bool enable)
 		regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL,
 				   CDC_WSA_SWR_CLK_EN_MASK, 0);
 		wsa_macro_mclk_enable(wsa, false);
+		clk_disable_unprepare(wsa->clks[2].clk);
 	}
 
 	return 0;
@@ -2351,7 +2353,7 @@ static int wsa_macro_register_mclk_output(struct wsa_macro *wsa)
 	struct clk_init_data init;
 	int ret;
 
-	parent_clk_name = __clk_get_name(wsa->clks[2].clk);
+	parent_clk_name = __clk_get_name(wsa->clks[3].clk);
 
 	init.name = clk_name;
 	init.ops = &swclk_gate_ops;
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 09/10] ASoC: codecs: tx-macro: setup soundwire clks correctly
  2022-02-21 13:10 [PATCH 00/10] ASoC: codec: add pm runtime support for Qualcomm codecs Srinivas Kandagatla
                   ` (7 preceding siblings ...)
  2022-02-21 13:10 ` [PATCH 08/10] ASoC: codecs: wsa-macro: setup soundwire clks correctly Srinivas Kandagatla
@ 2022-02-21 13:10 ` Srinivas Kandagatla
  2022-02-21 15:38   ` Mark Brown
  2022-02-21 13:10 ` [PATCH 10/10] ASoC: codecs: rx-macro: " Srinivas Kandagatla
  9 siblings, 1 reply; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-21 13:10 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam, Srinivas Kandagatla

For SoundWire Frame sync to be generated correctly we need both MCLK
and MCLKx2 (npl). Without pm runtime enabled these two clocks will remain on,
however after adding pm runtime support its possible that NPl clock could be
turned off even when SoundWire controller is active.

Fix this by enabling mclk and npl clk when SoundWire clks are enabled.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 sound/soc/codecs/lpass-tx-macro.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/sound/soc/codecs/lpass-tx-macro.c b/sound/soc/codecs/lpass-tx-macro.c
index 1c0f0d27ed42..f90786100d1a 100644
--- a/sound/soc/codecs/lpass-tx-macro.c
+++ b/sound/soc/codecs/lpass-tx-macro.c
@@ -1687,6 +1687,7 @@ static int swclk_gate_enable(struct clk_hw *hw)
 	struct tx_macro *tx = to_tx_macro(hw);
 	struct regmap *regmap = tx->regmap;
 
+	clk_prepare_enable(tx->clks[2].clk);
 	tx_macro_mclk_enable(tx, true);
 	if (tx->reset_swr)
 		regmap_update_bits(regmap, CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
@@ -1713,6 +1714,7 @@ static void swclk_gate_disable(struct clk_hw *hw)
 			   CDC_TX_SWR_CLK_EN_MASK, 0x0);
 
 	tx_macro_mclk_enable(tx, false);
+	clk_disable_unprepare(tx->clks[2].clk);
 }
 
 static int swclk_gate_is_enabled(struct clk_hw *hw)
@@ -1750,7 +1752,7 @@ static struct clk *tx_macro_register_mclk_output(struct tx_macro *tx)
 	struct clk_init_data init;
 	int ret;
 
-	parent_clk_name = __clk_get_name(tx->clks[2].clk);
+	parent_clk_name = __clk_get_name(tx->clks[3].clk);
 
 	init.name = clk_name;
 	init.ops = &swclk_gate_ops;
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 10/10] ASoC: codecs: rx-macro: setup soundwire clks correctly
  2022-02-21 13:10 [PATCH 00/10] ASoC: codec: add pm runtime support for Qualcomm codecs Srinivas Kandagatla
                   ` (8 preceding siblings ...)
  2022-02-21 13:10 ` [PATCH 09/10] ASoC: codecs: tx-macro: " Srinivas Kandagatla
@ 2022-02-21 13:10 ` Srinivas Kandagatla
  9 siblings, 0 replies; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-21 13:10 UTC (permalink / raw)
  To: broonie
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam, Srinivas Kandagatla

For SoundWire Frame sync to be generated correctly we need both MCLK
and MCLKx2 (npl). Without pm runtime enabled these two clocks will remain on,
however after adding pm runtime support its possible that NPl clock could be
turned off even when SoundWire controller is active.

Fix this by enabling mclk and npl clk when SoundWire clks are enabled.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 sound/soc/codecs/lpass-rx-macro.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/sound/soc/codecs/lpass-rx-macro.c b/sound/soc/codecs/lpass-rx-macro.c
index fb5d4bb8bd8b..9ce83cff3e1b 100644
--- a/sound/soc/codecs/lpass-rx-macro.c
+++ b/sound/soc/codecs/lpass-rx-macro.c
@@ -3428,6 +3428,7 @@ static int swclk_gate_enable(struct clk_hw *hw)
 {
 	struct rx_macro *rx = to_rx_macro(hw);
 
+	clk_prepare_enable(rx->clks[2].clk);
 	rx_macro_mclk_enable(rx, true);
 	if (rx->reset_swr)
 		regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
@@ -3453,6 +3454,7 @@ static void swclk_gate_disable(struct clk_hw *hw)
 			   CDC_RX_SWR_CLK_EN_MASK, 0);
 
 	rx_macro_mclk_enable(rx, false);
+	clk_disable_unprepare(rx->clks[2].clk);
 }
 
 static int swclk_gate_is_enabled(struct clk_hw *hw)
@@ -3490,7 +3492,7 @@ static struct clk *rx_macro_register_mclk_output(struct rx_macro *rx)
 	struct clk_init_data init;
 	int ret;
 
-	parent_clk_name = __clk_get_name(rx->clks[2].clk);
+	parent_clk_name = __clk_get_name(rx->clks[3].clk);
 
 	init.name = clk_name;
 	init.ops = &swclk_gate_ops;
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: [PATCH 01/10] ASoC: codecs: va-macro: add runtime pm support
  2022-02-21 13:10 ` [PATCH 01/10] ASoC: codecs: va-macro: add runtime pm support Srinivas Kandagatla
@ 2022-02-21 15:24   ` Mark Brown
  2022-02-21 15:27     ` Srinivas Kandagatla
  0 siblings, 1 reply; 18+ messages in thread
From: Mark Brown @ 2022-02-21 15:24 UTC (permalink / raw)
  To: Srinivas Kandagatla
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam

[-- Attachment #1: Type: text/plain, Size: 530 bytes --]

On Mon, Feb 21, 2022 at 01:10:28PM +0000, Srinivas Kandagatla wrote:

> +static int __maybe_unused va_macro_runtime_resume(struct device *dev)
> +{
> +	struct va_macro *va = dev_get_drvdata(dev);
> +
> +	clk_prepare_enable(va->clks[2].clk);

This magic number stuff is going to be excessively fragile, and the fact
that this is sometimes managed via the bulk APIs and sometimes not isn't
going to help either.  Either all the clocks should be managed here or
this should be pulled out of the array.

Also consider error checking.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 01/10] ASoC: codecs: va-macro: add runtime pm support
  2022-02-21 15:24   ` Mark Brown
@ 2022-02-21 15:27     ` Srinivas Kandagatla
  0 siblings, 0 replies; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-21 15:27 UTC (permalink / raw)
  To: Mark Brown
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam

Thanks Mark,

On 21/02/2022 15:24, Mark Brown wrote:
> On Mon, Feb 21, 2022 at 01:10:28PM +0000, Srinivas Kandagatla wrote:
> 
>> +static int __maybe_unused va_macro_runtime_resume(struct device *dev)
>> +{
>> +	struct va_macro *va = dev_get_drvdata(dev);
>> +
>> +	clk_prepare_enable(va->clks[2].clk);
> 
> This magic number stuff is going to be excessively fragile, and the fact

I agree, will try to clean this up properly in next spin.

> that this is sometimes managed via the bulk APIs and sometimes not isn't
> going to help either.  Either all the clocks should be managed here or
> this should be pulled out of the array.
> 
> Also consider error checking.
will do,

--srin

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 09/10] ASoC: codecs: tx-macro: setup soundwire clks correctly
  2022-02-21 13:10 ` [PATCH 09/10] ASoC: codecs: tx-macro: " Srinivas Kandagatla
@ 2022-02-21 15:38   ` Mark Brown
  2022-02-21 16:11     ` Srinivas Kandagatla
  0 siblings, 1 reply; 18+ messages in thread
From: Mark Brown @ 2022-02-21 15:38 UTC (permalink / raw)
  To: Srinivas Kandagatla
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam

[-- Attachment #1: Type: text/plain, Size: 574 bytes --]

On Mon, Feb 21, 2022 at 01:10:36PM +0000, Srinivas Kandagatla wrote:
> For SoundWire Frame sync to be generated correctly we need both MCLK
> and MCLKx2 (npl). Without pm runtime enabled these two clocks will remain on,
> however after adding pm runtime support its possible that NPl clock could be
> turned off even when SoundWire controller is active.
> 
> Fix this by enabling mclk and npl clk when SoundWire clks are enabled.

A lot of these commit messages sound like earlier patches in the series
introduced bugs which isn't going to be ideal for bisection.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 09/10] ASoC: codecs: tx-macro: setup soundwire clks correctly
  2022-02-21 15:38   ` Mark Brown
@ 2022-02-21 16:11     ` Srinivas Kandagatla
  2022-02-21 16:48       ` Mark Brown
  0 siblings, 1 reply; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-21 16:11 UTC (permalink / raw)
  To: Mark Brown
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam



On 21/02/2022 15:38, Mark Brown wrote:
> On Mon, Feb 21, 2022 at 01:10:36PM +0000, Srinivas Kandagatla wrote:
>> For SoundWire Frame sync to be generated correctly we need both MCLK
>> and MCLKx2 (npl). Without pm runtime enabled these two clocks will remain on,
>> however after adding pm runtime support its possible that NPl clock could be
>> turned off even when SoundWire controller is active.
>>
>> Fix this by enabling mclk and npl clk when SoundWire clks are enabled.
> 
> A lot of these commit messages sound like earlier patches in the series
> introduced bugs which isn't going to be ideal for bisection.
Yes that is true, I did think about sending this as a fix.

Adding a fix tag would not really make any functional difference as we 
will be hitting the issue only when we enable pm runtime in codec and
SoundWire controller, so I did add this as part of pm runtime patches.

Without runtime pm the clocks are left always on, so it worked so far.


--srini

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 09/10] ASoC: codecs: tx-macro: setup soundwire clks correctly
  2022-02-21 16:11     ` Srinivas Kandagatla
@ 2022-02-21 16:48       ` Mark Brown
  2022-02-22 12:08         ` Srinivas Kandagatla
  0 siblings, 1 reply; 18+ messages in thread
From: Mark Brown @ 2022-02-21 16:48 UTC (permalink / raw)
  To: Srinivas Kandagatla
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam

[-- Attachment #1: Type: text/plain, Size: 749 bytes --]

On Mon, Feb 21, 2022 at 04:11:56PM +0000, Srinivas Kandagatla wrote:
> On 21/02/2022 15:38, Mark Brown wrote:

> > A lot of these commit messages sound like earlier patches in the series
> > introduced bugs which isn't going to be ideal for bisection.

> Yes that is true, I did think about sending this as a fix.

> Adding a fix tag would not really make any functional difference as we will
> be hitting the issue only when we enable pm runtime in codec and
> SoundWire controller, so I did add this as part of pm runtime patches.

> Without runtime pm the clocks are left always on, so it worked so far.

You still need to pull this before you introduce changes that cause
trouble, not after - it needs to be preparation for those other changes.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 09/10] ASoC: codecs: tx-macro: setup soundwire clks correctly
  2022-02-21 16:48       ` Mark Brown
@ 2022-02-22 12:08         ` Srinivas Kandagatla
  0 siblings, 0 replies; 18+ messages in thread
From: Srinivas Kandagatla @ 2022-02-22 12:08 UTC (permalink / raw)
  To: Mark Brown
  Cc: lgirdwood, perex, tiwai, pierre-louis.bossart, alsa-devel,
	linux-kernel, quic_srivasam



On 21/02/2022 16:48, Mark Brown wrote:
> On Mon, Feb 21, 2022 at 04:11:56PM +0000, Srinivas Kandagatla wrote:
>> On 21/02/2022 15:38, Mark Brown wrote:
> 
>>> A lot of these commit messages sound like earlier patches in the series
>>> introduced bugs which isn't going to be ideal for bisection.
> 
>> Yes that is true, I did think about sending this as a fix.
> 
>> Adding a fix tag would not really make any functional difference as we will
>> be hitting the issue only when we enable pm runtime in codec and
>> SoundWire controller, so I did add this as part of pm runtime patches.
> 
>> Without runtime pm the clocks are left always on, so it worked so far.
> 
> You still need to pull this before you introduce changes that cause
> trouble, not after - it needs to be preparation for those other changes.
I agree, Will reorder this in next spin.

--srini

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 05/10] ASoC: codecs: wsa881x: add runtime pm support
  2022-02-21 13:10 ` [PATCH 05/10] ASoC: codecs: wsa881x: " Srinivas Kandagatla
@ 2022-02-22 19:53   ` Pierre-Louis Bossart
  0 siblings, 0 replies; 18+ messages in thread
From: Pierre-Louis Bossart @ 2022-02-22 19:53 UTC (permalink / raw)
  To: Srinivas Kandagatla, broonie
  Cc: alsa-devel, lgirdwood, linux-kernel, tiwai, quic_srivasam



On 2/21/22 07:10, Srinivas Kandagatla wrote:
> WSA881x codecs can not cope up with clk stop and requires a full reset after suspend.

isn't clock stop mode0 a peripheral requirement in SoundWire 1.x? I
don't see any permission to skip this mode, the only thing I see in the
spec is the permission to implement an always-ready capability (SCSP_SM)

The current assumption is that ALL peripherals support that mode, but
that Managers may or may not support clock stop.

It wouldn't be a big deal to add a quirk, but IMHO this needs to be
captured at the bus/manager level since the decision to enter this mode
is made at that level.

> 
> Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> ---
>  sound/soc/codecs/wsa881x.c | 54 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 54 insertions(+)
> 
> diff --git a/sound/soc/codecs/wsa881x.c b/sound/soc/codecs/wsa881x.c
> index 0222370ff95d..d851ba14fbdd 100644
> --- a/sound/soc/codecs/wsa881x.c
> +++ b/sound/soc/codecs/wsa881x.c
> @@ -11,6 +11,7 @@
>  #include <linux/of_gpio.h>
>  #include <linux/regmap.h>
>  #include <linux/slab.h>
> +#include <linux/pm_runtime.h>
>  #include <linux/soundwire/sdw.h>
>  #include <linux/soundwire/sdw_registers.h>
>  #include <linux/soundwire/sdw_type.h>
> @@ -198,6 +199,7 @@
>  #define WSA881X_OCP_CTL_TIMER_SEC 2
>  #define WSA881X_OCP_CTL_TEMP_CELSIUS 25
>  #define WSA881X_OCP_CTL_POLL_TIMER_SEC 60
> +#define WSA881X_PROBE_TIMEOUT 1000
>  
>  #define WSA881X_PA_GAIN_TLV(xname, reg, shift, max, invert, tlv_array) \
>  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
> @@ -747,6 +749,12 @@ static int wsa881x_put_pa_gain(struct snd_kcontrol *kc,
>  	unsigned int mask = (1 << fls(max)) - 1;
>  	int val, ret, min_gain, max_gain;
>  
> +	ret = pm_runtime_get_sync(comp->dev);
> +	if (ret < 0 && ret != -EACCES) {
> +		pm_runtime_put_noidle(comp->dev);
> +		return ret;
> +	}
> +
>  	max_gain = (max - ucontrol->value.integer.value[0]) & mask;
>  	/*
>  	 * Gain has to set incrementally in 4 steps
> @@ -773,6 +781,9 @@ static int wsa881x_put_pa_gain(struct snd_kcontrol *kc,
>  		usleep_range(1000, 1010);
>  	}
>  
> +	pm_runtime_mark_last_busy(comp->dev);
> +	pm_runtime_put_autosuspend(comp->dev);
> +
>  	return 1;
>  }
>  
> @@ -1101,6 +1112,7 @@ static int wsa881x_probe(struct sdw_slave *pdev,
>  			 const struct sdw_device_id *id)
>  {
>  	struct wsa881x_priv *wsa881x;
> +	struct device *dev = &pdev->dev;
>  
>  	wsa881x = devm_kzalloc(&pdev->dev, sizeof(*wsa881x), GFP_KERNEL);
>  	if (!wsa881x)
> @@ -1124,6 +1136,7 @@ static int wsa881x_probe(struct sdw_slave *pdev,
>  	pdev->prop.sink_ports = GENMASK(WSA881X_MAX_SWR_PORTS, 0);
>  	pdev->prop.sink_dpn_prop = wsa_sink_dpn_prop;
>  	pdev->prop.scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY;
> +	pdev->prop.simple_clk_stop_capable = true;
>  	gpiod_direction_output(wsa881x->sd_n, 1);
>  
>  	wsa881x->regmap = devm_regmap_init_sdw(pdev, &wsa881x_regmap_config);
> @@ -1132,12 +1145,52 @@ static int wsa881x_probe(struct sdw_slave *pdev,
>  		return PTR_ERR(wsa881x->regmap);
>  	}
>  
> +	pm_runtime_set_autosuspend_delay(dev, 3000);
> +	pm_runtime_use_autosuspend(dev);
> +	pm_runtime_mark_last_busy(dev);
> +	pm_runtime_set_active(dev);
> +	pm_runtime_enable(dev);
> +
>  	return devm_snd_soc_register_component(&pdev->dev,
>  					       &wsa881x_component_drv,
>  					       wsa881x_dais,
>  					       ARRAY_SIZE(wsa881x_dais));
>  }
>  
> +static int __maybe_unused wsa881x_runtime_suspend(struct device *dev)
> +{
> +	struct regmap *regmap = dev_get_regmap(dev, NULL);
> +	struct wsa881x_priv *wsa881x = dev_get_drvdata(dev);
> +
> +	gpiod_direction_output(wsa881x->sd_n, 0);
> +
> +	regcache_cache_only(regmap, true);
> +	regcache_mark_dirty(regmap);
> +
> +	return 0;
> +}
> +
> +static int __maybe_unused wsa881x_runtime_resume(struct device *dev)
> +{
> +	struct sdw_slave *slave = dev_to_sdw_dev(dev);
> +	struct regmap *regmap = dev_get_regmap(dev, NULL);
> +	struct wsa881x_priv *wsa881x = dev_get_drvdata(dev);
> +
> +	gpiod_direction_output(wsa881x->sd_n, 1);
> +
> +	wait_for_completion_timeout(&slave->initialization_complete,
> +				    msecs_to_jiffies(WSA881X_PROBE_TIMEOUT));
> +
> +	regcache_cache_only(regmap, false);
> +	regcache_sync(regmap);
> +
> +	return 0;
> +}
> +
> +static const struct dev_pm_ops wsa881x_pm_ops = {
> +	SET_RUNTIME_PM_OPS(wsa881x_runtime_suspend, wsa881x_runtime_resume, NULL)
> +};
> +
>  static const struct sdw_device_id wsa881x_slave_id[] = {
>  	SDW_SLAVE_ENTRY(0x0217, 0x2010, 0),
>  	SDW_SLAVE_ENTRY(0x0217, 0x2110, 0),
> @@ -1151,6 +1204,7 @@ static struct sdw_driver wsa881x_codec_driver = {
>  	.id_table = wsa881x_slave_id,
>  	.driver = {
>  		.name	= "wsa881x-codec",
> +		.pm = &wsa881x_pm_ops,
>  	}
>  };
>  module_sdw_driver(wsa881x_codec_driver);

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2022-02-22 19:55 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-21 13:10 [PATCH 00/10] ASoC: codec: add pm runtime support for Qualcomm codecs Srinivas Kandagatla
2022-02-21 13:10 ` [PATCH 01/10] ASoC: codecs: va-macro: add runtime pm support Srinivas Kandagatla
2022-02-21 15:24   ` Mark Brown
2022-02-21 15:27     ` Srinivas Kandagatla
2022-02-21 13:10 ` [PATCH 02/10] ASoC: codecs: wsa-macro: " Srinivas Kandagatla
2022-02-21 13:10 ` [PATCH 03/10] ASoC: codecs: rx-macro: " Srinivas Kandagatla
2022-02-21 13:10 ` [PATCH 04/10] ASoC: codecs: tx-macro: " Srinivas Kandagatla
2022-02-21 13:10 ` [PATCH 05/10] ASoC: codecs: wsa881x: " Srinivas Kandagatla
2022-02-22 19:53   ` Pierre-Louis Bossart
2022-02-21 13:10 ` [PATCH 06/10] ASoC: codecs: wcd938x: add simple clk stop support Srinivas Kandagatla
2022-02-21 13:10 ` [PATCH 07/10] ASoC: codecs: wcd-mbhc: add runtime pm support Srinivas Kandagatla
2022-02-21 13:10 ` [PATCH 08/10] ASoC: codecs: wsa-macro: setup soundwire clks correctly Srinivas Kandagatla
2022-02-21 13:10 ` [PATCH 09/10] ASoC: codecs: tx-macro: " Srinivas Kandagatla
2022-02-21 15:38   ` Mark Brown
2022-02-21 16:11     ` Srinivas Kandagatla
2022-02-21 16:48       ` Mark Brown
2022-02-22 12:08         ` Srinivas Kandagatla
2022-02-21 13:10 ` [PATCH 10/10] ASoC: codecs: rx-macro: " Srinivas Kandagatla

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).