* [PATCH v3 0/3] counter: rz-mtu3-cnt: check clock and runtime PM errors
@ 2026-09-03 9:07 Li Youhong
2026-09-03 9:07 ` [PATCH v3 1/3] counter: rz-mtu3-cnt: check clk_prepare_enable() and pm_runtime_set_active() Li Youhong
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Li Youhong @ 2026-09-03 9:07 UTC (permalink / raw)
To: biju.das.jz, wbg; +Cc: linux-iio, linux-renesas-soc, Li Youhong
From: Li Youhong <liyouhong@kylinos.cn>
v1 checked only clk_prepare_enable() in probe/resume. Reviewers asked
to also handle pm_runtime_set_active() and all runtime PM get call
sites. Split into three patches, including a follow-up for a
pre-existing runtime PM usage leak on counter init failure.
Changes v2->v3:
Link to v2: https://lore.kernel.org/all/20260831054407.1695146-1-dayou5941@163.com/
- Use pm_runtime_resume_and_get() instead of pm_runtime_get_sync()
plus pm_runtime_put_noidle() on failure
Changes v1->v2
Link to v1: https://lore.kernel.org/all/20260828071123.179670-1-dayou5941@163.com/
- Also check pm_runtime_set_active() in probe
- Check pm_runtime_get_sync() everywhere
- New patch: put runtime PM ref if counter init fails after get
Li Youhong (3):
counter: rz-mtu3-cnt: check clk_prepare_enable() and
pm_runtime_set_active()
counter: rz-mtu3-cnt: check pm_runtime_resume_and_get() return
values
counter: rz-mtu3-cnt: put runtime PM ref if counter init fails
drivers/counter/rz-mtu3-cnt.c | 112 +++++++++++++++++++++++++++-------
1 file changed, 83 insertions(+), 29 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v3 1/3] counter: rz-mtu3-cnt: check clk_prepare_enable() and pm_runtime_set_active()
2026-09-03 9:07 [PATCH v3 0/3] counter: rz-mtu3-cnt: check clock and runtime PM errors Li Youhong
@ 2026-09-03 9:07 ` Li Youhong
2026-09-03 9:07 ` [PATCH v3 2/3] counter: rz-mtu3-cnt: check pm_runtime_resume_and_get() return values Li Youhong
2026-09-03 9:07 ` [PATCH v3 3/3] counter: rz-mtu3-cnt: put runtime PM ref if counter init fails Li Youhong
2 siblings, 0 replies; 4+ messages in thread
From: Li Youhong @ 2026-09-03 9:07 UTC (permalink / raw)
To: biju.das.jz, wbg; +Cc: linux-iio, linux-renesas-soc, Li Youhong
From: Li Youhong <liyouhong@kylinos.cn>
The driver ignored clk_prepare_enable() failures during probe and
runtime resume, and ignored pm_runtime_set_active() failures during
probe. Propagate the errors so probe does not continue with the clock
disabled or an inconsistent runtime PM state, and resume does not
report success falsely.
Fixes: 0be8907359df ("counter: Add Renesas RZ/G2L MTU3a counter driver")
Suggested-by: Biju Das <biju.das.jz@bp.renesas.com>
Signed-off-by: Li Youhong <liyouhong@kylinos.cn>
---
--- a/drivers/counter/rz-mtu3-cnt.c
+++ b/drivers/counter/rz-mtu3-cnt.c
@@ -817,9 +817,7 @@
{
struct clk *const clk = dev_get_drvdata(dev);
- clk_prepare_enable(clk);
-
- return 0;
+ return clk_prepare_enable(clk);
}
static DEFINE_RUNTIME_DEV_PM_OPS(rz_mtu3_cnt_pm_ops,
@@ -861,8 +859,14 @@
mutex_init(&priv->lock);
platform_set_drvdata(pdev, priv->clk);
- clk_prepare_enable(priv->clk);
- pm_runtime_set_active(&pdev->dev);
+ ret = clk_prepare_enable(priv->clk);
+ if (ret)
+ return ret;
+
+ ret = pm_runtime_set_active(&pdev->dev);
+ if (ret)
+ goto disable_clock;
+
pm_runtime_enable(&pdev->dev);
ret = devm_add_action_or_reset(&pdev->dev, rz_mtu3_cnt_pm_disable, dev);
if (ret < 0)
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v3 2/3] counter: rz-mtu3-cnt: check pm_runtime_resume_and_get() return values
2026-09-03 9:07 [PATCH v3 0/3] counter: rz-mtu3-cnt: check clock and runtime PM errors Li Youhong
2026-09-03 9:07 ` [PATCH v3 1/3] counter: rz-mtu3-cnt: check clk_prepare_enable() and pm_runtime_set_active() Li Youhong
@ 2026-09-03 9:07 ` Li Youhong
2026-09-03 9:07 ` [PATCH v3 3/3] counter: rz-mtu3-cnt: put runtime PM ref if counter init fails Li Youhong
2 siblings, 0 replies; 4+ messages in thread
From: Li Youhong @ 2026-09-03 9:07 UTC (permalink / raw)
To: biju.das.jz, wbg; +Cc: linux-iio, linux-renesas-soc, Li Youhong
From: Li Youhong <liyouhong@kylinos.cn>
The driver ignored runtime PM get failures and continued with register
accesses after a failed resume. Switch all call sites to
pm_runtime_resume_and_get() and propagate errors to the caller. That
API already drops the usage count on failure, so the explicit
pm_runtime_put_noidle() pairing used with pm_runtime_get_sync() is
unnecessary.
Fixes: 0be8907359df ("counter: Add Renesas RZ/G2L MTU3a counter driver")
Suggested-by: Biju Das <biju.das.jz@bp.renesas.com>
Signed-off-by: Li Youhong <liyouhong@kylinos.cn>
---
--- a/drivers/counter/rz-mtu3-cnt.c
+++ b/drivers/counter/rz-mtu3-cnt.c
@@ -102,22 +102,25 @@
return &priv->ch[ch_id];
}
-static bool rz_mtu3_is_counter_invalid(struct counter_device *counter, int id)
+static int rz_mtu3_validate_counter(struct counter_device *counter, int id)
{
struct rz_mtu3_cnt *const priv = counter_priv(counter);
unsigned long tmdr;
+ int ret;
- pm_runtime_get_sync(counter->parent);
+ ret = pm_runtime_resume_and_get(counter->parent);
+ if (ret < 0)
+ return ret;
tmdr = rz_mtu3_shared_reg_read(priv->ch, RZ_MTU3_TMDR3);
pm_runtime_put(counter->parent);
if (id == RZ_MTU3_32_BIT_CH && test_bit(RZ_MTU3_TMDR3_LWA, &tmdr))
- return false;
+ return 0;
if (id != RZ_MTU3_32_BIT_CH && !test_bit(RZ_MTU3_TMDR3_LWA, &tmdr))
- return false;
+ return 0;
- return true;
+ return -EBUSY;
}
static int rz_mtu3_lock_if_counter_is_valid(struct counter_device *counter,
@@ -125,6 +128,8 @@
struct rz_mtu3_cnt *const priv,
int id)
{
+ int ret;
+
mutex_lock(&priv->lock);
if (ch->is_busy && !priv->count_is_enabled[id]) {
@@ -132,9 +137,10 @@
return -EINVAL;
}
- if (rz_mtu3_is_counter_invalid(counter, id)) {
+ ret = rz_mtu3_validate_counter(counter, id);
+ if (ret) {
mutex_unlock(&priv->lock);
- return -EBUSY;
+ return ret;
}
return 0;
@@ -165,7 +171,11 @@
if (ret)
return ret;
- pm_runtime_get_sync(counter->parent);
+ ret = pm_runtime_resume_and_get(counter->parent);
+ if (ret < 0) {
+ mutex_unlock(&priv->lock);
+ return ret;
+ }
if (count->id == RZ_MTU3_32_BIT_CH)
*val = rz_mtu3_32bit_ch_read(ch, RZ_MTU3_TCNTLW);
else
@@ -187,7 +197,11 @@
if (ret)
return ret;
- pm_runtime_get_sync(counter->parent);
+ ret = pm_runtime_resume_and_get(counter->parent);
+ if (ret < 0) {
+ mutex_unlock(&priv->lock);
+ return ret;
+ }
if (count->id == RZ_MTU3_32_BIT_CH)
rz_mtu3_32bit_ch_write(ch, RZ_MTU3_TCNTLW, val);
else
@@ -203,8 +217,11 @@
enum counter_function *function)
{
u8 timer_mode;
+ int ret;
- pm_runtime_get_sync(counter->parent);
+ ret = pm_runtime_resume_and_get(counter->parent);
+ if (ret < 0)
+ return ret;
timer_mode = rz_mtu3_8bit_ch_read(ch, RZ_MTU3_TMDR1);
pm_runtime_put(counter->parent);
@@ -279,7 +296,11 @@
return -EINVAL;
}
- pm_runtime_get_sync(counter->parent);
+ ret = pm_runtime_resume_and_get(counter->parent);
+ if (ret < 0) {
+ mutex_unlock(&priv->lock);
+ return ret;
+ }
rz_mtu3_8bit_ch_write(ch, RZ_MTU3_TMDR1, timer_mode);
pm_runtime_put(counter->parent);
mutex_unlock(&priv->lock);
@@ -300,7 +321,11 @@
if (ret)
return ret;
- pm_runtime_get_sync(counter->parent);
+ ret = pm_runtime_resume_and_get(counter->parent);
+ if (ret < 0) {
+ mutex_unlock(&priv->lock);
+ return ret;
+ }
tsr = rz_mtu3_8bit_ch_read(ch, RZ_MTU3_TSR);
pm_runtime_put(counter->parent);
@@ -377,7 +402,11 @@
return -EINVAL;
}
- pm_runtime_get_sync(counter->parent);
+ ret = pm_runtime_resume_and_get(counter->parent);
+ if (ret < 0) {
+ mutex_unlock(&priv->lock);
+ return ret;
+ }
if (count->id == RZ_MTU3_32_BIT_CH)
rz_mtu3_32bit_ch_write(ch, RZ_MTU3_TGRALW, ceiling);
else
@@ -504,7 +533,9 @@
goto exit;
if (enable) {
- pm_runtime_get_sync(counter->parent);
+ ret = pm_runtime_resume_and_get(counter->parent);
+ if (ret < 0)
+ goto exit;
ret = rz_mtu3_initialize_counter(counter, count->id);
if (ret == 0)
priv->count_is_enabled[count->id] = true;
@@ -543,7 +574,11 @@
if (ret)
return ret;
- pm_runtime_get_sync(counter->parent);
+ ret = pm_runtime_resume_and_get(counter->parent);
+ if (ret < 0) {
+ mutex_unlock(&priv->lock);
+ return ret;
+ }
tmdr = rz_mtu3_shared_reg_read(priv->ch, RZ_MTU3_TMDR3);
pm_runtime_put(counter->parent);
*cascade_enable = test_bit(RZ_MTU3_TMDR3_LWA, &tmdr);
@@ -562,7 +597,11 @@
if (ret)
return ret;
- pm_runtime_get_sync(counter->parent);
+ ret = pm_runtime_resume_and_get(counter->parent);
+ if (ret < 0) {
+ mutex_unlock(&priv->lock);
+ return ret;
+ }
rz_mtu3_shared_reg_update_bit(priv->ch, RZ_MTU3_TMDR3,
RZ_MTU3_TMDR3_LWA, cascade_enable);
pm_runtime_put(counter->parent);
@@ -582,7 +621,11 @@
if (ret)
return ret;
- pm_runtime_get_sync(counter->parent);
+ ret = pm_runtime_resume_and_get(counter->parent);
+ if (ret < 0) {
+ mutex_unlock(&priv->lock);
+ return ret;
+ }
tmdr = rz_mtu3_shared_reg_read(priv->ch, RZ_MTU3_TMDR3);
pm_runtime_put(counter->parent);
*ext_input_phase_clock_select = test_bit(RZ_MTU3_TMDR3_PHCKSEL, &tmdr);
@@ -601,7 +644,11 @@
if (ret)
return ret;
- pm_runtime_get_sync(counter->parent);
+ ret = pm_runtime_resume_and_get(counter->parent);
+ if (ret < 0) {
+ mutex_unlock(&priv->lock);
+ return ret;
+ }
rz_mtu3_shared_reg_update_bit(priv->ch, RZ_MTU3_TMDR3,
RZ_MTU3_TMDR3_PHCKSEL,
ext_input_phase_clock_select);
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v3 3/3] counter: rz-mtu3-cnt: put runtime PM ref if counter init fails
2026-09-03 9:07 [PATCH v3 0/3] counter: rz-mtu3-cnt: check clock and runtime PM errors Li Youhong
2026-09-03 9:07 ` [PATCH v3 1/3] counter: rz-mtu3-cnt: check clk_prepare_enable() and pm_runtime_set_active() Li Youhong
2026-09-03 9:07 ` [PATCH v3 2/3] counter: rz-mtu3-cnt: check pm_runtime_resume_and_get() return values Li Youhong
@ 2026-09-03 9:07 ` Li Youhong
2 siblings, 0 replies; 4+ messages in thread
From: Li Youhong @ 2026-09-03 9:07 UTC (permalink / raw)
To: biju.das.jz, wbg; +Cc: linux-iio, linux-renesas-soc, Li Youhong
From: Li Youhong <liyouhong@kylinos.cn>
Counter enable takes a runtime PM reference before initialization but
only puts it on disable. Drop the reference if initialization fails.
Fixes: 0be8907359df ("counter: Add Renesas RZ/G2L MTU3a counter driver")
Signed-off-by: Li Youhong <liyouhong@kylinos.cn>
---
--- a/drivers/counter/rz-mtu3-cnt.c
+++ b/drivers/counter/rz-mtu3-cnt.c
@@ -537,8 +537,11 @@
if (ret < 0)
goto exit;
ret = rz_mtu3_initialize_counter(counter, count->id);
- if (ret == 0)
- priv->count_is_enabled[count->id] = true;
+ if (ret < 0) {
+ pm_runtime_put(counter->parent);
+ goto exit;
+ }
+ priv->count_is_enabled[count->id] = true;
} else {
rz_mtu3_terminate_counter(counter, count->id);
priv->count_is_enabled[count->id] = false;
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-09-03 9:07 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-03 9:07 [PATCH v3 0/3] counter: rz-mtu3-cnt: check clock and runtime PM errors Li Youhong
2026-09-03 9:07 ` [PATCH v3 1/3] counter: rz-mtu3-cnt: check clk_prepare_enable() and pm_runtime_set_active() Li Youhong
2026-09-03 9:07 ` [PATCH v3 2/3] counter: rz-mtu3-cnt: check pm_runtime_resume_and_get() return values Li Youhong
2026-09-03 9:07 ` [PATCH v3 3/3] counter: rz-mtu3-cnt: put runtime PM ref if counter init fails Li Youhong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox