diff options
Diffstat (limited to 'lib_mips')
-rw-r--r-- | lib_mips/board.c | 13 | ||||
-rw-r--r-- | lib_mips/bootm.c | 11 | ||||
-rw-r--r-- | lib_mips/time.c | 57 |
3 files changed, 52 insertions, 29 deletions
diff --git a/lib_mips/board.c b/lib_mips/board.c index 1645f2c..532550b 100644 --- a/lib_mips/board.c +++ b/lib_mips/board.c @@ -28,6 +28,8 @@ #include <version.h> #include <net.h> #include <environment.h> +#include <nand.h> +#include <spi.h> DECLARE_GLOBAL_DATA_PTR; @@ -416,6 +418,17 @@ void board_init_r (gd_t *id, ulong dest_addr) } #endif +#ifdef CONFIG_CMD_NAND + puts ("NAND: "); + nand_init (); /* go init the NAND */ +#endif + +#ifdef CONFIG_CMD_SPI + puts ("SPI: "); + spi_init (); /* go init the SPI */ + puts ("ready\n"); +#endif + #if defined(CONFIG_MISC_INIT_R) /* miscellaneous platform dependent initialisations */ misc_init_r (); diff --git a/lib_mips/bootm.c b/lib_mips/bootm.c index f813fc5..8fe3782 100644 --- a/lib_mips/bootm.c +++ b/lib_mips/bootm.c @@ -54,6 +54,7 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[], char *commandline = getenv ("bootargs"); char env_buf[12]; int ret; + const char *cp; /* find kernel entry point */ if (images->legacy_hdr_valid) { @@ -113,6 +114,16 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[], sprintf (env_buf, "0x%X", (uint) (gd->bd->bi_flashsize)); linux_env_set ("flash_size", env_buf); + cp = getenv("ethaddr"); + if (cp != NULL) { + linux_env_set("ethaddr", cp); + } + + cp = getenv("eth1addr"); + if (cp != NULL) { + linux_env_set("eth1addr", cp); + } + if (!images->autostart) return ; diff --git a/lib_mips/time.c b/lib_mips/time.c index cd8dc72..1e92789 100644 --- a/lib_mips/time.c +++ b/lib_mips/time.c @@ -22,26 +22,12 @@ */ #include <common.h> +#include <asm/mipsregs.h> +static unsigned long timestamp; -static inline void mips_compare_set(u32 v) -{ - asm volatile ("mtc0 %0, $11" : : "r" (v)); -} - -static inline void mips_count_set(u32 v) -{ - asm volatile ("mtc0 %0, $9" : : "r" (v)); -} - - -static inline u32 mips_count_get(void) -{ - u32 count; - - asm volatile ("mfc0 %0, $9" : "=r" (count) :); - return count; -} +/* how many counter cycles in a jiffy */ +#define CYCLES_PER_JIFFY (CFG_MIPS_TIMER_FREQ + CFG_HZ / 2) / CFG_HZ /* * timer without interrupts @@ -49,34 +35,47 @@ static inline u32 mips_count_get(void) int timer_init(void) { - mips_compare_set(0); - mips_count_set(0); + /* Set up the timer for the first expiration. */ + timestamp = 0; + write_c0_compare(read_c0_count() + CYCLES_PER_JIFFY); return 0; } void reset_timer(void) { - mips_count_set(0); + timestamp = 0; + write_c0_compare(read_c0_count() + CYCLES_PER_JIFFY); } ulong get_timer(ulong base) { - return mips_count_get() - base; + unsigned int count; + unsigned int expirelo = read_c0_compare(); + + /* Check to see if we have missed any timestamps. */ + count = read_c0_count(); + while ((count - expirelo) < 0x7fffffff) { + expirelo += CYCLES_PER_JIFFY; + timestamp++; + } + write_c0_compare(expirelo); + + return (timestamp - base); } void set_timer(ulong t) { - mips_count_set(t); + timestamp = t; + write_c0_compare(read_c0_count() + CYCLES_PER_JIFFY); } -void udelay (unsigned long usec) +void udelay(unsigned long usec) { - ulong tmo; - ulong start = get_timer(0); + unsigned int tmo; - tmo = usec * (CFG_HZ / 1000000); - while ((ulong)((mips_count_get() - start)) < tmo) + tmo = read_c0_count() + (usec * (CFG_MIPS_TIMER_FREQ / 1000000)); + while ((tmo - read_c0_count()) < 0x7fffffff) /*NOP*/; } @@ -86,7 +85,7 @@ void udelay (unsigned long usec) */ unsigned long long get_ticks(void) { - return mips_count_get(); + return get_timer(0); } /* |