* [PATCH] pinctrl: stm32: fix the unit of the hwspinlock timeout
@ 2026-08-05 3:28 Ju Nan
2026-08-21 9:22 ` Antonio Borneo
0 siblings, 1 reply; 4+ messages in thread
From: Ju Nan @ 2026-08-05 3:28 UTC (permalink / raw)
To: antonio.borneo, linusw, mcoquelin.stm32, alexandre.torgue, junan76
Cc: linux-gpio, linux-stm32, linux-arm-kernel, linux-kernel
HWSPNLCK_TIMEOUT is passed to hwspin_lock_timeout_in_atomic(), whose
timeout argument is in milliseconds, not microseconds:
atomic_delay += HWSPINLOCK_RETRY_DELAY_US;
if (atomic_delay > to * 1000)
return -ETIMEDOUT;
So the driver asks for a 1 second timeout where the comment next to the
macro says it wants 1 millisecond.
The hwspinlock core documents this explicitly:
If the mode is HWLOCK_IN_ATOMIC (called from an atomic context) the
timeout is handled with busy-waiting delays, hence shall not exceed
few msecs.
Pass the value the comment always described. The core retries every
HWSPINLOCK_RETRY_DELAY_US (100 us), so the semaphore is still polled ten
times before giving up, which is far longer than any plausible hold time
on the coprocessor side. A timeout is reported with dev_err() and fails
the pin configuration or the interrupt allocation, so shortening it
degrades gracefully.
Signed-off-by: Ju Nan <junan76@163.com>
---
drivers/pinctrl/stm32/pinctrl-stm32.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c
index 6a99708a5..dbc9143ec 100644
--- a/drivers/pinctrl/stm32/pinctrl-stm32.c
+++ b/drivers/pinctrl/stm32/pinctrl-stm32.c
@@ -87,7 +87,7 @@
#define gpio_range_to_bank(chip) \
container_of(chip, struct stm32_gpio_bank, range)
-#define HWSPNLCK_TIMEOUT 1000 /* usec */
+#define HWSPNLCK_TIMEOUT 1 /* msec */
static const char * const stm32_gpio_functions[] = {
"gpio", "af0", "af1",
--
2.55.0
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH] pinctrl: stm32: fix the unit of the hwspinlock timeout 2026-08-05 3:28 [PATCH] pinctrl: stm32: fix the unit of the hwspinlock timeout Ju Nan @ 2026-08-21 9:22 ` Antonio Borneo 2026-08-27 14:11 ` [PATCH v2] " Ju Nan 0 siblings, 1 reply; 4+ messages in thread From: Antonio Borneo @ 2026-08-21 9:22 UTC (permalink / raw) To: Ju Nan, linusw, mcoquelin.stm32, alexandre.torgue Cc: linux-gpio, linux-stm32, linux-arm-kernel, linux-kernel On Wed, 2026-08-05 at 11:28 +0800, Ju Nan wrote: > HWSPNLCK_TIMEOUT is passed to hwspin_lock_timeout_in_atomic(), whose > timeout argument is in milliseconds, not microseconds: > > atomic_delay += HWSPINLOCK_RETRY_DELAY_US; > if (atomic_delay > to * 1000) > return -ETIMEDOUT; > > So the driver asks for a 1 second timeout where the comment next to the > macro says it wants 1 millisecond. > > The hwspinlock core documents this explicitly: > > If the mode is HWLOCK_IN_ATOMIC (called from an atomic context) the > timeout is handled with busy-waiting delays, hence shall not exceed > few msecs. > > Pass the value the comment always described. The core retries every > HWSPINLOCK_RETRY_DELAY_US (100 us), so the semaphore is still polled ten > times before giving up, which is far longer than any plausible hold time > on the coprocessor side. A timeout is reported with dev_err() and fails > the pin configuration or the interrupt allocation, so shortening it > degrades gracefully. > > Signed-off-by: Ju Nan <junan76@163.com> Please add Fixes: 290a9f937e5a ("pinctrl: stm32: use the hwspin_lock_timeout_in_atomic() API") > --- > drivers/pinctrl/stm32/pinctrl-stm32.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c > index 6a99708a5..dbc9143ec 100644 > --- a/drivers/pinctrl/stm32/pinctrl-stm32.c > +++ b/drivers/pinctrl/stm32/pinctrl-stm32.c > @@ -87,7 +87,7 @@ > #define gpio_range_to_bank(chip) \ > container_of(chip, struct stm32_gpio_bank, range) > > -#define HWSPNLCK_TIMEOUT 1000 /* usec */ > +#define HWSPNLCK_TIMEOUT 1 /* msec */ Please change the macro name as HWSPNLCK_TIMEOUT_MS to keep track of the time units > > static const char * const stm32_gpio_functions[] = { > "gpio", "af0", "af1", Thanks! Antonio ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2] pinctrl: stm32: fix the unit of the hwspinlock timeout 2026-08-21 9:22 ` Antonio Borneo @ 2026-08-27 14:11 ` Ju Nan 2026-08-29 11:20 ` Ju Nan 0 siblings, 1 reply; 4+ messages in thread From: Ju Nan @ 2026-08-27 14:11 UTC (permalink / raw) To: antonio.borneo Cc: alexandre.torgue, junan76, linusw, linux-arm-kernel, linux-gpio, linux-kernel, linux-stm32, mcoquelin.stm32 HWSPNLCK_TIMEOUT is passed to hwspin_lock_timeout_in_atomic(), whose timeout argument is in milliseconds, not microseconds: atomic_delay += HWSPINLOCK_RETRY_DELAY_US; if (atomic_delay > to * 1000) return -ETIMEDOUT; So the driver asks for a 1 second timeout where the comment next to the macro says it wants 1 millisecond. All seven call sites spin on the hardware semaphore with udelay(), from sections that hold bank->lock or irqmux_lock, so on a non-PREEMPT_RT kernel this can keep interrupts disabled for up to one second while waiting for the coprocessor. The hwspinlock core documents this explicitly: If the mode is HWLOCK_IN_ATOMIC (called from an atomic context) the timeout is handled with busy-waiting delays, hence shall not exceed few msecs. Pass the value the comment always described. The core retries every HWSPINLOCK_RETRY_DELAY_US (100 us), so the semaphore is still polled ten times before giving up, which is far longer than any plausible hold time on the coprocessor side. A timeout is reported with dev_err() and fails the pin configuration or the interrupt allocation, so shortening it degrades gracefully. Fixes: 290a9f937e5a ("pinctrl: stm32: use the hwspin_lock_timeout_in_atomic() API") Reviewed-by: Antonio Borneo <antonio.borneo@foss.st.com> Signed-off-by: Ju Nan <junan76@163.com> --- changelog: v2: - Add the "Fixes" tag - Redefine HWSPNLCK_TIMEOUT as HWSPNLCK_TIMEOUT_MS v1: https://lore.kernel.org/all/20260805032843.36961-2-junan76@163.com/ --- drivers/pinctrl/stm32/pinctrl-stm32.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c index d97057ec2..0d888d30f 100644 --- a/drivers/pinctrl/stm32/pinctrl-stm32.c +++ b/drivers/pinctrl/stm32/pinctrl-stm32.c @@ -87,7 +87,7 @@ #define gpio_range_to_bank(chip) \ container_of(chip, struct stm32_gpio_bank, range) -#define HWSPNLCK_TIMEOUT 1000 /* usec */ +#define HWSPNLCK_TIMEOUT_MS 1 static const char * const stm32_gpio_functions[] = { "gpio", "af0", "af1", @@ -633,7 +633,7 @@ static int stm32_gpio_domain_alloc(struct irq_domain *d, if (pctl->hwlock) { ret = hwspin_lock_timeout_in_atomic(pctl->hwlock, - HWSPNLCK_TIMEOUT); + HWSPNLCK_TIMEOUT_MS); if (ret) { dev_err(pctl->dev, "Can't get hwspinlock\n"); pctl->irqmux_map &= ~BIT(hwirq); @@ -943,7 +943,7 @@ static int stm32_pmx_set_mode(struct stm32_gpio_bank *bank, if (pctl->hwlock) { err = hwspin_lock_timeout_in_atomic(pctl->hwlock, - HWSPNLCK_TIMEOUT); + HWSPNLCK_TIMEOUT_MS); if (err) { dev_err(pctl->dev, "Can't get hwspinlock\n"); goto unlock; @@ -1086,7 +1086,7 @@ static int stm32_pconf_set_driving(struct stm32_gpio_bank *bank, if (pctl->hwlock) { err = hwspin_lock_timeout_in_atomic(pctl->hwlock, - HWSPNLCK_TIMEOUT); + HWSPNLCK_TIMEOUT_MS); if (err) { dev_err(pctl->dev, "Can't get hwspinlock\n"); goto unlock; @@ -1132,7 +1132,7 @@ static int stm32_pconf_set_speed(struct stm32_gpio_bank *bank, if (pctl->hwlock) { err = hwspin_lock_timeout_in_atomic(pctl->hwlock, - HWSPNLCK_TIMEOUT); + HWSPNLCK_TIMEOUT_MS); if (err) { dev_err(pctl->dev, "Can't get hwspinlock\n"); goto unlock; @@ -1178,7 +1178,7 @@ static int stm32_pconf_set_bias(struct stm32_gpio_bank *bank, if (pctl->hwlock) { err = hwspin_lock_timeout_in_atomic(pctl->hwlock, - HWSPNLCK_TIMEOUT); + HWSPNLCK_TIMEOUT_MS); if (err) { dev_err(pctl->dev, "Can't get hwspinlock\n"); goto unlock; @@ -1239,7 +1239,7 @@ static int stm32_pconf_set_advcfgr(struct stm32_gpio_bank *bank, int offset, u32 spin_lock_irqsave(&bank->lock, flags); if (pctl->hwlock) { - err = hwspin_lock_timeout_in_atomic(pctl->hwlock, HWSPNLCK_TIMEOUT); + err = hwspin_lock_timeout_in_atomic(pctl->hwlock, HWSPNLCK_TIMEOUT_MS); if (err) { dev_err(pctl->dev, "Can't get hwspinlock\n"); goto unlock; @@ -1317,7 +1317,7 @@ stm32_pconf_set_skew_delay(struct stm32_gpio_bank *bank, int offset, u32 delay, spin_lock_irqsave(&bank->lock, flags); if (pctl->hwlock) { - err = hwspin_lock_timeout_in_atomic(pctl->hwlock, HWSPNLCK_TIMEOUT); + err = hwspin_lock_timeout_in_atomic(pctl->hwlock, HWSPNLCK_TIMEOUT_MS); if (err) { dev_err(pctl->dev, "Can't get hwspinlock\n"); goto unlock; -- 2.55.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] pinctrl: stm32: fix the unit of the hwspinlock timeout 2026-08-27 14:11 ` [PATCH v2] " Ju Nan @ 2026-08-29 11:20 ` Ju Nan 0 siblings, 0 replies; 4+ messages in thread From: Ju Nan @ 2026-08-29 11:20 UTC (permalink / raw) To: antonio.borneo Cc: alexandre.torgue, linusw, linux-arm-kernel, linux-gpio, linux-kernel, linux-stm32, mcoquelin.stm32 > diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c > index d97057ec2..0d888d30f 100644 > --- a/drivers/pinctrl/stm32/pinctrl-stm32.c > +++ b/drivers/pinctrl/stm32/pinctrl-stm32.c > @@ -87,7 +87,7 @@ > #define gpio_range_to_bank(chip) \ > container_of(chip, struct stm32_gpio_bank, range) > > -#define HWSPNLCK_TIMEOUT 1000 /* usec */ > +#define HWSPNLCK_TIMEOUT_MS 1 > > static const char * const stm32_gpio_functions[] = { > "gpio", "af0", "af1", > @@ -633,7 +633,7 @@ static int stm32_gpio_domain_alloc(struct irq_domain *d, > > if (pctl->hwlock) { > ret = hwspin_lock_timeout_in_atomic(pctl->hwlock, > - HWSPNLCK_TIMEOUT); > + HWSPNLCK_TIMEOUT_MS); Please ignore this patch for now, since it has a dependency issue with this one: https://lore.kernel.org/lkml/4dcb0fb67e12ec6e6aa812e6e93b435704c6105b.camel@foss.st.com/ Thanks Antonio, I will think more about what you said. Regards, Ju Nan ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-08-29 11:20 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-08-05 3:28 [PATCH] pinctrl: stm32: fix the unit of the hwspinlock timeout Ju Nan 2026-08-21 9:22 ` Antonio Borneo 2026-08-27 14:11 ` [PATCH v2] " Ju Nan 2026-08-29 11:20 ` Ju Nan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®