All of lore.kernel.org
 help / color / mirror / Atom feed
From: Shinya Kuribayashi <skuribay@ruby.dti.ne.jp>
To: u-boot@lists.denx.de
Subject: [U-Boot-Users] [PATCH 3/3][MIPS] lib_mips/time.c: Fix improper use of CFG_HZ and timer routines
Date: Sun, 25 May 2008 22:45:48 +0900	[thread overview]
Message-ID: <48396D8C.8050402@ruby.dti.ne.jp> (raw)
In-Reply-To: <20080525081501.241BF247CC@gemini.denx.de>

Wolfgang Denk wrote:
>> Sure. We'll probably need to move timer_init to board_init_r at the end.
> 
> I'm not sure if this works. We use udelay() and friends all over the
> place - a long time before that.

Hmm.

My udelay is already global-variable-free. And as for cycles_per_jiffy
and expirelo, we could make it work like this:

diff --git a/lib_mips/time.c b/lib_mips/time.c
index f6678e1..d4754e3 100644
--- a/lib_mips/time.c
+++ b/lib_mips/time.c
@@ -27,10 +27,7 @@
 static unsigned long timestamp;
 
 /* how many counter cycles in a jiffy */
-static unsigned long cycles_per_jiffy;
-
-/* expirelo is the count value for next CPU timer interrupt */
-static unsigned int expirelo;
+static unsigned long cycles_per_jiffy = (CONFIG_MIPS_TIMER_FREQ + CFG_HZ / 2) / CFG_HZ;
 
 /*
  * timer without interrupts
@@ -38,9 +35,6 @@ static unsigned int expirelo;
 
 int timer_init(void)
 {
-	/* Calculate cache parameters. */
-	cycles_per_jiffy = (CONFIG_MIPS_TIMER_FREQ + CFG_HZ / 2) / CFG_HZ;
-
 	/* Report the high precision timer rate for a reference. */
 	printf("Using %u.%03u MHz high precision timer.\n",
 	       ((CONFIG_MIPS_TIMER_FREQ + 500) / 1000) / 1000,
@@ -48,7 +42,7 @@ int timer_init(void)
 
 	/* Set up the timer for the first expiration. */
 	timestamp = 0;
-	expirelo = read_c0_count() + cycles_per_jiffy;
+	write_c0_compare(read_c0_count() + cycles_per_jiffy);
 
 	return 0;
 }
@@ -56,12 +50,13 @@ int timer_init(void)
 void reset_timer(void)
 {
 	timestamp = 0;
-	expirelo = read_c0_count() + cycles_per_jiffy;
+	write_c0_compare(read_c0_count() + cycles_per_jiffy);
 }
 
 ulong get_timer(ulong base)
 {
 	unsigned int count;
+	unsigned int expirelo = read_c0_compare();
 
 	/* Check to see if we have missed any timestamps. */
 	count = read_c0_count();
@@ -73,6 +68,7 @@ ulong get_timer(ulong base)
 		expirelo += cycles_per_jiffy;
 		timestamp++;
 	}
+	write_c0_compare(expirelo);
 
 	return (timestamp - base);
 }
@@ -80,7 +76,7 @@ ulong get_timer(ulong base)
 void set_timer(ulong t)
 {
 	timestamp = t;
-	expirelo = read_c0_count() + cycles_per_jiffy;
+	write_c0_compare(read_c0_count() + cycles_per_jiffy);
 }
 
 void udelay(unsigned long usec)
_


But I have no clue about timestamp.


> The timer implementation should have no such restrictions as being
> available only after relocation. Timers / delays are such a basic
> feature that they should be available everywhere.

I'll remember that.


  Shinya

  reply	other threads:[~2008-05-25 13:45 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-05-20 16:24 [U-Boot-Users] [PATCH] [resend] mips: Support to set CFG_HZ to 1000, consistent with other architectures Jason McMullan
2008-05-21  3:53 ` Shinya Kuribayashi
2008-05-21 15:32   ` Scott Wood
2008-05-24 12:58     ` [U-Boot-Users] [PATCH 1/3][MIPS] lib_mips/time.c: Replace CP0 access functions with existing macros Shinya Kuribayashi
2008-05-24 12:59       ` [U-Boot-Users] [PATCH 2/3][MIPS] lib_mips/time.c: Fix udelay Shinya Kuribayashi
2008-05-24 13:02         ` [U-Boot-Users] [PATCH 3/3][MIPS] lib_mips/time.c: Fix improper use of CFG_HZ and timer routines Shinya Kuribayashi
2008-05-24 19:59           ` Wolfgang Denk
2008-05-25  2:04             ` Shinya Kuribayashi
2008-05-25  8:15               ` Wolfgang Denk
2008-05-25 13:45                 ` Shinya Kuribayashi [this message]
2008-05-25 15:18                   ` Wolfgang Denk
2008-05-31  6:12                     ` Shinya Kuribayashi
2008-05-31  6:17                       ` Shinya Kuribayashi
2008-05-31 14:40           ` [U-Boot-Users] [PATCH 3/3 v2][MIPS] lib_mips/time.c: Fix CP0 count register usage " Shinya Kuribayashi

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=48396D8C.8050402@ruby.dti.ne.jp \
    --to=skuribay@ruby.dti.ne.jp \
    --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.