Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'timers-clocksource-2025-11-30' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull clocksource updates from Thomas Gleixner:
"Updates for clocksource and clockevent drivers:

- A new driver for the Realtel system timer

- Prevent the unbinding of timers when the drivers do not support
that

- Expand the timer counter readout for the SPRD driver to 64 bit
to allow IOT devices suspend times of more than 36 hours, which
is the current limit of the 32-bi readout

- The usual small cleanups, fixes and enhancements all over the
place"

* tag 'timers-clocksource-2025-11-30' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
clocksource/drivers: Add Realtek system timer driver
dt-bindings: timer: Add Realtek SYSTIMER
clocksource/drivers/stm32-lp: Drop unused module alias
clocksource/drivers/rda: Add sched_clock_register for RDA8810PL SoC
clocksource/drivers/nxp-stm: Prevent driver unbind
clocksource/drivers/nxp-pit: Prevent driver unbind
clocksource/drivers/arm_arch_timer_mmio: Prevent driver unbind
clocksource/drivers/nxp-stm: Fix section mismatches
clocksource/drivers/sh_cmt: Always leave device running after probe
clocksource/drivers/stm: Fix double deregistration on probe failure
clocksource/drivers/ralink: Fix resource leaks in init error path
clocksource/drivers/timer-sp804: Fix read_current_timer() issue when clock source is not registered
clocksource/drivers/sprd: Enable register for timer counter from 32 bit to 64 bit

