arm: pxa: use common timer functions
PATCH v2 1/1 arm: pxa: use common timer functions
From: Andrew Ruder <[email protected]>
This patch moves pxa to the common timer functions added in commit
8dfafdd - Introduce common timer functions <Rob Herring>
The (removed) pxa timer code (specifically __udelay()) could deadlock at the 32-bit boundary of get_ticks(). get_ticks() returned a 32-bit value cast up to a 64-bit value. If get_ticks() + tmo in __udelay() crossed the 32-bit boundary, the while condition became unconditionally true and locked the processor. Rather than patch the specific pxa issues, simply move everything over to the common code.
---
FIRST VERSION AVAILABLE AT:
http://article.gmane.org/gmane.comp.boot-loaders.u-boot/192978
I missed some compile-testing last time and didn't notice that not every board includes configs/pxa-common.h. Rather than try to fix-up every board config (and possibly break out of tree ones, etc.), add a PXA-specific config.h. In any case, it must be something included via common.h as the generic time framework requires the CONFIG_SYS_TIMER_COUNTER definition.
One potential gotcha here is that now pxa-regs gets included via common.h which adds lots of short register names to the global namespace. Compile-tested every PXA board from the generated boards.cfg and didn't see any issues. Board-tested the PXA270.
checkpatch output:
total: 0 errors, 0 warnings, 0 checks, 75 lines checked
NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE NETWORKING_BLOCK_COMMENT_STYLE USLEEP_RANGE
0001-arm-pxa-use-common-timer-functions.patch has no obvious style problems and is ready for submission.
arch/arm/cpu/pxa/timer.c | 69 +--------------------------------- arch/arm/include/asm/arch-pxa/config.h | 25 ++++++++++++ arch/arm/include/asm/config.h | 5 ++- 3 files changed, 30 insertions(+), 69 deletions(-) create mode 100644 arch/arm/include/asm/arch-pxa/config.h
arch/arm/cpu/pxa/timer.c +1 -68
@@ -6,80 +6,13 @@* SPDX-License-Identifier: GPL-2.0+ */ -#include <asm/arch/pxa-regs.h> #include <asm/io.h> #include <common.h> -#include <div64.h> DECLARE_GLOBAL_DATA_PTR ; -#define TIMER_LOAD_VAL 0xffffffff - -#define timestamp (gd->arch.tbl) -#define lastinc (gd->arch.lastinc) - -#if defined(CONFIG_CPU_PXA27X ) || defined(CONFIG_CPU_MONAHANS ) -#define TIMER_FREQ_HZ 3250000 -#elif defined(CONFIG_CPU_PXA25X ) -#define TIMER_FREQ_HZ 3686400 -#else -#error "Timer frequency unknown - please config PXA CPU type" -#endif - -static unsigned long long tick_to_time (unsigned long long tick) -{ -return lldiv (tick *CONFIG_SYS_HZ ,TIMER_FREQ_HZ ); -} - -static unsigned long long us_to_tick (unsigned long long us) -{ -return lldiv (us *TIMER_FREQ_HZ ,1000000 ); -} -int timer_init (void ) { -writel (0 ,OSCR ); +writel (0 ,CONFIG_SYS_TIMER_COUNTER );return 0 ; } - -unsigned long long get_ticks (void ) -{ -/* Current tick value */ -uint32_t now =readl (OSCR ); - -if (now >= lastinc) { -/* -* Normal mode (non roll) -* Move stamp forward with absolute diff ticks -*/ - timestamp += (now - lastinc); - }else { -/* We have rollover of incrementer */ - timestamp += (TIMER_LOAD_VAL - lastinc) + now; - } - - lastinc = now; -return timestamp; -} - -ulong get_timer (ulong base) -{ -return tick_to_time (get_ticks ()) - base; -} - -void __udelay (unsigned long usec) -{ -unsigned long long tmp; -ulong tmo; - - tmo =us_to_tick (usec); - tmp =get_ticks () + tmo;/* get current timestamp */ - -while (get_ticks () < tmp)/* loop till event */ -/*NOP*/ ; -} - -ulong get_tbclk (void ) -{ -return TIMER_FREQ_HZ ; -}
arch/arm/include/asm/arch-pxa/config.h new file +25 -0
@@ -0,0 +1,25 @@ +/* +* Copyright (C) 2014 Andrew Ruder <[email protected]> +* +* SPDX-License-Identifier: GPL-2.0+ +*/ + +#ifndef _ASM_ARM_PXA_CONFIG_ +#define _ASM_ARM_PXA_CONFIG_ + +#include <asm/arch/pxa-regs.h> + +/* +* Generic timer support +*/ +#if defined(CONFIG_CPU_PXA27X ) || defined(CONFIG_CPU_MONAHANS ) +#define CONFIG_SYS_TIMER_RATE 3250000 +#elif defined(CONFIG_CPU_PXA25X ) +#define CONFIG_SYS_TIMER_RATE 3686400 +#else +#error "Timer frequency unknown - please config PXA CPU type" +#endif + +#define CONFIG_SYS_TIMER_COUNTER OSCR + +#endif /* _ASM_ARM_PXA_CONFIG_ */
arch/arm/include/asm/config.h +4 -1
@@ -23,7 +23,10 @@#include <asm/arch-fsl-lsch3/config.h> #endif -#ifdef CONFIG_LS102XA +#if defined(CONFIG_LS102XA ) || \ + defined(CONFIG_CPU_PXA27X ) || \ + defined(CONFIG_CPU_MONAHANS ) || \ + defined(CONFIG_CPU_PXA25X )#include <asm/arch/config.h> #endif
Signature · 1 line
2.1.1
PATCH v2 1/1 arm: pxa: use common timer functions
Please ignore this one as it has the messed up From: line without the author name. Sorry for the noise.
- Andy