Hi John,

Le 12/04/2011 08:17, John Rigby a écrit :

> diff --git a/arch/arm/cpu/armv7/u8500/lowlevel.S 
> b/arch/arm/cpu/armv7/u8500/lowlevel.S
> new file mode 100644
> index 0000000..0e3f8fc
> --- /dev/null
> +++ b/arch/arm/cpu/armv7/u8500/lowlevel.S
> @@ -0,0 +1,33 @@
> +/*
> + * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
> + */

Please add a copyright notice identifying the right holder(s). Readers 
*must* be able to tell who the rights holders are and how to contact 
them -- don't assume the file is too simple to qualify.

> diff --git a/arch/arm/cpu/armv7/u8500/timer.c 
> b/arch/arm/cpu/armv7/u8500/timer.c
> new file mode 100644
> index 0000000..8850fd5
> --- /dev/null
> +++ b/arch/arm/cpu/armv7/u8500/timer.c
> @@ -0,0 +1,167 @@
> +/*
> + * Copyright (C) 2010 Linaro Limited
> + * John Rigby<john.ri...@linaro.org>
> + *
> + * Based on original from Linux kernel source and
> + * internal ST-Ericsson U-Boot source.
> + * (C) Copyright 2009 Alessandro Rubini
> + * (C) Copyright 2010 ST-Ericsson
> + *
> + * 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<asm/io.h>
> +#include<asm/arch/hardware.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +/*
> + * The MTU device has some interrupt control registers
> + * followed by 4 timers.
> + */
> +
> +/* The timers */
> +struct u8500_mtu_timer {
> +     u32 lr;                 /* Load value */
> +     u32 cv;                 /* Current value */
> +     u32 cr;                 /* Control reg */
> +     u32 bglr;               /* ??? */
> +};
> +
> +/* The MTU that contains the timers */
> +struct u8500_mtu {
> +     u32 imsc;               /* Interrupt mask set/clear */
> +     u32 ris;                /* Raw interrupt status */
> +     u32 mis;                /* Masked interrupt status */
> +     u32 icr;                /* Interrupt clear register */
> +     struct u8500_mtu_timer pt[4];
> +};
> +
> +/* bits for the control register */
> +#define MTU_CR_ONESHOT               0x01    /* if 0 = wraps reloading from 
> BGLR */
> +#define MTU_CR_32BITS                0x02
> +
> +#define MTU_CR_PRESCALE_1    0x00
> +#define MTU_CR_PRESCALE_16   0x04
> +#define MTU_CR_PRESCALE_256  0x08
> +#define MTU_CR_PRESCALE_MASK 0x0c
> +
> +#define MTU_CR_PERIODIC              0x40    /* if 0 = free-running */
> +#define MTU_CR_ENA           0x80
> +
> +/*
> + * The MTU is clocked at 133 MHz by default. (V1 and later)
> + */
> +#define TIMER_CLOCK          (133 * 1000 * 1000 / 16)
> +#define COUNT_TO_USEC(x)     ((x) * 16 / 133)
> +#define USEC_TO_COUNT(x)     ((x) * 133 / 16)
> +#define TICKS_PER_HZ         (TIMER_CLOCK / CONFIG_SYS_HZ)
> +#define TICKS_TO_HZ(x)               ((x) / TICKS_PER_HZ)
> +#define TIMER_LOAD_VAL               0xffffffff
> +
> +/*
> + * MTU timer to use (from 0 to 3).
> + * Linux ux500 timer0 on MTU0 and timer0 on MTU1

If you really mean the same timer for both, please explicitly state 
"timer0 for both MTU0 and MTU1", otherwise fix.

> + */
> +#define MTU_TIMER 2
> +
> +static struct u8500_mtu_timer *timer_base =
> +     &((struct u8500_mtu *)U8500_MTU0_BASE_V1)->pt[MTU_TIMER];
> +
> +/* macro to read the 32 bit timer: since it decrements, we invert read value 
> */
> +#define READ_TIMER() (~readl(&timer_base->cv))
> +
> +/* Configure a free-running, auto-wrap counter with /16 prescaler */
> +int timer_init(void)
> +{
> +     writel(MTU_CR_ENA | MTU_CR_PRESCALE_16 | MTU_CR_32BITS,
> +     &timer_base->cr);
> +     reset_timer();
> +     return 0;
> +}
> +
> +ulong get_timer_masked(void)
> +{
> +     /* current tick value */
> +     ulong now = TICKS_TO_HZ(READ_TIMER());
> +
> +     if (now>= gd->lastinc)  /* normal (non rollover) */
> +             gd->tbl += (now - gd->lastinc);
> +     else                    /* rollover */
> +             gd->tbl += (TICKS_TO_HZ(TIMER_LOAD_VAL) - gd->lastinc) + now;
> +     gd->lastinc = now;
> +     return gd->tbl;
> +}
> +
> +/* Delay x useconds */
> +void __udelay(ulong usec)
> +{
> +     long tmo = usec * (TIMER_CLOCK / 1000) / 1000;
> +     ulong now, last = READ_TIMER();
> +
> +     while (tmo>  0) {
> +             now = READ_TIMER();
> +             if (now>  last) /* normal (non rollover) */
> +                     tmo -= now - last;
> +             else            /* rollover */
> +                     tmo -= TIMER_LOAD_VAL - last + now;
> +             last = now;
> +     }
> +}
> +
> +ulong get_timer(ulong base)
> +{
> +     return get_timer_masked() - base;
> +}
> +
> +void set_timer(ulong t)
> +{
> +     gd->tbl = t;
> +}
> +
> +void reset_timer_masked(void)
> +{
> +     gd->lastinc = TICKS_TO_HZ(READ_TIMER());
> +     gd->tbl = 0;            /* reset ticks to 0 */
> +}
> +
> +void reset_timer(void)
> +{
> +     reset_timer_masked();
> +}

Please remove these reset_timer functions and in the client code. 
Resetting a timer is never useful for timing loops. Client code that 
resets the timer must be fixed.

Amicalement,
-- 
Albert.
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to