ARM: bcm2835: fix get_timer() to return ms
authorStephen Warren <swarren@wwwdotorg.org>
Wed, 27 Mar 2013 18:43:23 +0000 (18:43 +0000)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Thu, 4 Apr 2013 06:14:54 +0000 (08:14 +0200)
Apparently, CONFIG_SYS_HZ must be 1000. Change this, and fix the timer
driver to conform to this.

Have the timer implementation export a custom API get_timer_us() for use
by the BCM2835 MMC API, which needs us resolution for a HW workaround.

Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
arch/arm/cpu/arm1176/bcm2835/timer.c
arch/arm/include/asm/arch-bcm2835/timer.h
drivers/mmc/bcm2835_sdhci.c
include/configs/rpi_b.h

index d232d7e067c3a01b6aea8dfe6ee43bc9b8bfaa71..2edd6711da5711ed88d46f6a8c7323b01e84d2d5 100644 (file)
@@ -23,7 +23,7 @@ int timer_init(void)
        return 0;
 }
 
-ulong get_timer(ulong base)
+ulong get_timer_us(ulong base)
 {
        struct bcm2835_timer_regs *regs =
                (struct bcm2835_timer_regs *)BCM2835_TIMER_PHYSADDR;
@@ -31,6 +31,14 @@ ulong get_timer(ulong base)
        return readl(&regs->clo) - base;
 }
 
+ulong get_timer(ulong base)
+{
+       ulong us = get_timer_us(0);
+       us /= (1000000 / CONFIG_SYS_HZ);
+       us -= base;
+       return us;
+}
+
 unsigned long long get_ticks(void)
 {
        return get_timer(0);
@@ -46,10 +54,10 @@ void __udelay(unsigned long usec)
        ulong endtime;
        signed long diff;
 
-       endtime = get_timer(0) + usec;
+       endtime = get_timer_us(0) + usec;
 
        do {
-               ulong now = get_timer(0);
+               ulong now = get_timer_us(0);
                diff = endtime - now;
        } while (diff >= 0);
 }
index 30c70e03df467f60e93e71b5d66ba59877a681d8..c2001b6f932a4bb27ab19cb410f95ee083b0415d 100644 (file)
@@ -34,4 +34,6 @@ struct bcm2835_timer_regs {
 #define BCM2835_TIMER_CS_M1    (1 << 1)
 #define BCM2835_TIMER_CS_M0    (1 << 0)
 
+extern ulong get_timer_us(ulong base);
+
 #endif
index b0afc3c9ce5dd843c4cdca145fd3d489c8f41fa1..54cfabfb91edb514ad161721b064092b2349c16e 100644 (file)
@@ -39,6 +39,7 @@
 #include <common.h>
 #include <malloc.h>
 #include <sdhci.h>
+#include <asm/arch/timer.h>
 
 /* 400KHz is max freq for card ID etc. Use that as min */
 #define MIN_FREQ 400000
@@ -67,11 +68,11 @@ static inline void bcm2835_sdhci_raw_writel(struct sdhci_host *host, u32 val,
         * (Which is just as well - otherwise we'd have to nobble the DMA engine
         * too)
         */
-       while (get_timer(bcm_host->last_write) < bcm_host->twoticks_delay)
+       while (get_timer_us(bcm_host->last_write) < bcm_host->twoticks_delay)
                ;
 
        writel(val, host->ioaddr + reg);
-       bcm_host->last_write = get_timer(0);
+       bcm_host->last_write = get_timer_us(0);
 }
 
 static inline u32 bcm2835_sdhci_raw_readl(struct sdhci_host *host, int reg)
index 3d55d36c6ec530cbe8d9b2b3c1250f5b01cb56db..c18b35b0578a64e09aa43a66d86371d84779b18b 100644 (file)
@@ -31,7 +31,7 @@
 #define CONFIG_MACH_TYPE               MACH_TYPE_BCM2708
 
 /* Timer */
-#define CONFIG_SYS_HZ                  1000000
+#define CONFIG_SYS_HZ                  1000
 
 /* Memory layout */
 #define CONFIG_NR_DRAM_BANKS           1