ppc4xx: Fix GPIO configuration for pcs440ep
[platform/kernel/u-boot.git] / board / pcs440ep / pcs440ep.c
index f638589..96adbc9 100644 (file)
@@ -30,6 +30,7 @@
 #include <spd_sdram.h>
 #include <status_led.h>
 #include <sha1.h>
+#include <asm/io.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -85,8 +86,9 @@ static void status_led_blink (void)
 
        /* set all LED which are on, to state BLINKING */
        for (i = 0; i < 4; i++) {
-               if (val & 0x08) status_led_set (i, STATUS_LED_BLINKING);
-               val = val << 1;
+               if (val & 0x01) status_led_set (3 - i, STATUS_LED_BLINKING);
+               else status_led_set (3 - i, STATUS_LED_OFF);
+               val = val >> 1;
        }
 }
 
@@ -113,12 +115,14 @@ void show_boot_progress (int val)
                        status_led_set (1, STATUS_LED_ON);
                        status_led_set (2, STATUS_LED_ON);
                        break;
+#if 0
                case 64:
                        /* starting Ethernet configuration */
                        status_led_set (0, STATUS_LED_OFF);
                        status_led_set (1, STATUS_LED_OFF);
                        status_led_set (2, STATUS_LED_ON);
                        break;
+#endif
                case 80:
                        /* loading Image */
                        status_led_set (0, STATUS_LED_ON);
@@ -171,7 +175,7 @@ int board_early_init_f(void)
         *-------------------------------------------------------------------*/
        mfsdr(sdr_pci0, reg);
        mtsdr(sdr_pci0, 0x80000000 | reg);      /* PCI arbiter enabled */
-       mtsdr(sdr_pfc0, 0x00000100);    /* Pin function: enable GPIO49-63 */
+       mtsdr(sdr_pfc0, 0x00000000);    /* Pin function: enable GPIO49-63 */
        mtsdr(sdr_pfc1, 0x00048000);    /* Pin function: UART0 has 4 pins, select IRQ5 */
 
        return 0;
