From: Marek Vasut <marex@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 3/4 v2] arm: Support new Xilinx Zynq platform
Date: Thu, 13 Sep 2012 11:31:45 +0200 [thread overview]
Message-ID: <201209131131.45262.marex@denx.de> (raw)
In-Reply-To: <1345098630-27902-3-git-send-email-monstr@monstr.eu>
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 <monstr@monstr.eu>
> + * Copyright (C) 2011-2012 Xilinx, Inc. All rights reserved.
> + *
> + * (C) Copyright 2008
> + * Guennadi Liakhovetki, DENX Software Engineering, <lg@denx.de>
> + *
> + * (C) Copyright 2004
> + * Philippe Robin, ARM Ltd. <philippe.robin@arm.com>
> + *
> + * (C) Copyright 2002-2004
> + * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
> + *
> + * (C) Copyright 2003
> + * Texas Instruments <www.ti.com>
> + *
> + * (C) Copyright 2002
> + * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
> + * Marius Groeger <mgroeger@sysgo.de>
> + *
> + * (C) Copyright 2002
> + * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
> + * Alex Zuepke <azu@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;
> +}
next prev parent reply other threads:[~2012-09-13 9:31 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-16 6:30 [U-Boot] [PATCH 1/4 v2] serial: Add Zynq serial driver Michal Simek
2012-08-16 6:30 ` [U-Boot] [PATCH 2/4 v2] net: Add driver for Zynq Gem IP Michal Simek
2012-09-12 10:19 ` Michal Simek
2012-09-13 9:28 ` Marek Vasut
2012-09-13 10:16 ` Michal Simek
2012-09-13 12:30 ` Marek Vasut
2012-09-14 3:49 ` Joe Hershberger
2012-09-14 4:45 ` Marek Vasut
[not found] ` <CANr=Z=aejhXoGabpcderroSeQSWJM+cbXS7yg6NVeHKJLqQhRQ@mail.gmail.com>
2012-09-14 7:34 ` Marek Vasut
2012-08-16 6:30 ` [U-Boot] [PATCH 3/4 v2] arm: Support new Xilinx Zynq platform Michal Simek
2012-09-12 10:23 ` Michal Simek
2012-09-13 9:32 ` Marek Vasut
2012-09-13 9:36 ` Michal Simek
2012-09-13 9:31 ` Marek Vasut [this message]
2012-09-13 9:52 ` Michal Simek
2012-09-13 10:31 ` Marek Vasut
2012-09-13 11:24 ` Michal Simek
2012-09-13 12:32 ` Marek Vasut
2012-09-13 12:52 ` Michal Simek
2012-09-13 13:01 ` Marek Vasut
2012-08-16 6:30 ` [U-Boot] [PATCH 4/4 v3] xilinx: Add new Zynq board Michal Simek
2012-09-12 10:23 ` Michal Simek
2012-09-13 9:35 ` Marek Vasut
2012-09-13 9:55 ` Michal Simek
2012-09-13 12:31 ` Marek Vasut
2012-09-13 12:17 ` Michal Simek
2012-09-14 4:03 ` Joe Hershberger
2012-09-14 5:42 ` Michal Simek
2012-09-12 10:20 ` [U-Boot] [PATCH 1/4 v2] serial: Add Zynq serial driver Michal Simek
2012-09-13 9:21 ` Marek Vasut
2012-09-13 9:45 ` Michal Simek
2012-09-13 12:33 ` Marek Vasut
2012-09-13 13:54 ` Michal Simek
2012-09-13 14:01 ` Marek Vasut
2012-09-14 4:09 ` Joe Hershberger
2012-09-14 4:47 ` Marek Vasut
2012-09-14 5:23 ` Joe Hershberger
2012-09-14 7:39 ` Marek Vasut
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201209131131.45262.marex@denx.de \
--to=marex@denx.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.