* [PATCH v3 1/3] clk: samsung: exynos-audss: Propagate -EPROBE_DEFER from input clocks
[not found] ` <20261030075325.517182-1-m.szyprowski@samsung.com>
@ 2026-10-30 7:53 ` Marek Szyprowski
2026-11-02 19:14 ` Sylwester Nawrocki
2026-10-30 7:53 ` [PATCH v3 2/3] clk: samsung: exynos5-subcmu: Use pm_runtime_get_sync() during probe Marek Szyprowski
2026-10-30 7:53 ` [PATCH v3 3/3] clk: samsung: exynos5-subcmu: Defer probe until power domains are available Marek Szyprowski
2 siblings, 1 reply; 5+ messages in thread
From: Marek Szyprowski @ 2026-10-30 7:53 UTC (permalink / raw)
To: linux-samsung-soc, linux-clk
Cc: Marek Szyprowski, Krzysztof Kozlowski, Sylwester Nawrocki,
Chanwoo Choi, Peter Griffin, Alim Akhtar, Stephen Boyd,
Brian Masney, Jerome Brunet, Henrik Grimler, stable
exynos_audss_clk_probe() fetches the optional pll_ref/pll_in/cdclk/
sclk_audio/sclk_pcm_in input clocks with devm_clk_get() and only
checks IS_ERR() before falling back to a default parent clock name.
This means a transient -EPROBE_DEFER (e.g. because the clock provider
behind "pll_in" has not registered its real clock yet) is silently
treated the same as the clock simply not being present, so the
mout_audss/mout_i2s muxes get permanently registered with the wrong
parent name.
Fix this by checking for -EPROBE_DEFER on each of these clocks right
after fetching them, before anything is registered, and bailing out
of probe so it gets retried once the real clocks are available.
Fixes: 547f33509ccc ("clk: exynos-audss: allow input clocks to be specified in device tree")
Cc: stable@vger.kernel.org
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
drivers/clk/samsung/clk-exynos-audss.c | 33 +++++++++++++++++++-------
1 file changed, 24 insertions(+), 9 deletions(-)
diff --git a/drivers/clk/samsung/clk-exynos-audss.c b/drivers/clk/samsung/clk-exynos-audss.c
index e11ac67819ef..950c67491dad 100644
--- a/drivers/clk/samsung/clk-exynos-audss.c
+++ b/drivers/clk/samsung/clk-exynos-audss.c
@@ -152,7 +152,25 @@ static int exynos_audss_clk_probe(struct platform_device *pdev)
clk_table = clk_data->hws;
pll_ref = devm_clk_get(dev, "pll_ref");
+ if (PTR_ERR(pll_ref) == -EPROBE_DEFER)
+ return -EPROBE_DEFER;
+
pll_in = devm_clk_get(dev, "pll_in");
+ if (PTR_ERR(pll_in) == -EPROBE_DEFER)
+ return -EPROBE_DEFER;
+
+ cdclk = devm_clk_get(dev, "cdclk");
+ if (PTR_ERR(cdclk) == -EPROBE_DEFER)
+ return -EPROBE_DEFER;
+
+ sclk_audio = devm_clk_get(dev, "sclk_audio");
+ if (PTR_ERR(sclk_audio) == -EPROBE_DEFER)
+ return -EPROBE_DEFER;
+
+ sclk_pcm_in = devm_clk_get(dev, "sclk_pcm_in");
+ if (PTR_ERR(sclk_pcm_in) == -EPROBE_DEFER)
+ return -EPROBE_DEFER;
+
if (!IS_ERR(pll_ref))
mout_audss_p[0] = __clk_get_name(pll_ref);
if (!IS_ERR(pll_in)) {
@@ -169,6 +187,12 @@ static int exynos_audss_clk_probe(struct platform_device *pdev)
}
}
}
+ if (!IS_ERR(cdclk))
+ mout_i2s_p[1] = __clk_get_name(cdclk);
+ if (!IS_ERR(sclk_audio))
+ mout_i2s_p[2] = __clk_get_name(sclk_audio);
+ if (!IS_ERR(sclk_pcm_in))
+ sclk_pcm_p = __clk_get_name(sclk_pcm_in);
/*
* Enable runtime PM here to allow the clock core using runtime PM
@@ -185,12 +209,6 @@ static int exynos_audss_clk_probe(struct platform_device *pdev)
CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
reg_base + ASS_CLK_SRC, 0, 1, 0, &lock);
- cdclk = devm_clk_get(dev, "cdclk");
- sclk_audio = devm_clk_get(dev, "sclk_audio");
- if (!IS_ERR(cdclk))
- mout_i2s_p[1] = __clk_get_name(cdclk);
- if (!IS_ERR(sclk_audio))
- mout_i2s_p[2] = __clk_get_name(sclk_audio);
clk_table[EXYNOS_MOUT_I2S] = clk_hw_register_mux(dev, "mout_i2s",
mout_i2s_p, ARRAY_SIZE(mout_i2s_p),
CLK_SET_RATE_NO_REPARENT,
@@ -224,9 +242,6 @@ static int exynos_audss_clk_probe(struct platform_device *pdev)
"sclk_pcm", CLK_SET_RATE_PARENT,
reg_base + ASS_CLK_GATE, 4, 0, &lock);
- sclk_pcm_in = devm_clk_get(dev, "sclk_pcm_in");
- if (!IS_ERR(sclk_pcm_in))
- sclk_pcm_p = __clk_get_name(sclk_pcm_in);
clk_table[EXYNOS_SCLK_PCM] = clk_hw_register_gate(dev, "sclk_pcm",
sclk_pcm_p, CLK_SET_RATE_PARENT,
reg_base + ASS_CLK_GATE, 5, 0, &lock);
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* RE: [PATCH v3 1/3] clk: samsung: exynos-audss: Propagate -EPROBE_DEFER from input clocks
2026-10-30 7:53 ` [PATCH v3 1/3] clk: samsung: exynos-audss: Propagate -EPROBE_DEFER from input clocks Marek Szyprowski
@ 2026-11-02 19:14 ` Sylwester Nawrocki
0 siblings, 0 replies; 5+ messages in thread
From: Sylwester Nawrocki @ 2026-11-02 19:14 UTC (permalink / raw)
To: 'Marek Szyprowski', linux-samsung-soc, linux-clk
Cc: 'Krzysztof Kozlowski', 'Chanwoo Choi',
'Peter Griffin', 'Alim Akhtar',
'Stephen Boyd', 'Brian Masney',
'Jerome Brunet', 'Henrik Grimler', stable
> -----Original Message-----
> From: Marek Szyprowski <m.szyprowski@samsung.com>
> Sent: piątek, 30 października 2026 08:53
> To: linux-samsung-soc@vger.kernel.org; linux-clk@vger.kernel.org
> Cc: Marek Szyprowski <m.szyprowski@samsung.com>; Krzysztof Kozlowski
> <krzk@kernel.org>; Sylwester Nawrocki <s.nawrocki@samsung.com>; Chanwoo
> Choi <cw00.choi@samsung.com>; Peter Griffin <peter.griffin@linaro.org>; Alim
> Akhtar <alim.akhtar@samsung.com>; Stephen Boyd <sboyd@kernel.org>; Brian
> Masney <bmasney+clk@redhat.com>; Jerome Brunet
> <jbrunet+clk@baylibre.com>; Henrik Grimler <henrik@grimler.se>;
> stable@vger.kernel.org
> Subject: [PATCH v3 1/3] clk: samsung: exynos-audss: Propagate -EPROBE_DEFER
> from input clocks
>
> exynos_audss_clk_probe() fetches the optional pll_ref/pll_in/cdclk/
> sclk_audio/sclk_pcm_in input clocks with devm_clk_get() and only
> checks IS_ERR() before falling back to a default parent clock name.
> This means a transient -EPROBE_DEFER (e.g. because the clock provider
> behind "pll_in" has not registered its real clock yet) is silently
> treated the same as the clock simply not being present, so the
> mout_audss/mout_i2s muxes get permanently registered with the wrong
> parent name.
>
> Fix this by checking for -EPROBE_DEFER on each of these clocks right
> after fetching them, before anything is registered, and bailing out
> of probe so it gets retried once the real clocks are available.
>
> Fixes: 547f33509ccc ("clk: exynos-audss: allow input clocks to be specified in
> device tree")
> Cc: stable@vger.kernel.org
> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 2/3] clk: samsung: exynos5-subcmu: Use pm_runtime_get_sync() during probe
[not found] ` <20261030075325.517182-1-m.szyprowski@samsung.com>
2026-10-30 7:53 ` [PATCH v3 1/3] clk: samsung: exynos-audss: Propagate -EPROBE_DEFER from input clocks Marek Szyprowski
@ 2026-10-30 7:53 ` Marek Szyprowski
2026-11-02 19:14 ` Sylwester Nawrocki
2026-10-30 7:53 ` [PATCH v3 3/3] clk: samsung: exynos5-subcmu: Defer probe until power domains are available Marek Szyprowski
2 siblings, 1 reply; 5+ messages in thread
From: Marek Szyprowski @ 2026-10-30 7:53 UTC (permalink / raw)
To: linux-samsung-soc, linux-clk
Cc: Marek Szyprowski, Krzysztof Kozlowski, Sylwester Nawrocki,
Chanwoo Choi, Peter Griffin, Alim Akhtar, Stephen Boyd,
Brian Masney, Jerome Brunet, Henrik Grimler, stable
The clocks are registered right after pm_runtime_get(), which only
schedules a resume asynchronously and doesn't guarantee the device (and
its power domain) is active yet. Use pm_runtime_get_sync() to ensure the
power domain is really on while the clock registers are accessed during
the registration.
Fixes: b06a532bf1fa ("clk: samsung: Add Exynos5 sub-CMU clock driver")
Cc: stable@vger.kernel.org
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
drivers/clk/samsung/clk-exynos5-subcmu.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/clk/samsung/clk-exynos5-subcmu.c b/drivers/clk/samsung/clk-exynos5-subcmu.c
index 373129847301..1d7eb98b72cf 100644
--- a/drivers/clk/samsung/clk-exynos5-subcmu.c
+++ b/drivers/clk/samsung/clk-exynos5-subcmu.c
@@ -103,7 +103,7 @@ static int __init exynos5_subcmu_probe(struct platform_device *pdev)
pm_runtime_set_suspended(dev);
pm_runtime_enable(dev);
- pm_runtime_get(dev);
+ pm_runtime_get_sync(dev);
ctx->dev = dev;
samsung_clk_register_div(ctx, info->div_clks, info->nr_div_clks);
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* RE: [PATCH v3 2/3] clk: samsung: exynos5-subcmu: Use pm_runtime_get_sync() during probe
2026-10-30 7:53 ` [PATCH v3 2/3] clk: samsung: exynos5-subcmu: Use pm_runtime_get_sync() during probe Marek Szyprowski
@ 2026-11-02 19:14 ` Sylwester Nawrocki
0 siblings, 0 replies; 5+ messages in thread
From: Sylwester Nawrocki @ 2026-11-02 19:14 UTC (permalink / raw)
To: 'Marek Szyprowski', linux-samsung-soc, linux-clk
Cc: 'Krzysztof Kozlowski', 'Chanwoo Choi',
'Peter Griffin', 'Alim Akhtar',
'Stephen Boyd', 'Brian Masney',
'Jerome Brunet', 'Henrik Grimler', stable
> -----Original Message-----
> From: Marek Szyprowski <m.szyprowski@samsung.com>
> Sent: piątek, 30 października 2026 08:53
> To: linux-samsung-soc@vger.kernel.org; linux-clk@vger.kernel.org
> Cc: Marek Szyprowski <m.szyprowski@samsung.com>; Krzysztof Kozlowski
> <krzk@kernel.org>; Sylwester Nawrocki <s.nawrocki@samsung.com>; Chanwoo
> Choi <cw00.choi@samsung.com>; Peter Griffin <peter.griffin@linaro.org>; Alim
> Akhtar <alim.akhtar@samsung.com>; Stephen Boyd <sboyd@kernel.org>; Brian
> Masney <bmasney+clk@redhat.com>; Jerome Brunet
> <jbrunet+clk@baylibre.com>; Henrik Grimler <henrik@grimler.se>;
> stable@vger.kernel.org
> Subject: [PATCH v3 2/3] clk: samsung: exynos5-subcmu: Use
> pm_runtime_get_sync() during probe
>
> The clocks are registered right after pm_runtime_get(), which only
> schedules a resume asynchronously and doesn't guarantee the device (and
> its power domain) is active yet. Use pm_runtime_get_sync() to ensure the
> power domain is really on while the clock registers are accessed during
> the registration.
>
> Fixes: b06a532bf1fa ("clk: samsung: Add Exynos5 sub-CMU clock driver")
> Cc: stable@vger.kernel.org
> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 3/3] clk: samsung: exynos5-subcmu: Defer probe until power domains are available
[not found] ` <20261030075325.517182-1-m.szyprowski@samsung.com>
2026-10-30 7:53 ` [PATCH v3 1/3] clk: samsung: exynos-audss: Propagate -EPROBE_DEFER from input clocks Marek Szyprowski
2026-10-30 7:53 ` [PATCH v3 2/3] clk: samsung: exynos5-subcmu: Use pm_runtime_get_sync() during probe Marek Szyprowski
@ 2026-10-30 7:53 ` Marek Szyprowski
2 siblings, 0 replies; 5+ messages in thread
From: Marek Szyprowski @ 2026-10-30 7:53 UTC (permalink / raw)
To: linux-samsung-soc, linux-clk
Cc: Marek Szyprowski, Krzysztof Kozlowski, Sylwester Nawrocki,
Chanwoo Choi, Peter Griffin, Alim Akhtar, Stephen Boyd,
Brian Masney, Jerome Brunet, Henrik Grimler, stable
Sub-CMU devices are added to their power domains with
of_genpd_add_device() during exynos5_clk_probe(). Its return value is
ignored, so if the power domain provider is not registered yet, the
sub-CMU device is silently left outside of its power domain.
Since commit c09a3e6c97f0 ("soc: samsung: pm_domains: Convert to regular
platform driver"), power domain providers are registered only when their
platform devices are probed, which happens after exynos5_clk_probe() has
already been called.
When a sub-CMU device is outside of its power domain, its runtime PM
callbacks race with the power domain state changes, which might result in
losing the proper hardware state. In practice, some clock muxes are left
switched to the oscillator instead of the respective PLLs.
Fix this by deferring exynos5_clk_probe() until the platform devices for
all available power domains are instantiated. Since the probe function
calls __init code, return -ENODEV if a deferred probe runs after the init
sections have been freed.
Fixes: c09a3e6c97f0 ("soc: samsung: pm_domains: Convert to regular platform driver")
Cc: stable@vger.kernel.org
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
drivers/clk/samsung/clk-exynos5-subcmu.c | 25 +++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
diff --git a/drivers/clk/samsung/clk-exynos5-subcmu.c b/drivers/clk/samsung/clk-exynos5-subcmu.c
index 1d7eb98b72cf..faa59c65a033 100644
--- a/drivers/clk/samsung/clk-exynos5-subcmu.c
+++ b/drivers/clk/samsung/clk-exynos5-subcmu.c
@@ -6,6 +6,7 @@
#include <linux/io.h>
#include <linux/of.h>
+#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/pm_domain.h>
#include <linux/pm_runtime.h>
@@ -153,13 +154,31 @@ static int __init exynos5_clk_register_subcmu(struct device *parent,
return ret;
}
-static int __init exynos5_clk_probe(struct platform_device *pdev)
+static int __ref exynos5_clk_probe(struct platform_device *pdev)
{
+ static const char pd_node_name[] = "samsung,exynos4210-pd";
struct device_node *np;
const char *name;
int i;
- for_each_compatible_node(np, NULL, "samsung,exynos4210-pd") {
+ /* Deferred probe might run after the init sections have been freed */
+ if (system_state >= SYSTEM_RUNNING)
+ return -ENODEV;
+
+ /* Defer until all needed power domains are registered */
+ for_each_compatible_node(np, NULL, pd_node_name) {
+ if (of_device_is_available(np)) {
+ struct platform_device *pd = of_find_device_by_node(np);
+
+ if (!pd) {
+ of_node_put(np);
+ return -EPROBE_DEFER;
+ }
+ put_device(&pd->dev);
+ }
+ }
+
+ for_each_compatible_node(np, NULL, pd_node_name) {
if (of_property_read_string(np, "label", &name) < 0)
continue;
for (i = 0; i < nr_cmus; i++)
@@ -177,7 +196,7 @@ static const struct of_device_id exynos5_clk_of_match[] = {
{ },
};
-static struct platform_driver exynos5_clk_driver __refdata = {
+static struct platform_driver exynos5_clk_driver = {
.driver = {
.name = "exynos5-clock",
.of_match_table = exynos5_clk_of_match,
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread