Skip to content

Commit 67c3f99

Browse files
Demon000William Breathitt Gray
authored andcommitted
counter: rz-mtu3-cnt: prevent counter from being toggled multiple times
Runtime PM counter is incremented / decremented each time the sysfs enable file is written to. If user writes 0 to the sysfs enable file multiple times, runtime PM usage count underflows, generating the following message. rz-mtu3-counter rz-mtu3-counter.0: Runtime PM usage count underflow! At the same time, hardware registers end up being accessed with clocks off in rz_mtu3_terminate_counter() to disable an already disabled channel. If user writes 1 to the sysfs enable file multiple times, runtime PM usage count will be incremented each time, requiring the same number of 0 writes to get it back to 0. If user writes 0 to the sysfs enable file while PWM is in progress, PWM is stopped without counter being the owner of the underlying MTU3 channel. Check against the cached count_is_enabled value and exit if the user is trying to set the same enable value. Cc: stable@vger.kernel.org Fixes: 0be8907 ("counter: Add Renesas RZ/G2L MTU3a counter driver") Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com> Link: https://lore.kernel.org/r/20260130122353.2263273-5-cosmin-gabriel.tanislav.xa@renesas.com Signed-off-by: William Breathitt Gray <wbg@kernel.org>
1 parent f338e77 commit 67c3f99

1 file changed

Lines changed: 8 additions & 4 deletions

File tree

drivers/counter/rz-mtu3-cnt.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -499,21 +499,25 @@ static int rz_mtu3_count_enable_write(struct counter_device *counter,
499499
struct rz_mtu3_cnt *const priv = counter_priv(counter);
500500
int ret = 0;
501501

502+
mutex_lock(&priv->lock);
503+
504+
if (priv->count_is_enabled[count->id] == enable)
505+
goto exit;
506+
502507
if (enable) {
503-
mutex_lock(&priv->lock);
504508
pm_runtime_get_sync(ch->dev);
505509
ret = rz_mtu3_initialize_counter(counter, count->id);
506510
if (ret == 0)
507511
priv->count_is_enabled[count->id] = true;
508-
mutex_unlock(&priv->lock);
509512
} else {
510-
mutex_lock(&priv->lock);
511513
rz_mtu3_terminate_counter(counter, count->id);
512514
priv->count_is_enabled[count->id] = false;
513515
pm_runtime_put(ch->dev);
514-
mutex_unlock(&priv->lock);
515516
}
516517

518+
exit:
519+
mutex_unlock(&priv->lock);
520+
517521
return ret;
518522
}
519523

0 commit comments

Comments
 (0)