@@ -197,14 +201,13 @@ void load_sernum_ethaddr (void)
                 * - The checksum, stored in the last 2 Bytes, is correct
                 */
                if ((strncmp (buf,"ATR",3) != 0) ||
-                       ((checksumcrc16 >> 8) != buf[EEPROM_LEN - 2]) ||
-                       ((checksumcrc16 & 0xff) != buf[EEPROM_LEN - 1])) 
-               {
+                   ((checksumcrc16 >> 8) != buf[EEPROM_LEN - 2]) ||
+                   ((checksumcrc16 & 0xff) != buf[EEPROM_LEN - 1])) {
                        /* EEprom is not programmed */
                        printf("%s: EEPROM Checksum not OK\n", __FUNCTION__);
                } else {
                        /* get the MACs */
-                       sprintf (mac, "%02x:%02x:%02x:%02x:%02x:%02x", 
+                       sprintf (mac, "%02x:%02x:%02x:%02x:%02x:%02x",
                                buf[3],
                                buf[4],
                                buf[5],
@@ -212,7 +215,7 @@ void load_sernum_ethaddr (void)
                                buf[7],
                                buf[8]);
                        setenv ("ethaddr", (char *) mac);
-                       sprintf (mac, "%02x:%02x:%02x:%02x:%02x:%02x", 
+                       sprintf (mac, "%02x:%02x:%02x:%02x:%02x:%02x",
                                buf[9],
                                buf[10],
                                buf[11],
@@ -236,7 +239,13 @@ void load_sernum_ethaddr (void)
        }
        /* Env doesnt exist -> hang */
        status_led_blink ();
-       hang ();
+       /* here we do this "handy" because we have no interrupts
+          at this time */
+       puts ("### EEPROM ERROR ### Please RESET the board ###\n");
+       for (;;) {
+               __led_toggle (12);
+               udelay (100000);
+       }
        return;
 }
 
@@ -378,7 +387,7 @@ static int pcs440ep_sha1 (int docheck)
                org[i] = ptroff[i];
                ptroff[i] = 0;
        }
-       
+
        sha1_csum ((unsigned char *) data, len, (unsigned char *)output);
 
        if (docheck == 2) {
@@ -405,13 +414,22 @@ static void pcs440ep_checksha1 (void)
        int     ret;
        char    *cs_test;
 
+       status_led_set (0, STATUS_LED_OFF);
+       status_led_set (1, STATUS_LED_OFF);
+       status_led_set (2, STATUS_LED_ON);
        ret = pcs440ep_sha1 (1);
        if (ret == 0) return;
 
        if ((cs_test = getenv ("cs_test")) == NULL) {
                /* Env doesnt exist -> hang */
                status_led_blink ();
-               hang ();
+               /* here we do this "handy" because we have no interrupts
+                  at this time */
+               puts ("### SHA1 ERROR ### Please RESET the board ###\n");
+               for (;;) {
+                       __led_toggle (2);
+                       udelay (100000);
+               }
        }
 
        if (strncmp (cs_test, "off", 3) == 0) {
@@ -506,21 +524,18 @@ int checkboard(void)
        return (0);
 }
 
-
-#if defined(CONFIG_PPC4xx_USE_SPD_DDR_INIT_HANG)
 void spd_ddr_init_hang (void)
 {
        status_led_set (0, STATUS_LED_OFF);
        status_led_set (1, STATUS_LED_ON);
        /* we cannot use hang() because we are still running from
           Flash, and so the status_led driver is not initialized */
-       puts ("### ERROR ### Please RESET the board ###\n");
+       puts ("### SDRAM ERROR ### Please RESET the board ###\n");
        for (;;) {
                __led_toggle (4);
                udelay (100000);
        }
 }
-#endif
 
 long int initdram (int board_type)
 {
@@ -588,7 +603,7 @@ int testdram(void)
  *     certain pre-initialization actions.
  *
  ************************************************************************/
-#if defined(CONFIG_PCI) && defined(CFG_PCI_PRE_INIT)
+#if defined(CONFIG_PCI)
 int pci_pre_init(struct pci_controller *hose)
 {
        unsigned long addr;
@@ -629,7 +644,7 @@ int pci_pre_init(struct pci_controller *hose)
 
        return 1;
 }
-#endif                         /* defined(CONFIG_PCI) && defined(CFG_PCI_PRE_INIT) */
+#endif /* defined(CONFIG_PCI) */
 
 /*************************************************************************
  *  pci_target_init
@@ -755,28 +770,41 @@ void hw_watchdog_reset(void)
  ************************************************************************/
 int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
-       int     rcode = 0;
+       int     rcode = 0, i;
        ulong   pattern = 0;
 
-       pattern = simple_strtoul (argv[1], NULL, 10);
-       if (pattern > 200) {
+       pattern = simple_strtoul (argv[1], NULL, 16);
+       if (pattern > 0x400) {
+               int     val = GET_LEDS;
+               printf ("led: %x\n", val);
+               return rcode;
+       }
+       if (pattern > 0x200) {
                status_led_blink ();
                hang ();
                return rcode;
        }
-       if (pattern > 100) {
+       if (pattern > 0x100) {
                status_led_blink ();
                return rcode;
        }
        pattern &= 0x0f;
-       set_leds (pattern);
+       for (i = 0; i < 4; i++) {
+               if (pattern & 0x01) status_led_set (i, STATUS_LED_ON);
+               else status_led_set (i, STATUS_LED_OFF);
+               pattern = pattern >> 1;
+       }
        return rcode;
 }
 
 U_BOOT_CMD(
        led,    2,      1,      do_led,
-       "led    - set the led\n",
-       NULL
+       "led [bitmask]   - set the DIAG-LED\n",
+       "[bitmask] 0x01 = DIAG 1 on\n"
+       "              0x02 = DIAG 2 on\n"
+       "              0x04 = DIAG 3 on\n"
+       "              0x08 = DIAG 4 on\n"
+       "              > 0x100 set the LED, who are on, to state blinking\n"
 );
 
 #if defined(CONFIG_SHA1_CHECK_UB_IMG)
@@ -799,7 +827,7 @@ int do_sha1 (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                unsigned char output[20];
                int     len;
                int     i;
-               
+
                data = (unsigned char *)simple_strtoul (argv[1], NULL, 16);
                len = simple_strtoul (argv[2], NULL, 16);
                sha1_csum (data, len, (unsigned char *)output);
@@ -826,7 +854,7 @@ int do_sha1 (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                } else {
                        rcode = pcs440ep_sha1 (0);
                }
-               return rcode;   
+               return rcode;
        }
        return rcode;
 }
@@ -840,6 +868,29 @@ U_BOOT_CMD(
 );
 #endif
 
+#if defined (CONFIG_CMD_IDE)
+/* These addresses need to be shifted one place to the left
+ * ( bus per_addr 20 -30 is connectsd on CF bus A10-A0)
+ * These values are shifted
+ */
+extern ulong *ide_bus_offset;
+void inline ide_outb(int dev, int port, unsigned char val)
+{
+       debug ("ide_outb (dev= %d, port= 0x%x, val= 0x%02x) : @ 0x%08lx\n",
+               dev, port, val, (ATA_CURR_BASE(dev)+port));
+
+       out_be16((u16 *)(ATA_CURR_BASE(dev)+(port << 1)), val);
+}
+unsigned char inline ide_inb(int dev, int port)
+{
+       uchar val;
+       val = in_be16((u16 *)(ATA_CURR_BASE(dev)+(port << 1)));
+       debug ("ide_inb (dev= %d, port= 0x%x) : @ 0x%08lx -> 0x%02x\n",
+               dev, port, (ATA_CURR_BASE(dev)+port), val);
+       return (val);
+}
+#endif
+
 #ifdef CONFIG_IDE_PREINIT
 int ide_preinit (void)
 {
@@ -852,7 +903,7 @@ int ide_preinit (void)
 }
 #endif
 
-#if defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET)
+#if defined (CONFIG_CMD_IDE) && defined (CONFIG_IDE_RESET)
 void ide_set_reset (int idereset)
 {
        debug ("ide_reset(%d)\n", idereset);
@@ -863,5 +914,4 @@ void ide_set_reset (int idereset)
        }
        udelay (10000);
 }
-#endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */
-
+#endif /* defined (CONFIG_CMD_IDE) && defined (CONFIG_IDE_RESET) */