diff --git a/arch/Kconfig b/arch/Kconfig index 066263cc44fe..de39e65a9a0f 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -377,6 +377,9 @@ config ARCH_HAS_DMA_CLEAR_UNCACHED config ARCH_HAS_CPU_FINALIZE_INIT bool +config ARCH_HAS_DELAY_TIMER + bool + # The architecture has a per-task state that includes the mm's PASID config ARCH_HAS_CPU_PASID bool diff --git a/arch/alpha/include/asm/timex.h b/arch/alpha/include/asm/timex.h index f89798da8a14..5a71ba6136b9 100644 --- a/arch/alpha/include/asm/timex.h +++ b/arch/alpha/include/asm/timex.h @@ -7,10 +7,6 @@ #ifndef _ASMALPHA_TIMEX_H #define _ASMALPHA_TIMEX_H -/* With only one or two oddballs, we use the RTC as the ticker, selecting - the 32.768kHz reference clock, which nicely divides down to our HZ. */ -#define CLOCK_TICK_RATE 32768 - /* * Standard way to access the cycle counter. * Currently only used on SMP for scheduling. diff --git a/arch/arc/include/asm/timex.h b/arch/arc/include/asm/timex.h deleted file mode 100644 index 48b3482bc97f..000000000000 --- a/arch/arc/include/asm/timex.h +++ /dev/null @@ -1,15 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) - */ - -#ifndef _ASM_ARC_TIMEX_H -#define _ASM_ARC_TIMEX_H - -#define CLOCK_TICK_RATE 80000000 /* slated to be removed */ - -#include - -/* XXX: get_cycles() to be implemented with RTSC insn */ - -#endif /* _ASM_ARC_TIMEX_H */ diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 9187240a02db..7788949992f4 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -11,6 +11,7 @@ config ARM select ARCH_HAS_CPU_FINALIZE_INIT if MMU select ARCH_HAS_CURRENT_STACK_POINTER select ARCH_HAS_DEBUG_VIRTUAL if MMU + select ARCH_HAS_DELAY_TIMER select ARCH_HAS_DMA_ALLOC if MMU select ARCH_HAS_DMA_OPS select ARCH_HAS_DMA_WRITE_COMBINE if !ARM_DMA_MEM_BUFFERABLE diff --git a/arch/arm/include/asm/delay.h b/arch/arm/include/asm/delay.h index 1d069e558d8d..d2231deb90fa 100644 --- a/arch/arm/include/asm/delay.h +++ b/arch/arm/include/asm/delay.h @@ -91,7 +91,6 @@ extern void __loop_udelay(unsigned long usecs); extern void __loop_const_udelay(unsigned long); /* Delay-loop timer registration. */ -#define ARCH_HAS_READ_CURRENT_TIMER extern void register_current_timer_delay(const struct delay_timer *timer); #endif /* __ASSEMBLY__ */ diff --git a/arch/arm/include/asm/timex.h b/arch/arm/include/asm/timex.h index 6d1337c169cd..94e40c19cfc5 100644 --- a/arch/arm/include/asm/timex.h +++ b/arch/arm/include/asm/timex.h @@ -10,7 +10,10 @@ #define _ASMARM_TIMEX_H typedef unsigned long cycles_t; -#define get_cycles() ({ cycles_t c; read_current_timer(&c) ? 0 : c; }) +// Temporary workaround until timex.h is cleaned up +bool delay_read_timer(unsigned long *t); + +#define get_cycles() ({ cycles_t c; delay_read_timer(&c) ? 0 : c; }) #define random_get_entropy() (((unsigned long)get_cycles()) ?: random_get_entropy_fallback()) #endif diff --git a/arch/arm/lib/delay.c b/arch/arm/lib/delay.c index b7fe84f68bf1..7e9304012a68 100644 --- a/arch/arm/lib/delay.c +++ b/arch/arm/lib/delay.c @@ -12,7 +12,6 @@ #include #include #include -#include /* * Default to the loop-based delay implementation. @@ -27,15 +26,14 @@ static const struct delay_timer *delay_timer; static bool delay_calibrated; static u64 delay_res; -int read_current_timer(unsigned long *timer_val) +bool delay_read_timer(unsigned long *timer_val) { if (!delay_timer) - return -ENXIO; - + return false; *timer_val = delay_timer->read_current_timer(); - return 0; + return true; } -EXPORT_SYMBOL_GPL(read_current_timer); +EXPORT_SYMBOL_GPL(delay_read_timer); static inline u64 cyc_to_ns(u64 cyc, u32 mult, u32 shift) { diff --git a/arch/arm/mach-omap1/Kconfig b/arch/arm/mach-omap1/Kconfig index b114f7ca2173..2a724aa6674c 100644 --- a/arch/arm/mach-omap1/Kconfig +++ b/arch/arm/mach-omap1/Kconfig @@ -74,7 +74,7 @@ config OMAP_32K_TIMER currently only available for OMAP16XX, 24XX, 34XX, OMAP4/5 and DRA7XX. On OMAP2PLUS this value is only used for CONFIG_HZ and - CLOCK_TICK_RATE compile time calculation. + timer frequency compile time calculation. The actual timer selection is done in the board file through the (DT_)MACHINE_START structure. diff --git a/arch/hexagon/Kconfig b/arch/hexagon/Kconfig index d987ba368ed6..b48491140013 100644 --- a/arch/hexagon/Kconfig +++ b/arch/hexagon/Kconfig @@ -5,6 +5,7 @@ comment "Linux Kernel Configuration for Hexagon" config HEXAGON def_bool y select ARCH_32BIT_OFF_T + select ARCH_HAS_DELAY_TIMER select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_NO_PREEMPT select ARCH_WANT_FRAME_POINTERS diff --git a/arch/hexagon/include/asm/timex.h b/arch/hexagon/include/asm/timex.h deleted file mode 100644 index dfe69e118b2b..000000000000 --- a/arch/hexagon/include/asm/timex.h +++ /dev/null @@ -1,23 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. - */ - -#ifndef _ASM_TIMEX_H -#define _ASM_TIMEX_H - -#include -#include - -/* Using TCX0 as our clock. CLOCK_TICK_RATE scheduled to be removed. */ -#define CLOCK_TICK_RATE 19200 - -#define ARCH_HAS_READ_CURRENT_TIMER - -static inline int read_current_timer(unsigned long *timer_val) -{ - *timer_val = __vmgettime(); - return 0; -} - -#endif diff --git a/arch/hexagon/kernel/time.c b/arch/hexagon/kernel/time.c index 6f851e1cd4ee..05c5d6c96d96 100644 --- a/arch/hexagon/kernel/time.c +++ b/arch/hexagon/kernel/time.c @@ -6,6 +6,7 @@ */ #include +#include #include #include #include @@ -17,7 +18,6 @@ #include #include -#include #include #include @@ -231,3 +231,9 @@ void __udelay(unsigned long usecs) cpu_relax(); /* not sure how this improves readability */ } EXPORT_SYMBOL(__udelay); + +bool delay_read_timer(unsigned long *timer_val) +{ + *timer_val = __vmgettime(); + return true; +} diff --git a/arch/m68k/include/asm/timex.h b/arch/m68k/include/asm/timex.h index f4a7a340f4ca..b58115f3a282 100644 --- a/arch/m68k/include/asm/timex.h +++ b/arch/m68k/include/asm/timex.h @@ -7,21 +7,6 @@ #ifndef _ASMm68K_TIMEX_H #define _ASMm68K_TIMEX_H -#ifdef CONFIG_COLDFIRE -/* - * CLOCK_TICK_RATE should give the underlying frequency of the tick timer - * to make ntp work best. For Coldfires, that's the main clock. - */ -#include -#define CLOCK_TICK_RATE MCF_CLK -#else -/* - * This default CLOCK_TICK_RATE is probably wrong for many 68k boards - * Users of those boards will need to check and modify accordingly - */ -#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ -#endif - typedef unsigned long cycles_t; static inline cycles_t get_cycles(void) diff --git a/arch/microblaze/include/asm/timex.h b/arch/microblaze/include/asm/timex.h deleted file mode 100644 index e99cc29cbe57..000000000000 --- a/arch/microblaze/include/asm/timex.h +++ /dev/null @@ -1,13 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Copyright (C) 2006 Atmark Techno, Inc. - */ - -#ifndef _ASM_MICROBLAZE_TIMEX_H -#define _ASM_MICROBLAZE_TIMEX_H - -#include - -#define CLOCK_TICK_RATE 1000 /* Timer input freq. */ - -#endif /* _ASM_TIMEX_H */ diff --git a/arch/mips/include/asm/timex.h b/arch/mips/include/asm/timex.h index 7ef06dcdc46e..daedc62f0fb8 100644 --- a/arch/mips/include/asm/timex.h +++ b/arch/mips/include/asm/timex.h @@ -18,14 +18,6 @@ #include #include -/* - * This is the clock rate of the i8253 PIT. A MIPS system may not have - * a PIT by the symbol is used all over the kernel including some APIs. - * So keeping it defined to the number for the PIT is the only sane thing - * for now. - */ -#define CLOCK_TICK_RATE 1193182 - /* * Standard way to access the cycle counter. * Currently only used on SMP for scheduling. diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig index 9156635dd264..5eb995c13074 100644 --- a/arch/openrisc/Kconfig +++ b/arch/openrisc/Kconfig @@ -7,6 +7,7 @@ config OPENRISC def_bool y select ARCH_32BIT_OFF_T + select ARCH_HAS_DELAY_TIMER select ARCH_HAS_DMA_SET_UNCACHED select ARCH_HAS_DMA_CLEAR_UNCACHED select ARCH_HAS_SYNC_DMA_FOR_DEVICE diff --git a/arch/openrisc/include/asm/timex.h b/arch/openrisc/include/asm/timex.h index 5487fa93dd9b..574e80e6d1f3 100644 --- a/arch/openrisc/include/asm/timex.h +++ b/arch/openrisc/include/asm/timex.h @@ -25,9 +25,4 @@ static inline cycles_t get_cycles(void) } #define get_cycles get_cycles -/* This isn't really used any more */ -#define CLOCK_TICK_RATE 1000 - -#define ARCH_HAS_READ_CURRENT_TIMER - #endif diff --git a/arch/openrisc/lib/delay.c b/arch/openrisc/lib/delay.c index 5e89e4131304..661f9f8f6292 100644 --- a/arch/openrisc/lib/delay.c +++ b/arch/openrisc/lib/delay.c @@ -13,18 +13,17 @@ */ #include +#include #include #include -#include + #include -#include -#include #include -int read_current_timer(unsigned long *timer_value) +bool delay_read_timer(unsigned long *timer_value) { *timer_value = get_cycles(); - return 0; + return true; } void __delay(unsigned long cycles) diff --git a/arch/parisc/include/asm/timex.h b/arch/parisc/include/asm/timex.h index b4622cb06a75..453468ba4e3a 100644 --- a/arch/parisc/include/asm/timex.h +++ b/arch/parisc/include/asm/timex.h @@ -9,8 +9,6 @@ #include -#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ - typedef unsigned long cycles_t; static inline cycles_t get_cycles(void) diff --git a/arch/powerpc/include/asm/timex.h b/arch/powerpc/include/asm/timex.h index 14b4489de52c..b48b78e47958 100644 --- a/arch/powerpc/include/asm/timex.h +++ b/arch/powerpc/include/asm/timex.h @@ -11,8 +11,6 @@ #include #include -#define CLOCK_TICK_RATE 1024000 /* Underlying HZ */ - typedef unsigned long cycles_t; static inline cycles_t get_cycles(void) diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index f7028caaeae0..aa98bbdfabfb 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -29,6 +29,7 @@ config RISCV select ARCH_HAS_DEBUG_VIRTUAL if MMU select ARCH_HAS_DEBUG_VM_PGTABLE select ARCH_HAS_DEBUG_WX + select ARCH_HAS_DELAY_TIMER select ARCH_HAS_ELF_CORE_EFLAGS if BINFMT_ELF && ELF_CORE select ARCH_HAS_FAST_MULTIPLIER select ARCH_HAS_FORTIFY_SOURCE diff --git a/arch/riscv/include/asm/timex.h b/arch/riscv/include/asm/timex.h index d41acfb3959d..f660afa30530 100644 --- a/arch/riscv/include/asm/timex.h +++ b/arch/riscv/include/asm/timex.h @@ -80,12 +80,4 @@ static inline u64 get_cycles64(void) return ((u64)hi << 32) | lo; } #endif /* CONFIG_64BIT */ - -#define ARCH_HAS_READ_CURRENT_TIMER -static inline int read_current_timer(unsigned long *timer_val) -{ - *timer_val = get_cycles(); - return 0; -} - #endif /* _ASM_RISCV_TIMEX_H */ diff --git a/arch/riscv/lib/delay.c b/arch/riscv/lib/delay.c index 49d510ba75fd..bd9b3825656f 100644 --- a/arch/riscv/lib/delay.c +++ b/arch/riscv/lib/delay.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include @@ -109,3 +108,9 @@ void ndelay(unsigned long nsecs) __delay(ncycles >> NDELAY_SHIFT); } EXPORT_SYMBOL(ndelay); + +bool delay_read_timer(unsigned long *timer_val) +{ + *timer_val = get_cycles(); + return true; +} diff --git a/arch/s390/include/asm/timex.h b/arch/s390/include/asm/timex.h index ac3ab6c29912..23421b6eb225 100644 --- a/arch/s390/include/asm/timex.h +++ b/arch/s390/include/asm/timex.h @@ -159,8 +159,6 @@ static inline void local_tick_enable(unsigned long comp) set_clock_comparator(get_lowcore()->clock_comparator); } -#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ - typedef unsigned long cycles_t; static __always_inline unsigned long get_tod_clock(void) diff --git a/arch/sh/include/asm/timex.h b/arch/sh/include/asm/timex.h deleted file mode 100644 index f53f95bf4288..000000000000 --- a/arch/sh/include/asm/timex.h +++ /dev/null @@ -1,24 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * linux/include/asm-sh/timex.h - * - * sh architecture timex specifications - */ -#ifndef __ASM_SH_TIMEX_H -#define __ASM_SH_TIMEX_H - -/* - * Only parts using the legacy CPG code for their clock framework - * implementation need to define their own Pclk value. If provided, this - * can be used for accurately setting CLOCK_TICK_RATE, otherwise we - * simply fall back on the i8253 PIT value. - */ -#ifdef CONFIG_SH_PCLK_FREQ -#define CLOCK_TICK_RATE (CONFIG_SH_PCLK_FREQ / 4) /* Underlying HZ */ -#else -#define CLOCK_TICK_RATE 1193180 -#endif - -#include - -#endif /* __ASM_SH_TIMEX_H */ diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 0e9c906c4b5d..a979a4be79a9 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -70,6 +70,7 @@ config SPARC32 config SPARC64 def_bool 64BIT select ALTERNATE_USER_ADDRESS_SPACE + select ARCH_HAS_DELAY_TIMER select HAVE_FUNCTION_TRACER select HAVE_FUNCTION_GRAPH_TRACER select HAVE_KRETPROBES diff --git a/arch/sparc/include/asm/timex.h b/arch/sparc/include/asm/timex.h index 9aac26b1f45f..f0f980581590 100644 --- a/arch/sparc/include/asm/timex.h +++ b/arch/sparc/include/asm/timex.h @@ -4,6 +4,6 @@ #if defined(__sparc__) && defined(__arch64__) #include #else -#include +#include #endif #endif diff --git a/arch/sparc/include/asm/timex_32.h b/arch/sparc/include/asm/timex_32.h deleted file mode 100644 index f86326a6f89e..000000000000 --- a/arch/sparc/include/asm/timex_32.h +++ /dev/null @@ -1,14 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * linux/include/asm/timex.h - * - * sparc architecture timex specifications - */ -#ifndef _ASMsparc_TIMEX_H -#define _ASMsparc_TIMEX_H - -#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ - -#include - -#endif diff --git a/arch/sparc/include/asm/timex_64.h b/arch/sparc/include/asm/timex_64.h index 076c44f6845d..fa004ef3bb9a 100644 --- a/arch/sparc/include/asm/timex_64.h +++ b/arch/sparc/include/asm/timex_64.h @@ -9,12 +9,8 @@ #include -#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ - /* Getting on the cycle counter on sparc64. */ typedef unsigned long cycles_t; #define get_cycles() tick_ops->get_tick() -#define ARCH_HAS_READ_CURRENT_TIMER - #endif diff --git a/arch/sparc/kernel/time_64.c b/arch/sparc/kernel/time_64.c index 87b267043ccd..b1c54ab4b15b 100644 --- a/arch/sparc/kernel/time_64.c +++ b/arch/sparc/kernel/time_64.c @@ -894,8 +894,8 @@ unsigned long long sched_clock(void) return ((get_tick() * quotient) >> SPARC64_NSEC_PER_CYC_SHIFT) - offset; } -int read_current_timer(unsigned long *timer_val) +bool delay_read_timer(unsigned long *timer_val) { *timer_val = get_tick(); - return 0; + return true; } diff --git a/arch/um/include/asm/timex.h b/arch/um/include/asm/timex.h deleted file mode 100644 index 9f27176adb26..000000000000 --- a/arch/um/include/asm/timex.h +++ /dev/null @@ -1,9 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __UM_TIMEX_H -#define __UM_TIMEX_H - -#define CLOCK_TICK_RATE (HZ) - -#include - -#endif diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 0b893e223bd3..3683a7c6f5cb 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -80,6 +80,7 @@ config X86 select ARCH_HAS_CURRENT_STACK_POINTER select ARCH_HAS_DEBUG_VIRTUAL select ARCH_HAS_DEBUG_VM_PGTABLE if !X86_PAE + select ARCH_HAS_DELAY_TIMER select ARCH_HAS_DEVMEM_IS_ALLOWED select ARCH_HAS_DMA_OPS if GART_IOMMU || XEN select ARCH_HAS_EARLY_DEBUG if KGDB diff --git a/arch/x86/include/asm/timex.h b/arch/x86/include/asm/timex.h index 6e57e3c0fdd2..f397072cf294 100644 --- a/arch/x86/include/asm/timex.h +++ b/arch/x86/include/asm/timex.h @@ -13,9 +13,4 @@ static inline unsigned long random_get_entropy(void) } #define random_get_entropy random_get_entropy -/* Assume we use the PIT time source for the clock tick */ -#define CLOCK_TICK_RATE PIT_TICK_RATE - -#define ARCH_HAS_READ_CURRENT_TIMER - #endif /* _ASM_X86_TIMEX_H */ diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index fca42b178b3c..1cc4aa65930c 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -1267,7 +1267,7 @@ void __init setup_arch(char **cmdline_p) mcheck_init(); - register_refined_jiffies(CLOCK_TICK_RATE); + register_refined_jiffies(PIT_TICK_RATE); #ifdef CONFIG_EFI if (efi_enabled(EFI_BOOT)) diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c index eb2d2e1cbddd..70ad000e91e7 100644 --- a/arch/x86/lib/delay.c +++ b/arch/x86/lib/delay.c @@ -14,12 +14,10 @@ #include #include -#include #include #include #include -#include #include #include @@ -189,13 +187,13 @@ void use_mwaitx_delay(void) delay_fn = delay_halt; } -int read_current_timer(unsigned long *timer_val) +bool delay_read_timer(unsigned long *timer_val) { if (delay_fn == delay_tsc) { *timer_val = rdtsc(); - return 0; + return true; } - return -1; + return false; } void __delay(unsigned long loops) diff --git a/include/asm-generic/timex.h b/include/asm-generic/timex.h index 50ba9b5ce983..2032fda7052c 100644 --- a/include/asm-generic/timex.h +++ b/include/asm-generic/timex.h @@ -13,11 +13,4 @@ static inline cycles_t get_cycles(void) } #endif -/* - * Architectures are encouraged to implement read_current_timer - * and define this in order to avoid the expensive delay loop - * calibration during boot. - */ -#undef ARCH_HAS_READ_CURRENT_TIMER - #endif /* __ASM_GENERIC_TIMEX_H */ diff --git a/include/linux/delay.h b/include/linux/delay.h index 68b2a69dd24d..82409e55b6ae 100644 --- a/include/linux/delay.h +++ b/include/linux/delay.h @@ -17,6 +17,8 @@ extern unsigned long loops_per_jiffy; #include +bool delay_read_timer(unsigned long *t); + /* * Using udelay() for intervals greater than a few milliseconds can * risk overflow for high loops_per_jiffy (high bogomips) machines. The diff --git a/include/linux/timex.h b/include/linux/timex.h index 4ee32eff3f22..7014ccc638fc 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h @@ -156,8 +156,6 @@ extern int do_clock_adjtime(const clockid_t which_clock, struct __kernel_timex * extern void hardpps(const struct timespec64 *, const struct timespec64 *); -int read_current_timer(unsigned long *timer_val); - /* The clock frequency of the i8253/i8254 PIT */ #define PIT_TICK_RATE 1193182ul diff --git a/init/calibrate.c b/init/calibrate.c index 63be4c65bc52..2bfe97034e42 100644 --- a/init/calibrate.c +++ b/init/calibrate.c @@ -13,7 +13,6 @@ #include #include #include -#include unsigned long lpj_fine; unsigned long preset_lpj; @@ -25,9 +24,9 @@ static int __init lpj_setup(char *str) __setup("lpj=", lpj_setup); -#ifdef ARCH_HAS_READ_CURRENT_TIMER +#ifdef CONFIG_ARCH_HAS_DELAY_TIMER -/* This routine uses the read_current_timer() routine and gets the +/* This routine uses the delay_read_timer() routine and gets the * loops per jiffy directly, instead of guessing it using delay(). * Also, this code tries to handle non-maskable asynchronous events * (like SMIs) @@ -48,13 +47,13 @@ static unsigned long calibrate_delay_direct(void) int min = -1; int i; - if (read_current_timer(&pre_start) < 0 ) + if (!delay_read_timer(&pre_start)) return 0; /* * A simple loop like * while ( jiffies < start_jiffies+1) - * start = read_current_timer(); + * start = delay_read_timer(); * will not do. As we don't really know whether jiffy switch * happened first or timer_value was read first. And some asynchronous * event can happen between these two events introducing errors in lpj. @@ -72,22 +71,22 @@ static unsigned long calibrate_delay_direct(void) for (i = 0; i < MAX_DIRECT_CALIBRATION_RETRIES; i++) { pre_start = 0; - read_current_timer(&start); + delay_read_timer(&start); start_jiffies = jiffies; while (time_before_eq(jiffies, start_jiffies + 1)) { pre_start = start; - read_current_timer(&start); + delay_read_timer(&start); } - read_current_timer(&post_start); + delay_read_timer(&post_start); pre_end = 0; end = post_start; while (time_before_eq(jiffies, start_jiffies + 1 + DELAY_CALIBRATION_TICKS)) { pre_end = end; - read_current_timer(&end); + delay_read_timer(&end); } - read_current_timer(&post_end); + delay_read_timer(&post_end); timer_rate_max = (post_end - pre_start) / DELAY_CALIBRATION_TICKS;