arm: pxa: use common timer functions
PATCH 1/1 arm: pxa: use common timer functions
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.
---
Tom,
You had asked me to fix up this patch back on August 30, 2014. It broke compilation on some PXA ports. I have compile-tested on every PXA board in the tree, I believe. I have tested it on a yet-to-be-upstreamed board port based on the PXA270.
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
@@ -19,7 +19,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.4
PATCH 1/1 arm: pxa: use common timer functions
Tom,
Just replying so you see this since apparently I should have used copy-paste on your e-mail address for the Cc: and not attempted to read after 45 cups of tea.
- Andy
PATCH 1/1 arm: pxa: use common timer functions
In reply to Andrew RuderQuoted 11 lines · Andrew Ruder
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 ofget_ticks().get_ticks()returned a 32-bit value cast up to a 64-bit value. Ifget_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.
Quoted 3 lines
Signed-off-by Andrew Ruder <[email protected]>Cc Marek Vasut <[email protected]>Cc Tom Rini <[email protected]>
Applied to u-boot-pxa/master, thanks.
Best regards,
Marek Vasut