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.
Signed-off-by: Andrew Ruder <andrew.ruder@elecsyscorp.com>
Cc: Marek Vasut <marex@denx.de>
Cc: Tom Rini <trini@konsuiko.com>
This commit is contained in:
parent
07a8e6d6ee
commit
7d211fec96
@ -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;
|
||||
}
|
||||
|
25
arch/arm/include/asm/arch-pxa/config.h
Normal file
25
arch/arm/include/asm/arch-pxa/config.h
Normal file
@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Andrew Ruder <andrew.ruder@elecsyscorp.com>
|
||||
*
|
||||
* 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_ */
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user