[PATCH v3 2/2] pwm: th1520: Lock clock rate with clk_rate_exclusive_get

From: Maurice Hieronymus

Date: Sun Jun 28 2026 - 16:18:54 EST


The driver derives period and duty cycle from the clock rate read at
probe, so a later rate change would silently miscompute waveforms.
Switch to the new ExclusiveClk wrapper to hold the rate for the lifetime
of the driver data and drop the corresponding TODO.

Reviewed-by: Alice Ryhl <aliceryhl@xxxxxxxxxx>
Reviewed-by: Michal Wilczynski <m.wilczynski@xxxxxxxxxxx>
Signed-off-by: Maurice Hieronymus <mhi@xxxxxxxxxxx>
---
drivers/pwm/pwm_th1520.rs | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/drivers/pwm/pwm_th1520.rs b/drivers/pwm/pwm_th1520.rs
index 343a1178c5e7..8f9d3fa39200 100644
--- a/drivers/pwm/pwm_th1520.rs
+++ b/drivers/pwm/pwm_th1520.rs
@@ -22,8 +22,16 @@

use core::ops::Deref;
use kernel::{
- clk::{Clk, Enabled},
- device::{Bound, Core, Device},
+ clk::{
+ Clk,
+ Enabled,
+ ExclusiveClk, //
+ },
+ device::{
+ Bound,
+ Core,
+ Device, //
+ },
devres,
io::{
mem::IoMem,
@@ -93,7 +101,7 @@ struct Th1520WfHw {
struct Th1520PwmDriverData {
#[pin]
iomem: devres::Devres<IoMem<TH1520_PWM_REG_SIZE>>,
- clk: Clk<Enabled>,
+ clk: ExclusiveClk,
}

impl pwm::PwmOps for Th1520PwmDriverData {
@@ -319,10 +327,8 @@ fn probe(
let request = pdev.io_request_by_index(0).ok_or(ENODEV)?;

let clk = Clk::<Enabled>::get(dev, None)?;
+ let clk = clk.rate_exclusive_get()?;

- // TODO: Get exclusive ownership of the clock to prevent rate changes.
- // The Rust equivalent of `clk_rate_exclusive_get()` is not yet available.
- // This should be updated once it is implemented.
let rate_hz = clk.rate().as_hz();
if rate_hz == 0 {
dev_err!(dev, "Clock rate is zero\n");

--
2.51.2