Fix external IRQ configuration on Yellowstone & Yosemite
[oweals/u-boot.git] / board / amcc / yosemite / yosemite.c
index 6c8a883e183ab93c03059472a182718509e972ba..03b412b82f8e631db68968063df7581a3a065a64 100644 (file)
  */
 
 #include <common.h>
+#include <ppc4xx.h>
 #include <asm/processor.h>
 #include <spd_sdram.h>
 
+extern flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips   */
+
 int board_early_init_f(void)
 {
        register uint reg;
@@ -35,7 +38,7 @@ int board_early_init_f(void)
        mtdcr(ebccfgd, reg | 0x04000000);       /* Set ATC */
 
        mtebc(pb0ap, 0x03017300);       /* FLASH/SRAM */
-       mtebc(pb0cr, 0xfe0ba000);       /* BAS=0xfe0 32MB r/w 16-bit */
+       mtebc(pb0cr, 0xfc0da000);       /* BAS=0xfc0 64MB r/w 16-bit */
 
        mtebc(pb1ap, 0x00000000);
        mtebc(pb1cr, 0x00000000);
@@ -92,6 +95,11 @@ int board_early_init_f(void)
        out32(GPIO1_OSRL, in32(GPIO1_OSRL) | 0x00080000);
        out32(GPIO1_ISR2L, in32(GPIO1_ISR2L) | 0x00010000);
 
+       /* external interrupts IRQ0...3 */
+       out32(GPIO1_TCR, in32(GPIO1_TCR) & ~0x0f000000);
+       out32(GPIO1_TSRL, in32(GPIO1_TSRL) & ~0x00005500);
+       out32(GPIO1_ISR1L, in32(GPIO1_ISR1L) | 0x00005500);
+
        /*setup USB 2.0 */
        out32(GPIO1_TCR, in32(GPIO1_TCR) | 0xc0000000);
        out32(GPIO1_OSRL, in32(GPIO1_OSRL) | 0x50000000);
@@ -122,19 +130,75 @@ int board_early_init_f(void)
        return 0;
 }
 
+int misc_init_r (void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+       uint pbcr;
+       int size_val = 0;
+
+       /* Re-do sizing to get full correct info */
+       mtdcr(ebccfga, pb0cr);
+       pbcr = mfdcr(ebccfgd);
+       switch (gd->bd->bi_flashsize) {
+       case 1 << 20:
+               size_val = 0;
+               break;
+       case 2 << 20:
+               size_val = 1;
+               break;
+       case 4 << 20:
+               size_val = 2;
+               break;
+       case 8 << 20:
+               size_val = 3;
+               break;
+       case 16 << 20:
+               size_val = 4;
+               break;
+       case 32 << 20:
+               size_val = 5;
+               break;
+       case 64 << 20:
+               size_val = 6;
+               break;
+       case 128 << 20:
+               size_val = 7;
+               break;
+       }
+       pbcr = (pbcr & 0x0001ffff) | gd->bd->bi_flashstart | (size_val << 17);
+       mtdcr(ebccfga, pb0cr);
+       mtdcr(ebccfgd, pbcr);
+
+       /* Monitor protection ON by default */
+       (void)flash_protect(FLAG_PROTECT_SET,
+                           -CFG_MONITOR_LEN,
+                           0xffffffff,
+                           &flash_info[0]);
+
+       return 0;
+}
+
 int checkboard(void)
 {
        sys_info_t sysinfo;
+       unsigned char *s = getenv("serial#");
 
        get_sys_info(&sysinfo);
 
-       printf("Board: AMCC YOSEMITE\n");
+       printf("Board: Yosemite - AMCC PPC440EP Evaluation Board");
+       if (s != NULL) {
+               puts(", serial# ");
+               puts(s);
+       }
+       putc('\n');
+
        printf("\tVCO: %lu MHz\n", sysinfo.freqVCOMhz / 1000000);
        printf("\tCPU: %lu MHz\n", sysinfo.freqProcessor / 1000000);
        printf("\tPLB: %lu MHz\n", sysinfo.freqPLB / 1000000);
        printf("\tOPB: %lu MHz\n", sysinfo.freqOPB / 1000000);
-       printf("\tPER: %lu MHz\n", sysinfo.freqEPB / 1000000);
+       printf("\tEPB: %lu MHz\n", sysinfo.freqEPB / 1000000);
        printf("\tPCI: %lu MHz\n", sysinfo.freqPCI / 1000000);
+
        return (0);
 }