[PATCH 14/20] clocksource/drivers/vf-pit: Enable and disable module on error

From: Daniel Lezcano
Date: Sat Jul 05 2025 - 12:04:04 EST


Encapsulate the calls to writel to enable and disable the PIT module
and make use of them. Add the missing module disablement in case of
error.

Signed-off-by: Daniel Lezcano <daniel.lezcano@xxxxxxxxxx>
---
drivers/clocksource/timer-vf-pit.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/drivers/clocksource/timer-vf-pit.c b/drivers/clocksource/timer-vf-pit.c
index 2799cff2a296..043e36b2165d 100644
--- a/drivers/clocksource/timer-vf-pit.c
+++ b/drivers/clocksource/timer-vf-pit.c
@@ -13,10 +13,12 @@
/*
* Each pit takes 0x10 Bytes register space
*/
-#define PITMCR 0x00
#define PIT0_OFFSET 0x100
#define PIT_CH(n) (PIT0_OFFSET + 0x10 * (n))

+#define PITMCR(__base) (__base)
+
+#define PITMCR_FRZ BIT(0)
#define PITMCR_MDIS BIT(1)

#define PITLDVAL(__base) (__base)
@@ -52,6 +54,16 @@ static inline struct pit_timer *cs_to_pit(struct clocksource *cs)
return container_of(cs, struct pit_timer, cs);
}

+static inline void pit_module_enable(void __iomem *base)
+{
+ writel(0, PITMCR(base));
+}
+
+static inline void pit_module_disable(void __iomem *base)
+{
+ writel(PITMCR_MDIS, PITMCR(base));
+}
+
static inline void pit_timer_enable(struct pit_timer *pit)
{
writel(PITTCTRL_TEN | PITTCTRL_TIE, PITTCTRL(pit->clkevt_base));
@@ -253,11 +265,11 @@ static int __init pit_timer_init(struct device_node *np)
clk_rate = clk_get_rate(pit_clk);

/* enable the pit module */
- writel(~PITMCR_MDIS, timer_base + PITMCR);
+ pit_module_enable(timer_base);

ret = pit_clocksource_init(pit, name, timer_base, clk_rate);
if (ret)
- goto out_disable_unprepare;
+ goto out_pit_module_disable;

ret = pit_clockevent_init(pit, name, timer_base, clk_rate, irq, 0);
if (ret)
@@ -267,7 +279,8 @@ static int __init pit_timer_init(struct device_node *np)

out_pit_clocksource_unregister:
clocksource_unregister(&pit->cs);
-out_disable_unprepare:
+out_pit_module_disable:
+ pit_module_disable(timer_base);
clk_disable_unprepare(pit_clk);
out_clk_put:
clk_put(pit_clk);
--
2.43.0