]> git.sur5r.net Git - u-boot/commitdiff
* Add EPCS Controller bootrom work-around for Nios-II
authorHeiko Schocher <hs@pollux.denx.de>
Thu, 20 Apr 2006 10:49:05 +0000 (12:49 +0200)
committerHeiko Schocher <hs@pollux.denx.de>
Thu, 20 Apr 2006 10:49:05 +0000 (12:49 +0200)
  Patch from Scott McNutt 11, Aug 2005
   -When booting from an epcs controller, the epcs bootrom may leave the
    slave select in an asserted state causing soft reset hang. This
    patch ensures slave select is negated at reset.

CHANGELOG
cpu/nios2/epcs.c
include/nios2-epcs.h
lib_nios2/board.c

index fed7a73cb037f3da0418c5aa7cb591be61300b0f..9014e73f1aaf635152f81335b7496e2e9b7b50e9 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,8 +2,14 @@
 Changes since U-Boot 1.1.4:
 ======================================================================
 
+* Add EPCS Controller bootrom work-around for Nios-II
+   Patch from Scott McNutt 11, Aug 2005
+   -When booting from an epcs controller, the epcs bootrom may leave the
+    slave select in an asserted state causing soft reset hang. This
+    patch ensures slave select is negated at reset.
+
 * Fix I/O Macros and mini-app stubs for Nios-II
-  Patch by Scott McNutt 11, Aug 2005
+  Patch from Scott McNutt 11, Aug 2005
   -Fix asm/io.h macros
   -Eliminate use of CACHE_BYPASS in cpu code
   -Eliminate assembler warnings
index fd9fd8498a506023b64d577cce6753afb3a1dce4..414c38c2b1df370f8432777e28bb635a90e028ad 100644 (file)
@@ -210,6 +210,21 @@ static struct epcs_devinfo_t devinfo[] = {
        { 0, 0, 0, 0, 0, 0 }
 };
 
+int epcs_reset (void)
+{
+       /* When booting from an epcs controller, the epcs bootrom
+        * code may leave the slave select in an asserted state.
+        * This causes two problems: (1) The initial epcs access
+        * will fail -- not a big deal, and (2) a software reset
+        * will cause the bootrom code to hang since it does not
+        * ensure the select is negated prior to first access -- a
+        * big deal. Here we just negate chip select and everything
+        * gets better :-)
+        */
+       epcs_cs (0); /* Negate chip select */
+       return (0);
+}
+
 epcs_devinfo_t *epcs_dev_find (void)
 {
        unsigned char buf[4];
index 2c9522cfd8975684d3239353a04fe132f47cbdac..20e0c87c89f91ee556ce3574dd3c63f8a20b097e 100644 (file)
@@ -38,6 +38,11 @@ typedef struct epcs_devinfo_t {
        unsigned char   prot_mask;      /* Protection mask */
 }epcs_devinfo_t;
 
+/* Resets the epcs controller -- to prevent (potential) soft-reset
+ * problems when booting from the epcs controller
+ */
+extern int epcs_reset (void);
+
 /* Returns the devinfo struct if EPCS device is found;
  * NULL otherwise.
  */
index cd23037771407993b92229166ed83efc66504702..7ffb3f019b96ecaae1f8f631282051b5b0d24988 100644 (file)
@@ -31,6 +31,9 @@
 #ifdef CONFIG_STATUS_LED
 #include <status_led.h>
 #endif
+#if defined(CFG_NIOS_EPCSBASE)
+#include <nios2-epcs.h>
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -93,6 +96,9 @@ init_fnc_t *init_sequence[] = {
 #if defined(CONFIG_BOARD_EARLY_INIT_F)
        board_early_init_f,     /* Call board-specific init code early.*/
 #endif
+#if defined(CFG_NIOS_EPCSBASE)
+       epcs_reset,
+#endif
 
        env_init,
        serial_init,
@@ -165,6 +171,10 @@ void board_init (void)
        WATCHDOG_RESET ();
        interrupt_init ();
 
+#if defined(CONFIG_BOARD_LATE_INIT)
+       board_late_init ();
+#endif
+
        /* main_loop */
        for (;;) {
                WATCHDOG_RESET ();