diff options
Diffstat (limited to 'cpu/74xx_7xx')
-rw-r--r-- | cpu/74xx_7xx/cpu.c | 24 | ||||
-rw-r--r-- | cpu/74xx_7xx/cpu_init.c | 9 | ||||
-rw-r--r-- | cpu/74xx_7xx/speed.c | 106 | ||||
-rw-r--r-- | cpu/74xx_7xx/start.S | 7 |
4 files changed, 104 insertions, 42 deletions
diff --git a/cpu/74xx_7xx/cpu.c b/cpu/74xx_7xx/cpu.c index 30a2091..629ed66 100644 --- a/cpu/74xx_7xx/cpu.c +++ b/cpu/74xx_7xx/cpu.c @@ -79,6 +79,10 @@ get_cpu_type(void) type = CPU_750FX; break; + case 0x7002: + type = CPU_750GX; + break; + case 0x800C: type = CPU_7410; break; @@ -87,6 +91,14 @@ get_cpu_type(void) type = CPU_7450; break; + case 0x8001: + type = CPU_7455; + break; + + case 0x8002: + type = CPU_7457; + break; + default: break; } @@ -124,6 +136,10 @@ int checkcpu (void) str = "750FX"; break; + case CPU_750GX: + str = "750GX"; + break; + case CPU_755: str = "755"; break; @@ -140,6 +156,14 @@ int checkcpu (void) str = "MPC7450"; break; + case CPU_7455: + str = "MPC7455"; + break; + + case CPU_7457: + str = "MPC7457"; + break; + default: printf("Unknown CPU -- PVR: 0x%08x\n", pvr); return -1; diff --git a/cpu/74xx_7xx/cpu_init.c b/cpu/74xx_7xx/cpu_init.c index 2843e26..93f180f 100644 --- a/cpu/74xx_7xx/cpu_init.c +++ b/cpu/74xx_7xx/cpu_init.c @@ -39,9 +39,16 @@ void cpu_init_f (void) { - if (get_cpu_type() == CPU_7450) { + switch (get_cpu_type()) { + case CPU_7450: + case CPU_7455: + case CPU_7457: /* enable the timebase bit in HID0 */ set_hid0(get_hid0() | 0x4000000); + break; + default: + /* do nothing */ + break; } } diff --git a/cpu/74xx_7xx/speed.c b/cpu/74xx_7xx/speed.c index 12bdf37..f94ff78 100644 --- a/cpu/74xx_7xx/speed.c +++ b/cpu/74xx_7xx/speed.c @@ -12,7 +12,7 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License @@ -49,29 +49,29 @@ static const int hid1_multipliers_x_10[] = { }; static const int hid1_fx_multipliers_x_10[] = { - 00, /* 0000 - off */ - 00, /* 0001 - off */ - 10, /* 0010 - bypass */ - 10, /* 0011 - bypass */ - 20, /* 0100 - 2x */ - 25, /* 0101 - 2.5x */ - 30, /* 0110 - 3x */ - 35, /* 0111 - 3.5x */ - 40, /* 1000 - 4x */ - 45, /* 1001 - 4.5x */ - 50, /* 1010 - 5x */ - 55, /* 1011 - 5.5x */ - 60, /* 1100 - 6x */ - 65, /* 1101 - 6.5x */ - 70, /* 1110 - 7x */ - 75, /* 1111 - 7.5 */ - 80, /* 10000 - 8x */ - 85, /* 10001 - 8.5x */ - 90, /* 10010 - 9x */ - 95, /* 10011 - 9.5x */ - 100, /* 10100 - 10x */ - 110, /* 10101 - 11x */ - 120, /* 10110 - 12x */ + 00, /* 0000 - off */ + 00, /* 0001 - off */ + 10, /* 0010 - bypass */ + 10, /* 0011 - bypass */ + 20, /* 0100 - 2x */ + 25, /* 0101 - 2.5x */ + 30, /* 0110 - 3x */ + 35, /* 0111 - 3.5x */ + 40, /* 1000 - 4x */ + 45, /* 1001 - 4.5x */ + 50, /* 1010 - 5x */ + 55, /* 1011 - 5.5x */ + 60, /* 1100 - 6x */ + 65, /* 1101 - 6.5x */ + 70, /* 1110 - 7x */ + 75, /* 1111 - 7.5 */ + 80, /* 10000 - 8x */ + 85, /* 10001 - 8.5x */ + 90, /* 10010 - 9x */ + 95, /* 10011 - 9.5x */ + 100, /* 10100 - 10x */ + 110, /* 10101 - 11x */ + 120, /* 10110 - 12x */ }; @@ -86,13 +86,48 @@ static const int hid1_fx_multipliers_x_10[] = { int get_clocks (void) { DECLARE_GLOBAL_DATA_PTR; -#ifdef CONFIG_750FX - ulong clock = CFG_BUS_CLK * \ - hid1_fx_multipliers_x_10[get_hid1 () >> 27] / 10; -#else - ulong clock = CFG_BUS_CLK * \ - hid1_multipliers_x_10[get_hid1 () >> 28] / 10; -#endif + ulong clock = 0; + + /* calculate the clock frequency based upon the CPU type */ + switch (get_cpu_type()) { + case CPU_7455: + case CPU_7457: + /* + * It is assumed that the PLL_EXT line is zero. + * Make sure division is done before multiplication to prevent 32-bit + * arithmetic overflows which will cause a negative number + */ + clock = (CFG_BUS_CLK / 10) * hid1_multipliers_x_10[(get_hid1 () >> 13) & 0xF]; + break; + + case CPU_750GX: + case CPU_750FX: + clock = CFG_BUS_CLK * hid1_fx_multipliers_x_10[get_hid1 () >> 27] / 10; + break; + + case CPU_7450: + case CPU_740: + case CPU_740P: + case CPU_745: + case CPU_750CX: + case CPU_750: + case CPU_750P: + case CPU_755: + case CPU_7400: + case CPU_7410: + /* + * Make sure division is done before multiplication to prevent 32-bit + * arithmetic overflows which will cause a negative number + */ + clock = (CFG_BUS_CLK / 10) * hid1_multipliers_x_10[get_hid1 () >> 28]; + break; + + case CPU_UNKNOWN: + printf ("get_gclk_freq(): unknown CPU type\n"); + clock = 0; + return (1); + } + gd->cpu_clk = clock; gd->bus_clk = CFG_BUS_CLK; @@ -100,12 +135,3 @@ int get_clocks (void) } /* ------------------------------------------------------------------------- */ - -#if 0 /* disabled XXX - use global data instead */ -ulong get_bus_freq (ulong gclk_freq) -{ - return CFG_BUS_CLK; -} -#endif /* 0 */ - -/* ------------------------------------------------------------------------- */ diff --git a/cpu/74xx_7xx/start.S b/cpu/74xx_7xx/start.S index 7d7a493..e8854f0 100644 --- a/cpu/74xx_7xx/start.S +++ b/cpu/74xx_7xx/start.S @@ -42,7 +42,10 @@ #include <asm/cache.h> #include <asm/mmu.h> +#if !defined(CONFIG_DB64360) && \ + !defined(CONFIG_DB64460) #include <galileo/gt64260R.h> +#endif #ifndef CONFIG_IDENT_STRING #define CONFIG_IDENT_STRING "" @@ -749,7 +752,9 @@ in_ram: bne 5b 6: mr r3, r10 /* Destination Address */ -#ifdef CONFIG_AMIGAONEG3SE +#if defined(CONFIG_AMIGAONEG3SE) || \ + defined(CONFIG_DB64360) || \ + defined(CONFIG_DB64460) mr r4, r9 /* Use RAM copy of the global data */ #endif bl after_reloc |