diff options
author | Reinhard Tartler <siretart@tauware.de> | 2008-01-10 09:45:05 +0100 |
---|---|---|
committer | Reinhard Tartler <siretart@tauware.de> | 2008-01-10 09:45:05 +0100 |
commit | c724649a69607b3c76ad554d0700b2e9f53d63b8 (patch) | |
tree | 39ace7d2f02a0989a66ec7ccf36a81f450f77069 /udelay.c | |
parent | 3e23b791eeb822bb2d7d6b9a5376675c0cf4bfe8 (diff) | |
download | lcd4linux-c724649a69607b3c76ad554d0700b2e9f53d63b8.tar.gz |
import commit 809 from trunk to fix http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=436332
Diffstat (limited to 'udelay.c')
-rw-r--r-- | udelay.c | 118 |
1 files changed, 12 insertions, 106 deletions
@@ -55,11 +55,6 @@ #include <string.h> #include <sys/time.h> -#ifdef HAVE_ASM_MSR_H -#define u32 unsigned int -#include <asm/msr.h> -#endif - #include "debug.h" #include "cfg.h" @@ -67,79 +62,10 @@ #include "udelay.h" -static unsigned int ticks_per_usec = 0; - - -static void getCPUinfo(int *hasTSC, double *MHz) -{ - int fd; - char buffer[4096], *p; - - *hasTSC = 0; - *MHz = -1; - - fd = open("/proc/cpuinfo", O_RDONLY); - if (fd == -1) { - error("udelay: open(/proc/cpuinfo) failed: %s", strerror(errno)); - return; - } - if (read(fd, &buffer, sizeof(buffer) - 1) == -1) { - error("udelay: read(/proc/cpuinfo) failed: %s", strerror(errno)); - close(fd); - return; - } - close(fd); - - p = strstr(buffer, "flags"); - if (p == NULL) { - info("udelay: /proc/cpuinfo has no 'flags' line"); - } else { - p = strstr(p, "tsc"); - if (p == NULL) { - info("udelay: CPU does not support Time Stamp Counter"); - } else { - info("udelay: CPU supports Time Stamp Counter"); - *hasTSC = 1; - } - } - - p = strstr(buffer, "cpu MHz"); - if (p == NULL) { - info("udelay: /proc/cpuinfo has no 'cpu MHz' line"); - } else { - if (sscanf(p + 7, " : %lf", MHz) != 1) { - error("udelay: parse(/proc/cpuinfo) failed: unknown 'cpu MHz' format"); - *MHz = -1; - } else { - info("udelay: CPU runs at %f MHz", *MHz); - } - } - -} - void udelay_init(void) { -#ifdef HAVE_ASM_MSR_H - - int tsc; - double mhz; - - getCPUinfo(&tsc, &mhz); - - if (tsc && mhz > 0.0) { - ticks_per_usec = ceil(mhz); - info("udelay: using TSC delay loop, %u ticks per microsecond", ticks_per_usec); - } else -#else - error("udelay: The file 'include/asm/msr.h' was missing at compile time."); - error("udelay: Even if your CPU supports TSC, it will not be used!"); - error("udelay: You *really* should install msr.h and recompile LCD4linux!"); -#endif - { - ticks_per_usec = 0; - info("udelay: using gettimeofday() delay loop"); - } + info("udelay: using gettimeofday() delay loop"); } @@ -172,37 +98,17 @@ unsigned long timing(const char *driver, const char *section, const char *name, void ndelay(const unsigned long nsec) { -#ifdef HAVE_ASM_MSR_H - - if (ticks_per_usec) { - - unsigned int t1, t2; - unsigned long tsc; + struct timeval now, end; - tsc = (nsec * ticks_per_usec + 999) / 1000; - - rdtscl(t1); - do { - rep_nop(); - rdtscl(t2); - } while ((t2 - t1) < tsc); - - } else -#endif - - { - struct timeval now, end; - - gettimeofday(&end, NULL); - end.tv_usec += (nsec + 999) / 1000; - while (end.tv_usec > 1000000) { - end.tv_usec -= 1000000; - end.tv_sec++; - } - - do { - rep_nop(); - gettimeofday(&now, NULL); - } while (now.tv_sec == end.tv_sec ? now.tv_usec < end.tv_usec : now.tv_sec < end.tv_sec); + gettimeofday(&end, NULL); + end.tv_usec += (nsec + 999) / 1000; + while (end.tv_usec > 1000000) { + end.tv_usec -= 1000000; + end.tv_sec++; } + + do { + rep_nop(); + gettimeofday(&now, NULL); + } while (now.tv_sec == end.tv_sec ? now.tv_usec < end.tv_usec : now.tv_sec < end.tv_sec); } |