Dear Michal Simek, [...]
> +#include <config.h> > +#include <linux/linkage.h> > + > +ENTRY(lowlevel_init) > + mov pc, lr > +ENDPROC(lowlevel_init) inline void lowlevel_init(void) {} works as well and you don't need the assembly file. > diff --git a/arch/arm/cpu/armv7/zynq/timer.c > b/arch/arm/cpu/armv7/zynq/timer.c new file mode 100644 > index 0000000..0252220 > --- /dev/null > +++ b/arch/arm/cpu/armv7/zynq/timer.c > @@ -0,0 +1,151 @@ > +/* > + * Copyright (C) 2012 Michal Simek <mon...@monstr.eu> > + * Copyright (C) 2011-2012 Xilinx, Inc. All rights reserved. > + * > + * (C) Copyright 2008 > + * Guennadi Liakhovetki, DENX Software Engineering, <l...@denx.de> > + * > + * (C) Copyright 2004 > + * Philippe Robin, ARM Ltd. <philippe.ro...@arm.com> > + * > + * (C) Copyright 2002-2004 > + * Gary Jennejohn, DENX Software Engineering, <g...@denx.de> > + * > + * (C) Copyright 2003 > + * Texas Instruments <www.ti.com> > + * > + * (C) Copyright 2002 > + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> > + * Marius Groeger <mgroe...@sysgo.de> > + * > + * (C) Copyright 2002 > + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> > + * Alex Zuepke <a...@sysgo.de> > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > + * MA 02111-1307 USA > + */ > + > +#include <common.h> > +#include <div64.h> > +#include <asm/io.h> > + > +DECLARE_GLOBAL_DATA_PTR; > + > +struct scu_timer { > + u32 load; /* Timer Load Register */ > + u32 counter; /* Timer Counter Register */ > + u32 control; /* Timer Control Register */ > +}; > + > +static struct scu_timer *timer_base = CONFIG_SCUTIMER_BASEADDR; > + > +#define SCUTIMER_CONTROL_PRESCALER_MASK 0x0000FF00 /* Prescaler */ > +#define SCUTIMER_CONTROL_PRESCALER_SHIFT 8 > +#define SCUTIMER_CONTROL_AUTO_RELOAD_MASK 0x00000002 /* Auto-reload */ > +#define SCUTIMER_CONTROL_ENABLE_MASK 0x00000001 /* Timer enable */ > + > +#define TIMER_LOAD_VAL 0xFFFFFFFF > +#define TIMER_PRESCALE 255 > +#define TIMER_TICK_HZ (CONFIG_CPU_FREQ_HZ / 2 / TIMER_PRESCALE) > + > +int timer_init(void) > +{ > + u32 val; > + > + /* Load the timer counter register */ > + writel(0xFFFFFFFF, &timer_base->counter); > + > + /* Start the A9Timer device */ > + val = readl(&timer_base->control); > + /* Enable Auto reload mode */ > + val |= SCUTIMER_CONTROL_AUTO_RELOAD_MASK; > + /* Clear prescaler control bits */ > + val &= ~SCUTIMER_CONTROL_PRESCALER_MASK; > + /* Set prescaler value */ > + val |= (TIMER_PRESCALE << SCUTIMER_CONTROL_PRESCALER_SHIFT); > + /* Enable the decrementer */ > + val |= SCUTIMER_CONTROL_ENABLE_MASK; > + writel(val, &timer_base->control); clrsetbits_le32() > + /* Reset time */ > + gd->lastinc = readl(&timer_base->counter) / > + (TIMER_TICK_HZ / CONFIG_SYS_HZ); > + gd->tbl = 0; > + > + return 0; > +} > + > +/* > + * This function is derived from PowerPC code (read timebase as long > long). + * On ARM it just returns the timer value. > + */ > +ulong get_timer_masked(void) > +{ > + ulong now; > + > + now = readl(&timer_base->counter) / (TIMER_TICK_HZ / CONFIG_SYS_HZ); > + > + if (gd->lastinc >= now) { > + /* Normal mode */ > + gd->tbl += gd->lastinc - now; > + } else { > + /* We have an overflow ... */ > + gd->tbl += gd->lastinc + TIMER_LOAD_VAL - now; > + } > + gd->lastinc = now; > + > + return gd->tbl; > +} > + > +void __udelay(unsigned long usec) > +{ > + unsigned long long tmp; > + ulong tmo; > + > + tmo = usec / (1000000 / CONFIG_SYS_HZ); > + tmp = get_ticks() + tmo; /* Get current timestamp */ > + > + while (get_ticks() < tmp) { /* Loop till event */ > + /* NOP */; > + } > +} > + > +/* Timer without interrupts */ > +ulong get_timer(ulong base) > +{ > + return get_timer_masked() - base; > +} > + > +/* > + * This function is derived from PowerPC code (read timebase as long > long). + * On ARM it just returns the timer value. > + */ > +unsigned long long get_ticks(void) > +{ > + return get_timer(0); > +} > + > +/* > + * This function is derived from PowerPC code (timebase clock frequency). > + * On ARM it returns the number of timer ticks per second. > + */ > +ulong get_tbclk(void) > +{ > + return CONFIG_SYS_HZ; > +} _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot