From: Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] sh: Update sh timer function
Date: Mon, 17 Nov 2008 16:51:25 +0900 [thread overview]
Message-ID: <4921227D.9070801@renesas.com> (raw)
Change to write/readX fcuntion and fix timer bug.
Signed-off-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
---
cpu/sh3/Makefile | 2 +-
cpu/sh3/time.c | 103 ------------------------------------------------------
cpu/sh4/time.c | 76 ++++++++++++++++++++++++++-------------
3 files changed, 52 insertions(+), 129 deletions(-)
delete mode 100644 cpu/sh3/time.c
diff --git a/cpu/sh3/Makefile b/cpu/sh3/Makefile
index 587413d..e3e5777 100644
--- a/cpu/sh3/Makefile
+++ b/cpu/sh3/Makefile
@@ -32,7 +32,7 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(CPU).a
SOBJS = start.o
-COBJS = cpu.o interrupts.o watchdog.o time.o cache.o
+COBJS = cpu.o interrupts.o watchdog.o cache.o ../sh4/time.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
OBJS := $(addprefix $(obj),$(COBJS))
diff --git a/cpu/sh3/time.c b/cpu/sh3/time.c
deleted file mode 100644
index aab3659..0000000
--- a/cpu/sh3/time.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * (C) Copyright 2007
- * Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
- *
- * (C) Copyright 2007
- * Nobobuhiro Iwamatsu <iwamatsu@nigauri.org>
- *
- * (C) Copyright 2003
- * Wolfgang Denk, DENX Software Engineering, wd at denx.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 <asm/processor.h>
-#include <asm/io.h>
-
-#define TMU_MAX_COUNTER (~0UL)
-
-static void tmu_timer_start(unsigned int timer)
-{
- if (timer > 2)
- return;
-
- outb(inb(TSTR) | (1 << timer), TSTR);
-}
-
-static void tmu_timer_stop(unsigned int timer)
-{
- u8 val = inb(TSTR);
-
- if (timer > 2)
- return;
- outb(val & ~(1 << timer), TSTR);
-}
-
-int timer_init(void)
-{
- /* Divide clock by 4 */
- outw(0, TCR0);
-
- tmu_timer_stop(0);
- tmu_timer_start(0);
- return 0;
-}
-
-/*
- In theory we should return a true 64bit value (ie something that doesn't
- overflow). However, we don't. Therefore if TMU runs at fastest rate of
- 6.75 MHz this value will wrap after u-boot has been running for approx
- 10 minutes.
-*/
-unsigned long long get_ticks(void)
-{
- return (0 - inl(TCNT0));
-}
-
-unsigned long get_timer(unsigned long base)
-{
- return ((0 - inl(TCNT0)) - base);
-}
-
-void set_timer(unsigned long t)
-{
- outl(0 - t, TCNT0);
-}
-
-void reset_timer(void)
-{
- tmu_timer_stop(0);
- set_timer(0);
- tmu_timer_start(0);
-}
-
-void udelay(unsigned long usec)
-{
- unsigned int start = get_timer(0);
- unsigned int end = start + (usec * ((CONFIG_SYS_HZ + 500000) / 1000000));
-
- while (get_timer(0) < end)
- continue;
-}
-
-unsigned long get_tbclk(void)
-{
- return CONFIG_SYS_HZ;
-}
diff --git a/cpu/sh4/time.c b/cpu/sh4/time.c
index 77e0ae2..4bed633 100644
--- a/cpu/sh4/time.c
+++ b/cpu/sh4/time.c
@@ -1,5 +1,5 @@
/*
- * (C) Copyright 2007
+ * (C) Copyright 2007-2008
* Nobobuhiro Iwamatsu <iwamatsu@nigauri.org>
*
* (C) Copyright 2003
@@ -26,54 +26,89 @@
#include <common.h>
#include <asm/processor.h>
+#include <asm/io.h>
#define TMU_MAX_COUNTER (~0UL)
+static int clk_adj = 1;
static void tmu_timer_start (unsigned int timer)
{
if (timer > 2)
return;
-
- *((volatile unsigned char *) TSTR) |= (1 << timer);
+ writeb(readb(TSTR) | (1 << timer), TSTR);
}
static void tmu_timer_stop (unsigned int timer)
{
- u8 val = *((volatile u8 *)TSTR);
if (timer > 2)
return;
- *((volatile unsigned char *)TSTR) = val &~(1 << timer);
+ writeb(readb(TSTR) & ~(1 << timer), TSTR);
}
int timer_init (void)
{
- /* Divide clock by 4 */
- *(volatile u16 *)TCR0 = 0;
+ /* Divide clock by TMU_CLK_DIVIDER */
+ u16 bit = 0;
+ switch( TMU_CLK_DIVIDER ){
+ case 4:
+ bit = 0;
+ break;
+ case 16:
+ bit = 1;
+ break;
+ case 64: bit = 2;
+ break;
+ case 256:
+ bit = 3;
+ break;
+ case 1024:
+ bit = 4;
+ break;
+ default:
+ bit = 0;
+ break;
+ }
+ writew(readw(TCR0) | bit, TCR0);
+
+ /* Clock adjustment calc */
+ clk_adj = (int)(1.0/((1.0/CONFIG_SYS_HZ)*1000000));
+ if (clk_adj < 1)
+ clk_adj = 1;
tmu_timer_stop(0);
tmu_timer_start(0);
+
return 0;
}
-/*
- In theory we should return a true 64bit value (ie something that doesn't
- overflow). However, we don't. Therefore if TMU runs@fastest rate of
- 6.75 MHz this value will wrap after u-boot has been running for approx
- 10 minutes.
-*/
unsigned long long get_ticks (void)
{
- return (0 - *((volatile u32 *) TCNT0));
+ return 0 - readl(TCNT0);
+}
+
+static unsigned long get_usec (void)
+{
+ return (0 - readl(TCNT0));
+}
+
+void udelay (unsigned long usec)
+{
+ unsigned int start = get_usec();
+ unsigned int end = start + (usec * clk_adj);
+
+ while (get_usec() < end)
+ continue;
}
unsigned long get_timer (unsigned long base)
{
- return ((0 - *((volatile u32 *) TCNT0)) - base);
+ /* return msec */
+ return ((get_usec()/clk_adj)/1000) - base;
}
void set_timer (unsigned long t)
{
- *((volatile unsigned int *) TCNT0) = (0 - t);
+ writel((0 - t), TCNT0);
}
void reset_timer (void)
@@ -83,15 +118,6 @@ void reset_timer (void)
tmu_timer_start(0);
}
-void udelay (unsigned long usec)
-{
- unsigned int start = get_timer (0);
- unsigned int end = start + (usec * ((CONFIG_SYS_HZ + 500000) / 1000000));
-
- while (get_timer (0) < end)
- continue;
-}
-
unsigned long get_tbclk (void)
{
return CONFIG_SYS_HZ;
--
1.5.6.5
next reply other threads:[~2008-11-17 7:51 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-11-17 7:51 Nobuhiro Iwamatsu [this message]
2008-11-17 12:14 ` [U-Boot] [PATCH] sh: Update sh timer function Jean-Christophe PLAGNIOL-VILLARD
2008-11-18 1:37 ` Nobuhiro Iwamatsu
2008-12-09 23:07 ` Wolfgang Denk
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=4921227D.9070801@renesas.com \
--to=iwamatsu.nobuhiro@renesas.com \
--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.