]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
clocksource/drivers/timer-rtl-otto: Do not interfere with interrupts
authorMarkus Stockhausen <markus.stockhausen@gmx.de>
Mon, 4 Aug 2025 08:03:27 +0000 (04:03 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:34:07 +0000 (15:34 -0500)
[ Upstream commit c445bffbf28f721e05d0ce06895045fc62aaff7c ]

During normal operation the timers are reprogrammed including an
interrupt acknowledgement. This has no effect as the whole timer
is setup from scratch afterwards. Especially in an interrupt this
has already been done by rttm_timer_interrupt().

Change the behaviour as follows:

- Use rttm_disable_timer() during reprogramming
- Keep rttm_stop_timer() for all other use cases.

Downstream has already tested and confirmed a patch. See
https://github.com/openwrt/openwrt/pull/19468
https://forum.openwrt.org/t/support-for-rtl838x-based-managed-switches/57875/3788

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Tested-by: Stephen Howell <howels@allthatwemight.be>
Tested-by: Bjørn Mork <bjorn@mork.no>
Link: https://lore.kernel.org/r/20250804080328.2609287-4-markus.stockhausen@gmx.de
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/clocksource/timer-rtl-otto.c

index 8be45a11fb8b619cee8cfd9d2e5670a8bbaa9acc..24c4aa6a301314953d549d55cac215a2b8159ee3 100644 (file)
@@ -147,7 +147,7 @@ static int rttm_next_event(unsigned long delta, struct clock_event_device *clkev
 
        RTTM_DEBUG(to->of_base.base);
        rttm_bounce_timer(to->of_base.base, RTTM_CTRL_COUNTER);
-       rttm_stop_timer(to->of_base.base);
+       rttm_disable_timer(to->of_base.base);
        rttm_set_period(to->of_base.base, delta);
        rttm_start_timer(to, RTTM_CTRL_COUNTER);
 
@@ -160,7 +160,7 @@ static int rttm_state_oneshot(struct clock_event_device *clkevt)
 
        RTTM_DEBUG(to->of_base.base);
        rttm_bounce_timer(to->of_base.base, RTTM_CTRL_COUNTER);
-       rttm_stop_timer(to->of_base.base);
+       rttm_disable_timer(to->of_base.base);
        rttm_set_period(to->of_base.base, RTTM_TICKS_PER_SEC / HZ);
        rttm_start_timer(to, RTTM_CTRL_COUNTER);
 
@@ -173,7 +173,7 @@ static int rttm_state_periodic(struct clock_event_device *clkevt)
 
        RTTM_DEBUG(to->of_base.base);
        rttm_bounce_timer(to->of_base.base, RTTM_CTRL_TIMER);
-       rttm_stop_timer(to->of_base.base);
+       rttm_disable_timer(to->of_base.base);
        rttm_set_period(to->of_base.base, RTTM_TICKS_PER_SEC / HZ);
        rttm_start_timer(to, RTTM_CTRL_TIMER);