+291 -56
+47
Documentation/devicetree/bindings/timer/realtek,rtd1625-systimer.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/timer/realtek,rtd1625-systimer.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Realtek System Timer 8 + 9 + maintainers: 10 + - Hao-Wen Ting <haowen.ting@realtek.com> 11 + 12 + description: 13 + The Realtek SYSTIMER (System Timer) is a 64-bit global hardware counter operating 14 + at a fixed 1MHz frequency. Thanks to its compare match interrupt capability, 15 + the timer natively supports oneshot mode for tick broadcast functionality. 16 + 17 + properties: 18 + compatible: 19 + oneOf: 20 + - const: realtek,rtd1625-systimer 21 + - items: 22 + - const: realtek,rtd1635-systimer 23 + - const: realtek,rtd1625-systimer 24 + 25 + reg: 26 + maxItems: 1 27 + 28 + interrupts: 29 + maxItems: 1 30 + 31 + required: 32 + - compatible 33 + - reg 34 + - interrupts 35 + 36 + additionalProperties: false 37 + 38 + examples: 39 + - | 40 + #include <dt-bindings/interrupt-controller/arm-gic.h> 41 + 42 + timer@89420 { 43 + compatible = "realtek,rtd1635-systimer", 44 + "realtek,rtd1625-systimer"; 45 + reg = <0x89420 0x18>; 46 + interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>; 47 + };
+5
MAINTAINERS
··· 21681 21681 F: Documentation/devicetree/bindings/spi/realtek,rtl9301-snand.yaml 21682 21682 F: drivers/spi/spi-realtek-rtl-snand.c 21683 21683 21684 + REALTEK SYSTIMER DRIVER 21685 + M: Hao-Wen Ting <haowen.ting@realtek.com> 21686 + S: Maintained 21687 + F: drivers/clocksource/timer-realtek.c 21688 + 21684 21689 REALTEK WIRELESS DRIVER (rtlwifi family) 21685 21690 M: Ping-Ke Shih <pkshih@realtek.com> 21686 21691 L: linux-wireless@vger.kernel.org
+11
drivers/clocksource/Kconfig
··· 782 782 Enables the support for NXP System Timer Module found in the 783 783 s32g NXP platform series. 784 784 785 + config RTK_SYSTIMER 786 + bool "Realtek SYSTIMER support" 787 + depends on ARM || ARM64 788 + depends on ARCH_REALTEK || COMPILE_TEST 789 + select TIMER_OF 790 + help 791 + This option enables the driver that registers the global 1 MHz hardware 792 + counter as a clock event device on Realtek SoCs. Make sure to enable 793 + this option only when building for a Realtek platform or for compilation 794 + testing. 795 + 785 796 endmenu
+1
drivers/clocksource/Makefile
··· 95 95 obj-$(CONFIG_EP93XX_TIMER) += timer-ep93xx.o 96 96 obj-$(CONFIG_RALINK_TIMER) += timer-ralink.o 97 97 obj-$(CONFIG_NXP_STM_TIMER) += timer-nxp-stm.o 98 + obj-$(CONFIG_RTK_SYSTIMER) += timer-realtek.o
+2
drivers/clocksource/arm_arch_timer_mmio.c
··· 426 426 .driver = { 427 427 .name = "arch-timer-mmio", 428 428 .of_match_table = arch_timer_mmio_of_table, 429 + .suppress_bind_attrs = true, 429 430 }, 430 431 .probe = arch_timer_mmio_probe, 431 432 }; ··· 435 434 static struct platform_driver arch_timer_mmio_acpi_drv = { 436 435 .driver = { 437 436 .name = "gtdt-arm-mmio-timer", 437 + .suppress_bind_attrs = true, 438 438 }, 439 439 .probe = arch_timer_mmio_probe, 440 440 };
+3 -33
drivers/clocksource/sh_cmt.c
··· 355 355 356 356 dev_pm_syscore_device(&ch->cmt->pdev->dev, true); 357 357 358 - /* enable clock */ 359 - ret = clk_enable(ch->cmt->clk); 360 - if (ret) { 361 - dev_err(&ch->cmt->pdev->dev, "ch%u: cannot enable clock\n", 362 - ch->index); 363 - goto err0; 364 - } 365 - 366 358 /* make sure channel is disabled */ 367 359 sh_cmt_start_stop_ch(ch, 0); 368 360 ··· 376 384 if (ret || sh_cmt_read_cmcnt(ch)) { 377 385 dev_err(&ch->cmt->pdev->dev, "ch%u: cannot clear CMCNT\n", 378 386 ch->index); 379 - ret = -ETIMEDOUT; 380 - goto err1; 387 + return -ETIMEDOUT; 381 388 } 382 389 383 390 /* enable channel */ 384 391 sh_cmt_start_stop_ch(ch, 1); 385 392 return 0; 386 - err1: 387 - /* stop clock */ 388 - clk_disable(ch->cmt->clk); 389 - 390 - err0: 391 - return ret; 392 393 } 393 394 394 395 static void sh_cmt_disable(struct sh_cmt_channel *ch) ··· 391 406 392 407 /* disable interrupts in CMT block */ 393 408 sh_cmt_write_cmcsr(ch, 0); 394 - 395 - /* stop clock */ 396 - clk_disable(ch->cmt->clk); 397 409 398 410 dev_pm_syscore_device(&ch->cmt->pdev->dev, false); 399 411 } ··· 565 583 int ret = 0; 566 584 unsigned long flags; 567 585 568 - pm_runtime_get_sync(&ch->cmt->pdev->dev); 569 - 570 586 raw_spin_lock_irqsave(&ch->lock, flags); 571 587 572 588 if (!(ch->flags & (FLAG_CLOCKEVENT | FLAG_CLOCKSOURCE))) ··· 599 619 sh_cmt_disable(ch); 600 620 601 621 raw_spin_unlock_irqrestore(&ch->lock, flags); 602 - 603 - pm_runtime_put(&ch->cmt->pdev->dev); 604 622 } 605 623 606 624 static int sh_cmt_start_clockevent(struct sh_cmt_channel *ch) ··· 608 630 609 631 raw_spin_lock_irqsave(&ch->lock, flags); 610 632 611 - if (!(ch->flags & (FLAG_CLOCKEVENT | FLAG_CLOCKSOURCE))) { 612 - pm_runtime_get_sync(&ch->cmt->pdev->dev); 633 + if (!(ch->flags & (FLAG_CLOCKEVENT | FLAG_CLOCKSOURCE))) 613 634 ret = sh_cmt_enable(ch); 614 - } 615 635 616 636 if (ret) 617 637 goto out; ··· 632 656 633 657 ch->flags &= ~FLAG_CLOCKEVENT; 634 658 635 - if (f && !(ch->flags & (FLAG_CLOCKEVENT | FLAG_CLOCKSOURCE))) { 659 + if (f && !(ch->flags & (FLAG_CLOCKEVENT | FLAG_CLOCKSOURCE))) 636 660 sh_cmt_disable(ch); 637 - pm_runtime_put(&ch->cmt->pdev->dev); 638 - } 639 661 640 662 /* adjust the timeout to maximum if only clocksource left */ 641 663 if (ch->flags & FLAG_CLOCKSOURCE) ··· 1108 1134 mask &= ~(1 << hwidx); 1109 1135 } 1110 1136 1111 - clk_disable(cmt->clk); 1112 - 1113 1137 platform_set_drvdata(pdev, cmt); 1114 1138 1115 1139 return 0; ··· 1155 1183 out: 1156 1184 if (cmt->has_clockevent || cmt->has_clocksource) 1157 1185 pm_runtime_irq_safe(&pdev->dev); 1158 - else 1159 - pm_runtime_idle(&pdev->dev); 1160 1186 1161 1187 return 0; 1162 1188 }
+2 -1
drivers/clocksource/timer-nxp-pit.c
··· 374 374 .driver = { 375 375 .name = "nxp-pit", 376 376 .of_match_table = pit_timer_of_match, 377 + .suppress_bind_attrs = true, 377 378 }, 378 379 .probe = pit_timer_probe, 379 380 }; 380 - module_platform_driver(nxp_pit_driver); 381 + builtin_platform_driver(nxp_pit_driver); 381 382 382 383 TIMER_OF_DECLARE(vf610, "fsl,vf610-pit", pit_timer_init);
+11 -12
drivers/clocksource/timer-nxp-stm.c
··· 177 177 nxp_stm_clocksource_enable(cs); 178 178 } 179 179 180 - static void __init devm_clocksource_unregister(void *data) 180 + static void devm_clocksource_unregister(void *data) 181 181 { 182 182 struct stm_timer *stm_timer = data; 183 183 184 184 clocksource_unregister(&stm_timer->cs); 185 185 } 186 186 187 - static int __init nxp_stm_clocksource_init(struct device *dev, struct stm_timer *stm_timer, 188 - const char *name, void __iomem *base, struct clk *clk) 187 + static int nxp_stm_clocksource_init(struct device *dev, struct stm_timer *stm_timer, 188 + const char *name, void __iomem *base, struct clk *clk) 189 189 { 190 190 int ret; 191 191 ··· 208 208 return ret; 209 209 210 210 ret = devm_add_action_or_reset(dev, devm_clocksource_unregister, stm_timer); 211 - if (ret) { 212 - clocksource_unregister(&stm_timer->cs); 211 + if (ret) 213 212 return ret; 214 - } 215 213 216 214 stm_sched_clock = stm_timer; 217 215 ··· 296 298 nxp_stm_module_get(stm_timer); 297 299 } 298 300 299 - static int __init nxp_stm_clockevent_per_cpu_init(struct device *dev, struct stm_timer *stm_timer, 300 - const char *name, void __iomem *base, int irq, 301 - struct clk *clk, int cpu) 301 + static int nxp_stm_clockevent_per_cpu_init(struct device *dev, struct stm_timer *stm_timer, 302 + const char *name, void __iomem *base, int irq, 303 + struct clk *clk, int cpu) 302 304 { 303 305 stm_timer->base = base; 304 306 stm_timer->rate = clk_get_rate(clk); ··· 386 388 return IRQ_HANDLED; 387 389 } 388 390 389 - static int __init nxp_stm_timer_probe(struct platform_device *pdev) 391 + static int nxp_stm_timer_probe(struct platform_device *pdev) 390 392 { 391 393 struct stm_timer *stm_timer; 392 394 struct device *dev = &pdev->dev; ··· 482 484 }; 483 485 MODULE_DEVICE_TABLE(of, nxp_stm_of_match); 484 486 485 - static struct platform_driver nxp_stm_probe = { 487 + static struct platform_driver nxp_stm_driver = { 486 488 .probe = nxp_stm_timer_probe, 487 489 .driver = { 488 490 .name = "nxp-stm", 489 491 .of_match_table = nxp_stm_of_match, 492 + .suppress_bind_attrs = true, 490 493 }, 491 494 }; 492 - module_platform_driver(nxp_stm_probe); 495 + builtin_platform_driver(nxp_stm_driver); 493 496 494 497 MODULE_DESCRIPTION("NXP System Timer Module driver"); 495 498 MODULE_LICENSE("GPL");
+9 -2
drivers/clocksource/timer-ralink.c
··· 130 130 systick.dev.irq = irq_of_parse_and_map(np, 0); 131 131 if (!systick.dev.irq) { 132 132 pr_err("%pOFn: request_irq failed", np); 133 - return -EINVAL; 133 + ret = -EINVAL; 134 + goto err_iounmap; 134 135 } 135 136 136 137 ret = clocksource_mmio_init(systick.membase + SYSTICK_COUNT, np->name, 137 138 SYSTICK_FREQ, 301, 16, 138 139 clocksource_mmio_readl_up); 139 140 if (ret) 140 - return ret; 141 + goto err_free_irq; 141 142 142 143 clockevents_register_device(&systick.dev); 143 144 ··· 146 145 np, systick.dev.mult, systick.dev.shift); 147 146 148 147 return 0; 148 + 149 + err_free_irq: 150 + irq_dispose_mapping(systick.dev.irq); 151 + err_iounmap: 152 + iounmap(systick.membase); 153 + return ret; 149 154 } 150 155 151 156 TIMER_OF_DECLARE(systick, "ralink,cevt-systick", ralink_systick_init);
+8 -1
drivers/clocksource/timer-rda.c
··· 13 13 14 14 #include <linux/init.h> 15 15 #include <linux/interrupt.h> 16 + #include <linux/sched_clock.h> 16 17 17 18 #include "timer-of.h" 18 19 ··· 154 153 }, 155 154 }; 156 155 157 - static u64 rda_hwtimer_read(struct clocksource *cs) 156 + static u64 rda_hwtimer_clocksource_read(void) 158 157 { 159 158 void __iomem *base = timer_of_base(&rda_ostimer_of); 160 159 u32 lo, hi; ··· 166 165 } while (hi != readl_relaxed(base + RDA_HWTIMER_LOCKVAL_H)); 167 166 168 167 return ((u64)hi << 32) | lo; 168 + } 169 + 170 + static u64 rda_hwtimer_read(struct clocksource *cs) 171 + { 172 + return rda_hwtimer_clocksource_read(); 169 173 } 170 174 171 175 static struct clocksource rda_hwtimer_clocksource = { ··· 191 185 return ret; 192 186 193 187 clocksource_register_hz(&rda_hwtimer_clocksource, rate); 188 + sched_clock_register(rda_hwtimer_clocksource_read, 64, rate); 194 189 195 190 clockevents_config_and_register(&rda_ostimer_of.clkevt, rate, 196 191 0x2, UINT_MAX);
+150
drivers/clocksource/timer-realtek.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2025 Realtek Semiconductor Corp. 4 + */ 5 + 6 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 7 + 8 + #include <linux/irqflags.h> 9 + #include <linux/interrupt.h> 10 + #include "timer-of.h" 11 + 12 + #define ENBL 1 13 + #define DSBL 0 14 + 15 + #define SYSTIMER_RATE 1000000 16 + #define SYSTIMER_MIN_DELTA 0x64 17 + #define SYSTIMER_MAX_DELTA ULONG_MAX 18 + 19 + /* SYSTIMER Register Offset (RTK Internal Use) */ 20 + #define TS_LW_OFST 0x0 21 + #define TS_HW_OFST 0x4 22 + #define TS_CMP_VAL_LW_OFST 0x8 23 + #define TS_CMP_VAL_HW_OFST 0xC 24 + #define TS_CMP_CTRL_OFST 0x10 25 + #define TS_CMP_STAT_OFST 0x14 26 + 27 + /* SYSTIMER CMP CTRL REG Mask */ 28 + #define TS_CMP_EN_MASK 0x1 29 + #define TS_WR_EN0_MASK 0x2 30 + 31 + static void __iomem *systimer_base; 32 + 33 + static u64 rtk_ts64_read(void) 34 + { 35 + u32 low, high; 36 + u64 ts; 37 + 38 + /* Caution: Read LSB word (TS_LW_OFST) first then MSB (TS_HW_OFST) */ 39 + low = readl(systimer_base + TS_LW_OFST); 40 + high = readl(systimer_base + TS_HW_OFST); 41 + ts = ((u64)high << 32) | low; 42 + 43 + return ts; 44 + } 45 + 46 + static void rtk_cmp_value_write(u64 value) 47 + { 48 + u32 high, low; 49 + 50 + low = value & 0xFFFFFFFF; 51 + high = value >> 32; 52 + 53 + writel(high, systimer_base + TS_CMP_VAL_HW_OFST); 54 + writel(low, systimer_base + TS_CMP_VAL_LW_OFST); 55 + } 56 + 57 + static inline void rtk_cmp_en_write(bool cmp_en) 58 + { 59 + u32 val; 60 + 61 + val = TS_WR_EN0_MASK; 62 + if (cmp_en == ENBL) 63 + val |= TS_CMP_EN_MASK; 64 + 65 + writel(val, systimer_base + TS_CMP_CTRL_OFST); 66 + } 67 + 68 + static int rtk_syst_clkevt_next_event(unsigned long cycles, struct clock_event_device *clkevt) 69 + { 70 + u64 cmp_val; 71 + 72 + rtk_cmp_en_write(DSBL); 73 + cmp_val = rtk_ts64_read(); 74 + 75 + /* Set CMP value to current timestamp plus delta_us */ 76 + rtk_cmp_value_write(cmp_val + cycles); 77 + rtk_cmp_en_write(ENBL); 78 + return 0; 79 + } 80 + 81 + static irqreturn_t rtk_ts_match_intr_handler(int irq, void *dev_id) 82 + { 83 + struct clock_event_device *clkevt = dev_id; 84 + void __iomem *reg_base; 85 + u32 val; 86 + 87 + /* Disable TS CMP Match */ 88 + rtk_cmp_en_write(DSBL); 89 + 90 + /* Clear TS CMP INTR */ 91 + reg_base = systimer_base + TS_CMP_STAT_OFST; 92 + val = readl(reg_base) & TS_CMP_EN_MASK; 93 + writel(val | TS_CMP_EN_MASK, reg_base); 94 + clkevt->event_handler(clkevt); 95 + 96 + return IRQ_HANDLED; 97 + } 98 + 99 + static int rtk_syst_shutdown(struct clock_event_device *clkevt) 100 + { 101 + void __iomem *reg_base; 102 + u64 cmp_val = 0; 103 + 104 + /* Disable TS CMP Match */ 105 + rtk_cmp_en_write(DSBL); 106 + /* Set compare value to 0 */ 107 + rtk_cmp_value_write(cmp_val); 108 + 109 + /* Clear TS CMP INTR */ 110 + reg_base = systimer_base + TS_CMP_STAT_OFST; 111 + writel(TS_CMP_EN_MASK, reg_base); 112 + return 0; 113 + } 114 + 115 + static struct timer_of rtk_timer_to = { 116 + .flags = TIMER_OF_IRQ | TIMER_OF_BASE, 117 + 118 + .clkevt = { 119 + .name = "rtk-clkevt", 120 + .rating = 300, 121 + .cpumask = cpu_possible_mask, 122 + .features = CLOCK_EVT_FEAT_DYNIRQ | 123 + CLOCK_EVT_FEAT_ONESHOT, 124 + .set_next_event = rtk_syst_clkevt_next_event, 125 + .set_state_oneshot = rtk_syst_shutdown, 126 + .set_state_shutdown = rtk_syst_shutdown, 127 + }, 128 + 129 + .of_irq = { 130 + .flags = IRQF_TIMER | IRQF_IRQPOLL, 131 + .handler = rtk_ts_match_intr_handler, 132 + }, 133 + }; 134 + 135 + static int __init rtk_systimer_init(struct device_node *node) 136 + { 137 + int ret; 138 + 139 + ret = timer_of_init(node, &rtk_timer_to); 140 + if (ret) 141 + return ret; 142 + 143 + systimer_base = timer_of_base(&rtk_timer_to); 144 + clockevents_config_and_register(&rtk_timer_to.clkevt, SYSTIMER_RATE, 145 + SYSTIMER_MIN_DELTA, SYSTIMER_MAX_DELTA); 146 + 147 + return 0; 148 + } 149 + 150 + TIMER_OF_DECLARE(rtk_systimer, "realtek,rtd1625-systimer", rtk_systimer_init);
+24
drivers/clocksource/timer-sp804.c
··· 21 21 #include <linux/of_irq.h> 22 22 #include <linux/sched_clock.h> 23 23 24 + #ifdef CONFIG_ARM 25 + #include <linux/delay.h> 26 + #endif 27 + 24 28 #include "timer-sp.h" 25 29 26 30 /* Hisilicon 64-bit timer(a variant of ARM SP804) */ ··· 106 102 return ~readl_relaxed(sched_clkevt->value); 107 103 } 108 104 105 + #ifdef CONFIG_ARM 106 + static struct delay_timer delay; 107 + static unsigned long sp804_read_delay_timer_read(void) 108 + { 109 + return sp804_read(); 110 + } 111 + 112 + static void sp804_register_delay_timer(int freq) 113 + { 114 + delay.freq = freq; 115 + delay.read_current_timer = sp804_read_delay_timer_read; 116 + register_current_timer_delay(&delay); 117 + } 118 + #else 119 + static inline void sp804_register_delay_timer(int freq) {} 120 + #endif 121 + 109 122 static int __init sp804_clocksource_and_sched_clock_init(void __iomem *base, 110 123 const char *name, 111 124 struct clk *clk, ··· 134 113 rate = sp804_get_clock_rate(clk, name); 135 114 if (rate < 0) 136 115 return -EINVAL; 116 + 117 + sp804_register_delay_timer(rate); 137 118 138 119 clkevt = sp804_clkevt_get(base); 139 120 ··· 341 318 if (ret) 342 319 goto err; 343 320 } 321 + 344 322 initialized = true; 345 323 346 324 return 0;
+18 -6
drivers/clocksource/timer-sprd.c
··· 30 30 #define TIMER_VALUE_SHDW_HI 0x1c 31 31 32 32 #define TIMER_VALUE_LO_MASK GENMASK(31, 0) 33 + #define TIMER_VALUE_HI_MASK GENMASK(31, 0) 33 34 34 35 static void sprd_timer_enable(void __iomem *base, u32 flag) 35 36 { ··· 163 162 164 163 static u64 sprd_suspend_timer_read(struct clocksource *cs) 165 164 { 166 - return ~(u64)readl_relaxed(timer_of_base(&suspend_to) + 167 - TIMER_VALUE_SHDW_LO) & cs->mask; 165 + u32 lo, hi; 166 + 167 + do { 168 + hi = readl_relaxed(timer_of_base(&suspend_to) + 169 + TIMER_VALUE_SHDW_HI); 170 + lo = readl_relaxed(timer_of_base(&suspend_to) + 171 + TIMER_VALUE_SHDW_LO); 172 + } while (hi != readl_relaxed(timer_of_base(&suspend_to) + TIMER_VALUE_SHDW_HI)); 173 + 174 + return ~(((u64)hi << 32) | lo); 168 175 } 169 176 170 177 static int sprd_suspend_timer_enable(struct clocksource *cs) 171 178 { 172 - sprd_timer_update_counter(timer_of_base(&suspend_to), 173 - TIMER_VALUE_LO_MASK); 174 - sprd_timer_enable(timer_of_base(&suspend_to), TIMER_CTL_PERIOD_MODE); 179 + writel_relaxed(TIMER_VALUE_LO_MASK, 180 + timer_of_base(&suspend_to) + TIMER_LOAD_LO); 181 + writel_relaxed(TIMER_VALUE_HI_MASK, 182 + timer_of_base(&suspend_to) + TIMER_LOAD_HI); 183 + sprd_timer_enable(timer_of_base(&suspend_to), 184 + TIMER_CTL_PERIOD_MODE|TIMER_CTL_64BIT_WIDTH); 175 185 176 186 return 0; 177 187 } ··· 198 186 .read = sprd_suspend_timer_read, 199 187 .enable = sprd_suspend_timer_enable, 200 188 .disable = sprd_suspend_timer_disable, 201 - .mask = CLOCKSOURCE_MASK(32), 189 + .mask = CLOCKSOURCE_MASK(64), 202 190 .flags = CLOCK_SOURCE_IS_CONTINUOUS | CLOCK_SOURCE_SUSPEND_NONSTOP, 203 191 }; 204 192
-1
drivers/clocksource/timer-stm32-lp.c
··· 289 289 }; 290 290 module_platform_driver(stm32_clkevent_lp_driver); 291 291 292 - MODULE_ALIAS("platform:stm32-lptimer-timer"); 293 292 MODULE_DESCRIPTION("STMicroelectronics STM32 clockevent low power driver");