diff options
Diffstat (limited to 'cpu')
95 files changed, 1931 insertions, 1478 deletions
| diff --git a/cpu/74xx_7xx/cpu.c b/cpu/74xx_7xx/cpu.c index f4e5fc504..9c8998b60 100644 --- a/cpu/74xx_7xx/cpu.c +++ b/cpu/74xx_7xx/cpu.c @@ -44,6 +44,10 @@  #include <74xx_7xx.h>  #include <asm/cache.h> +#if defined(CONFIG_OF_FLAT_TREE) +#include <ft_build.h> +#endif +  #ifdef CONFIG_AMIGAONEG3SE  #include "../board/MAI/AmigaOneG3SE/via686.h"  #include "../board/MAI/AmigaOneG3SE/memio.h" @@ -101,6 +105,10 @@ get_cpu_type(void)  		type = CPU_7457;  		break; +	case 0x8003: +		type = CPU_7447A; +		break; +  	case 0x8004:  		type = CPU_7448;  		break; @@ -156,6 +164,10 @@ int checkcpu (void)  		str = "MPC7410";  		break; +	case CPU_7447A: +		str = "MPC7447A"; +		break; +  	case CPU_7448:  		str = "MPC7448";  		break; @@ -264,20 +276,19 @@ do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  /*   * For the 7400 the TB clock runs at 1/4 the cpu bus speed.   */ -#ifdef CONFIG_AMIGAONEG3SE +#if defined(CONFIG_AMIGAONEG3SE) || defined(CFG_CONFIG_BUS_CLK)  unsigned long get_tbclk(void)  {  	return (gd->bus_clk / 4);  } -#else	/* ! CONFIG_AMIGAONEG3SE */ +#else	/* ! CONFIG_AMIGAONEG3SE and !CFG_CONFIG_BUS_CLK*/  unsigned long get_tbclk (void)  {  	return CFG_BUS_HZ / 4;  } -#endif	/* CONFIG_AMIGAONEG3SE */ +#endif	/* CONFIG_AMIGAONEG3SE or CFG_CONFIG_BUS_CLK*/  /* ------------------------------------------------------------------------- */ -  #if defined(CONFIG_WATCHDOG)  #if !defined(CONFIG_PCIPPC2) && !defined(CONFIG_BAB7xx)  void @@ -289,3 +300,30 @@ watchdog_reset(void)  #endif	/* CONFIG_WATCHDOG */  /* ------------------------------------------------------------------------- */ + +#ifdef CONFIG_OF_FLAT_TREE +void +ft_cpu_setup (void *blob, bd_t *bd) +{ +	u32 *p; +	ulong clock; +	int len; + +	clock = bd->bi_busfreq; + +	p = ft_get_prop (blob, "/cpus/" OF_CPU "/bus-frequency", &len); +	if (p != NULL) +		*p = cpu_to_be32 (clock); + +#if defined(CONFIG_TSI108_ETH) +	p = ft_get_prop (blob, "/" OF_TSI "/ethernet@6200/address", &len); +		memcpy (p, bd->bi_enetaddr, 6); +#endif + +#if defined(CONFIG_HAS_ETH1) +	p = ft_get_prop (blob, "/" OF_TSI "/ethernet@6600/address", &len); +		memcpy (p, bd->bi_enet1addr, 6); +#endif +} +#endif +/* ------------------------------------------------------------------------- */ diff --git a/cpu/74xx_7xx/cpu_init.c b/cpu/74xx_7xx/cpu_init.c index e02a4cc21..1dd1b2cd8 100644 --- a/cpu/74xx_7xx/cpu_init.c +++ b/cpu/74xx_7xx/cpu_init.c @@ -43,6 +43,7 @@ cpu_init_f (void)  	case CPU_7450:  	case CPU_7455:  	case CPU_7457: +	case CPU_7447A:  	case CPU_7448:  		/* enable the timebase bit in HID0 */  		set_hid0(get_hid0() | 0x4000000); diff --git a/cpu/74xx_7xx/speed.c b/cpu/74xx_7xx/speed.c index d1800ede0..d8c40cea0 100644 --- a/cpu/74xx_7xx/speed.c +++ b/cpu/74xx_7xx/speed.c @@ -31,6 +31,8 @@  DECLARE_GLOBAL_DATA_PTR; +extern unsigned long get_board_bus_clk (void); +  static const int hid1_multipliers_x_10[] = {  	25,	/* 0000 - 2.5x */  	75,	/* 0001 - 7.5x */ @@ -50,6 +52,42 @@ static const int hid1_multipliers_x_10[] = {  	0	/* 1111 - off */  }; +/* PLL_CFG[0:4] table for cpu 7448/7447A/7455/7457 */ +static const int hid1_74xx_multipliers_x_10[] = { +	115,	/* 00000 - 11.5x  */ +	170,	/* 00001 - 17x    */ +	75,	/* 00010 -  7.5x  */ +	150,	/* 00011 - 15x    */ +	70,	/* 00100 -  7x    */ +	180,	/* 00101 - 18x    */ +	10,	/* 00110 - bypass */ +	200,	/* 00111 - 20x    */ +	20,	/* 01000 -  2x    */ +	210,	/* 01001 - 21x    */ +	65,	/* 01010 -  6.5x  */ +	130,	/* 01011 - 13x    */ +	85,	/* 01100 -  8.5x  */ +	240,	/* 01101 - 24x    */ +	95,	/* 01110 -  9.5x  */ +	90,	/* 01111 -  9x    */ +	30,	/* 10000 -  3x    */ +	105,	/* 10001 - 10.5x  */ +	55,	/* 10010 -  5.5x  */ +	110,	/* 10011 - 11x    */ +	40,	/* 10100 -  4x    */ +	100,	/* 10101 - 10x    */ +	50,	/* 10110 -  5x    */ +	120,	/* 10111 - 12x    */ +	80,	/* 11000 -  8x    */ +	140,	/* 11001 - 14x    */ +	60,	/* 11010 -  6x    */ +	160,	/* 11011 - 16x    */ +	135,	/* 11100 - 13.5x  */ +	280,	/* 11101 - 28x    */ +	0,	/* 11110 - off    */ +	125	/* 11111 - 12.5x  */ +}; +  static const int hid1_fx_multipliers_x_10[] = {  	00,	/* 0000 - off */  	00,	/* 0001 - off */ @@ -89,22 +127,30 @@ int get_clocks (void)  {  	ulong clock = 0; +#ifdef CFG_BUS_CLK +	gd->bus_clk = CFG_BUS_CLK;	/* bus clock is a fixed frequency */ +#else +	gd->bus_clk = get_board_bus_clk ();	/* bus clock is configurable */ +#endif +  	/* calculate the clock frequency based upon the CPU type */  	switch (get_cpu_type()) { +	case CPU_7447A:  	case CPU_7448:  	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]; +		clock = (gd->bus_clk / 10) * +			hid1_74xx_multipliers_x_10[(get_hid1 () >> 12) & 0x1F];  		break;  	case CPU_750GX:  	case CPU_750FX: -		clock = CFG_BUS_CLK * hid1_fx_multipliers_x_10[get_hid1 () >> 27] / 10; +		clock = gd->bus_clk * +			hid1_fx_multipliers_x_10[get_hid1 () >> 27] / 10;  		break;  	case CPU_7450: @@ -121,7 +167,8 @@ int get_clocks (void)  		 * 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]; +		clock = (gd->bus_clk / 10) * +			hid1_multipliers_x_10[get_hid1 () >> 28];  		break;  	case CPU_UNKNOWN: @@ -131,7 +178,6 @@ int get_clocks (void)  	}  	gd->cpu_clk = clock; -	gd->bus_clk = CFG_BUS_CLK;  	return (0);  } diff --git a/cpu/at32ap/Makefile b/cpu/at32ap/Makefile index f62ec8bc9..f69b1f385 100644 --- a/cpu/at32ap/Makefile +++ b/cpu/at32ap/Makefile @@ -30,7 +30,7 @@ LIB	:= $(obj)lib$(CPU).a  START	:= start.o  SOBJS	:= entry.o  COBJS	:= cpu.o hsdramc.o exception.o cache.o -COBJS	+= interrupts.o device.o pm.o pio.o +COBJS	+= interrupts.o pio.o atmel_mci.o  SRCS	:= $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)  OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS))  START	:= $(addprefix $(obj),$(START)) diff --git a/cpu/at32ap/at32ap7000/Makefile b/cpu/at32ap/at32ap7000/Makefile index 2ed74d250..d27671211 100644 --- a/cpu/at32ap/at32ap7000/Makefile +++ b/cpu/at32ap/at32ap7000/Makefile @@ -24,7 +24,7 @@ include $(TOPDIR)/config.mk  LIB	:= $(obj)lib$(SOC).a -COBJS	:= hebi.o devices.o +COBJS	:= gpio.o  SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)  OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/cpu/at32ap/at32ap7000/devices.c b/cpu/at32ap/at32ap7000/devices.c deleted file mode 100644 index 8b216e906..000000000 --- a/cpu/at32ap/at32ap7000/devices.c +++ /dev/null @@ -1,448 +0,0 @@ -/* - * Copyright (C) 2006 Atmel Corporation - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ -#include <common.h> - -#include <asm/arch/memory-map.h> -#include <asm/arch/platform.h> - -#include "../sm.h" - -#define ARRAY_SIZE(x)	(sizeof(x) / sizeof((x)[0])) - -const struct clock_domain chip_clock[] = { -	[CLOCK_CPU] = { -		.reg	= SM_PM_CPU_MASK, -		.id	= CLOCK_CPU, -		.bridge	= NO_DEVICE, -	}, -	[CLOCK_HSB] = { -		.reg	= SM_PM_HSB_MASK, -		.id	= CLOCK_HSB, -		.bridge	= NO_DEVICE, -	}, -	[CLOCK_PBA] = { -		.reg	= SM_PM_PBA_MASK, -		.id	= CLOCK_PBA, -		.bridge	= DEVICE_PBA_BRIDGE, -	}, -	[CLOCK_PBB] = { -		.reg	= SM_PM_PBB_MASK, -		.id	= CLOCK_PBB, -		.bridge	= DEVICE_PBB_BRIDGE, -	}, -}; - -static const struct resource hebi_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_HSB, 0 }, -		}, -	}, { -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBB, 13 }, -		}, -	}, { -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBB, 14 }, -		}, -	}, { -		.type	= RESOURCE_GPIO, -		.u	= { -			.gpio	= { 27, DEVICE_PIOE, GPIO_FUNC_A, 0 }, -		}, -	}, -}; -static const struct resource pba_bridge_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_HSB, 1 }, -		} -	}, { -		.type	= RESOURCE_CLOCK, -		.u	= { -			/* HSB-HSB Bridge */ -			.clock	= { CLOCK_HSB, 4 }, -		}, -	}, -}; -static const struct resource pbb_bridge_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_HSB, 2 }, -		}, -	}, -}; -static const struct resource hramc_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_HSB, 3 }, -		}, -	}, -}; -static const struct resource pioa_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBA, 10 }, -		}, -	}, -}; -static const struct resource piob_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBA, 11 }, -		}, -	}, -}; -static const struct resource pioc_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBA, 12 }, -		}, -	}, -}; -static const struct resource piod_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBA, 13 }, -		}, -	}, -}; -static const struct resource pioe_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBA, 14 }, -		}, -	}, -}; -static const struct resource sm_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBB, 0 }, -		}, -	}, -}; -static const struct resource intc_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock = { CLOCK_PBB, 1 }, -		}, -	}, -}; -static const struct resource hmatrix_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock = { CLOCK_PBB, 2 }, -		}, -	}, -}; -#if defined(CFG_HPDC) -static const struct resource hpdc_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBA, 16 }, -		}, -	}, -}; -#endif -#if defined(CFG_MACB0) -static const struct resource macb0_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_HSB, 8 }, -		}, -	}, { -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBB, 6 }, -		}, -	}, { -		.type	= RESOURCE_GPIO, -		.u	= { -			.gpio	= { 19, DEVICE_PIOC, GPIO_FUNC_A, 0 }, -		}, -	}, -}; -#endif -#if defined(CFG_MACB1) -static const struct resource macb1_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_HSB, 9 }, -		}, -	}, { -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBB, 7 }, -		}, -	}, { -		.type	= RESOURCE_GPIO, -		.u	= { -			.gpio	= { 12, DEVICE_PIOC, GPIO_FUNC_B, 19 }, -		}, -	}, { -		.type	= RESOURCE_GPIO, -		.u	= { -			.gpio	= { 14, DEVICE_PIOD, GPIO_FUNC_B, 2 }, -		}, -	}, -}; -#endif -#if defined(CFG_LCDC) -static const struct resource lcdc_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_HSB, 7 }, -		}, -	}, -}; -#endif -#if defined(CFG_USART0) -static const struct resource usart0_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBA, 3 }, -		}, -	}, { -		.type	= RESOURCE_GPIO, -		.u	= { -			.gpio = { 2, DEVICE_PIOA, GPIO_FUNC_B, 8 }, -		}, -	}, -}; -#endif -#if defined(CFG_USART1) -static const struct resource usart1_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBA, 4 }, -		}, -	}, { -		.type	= RESOURCE_GPIO, -		.u	= { -			.gpio = { 2, DEVICE_PIOA, GPIO_FUNC_A, 17 }, -		}, -	}, -}; -#endif -#if defined(CFG_USART2) -static const struct resource usart2_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBA, 5 }, -		}, -	}, { -		.type	= RESOURCE_GPIO, -		.u	= { -			.gpio = { 2, DEVICE_PIOB, GPIO_FUNC_B, 26 }, -		}, -	}, -}; -#endif -#if defined(CFG_USART3) -static const struct resource usart3_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBA, 6 }, -		}, -	}, { -		.type	= RESOURCE_GPIO, -		.u	= { -			.gpio = { 2, DEVICE_PIOB, GPIO_FUNC_B, 17 }, -		}, -	}, -}; -#endif -#if defined(CFG_MMCI) -static const struct resource mmci_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_PBB, 9 }, -		}, -	}, { -		.type	= RESOURCE_GPIO, -		.u	= { -			.gpio = { 6, DEVICE_PIOA, GPIO_FUNC_A, 10 }, -		}, -	}, -}; -#endif -#if defined(CFG_DMAC) -static const struct resource dmac_resource[] = { -	{ -		.type	= RESOURCE_CLOCK, -		.u	= { -			.clock	= { CLOCK_HSB, 10 }, -		}, -	}, -}; -#endif - -const struct device chip_device[] = { -	[DEVICE_HEBI] = { -		.regs		= (void *)HSMC_BASE, -		.nr_resources	= ARRAY_SIZE(hebi_resource), -		.resource	= hebi_resource, -	}, -	[DEVICE_PBA_BRIDGE] = { -		.nr_resources	= ARRAY_SIZE(pba_bridge_resource), -		.resource	= pba_bridge_resource, -	}, -	[DEVICE_PBB_BRIDGE] = { -		.nr_resources	= ARRAY_SIZE(pbb_bridge_resource), -		.resource	= pbb_bridge_resource, -	}, -	[DEVICE_HRAMC] = { -		.nr_resources	= ARRAY_SIZE(hramc_resource), -		.resource	= hramc_resource, -	}, -	[DEVICE_PIOA] = { -		.regs		= (void *)PIOA_BASE, -		.nr_resources	= ARRAY_SIZE(pioa_resource), -		.resource	= pioa_resource, -	}, -	[DEVICE_PIOB] = { -		.regs		= (void *)PIOB_BASE, -		.nr_resources	= ARRAY_SIZE(piob_resource), -		.resource	= piob_resource, -	}, -	[DEVICE_PIOC] = { -		.regs		= (void *)PIOC_BASE, -		.nr_resources	= ARRAY_SIZE(pioc_resource), -		.resource	= pioc_resource, -	}, -	[DEVICE_PIOD] = { -		.regs		= (void *)PIOD_BASE, -		.nr_resources	= ARRAY_SIZE(piod_resource), -		.resource	= piod_resource, -	}, -	[DEVICE_PIOE] = { -		.regs		= (void *)PIOE_BASE, -		.nr_resources	= ARRAY_SIZE(pioe_resource), -		.resource	= pioe_resource, -	}, -	[DEVICE_SM] = { -		.regs		= (void *)SM_BASE, -		.nr_resources	= ARRAY_SIZE(sm_resource), -		.resource	= sm_resource, -	}, -	[DEVICE_INTC] = { -		.regs		= (void *)INTC_BASE, -		.nr_resources	= ARRAY_SIZE(intc_resource), -		.resource	= intc_resource, -	}, -	[DEVICE_HMATRIX] = { -		.regs		= (void *)HMATRIX_BASE, -		.nr_resources	= ARRAY_SIZE(hmatrix_resource), -		.resource	= hmatrix_resource, -	}, -#if defined(CFG_HPDC) -	[DEVICE_HPDC] = { -		.nr_resources	= ARRAY_SIZE(hpdc_resource), -		.resource	= hpdc_resource, -	}, -#endif -#if defined(CFG_MACB0) -	[DEVICE_MACB0] = { -		.regs		= (void *)MACB0_BASE, -		.nr_resources	= ARRAY_SIZE(macb0_resource), -		.resource	= macb0_resource, -	}, -#endif -#if defined(CFG_MACB1) -	[DEVICE_MACB1] = { -		.regs		= (void *)MACB1_BASE, -		.nr_resources	= ARRAY_SIZE(macb1_resource), -		.resource	= macb1_resource, -	}, -#endif -#if defined(CFG_LCDC) -	[DEVICE_LCDC] = { -		.nr_resources	= ARRAY_SIZE(lcdc_resource), -		.resource	= lcdc_resource, -	}, -#endif -#if defined(CFG_USART0) -	[DEVICE_USART0] = { -		.regs		= (void *)USART0_BASE, -		.nr_resources	= ARRAY_SIZE(usart0_resource), -		.resource	= usart0_resource, -	}, -#endif -#if defined(CFG_USART1) -	[DEVICE_USART1] = { -		.regs		= (void *)USART1_BASE, -		.nr_resources	= ARRAY_SIZE(usart1_resource), -		.resource	= usart1_resource, -	}, -#endif -#if defined(CFG_USART2) -	[DEVICE_USART2] = { -		.regs		= (void *)USART2_BASE, -		.nr_resources	= ARRAY_SIZE(usart2_resource), -		.resource	= usart2_resource, -	}, -#endif -#if defined(CFG_USART3) -	[DEVICE_USART3] = { -		.regs		= (void *)USART3_BASE, -		.nr_resources	= ARRAY_SIZE(usart3_resource), -		.resource	= usart3_resource, -	}, -#endif -#if defined(CFG_MMCI) -	[DEVICE_MMCI] = { -		.regs		= (void *)MMCI_BASE, -		.nr_resources	= ARRAY_SIZE(mmci_resource), -		.resource	= mmci_resource, -	}, -#endif -#if defined(CFG_DMAC) -	[DEVICE_DMAC] = { -		.regs		= (void *)DMAC_BASE, -		.nr_resources	= ARRAY_SIZE(dmac_resource), -		.resource	= dmac_resource, -	}, -#endif -}; diff --git a/cpu/at32ap/at32ap7000/gpio.c b/cpu/at32ap/at32ap7000/gpio.c new file mode 100644 index 000000000..52f5372a6 --- /dev/null +++ b/cpu/at32ap/at32ap7000/gpio.c @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2006 Atmel Corporation + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * 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 + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ +#include <common.h> + +#include <asm/arch/gpio.h> + +/* + * Lots of small functions here. We depend on --gc-sections getting + * rid of the ones we don't need. + */ +void gpio_enable_ebi(void) +{ +#ifdef CFG_HSDRAMC +#ifndef CFG_SDRAM_16BIT +	gpio_select_periph_A(GPIO_PIN_PE0, 0); +	gpio_select_periph_A(GPIO_PIN_PE1, 0); +	gpio_select_periph_A(GPIO_PIN_PE2, 0); +	gpio_select_periph_A(GPIO_PIN_PE3, 0); +	gpio_select_periph_A(GPIO_PIN_PE4, 0); +	gpio_select_periph_A(GPIO_PIN_PE5, 0); +	gpio_select_periph_A(GPIO_PIN_PE6, 0); +	gpio_select_periph_A(GPIO_PIN_PE7, 0); +	gpio_select_periph_A(GPIO_PIN_PE8, 0); +	gpio_select_periph_A(GPIO_PIN_PE9, 0); +	gpio_select_periph_A(GPIO_PIN_PE10, 0); +	gpio_select_periph_A(GPIO_PIN_PE11, 0); +	gpio_select_periph_A(GPIO_PIN_PE12, 0); +	gpio_select_periph_A(GPIO_PIN_PE13, 0); +	gpio_select_periph_A(GPIO_PIN_PE14, 0); +	gpio_select_periph_A(GPIO_PIN_PE15, 0); +#endif +	gpio_select_periph_A(GPIO_PIN_PE26, 0); +#endif +} + +void gpio_enable_usart0(void) +{ +	gpio_select_periph_B(GPIO_PIN_PA8, 0); +	gpio_select_periph_B(GPIO_PIN_PA9, 0); +} + +void gpio_enable_usart1(void) +{ +	gpio_select_periph_A(GPIO_PIN_PA17, 0); +	gpio_select_periph_A(GPIO_PIN_PA18, 0); +} + +void gpio_enable_usart2(void) +{ +	gpio_select_periph_B(GPIO_PIN_PB26, 0); +	gpio_select_periph_B(GPIO_PIN_PB27, 0); +} + +void gpio_enable_usart3(void) +{ +	gpio_select_periph_B(GPIO_PIN_PB18, 0); +	gpio_select_periph_B(GPIO_PIN_PB19, 0); +} + +void gpio_enable_macb0(void) +{ +	gpio_select_periph_A(GPIO_PIN_PC3,  0);	/* TXD0	*/ +	gpio_select_periph_A(GPIO_PIN_PC4,  0);	/* TXD1	*/ +	gpio_select_periph_A(GPIO_PIN_PC7,  0);	/* TXEN	*/ +	gpio_select_periph_A(GPIO_PIN_PC8,  0);	/* TXCK */ +	gpio_select_periph_A(GPIO_PIN_PC9,  0);	/* RXD0	*/ +	gpio_select_periph_A(GPIO_PIN_PC10, 0);	/* RXD1	*/ +	gpio_select_periph_A(GPIO_PIN_PC13, 0);	/* RXER	*/ +	gpio_select_periph_A(GPIO_PIN_PC15, 0);	/* RXDV	*/ +	gpio_select_periph_A(GPIO_PIN_PC16, 0);	/* MDC	*/ +	gpio_select_periph_A(GPIO_PIN_PC17, 0);	/* MDIO	*/ +#if !defined(CONFIG_RMII) +	gpio_select_periph_A(GPIO_PIN_PC0,  0);	/* COL	*/ +	gpio_select_periph_A(GPIO_PIN_PC1,  0);	/* CRS	*/ +	gpio_select_periph_A(GPIO_PIN_PC2,  0);	/* TXER	*/ +	gpio_select_periph_A(GPIO_PIN_PC5,  0);	/* TXD2	*/ +	gpio_select_periph_A(GPIO_PIN_PC6,  0);	/* TXD3 */ +	gpio_select_periph_A(GPIO_PIN_PC11, 0);	/* RXD2	*/ +	gpio_select_periph_A(GPIO_PIN_PC12, 0);	/* RXD3	*/ +	gpio_select_periph_A(GPIO_PIN_PC14, 0);	/* RXCK	*/ +	gpio_select_periph_A(GPIO_PIN_PC18, 0);	/* SPD	*/ +#endif +} + +void gpio_enable_macb1(void) +{ +	gpio_select_periph_B(GPIO_PIN_PD13, 0);	/* TXD0	*/ +	gpio_select_periph_B(GPIO_PIN_PD14, 0);	/* TXD1	*/ +	gpio_select_periph_B(GPIO_PIN_PD11, 0);	/* TXEN	*/ +	gpio_select_periph_B(GPIO_PIN_PD12, 0);	/* TXCK */ +	gpio_select_periph_B(GPIO_PIN_PD10, 0);	/* RXD0	*/ +	gpio_select_periph_B(GPIO_PIN_PD6,  0);	/* RXD1	*/ +	gpio_select_periph_B(GPIO_PIN_PD5,  0);	/* RXER	*/ +	gpio_select_periph_B(GPIO_PIN_PD4,  0);	/* RXDV	*/ +	gpio_select_periph_B(GPIO_PIN_PD3,  0);	/* MDC	*/ +	gpio_select_periph_B(GPIO_PIN_PD2,  0);	/* MDIO	*/ +#if !defined(CONFIG_RMII) +	gpio_select_periph_B(GPIO_PIN_PC19, 0);	/* COL	*/ +	gpio_select_periph_B(GPIO_PIN_PC23, 0);	/* CRS	*/ +	gpio_select_periph_B(GPIO_PIN_PC26, 0);	/* TXER	*/ +	gpio_select_periph_B(GPIO_PIN_PC27, 0);	/* TXD2	*/ +	gpio_select_periph_B(GPIO_PIN_PC28, 0);	/* TXD3 */ +	gpio_select_periph_B(GPIO_PIN_PC29, 0);	/* RXD2	*/ +	gpio_select_periph_B(GPIO_PIN_PC30, 0);	/* RXD3	*/ +	gpio_select_periph_B(GPIO_PIN_PC24, 0);	/* RXCK	*/ +	gpio_select_periph_B(GPIO_PIN_PD15, 0);	/* SPD	*/ +#endif +} + +void gpio_enable_mmci(void) +{ +	gpio_select_periph_A(GPIO_PIN_PA10, 0);	/* CLK	 */ +	gpio_select_periph_A(GPIO_PIN_PA11, 0);	/* CMD	 */ +	gpio_select_periph_A(GPIO_PIN_PA12, 0);	/* DATA0 */ +	gpio_select_periph_A(GPIO_PIN_PA13, 0);	/* DATA1 */ +	gpio_select_periph_A(GPIO_PIN_PA14, 0);	/* DATA2 */ +	gpio_select_periph_A(GPIO_PIN_PA15, 0);	/* DATA3 */ +} diff --git a/cpu/at32ap/at32ap7000/hebi.c b/cpu/at32ap/at32ap7000/hebi.c deleted file mode 100644 index 3b32adf1e..000000000 --- a/cpu/at32ap/at32ap7000/hebi.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2006 Atmel Corporation - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ -#include <common.h> - -#include <asm/io.h> - -#include <asm/arch/hmatrix2.h> -#include <asm/arch/memory-map.h> -#include <asm/arch/platform.h> - -void cpu_enable_sdram(void) -{ -	const struct device *hmatrix; - -	hmatrix = get_device(DEVICE_HMATRIX); - -	/* Set the SDRAM_ENABLE bit in the HEBI SFR */ -	hmatrix2_writel(hmatrix, SFR4, 1 << 1); -} diff --git a/cpu/at32ap/atmel_mci.c b/cpu/at32ap/atmel_mci.c new file mode 100644 index 000000000..9f62c0f14 --- /dev/null +++ b/cpu/at32ap/atmel_mci.c @@ -0,0 +1,477 @@ +/* + * Copyright (C) 2004-2006 Atmel Corporation + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * 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 + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ +#include <common.h> + +#ifdef CONFIG_MMC + +#include <part.h> +#include <mmc.h> + +#include <asm/io.h> +#include <asm/errno.h> +#include <asm/byteorder.h> +#include <asm/arch/clk.h> +#include <asm/arch/memory-map.h> + +#include "atmel_mci.h" + +#ifdef DEBUG +#define pr_debug(fmt, args...) printf(fmt, ##args) +#else +#define pr_debug(...) do { } while(0) +#endif + +#ifndef CFG_MMC_CLK_OD +#define CFG_MMC_CLK_OD		150000 +#endif + +#ifndef CFG_MMC_CLK_PP +#define CFG_MMC_CLK_PP		5000000 +#endif + +#ifndef CFG_MMC_OP_COND +#define CFG_MMC_OP_COND		0x00100000 +#endif + +#define MMC_DEFAULT_BLKLEN	512 +#define MMC_DEFAULT_RCA		1 + +static unsigned int mmc_rca; +static block_dev_desc_t mmc_blkdev; + +block_dev_desc_t *mmc_get_dev(int dev) +{ +	return &mmc_blkdev; +} + +static void mci_set_mode(unsigned long hz, unsigned long blklen) +{ +	unsigned long bus_hz; +	unsigned long clkdiv; + +	bus_hz = get_mci_clk_rate(); +	clkdiv = (bus_hz / hz) / 2 - 1; + +	pr_debug("mmc: setting clock %lu Hz, block size %lu\n", +		 hz, blklen); + +	if (clkdiv & ~255UL) { +		clkdiv = 255; +		printf("mmc: clock %lu too low; setting CLKDIV to 255\n", +			hz); +	} + +	blklen &= 0xfffc; +	mmci_writel(MR, (MMCI_BF(CLKDIV, clkdiv) +			 | MMCI_BF(BLKLEN, blklen))); +} + +#define RESP_NO_CRC	1 +#define R1		MMCI_BF(RSPTYP, 1) +#define R2		MMCI_BF(RSPTYP, 2) +#define R3		(R1 | RESP_NO_CRC) +#define R6		R1 +#define NID		MMCI_BF(MAXLAT, 0) +#define NCR		MMCI_BF(MAXLAT, 1) +#define TRCMD_START	MMCI_BF(TRCMD, 1) +#define TRDIR_READ	MMCI_BF(TRDIR, 1) +#define TRTYP_BLOCK	MMCI_BF(TRTYP, 0) +#define INIT_CMD	MMCI_BF(SPCMD, 1) +#define OPEN_DRAIN	MMCI_BF(OPDCMD, 1) + +#define ERROR_FLAGS	(MMCI_BIT(DTOE)			\ +			 | MMCI_BIT(RDIRE)		\ +			 | MMCI_BIT(RENDE)		\ +			 | MMCI_BIT(RINDE)		\ +			 | MMCI_BIT(RTOE)) + +static int +mmc_cmd(unsigned long cmd, unsigned long arg, +	void *resp, unsigned long flags) +{ +	unsigned long *response = resp; +	int i, response_words = 0; +	unsigned long error_flags; +	u32 status; + +	pr_debug("mmc: CMD%lu 0x%lx (flags 0x%lx)\n", +		 cmd, arg, flags); + +	error_flags = ERROR_FLAGS; +	if (!(flags & RESP_NO_CRC)) +		error_flags |= MMCI_BIT(RCRCE); + +	flags &= ~MMCI_BF(CMDNB, ~0UL); + +	if (MMCI_BFEXT(RSPTYP, flags) == MMCI_RSPTYP_48_BIT_RESP) +		response_words = 1; +	else if (MMCI_BFEXT(RSPTYP, flags) == MMCI_RSPTYP_136_BIT_RESP) +		response_words = 4; + +	mmci_writel(ARGR, arg); +	mmci_writel(CMDR, cmd | flags); +	do { +		udelay(40); +		status = mmci_readl(SR); +	} while (!(status & MMCI_BIT(CMDRDY))); + +	pr_debug("mmc: status 0x%08lx\n", status); + +	if (status & ERROR_FLAGS) { +		printf("mmc: command %lu failed (status: 0x%08lx)\n", +		       cmd, status); +		return -EIO; +	} + +	if (response_words) +		pr_debug("mmc: response:"); + +	for (i = 0; i < response_words; i++) { +		response[i] = mmci_readl(RSPR); +		pr_debug(" %08lx", response[i]); +	} +	pr_debug("\n"); + +	return 0; +} + +static int mmc_acmd(unsigned long cmd, unsigned long arg, +		    void *resp, unsigned long flags) +{ +	unsigned long aresp[4]; +	int ret; + +	/* +	 * Seems like the APP_CMD part of an ACMD has 64 cycles max +	 * latency even though the ACMD part doesn't. This isn't +	 * entirely clear in the SD Card spec, but some cards refuse +	 * to work if we attempt to use 5 cycles max latency here... +	 */ +	ret = mmc_cmd(MMC_CMD_APP_CMD, 0, aresp, +		      R1 | NCR | (flags & OPEN_DRAIN)); +	if (ret) +		return ret; +	if ((aresp[0] & (R1_ILLEGAL_COMMAND | R1_APP_CMD)) != R1_APP_CMD) +		return -ENODEV; + +	ret = mmc_cmd(cmd, arg, resp, flags); +	return ret; +} + +static unsigned long +mmc_bread(int dev, unsigned long start, lbaint_t blkcnt, +	  unsigned long *buffer) +{ +	int ret, i = 0; +	unsigned long resp[4]; +	unsigned long card_status, data; +	unsigned long wordcount; +	u32 status; + +	if (blkcnt == 0) +		return 0; + +	pr_debug("mmc_bread: dev %d, start %lx, blkcnt %lx\n", +		 dev, start, blkcnt); + +	/* Put the device into Transfer state */ +	ret = mmc_cmd(MMC_CMD_SELECT_CARD, mmc_rca << 16, resp, R1 | NCR); +	if (ret) goto fail; + +	/* Set block length */ +	ret = mmc_cmd(MMC_CMD_SET_BLOCKLEN, mmc_blkdev.blksz, resp, R1 | NCR); +	if (ret) goto fail; + +	pr_debug("MCI_DTOR = %08lx\n", mmci_readl(DTOR)); + +	for (i = 0; i < blkcnt; i++, start++) { +		ret = mmc_cmd(MMC_CMD_READ_SINGLE_BLOCK, +			      start * mmc_blkdev.blksz, resp, +			      (R1 | NCR | TRCMD_START | TRDIR_READ +			       | TRTYP_BLOCK)); +		if (ret) goto fail; + +		ret = -EIO; +		wordcount = 0; +		do { +			do { +				status = mmci_readl(SR); +				if (status & (ERROR_FLAGS | MMCI_BIT(OVRE))) +					goto fail; +			} while (!(status & MMCI_BIT(RXRDY))); + +			if (status & MMCI_BIT(RXRDY)) { +				data = mmci_readl(RDR); +				/* pr_debug("%x\n", data); */ +				*buffer++ = data; +				wordcount++; +			} +		} while(wordcount < (512 / 4)); + +		pr_debug("mmc: read %u words, waiting for BLKE\n", wordcount); + +		do { +			status = mmci_readl(SR); +		} while (!(status & MMCI_BIT(BLKE))); + +		putc('.'); +	} + +out: +	/* Put the device back into Standby state */ +	mmc_cmd(MMC_CMD_SELECT_CARD, 0, resp, NCR); +	return i; + +fail: +	mmc_cmd(MMC_CMD_SEND_STATUS, mmc_rca << 16, &card_status, R1 | NCR); +	printf("mmc: bread failed, card status = ", card_status); +	goto out; +} + +static void mmc_parse_cid(struct mmc_cid *cid, unsigned long *resp) +{ +	cid->mid = resp[0] >> 24; +	cid->oid = (resp[0] >> 8) & 0xffff; +	cid->pnm[0] = resp[0]; +	cid->pnm[1] = resp[1] >> 24; +	cid->pnm[2] = resp[1] >> 16; +	cid->pnm[3] = resp[1] >> 8; +	cid->pnm[4] = resp[1]; +	cid->pnm[5] = resp[2] >> 24; +	cid->pnm[6] = 0; +	cid->prv = resp[2] >> 16; +	cid->psn = (resp[2] << 16) | (resp[3] >> 16); +	cid->mdt = resp[3] >> 8; +} + +static void sd_parse_cid(struct mmc_cid *cid, unsigned long *resp) +{ +	cid->mid = resp[0] >> 24; +	cid->oid = (resp[0] >> 8) & 0xffff; +	cid->pnm[0] = resp[0]; +	cid->pnm[1] = resp[1] >> 24; +	cid->pnm[2] = resp[1] >> 16; +	cid->pnm[3] = resp[1] >> 8; +	cid->pnm[4] = resp[1]; +	cid->pnm[5] = 0; +	cid->pnm[6] = 0; +	cid->prv = resp[2] >> 24; +	cid->psn = (resp[2] << 8) | (resp[3] >> 24); +	cid->mdt = (resp[3] >> 8) & 0x0fff; +} + +static void mmc_dump_cid(const struct mmc_cid *cid) +{ +	printf("Manufacturer ID:       %02lX\n", cid->mid); +	printf("OEM/Application ID:    %04lX\n", cid->oid); +	printf("Product name:          %s\n", cid->pnm); +	printf("Product Revision:      %lu.%lu\n", +	       cid->prv >> 4, cid->prv & 0x0f); +	printf("Product Serial Number: %lu\n", cid->psn); +	printf("Manufacturing Date:    %02lu/%02lu\n", +	       cid->mdt >> 4, cid->mdt & 0x0f); +} + +static void mmc_dump_csd(const struct mmc_csd *csd) +{ +	unsigned long *csd_raw = (unsigned long *)csd; +	printf("CSD data: %08lx %08lx %08lx %08lx\n", +	       csd_raw[0], csd_raw[1], csd_raw[2], csd_raw[3]); +	printf("CSD structure version:   1.%u\n", csd->csd_structure); +	printf("MMC System Spec version: %u\n", csd->spec_vers); +	printf("Card command classes:    %03x\n", csd->ccc); +	printf("Read block length:       %u\n", 1 << csd->read_bl_len); +	if (csd->read_bl_partial) +		puts("Supports partial reads\n"); +	else +		puts("Does not support partial reads\n"); +	printf("Write block length:      %u\n", 1 << csd->write_bl_len); +	if (csd->write_bl_partial) +		puts("Supports partial writes\n"); +	else +		puts("Does not support partial writes\n"); +	if (csd->wp_grp_enable) +		printf("Supports group WP:      %u\n", csd->wp_grp_size + 1); +	else +		puts("Does not support group WP\n"); +	printf("Card capacity:		%u bytes\n", +	       (csd->c_size + 1) * (1 << (csd->c_size_mult + 2)) * +	       (1 << csd->read_bl_len)); +	printf("File format:            %u/%u\n", +	       csd->file_format_grp, csd->file_format); +	puts("Write protection:        "); +	if (csd->perm_write_protect) +		puts(" permanent"); +	if (csd->tmp_write_protect) +		puts(" temporary"); +	putc('\n'); +} + +static int mmc_idle_cards(void) +{ +	int ret; + +	/* Reset and initialize all cards */ +	ret = mmc_cmd(MMC_CMD_GO_IDLE_STATE, 0, NULL, 0); +	if (ret) +		return ret; + +	/* Keep the bus idle for 74 clock cycles */ +	return mmc_cmd(0, 0, NULL, INIT_CMD); +} + +static int sd_init_card(struct mmc_cid *cid, int verbose) +{ +	unsigned long resp[4]; +	int i, ret = 0; + +	mmc_idle_cards(); +	for (i = 0; i < 1000; i++) { +		ret = mmc_acmd(MMC_ACMD_SD_SEND_OP_COND, CFG_MMC_OP_COND, +			       resp, R3 | NID); +		if (ret || (resp[0] & 0x80000000)) +			break; +		ret = -ETIMEDOUT; +	} + +	if (ret) +		return ret; + +	ret = mmc_cmd(MMC_CMD_ALL_SEND_CID, 0, resp, R2 | NID); +	if (ret) +		return ret; +	sd_parse_cid(cid, resp); +	if (verbose) +		mmc_dump_cid(cid); + +	/* Get RCA of the card that responded */ +	ret = mmc_cmd(MMC_CMD_SD_SEND_RELATIVE_ADDR, 0, resp, R6 | NCR); +	if (ret) +		return ret; + +	mmc_rca = resp[0] >> 16; +	if (verbose) +		printf("SD Card detected (RCA %u)\n", mmc_rca); +	return 0; +} + +static int mmc_init_card(struct mmc_cid *cid, int verbose) +{ +	unsigned long resp[4]; +	int i, ret = 0; + +	mmc_idle_cards(); +	for (i = 0; i < 1000; i++) { +		ret = mmc_cmd(MMC_CMD_SEND_OP_COND, CFG_MMC_OP_COND, resp, +			      R3 | NID | OPEN_DRAIN); +		if (ret || (resp[0] & 0x80000000)) +			break; +		ret = -ETIMEDOUT; +	} + +	if (ret) +		return ret; + +	/* Get CID of all cards. FIXME: Support more than one card */ +	ret = mmc_cmd(MMC_CMD_ALL_SEND_CID, 0, resp, R2 | NID | OPEN_DRAIN); +	if (ret) +		return ret; +	mmc_parse_cid(cid, resp); +	if (verbose) +		mmc_dump_cid(cid); + +	/* Set Relative Address of the card that responded */ +	ret = mmc_cmd(MMC_CMD_SET_RELATIVE_ADDR, mmc_rca << 16, resp, +		      R1 | NCR | OPEN_DRAIN); +	return ret; +} + +int mmc_init(int verbose) +{ +	struct mmc_cid cid; +	struct mmc_csd csd; +	int ret; + +	/* Initialize controller */ +	mmci_writel(CR, MMCI_BIT(SWRST)); +	mmci_writel(CR, MMCI_BIT(MCIEN)); +	mmci_writel(DTOR, 0x5f); +	mmci_writel(IDR, ~0UL); +	mci_set_mode(CFG_MMC_CLK_OD, MMC_DEFAULT_BLKLEN); + +	ret = sd_init_card(&cid, verbose); +	if (ret) { +		mmc_rca = MMC_DEFAULT_RCA; +		ret = mmc_init_card(&cid, verbose); +	} +	if (ret) +		return ret; + +	/* Get CSD from the card */ +	ret = mmc_cmd(MMC_CMD_SEND_CSD, mmc_rca << 16, &csd, R2 | NCR); +	if (ret) +		return ret; +	if (verbose) +		mmc_dump_csd(&csd); + +	/* Initialize the blockdev structure */ +	mmc_blkdev.if_type = IF_TYPE_MMC; +	mmc_blkdev.part_type = PART_TYPE_DOS; +	mmc_blkdev.block_read = mmc_bread; +	sprintf((char *)mmc_blkdev.vendor, +		"Man %02x%04x Snr %08x", +		cid.mid, cid.oid, cid.psn); +	strncpy((char *)mmc_blkdev.product, cid.pnm, +		sizeof(mmc_blkdev.product)); +	sprintf((char *)mmc_blkdev.revision, "%x %x", +		cid.prv >> 4, cid.prv & 0x0f); +	mmc_blkdev.blksz = 1 << csd.read_bl_len; +	mmc_blkdev.lba = (csd.c_size + 1) * (1 << (csd.c_size_mult + 2)); + +	mci_set_mode(CFG_MMC_CLK_PP, mmc_blkdev.blksz); + +#if 0 +	if (fat_register_device(&mmc_blkdev, 1)) +		printf("Could not register MMC fat device\n"); +#else +	init_part(&mmc_blkdev); +#endif + +	return 0; +} + +int mmc_read(ulong src, uchar *dst, int size) +{ +	return -ENOSYS; +} + +int mmc_write(uchar *src, ulong dst, int size) +{ +	return -ENOSYS; +} + +int mmc2info(ulong addr) +{ +	return 0; +} + +#endif /* CONFIG_MMC */ diff --git a/cpu/at32ap/atmel_mci.h b/cpu/at32ap/atmel_mci.h new file mode 100644 index 000000000..0ffbc4fd0 --- /dev/null +++ b/cpu/at32ap/atmel_mci.h @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2005-2006 Atmel Corporation + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * 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 + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ +#ifndef __CPU_AT32AP_ATMEL_MCI_H__ +#define __CPU_AT32AP_ATMEL_MCI_H__ + +/* Atmel MultiMedia Card Interface (MCI) registers */ +#define MMCI_CR					0x0000 +#define MMCI_MR					0x0004 +#define MMCI_DTOR				0x0008 +#define MMCI_SDCR				0x000c +#define MMCI_ARGR				0x0010 +#define MMCI_CMDR				0x0014 +#define MMCI_RSPR				0x0020 +#define MMCI_RSPR1				0x0024 +#define MMCI_RSPR2				0x0028 +#define MMCI_RSPR3				0x002c +#define MMCI_RDR				0x0030 +#define MMCI_TDR				0x0034 +#define MMCI_SR					0x0040 +#define MMCI_IER				0x0044 +#define MMCI_IDR				0x0048 +#define MMCI_IMR				0x004c + +/* Bitfields in CR */ +#define MMCI_MCIEN_OFFSET			0 +#define MMCI_MCIEN_SIZE				1 +#define MMCI_MCIDIS_OFFSET			1 +#define MMCI_MCIDIS_SIZE			1 +#define MMCI_PWSEN_OFFSET			2 +#define MMCI_PWSEN_SIZE				1 +#define MMCI_PWSDIS_OFFSET			3 +#define MMCI_PWSDIS_SIZE			1 +#define MMCI_SWRST_OFFSET			7 +#define MMCI_SWRST_SIZE				1 + +/* Bitfields in MR */ +#define MMCI_CLKDIV_OFFSET			0 +#define MMCI_CLKDIV_SIZE			8 +#define MMCI_PWSDIV_OFFSET			8 +#define MMCI_PWSDIV_SIZE			3 +#define MMCI_PDCPADV_OFFSET			14 +#define MMCI_PDCPADV_SIZE			1 +#define MMCI_PDCMODE_OFFSET			15 +#define MMCI_PDCMODE_SIZE			1 +#define MMCI_BLKLEN_OFFSET			16 +#define MMCI_BLKLEN_SIZE			16 + +/* Bitfields in DTOR */ +#define MMCI_DTOCYC_OFFSET			0 +#define MMCI_DTOCYC_SIZE			4 +#define MMCI_DTOMUL_OFFSET			4 +#define MMCI_DTOMUL_SIZE			3 + +/* Bitfields in SDCR */ +#define MMCI_SCDSEL_OFFSET			0 +#define MMCI_SCDSEL_SIZE			4 +#define MMCI_SCDBUS_OFFSET			7 +#define MMCI_SCDBUS_SIZE			1 + +/* Bitfields in ARGR */ +#define MMCI_ARG_OFFSET				0 +#define MMCI_ARG_SIZE				32 + +/* Bitfields in CMDR */ +#define MMCI_CMDNB_OFFSET			0 +#define MMCI_CMDNB_SIZE				6 +#define MMCI_RSPTYP_OFFSET			6 +#define MMCI_RSPTYP_SIZE			2 +#define MMCI_SPCMD_OFFSET			8 +#define MMCI_SPCMD_SIZE				3 +#define MMCI_OPDCMD_OFFSET			11 +#define MMCI_OPDCMD_SIZE			1 +#define MMCI_MAXLAT_OFFSET			12 +#define MMCI_MAXLAT_SIZE			1 +#define MMCI_TRCMD_OFFSET			16 +#define MMCI_TRCMD_SIZE				2 +#define MMCI_TRDIR_OFFSET			18 +#define MMCI_TRDIR_SIZE				1 +#define MMCI_TRTYP_OFFSET			19 +#define MMCI_TRTYP_SIZE				2 + +/* Bitfields in RSPRx */ +#define MMCI_RSP_OFFSET				0 +#define MMCI_RSP_SIZE				32 + +/* Bitfields in SR/IER/IDR/IMR */ +#define MMCI_CMDRDY_OFFSET			0 +#define MMCI_CMDRDY_SIZE			1 +#define MMCI_RXRDY_OFFSET			1 +#define MMCI_RXRDY_SIZE				1 +#define MMCI_TXRDY_OFFSET			2 +#define MMCI_TXRDY_SIZE				1 +#define MMCI_BLKE_OFFSET			3 +#define MMCI_BLKE_SIZE				1 +#define MMCI_DTIP_OFFSET			4 +#define MMCI_DTIP_SIZE				1 +#define MMCI_NOTBUSY_OFFSET			5 +#define MMCI_NOTBUSY_SIZE			1 +#define MMCI_ENDRX_OFFSET			6 +#define MMCI_ENDRX_SIZE				1 +#define MMCI_ENDTX_OFFSET			7 +#define MMCI_ENDTX_SIZE				1 +#define MMCI_RXBUFF_OFFSET			14 +#define MMCI_RXBUFF_SIZE			1 +#define MMCI_TXBUFE_OFFSET			15 +#define MMCI_TXBUFE_SIZE			1 +#define MMCI_RINDE_OFFSET			16 +#define MMCI_RINDE_SIZE				1 +#define MMCI_RDIRE_OFFSET			17 +#define MMCI_RDIRE_SIZE				1 +#define MMCI_RCRCE_OFFSET			18 +#define MMCI_RCRCE_SIZE				1 +#define MMCI_RENDE_OFFSET			19 +#define MMCI_RENDE_SIZE				1 +#define MMCI_RTOE_OFFSET			20 +#define MMCI_RTOE_SIZE				1 +#define MMCI_DCRCE_OFFSET			21 +#define MMCI_DCRCE_SIZE				1 +#define MMCI_DTOE_OFFSET			22 +#define MMCI_DTOE_SIZE				1 +#define MMCI_OVRE_OFFSET			30 +#define MMCI_OVRE_SIZE				1 +#define MMCI_UNRE_OFFSET			31 +#define MMCI_UNRE_SIZE				1 + +/* Constants for DTOMUL */ +#define MMCI_DTOMUL_1_CYCLE			0 +#define MMCI_DTOMUL_16_CYCLES			1 +#define MMCI_DTOMUL_128_CYCLES			2 +#define MMCI_DTOMUL_256_CYCLES			3 +#define MMCI_DTOMUL_1024_CYCLES			4 +#define MMCI_DTOMUL_4096_CYCLES			5 +#define MMCI_DTOMUL_65536_CYCLES		6 +#define MMCI_DTOMUL_1048576_CYCLES		7 + +/* Constants for RSPTYP */ +#define MMCI_RSPTYP_NO_RESP			0 +#define MMCI_RSPTYP_48_BIT_RESP			1 +#define MMCI_RSPTYP_136_BIT_RESP		2 + +/* Constants for SPCMD */ +#define MMCI_SPCMD_NO_SPEC_CMD			0 +#define MMCI_SPCMD_INIT_CMD			1 +#define MMCI_SPCMD_SYNC_CMD			2 +#define MMCI_SPCMD_INT_CMD			4 +#define MMCI_SPCMD_INT_RESP			5 + +/* Constants for TRCMD */ +#define MMCI_TRCMD_NO_TRANS			0 +#define MMCI_TRCMD_START_TRANS			1 +#define MMCI_TRCMD_STOP_TRANS			2 + +/* Constants for TRTYP */ +#define MMCI_TRTYP_BLOCK			0 +#define MMCI_TRTYP_MULTI_BLOCK			1 +#define MMCI_TRTYP_STREAM			2 + +/* Bit manipulation macros */ +#define MMCI_BIT(name)					\ +	(1 << MMCI_##name##_OFFSET) +#define MMCI_BF(name,value)				\ +	(((value) & ((1 << MMCI_##name##_SIZE) - 1))	\ +	 << MMCI_##name##_OFFSET) +#define MMCI_BFEXT(name,value)				\ +	(((value) >> MMCI_##name##_OFFSET)\ +	 & ((1 << MMCI_##name##_SIZE) - 1)) +#define MMCI_BFINS(name,value,old)			\ +	(((old) & ~(((1 << MMCI_##name##_SIZE) - 1)	\ +		    << MMCI_##name##_OFFSET))		\ +	 | MMCI_BF(name,value)) + +/* Register access macros */ +#define mmci_readl(reg)					\ +	readl((void *)MMCI_BASE + MMCI_##reg) +#define mmci_writel(reg,value)				\ +	writel((value), (void *)MMCI_BASE + MMCI_##reg) + +#endif /* __CPU_AT32AP_ATMEL_MCI_H__ */ diff --git a/cpu/at32ap/cpu.c b/cpu/at32ap/cpu.c index 37e3ea040..311466b78 100644 --- a/cpu/at32ap/cpu.c +++ b/cpu/at32ap/cpu.c @@ -26,33 +26,79 @@  #include <asm/sections.h>  #include <asm/sysreg.h> +#include <asm/arch/clk.h>  #include <asm/arch/memory-map.h> -#include <asm/arch/platform.h>  #include "hsmc3.h" +#include "sm.h" + +/* Sanity checks */ +#if (CFG_CLKDIV_CPU > CFG_CLKDIV_HSB)		\ +	|| (CFG_CLKDIV_HSB > CFG_CLKDIV_PBA)	\ +	|| (CFG_CLKDIV_HSB > CFG_CLKDIV_PBB) +# error Constraint fCPU >= fHSB >= fPB{A,B} violated +#endif +#if defined(CONFIG_PLL) && ((CFG_PLL0_MUL < 1) || (CFG_PLL0_DIV < 1)) +# error Invalid PLL multiplier and/or divider +#endif  DECLARE_GLOBAL_DATA_PTR; +static void pm_init(void) +{ +	uint32_t cksel; + +#ifdef CONFIG_PLL +	/* Initialize the PLL */ +	sm_writel(PM_PLL0, (SM_BF(PLLCOUNT, CFG_PLL0_SUPPRESS_CYCLES) +			    | SM_BF(PLLMUL, CFG_PLL0_MUL - 1) +			    | SM_BF(PLLDIV, CFG_PLL0_DIV - 1) +			    | SM_BF(PLLOPT, CFG_PLL0_OPT) +			    | SM_BF(PLLOSC, 0) +			    | SM_BIT(PLLEN))); + +	/* Wait for lock */ +	while (!(sm_readl(PM_ISR) & SM_BIT(LOCK0))) ; +#endif + +	/* Set up clocks for the CPU and all peripheral buses */ +	cksel = 0; +	if (CFG_CLKDIV_CPU) +		cksel |= SM_BIT(CPUDIV) | SM_BF(CPUSEL, CFG_CLKDIV_CPU - 1); +	if (CFG_CLKDIV_HSB) +		cksel |= SM_BIT(HSBDIV) | SM_BF(HSBSEL, CFG_CLKDIV_HSB - 1); +	if (CFG_CLKDIV_PBA) +		cksel |= SM_BIT(PBADIV) | SM_BF(PBASEL, CFG_CLKDIV_PBA - 1); +	if (CFG_CLKDIV_PBB) +		cksel |= SM_BIT(PBBDIV) | SM_BF(PBBSEL, CFG_CLKDIV_PBB - 1); +	sm_writel(PM_CKSEL, cksel); + +	gd->cpu_hz = get_cpu_clk_rate(); + +#ifdef CONFIG_PLL +	/* Use PLL0 as main clock */ +	sm_writel(PM_MCCTRL, SM_BIT(PLLSEL)); +#endif +} +  int cpu_init(void)  { -	const struct device *hebi;  	extern void _evba(void);  	char *p;  	gd->cpu_hz = CFG_OSC0_HZ; -	/* fff03400: 00010001 04030402 00050005 10011103 */ -	hebi = get_device(DEVICE_HEBI); -	hsmc3_writel(hebi, MODE0, 0x00031103); -	hsmc3_writel(hebi, CYCLE0, 0x000c000d); -	hsmc3_writel(hebi, PULSE0, 0x0b0a0906); -	hsmc3_writel(hebi, SETUP0, 0x00010002); +	/* TODO: Move somewhere else, but needs to be run before we +	 * increase the clock frequency. */ +	hsmc3_writel(MODE0, 0x00031103); +	hsmc3_writel(CYCLE0, 0x000c000d); +	hsmc3_writel(PULSE0, 0x0b0a0906); +	hsmc3_writel(SETUP0, 0x00010002);  	pm_init();  	sysreg_write(EVBA, (unsigned long)&_evba);  	asm volatile("csrf	%0" : : "i"(SYSREG_EM_OFFSET)); -	gd->console_uart = get_device(CFG_CONSOLE_UART_DEV);  	/* Lock everything that mess with the flash in the icache */  	for (p = __flashprog_start; p <= (__flashprog_end + CFG_ICACHE_LINESZ); diff --git a/cpu/at32ap/device.c b/cpu/at32ap/device.c deleted file mode 100644 index 89914b6b5..000000000 --- a/cpu/at32ap/device.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2006 Atmel Corporation - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ -#include <common.h> - -#include <asm/arch/platform.h> - -#include "sm.h" - -struct device_state { -	int refcount; -}; - -static struct device_state device_state[NR_DEVICES]; - -static int claim_resource(const struct resource *res) -{ -	int ret = 0; - -	switch (res->type) { -	case RESOURCE_GPIO: -		ret = gpio_set_func(res->u.gpio.gpio_dev, -				    res->u.gpio.start, -				    res->u.gpio.nr_pins, -				    res->u.gpio.func); -		break; -	case RESOURCE_CLOCK: -		ret = pm_enable_clock(res->u.clock.id, res->u.clock.index); -		break; -	} - -	return ret; -} - -static void free_resource(const struct resource *res) -{ -	switch (res->type) { -	case RESOURCE_GPIO: -		gpio_free(res->u.gpio.gpio_dev, res->u.gpio.start, -			  res->u.gpio.nr_pins); -		break; -	case RESOURCE_CLOCK: -		pm_disable_clock(res->u.clock.id, res->u.clock.index); -		break; -	} -} - -static int init_dev(const struct device *dev) -{ -	unsigned int i; -	int ret = 0; - -	for (i = 0; i < dev->nr_resources; i++) { -		ret = claim_resource(&dev->resource[i]); -		if (ret) -			goto cleanup; -	} - -	return 0; - -cleanup: -	while (i--) -		free_resource(&dev->resource[i]); - -	return ret; -} - -const struct device *get_device(enum device_id devid) -{ -	struct device_state *devstate; -	const struct device *dev; -	unsigned long flags; -	int initialized = 0; -	int ret = 0; - -	devstate = &device_state[devid]; -	dev = &chip_device[devid]; - -	flags = disable_interrupts(); -	if (devstate->refcount++) -		initialized = 1; -	if (flags) -		enable_interrupts(); - -	if (!initialized) -		ret = init_dev(dev); - -	return ret ? NULL : dev; -} - -void put_device(const struct device *dev) -{ -	struct device_state *devstate; -	unsigned long devid, flags; - -	devid = (unsigned long)(dev - chip_device) / sizeof(struct device); -	devstate = &device_state[devid]; - -	flags = disable_interrupts(); -	devstate--; -	if (!devstate) { -		unsigned int i; -		for (i = 0; i < dev->nr_resources; i++) -			free_resource(&dev->resource[i]); -	} -	if (flags) -		enable_interrupts(); -} diff --git a/cpu/at32ap/entry.S b/cpu/at32ap/entry.S index b52d798be..a6fc68867 100644 --- a/cpu/at32ap/entry.S +++ b/cpu/at32ap/entry.S @@ -42,8 +42,7 @@ timer_interrupt_handler:  	 * We're running at interrupt level 3, so we don't need to save  	 * r8-r12 or lr to the stack.  	 */ -	mov	r8, lo(timer_overflow) -	orh	r8, hi(timer_overflow) +	lda.w	r8, timer_overflow  	ld.w	r9, r8[0]  	mov	r10, -1  	mtsr	SYSREG_COMPARE, r10 diff --git a/cpu/at32ap/exception.c b/cpu/at32ap/exception.c index 4123c4461..0672685cd 100644 --- a/cpu/at32ap/exception.c +++ b/cpu/at32ap/exception.c @@ -24,6 +24,8 @@  #include <asm/sysreg.h>  #include <asm/ptrace.h> +DECLARE_GLOBAL_DATA_PTR; +  static const char * const cpu_modes[8] = {  	"Application", "Supervisor", "Interrupt level 0", "Interrupt level 1",  	"Interrupt level 2", "Interrupt level 3", "Exception", "NMI" @@ -109,11 +111,10 @@ void do_unknown_exception(unsigned int ecr, struct pt_regs *regs)  	printf("CPU Mode: %s\n", cpu_modes[mode]);  	/* Avoid exception loops */ -	if (regs->sp >= CFG_INIT_SP_ADDR -	    || regs->sp < (CFG_INIT_SP_ADDR - CONFIG_STACKSIZE)) +	if (regs->sp < CFG_SDRAM_BASE || regs->sp >= gd->stack_end)  		printf("\nStack pointer seems bogus, won't do stack dump\n");  	else -		dump_mem("\nStack: ", regs->sp, CFG_INIT_SP_ADDR); +		dump_mem("\nStack: ", regs->sp, gd->stack_end);  	panic("Unhandled exception\n");  } diff --git a/cpu/at32ap/hsdramc.c b/cpu/at32ap/hsdramc.c index f36da3545..a936e0316 100644 --- a/cpu/at32ap/hsdramc.c +++ b/cpu/at32ap/hsdramc.c @@ -25,17 +25,11 @@  #include <asm/io.h>  #include <asm/sdram.h> -#include <asm/arch/platform.h> +#include <asm/arch/clk.h> +#include <asm/arch/memory-map.h>  #include "hsdramc1.h" -struct hsdramc { -	const struct device *hebi; -	void *regs; -}; - -static struct hsdramc hsdramc; -  unsigned long sdram_init(const struct sdram_info *info)  {  	unsigned long *sdram = (unsigned long *)uncached(info->phys_addr); @@ -44,16 +38,6 @@ unsigned long sdram_init(const struct sdram_info *info)  	unsigned long bus_hz;  	unsigned int i; -	hsdramc.hebi = get_device(DEVICE_HEBI); -	if (!hsdramc.hebi) -		return 0; - -	/* FIXME: Both of these lines are complete hacks */ -	hsdramc.regs = hsdramc.hebi->regs + 0x400; -	bus_hz = pm_get_clock_freq(hsdramc.hebi->resource[0].u.clock.id); - -	cpu_enable_sdram(); -  	tmp = (HSDRAMC1_BF(NC, info->col_bits - 8)  	       | HSDRAMC1_BF(NR, info->row_bits - 11)  	       | HSDRAMC1_BF(NB, info->bank_bits - 1) @@ -74,7 +58,7 @@ unsigned long sdram_init(const struct sdram_info *info)  			   + info->bank_bits + 2);  #endif -	hsdramc1_writel(&hsdramc, CR, tmp); +	hsdramc1_writel(CR, tmp);  	/*  	 * Initialization sequence for SDRAM, from the data sheet: @@ -87,15 +71,15 @@ unsigned long sdram_init(const struct sdram_info *info)  	/*  	 * 2. A Precharge All command is issued to the SDRAM  	 */ -	hsdramc1_writel(&hsdramc, MR, HSDRAMC1_MODE_BANKS_PRECHARGE); -	hsdramc1_readl(&hsdramc, MR); +	hsdramc1_writel(MR, HSDRAMC1_MODE_BANKS_PRECHARGE); +	hsdramc1_readl(MR);  	writel(0, sdram);  	/*  	 * 3. Eight auto-refresh (CBR) cycles are provided  	 */ -	hsdramc1_writel(&hsdramc, MR, HSDRAMC1_MODE_AUTO_REFRESH); -	hsdramc1_readl(&hsdramc, MR); +	hsdramc1_writel(MR, HSDRAMC1_MODE_AUTO_REFRESH); +	hsdramc1_readl(MR);  	for (i = 0; i < 8; i++)  		writel(0, sdram); @@ -106,8 +90,8 @@ unsigned long sdram_init(const struct sdram_info *info)  	 *  	 * CAS from info struct, burst length 1, serial burst type  	 */ -	hsdramc1_writel(&hsdramc, MR, HSDRAMC1_MODE_LOAD_MODE); -	hsdramc1_readl(&hsdramc, MR); +	hsdramc1_writel(MR, HSDRAMC1_MODE_LOAD_MODE); +	hsdramc1_readl(MR);  	writel(0, sdram + (info->cas << 4));  	/* @@ -117,9 +101,9 @@ unsigned long sdram_init(const struct sdram_info *info)  	 * From the timing diagram, it looks like tMRD is 3  	 * cycles...try a dummy read from the peripheral bus.  	 */ -	hsdramc1_readl(&hsdramc, MR); -	hsdramc1_writel(&hsdramc, MR, HSDRAMC1_MODE_NORMAL); -	hsdramc1_readl(&hsdramc, MR); +	hsdramc1_readl(MR); +	hsdramc1_writel(MR, HSDRAMC1_MODE_NORMAL); +	hsdramc1_readl(MR);  	writel(0, sdram);  	/* @@ -128,7 +112,8 @@ unsigned long sdram_init(const struct sdram_info *info)  	 *  	 * 15.6 us is a typical value for a burst of length one  	 */ -	hsdramc1_writel(&hsdramc, TR, (156 * (bus_hz / 1000)) / 10000); +	bus_hz = get_sdram_clk_rate(); +	hsdramc1_writel(TR, (156 * (bus_hz / 1000)) / 10000);  	printf("SDRAM: %u MB at address 0x%08lx\n",  	       sdram_size >> 20, info->phys_addr); diff --git a/cpu/at32ap/hsdramc1.h b/cpu/at32ap/hsdramc1.h index ce229bca1..305d2cb5d 100644 --- a/cpu/at32ap/hsdramc1.h +++ b/cpu/at32ap/hsdramc1.h @@ -135,9 +135,9 @@  	 | HSDRAMC1_BF(name,value))  /* Register access macros */ -#define hsdramc1_readl(port,reg)				\ -	readl((port)->regs + HSDRAMC1_##reg) -#define hsdramc1_writel(port,reg,value)				\ -	writel((value), (port)->regs + HSDRAMC1_##reg) +#define hsdramc1_readl(reg)					\ +	readl((void *)HSDRAMC_BASE + HSDRAMC1_##reg) +#define hsdramc1_writel(reg,value)				\ +	writel((value), (void *)HSDRAMC_BASE + HSDRAMC1_##reg)  #endif /* __ASM_AVR32_HSDRAMC1_H__ */ diff --git a/cpu/at32ap/hsmc3.h b/cpu/at32ap/hsmc3.h index ec78cee71..ca533b922 100644 --- a/cpu/at32ap/hsmc3.h +++ b/cpu/at32ap/hsmc3.h @@ -118,9 +118,9 @@  	 | HSMC3_BF(name,value))  /* Register access macros */ -#define hsmc3_readl(port,reg)					\ -	readl((port)->regs + HSMC3_##reg) -#define hsmc3_writel(port,reg,value)				\ -	writel((value), (port)->regs + HSMC3_##reg) +#define hsmc3_readl(reg)					\ +	readl((void *)HSMC_BASE + HSMC3_##reg) +#define hsmc3_writel(reg,value)					\ +	writel((value), (void *)HSMC_BASE + HSMC3_##reg)  #endif /* __CPU_AT32AP_HSMC3_H__ */ diff --git a/cpu/at32ap/interrupts.c b/cpu/at32ap/interrupts.c index d720cfa94..c9e04993c 100644 --- a/cpu/at32ap/interrupts.c +++ b/cpu/at32ap/interrupts.c @@ -27,7 +27,7 @@  #include <asm/processor.h>  #include <asm/sysreg.h> -#include <asm/arch/platform.h> +#include <asm/arch/memory-map.h>  #define HANDLER_MASK	0x00ffffff  #define INTLEV_SHIFT	30 @@ -44,8 +44,6 @@ volatile unsigned long timer_overflow;   */  static unsigned long tb_factor; -static const struct device *intc_dev; -  unsigned long get_tbclk(void)  {  	return gd->cpu_hz; @@ -117,16 +115,19 @@ void udelay(unsigned long usec)  static int set_interrupt_handler(unsigned int nr, void (*handler)(void),  				 unsigned int priority)  { +	extern void _evba(void);  	unsigned long intpr;  	unsigned long handler_addr = (unsigned long)handler; +	handler_addr -= (unsigned long)&_evba; +  	if ((handler_addr & HANDLER_MASK) != handler_addr  	    || (priority & INTLEV_MASK) != priority)  		return -EINVAL;  	intpr = (handler_addr & HANDLER_MASK);  	intpr |= (priority & INTLEV_MASK) << INTLEV_SHIFT; -	writel(intpr, intc_dev->regs + 4 * nr); +	writel(intpr, (void *)INTC_BASE + 4 * nr);  	return 0;  } @@ -143,10 +144,7 @@ void timer_init(void)  	do_div(tmp, gd->cpu_hz);  	tb_factor = (u32)tmp; -	intc_dev = get_device(DEVICE_INTC); - -	if (!intc_dev -	    || set_interrupt_handler(0, &timer_interrupt_handler, 3)) +	if (set_interrupt_handler(0, &timer_interrupt_handler, 3))  		return;  	/* For all practical purposes, this gives us an overflow interrupt */ diff --git a/cpu/at32ap/pio.c b/cpu/at32ap/pio.c index 8b6c3a35d..9ba0b8ea8 100644 --- a/cpu/at32ap/pio.c +++ b/cpu/at32ap/pio.c @@ -21,74 +21,40 @@   */  #include <common.h> -#include <asm/errno.h>  #include <asm/io.h> -#include <asm/arch/platform.h> +#include <asm/arch/gpio.h> +#include <asm/arch/memory-map.h>  #include "pio2.h" -struct pio_state { -	const struct device *dev; -	u32 alloc_mask; -}; - -static struct pio_state pio_state[CFG_NR_PIOS]; - -int gpio_set_func(enum device_id gpio_devid, unsigned int start, -		  unsigned int nr_pins, enum gpio_func func) +void gpio_select_periph_A(unsigned int pin, int use_pullup)  { -	const struct device *gpio; -	struct pio_state *state; -	u32 mask; - -	state = &pio_state[gpio_devid - DEVICE_PIOA]; - -	gpio = get_device(gpio_devid); -	if (!gpio) -		return -EBUSY; +	void *base = gpio_pin_to_addr(pin); +	uint32_t mask = 1 << (pin & 0x1f); -	state->dev = gpio; -	mask = ((1 << nr_pins) - 1) << start; +	if (!base) +		panic("Invalid GPIO pin %u\n", pin); -	if (mask & state->alloc_mask) { -		put_device(gpio); -		return -EBUSY; -	} -	state->alloc_mask |= mask; - -	switch (func) { -	case GPIO_FUNC_GPIO: -		/* TODO */ -		return -EINVAL; -	case GPIO_FUNC_A: -		pio2_writel(gpio, ASR, mask); -		pio2_writel(gpio, PDR, mask); -		pio2_writel(gpio, PUDR, mask); -		break; -	case GPIO_FUNC_B: -		pio2_writel(gpio, BSR, mask); -		pio2_writel(gpio, PDR, mask); -		pio2_writel(gpio, PUDR, mask); -		break; -	} - -	return 0; +	pio2_writel(base, ASR, mask); +	pio2_writel(base, PDR, mask); +	if (use_pullup) +		pio2_writel(base, PUER, mask); +	else +		pio2_writel(base, PUDR, mask);  } -void gpio_free(enum device_id gpio_devid, unsigned int start, -	       unsigned int nr_pins) +void gpio_select_periph_B(unsigned int pin, int use_pullup)  { -	const struct device *gpio; -	struct pio_state *state; -	u32 mask; - -	state = &pio_state[gpio_devid - DEVICE_PIOA]; -	gpio = state->dev; -	mask = ((1 << nr_pins) - 1) << start; +	void *base = gpio_pin_to_addr(pin); +	uint32_t mask = 1 << (pin & 0x1f); -	pio2_writel(gpio, ODR, mask); -	pio2_writel(gpio, PER, mask); +	if (!base) +		panic("Invalid GPIO pin %u\n", pin); -	state->alloc_mask &= ~mask; -	put_device(gpio); +	pio2_writel(base, BSR, mask); +	pio2_writel(base, PDR, mask); +	if (use_pullup) +		pio2_writel(base, PUER, mask); +	else +		pio2_writel(base, PUDR, mask);  } diff --git a/cpu/at32ap/pio2.h b/cpu/at32ap/pio2.h index 6b79de3c7..9719ea8c4 100644 --- a/cpu/at32ap/pio2.h +++ b/cpu/at32ap/pio2.h @@ -36,9 +36,9 @@  #define PIO2_OWSR				0x00a8  /* Register access macros */ -#define pio2_readl(port,reg)				\ -	readl((port)->regs + PIO2_##reg) -#define pio2_writel(port,reg,value)			\ -	writel((value), (port)->regs + PIO2_##reg) +#define pio2_readl(base,reg)				\ +	readl((void *)base + PIO2_##reg) +#define pio2_writel(base,reg,value)			\ +	writel((value), (void *)base + PIO2_##reg)  #endif /* __CPU_AT32AP_PIO2_H__ */ diff --git a/cpu/at32ap/pm.c b/cpu/at32ap/pm.c index 01ac325ee..c78d547f8 100644 --- a/cpu/at32ap/pm.c +++ b/cpu/at32ap/pm.c @@ -26,138 +26,17 @@  #include <asm/io.h>  #include <asm/arch/memory-map.h> -#include <asm/arch/platform.h>  #include "sm.h" -/* Sanity checks */ -#if (CFG_CLKDIV_CPU > CFG_CLKDIV_HSB)		\ -	|| (CFG_CLKDIV_HSB > CFG_CLKDIV_PBA)	\ -	|| (CFG_CLKDIV_HSB > CFG_CLKDIV_PBB) -# error Constraint fCPU >= fHSB >= fPB{A,B} violated -#endif -#if defined(CONFIG_PLL) && ((CFG_PLL0_MUL < 1) || (CFG_PLL0_DIV < 1)) -# error Invalid PLL multiplier and/or divider -#endif - -DECLARE_GLOBAL_DATA_PTR; - -struct clock_domain_state { -	const struct device *bridge; -	unsigned long freq; -	u32 mask; -}; -static struct clock_domain_state ckd_state[NR_CLOCK_DOMAINS]; - -int pm_enable_clock(enum clock_domain_id id, unsigned int index) -{ -	const struct clock_domain *ckd = &chip_clock[id]; -	struct clock_domain_state *state = &ckd_state[id]; - -	if (ckd->bridge != NO_DEVICE) { -		state->bridge = get_device(ckd->bridge); -		if (!state->bridge) -			return -EBUSY; -	} - -	state->mask |= 1 << index; -	if (gd->sm) -		writel(state->mask, gd->sm->regs + ckd->reg); - -	return 0; -} - -void pm_disable_clock(enum clock_domain_id id, unsigned int index) -{ -	const struct clock_domain *ckd = &chip_clock[id]; -	struct clock_domain_state *state = &ckd_state[id]; - -	state->mask &= ~(1 << index); -	if (gd->sm) -		writel(state->mask, gd->sm->regs + ckd->reg); - -	if (ckd->bridge) -		put_device(state->bridge); -} - -unsigned long pm_get_clock_freq(enum clock_domain_id domain) -{ -	return ckd_state[domain].freq; -} - -void pm_init(void) -{ -	uint32_t cksel = 0; -	unsigned long main_clock; - -	/* Make sure we don't disable any device we're already using */ -	get_device(DEVICE_HRAMC); -	get_device(DEVICE_HEBI); - -	/* Enable the PICO as well */ -	ckd_state[CLOCK_CPU].mask |= 1; - -	gd->sm = get_device(DEVICE_SM); -	if (!gd->sm) -		panic("Unable to claim system manager device!\n"); - -	/* Disable any devices that haven't been explicitly claimed */ -	sm_writel(gd->sm, PM_PBB_MASK, ckd_state[CLOCK_PBB].mask); -	sm_writel(gd->sm, PM_PBA_MASK, ckd_state[CLOCK_PBA].mask); -	sm_writel(gd->sm, PM_HSB_MASK, ckd_state[CLOCK_HSB].mask); -	sm_writel(gd->sm, PM_CPU_MASK, ckd_state[CLOCK_CPU].mask);  #ifdef CONFIG_PLL -	/* Initialize the PLL */ -	main_clock = (CFG_OSC0_HZ / CFG_PLL0_DIV) * CFG_PLL0_MUL; - -	sm_writel(gd->sm, PM_PLL0, (SM_BF(PLLCOUNT, CFG_PLL0_SUPPRESS_CYCLES) -				    | SM_BF(PLLMUL, CFG_PLL0_MUL - 1) -				    | SM_BF(PLLDIV, CFG_PLL0_DIV - 1) -				    | SM_BF(PLLOPT, CFG_PLL0_OPT) -				    | SM_BF(PLLOSC, 0) -				    | SM_BIT(PLLEN))); - -	/* Wait for lock */ -	while (!(sm_readl(gd->sm, PM_ISR) & SM_BIT(LOCK0))) ; +#define MAIN_CLK_RATE ((CFG_OSC0_HZ / CFG_PLL0_DIV) * CFG_PLL0_MUL)  #else -	main_clock = CFG_OSC0_HZ; +#define MAIN_CLK_RATE (CFG_OSC0_HZ)  #endif -	/* Set up clocks for the CPU and all peripheral buses */ -	if (CFG_CLKDIV_CPU) { -		cksel |= SM_BIT(CPUDIV) | SM_BF(CPUSEL, CFG_CLKDIV_CPU - 1); -		ckd_state[CLOCK_CPU].freq = main_clock / (1 << CFG_CLKDIV_CPU); -	} else { -		ckd_state[CLOCK_CPU].freq = main_clock; -	} -	if (CFG_CLKDIV_HSB) { -		cksel |= SM_BIT(HSBDIV) | SM_BF(HSBSEL, CFG_CLKDIV_HSB - 1); -		ckd_state[CLOCK_HSB].freq = main_clock / (1 << CFG_CLKDIV_HSB); -	} else { -		ckd_state[CLOCK_HSB].freq = main_clock; -	} -	if (CFG_CLKDIV_PBA) { -		cksel |= SM_BIT(PBADIV) | SM_BF(PBASEL, CFG_CLKDIV_PBA - 1); -		ckd_state[CLOCK_PBA].freq = main_clock / (1 << CFG_CLKDIV_PBA); -	} else { -		ckd_state[CLOCK_PBA].freq = main_clock; -	} -	if (CFG_CLKDIV_PBB) { -		cksel |= SM_BIT(PBBDIV) | SM_BF(PBBSEL, CFG_CLKDIV_PBB - 1); -		ckd_state[CLOCK_PBB].freq = main_clock / (1 << CFG_CLKDIV_PBB); -	} else { -		ckd_state[CLOCK_PBB].freq = main_clock; -	} -	sm_writel(gd->sm, PM_CKSEL, cksel); - -	/* CFG_HZ currently depends on cpu_hz */ -	gd->cpu_hz = ckd_state[CLOCK_CPU].freq; +DECLARE_GLOBAL_DATA_PTR; -#ifdef CONFIG_PLL -	/* Use PLL0 as main clock */ -	sm_writel(gd->sm, PM_MCCTRL, SM_BIT(PLLSEL)); -#endif -}  #endif /* CFG_POWER_MANAGER */ diff --git a/cpu/at32ap/sm.h b/cpu/at32ap/sm.h index ce81ef0a4..6492c8e81 100644 --- a/cpu/at32ap/sm.h +++ b/cpu/at32ap/sm.h @@ -196,9 +196,9 @@  	 | SM_BF(name,value))  /* Register access macros */ -#define sm_readl(port,reg)				\ -	readl((port)->regs + SM_##reg) -#define sm_writel(port,reg,value)			\ -	writel((value), (port)->regs + SM_##reg) +#define sm_readl(reg)					\ +	readl((void *)SM_BASE + SM_##reg) +#define sm_writel(reg,value)				\ +	writel((value), (void *)SM_BASE + SM_##reg)  #endif /* __CPU_AT32AP_SM_H__ */ diff --git a/cpu/at32ap/start.S b/cpu/at32ap/start.S index 79ee33b1f..ab8c2b73d 100644 --- a/cpu/at32ap/start.S +++ b/cpu/at32ap/start.S @@ -70,32 +70,12 @@ _start:  2:	lddpc	sp, sp_init -	/* -	 * Relocate the data section and initialize .bss.  Everything -	 * is guaranteed to be at least doubleword aligned by the -	 * linker script. -	 */ -	lddpc	r12, .Ldata_vma -	lddpc	r11, .Ldata_lma -	lddpc	r10, .Ldata_end -	sub	r10, r12 -4:	ld.d	r8, r11++ -	sub	r10, 8 -	st.d	r12++, r8 -	brne	4b - -	mov	r8, 0 -	mov	r9, 0 -	lddpc	r10, .Lbss_end -	sub	r10, r12 -4:	sub	r10, 8 -	st.d	r12++, r8 -	brne	4b -  	/* Initialize the GOT pointer */  	lddpc	r6, got_init  3:	rsub	r6, pc -	ld.w	pc, r6[start_u_boot@got] + +	/* Let's go */ +	rjmp	board_init_f  	.align	2  	.type	sp_init,@object @@ -103,11 +83,82 @@ sp_init:  	.long	CFG_INIT_SP_ADDR  got_init:  	.long	3b - _GLOBAL_OFFSET_TABLE_ -.Ldata_lma: -	.long	__data_lma -.Ldata_vma: -	.long	_data -.Ldata_end: -	.long	_edata -.Lbss_end: -	.long	_end + +	/* +	 * void	relocate_code(new_sp, new_gd, monitor_addr) +	 * +	 * Relocate the u-boot image into RAM and continue from there. +	 * Does not return. +	 */ +	.global	relocate_code +	.type	relocate_code,@function +relocate_code: +	mov	sp, r12		/* use new stack */ +	mov	r12, r11	/* save new_gd */ +	mov	r11, r10	/* save destination address */ + +	/* copy .text section and flush the cache along the way */ +	lda.w	r8, _text +	lda.w	r9, _etext +	sub	lr, r10, r8	/* relocation offset */ + +1:	ldm	r8++, r0-r3 +	stm	r10, r0-r3 +	sub	r10, -16 +	ldm	r8++, r0-r3 +	stm	r10, r0-r3 +	sub	r10, -16 +	cp.w	r8, r9 +	cache	r10[-4], 0x0d	/* dcache clean/invalidate */ +	cache	r10[-4], 0x01	/* icache invalidate */ +	brlt	1b + +	/* flush write buffer */ +	sync	0 + +	/* copy data sections */ +	lda.w	r9, _edata +1:	ld.d	r0, r8++ +	st.d	r10++, r0 +	cp.w	r8, r9 +	brlt	1b + +	/* zero out .bss */ +	mov	r0, 0 +	mov	r1, 0 +	lda.w	r9, _end +	sub	r9, r8 +1:	st.d	r10++, r0 +	sub	r9, 8 +	brgt	1b + +	/* jump to RAM */ +	sub	r0, pc, . - in_ram +	add	pc, r0, lr + +	.align	2 +in_ram: +	/* find the new GOT and relocate it */ +	lddpc	r6, got_init_reloc +3:	rsub	r6, pc +	mov	r8, r6 +	lda.w	r9, _egot +	lda.w	r10, _got +	sub	r9, r10 +1:	ld.w	r0, r8[0] +	add	r0, lr +	st.w	r8++, r0 +	sub	r9, 4 +	brgt	1b + +	/* Move the exception handlers */ +	mfsr	r2, SYSREG_EVBA +	add	r2, lr +	mtsr	SYSREG_EVBA, r2 + +	/* Do the rest of the initialization sequence */ +	call	board_init_r + +	.align	2 +got_init_reloc: +	.long	3b - _GLOBAL_OFFSET_TABLE_ diff --git a/cpu/bf533/Makefile b/cpu/bf533/Makefile index 90018f3f5..dd4f299ac 100644 --- a/cpu/bf533/Makefile +++ b/cpu/bf533/Makefile @@ -1,6 +1,6 @@  # U-boot - Makefile  # -# Copyright (c) 2005 blackfin.uclinux.org +# Copyright (c) 2005-2007 Analog Devices Inc.  #  # (C) Copyright 2000-2006  # Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -20,8 +20,8 @@  #  # You should have received a copy of the GNU General Public License  # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -# MA 02111-1307 USA +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA  #  include $(TOPDIR)/config.mk diff --git a/cpu/bf533/bf533_serial.h b/cpu/bf533/bf533_serial.h index 0a04f3e8c..25b96a9f6 100644 --- a/cpu/bf533/bf533_serial.h +++ b/cpu/bf533/bf533_serial.h @@ -1,7 +1,7 @@  /*   * U-boot - bf533_serial.h Serial Driver defines   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on   * bf533_serial.h: Definitions for the BlackFin BF533 DSP serial driver. @@ -38,8 +38,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #ifndef _Bf533_SERIAL_H diff --git a/cpu/bf533/config.mk b/cpu/bf533/config.mk index 10817d9ea..6a713c3f5 100644 --- a/cpu/bf533/config.mk +++ b/cpu/bf533/config.mk @@ -1,6 +1,6 @@  # U-boot - config.mk  # -# Copyright (c) 2005 blackfin.uclinux.org +# Copyright (c) 2005-2007 Analog Devices Inc.  #  # (C) Copyright 2000-2004  # Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -20,8 +20,8 @@  #  # You should have received a copy of the GNU General Public License  # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -# MA 02111-1307 USA +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA  #  PLATFORM_RELFLAGS += -mcpu=bf533 -ffixed-P5 diff --git a/cpu/bf533/cpu.c b/cpu/bf533/cpu.c index ac8ec517f..8118861f8 100644 --- a/cpu/bf533/cpu.c +++ b/cpu/bf533/cpu.c @@ -1,7 +1,7 @@  /*   * U-boot - cpu.c CPU specific functions   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * (C) Copyright 2000-2004   * Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -21,8 +21,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> @@ -93,7 +93,7 @@ void icache_enable(void)  	/* Fill the rest with invalid entry */  	if (j <= 15) { -		for (; j <= 16; j++) { +		for (; j < 16; j++) {  			debug("filling %i with 0", j);  			*I1++ = 0x0;  		} @@ -169,7 +169,7 @@ void dcache_enable(void)  	/* Fill the rest with invalid entry */  	if (j <= 15) { -		for (; j <= 16; j++) { +		for (; j < 16; j++) {  			debug("filling %i with 0", j);  			*I1++ = 0x0;  		} diff --git a/cpu/bf533/cpu.h b/cpu/bf533/cpu.h index 821363e76..b6b73b1d8 100644 --- a/cpu/bf533/cpu.h +++ b/cpu/bf533/cpu.h @@ -1,7 +1,7 @@  /*   *  U-boot - cpu.h   * - *  Copyright (c) 2005 blackfin.uclinux.org + *  Copyright (c) 2005-2007 Analog Devices Inc.   *   * See file CREDITS for list of people who contributed to this   * project. @@ -18,8 +18,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #ifndef _CPU_H_ diff --git a/cpu/bf533/flush.S b/cpu/bf533/flush.S index 0512f3bf9..62e3d65ae 100644 --- a/cpu/bf533/flush.S +++ b/cpu/bf533/flush.S @@ -1,9 +1,9 @@ -/* Copyright (C) 2003 Analog Devices, Inc. All Rights Reserved. - * Copyright (C) 2004 LG SOft India. All Rights Reserved. +/* Copyright (C) 2003-2007 Analog Devices Inc.   *   * This file is subject to the terms and conditions of the GNU General Public   * License.   */ +  #define ASSEMBLY  #include <asm/linkage.h> diff --git a/cpu/bf533/interrupt.S b/cpu/bf533/interrupt.S index 524da8f51..c356d53aa 100644 --- a/cpu/bf533/interrupt.S +++ b/cpu/bf533/interrupt.S @@ -1,7 +1,7 @@  /*   * U-boot - interrupt.S Processing of interrupts and exception handling   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * (C) Copyright 2000-2004   * Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -35,8 +35,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #define ASSEMBLY diff --git a/cpu/bf533/interrupts.c b/cpu/bf533/interrupts.c index 9317f26d9..14d06cf8d 100644 --- a/cpu/bf533/interrupts.c +++ b/cpu/bf533/interrupts.c @@ -1,7 +1,7 @@  /*   * U-boot - interrupts.c Interrupt related routines   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on interrupts.c   * Copyright 1996 Roman Zippel @@ -30,8 +30,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> diff --git a/cpu/bf533/ints.c b/cpu/bf533/ints.c index f476f1434..55866896a 100644 --- a/cpu/bf533/ints.c +++ b/cpu/bf533/ints.c @@ -1,7 +1,7 @@  /*   * U-boot - ints.c Interrupt related routines   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on ints.c   * @@ -32,8 +32,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> diff --git a/cpu/bf533/serial.c b/cpu/bf533/serial.c index 11a46be96..6cab5daac 100644 --- a/cpu/bf533/serial.c +++ b/cpu/bf533/serial.c @@ -1,7 +1,7 @@  /*   * U-boot - serial.c Serial driver for BF533   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on   * bf533_serial.c: Serial driver for BlackFin BF533 DSP internal UART. @@ -38,8 +38,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> diff --git a/cpu/bf533/start.S b/cpu/bf533/start.S index 94556d681..67a60cf21 100644 --- a/cpu/bf533/start.S +++ b/cpu/bf533/start.S @@ -1,7 +1,7 @@  /*   * U-boot - start.S Startup file of u-boot for BF533/BF561   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on head.S   * Copyright (c) 2003  Metrowerks/Motorola @@ -26,8 +26,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  /* diff --git a/cpu/bf533/start1.S b/cpu/bf533/start1.S index 72cfafb5e..6d4731b69 100644 --- a/cpu/bf533/start1.S +++ b/cpu/bf533/start1.S @@ -1,7 +1,7 @@  /*   * U-boot - start1.S Code running out of RAM after relocation   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * See file CREDITS for list of people who contributed to this   * project. @@ -18,8 +18,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #define ASSEMBLY diff --git a/cpu/bf533/traps.c b/cpu/bf533/traps.c index 248e34f3f..19b1fde41 100644 --- a/cpu/bf533/traps.c +++ b/cpu/bf533/traps.c @@ -1,7 +1,7 @@  /*   * U-boot - traps.c Routines related to interrupts and exceptions   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on   * No original Copyright holder listed, @@ -29,8 +29,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> @@ -39,7 +39,6 @@  #include <asm/irq.h>  #include <asm/system.h>  #include <asm/traps.h> -#include <asm/page.h>  #include <asm/machdep.h>  #include "cpu.h"  #include <asm/arch/anomaly.h> diff --git a/cpu/bf537/Makefile b/cpu/bf537/Makefile index 61c733886..8b0f9c0e9 100644 --- a/cpu/bf537/Makefile +++ b/cpu/bf537/Makefile @@ -1,6 +1,6 @@  # U-boot - Makefile  # -# Copyright (c) 2005 blackfin.uclinux.org +# Copyright (c) 2005-2007 Analog Devices Inc.  #  # (C) Copyright 2000-2004  # Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -20,8 +20,8 @@  #  # You should have received a copy of the GNU General Public License  # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -# MA 02111-1307 USA +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA  #  include $(TOPDIR)/config.mk diff --git a/cpu/bf537/config.mk b/cpu/bf537/config.mk index 4d57d9c9a..8a35789f1 100644 --- a/cpu/bf537/config.mk +++ b/cpu/bf537/config.mk @@ -1,6 +1,6 @@  # U-boot - config.mk  # -# Copyright (c) 2005 blackfin.uclinux.org +# Copyright (c) 2005-2007 Analog Devices Inc.  #  # (C) Copyright 2000-2004  # Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -20,8 +20,8 @@  #  # You should have received a copy of the GNU General Public License  # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -# MA 02111-1307 USA +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA  #  PLATFORM_RELFLAGS += -mcpu=bf537 -ffixed-P5 diff --git a/cpu/bf537/cpu.c b/cpu/bf537/cpu.c index cb8dc3cd1..62f603bdb 100644 --- a/cpu/bf537/cpu.c +++ b/cpu/bf537/cpu.c @@ -1,7 +1,7 @@  /*   * U-boot - cpu.c CPU specific functions   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * (C) Copyright 2000-2004   * Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -21,8 +21,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> diff --git a/cpu/bf537/cpu.h b/cpu/bf537/cpu.h index 821363e76..b6b73b1d8 100644 --- a/cpu/bf537/cpu.h +++ b/cpu/bf537/cpu.h @@ -1,7 +1,7 @@  /*   *  U-boot - cpu.h   * - *  Copyright (c) 2005 blackfin.uclinux.org + *  Copyright (c) 2005-2007 Analog Devices Inc.   *   * See file CREDITS for list of people who contributed to this   * project. @@ -18,8 +18,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #ifndef _CPU_H_ diff --git a/cpu/bf537/flush.S b/cpu/bf537/flush.S index c260a8f96..fbd26cc92 100644 --- a/cpu/bf537/flush.S +++ b/cpu/bf537/flush.S @@ -1,9 +1,9 @@ -/* Copyright (C) 2003 Analog Devices, Inc. All Rights Reserved. - * Copyright (C) 2004 LG SOft India. All Rights Reserved. +/* Copyright (C) 2003-2007 Analog Devices Inc.   *   * This file is subject to the terms and conditions of the GNU General Public   * License.   */ +  #define ASSEMBLY  #include <asm/linkage.h> diff --git a/cpu/bf537/interrupt.S b/cpu/bf537/interrupt.S index a8be34f02..a71df55a9 100644 --- a/cpu/bf537/interrupt.S +++ b/cpu/bf537/interrupt.S @@ -1,7 +1,7 @@  /*   * U-boot - interrupt.S Processing of interrupts and exception handling   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * (C) Copyright 2000-2004   * Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -35,8 +35,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #define ASSEMBLY diff --git a/cpu/bf537/interrupts.c b/cpu/bf537/interrupts.c index 2ca76ecb3..d2213b115 100644 --- a/cpu/bf537/interrupts.c +++ b/cpu/bf537/interrupts.c @@ -1,7 +1,7 @@  /*   * U-boot - interrupts.c Interrupt related routines   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on interrupts.c   * Copyright 1996 Roman Zippel @@ -30,8 +30,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> diff --git a/cpu/bf537/ints.c b/cpu/bf537/ints.c index f476f1434..55866896a 100644 --- a/cpu/bf537/ints.c +++ b/cpu/bf537/ints.c @@ -1,7 +1,7 @@  /*   * U-boot - ints.c Interrupt related routines   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on ints.c   * @@ -32,8 +32,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> diff --git a/cpu/bf537/serial.c b/cpu/bf537/serial.c index dd4f916d5..e04d08a0e 100644 --- a/cpu/bf537/serial.c +++ b/cpu/bf537/serial.c @@ -1,7 +1,7 @@  /*   * U-boot - serial.c Serial driver for BF537   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on   * bf537_serial.c: Serial driver for BlackFin BF537 internal UART. @@ -38,8 +38,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> diff --git a/cpu/bf537/serial.h b/cpu/bf537/serial.h index c9ee3dc06..76555c279 100644 --- a/cpu/bf537/serial.h +++ b/cpu/bf537/serial.h @@ -1,7 +1,7 @@  /*   * U-boot - bf537_serial.h Serial Driver defines   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on   * bf533_serial.h: Definitions for the BlackFin BF533 DSP serial driver. @@ -38,8 +38,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #ifndef _Bf537_SERIAL_H diff --git a/cpu/bf537/start.S b/cpu/bf537/start.S index 264e9b608..4e02bcb9e 100644 --- a/cpu/bf537/start.S +++ b/cpu/bf537/start.S @@ -1,7 +1,7 @@  /*   * U-boot - start.S Startup file of u-boot for BF537   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on head.S   * Copyright (c) 2003  Metrowerks/Motorola @@ -26,8 +26,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  /* diff --git a/cpu/bf537/start1.S b/cpu/bf537/start1.S index 72cfafb5e..6d4731b69 100644 --- a/cpu/bf537/start1.S +++ b/cpu/bf537/start1.S @@ -1,7 +1,7 @@  /*   * U-boot - start1.S Code running out of RAM after relocation   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * See file CREDITS for list of people who contributed to this   * project. @@ -18,8 +18,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #define ASSEMBLY diff --git a/cpu/bf537/traps.c b/cpu/bf537/traps.c index 994ece8f6..4e18e27df 100644 --- a/cpu/bf537/traps.c +++ b/cpu/bf537/traps.c @@ -1,7 +1,7 @@  /*   * U-boot - traps.c Routines related to interrupts and exceptions   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on   * No original Copyright holder listed, @@ -29,8 +29,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> @@ -39,7 +39,6 @@  #include <asm/irq.h>  #include <asm/system.h>  #include <asm/traps.h> -#include <asm/page.h>  #include <asm/machdep.h>  #include "cpu.h"  #include <asm/arch/anomaly.h> diff --git a/cpu/bf561/Makefile b/cpu/bf561/Makefile index ee7842a5d..29471694d 100644 --- a/cpu/bf561/Makefile +++ b/cpu/bf561/Makefile @@ -1,6 +1,6 @@  # U-boot - Makefile  # -# Copyright (c) 2005 blackfin.uclinux.org +# Copyright (c) 2005-2007 Analog Devices Inc.  #  # (C) Copyright 2000-2004  # Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -20,8 +20,8 @@  #  # You should have received a copy of the GNU General Public License  # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -# MA 02111-1307 USA +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA  #  include $(TOPDIR)/config.mk diff --git a/cpu/bf561/config.mk b/cpu/bf561/config.mk index c49a0ba5f..f4dc04bfc 100644 --- a/cpu/bf561/config.mk +++ b/cpu/bf561/config.mk @@ -1,6 +1,6 @@  # U-boot - config.mk  # -# Copyright (c) 2005 blackfin.uclinux.org +# Copyright (c) 2005-2007 Analog Devices Inc.  #  # (C) Copyright 2000-2004  # Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -20,8 +20,8 @@  #  # You should have received a copy of the GNU General Public License  # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -# MA 02111-1307 USA +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA  #  PLATFORM_RELFLAGS += -mcpu=bf561 -ffixed-P5 diff --git a/cpu/bf561/cpu.c b/cpu/bf561/cpu.c index a7b53d8a2..5b907cd1e 100644 --- a/cpu/bf561/cpu.c +++ b/cpu/bf561/cpu.c @@ -1,7 +1,7 @@  /*   * U-boot - cpu.c CPU specific functions   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * (C) Copyright 2000-2004   * Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -21,8 +21,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> diff --git a/cpu/bf561/cpu.h b/cpu/bf561/cpu.h index 821363e76..b6b73b1d8 100644 --- a/cpu/bf561/cpu.h +++ b/cpu/bf561/cpu.h @@ -1,7 +1,7 @@  /*   *  U-boot - cpu.h   * - *  Copyright (c) 2005 blackfin.uclinux.org + *  Copyright (c) 2005-2007 Analog Devices Inc.   *   * See file CREDITS for list of people who contributed to this   * project. @@ -18,8 +18,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #ifndef _CPU_H_ diff --git a/cpu/bf561/flush.S b/cpu/bf561/flush.S index 7e12c8305..0140a60c4 100644 --- a/cpu/bf561/flush.S +++ b/cpu/bf561/flush.S @@ -1,9 +1,9 @@ -/* Copyright (C) 2003 Analog Devices, Inc. All Rights Reserved. - * Copyright (C) 2004 LG SOft India. All Rights Reserved. +/* Copyright (C) 2003-2007 Analog Devices Inc.   *   * This file is subject to the terms and conditions of the GNU General Public   * License.   */ +  #define ASSEMBLY  #include <asm/linkage.h> diff --git a/cpu/bf561/interrupt.S b/cpu/bf561/interrupt.S index f82fd9b82..21839ce7d 100644 --- a/cpu/bf561/interrupt.S +++ b/cpu/bf561/interrupt.S @@ -1,7 +1,7 @@  /*   * U-boot - interrupt.S Processing of interrupts and exception handling   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * (C) Copyright 2000-2004   * Wolfgang Denk, DENX Software Engineering, wd@denx.de. @@ -35,8 +35,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #define ASSEMBLY diff --git a/cpu/bf561/interrupts.c b/cpu/bf561/interrupts.c index e314f60d2..ecbc6addf 100644 --- a/cpu/bf561/interrupts.c +++ b/cpu/bf561/interrupts.c @@ -1,7 +1,7 @@  /*   * U-boot - interrupts.c Interrupt related routines   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on interrupts.c   * Copyright 1996 Roman Zippel @@ -30,8 +30,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> diff --git a/cpu/bf561/ints.c b/cpu/bf561/ints.c index 328e5d8ef..27a38a349 100644 --- a/cpu/bf561/ints.c +++ b/cpu/bf561/ints.c @@ -1,7 +1,7 @@  /*   * U-boot - ints.c Interrupt related routines   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on ints.c   * @@ -32,8 +32,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> diff --git a/cpu/bf561/serial.c b/cpu/bf561/serial.c index baec1d3e4..7f5c69536 100644 --- a/cpu/bf561/serial.c +++ b/cpu/bf561/serial.c @@ -1,7 +1,7 @@  /*   * U-boot - serial.c Serial driver for BF561   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on   * bf533_serial.c: Serial driver for BlackFin BF533 DSP internal UART. @@ -38,8 +38,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> diff --git a/cpu/bf561/serial.h b/cpu/bf561/serial.h index 98c1242a3..c1cbf36ac 100644 --- a/cpu/bf561/serial.h +++ b/cpu/bf561/serial.h @@ -1,7 +1,7 @@  /*   * U-boot - bf561_serial.h Serial Driver defines   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on   * bf533_serial.h: Definitions for the BlackFin BF533 DSP serial driver. @@ -38,8 +38,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #ifndef _Bf561_SERIAL_H diff --git a/cpu/bf561/start.S b/cpu/bf561/start.S index 933364804..bd26cf32f 100644 --- a/cpu/bf561/start.S +++ b/cpu/bf561/start.S @@ -1,7 +1,7 @@  /*   * U-boot - start.S Startup file of u-boot for BF533/BF561   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on head.S   * Copyright (c) 2003  Metrowerks/Motorola @@ -26,8 +26,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  /* diff --git a/cpu/bf561/start1.S b/cpu/bf561/start1.S index 72cfafb5e..6d4731b69 100644 --- a/cpu/bf561/start1.S +++ b/cpu/bf561/start1.S @@ -1,7 +1,7 @@  /*   * U-boot - start1.S Code running out of RAM after relocation   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * See file CREDITS for list of people who contributed to this   * project. @@ -18,8 +18,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #define ASSEMBLY diff --git a/cpu/bf561/traps.c b/cpu/bf561/traps.c index f5ff3a807..7e2dcd17a 100644 --- a/cpu/bf561/traps.c +++ b/cpu/bf561/traps.c @@ -1,7 +1,7 @@  /*   * U-boot - traps.c Routines related to interrupts and exceptions   * - * Copyright (c) 2005 blackfin.uclinux.org + * Copyright (c) 2005-2007 Analog Devices Inc.   *   * This file is based on   * No original Copyright holder listed, @@ -29,8 +29,8 @@   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #include <common.h> diff --git a/cpu/ixp/npe/Makefile b/cpu/ixp/npe/Makefile index 4de34fd5b..7f020b5d5 100644 --- a/cpu/ixp/npe/Makefile +++ b/cpu/ixp/npe/Makefile @@ -87,7 +87,7 @@ START	:= $(addprefix $(obj),$(START))  all:	$(LIB) -$(LIB):	$(obj).depend $(OBJS) +$(LIB):	$(OBJS)  	$(AR) $(ARFLAGS) $@ $(OBJS)  ######################################################################### diff --git a/cpu/microblaze/Makefile b/cpu/microblaze/Makefile index db1afa553..9d542013c 100644 --- a/cpu/microblaze/Makefile +++ b/cpu/microblaze/Makefile @@ -26,7 +26,7 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(CPU).a  START	= start.o -SOBJS	= dcache.o icache.o irq.o disable_int.o enable_int.o +SOBJS	= irq.o  COBJS	= cpu.o interrupts.o cache.o exception.o timer.o  SRCS	:= $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c) diff --git a/cpu/microblaze/cache.c b/cpu/microblaze/cache.c index fc388ebb5..4f36a84ec 100644..100755 --- a/cpu/microblaze/cache.c +++ b/cpu/microblaze/cache.c @@ -23,6 +23,7 @@   */  #include <common.h> +#include <asm/asm.h>  #if (CONFIG_COMMANDS & CFG_CMD_CACHE) @@ -45,4 +46,20 @@ int icache_status (void)  	__asm__ __volatile__ ("and %0,%0,%1"::"r" (i), "r" (mask):"memory");  	return i;  } + +void	icache_enable (void) { +	MSRSET(0x20); +} + +void	icache_disable(void) { +	MSRCLR(0x20); +} + +void	dcache_enable (void) { +	MSRSET(0x80); +} + +void	dcache_disable(void) { +	MSRCLR(0x80); +}  #endif diff --git a/cpu/microblaze/dcache.S b/cpu/microblaze/dcache.S deleted file mode 100644 index eaf96717e..000000000 --- a/cpu/microblaze/dcache.S +++ /dev/null @@ -1,68 +0,0 @@ -/* - * (C) Copyright 2007 Michal Simek - * - * Michal  SIMEK <monstr@monstr.eu> - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ -	.text -	.globl	dcache_enable -	.ent	dcache_enable -	.align	2 -dcache_enable: -	/* Make space on stack for a temporary */ -	addi	r1, r1, -4 -	/* Save register r12 */ -	swi	r12, r1, 0 -	/* Read the MSR register */ -	mfs	r12, rmsr -	/* Set the instruction enable bit */ -	ori	r12, r12, 0x80 -	/* Save the MSR register */ -	mts	rmsr, r12 -	/* Load register r12 */ -	lwi	r12, r1, 0 -	/* Return */ -	rtsd	r15, 8 -	/* Update stack in the delay slot */ -	addi	r1, r1, 4 -	.end	dcache_enable - -	.text -	.globl	dcache_disable -	.ent	dcache_disable -	.align	2 -dcache_disable: -	/* Make space on stack for a temporary */ -	addi	r1, r1, -4 -	/* Save register r12 */ -	swi	r12, r1, 0 -	/* Read the MSR register */ -	mfs	r12, rmsr -	/* Clear the data cache enable bit */ -	andi	r12, r12, ~0x80 -	/* Save the MSR register */ -	mts	rmsr, r12 -	/* Load register r12 */ -	lwi	r12, r1, 0 -	/* Return */ -	rtsd	r15, 8 -	/* Update stack in the delay slot */ -	addi	r1, r1, 4 -	.end	dcache_disable diff --git a/cpu/microblaze/disable_int.S b/cpu/microblaze/disable_int.S deleted file mode 100644 index aecd79513..000000000 --- a/cpu/microblaze/disable_int.S +++ /dev/null @@ -1,46 +0,0 @@ -/* - * (C) Copyright 2007 Michal Simek - * - * Michal  SIMEK <monstr@monstr.eu> - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -	.text -	.globl	microblaze_disable_interrupts -	.ent	microblaze_disable_interrupts -	.align	2 -microblaze_disable_interrupts: -	#Make space on stack for a temporary -	addi	r1, r1, -4 -	#Save register r12 -	swi	r12, r1, 0 -	#Read the MSR register -	mfs	r12, rmsr -	#Clear the interrupt enable bit -	andi	r12, r12, ~2 -	#Save the MSR register -	mts	rmsr, r12 -	#Load register r12 -	lwi	r12, r1, 0 -	#Return -	rtsd	r15, 8 -	#Update stack in the delay slot -	addi	r1, r1, 4 -	.end	microblaze_disable_interrupts diff --git a/cpu/microblaze/enable_int.S b/cpu/microblaze/enable_int.S deleted file mode 100644 index c096c6c3c..000000000 --- a/cpu/microblaze/enable_int.S +++ /dev/null @@ -1,38 +0,0 @@ -/* - * (C) Copyright 2007 Michal Simek - * - * Michal  SIMEK <monstrmonstr.eu> - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -	.text -	.globl	microblaze_enable_interrupts -	.ent	microblaze_enable_interrupts -	.align	2 -microblaze_enable_interrupts: -	addi	r1, r1, -4 -	swi	r12, r1, 0 -	mfs	r12, rmsr -	ori	r12, r12, 2 -	mts	rmsr, r12 -	lwi	r12, r1, 0 -	rtsd	r15, 8 -	addi	r1, r1, 4 -	.end	microblaze_enable_interrupts diff --git a/cpu/microblaze/exception.c b/cpu/microblaze/exception.c index b135acbad..d76b05a52 100644 --- a/cpu/microblaze/exception.c +++ b/cpu/microblaze/exception.c @@ -23,15 +23,16 @@   */  #include <common.h> +#include <asm/asm.h>  void _hw_exception_handler (void)  {  	int address = 0;  	int state = 0;  	/* loading address of exception EAR */ -	__asm__ __volatile ("mfs %0,rear"::"r" (address):"memory"); +	MFS (address, rear);  	/* loading excetpion state register ESR */ -	__asm__ __volatile ("mfs %0,resr"::"r" (state):"memory"); +	MFS (state, resr);  	printf ("Hardware exception at 0x%x address\n", address);  	switch (state & 0x1f) {	/* mask on exception cause */  	case 0x1: @@ -49,6 +50,11 @@ void _hw_exception_handler (void)  	case 0x5:  		puts ("Divide by zero exception\n");  		break; +#ifdef MICROBLAZE_V5 +	case 0x1000: +		puts ("Exception in delay slot\n"); +		break; +#endif  	default:  		puts ("Undefined cause\n");  		break; diff --git a/cpu/microblaze/icache.S b/cpu/microblaze/icache.S deleted file mode 100644 index 25940d106..000000000 --- a/cpu/microblaze/icache.S +++ /dev/null @@ -1,69 +0,0 @@ -/* - * (C) Copyright 2007 Michal Simek - * - * Michal  SIMEK <monstr@monstr.eu> - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * 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 - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -	.text -	.globl	icache_enable -	.ent	icache_enable -	.align	2 -icache_enable: -	/* Make space on stack for a temporary */ -	addi	r1, r1, -4 -	/* Save register r12 */ -	swi	r12, r1, 0 -	/* Read the MSR register */ -	mfs	r12, rmsr -	/* Set the instruction enable bit */ -	ori	r12, r12, 0x20 -	/* Save the MSR register */ -	mts	rmsr, r12 -	/* Load register r12 */ -	lwi	r12, r1, 0 -	/* Return */ -	rtsd	r15, 8 -	/* Update stack in the delay slot */ -	addi	r1, r1, 4 -	.end	icache_enable - -	.text -	.globl	icache_disable -	.ent	icache_disable -	.align	2 -icache_disable: -	/* Make space on stack for a temporary */ -	addi	r1, r1, -4 -	/* Save register r12 */ -	swi	r12, r1, 0 -	/* Read the MSR register */ -	mfs	r12, rmsr -	/* Clear the instruction enable bit */ -	andi	r12, r12, ~0x20 -	/* Save the MSR register */ -	mts	rmsr, r12 -	/* Load register r12 */ -	lwi	r12, r1, 0 -	/* Return */ -	rtsd	r15, 8 -	/* Update stack in the delay slot */ -	addi	r1, r1, 4 -	.end	icache_disable diff --git a/cpu/microblaze/interrupts.c b/cpu/microblaze/interrupts.c index 2db847cd0..b61153f8e 100644..100755 --- a/cpu/microblaze/interrupts.c +++ b/cpu/microblaze/interrupts.c @@ -27,6 +27,7 @@  #include <common.h>  #include <command.h>  #include <asm/microblaze_intc.h> +#include <asm/asm.h>  #undef DEBUG_INT @@ -35,12 +36,12 @@ extern void microblaze_enable_interrupts (void);  void enable_interrupts (void)  { -	microblaze_enable_interrupts (); +	MSRSET(0x2);  }  int disable_interrupts (void)  { -	microblaze_disable_interrupts (); +	MSRCLR(0x2);  	return 0;  } @@ -48,6 +49,10 @@ int disable_interrupts (void)  #ifdef CFG_TIMER_0  extern void timer_init (void);  #endif +#ifdef CFG_FSL_2 +extern void fsl_init2 (void); +#endif +  static struct irq_action vecs[CFG_INTC_0_NUM]; @@ -106,7 +111,6 @@ void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg)  		act->count = 0;  		enable_one_interrupt (irq);  	} else {		/* disable */ -  		act->handler = (interrupt_handler_t *) def_hdlr;  		act->arg = (void *)irq;  		disable_one_interrupt (irq); @@ -141,18 +145,22 @@ int interrupts_init (void)  #ifdef CFG_TIMER_0  	timer_init ();  #endif +#ifdef CFG_FSL_2 +	fsl_init2 (); +#endif  	enable_interrupts ();  	return 0;  }  void interrupt_handler (void)  { -	int irqs; -	irqs = (intc->isr & intc->ier);	/* find active interrupt */ - +	int irqs = (intc->isr & intc->ier);	/* find active interrupt */ +	int i = 1;  #ifdef DEBUG_INT +	int value;  	printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,  		intc->iar, intc->mer); +	R14(value);  	printf ("Interrupt handler on %x line, r14 %x\n", irqs, value);  #endif  	struct irq_action *act = vecs; @@ -165,15 +173,19 @@ void interrupt_handler (void)  #endif  			act->handler (act->arg);  			act->count++; +			intc->iar = i; +			return;  		}  		irqs >>= 1;  		act++; +		i <<= 1;  	} -	intc->iar = 0xFFFFFFFF;	/* erase all events */ -#ifdef DEBUG + +#ifdef DEBUG_INT  	printf ("Dump INTC reg, isr %x, ier %x, iar %x, mer %x\n", intc->isr,  		intc->ier, intc->iar, intc->mer); -	printf ("Interrupt handler on %x line, r14\n", irqs); +	R14(value); +	printf ("Interrupt handler on %x line, r14 %x\n", irqs, value);  #endif  }  #endif diff --git a/cpu/microblaze/irq.S b/cpu/microblaze/irq.S index a4e3fbfad..e1fc19046 100644..100755 --- a/cpu/microblaze/irq.S +++ b/cpu/microblaze/irq.S @@ -23,6 +23,7 @@   */  #include <config.h> +#include <asm/asm.h>  	.text  	.global _interrupt_handler  _interrupt_handler: @@ -151,6 +152,11 @@ _interrupt_handler:  	addi	r1, r1, 4  	/* enable_interrupt */ +#ifdef XILINX_USE_MSR_INSTR +	msrset	r0, 2 +#else +	/* FIXME unstable in stressed mode - two irqs */ +	nop  	addi	r1, r1, -4  	swi	r12, r1, 0  	mfs	r12, rmsr @@ -159,6 +165,7 @@ _interrupt_handler:  	lwi	r12, r1, 0  	addi	r1, r1, 4  	nop +#endif  	bra	r14  	nop  	nop diff --git a/cpu/microblaze/start.S b/cpu/microblaze/start.S index ca3befc24..3c027ff9b 100644 --- a/cpu/microblaze/start.S +++ b/cpu/microblaze/start.S @@ -117,3 +117,36 @@ clear_bss:  3:	/* jumping to board_init */  	brai	board_init  1:	bri	1b + +/* + * Read 16bit little endian + */ +	.text +	.global	in16 +	.ent	in16 +	.align	2 +in16:	lhu	r3, r0, r5 +	bslli	r4, r3, 8 +	bsrli	r3, r3, 8 +	andi	r4, r4, 0xffff +	or	r3, r3, r4 +	rtsd	r15, 8 +	sext16	r3, r3 +	.end	in16 + +/* + * Write 16bit little endian + * first parameter(r5) - address, second(r6) - short value + */ +	.text +	.global	out16 +	.ent	out16 +	.align	2 +out16:	bslli	r3, r6, 8 +	bsrli	r6, r6, 8 +	andi	r3, r3, 0xffff +	or	r3, r3, r6 +	sh	r3, r0, r5 +	rtsd	r15, 8 +	or	r0, r0, r0 +	.end	out16 diff --git a/cpu/microblaze/timer.c b/cpu/microblaze/timer.c index be4fd57cc..ab1cb1274 100644 --- a/cpu/microblaze/timer.c +++ b/cpu/microblaze/timer.c @@ -24,6 +24,7 @@  #include <common.h>  #include <asm/microblaze_timer.h> +#include <asm/microblaze_intc.h>  volatile int timestamp = 0; @@ -44,9 +45,6 @@ void set_timer (ulong t)  #ifdef CFG_INTC_0  #ifdef CFG_TIMER_0 -extern void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, -				       void *arg); -  microblaze_timer_t *tmr = (microblaze_timer_t *) (CFG_TIMER_0_ADDR);  void timer_isr (void *arg) diff --git a/cpu/mpc5xxx/cpu.c b/cpu/mpc5xxx/cpu.c index 813aa7935..1eac2bbfb 100644 --- a/cpu/mpc5xxx/cpu.c +++ b/cpu/mpc5xxx/cpu.c @@ -53,12 +53,16 @@ int checkcpu (void)  #else  	svr = get_svr();  	pvr = get_pvr(); -	switch (SVR_VER (svr)) { -	case SVR_MPC5200: -		printf ("MPC5200"); + +	switch (pvr) { +	case PVR_5200: +		printf("MPC5200"); +		break; +	case PVR_5200B: +		printf("MPC5200B");  		break;  	default: -		printf ("MPC52??  (SVR %08x)", svr); +		printf("Unknown MPC5xxx");  		break;  	} @@ -127,5 +131,9 @@ ft_cpu_setup(void *blob, bd_t *bd)  	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@3000/mac-address", &len);  	if (p != NULL)  		memcpy(p, bd->bi_enetaddr, 6); + +	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@3000/local-mac-address", &len); +	if (p != NULL) +		memcpy(p, bd->bi_enetaddr, 6);  }  #endif diff --git a/cpu/mpc5xxx/cpu_init.c b/cpu/mpc5xxx/cpu_init.c index 7e6582185..d7440308a 100644 --- a/cpu/mpc5xxx/cpu_init.c +++ b/cpu/mpc5xxx/cpu_init.c @@ -156,21 +156,21 @@ void cpu_init_f (void)  	*(vu_long *)(MPC5XXX_XLBARB + 0x40) |= (1 << 15);  	*(vu_long *)(MPC5XXX_XLBARB + 0x70) = CFG_SDRAM_BASE | 0x1d; -# if defined(CFG_IPBSPEED_133) +# if defined(CFG_IPBCLK_EQUALS_XLBCLK)  	/* Motorola reports IPB should better run at 133 MHz. */  	*(vu_long *)MPC5XXX_ADDECR |= 1;  	/* pci_clk_sel = 0x02, ipb_clk_sel = 0x00; */  	addecr = *(vu_long *)MPC5XXX_CDM_CFG;  	addecr &= ~0x103; -#  if defined(CFG_PCISPEED_66) +#  if defined(CFG_PCICLK_EQUALS_IPBCLK_DIV2)  	/* pci_clk_sel = 0x01 -> IPB_CLK/2 */  	addecr |= 0x01;  #  else  	/* pci_clk_sel = 0x02 -> XLB_CLK/4 = IPB_CLK/4 */  	addecr |= 0x02; -#  endif /* CFG_PCISPEED_66 */ +#  endif /* CFG_PCICLK_EQUALS_IPBCLK_DIV2 */  	*(vu_long *)MPC5XXX_CDM_CFG = addecr; -# endif	/* CFG_IPBSPEED_133 */ +# endif	/* CFG_IPBCLK_EQUALS_XLBCLK */  	/* Configure the XLB Arbiter */  	*(vu_long *)MPC5XXX_XLBARB_MPRIEN = 0xff;  	*(vu_long *)MPC5XXX_XLBARB_MPRIVAL = 0x11111111; diff --git a/cpu/mpc5xxx/fec.c b/cpu/mpc5xxx/fec.c index e59bd85e1..813636655 100644 --- a/cpu/mpc5xxx/fec.c +++ b/cpu/mpc5xxx/fec.c @@ -428,6 +428,13 @@ static int mpc5xxx_fec_init_phy(struct eth_device *dev, bd_t * bis)  	 */  	fec->eth->imask = 0x00000000; +/* + * In original Promess-provided code PHY initialization is disabled with the + * following comment: "Phy initialization is DISABLED for now.  There was a + * problem with running 100 Mbps on PRO board". Thus we temporarily disable + * PHY initialization for the Motion-PRO board, until a proper fix is found. + */ +  	if (fec->xcv_type != SEVENWIRE) {  		/*  		 * Set MII_SPEED = (1/(mii_speed * 2)) * System Clock diff --git a/cpu/mpc83xx/Makefile b/cpu/mpc83xx/Makefile index 4b9dcc818..bb96f774f 100644 --- a/cpu/mpc83xx/Makefile +++ b/cpu/mpc83xx/Makefile @@ -29,7 +29,7 @@ LIB	= $(obj)lib$(CPU).a  START	= start.o  COBJS	= traps.o cpu.o cpu_init.o speed.o interrupts.o \ -	  spd_sdram.o qe_io.o +	  spd_sdram.o qe_io.o pci.o  SRCS	:= $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)  OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/cpu/mpc83xx/cpu.c b/cpu/mpc83xx/cpu.c index 21b16463c..e078f27a2 100644 --- a/cpu/mpc83xx/cpu.c +++ b/cpu/mpc83xx/cpu.c @@ -52,13 +52,26 @@ int checkcpu(void)  	immr = (immap_t *)CFG_IMMR; -	if ((pvr & 0xFFFF0000) != PVR_83xx) { -		puts("Not MPC83xx Family!!!\n"); -		return -1; +	puts("CPU:   "); + +	switch (pvr & 0xffff0000) { +		case PVR_E300C1: +			printf("e300c1, "); +			break; + +		case PVR_E300C2: +			printf("e300c2, "); +			break; + +		case PVR_E300C3: +			printf("e300c3, "); +			break; + +		default: +			printf("Unknown core, ");  	}  	spridr = immr->sysconf.spridr; -	puts("CPU: ");  	switch(spridr) {  	case SPR_8349E_REV10:  	case SPR_8349E_REV11: @@ -124,6 +137,18 @@ int checkcpu(void)  	case SPR_8321_REV11:  		puts("MPC8321, ");  		break; +	case SPR_8311_REV10: +		puts("MPC8311, "); +		break; +	case SPR_8311E_REV10: +		puts("MPC8311E, "); +		break; +	case SPR_8313_REV10: +		puts("MPC8313, "); +		break; +	case SPR_8313E_REV10: +		puts("MPC8313E, "); +		break;  	default:  		puts("Rev: Unknown revision number.\nWarning: Unsupported cpu revision!\n");  		return 0; @@ -133,10 +158,12 @@ int checkcpu(void)  	/* Multiple revisons of 834x processors may have the same SPRIDR value.  	 * So use PVR to identify the revision number.  	 */ -	printf("Rev: %02x at %s MHz\n", PVR_MAJ(pvr)<<4 | PVR_MIN(pvr), strmhz(buf, clock)); +	printf("Rev: %02x at %s MHz", PVR_MAJ(pvr)<<4 | PVR_MIN(pvr), strmhz(buf, clock));  #else -	printf("Rev: %02x at %s MHz\n", spridr & 0x0000FFFF, strmhz(buf, clock)); +	printf("Rev: %02x at %s MHz", spridr & 0x0000FFFF, strmhz(buf, clock));  #endif +	printf(", CSB: %4d MHz\n", gd->csb_clk / 1000000); +  	return 0;  } @@ -300,92 +327,174 @@ void watchdog_reset (void)  #if defined(CONFIG_OF_LIBFDT)  /* + * "Setter" functions used to add/modify FDT entries. + */ +static int fdt_set_eth0(void *fdt, int nodeoffset, const char *name, bd_t *bd) +{ +	/* +	 * Fix it up if it exists, don't create it if it doesn't exist. +	 */ +	if (fdt_get_property(fdt, nodeoffset, name, 0)) { +		return fdt_setprop(fdt, nodeoffset, name, bd->bi_enetaddr, 6); +	} +	return -FDT_ERR_NOTFOUND; +} +#ifdef CONFIG_HAS_ETH1 +/* second onboard ethernet port */ +static int fdt_set_eth1(void *fdt, int nodeoffset, const char *name, bd_t *bd) +{ +	/* +	 * Fix it up if it exists, don't create it if it doesn't exist. +	 */ +	if (fdt_get_property(fdt, nodeoffset, name, 0)) { +		return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet1addr, 6); +	} +	return -FDT_ERR_NOTFOUND; +} +#endif +#ifdef CONFIG_HAS_ETH2 +/* third onboard ethernet port */ +static int fdt_set_eth2(void *fdt, int nodeoffset, const char *name, bd_t *bd) +{ +	/* +	 * Fix it up if it exists, don't create it if it doesn't exist. +	 */ +	if (fdt_get_property(fdt, nodeoffset, name, 0)) { +		return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet2addr, 6); +	} +	return -FDT_ERR_NOTFOUND; +} +#endif +#ifdef CONFIG_HAS_ETH3 +/* fourth onboard ethernet port */ +static int fdt_set_eth3(void *fdt, int nodeoffset, const char *name, bd_t *bd) +{ +	/* +	 * Fix it up if it exists, don't create it if it doesn't exist. +	 */ +	if (fdt_get_property(fdt, nodeoffset, name, 0)) { +		return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet3addr, 6); +	} +	return -FDT_ERR_NOTFOUND; +} +#endif + +static int fdt_set_busfreq(void *fdt, int nodeoffset, const char *name, bd_t *bd) +{ +	u32  tmp; +	/* +	 * Create or update the property. +	 */ +	tmp = cpu_to_be32(bd->bi_busfreq); +	return fdt_setprop(fdt, nodeoffset, name, &tmp, sizeof(tmp)); +} + +/*   * Fixups to the fdt.  If "create" is TRUE, the node is created   * unconditionally.  If "create" is FALSE, the node is updated   * only if it already exists.   */ -#define	FT_UPDATE	0x00000000		/* update existing property only */ -#define	FT_CREATE	0x00000001		/* create property if it doesn't exist */ -#define	FT_BUSFREQ	0x00000002		/* source is bd->bi_busfreq */ -#define	FT_ENETADDR	0x00000004		/* source is bd->bi_enetaddr */  static const struct { -	int  createflags;  	char *node;  	char *prop; +	int (*set_fn)(void *fdt, int nodeoffset, const char *name, bd_t *bd);  } fixup_props[] = { -	{	FT_CREATE | FT_BUSFREQ, -		"/cpus/" OF_CPU, +	{	"/cpus/" OF_CPU,  		 "bus-frequency", +		fdt_set_busfreq  	}, -	{	FT_CREATE | FT_BUSFREQ, -		"/cpus/" OF_SOC, -		"bus-frequency" +	{	"/cpus/" OF_SOC, +		"bus-frequency", +		fdt_set_busfreq  	}, -	{	FT_CREATE | FT_BUSFREQ, -		"/" OF_SOC "/serial@4500/", -		"clock-frequency" +	{	"/" OF_SOC "/serial@4500/", +		"clock-frequency", +		fdt_set_busfreq  	}, -	{	FT_CREATE | FT_BUSFREQ, -		"/" OF_SOC "/serial@4600/", -		"clock-frequency" +	{	"/" OF_SOC "/serial@4600/", +		"clock-frequency", +		fdt_set_busfreq  	},  #ifdef CONFIG_MPC83XX_TSEC1 -	{	FT_UPDATE | FT_ENETADDR, -		"/" OF_SOC "/ethernet@24000, +	{	"/" OF_SOC "/ethernet@24000,  		"mac-address", +		fdt_set_eth0  	}, -	{	FT_UPDATE | FT_ENETADDR, -		"/" OF_SOC "/ethernet@24000, +	{	"/" OF_SOC "/ethernet@24000,  		"local-mac-address", +		fdt_set_eth0  	},  #endif  #ifdef CONFIG_MPC83XX_TSEC2 -	{	FT_UPDATE | FT_ENETADDR, -		"/" OF_SOC "/ethernet@25000, +	{	"/" OF_SOC "/ethernet@25000, +		"mac-address", +		fdt_set_eth1 +	}, +	{	"/" OF_SOC "/ethernet@25000, +		"local-mac-address", +		fdt_set_eth1 +	}, +#endif +#ifdef CONFIG_UEC_ETH1 +#if CFG_UEC1_UCC_NUM == 0  /* UCC1 */ +	{	"/" OF_QE "/ucc@2000/mac-address", +		"mac-address", +		fdt_set_eth0 +	}, +	{	"/" OF_QE "/ucc@2000/mac-address", +		"local-mac-address", +		fdt_set_eth0 +	}, +#elif CFG_UEC1_UCC_NUM == 2  /* UCC3 */ +	{	"/" OF_QE "/ucc@2200/mac-address",  		"mac-address", +		fdt_set_eth0  	}, -	{	FT_UPDATE | FT_ENETADDR, -		"/" OF_SOC "/ethernet@25000, +	{	"/" OF_QE "/ucc@2200/mac-address",  		"local-mac-address", +		fdt_set_eth0  	},  #endif +#endif +#ifdef CONFIG_UEC_ETH2 +#if CFG_UEC2_UCC_NUM == 1  /* UCC2 */ +	{	"/" OF_QE "/ucc@3000/mac-address", +		"mac-address", +		fdt_set_eth1 +	}, +	{	"/" OF_QE "/ucc@3000/mac-address", +		"local-mac-address", +		fdt_set_eth1 +	}, +#elif CFG_UEC1_UCC_NUM == 3  /* UCC4 */ +	{	"/" OF_QE "/ucc@3200/mac-address", +		"mac-address", +		fdt_set_eth1 +	}, +	{	"/" OF_QE "/ucc@3200/mac-address", +		"local-mac-address", +		fdt_set_eth1 +	}, +#endif +#endif  };  void  ft_cpu_setup(void *blob, bd_t *bd)  { -	int   nodeoffset; -	int   err; -	int j; +	int  nodeoffset; +	int  err; +	int  j;  	for (j = 0; j < (sizeof(fixup_props) / sizeof(fixup_props[0])); j++) { -		nodeoffset = fdt_path_offset (fdt, fixup_props[j].node); +		nodeoffset = fdt_path_offset(fdt, fixup_props[j].node);  		if (nodeoffset >= 0) { -			/* -			 * If unconditional create or the property already exists... -			 */ -			if ((fixup_props[j].createflags & FT_CREATE) || -				(fdt_get_property(fdt, nodeoffset, fixup_props[j].prop, 0))) { -				if (fixup_props[j].createflags & FT_BUSFREQ) { -					u32   tmp; - -					tmp = cpu_to_be32(bd->bi_busfreq); -					err = fdt_setprop(fdt, nodeoffset, -							fixup_props[j].prop, &tmp, sizeof(tmp)); -				} else if (fixup_props[j].createflags & FT_ENETADDR) { -					err = fdt_setprop(fdt, nodeoffset, -							fixup_props[j].prop, bd->bi_enetaddr, 6); -				} else { -					printf("ft_cpu_setup: %s %s has no flag for the value to set\n", -						fixup_props[j].node, -						fixup_props[j].prop); -				} -				if (err < 0) -					printf("libfdt: %s %s returned %s\n", -						fixup_props[j].node, -						fixup_props[j].prop, -						fdt_strerror(err)); -			} +			err = (*fixup_props[j].set_fn)(blob, nodeoffset, fixup_props[j].prop, bd); +			if (err < 0) +				printf("set_fn/libfdt: %s %s returned %s\n", +					fixup_props[j].node, +					fixup_props[j].prop, +					fdt_strerror(err));  		}  	}  } diff --git a/cpu/mpc83xx/pci.c b/cpu/mpc83xx/pci.c new file mode 100644 index 000000000..785d6129d --- /dev/null +++ b/cpu/mpc83xx/pci.c @@ -0,0 +1,192 @@ +/* + * Copyright (C) Freescale Semiconductor, Inc. 2007 + * + * Author: Scott Wood <scottwood@freescale.com>, + * with some bits from older board-specific PCI initialization. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * 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 + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <pci.h> +#include <ft_build.h> +#include <asm/mpc8349_pci.h> + +#ifdef CONFIG_83XX_GENERIC_PCI +#define MAX_BUSES 2 + +DECLARE_GLOBAL_DATA_PTR; + +static struct pci_controller pci_hose[MAX_BUSES]; +static int pci_num_buses; + +static void pci_init_bus(int bus, struct pci_region *reg) +{ +	volatile immap_t *immr = (volatile immap_t *)CFG_IMMR; +	volatile pot83xx_t *pot = immr->ios.pot; +	volatile pcictrl83xx_t *pci_ctrl = &immr->pci_ctrl[bus]; +	struct pci_controller *hose = &pci_hose[bus]; +	u32 dev; +	u16 reg16; +	int i; + +	if (bus == 1) +		pot += 3; + +	/* Setup outbound translation windows */ +	for (i = 0; i < 3; i++, reg++, pot++) { +		if (reg->size == 0) +			break; + +		hose->regions[i] = *reg; +		hose->region_count++; + +		pot->potar = reg->bus_start >> 12; +		pot->pobar = reg->phys_start >> 12; +		pot->pocmr = ~(reg->size - 1) >> 12; + +		if (reg->flags & PCI_REGION_IO) +			pot->pocmr |= POCMR_IO; +#ifdef CONFIG_83XX_PCI_STREAMING +		else if (reg->flags & PCI_REGION_PREFETCH) +			pot->pocmr |= POCMR_SE; +#endif + +		if (bus == 1) +			pot->pocmr |= POCMR_DST; + +		pot->pocmr |= POCMR_EN; +	} + +	/* Point inbound translation at RAM */ +	pci_ctrl->pitar1 = 0; +	pci_ctrl->pibar1 = 0; +	pci_ctrl->piebar1 = 0; +	pci_ctrl->piwar1 = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | +	                   PIWAR_WTT_SNOOP | (__ilog2(gd->ram_size) - 1); + +	i = hose->region_count++; +	hose->regions[i].bus_start = 0; +	hose->regions[i].phys_start = 0; +	hose->regions[i].size = gd->ram_size; +	hose->regions[i].flags = PCI_REGION_MEM | PCI_REGION_MEMORY; + +	hose->first_busno = 0; +	hose->last_busno = 0xff; + +	pci_setup_indirect(hose, CFG_IMMR + 0x8300 + bus * 0x80, +	                         CFG_IMMR + 0x8304 + bus * 0x80); + +	pci_register_hose(hose); + +	/* +	 * Write to Command register +	 */ +	reg16 = 0xff; +	dev = PCI_BDF(hose->first_busno, 0, 0); +	pci_hose_read_config_word(hose, dev, PCI_COMMAND, ®16); +	reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; +	pci_hose_write_config_word(hose, dev, PCI_COMMAND, reg16); + +	/* +	 * Clear non-reserved bits in status register. +	 */ +	pci_hose_write_config_word(hose, dev, PCI_STATUS, 0xffff); +	pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, 0x80); +	pci_hose_write_config_byte(hose, dev, PCI_CACHE_LINE_SIZE, 0x08); + +#ifdef CONFIG_PCI_SCAN_SHOW +	printf("PCI:   Bus Dev VenId DevId Class Int\n"); +#endif +	/* +	 * Hose scan. +	 */ +	hose->last_busno = pci_hose_scan(hose); +} + +/* + * The caller must have already set OCCR, and the PCI_LAW BARs + * must have been set to cover all of the requested regions. + * + * If fewer than three regions are requested, then the region + * list is terminated with a region of size 0. + */ +void mpc83xx_pci_init(int num_buses, struct pci_region **reg, int warmboot) +{ +	volatile immap_t *immr = (volatile immap_t *)CFG_IMMR; +	int i; + +	if (num_buses > MAX_BUSES) { +		printf("%d PCI buses requsted, %d supported\n", +		       num_buses, MAX_BUSES); + +		num_buses = MAX_BUSES; +	} + +	pci_num_buses = num_buses; + +	/* +	 * Release PCI RST Output signal. +	 * Power on to RST high must be at least 100 ms as per PCI spec. +	 * On warm boots only 1 ms is required. +	 */ +	udelay(warmboot ? 1000 : 100000); + +	for (i = 0; i < num_buses; i++) +		immr->pci_ctrl[i].gcr = 1; + +	/* +	 * RST high to first config access must be at least 2^25 cycles +	 * as per PCI spec.  This could be cut in half if we know we're +	 * running at 66MHz.  This could be insufficiently long if we're +	 * running the PCI bus at significantly less than 33MHz. +	 */ +	udelay(1020000); + +	for (i = 0; i < num_buses; i++) +		pci_init_bus(i, reg[i]); +} + +#ifdef CONFIG_OF_FLAT_TREE +void ft_pci_setup(void *blob, bd_t *bd) +{ +	u32 *p; +	int len; + +	if (pci_num_buses < 1) +		return; + +	p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8500/bus-range", &len); +	if (p) { +		p[0] = pci_hose[0].first_busno; +		p[1] = pci_hose[0].last_busno; +	} + +	if (pci_num_buses < 2) +		return; + +	p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8600/bus-range", &len); +	if (p) { +		p[0] = pci_hose[1].first_busno; +		p[1] = pci_hose[1].last_busno; +	} +} +#endif /* CONFIG_OF_FLAT_TREE */ + +#endif /* CONFIG_83XX_GENERIC_PCI */ diff --git a/cpu/mpc83xx/spd_sdram.c b/cpu/mpc83xx/spd_sdram.c index d9b8753ca..647813f68 100644 --- a/cpu/mpc83xx/spd_sdram.c +++ b/cpu/mpc83xx/spd_sdram.c @@ -58,8 +58,8 @@ picos_to_clk(int picos)  	int clks;  	ddr_bus_clk = gd->ddr_clk >> 1; -	clks = picos / ((1000000000 / ddr_bus_clk) * 1000); -	if (picos % ((1000000000 / ddr_bus_clk) * 1000) != 0) +	clks = picos / (1000000000 / (ddr_bus_clk / 1000)); +	if (picos % (1000000000 / (ddr_bus_clk / 1000)) != 0)  		clks++;  	return clks; @@ -624,7 +624,7 @@ long int spd_sdram()  			 | (1 << (16 + 10))             /* DQS Differential disable */  			 | (add_lat << (16 + 3))        /* Additive Latency in EMRS1 */  			 | (mode_odt_enable << 16)      /* ODT Enable in EMRS1 */ -			 | ((twr_clk >> 1) << 9)        /* Write Recovery Autopre */ +			 | ((twr_clk - 1) << 9)         /* Write Recovery Autopre */  			 | (caslat << 4)                /* caslat */  			 | (burstlen << 0)              /* Burst length */  			); @@ -693,11 +693,6 @@ long int spd_sdram()  #ifdef CFG_DDR_SDRAM_CLK_CNTL	/* Optional platform specific value */  	ddr->sdram_clk_cntl = CFG_DDR_SDRAM_CLK_CNTL; -#else -	/* SS_EN = 0, source synchronous disable -	 * CLK_ADJST = 0, MCK/MCK# is launched aligned with addr/cmd -	 */ -	ddr->sdram_clk_cntl = 0x00000000;  #endif  	debug("DDR:sdram_clk_cntl=0x%08x\n", ddr->sdram_clk_cntl); diff --git a/cpu/mpc83xx/speed.c b/cpu/mpc83xx/speed.c index c75993059..bf3061654 100644 --- a/cpu/mpc83xx/speed.c +++ b/cpu/mpc83xx/speed.c @@ -25,6 +25,7 @@  #include <common.h>  #include <mpc83xx.h> +#include <command.h>  #include <asm/processor.h>  DECLARE_GLOBAL_DATA_PTR; @@ -99,12 +100,14 @@ int get_clocks(void)  	u32 lcrr;  	u32 csb_clk; -#if defined(CONFIG_MPC834X) +#if defined(CONFIG_MPC834X) || defined(CONFIG_MPC831X)  	u32 tsec1_clk;  	u32 tsec2_clk; -	u32 usbmph_clk;  	u32 usbdr_clk;  #endif +#ifdef CONFIG_MPC834X +	u32 usbmph_clk; +#endif  	u32 core_clk;  	u32 i2c1_clk;  #if !defined(CONFIG_MPC832X) @@ -148,7 +151,7 @@ int get_clocks(void)  	sccr = im->clk.sccr; -#if defined(CONFIG_MPC834X) +#if defined(CONFIG_MPC834X) || defined(CONFIG_MPC831X)  	switch ((sccr & SCCR_TSEC1CM) >> SCCR_TSEC1CM_SHIFT) {  	case 0:  		tsec1_clk = 0; @@ -167,6 +170,26 @@ int get_clocks(void)  		return -4;  	} +	switch ((sccr & SCCR_USBDRCM) >> SCCR_USBDRCM_SHIFT) { +	case 0: +		usbdr_clk = 0; +		break; +	case 1: +		usbdr_clk = csb_clk; +		break; +	case 2: +		usbdr_clk = csb_clk / 2; +		break; +	case 3: +		usbdr_clk = csb_clk / 3; +		break; +	default: +		/* unkown SCCR_USBDRCM value */ +		return -8; +	} +#endif + +#if defined(CONFIG_MPC834X)  	switch ((sccr & SCCR_TSEC2CM) >> SCCR_TSEC2CM_SHIFT) {  	case 0:  		tsec2_clk = 0; @@ -205,24 +228,6 @@ int get_clocks(void)  		return -7;  	} -	switch ((sccr & SCCR_USBDRCM) >> SCCR_USBDRCM_SHIFT) { -	case 0: -		usbdr_clk = 0; -		break; -	case 1: -		usbdr_clk = csb_clk; -		break; -	case 2: -		usbdr_clk = csb_clk / 2; -		break; -	case 3: -		usbdr_clk = csb_clk / 3; -		break; -	default: -		/* unkown SCCR_USBDRCM value */ -		return -8; -	} -  	if (usbmph_clk != 0 && usbdr_clk != 0 && usbmph_clk != usbdr_clk) {  		/* if USB MPH clock is not disabled and  		 * USB DR clock is not disabled then @@ -230,8 +235,16 @@ int get_clocks(void)  		 */  		return -9;  	} +#elif defined(CONFIG_MPC831X) +	tsec2_clk = tsec1_clk; + +	if (!(sccr & SCCR_TSEC1ON)) +		tsec1_clk = 0; +	if (!(sccr & SCCR_TSEC2ON)) +		tsec2_clk = 0;  #endif -#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X) + +#if !defined(CONFIG_MPC834X)  	i2c1_clk = csb_clk;  #endif  #if !defined(CONFIG_MPC832X) @@ -314,12 +327,14 @@ int get_clocks(void)  #endif  	gd->csb_clk = csb_clk; -#if defined(CONFIG_MPC834X) +#if defined(CONFIG_MPC834X) || defined(CONFIG_MPC831X)  	gd->tsec1_clk = tsec1_clk;  	gd->tsec2_clk = tsec2_clk; -	gd->usbmph_clk = usbmph_clk;  	gd->usbdr_clk = usbdr_clk;  #endif +#if defined(CONFIG_MPC834X) +	gd->usbmph_clk = usbmph_clk; +#endif  	gd->core_clk = core_clk;  	gd->i2c1_clk = i2c1_clk;  #if !defined(CONFIG_MPC832X) @@ -351,11 +366,11 @@ ulong get_bus_freq(ulong dummy)  	return gd->csb_clk;  } -int print_clock_conf(void) +int do_clocks (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])  {  	printf("Clock configuration:\n"); -	printf("  Coherent System Bus: %4d MHz\n", gd->csb_clk / 1000000);  	printf("  Core:                %4d MHz\n", gd->core_clk / 1000000); +	printf("  Coherent System Bus: %4d MHz\n", gd->csb_clk / 1000000);  #if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X)  	printf("  QE:                  %4d MHz\n", gd->qe_clk / 1000000);  	printf("  BRG:                 %4d MHz\n", gd->brg_clk / 1000000); @@ -371,11 +386,18 @@ int print_clock_conf(void)  #if !defined(CONFIG_MPC832X)  	printf("  I2C2:                %4d MHz\n", gd->i2c2_clk / 1000000);  #endif -#if defined(CONFIG_MPC834X) +#if defined(CONFIG_MPC834X) || defined(CONFIG_MPC831X)  	printf("  TSEC1:               %4d MHz\n", gd->tsec1_clk / 1000000);  	printf("  TSEC2:               %4d MHz\n", gd->tsec2_clk / 1000000); -	printf("  USB MPH:             %4d MHz\n", gd->usbmph_clk / 1000000);  	printf("  USB DR:              %4d MHz\n", gd->usbdr_clk / 1000000);  #endif +#if defined(CONFIG_MPC834X) +	printf("  USB MPH:             %4d MHz\n", gd->usbmph_clk / 1000000); +#endif  	return 0;  } + +U_BOOT_CMD(clocks, 1, 0, do_clocks, +	"clocks  - print clock configuration\n", +	"    clocks\n" +); diff --git a/cpu/mpc85xx/cpu.c b/cpu/mpc85xx/cpu.c index 0507c47e6..7735a52cc 100644 --- a/cpu/mpc85xx/cpu.c +++ b/cpu/mpc85xx/cpu.c @@ -1,5 +1,5 @@  /* - * Copyright 2004 Freescale Semiconductor. + * Copyright 2004,2007 Freescale Semiconductor, Inc.   * (C) Copyright 2002, 2003 Motorola Inc.   * Xianghua Xiao (X.Xiao@motorola.com)   * @@ -70,6 +70,15 @@ int checkcpu (void)  	case SVR_8548_E:  		puts("8548_E");  		break; +	case SVR_8544: +		puts("8544"); +		break; +	case SVR_8544_E: +		puts("8544_E"); +		break; +	case SVR_8568_E: +		puts("8568_E"); +		break;  	default:  		puts("Unknown");  		break; @@ -112,7 +121,7 @@ int checkcpu (void)  #endif  	clkdiv = lcrr & 0x0f;  	if (clkdiv == 2 || clkdiv == 4 || clkdiv == 8) { -#ifdef CONFIG_MPC8548 +#if defined(CONFIG_MPC8548) || defined(CONFIG_MPC8544)  		/*  		 * Yes, the entire PQ38 family use the same  		 * bit-representation for twice the clock divider values. @@ -140,16 +149,25 @@ int checkcpu (void)  int do_reset (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])  { +	uint pvr; +	uint ver; +	pvr = get_pvr(); +	ver = PVR_VER(pvr); +	if (ver & 1){ +	/* e500 v2 core has reset control register */ +		volatile unsigned int * rstcr; +		rstcr = (volatile unsigned int *)(CFG_IMMR + 0xE00B0); +		*rstcr = 0x2;		/* HRESET_REQ */ +	}else{  	/*  	 * Initiate hard reset in debug control register DBCR0  	 * Make sure MSR[DE] = 1  	 */ -	unsigned long val; - -	val = mfspr(DBCR0); -	val |= 0x70000000; -	mtspr(DBCR0,val); - +		unsigned long val; +		val = mfspr(DBCR0); +		val |= 0x70000000; +		mtspr(DBCR0,val); +	}  	return 1;  } @@ -183,9 +201,9 @@ reset_85xx_watchdog(void)  	 * Clear TSR(WIS) bit by writing 1  	 */  	unsigned long val; -	val = mfspr(tsr); -	val |= 0x40000000; -	mtspr(tsr, val); +	val = mfspr(SPRN_TSR); +	val |= TSR_WIS; +	mtspr(SPRN_TSR, val);  }  #endif	/* CONFIG_WATCHDOG */ @@ -196,6 +214,7 @@ void dma_init(void) {  	dma->satr0 = 0x02c40000;  	dma->datr0 = 0x02c40000; +	dma->sr0 = 0xfffffff; /* clear any errors */  	asm("sync; isync; msync");  	return;  } @@ -210,6 +229,10 @@ uint dma_check(void) {  		status = dma->sr0;  	} +	/* clear MR0[CS] channel start bit */ +	dma->mr0 &= 0x00000001; +	asm("sync;isync;msync"); +  	if (status != 0) {  		printf ("DMA Error: status = %x\n", status);  	} @@ -245,6 +268,10 @@ ft_cpu_setup(void *blob, bd_t *bd)  	if (p != NULL)  		*p = cpu_to_be32(clock); +	p = ft_get_prop(blob, "/qe@e0080000/" OF_CPU "/bus-frequency", &len); +	if (p != NULL) +		*p = cpu_to_be32(clock); +  	p = ft_get_prop(blob, "/" OF_SOC "/serial@4500/clock-frequency", &len);  	if (p != NULL)  		*p = cpu_to_be32(clock); @@ -255,21 +282,41 @@ ft_cpu_setup(void *blob, bd_t *bd)  #if defined(CONFIG_MPC85XX_TSEC1)  	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/mac-address", &len); +	if (p) +		memcpy(p, bd->bi_enetaddr, 6); + +	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/local-mac-address", &len); +	if (p)  		memcpy(p, bd->bi_enetaddr, 6);  #endif  #if defined(CONFIG_HAS_ETH1)  	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/mac-address", &len); +	if (p) +		memcpy(p, bd->bi_enet1addr, 6); + +	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/local-mac-address", &len); +	if (p)  		memcpy(p, bd->bi_enet1addr, 6);  #endif  #if defined(CONFIG_HAS_ETH2)  	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@26000/mac-address", &len); +	if (p) +		memcpy(p, bd->bi_enet2addr, 6); + +	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@26000/local-mac-address", &len); +	if (p)  		memcpy(p, bd->bi_enet2addr, 6);  #endif  #if defined(CONFIG_HAS_ETH3)  	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@27000/mac-address", &len); +	if (p) +		memcpy(p, bd->bi_enet3addr, 6); + +	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@27000/local-mac-address", &len); +	if (p)  		memcpy(p, bd->bi_enet3addr, 6);  #endif diff --git a/cpu/mpc85xx/cpu_init.c b/cpu/mpc85xx/cpu_init.c index 9f4d36c1a..9517146ed 100644 --- a/cpu/mpc85xx/cpu_init.c +++ b/cpu/mpc85xx/cpu_init.c @@ -143,12 +143,10 @@ void cpu_init_f (void)  	memctl->br1 = CFG_BR1_PRELIM;  #endif -#if !defined(CONFIG_MPC85xx)  #if defined(CFG_BR2_PRELIM) && defined(CFG_OR2_PRELIM)  	memctl->or2 = CFG_OR2_PRELIM;  	memctl->br2 = CFG_BR2_PRELIM;  #endif -#endif  #if defined(CFG_BR3_PRELIM) && defined(CFG_OR3_PRELIM)  	memctl->or3 = CFG_OR3_PRELIM; diff --git a/cpu/mpc85xx/pci.c b/cpu/mpc85xx/pci.c index 84f839ae1..3c1a323aa 100644 --- a/cpu/mpc85xx/pci.c +++ b/cpu/mpc85xx/pci.c @@ -90,14 +90,14 @@ pci_mpc85xx_init(struct pci_controller *board_hose)  	pcix->powbar1  = (CFG_PCI1_MEM_PHYS >> 12) & 0x000fffff;  	pcix->powbear1 = 0x00000000;  	pcix->powar1 = (POWAR_EN | POWAR_MEM_READ | -			POWAR_MEM_WRITE | POWAR_MEM_512M); +			POWAR_MEM_WRITE | (__ilog2(CFG_PCI1_MEM_SIZE) - 1));  	pcix->potar2  = (CFG_PCI1_IO_BASE >> 12) & 0x000fffff;  	pcix->potear2  = 0x00000000;  	pcix->powbar2  = (CFG_PCI1_IO_PHYS >> 12) & 0x000fffff;  	pcix->powbear2 = 0x00000000;  	pcix->powar2 = (POWAR_EN | POWAR_IO_READ | -			POWAR_IO_WRITE | POWAR_IO_1M); +			POWAR_IO_WRITE | (__ilog2(CFG_PCI1_IO_SIZE) - 1));  	pcix->pitar1 = 0x00000000;  	pcix->piwbar1 = 0x00000000; @@ -175,14 +175,14 @@ pci_mpc85xx_init(struct pci_controller *board_hose)  	pcix2->powbar1  = (CFG_PCI2_MEM_PHYS >> 12) & 0x000fffff;  	pcix2->powbear1 = 0x00000000;  	pcix2->powar1 = (POWAR_EN | POWAR_MEM_READ | -			POWAR_MEM_WRITE | POWAR_MEM_512M); +			POWAR_MEM_WRITE | (__ilog2(CFG_PCI2_MEM_SIZE) - 1));  	pcix2->potar2  = (CFG_PCI2_IO_BASE >> 12) & 0x000fffff;  	pcix2->potear2  = 0x00000000;  	pcix2->powbar2  = (CFG_PCI2_IO_PHYS >> 12) & 0x000fffff;  	pcix2->powbear2 = 0x00000000;  	pcix2->powar2 = (POWAR_EN | POWAR_IO_READ | -			POWAR_IO_WRITE | POWAR_IO_1M); +			POWAR_IO_WRITE | (__ilog2(CFG_PCI2_IO_SIZE) - 1));  	pcix2->pitar1 = 0x00000000;  	pcix2->piwbar1 = 0x00000000; diff --git a/cpu/mpc85xx/spd_sdram.c b/cpu/mpc85xx/spd_sdram.c index 6da5367a7..3777f49ad 100644 --- a/cpu/mpc85xx/spd_sdram.c +++ b/cpu/mpc85xx/spd_sdram.c @@ -263,13 +263,14 @@ spd_sdram(void)  	}  	/* -	 * Adjust DDR II IO voltage biasing.  It just makes it work. +	 * Adjust DDR II IO voltage biasing. +	 * Only 8548 rev 1 needs the fix  	 */ -	if (spd.mem_type == SPD_MEMTYPE_DDR2) { -		gur->ddrioovcr = (0 -				  | 0x80000000		/* Enable */ -				  | 0x10000000		/* VSEL to 1.8V */ -				  ); +	if ((SVR_VER(get_svr()) == SVR_8548_E) && +			(SVR_MJREV(get_svr()) == 1) && +			(spd.mem_type == SPD_MEMTYPE_DDR2)) { +		gur->ddrioovcr = (0x80000000	/* Enable */ +				  | 0x10000000);/* VSEL to 1.8V */  	}  	/* @@ -786,14 +787,17 @@ spd_sdram(void)  	 * Is this an ECC DDR chip?  	 * But don't mess with it if the DDR controller will init mem.  	 */ -#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) +#ifdef CONFIG_DDR_ECC  	if (spd.config == 0x02) { +#ifndef CONFIG_ECC_INIT_VIA_DDRCONTROLLER  		ddr->err_disable = 0x0000000d; +#endif  		ddr->err_sbe = 0x00ff0000;  	} +  	debug("DDR: err_disable = 0x%08x\n", ddr->err_disable);  	debug("DDR: err_sbe = 0x%08x\n", ddr->err_sbe); -#endif +#endif /* CONFIG_DDR_ECC */  	asm("sync;isync;msync");  	udelay(500); @@ -991,17 +995,24 @@ setup_laws_and_tlbs(unsigned int memsize)  		break;  	case 256:  	case 512: +		tlb_size = BOOKE_PAGESZ_256M; +		break;  	case 1024:  	case 2048: -		tlb_size = BOOKE_PAGESZ_256M; +		if (PVR_VER(get_pvr()) > PVR_VER(PVR_85xx)) +			tlb_size = BOOKE_PAGESZ_1G; +		else +			tlb_size = BOOKE_PAGESZ_256M;  		break;  	default:  		puts("DDR: only 16M,32M,64M,128M,256M,512M,1G and 2G are supported.\n");  		/*  		 * The memory was not able to be mapped. +		 * Default to a small size.  		 */ -		return 0; +		tlb_size = BOOKE_PAGESZ_64M; +		memsize=64;  		break;  	} diff --git a/cpu/mpc85xx/speed.c b/cpu/mpc85xx/speed.c index ca81ee735..12359a2d6 100644 --- a/cpu/mpc85xx/speed.c +++ b/cpu/mpc85xx/speed.c @@ -37,49 +37,21 @@ void get_sys_info (sys_info_t * sysInfo)  {  	volatile immap_t    *immap = (immap_t *)CFG_IMMR;  	volatile ccsr_gur_t *gur = &immap->im_gur; -	uint plat_ratio,e500_ratio; +	uint plat_ratio,e500_ratio,half_freqSystemBus;  	plat_ratio = (gur->porpllsr) & 0x0000003e;  	plat_ratio >>= 1; -	switch(plat_ratio) { -	case 0x02: -	case 0x03: -	case 0x04: -	case 0x05: -	case 0x06: -	case 0x08: -	case 0x09: -	case 0x0a: -	case 0x0c: -	case 0x10: -		sysInfo->freqSystemBus = plat_ratio * CONFIG_SYS_CLK_FREQ; -		break; -	default: -		sysInfo->freqSystemBus = 0; -		break; -	} - +	sysInfo->freqSystemBus = plat_ratio * CONFIG_SYS_CLK_FREQ;  	e500_ratio = (gur->porpllsr) & 0x003f0000;  	e500_ratio >>= 16; -	switch(e500_ratio) { -	case 0x04: -		sysInfo->freqProcessor = 2*sysInfo->freqSystemBus; -		break; -	case 0x05: -		sysInfo->freqProcessor = 5*sysInfo->freqSystemBus/2; -		break; -	case 0x06: -		sysInfo->freqProcessor = 3*sysInfo->freqSystemBus; -		break; -	case 0x07: -		sysInfo->freqProcessor = 7*sysInfo->freqSystemBus/2; -		break; -	default: -		sysInfo->freqProcessor = 0; -		break; -	} + +	/* Divide before multiply to avoid integer +	 * overflow for processor speeds above 2GHz */ +	half_freqSystemBus = sysInfo->freqSystemBus/2; +	sysInfo->freqProcessor = e500_ratio*half_freqSystemBus;  } +  int get_clocks (void)  {  	sys_info_t sys_info; diff --git a/cpu/mpc85xx/start.S b/cpu/mpc85xx/start.S index f96a4c3f8..20c7ebc72 100644 --- a/cpu/mpc85xx/start.S +++ b/cpu/mpc85xx/start.S @@ -251,13 +251,10 @@ _start_e500:  	 */  	bl	tlb1_entry  	mr	r5,r0 -	li	r1,0x0020	/* max 16 TLB1 plus some TLB0 entries */ -	mtctr	r1  	lwzu	r4,0(r5)	/* how many TLB1 entries we actually use */ +	mtctr	r4 -0:	cmpwi	r4,0 -	beq	1f -	lwzu	r0,4(r5) +0:	lwzu	r0,4(r5)  	lwzu	r1,4(r5)  	lwzu	r2,4(r5)  	lwzu	r3,4(r5) @@ -269,7 +266,6 @@ _start_e500:  	msync  	tlbwe  	isync -	addi	r4,r4,-1  	bdnz	0b  1: @@ -301,20 +297,16 @@ _start_e500:  	bl	law_entry  	mr	r6,r0 -	li	r1,0x0007	/* 8 LAWs, but reserve one for boot-over-rio-or-pci */ -	mtctr	r1  	lwzu	r5,0(r6)	/* how many windows we actually use */ +	mtctr	r5  	li	r2,0x0c28	/* the first pair is reserved for boot-over-rio-or-pci */  	li	r1,0x0c30 -0:	cmpwi	r5,0 -	beq	1f -	lwzu	r4,4(r6) +0:	lwzu	r4,4(r6)  	lwzu	r3,4(r6)  	stwx	r4,r7,r2  	stwx	r3,r7,r1 -	addi	r5,r5,-1  	addi	r2,r2,0x0020  	addi	r1,r1,0x0020  	bdnz	0b diff --git a/cpu/mpc86xx/cpu.c b/cpu/mpc86xx/cpu.c index 551b24307..a33acfec4 100644 --- a/cpu/mpc86xx/cpu.c +++ b/cpu/mpc86xx/cpu.c @@ -32,12 +32,6 @@  #include <ft_build.h>  #endif -#ifdef CONFIG_MPC8641HPCN -extern void mpc8641_reset_board(cmd_tbl_t *cmdtp, int flag, -				int argc, char *argv[]); -#endif - -  int  checkcpu(void)  { @@ -185,7 +179,7 @@ do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  #else /* CONFIG_MPC8641HPCN */ -	mpc8641_reset_board(cmdtp, flag, argc, argv); +	out8(PIXIS_BASE + PIXIS_RST, 0);  #endif /* !CONFIG_MPC8641HPCN */ @@ -286,22 +280,38 @@ ft_cpu_setup(void *blob, bd_t *bd)  #if defined(CONFIG_MPC86XX_TSEC1)  	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/mac-address", &len); -	memcpy(p, bd->bi_enetaddr, 6); +	if (p != NULL) +		memcpy(p, bd->bi_enetaddr, 6); +	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/local-mac-address", &len); +	if (p) +		memcpy(p, bd->bi_enetaddr, 6);  #endif  #if defined(CONFIG_MPC86XX_TSEC2)  	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/mac-address", &len); -	memcpy(p, bd->bi_enet1addr, 6); +	if (p != NULL) +		memcpy(p, bd->bi_enet1addr, 6); +	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/local-mac-address", &len); +	if (p != NULL) +		memcpy(p, bd->bi_enet1addr, 6);  #endif  #if defined(CONFIG_MPC86XX_TSEC3)  	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@26000/mac-address", &len); -	memcpy(p, bd->bi_enet2addr, 6); +	if (p != NULL) +		memcpy(p, bd->bi_enet2addr, 6); +	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@26000/local-mac-address", &len); +	if (p != NULL) +		memcpy(p, bd->bi_enet2addr, 6);  #endif  #if defined(CONFIG_MPC86XX_TSEC4)  	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@27000/mac-address", &len); -	memcpy(p, bd->bi_enet3addr, 6); +	if (p != NULL) +		memcpy(p, bd->bi_enet3addr, 6); +	p = ft_get_prop(blob, "/" OF_SOC "/ethernet@27000/local-mac-address", &len); +	if (p != NULL) +		memcpy(p, bd->bi_enet3addr, 6);  #endif  } diff --git a/cpu/mpc86xx/spd_sdram.c b/cpu/mpc86xx/spd_sdram.c index ac9ff81ce..f37ab430b 100644 --- a/cpu/mpc86xx/spd_sdram.c +++ b/cpu/mpc86xx/spd_sdram.c @@ -51,20 +51,32 @@ extern int dma_xfer(void *dest, uint count, void *src);  #define CFG_SUPER_BANK_INTERLEAVING	0  /* - * Convert picoseconds into clock cycles (rounding up if needed). + * Convert picoseconds into DRAM clock cycles (rounding up if needed).   */ -int -picos_to_clk(int picos) +static unsigned int +picos_to_clk(unsigned int picos)  { -	int clks; +	/* use unsigned long long to avoid rounding errors */ +	const unsigned long long ULL_2e12 = 2000000000000ULL; +	unsigned long long clks; +	unsigned long long clks_temp; -	clks = picos / (2000000000 / (get_bus_freq(0) / 1000)); -	if (picos % (2000000000 / (get_bus_freq(0) / 1000)) != 0) { +	if (! picos) +	    return 0; + +	clks = get_bus_freq(0) * (unsigned long long) picos; +	clks_temp = clks; +	clks = clks / ULL_2e12; +	if (clks_temp % ULL_2e12) {  		clks++;  	} -	return clks; +	if (clks > 0xFFFFFFFFULL) { +		clks = 0xFFFFFFFFULL; +	} + +	return (unsigned int) clks;  } diff --git a/cpu/mpc86xx/start.S b/cpu/mpc86xx/start.S index 7406fe224..67c56db1a 100644 --- a/cpu/mpc86xx/start.S +++ b/cpu/mpc86xx/start.S @@ -241,26 +241,40 @@ in_flash:  	bl	setup_ccsrbar  #endif -	/* Fix for SMP linux - Changing arbitration to round-robin */ -	lis	r3, CFG_CCSRBAR@h -	ori	r3, r3, 0x1000 -	xor	r4, r4, r4 -	li	r4, 0x1000 -	stw	r4, 0(r3) -	/* setup the law entries */ -	bl	law_entry +	/* -- MPC8641 Rev 1.0 MCM Errata fixups -- */ + +	/* skip fixups if not Rev 1.0 */ +	mfspr	r4, SVR +	rlwinm	r4,r4,0,24,31 +	cmpwi	r4,0x10 +	bne	1f + +	lis	r3,MCM_ABCR@ha +	lwz	r4,MCM_ABCR@l(r3)	/* ABCR -> r4 */ + +	/* set ABCR[A_STRM_CNT] = 0 */ +	rlwinm	r4,r4,0,0,29 + +	/* set ABCR[ARB_POLICY] to 0x1 (round-robin) */ +	addi	r0,r0,1 +	rlwimi	r4,r0,12,18,19 + +	stw	r4,MCM_ABCR@l(r3)	/* r4 -> ABCR */  	sync -	/* Don't use this feature due to bug in 8641D PD4 */ -	/* Disable ERD_DIS */ -	lis	r3, CFG_CCSRBAR@h -	ori	r3, r3, 0x1008 -	lwz	r4, 0(r3) +	/* Set DBCR[ERD_DIS] */ +	lis	r3,MCM_DBCR@ha +	lwz	r4,MCM_DBCR@l(r3)  	oris	r4, r4, 0x4000 -	stw	r4, 0(r3) +	stw	r4,MCM_DBCR@l(r3) +	sync +1: +	/* setup the law entries */ +	bl	law_entry  	sync +  #if (EMULATOR_RUN == 1)  	/* On the emulator we want to adjust these ASAP */  	/* otherwise things are sloooow */ diff --git a/cpu/ppc4xx/44x_spd_ddr2.c b/cpu/ppc4xx/44x_spd_ddr2.c index b56629bf5..48b9ee2f7 100644 --- a/cpu/ppc4xx/44x_spd_ddr2.c +++ b/cpu/ppc4xx/44x_spd_ddr2.c @@ -465,7 +465,11 @@ long int initdram(int board_type)  	 * Set the SDRAM Clock Timing Register  	 *-----------------------------------------------------------------*/  	mfsdram(SDRAM_CLKTR, val); +#ifdef CFG_44x_DDR2_CKTR_180 +	mtsdram(SDRAM_CLKTR, (val & ~SDRAM_CLKTR_CLKP_MASK) | SDRAM_CLKTR_CLKP_180_DEG_ADV); +#else  	mtsdram(SDRAM_CLKTR, (val & ~SDRAM_CLKTR_CLKP_MASK) | SDRAM_CLKTR_CLKP_0_DEG); +#endif  	/*------------------------------------------------------------------  	 * Program the BxCF registers. @@ -1117,14 +1121,15 @@ static void program_codt(unsigned long *dimm_populated,  				modt3 = 0x00000000;  			}  			if (total_rank == 4) { -				codt |= CALC_ODT_R(0) | CALC_ODT_R(1) | CALC_ODT_R(2) | CALC_ODT_R(3); +				codt |= CALC_ODT_R(0) | CALC_ODT_R(1) | +					CALC_ODT_R(2) | CALC_ODT_R(3);  				modt0 = CALC_ODT_RW(2);  				modt1 = 0x00000000;  				modt2 = CALC_ODT_RW(0);  				modt3 = 0x00000000;  			}  		} -  	} else { +	} else {  		codt |= SDRAM_CODT_DQS_2_5_V_DDR1;  		modt0 = 0x00000000;  		modt1 = 0x00000000; diff --git a/cpu/ppc4xx/4xx_enet.c b/cpu/ppc4xx/4xx_enet.c index be4e82405..1200d021a 100644 --- a/cpu/ppc4xx/4xx_enet.c +++ b/cpu/ppc4xx/4xx_enet.c @@ -344,7 +344,7 @@ int ppc_4xx_eth_setup_bridge(int devnum, bd_t * bis)  	mfsdr(sdr_pfc1, pfc1);  	pfc1 &= SDR0_PFC1_SELECT_MASK; -	switch (pfc1) {  +	switch (pfc1) {  	case SDR0_PFC1_SELECT_CONFIG_2:  		/* 1 x GMII port */  		out32 (ZMII_FER, 0x00); @@ -361,7 +361,7 @@ int ppc_4xx_eth_setup_bridge(int devnum, bd_t * bis)  		break;  	case SDR0_PFC1_SELECT_CONFIG_6:  		/* 2 x SMII ports */ -		out32 (ZMII_FER,  +		out32 (ZMII_FER,  		       ((ZMII_FER_SMII) << ZMII_FER_V(0)) |  		       ((ZMII_FER_SMII) << ZMII_FER_V(1)));  		out32 (RGMII_FER, 0x00000000); diff --git a/cpu/ppc4xx/ndfc.c b/cpu/ppc4xx/ndfc.c index 09aac38f4..f63fc79f6 100644 --- a/cpu/ppc4xx/ndfc.c +++ b/cpu/ppc4xx/ndfc.c @@ -33,14 +33,15 @@  #if (CONFIG_COMMANDS & CFG_CMD_NAND) && !defined(CFG_NAND_LEGACY) && \  	(defined(CONFIG_440EP) || defined(CONFIG_440GR) ||	     \ -	 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)) +	 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) ||	     \ +	 defined(CONFIG_405EZ))  #include <nand.h>  #include <linux/mtd/ndfc.h>  #include <linux/mtd/nand_ecc.h>  #include <asm/processor.h>  #include <asm/io.h> -#include <ppc440.h> +#include <ppc4xx.h>  static u8 hwctl = 0; @@ -210,8 +211,7 @@ int board_nand_init(struct nand_chip *nand)  	/*  	 * Setup EBC (CS0 only right now)  	 */ -	mtdcr(ebccfga, xbcfg); -	mtdcr(ebccfgd, 0xb8400000); +	mtebc(EBC0_CFG, 0xb8400000);  	mtebc(pb0cr, CFG_EBC_PB0CR);  	mtebc(pb0ap, CFG_EBC_PB0AP); diff --git a/cpu/ppc4xx/start.S b/cpu/ppc4xx/start.S index fe14ecd7b..78de30031 100644 --- a/cpu/ppc4xx/start.S +++ b/cpu/ppc4xx/start.S @@ -830,7 +830,7 @@ _start:  	mtdcr	ocmdscr2, r3            /* Set Data Side */  	mtdcr	ocmiscr2, r3            /* Set Instruction Side */  	addis	r3,0,0x0800             /* OCM Data Parity Disable - 1 Wait State */ -	mtdcr	ocmdsisdpc,r4 +	mtdcr	ocmdsisdpc,r3  	isync  #else /* CONFIG_405EZ */ |