diff options
103 files changed, 1198 insertions, 575 deletions
| @@ -625,6 +625,7 @@ The following options need to be configured:  		CONFIG_CMD_BOOTD	  bootd  		CONFIG_CMD_CACHE	* icache, dcache  		CONFIG_CMD_CONSOLE	  coninfo +		CONFIG_CMD_CRC32	* crc32  		CONFIG_CMD_DATE		* support for RTC, date/time...  		CONFIG_CMD_DHCP		* DHCP support  		CONFIG_CMD_DIAG		* Diagnostics @@ -637,18 +638,21 @@ The following options need to be configured:  		CONFIG_CMD_EDITENV	  edit env variable  		CONFIG_CMD_EEPROM	* EEPROM read/write support  		CONFIG_CMD_ELF		* bootelf, bootvx +		CONFIG_CMD_EXPORTENV	* export the environment  		CONFIG_CMD_SAVEENV	  saveenv  		CONFIG_CMD_FDC		* Floppy Disk Support  		CONFIG_CMD_FAT		* FAT partition support  		CONFIG_CMD_FDOS		* Dos diskette Support  		CONFIG_CMD_FLASH	  flinfo, erase, protect  		CONFIG_CMD_FPGA		  FPGA device initialization support +		CONFIG_CMD_GO		* the 'go' command (exec code)  		CONFIG_CMD_HWFLOW	* RTS/CTS hw flow control  		CONFIG_CMD_I2C		* I2C serial bus support  		CONFIG_CMD_IDE		* IDE harddisk support  		CONFIG_CMD_IMI		  iminfo  		CONFIG_CMD_IMLS		  List all found images  		CONFIG_CMD_IMMAP	* IMMR dump support +		CONFIG_CMD_IMPORTENV	* import an environment  		CONFIG_CMD_IRQ		* irqinfo  		CONFIG_CMD_ITEST	  Integer/string test of 2 values  		CONFIG_CMD_JFFS2	* JFFS2 Support diff --git a/arch/blackfin/cpu/Makefile b/arch/blackfin/cpu/Makefile index 4a9e577a8..df10f1bc6 100644 --- a/arch/blackfin/cpu/Makefile +++ b/arch/blackfin/cpu/Makefile @@ -18,7 +18,6 @@ CEXTRA   := initcode.o  SEXTRA   := start.o  SOBJS    := interrupt.o cache.o  COBJS-$(CONFIG_BOOTCOUNT_LIMIT) += bootcount.o -COBJS-$(CONFIG_CMD_GPIO) += cmd_gpio.o  COBJS-y  += cpu.o  COBJS-y  += gpio.o  COBJS-y  += interrupts.o diff --git a/arch/blackfin/cpu/cmd_gpio.c b/arch/blackfin/cpu/cmd_gpio.c deleted file mode 100644 index e96413b63..000000000 --- a/arch/blackfin/cpu/cmd_gpio.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Control GPIO pins on the fly - * - * Copyright (c) 2008-2010 Analog Devices Inc. - * - * Licensed under the GPL-2 or later. - */ - -#include <common.h> -#include <command.h> -#include <linux/ctype.h> - -#include <asm/blackfin.h> -#include <asm/gpio.h> - -enum { -	GPIO_INPUT, -	GPIO_SET, -	GPIO_CLEAR, -	GPIO_TOGGLE, -}; - -int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ -	if (argc == 2 && !strcmp(argv[1], "status")) { -		bfin_gpio_labels(); -		return 0; -	} - -	if (argc != 3) - show_usage: -		return cmd_usage(cmdtp); - -	/* parse the behavior */ -	ulong sub_cmd; -	switch (argv[1][0]) { -		case 'i': sub_cmd = GPIO_INPUT;  break; -		case 's': sub_cmd = GPIO_SET;    break; -		case 'c': sub_cmd = GPIO_CLEAR;  break; -		case 't': sub_cmd = GPIO_TOGGLE; break; -		default:  goto show_usage; -	} - -	/* parse the pin with format: [p][port]<#> */ -	const char *str_pin = argv[2]; - -	/* grab the [p]<port> portion */ -	ulong port_base; -	if (tolower(*str_pin) == 'p') ++str_pin; -	switch (tolower(*str_pin)) { -#ifdef GPIO_PA0 -		case 'a': port_base = GPIO_PA0; break; -#endif -#ifdef GPIO_PB0 -		case 'b': port_base = GPIO_PB0; break; -#endif -#ifdef GPIO_PC0 -		case 'c': port_base = GPIO_PC0; break; -#endif -#ifdef GPIO_PD0 -		case 'd': port_base = GPIO_PD0; break; -#endif -#ifdef GPIO_PE0 -		case 'e': port_base = GPIO_PE0; break; -#endif -#ifdef GPIO_PF0 -		case 'f': port_base = GPIO_PF0; break; -#endif -#ifdef GPIO_PG0 -		case 'g': port_base = GPIO_PG0; break; -#endif -#ifdef GPIO_PH0 -		case 'h': port_base = GPIO_PH0; break; -#endif -#ifdef GPIO_PI0 -		case 'i': port_base = GPIO_PI0; break; -#endif -#ifdef GPIO_PJ -		case 'j': port_base = GPIO_PJ0; break; -#endif -		default:  goto show_usage; -	} - -	/* grab the <#> portion */ -	ulong pin = simple_strtoul(str_pin + 1, NULL, 10); -	if (pin > 15) -		goto show_usage; - -	/* grab the pin before we tweak it */ -	ulong gpio = port_base + pin; -	gpio_request(gpio, "cmd_gpio"); - -	/* finally, let's do it: set direction and exec command */ -	ulong value; -	if (sub_cmd == GPIO_INPUT) { -		gpio_direction_input(gpio); -		value = gpio_get_value(gpio); -	} else { -		switch (sub_cmd) { -			case GPIO_SET:    value = 1; break; -			case GPIO_CLEAR:  value = 0; break; -			case GPIO_TOGGLE: value = !gpio_get_value(gpio); break; -			default:          goto show_usage; -		} -		gpio_direction_output(gpio, value); -	} -	printf("gpio: pin %lu on port %c (gpio %lu) value is %lu\n", -		pin, *str_pin, gpio, value); - -	gpio_free(gpio); - -	return value; -} - -U_BOOT_CMD(gpio, 3, 0, do_gpio, -	"input/set/clear/toggle gpio output pins", -	"<input|set|clear|toggle> <port><pin>\n" -	"    - input/set/clear/toggle the specified pin (e.g. PF10)"); diff --git a/arch/blackfin/include/asm/gpio.h b/arch/blackfin/include/asm/gpio.h index b650ef080..9c0e5d195 100644 --- a/arch/blackfin/include/asm/gpio.h +++ b/arch/blackfin/include/asm/gpio.h @@ -196,6 +196,59 @@ static inline int gpio_is_valid(int number)  	return number >= 0 && number < MAX_BLACKFIN_GPIOS;  } +#include <linux/ctype.h> + +static inline int name_to_gpio(const char *name) +{ +	int port_base; + +	if (tolower(*name) == 'p') { +		++name; + +		switch (tolower(*name)) { +#ifdef GPIO_PA0 +		case 'a': port_base = GPIO_PA0; break; +#endif +#ifdef GPIO_PB0 +		case 'b': port_base = GPIO_PB0; break; +#endif +#ifdef GPIO_PC0 +		case 'c': port_base = GPIO_PC0; break; +#endif +#ifdef GPIO_PD0 +		case 'd': port_base = GPIO_PD0; break; +#endif +#ifdef GPIO_PE0 +		case 'e': port_base = GPIO_PE0; break; +#endif +#ifdef GPIO_PF0 +		case 'f': port_base = GPIO_PF0; break; +#endif +#ifdef GPIO_PG0 +		case 'g': port_base = GPIO_PG0; break; +#endif +#ifdef GPIO_PH0 +		case 'h': port_base = GPIO_PH0; break; +#endif +#ifdef GPIO_PI0 +		case 'i': port_base = GPIO_PI0; break; +#endif +#ifdef GPIO_PJ +		case 'j': port_base = GPIO_PJ0; break; +#endif +		default:  return -1; +		} + +		++name; +	} else +		port_base = 0; + +	return port_base + simple_strtoul(name, NULL, 10); +} +#define name_to_gpio(n) name_to_gpio(n) + +#define gpio_status() bfin_gpio_labels() +  #endif /* __ASSEMBLY__ */  #endif /* __ARCH_BLACKFIN_GPIO_H__ */ diff --git a/arch/powerpc/config.mk b/arch/powerpc/config.mk index 3afc439e5..e682071bd 100644 --- a/arch/powerpc/config.mk +++ b/arch/powerpc/config.mk @@ -26,8 +26,6 @@ CROSS_COMPILE ?= ppc_8xx-  CONFIG_STANDALONE_LOAD_ADDR ?= 0x40000  LDFLAGS_FINAL += --gc-sections  PLATFORM_RELFLAGS += -fpic -mrelocatable -ffunction-sections -fdata-sections -PLATFORM_RELFLAGS += $(call cc-option,-msingle-pic-base,) -PLATFORM_RELFLAGS += $(call cc-option,-fno-jump-tables,)  PLATFORM_CPPFLAGS += -DCONFIG_PPC -D__powerpc__  PLATFORM_LDFLAGS  += -n diff --git a/arch/powerpc/cpu/74xx_7xx/start.S b/arch/powerpc/cpu/74xx_7xx/start.S index ab9412ad9..f6011fcaa 100644 --- a/arch/powerpc/cpu/74xx_7xx/start.S +++ b/arch/powerpc/cpu/74xx_7xx/start.S @@ -274,11 +274,7 @@ in_flash:  	stwu	r0, -4(r1)	/* stack backtraces terminate cleanly	*/  	GET_GOT			/* initialize GOT access	*/ -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif +  	/* run low-level CPU init code     (from Flash)	*/  	bl	cpu_init_f  	sync @@ -592,11 +588,6 @@ relocate_code:  	mr	r10, r5		/* Save copy of Destination Address	*/  	GET_GOT -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif  	mr	r3,  r5				/* Destination Address	*/  	lis	r4, CONFIG_SYS_MONITOR_BASE@h		/* Source      Address	*/  	ori	r4, r4, CONFIG_SYS_MONITOR_BASE@l diff --git a/arch/powerpc/cpu/mpc512x/start.S b/arch/powerpc/cpu/mpc512x/start.S index 632f9674c..9c2e4885d 100644 --- a/arch/powerpc/cpu/mpc512x/start.S +++ b/arch/powerpc/cpu/mpc512x/start.S @@ -255,11 +255,7 @@ in_flash:  	/*------------------------------------------------------*/  	GET_GOT			/* initialize GOT access	*/ -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif +  	/* r3: IMMR */  	lis	r3, CONFIG_SYS_IMMR@h  	/* run low-level CPU init code (in Flash) */ @@ -490,11 +486,6 @@ relocate_code:  	mr	r10, r5		/* Save copy of Destination Address */  	GET_GOT -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif  	mr	r3,  r5				/* Destination Address */  	lis	r4, CONFIG_SYS_MONITOR_BASE@h		/* Source      Address */  	ori	r4, r4, CONFIG_SYS_MONITOR_BASE@l diff --git a/arch/powerpc/cpu/mpc5xx/start.S b/arch/powerpc/cpu/mpc5xx/start.S index 4fb2047da..cc11c8fc5 100644 --- a/arch/powerpc/cpu/mpc5xx/start.S +++ b/arch/powerpc/cpu/mpc5xx/start.S @@ -174,11 +174,7 @@ in_flash:  	/*----------------------------------------------------------------------*/  	GET_GOT			/* initialize GOT access			*/ -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif +  	/* r3: IMMR */  	bl	cpu_init_f	/* run low-level CPU init code     (from Flash)	*/ @@ -367,11 +363,6 @@ relocate_code:  	mr	r10, r5		/* Save copy of monitor destination Address in SRAM */  	GET_GOT -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif  	mr	r3,  r5				/* Destination Address	*/  	lis	r4, CONFIG_SYS_MONITOR_BASE@h		/* Source      Address	*/  	ori	r4, r4, CONFIG_SYS_MONITOR_BASE@l diff --git a/arch/powerpc/cpu/mpc5xxx/start.S b/arch/powerpc/cpu/mpc5xxx/start.S index 0a0536119..192aa506a 100644 --- a/arch/powerpc/cpu/mpc5xxx/start.S +++ b/arch/powerpc/cpu/mpc5xxx/start.S @@ -160,11 +160,7 @@ lowboot_reentry:  	/*--------------------------------------------------------------*/  	GET_GOT			/* initialize GOT access		*/ -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif +  	/* r3: IMMR */  	bl	cpu_init_f	/* run low-level CPU init code (in Flash)*/ @@ -553,11 +549,6 @@ relocate_code:  	mr	r10, r5		/* Save copy of Destination Address	*/  	GET_GOT -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif  	mr	r3,  r5				/* Destination Address	*/  	lis	r4, CONFIG_SYS_MONITOR_BASE@h		/* Source      Address	*/  	ori	r4, r4, CONFIG_SYS_MONITOR_BASE@l diff --git a/arch/powerpc/cpu/mpc8220/start.S b/arch/powerpc/cpu/mpc8220/start.S index 1df87a6af..300b35c0c 100644 --- a/arch/powerpc/cpu/mpc8220/start.S +++ b/arch/powerpc/cpu/mpc8220/start.S @@ -129,11 +129,7 @@ _start:  	/*--------------------------------------------------------------*/  	GET_GOT			/* initialize GOT access		*/ -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif +  	/* r3: IMMR */  	bl	cpu_init_f	/* run low-level CPU init code (in Flash)*/ @@ -526,11 +522,6 @@ relocate_code:  	mr	r10, r5	    /* Save copy of Destination Address */  	GET_GOT -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif  	mr	r3,  r5	    /* Destination Address		*/  	lis	r4, CONFIG_SYS_MONITOR_BASE@h	/* Source Address	*/  	ori	r4, r4, CONFIG_SYS_MONITOR_BASE@l diff --git a/arch/powerpc/cpu/mpc824x/start.S b/arch/powerpc/cpu/mpc824x/start.S index cc988759e..fc4e922d6 100644 --- a/arch/powerpc/cpu/mpc824x/start.S +++ b/arch/powerpc/cpu/mpc824x/start.S @@ -183,11 +183,7 @@ in_flash:  	/*----------------------------------------------------------------------*/  	GET_GOT			/* initialize GOT access			*/ -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif +  	/* r3: IMMR */  	bl	cpu_init_f	/* run low-level CPU init code     (from Flash)	*/ @@ -456,11 +452,6 @@ relocate_code:  	mr	r10, r5		/* Save copy of Destination Address	*/  	GET_GOT -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif  	mr	r3,  r5				/* Destination Address	*/  #ifdef CONFIG_SYS_RAMBOOT  	lis	r4, CONFIG_SYS_SDRAM_BASE@h		/* Source      Address	*/ diff --git a/arch/powerpc/cpu/mpc8260/start.S b/arch/powerpc/cpu/mpc8260/start.S index 23151cdad..702546eec 100644 --- a/arch/powerpc/cpu/mpc8260/start.S +++ b/arch/powerpc/cpu/mpc8260/start.S @@ -236,11 +236,7 @@ in_flash:  	/*--------------------------------------------------------------*/  	GET_GOT			/* initialize GOT access		*/ -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif +  	/* r3: IMMR */  	bl	cpu_init_f	/* run low-level CPU init code (in Flash)*/ diff --git a/arch/powerpc/cpu/mpc83xx/start.S b/arch/powerpc/cpu/mpc83xx/start.S index a9acb83f0..7e60315c3 100644 --- a/arch/powerpc/cpu/mpc83xx/start.S +++ b/arch/powerpc/cpu/mpc83xx/start.S @@ -285,11 +285,7 @@ in_flash:  	/*------------------------------------------------------*/  	GET_GOT			/* initialize GOT access	*/ -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif +  	/* r3: IMMR */  	lis	r3, CONFIG_SYS_IMMR@h  	/* run low-level CPU init code (in Flash)*/ @@ -826,11 +822,6 @@ relocate_code:  	mr	r10, r5		/* Save copy of Destination Address */  	GET_GOT -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif  	mr	r3,  r5				/* Destination Address */  	lis	r4, CONFIG_SYS_MONITOR_BASE@h		/* Source      Address */  	ori	r4, r4, CONFIG_SYS_MONITOR_BASE@l diff --git a/arch/powerpc/cpu/mpc85xx/start.S b/arch/powerpc/cpu/mpc85xx/start.S index 36233578f..57774933a 100644 --- a/arch/powerpc/cpu/mpc85xx/start.S +++ b/arch/powerpc/cpu/mpc85xx/start.S @@ -421,11 +421,6 @@ _start_cont:  	stw	r0,+12(r1)		/* Save return addr (underflow vect) */  	GET_GOT -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif  	bl	cpu_init_early_f  	/* switch back to AS = 0 */ @@ -926,11 +921,6 @@ relocate_code:  	mr	r10,r5		/* Save copy of Destination Address	*/  	GET_GOT -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif  	mr	r3,r5				/* Destination Address	*/  	lis	r4,CONFIG_SYS_MONITOR_BASE@h		/* Source      Address	*/  	ori	r4,r4,CONFIG_SYS_MONITOR_BASE@l diff --git a/arch/powerpc/cpu/mpc86xx/start.S b/arch/powerpc/cpu/mpc86xx/start.S index 2ec7fd46b..3e3c21eef 100644 --- a/arch/powerpc/cpu/mpc86xx/start.S +++ b/arch/powerpc/cpu/mpc86xx/start.S @@ -255,11 +255,7 @@ addr_trans_enabled:  	stwu	r0, -4(r1)	/* stack backtraces terminate cleanly	*/  	GET_GOT			/* initialize GOT access	*/ -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif +  	/* run low-level CPU init code	   (from Flash) */  	bl	cpu_init_f  	sync @@ -624,11 +620,6 @@ relocate_code:  	mr	r10, r5		/* Save copy of Destination Address	*/  	GET_GOT -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif  	mr	r3,  r5				/* Destination Address	*/  	lis	r4, CONFIG_SYS_MONITOR_BASE@h		/* Source      Address	*/  	ori	r4, r4, CONFIG_SYS_MONITOR_BASE@l diff --git a/arch/powerpc/cpu/mpc8xx/start.S b/arch/powerpc/cpu/mpc8xx/start.S index f8256bff9..fe3daa2b9 100644 --- a/arch/powerpc/cpu/mpc8xx/start.S +++ b/arch/powerpc/cpu/mpc8xx/start.S @@ -188,11 +188,7 @@ in_flash:  	/*----------------------------------------------------------------------*/  	GET_GOT			/* initialize GOT access			*/ -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif +  	/* r3: IMMR */  	bl	cpu_init_f	/* run low-level CPU init code     (from Flash)	*/ @@ -477,11 +473,6 @@ relocate_code:  	mr	r10, r5		/* Save copy of Destination Address	*/  	GET_GOT -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif  	mr	r3,  r5				/* Destination Address	*/  	lis	r4, CONFIG_SYS_MONITOR_BASE@h		/* Source      Address	*/  	ori	r4, r4, CONFIG_SYS_MONITOR_BASE@l diff --git a/arch/powerpc/cpu/ppc4xx/start.S b/arch/powerpc/cpu/ppc4xx/start.S index aa03d9a77..b43e22c8f 100644 --- a/arch/powerpc/cpu/ppc4xx/start.S +++ b/arch/powerpc/cpu/ppc4xx/start.S @@ -262,11 +262,6 @@  	bl	reconfig_tlb0  #endif  	GET_GOT -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif  	bl	cpu_init_f	/* run low-level CPU init code	   (from Flash) */  	bl	board_init_f  	/* NOTREACHED - board_init_f() does not return */ @@ -804,11 +799,7 @@ _start:  	ori	r0,r0, RESET_VECTOR@l  	stwu	r1,-8(r1)		/* Save back chain and move SP */  	stw	r0,+12(r1)		/* Save return addr (underflow vect) */ -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif +  #ifdef CONFIG_NAND_SPL  	bl	nand_boot_common	/* will not return */  #else @@ -923,11 +914,7 @@ _start:  	stwu	r0, -4(r1)		/* stack backtraces terminate cleanly	*/  	GET_GOT			/* initialize GOT access			*/ -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif +  	bl	board_init_f	/* run first part of init code (from Flash)	*/  	/* NOTREACHED - board_init_f() does not return */ @@ -1192,11 +1179,6 @@ _start:  	stw	r0, +12(r1)		/* Save return addr (underflow vect) */  #endif /* CONFIG_SYS_INIT_DCACHE_CS */ -#if defined(__pic__) && __pic__ == 1 -	/* Needed for upcoming -msingle-pic-base */ -	bl	_GLOBAL_OFFSET_TABLE_@local-4 -	mflr	r30 -#endif  #ifdef CONFIG_NAND_SPL  	bl	nand_boot_common	/* will not return */  #else diff --git a/board/LEOX/elpt860/u-boot.lds b/board/LEOX/elpt860/u-boot.lds index 45206ca3b..5aaf6b309 100644 --- a/board/LEOX/elpt860/u-boot.lds +++ b/board/LEOX/elpt860/u-boot.lds @@ -67,13 +67,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/RPXClassic/u-boot.lds b/board/RPXClassic/u-boot.lds index 05cc2338a..d0b60cf7c 100644 --- a/board/RPXClassic/u-boot.lds +++ b/board/RPXClassic/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/RPXlite/u-boot.lds b/board/RPXlite/u-boot.lds index 05cc2338a..d0b60cf7c 100644 --- a/board/RPXlite/u-boot.lds +++ b/board/RPXlite/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/RPXlite_dw/u-boot.lds b/board/RPXlite_dw/u-boot.lds index 05cc2338a..d0b60cf7c 100644 --- a/board/RPXlite_dw/u-boot.lds +++ b/board/RPXlite_dw/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/RRvision/u-boot.lds b/board/RRvision/u-boot.lds index 3e7853a2a..838537375 100644 --- a/board/RRvision/u-boot.lds +++ b/board/RRvision/u-boot.lds @@ -52,13 +52,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/adder/u-boot.lds b/board/adder/u-boot.lds index 661a94ab1..a7627699e 100644 --- a/board/adder/u-boot.lds +++ b/board/adder/u-boot.lds @@ -43,13 +43,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_) >> 2;    .data    : diff --git a/board/amirix/ap1000/u-boot.lds b/board/amirix/ap1000/u-boot.lds index 57fe1d9ce..cd8f5ceba 100644 --- a/board/amirix/ap1000/u-boot.lds +++ b/board/amirix/ap1000/u-boot.lds @@ -49,13 +49,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/c2mon/u-boot.lds b/board/c2mon/u-boot.lds index 524c36eb4..b9b8e3c72 100644 --- a/board/c2mon/u-boot.lds +++ b/board/c2mon/u-boot.lds @@ -55,13 +55,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/cogent/u-boot.lds b/board/cogent/u-boot.lds index e324f5c1e..2393d8d8a 100644 --- a/board/cogent/u-boot.lds +++ b/board/cogent/u-boot.lds @@ -51,13 +51,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/dave/PPChameleonEVB/u-boot.lds b/board/dave/PPChameleonEVB/u-boot.lds index 20c32b73e..3b1011435 100644 --- a/board/dave/PPChameleonEVB/u-boot.lds +++ b/board/dave/PPChameleonEVB/u-boot.lds @@ -55,9 +55,10 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } diff --git a/board/eltec/mhpc/u-boot.lds b/board/eltec/mhpc/u-boot.lds index 2fac727b8..fd4e8a50d 100644 --- a/board/eltec/mhpc/u-boot.lds +++ b/board/eltec/mhpc/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/emk/top860/u-boot.lds b/board/emk/top860/u-boot.lds index 32dcbd3ef..fb0664866 100644 --- a/board/emk/top860/u-boot.lds +++ b/board/emk/top860/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/ep88x/u-boot.lds b/board/ep88x/u-boot.lds index e2dd1c20f..332b35a57 100644 --- a/board/ep88x/u-boot.lds +++ b/board/ep88x/u-boot.lds @@ -43,9 +43,10 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } diff --git a/board/esd/dasa_sim/u-boot.lds b/board/esd/dasa_sim/u-boot.lds index 2bf60f580..b15948d34 100644 --- a/board/esd/dasa_sim/u-boot.lds +++ b/board/esd/dasa_sim/u-boot.lds @@ -54,13 +54,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/esteem192e/u-boot.lds b/board/esteem192e/u-boot.lds index 8455f0b9f..163b83d81 100644 --- a/board/esteem192e/u-boot.lds +++ b/board/esteem192e/u-boot.lds @@ -56,13 +56,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/etx094/u-boot.lds b/board/etx094/u-boot.lds index 04233d86a..b68d9eadc 100644 --- a/board/etx094/u-boot.lds +++ b/board/etx094/u-boot.lds @@ -56,13 +56,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/evb64260/u-boot.lds b/board/evb64260/u-boot.lds index 0648f62fe..2d031efc4 100644 --- a/board/evb64260/u-boot.lds +++ b/board/evb64260/u-boot.lds @@ -51,13 +51,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/fads/u-boot.lds b/board/fads/u-boot.lds index 63d0ea112..9ea0674b8 100644 --- a/board/fads/u-boot.lds +++ b/board/fads/u-boot.lds @@ -49,13 +49,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/flagadm/u-boot.lds b/board/flagadm/u-boot.lds index 2fac727b8..fd4e8a50d 100644 --- a/board/flagadm/u-boot.lds +++ b/board/flagadm/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/gen860t/u-boot.lds b/board/gen860t/u-boot.lds index 8e854db22..be99b5120 100644 --- a/board/gen860t/u-boot.lds +++ b/board/gen860t/u-boot.lds @@ -52,13 +52,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/genietv/u-boot.lds b/board/genietv/u-boot.lds index 3e396e4fa..1d66a9b2b 100644 --- a/board/genietv/u-boot.lds +++ b/board/genietv/u-boot.lds @@ -61,13 +61,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/hermes/u-boot.lds b/board/hermes/u-boot.lds index d50c5865b..ca9711575 100644 --- a/board/hermes/u-boot.lds +++ b/board/hermes/u-boot.lds @@ -53,13 +53,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/hymod/u-boot.lds b/board/hymod/u-boot.lds index 1592f4f6e..1efa8b323 100644 --- a/board/hymod/u-boot.lds +++ b/board/hymod/u-boot.lds @@ -93,7 +93,7 @@ SECTIONS      _FIXUP_TABLE_ = .;      *(.fixup)    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/icu862/u-boot.lds b/board/icu862/u-boot.lds index cb5afc113..93c79a64b 100644 --- a/board/icu862/u-boot.lds +++ b/board/icu862/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/ip860/u-boot.lds b/board/ip860/u-boot.lds index 05cc2338a..d0b60cf7c 100644 --- a/board/ip860/u-boot.lds +++ b/board/ip860/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/ivm/u-boot.lds b/board/ivm/u-boot.lds index ff7012afb..1e843eb24 100644 --- a/board/ivm/u-boot.lds +++ b/board/ivm/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/kup/kup4k/u-boot.lds b/board/kup/kup4k/u-boot.lds index 05cc2338a..d0b60cf7c 100644 --- a/board/kup/kup4k/u-boot.lds +++ b/board/kup/kup4k/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/kup/kup4x/u-boot.lds b/board/kup/kup4x/u-boot.lds index 05cc2338a..d0b60cf7c 100644 --- a/board/kup/kup4x/u-boot.lds +++ b/board/kup/kup4x/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/lantec/u-boot.lds b/board/lantec/u-boot.lds index 25e7a4def..de0b355a6 100644 --- a/board/lantec/u-boot.lds +++ b/board/lantec/u-boot.lds @@ -56,13 +56,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/lwmon/u-boot.lds b/board/lwmon/u-boot.lds index d02db17cc..8bf7324f3 100644 --- a/board/lwmon/u-boot.lds +++ b/board/lwmon/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/manroland/uc100/u-boot.lds b/board/manroland/uc100/u-boot.lds index 344cbde3b..731cec9af 100644 --- a/board/manroland/uc100/u-boot.lds +++ b/board/manroland/uc100/u-boot.lds @@ -50,13 +50,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/matrix_vision/mvsmr/u-boot.lds b/board/matrix_vision/mvsmr/u-boot.lds index f3d01e73f..bf2ed0485 100644 --- a/board/matrix_vision/mvsmr/u-boot.lds +++ b/board/matrix_vision/mvsmr/u-boot.lds @@ -55,9 +55,10 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } diff --git a/board/mbx8xx/u-boot.lds b/board/mbx8xx/u-boot.lds index 05cc2338a..d0b60cf7c 100644 --- a/board/mbx8xx/u-boot.lds +++ b/board/mbx8xx/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/ml2/u-boot.lds b/board/ml2/u-boot.lds index 0f2593de8..9f9ddb8bf 100644 --- a/board/ml2/u-boot.lds +++ b/board/ml2/u-boot.lds @@ -44,13 +44,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/mousse/u-boot.lds b/board/mousse/u-boot.lds index ef73e2b53..dae2cfc7d 100644 --- a/board/mousse/u-boot.lds +++ b/board/mousse/u-boot.lds @@ -41,13 +41,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_) >> 2;    .data    : diff --git a/board/mvblue/u-boot.lds b/board/mvblue/u-boot.lds index 03ba15578..11624d21f 100644 --- a/board/mvblue/u-boot.lds +++ b/board/mvblue/u-boot.lds @@ -51,13 +51,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_) >> 2;    .data    : diff --git a/board/netphone/u-boot.lds b/board/netphone/u-boot.lds index b7b6c1aa1..a949e4f59 100644 --- a/board/netphone/u-boot.lds +++ b/board/netphone/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/netta/u-boot.lds b/board/netta/u-boot.lds index b7b6c1aa1..a949e4f59 100644 --- a/board/netta/u-boot.lds +++ b/board/netta/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/netta2/u-boot.lds b/board/netta2/u-boot.lds index b7b6c1aa1..a949e4f59 100644 --- a/board/netta2/u-boot.lds +++ b/board/netta2/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/netvia/u-boot.lds b/board/netvia/u-boot.lds index b7b6c1aa1..a949e4f59 100644 --- a/board/netvia/u-boot.lds +++ b/board/netvia/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/nx823/u-boot.lds b/board/nx823/u-boot.lds index 2fac727b8..fd4e8a50d 100644 --- a/board/nx823/u-boot.lds +++ b/board/nx823/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/quantum/u-boot.lds b/board/quantum/u-boot.lds index 05cc2338a..d0b60cf7c 100644 --- a/board/quantum/u-boot.lds +++ b/board/quantum/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/r360mpi/u-boot.lds b/board/r360mpi/u-boot.lds index 60b3cbfac..2fa085a3d 100644 --- a/board/r360mpi/u-boot.lds +++ b/board/r360mpi/u-boot.lds @@ -49,13 +49,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/rbc823/u-boot.lds b/board/rbc823/u-boot.lds index 7b790ab9f..d943fb6de 100644 --- a/board/rbc823/u-boot.lds +++ b/board/rbc823/u-boot.lds @@ -58,13 +58,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/rmu/u-boot.lds b/board/rmu/u-boot.lds index 05cc2338a..d0b60cf7c 100644 --- a/board/rmu/u-boot.lds +++ b/board/rmu/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/rsdproto/u-boot.lds b/board/rsdproto/u-boot.lds index b36047ad5..81728db25 100644 --- a/board/rsdproto/u-boot.lds +++ b/board/rsdproto/u-boot.lds @@ -80,7 +80,7 @@ SECTIONS      _FIXUP_TABLE_ = .;      *(.fixup)    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/sandpoint/u-boot.lds b/board/sandpoint/u-boot.lds index 841a29b60..e382fd1a1 100644 --- a/board/sandpoint/u-boot.lds +++ b/board/sandpoint/u-boot.lds @@ -49,13 +49,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_) >> 2;    .data    : diff --git a/board/sc3/u-boot.lds b/board/sc3/u-boot.lds index 2cbbca50e..4db46cacf 100644 --- a/board/sc3/u-boot.lds +++ b/board/sc3/u-boot.lds @@ -96,13 +96,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    *(.got)      _GOT2_TABLE_ = .;      *(.got2) +    *(.got) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      *(.fixup)    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/siemens/IAD210/u-boot.lds b/board/siemens/IAD210/u-boot.lds index 725bef829..0e78e4fd4 100644 --- a/board/siemens/IAD210/u-boot.lds +++ b/board/siemens/IAD210/u-boot.lds @@ -56,13 +56,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/sixnet/u-boot.lds b/board/sixnet/u-boot.lds index 2711f2c40..02d198001 100644 --- a/board/sixnet/u-boot.lds +++ b/board/sixnet/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/snmc/qs850/u-boot.lds b/board/snmc/qs850/u-boot.lds index 007ae00f4..9ab248a4e 100644 --- a/board/snmc/qs850/u-boot.lds +++ b/board/snmc/qs850/u-boot.lds @@ -50,13 +50,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/snmc/qs860t/u-boot.lds b/board/snmc/qs860t/u-boot.lds index 05cc2338a..d0b60cf7c 100644 --- a/board/snmc/qs860t/u-boot.lds +++ b/board/snmc/qs860t/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/spc1920/u-boot.lds b/board/spc1920/u-boot.lds index 05cc2338a..d0b60cf7c 100644 --- a/board/spc1920/u-boot.lds +++ b/board/spc1920/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/spd8xx/u-boot.lds b/board/spd8xx/u-boot.lds index 796c283b3..950e1e6e2 100644 --- a/board/spd8xx/u-boot.lds +++ b/board/spd8xx/u-boot.lds @@ -57,13 +57,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/stx/stxxtc/u-boot.lds b/board/stx/stxxtc/u-boot.lds index b7b6c1aa1..a949e4f59 100644 --- a/board/stx/stxxtc/u-boot.lds +++ b/board/stx/stxxtc/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/svm_sc8xx/u-boot.lds b/board/svm_sc8xx/u-boot.lds index c4ce96873..c65f0228c 100644 --- a/board/svm_sc8xx/u-boot.lds +++ b/board/svm_sc8xx/u-boot.lds @@ -63,13 +63,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/tqc/tqm8xx/u-boot.lds b/board/tqc/tqm8xx/u-boot.lds index 83a09b047..f625c3dbd 100644 --- a/board/tqc/tqm8xx/u-boot.lds +++ b/board/tqc/tqm8xx/u-boot.lds @@ -63,13 +63,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/v37/u-boot.lds b/board/v37/u-boot.lds index 578a49b04..e62d53db5 100644 --- a/board/v37/u-boot.lds +++ b/board/v37/u-boot.lds @@ -47,13 +47,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/board/westel/amx860/u-boot.lds b/board/westel/amx860/u-boot.lds index 3514a66d6..3470b437e 100644 --- a/board/westel/amx860/u-boot.lds +++ b/board/westel/amx860/u-boot.lds @@ -56,13 +56,14 @@ SECTIONS    PROVIDE (erotext = .);    .reloc   :    { -    KEEP(*(.got))      _GOT2_TABLE_ = .;      KEEP(*(.got2)) +    KEEP(*(.got)) +    PROVIDE(_GLOBAL_OFFSET_TABLE_ = . + 4);      _FIXUP_TABLE_ = .;      KEEP(*(.fixup))    } -  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;    __fixup_entries = (. - _FIXUP_TABLE_)>>2;    .data    : diff --git a/common/Makefile b/common/Makefile index 5f0c5340a..f81cff93c 100644 --- a/common/Makefile +++ b/common/Makefile @@ -98,6 +98,7 @@ COBJS-$(CONFIG_CMD_FLASH) += cmd_flash.o  ifdef CONFIG_FPGA  COBJS-$(CONFIG_CMD_FPGA) += cmd_fpga.o  endif +COBJS-$(CONFIG_CMD_GPIO) += cmd_gpio.o  COBJS-$(CONFIG_CMD_I2C) += cmd_i2c.o  COBJS-$(CONFIG_CMD_IDE) += cmd_ide.o  COBJS-$(CONFIG_CMD_IMMAP) += cmd_immap.o @@ -110,6 +111,7 @@ COBJS-$(CONFIG_CMD_LICENSE) += cmd_license.o  COBJS-y += cmd_load.o  COBJS-$(CONFIG_LOGBUFFER) += cmd_log.o  COBJS-$(CONFIG_ID_EEPROM) += cmd_mac.o +COBJS-$(CONFIG_CMD_MD5SUM) += cmd_md5sum.o  COBJS-$(CONFIG_CMD_MEMORY) += cmd_mem.o  COBJS-$(CONFIG_CMD_MFSL) += cmd_mfsl.o  COBJS-$(CONFIG_CMD_MG_DISK) += cmd_mgdisk.o @@ -122,6 +124,7 @@ COBJS-$(CONFIG_CMD_MII) += cmd_mdio.o  endif  COBJS-$(CONFIG_CMD_MISC) += cmd_misc.o  COBJS-$(CONFIG_CMD_MMC) += cmd_mmc.o +COBJS-$(CONFIG_CMD_MMC_SPI) += cmd_mmc_spi.o  COBJS-$(CONFIG_MP) += cmd_mp.o  COBJS-$(CONFIG_CMD_MTDPARTS) += cmd_mtdparts.o  COBJS-$(CONFIG_CMD_NAND) += cmd_nand.o @@ -138,6 +141,7 @@ COBJS-$(CONFIG_CMD_REISER) += cmd_reiser.o  COBJS-$(CONFIG_CMD_SATA) += cmd_sata.o  COBJS-$(CONFIG_CMD_SF) += cmd_sf.o  COBJS-$(CONFIG_CMD_SCSI) += cmd_scsi.o +COBJS-$(CONFIG_CMD_SHA1SUM) += cmd_sha1sum.o  COBJS-$(CONFIG_CMD_SETEXPR) += cmd_setexpr.o  COBJS-$(CONFIG_CMD_SPI) += cmd_spi.o  COBJS-$(CONFIG_CMD_SPIBOOTLDR) += cmd_spibootldr.o @@ -148,6 +152,7 @@ COBJS-$(CONFIG_CMD_TSI148) += cmd_tsi148.o  COBJS-$(CONFIG_CMD_UBI) += cmd_ubi.o  COBJS-$(CONFIG_CMD_UBIFS) += cmd_ubifs.o  COBJS-$(CONFIG_CMD_UNIVERSE) += cmd_universe.o +COBJS-$(CONFIG_CMD_UNZIP) += cmd_unzip.o  ifdef CONFIG_CMD_USB  COBJS-y += cmd_usb.o  COBJS-y += usb.o diff --git a/common/cmd_boot.c b/common/cmd_boot.c index 7b603d350..0afd93964 100644 --- a/common/cmd_boot.c +++ b/common/cmd_boot.c @@ -28,6 +28,8 @@  #include <command.h>  #include <net.h> +#ifdef CONFIG_CMD_GO +  /* Allow ports to override the default behavior */  __attribute__((weak))  unsigned long do_go_exec (ulong (*entry)(int, char * const []), int argc, char * const argv[]) @@ -67,6 +69,8 @@ U_BOOT_CMD(  	"      passing 'arg' as arguments"  ); +#endif +  U_BOOT_CMD(  	reset, 1, 0,	do_reset,  	"Perform RESET of the CPU", diff --git a/common/cmd_gpio.c b/common/cmd_gpio.c new file mode 100644 index 000000000..9cc790aba --- /dev/null +++ b/common/cmd_gpio.c @@ -0,0 +1,89 @@ +/* + * Control GPIO pins on the fly + * + * Copyright (c) 2008-2011 Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#include <common.h> +#include <command.h> + +#include <asm/gpio.h> + +#ifndef name_to_gpio +#define name_to_gpio(name) simple_strtoul(name, NULL, 10) +#endif + +enum gpio_cmd { +	GPIO_INPUT, +	GPIO_SET, +	GPIO_CLEAR, +	GPIO_TOGGLE, +}; + +static int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	int gpio; +	enum gpio_cmd sub_cmd; +	ulong value; +	const char *str_cmd, *str_gpio; + +#ifdef gpio_status +	if (argc == 2 && !strcmp(argv[1], "status")) { +		gpio_status(); +		return 0; +	} +#endif + +	if (argc != 3) + show_usage: +		return cmd_usage(cmdtp); +	str_cmd = argv[1]; +	str_gpio = argv[2]; + +	/* parse the behavior */ +	switch (*str_cmd) { +		case 'i': sub_cmd = GPIO_INPUT;  break; +		case 's': sub_cmd = GPIO_SET;    break; +		case 'c': sub_cmd = GPIO_CLEAR;  break; +		case 't': sub_cmd = GPIO_TOGGLE; break; +		default:  goto show_usage; +	} + +	/* turn the gpio name into a gpio number */ +	gpio = name_to_gpio(str_gpio); +	if (gpio < 0) +		goto show_usage; + +	/* grab the pin before we tweak it */ +	if (gpio_request(gpio, "cmd_gpio")) { +		printf("gpio: requesting pin %u failed\n", gpio); +		return -1; +	} + +	/* finally, let's do it: set direction and exec command */ +	if (sub_cmd == GPIO_INPUT) { +		gpio_direction_input(gpio); +		value = gpio_get_value(gpio); +	} else { +		switch (sub_cmd) { +			case GPIO_SET:    value = 1; break; +			case GPIO_CLEAR:  value = 0; break; +			case GPIO_TOGGLE: value = !gpio_get_value(gpio); break; +			default:          goto show_usage; +		} +		gpio_direction_output(gpio, value); +	} +	printf("gpio: pin %s (gpio %i) value is %lu\n", +		str_gpio, gpio, value); + +	gpio_free(gpio); + +	return value; +} + +U_BOOT_CMD(gpio, 3, 0, do_gpio, +	"input/set/clear/toggle gpio pins", +	"<input|set|clear|toggle> <pin>\n" +	"    - input/set/clear/toggle the specified pin"); diff --git a/common/cmd_md5sum.c b/common/cmd_md5sum.c new file mode 100644 index 000000000..d6ebb802d --- /dev/null +++ b/common/cmd_md5sum.c @@ -0,0 +1,53 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * 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 <command.h> +#include <u-boot/md5.h> + +static int do_md5sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	unsigned long addr, len; +	unsigned int i; +	u8 output[16]; + +	if (argc < 3) +		return cmd_usage(cmdtp); + +	addr = simple_strtoul(argv[1], NULL, 16); +	len = simple_strtoul(argv[2], NULL, 16); + +	md5((unsigned char *) addr, len, output); +	printf("md5 for %08lx ... %08lx ==> ", addr, addr + len - 1); +	for (i = 0; i < 16; i++) +		printf("%02x", output[i]); +	printf("\n"); + +	return 0; +} + +U_BOOT_CMD( +	md5sum,	3,	1,	do_md5sum, +	"compute MD5 message digest", +	"address count" +); diff --git a/common/cmd_mem.c b/common/cmd_mem.c index 4b524cfc1..a5576aaab 100644 --- a/common/cmd_mem.c +++ b/common/cmd_mem.c @@ -34,9 +34,6 @@  #endif  #include <watchdog.h> -#include <u-boot/md5.h> -#include <sha1.h> -  #ifdef	CMD_MEM_DEBUG  #define	PRINTF(fmt,args...)	printf (fmt ,##args)  #else @@ -1077,6 +1074,8 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])  	return 0;  } +#ifdef CONFIG_CMD_CRC32 +  #ifndef CONFIG_CRC32_VERIFY  int do_mem_crc (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) @@ -1161,83 +1160,8 @@ usage:  }  #endif	/* CONFIG_CRC32_VERIFY */ -#ifdef CONFIG_CMD_MD5SUM -int do_md5sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ -	unsigned long addr, len; -	unsigned int i; -	u8 output[16]; - -	if (argc < 3) -		return cmd_usage(cmdtp); - -	addr = simple_strtoul(argv[1], NULL, 16); -	len = simple_strtoul(argv[2], NULL, 16); - -	md5((unsigned char *) addr, len, output); -	printf("md5 for %08lx ... %08lx ==> ", addr, addr + len - 1); -	for (i = 0; i < 16; i++) -		printf("%02x", output[i]); -	printf("\n"); - -	return 0; -}  #endif -#ifdef CONFIG_CMD_SHA1SUM -int do_sha1sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ -	unsigned long addr, len; -	unsigned int i; -	u8 output[20]; - -	if (argc < 3) -		return cmd_usage(cmdtp); - -	addr = simple_strtoul(argv[1], NULL, 16); -	len = simple_strtoul(argv[2], NULL, 16); - -	sha1_csum((unsigned char *) addr, len, output); -	printf("SHA1 for %08lx ... %08lx ==> ", addr, addr + len - 1); -	for (i = 0; i < 20; i++) -		printf("%02x", output[i]); -	printf("\n"); - -	return 0; -} -#endif - -#ifdef CONFIG_CMD_UNZIP -int do_unzip ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ -	unsigned long src, dst; -	unsigned long src_len = ~0UL, dst_len = ~0UL; -	char buf[32]; - -	switch (argc) { -		case 4: -			dst_len = simple_strtoul(argv[3], NULL, 16); -			/* fall through */ -		case 3: -			src = simple_strtoul(argv[1], NULL, 16); -			dst = simple_strtoul(argv[2], NULL, 16); -			break; -		default: -			return cmd_usage(cmdtp); -	} - -	if (gunzip((void *) dst, dst_len, (void *) src, &src_len) != 0) -		return 1; - -	printf("Uncompressed size: %ld = 0x%lX\n", src_len, src_len); -	sprintf(buf, "%lX", src_len); -	setenv("filesize", buf); - -	return 0; -} -#endif /* CONFIG_CMD_UNZIP */ - -  /**************************************************/  U_BOOT_CMD(  	md,	3,	1,	do_mem_md, @@ -1277,6 +1201,8 @@ U_BOOT_CMD(  	"[.b, .w, .l] addr1 addr2 count"  ); +#ifdef CONFIG_CMD_CRC32 +  #ifndef CONFIG_CRC32_VERIFY  U_BOOT_CMD( @@ -1296,6 +1222,8 @@ U_BOOT_CMD(  #endif	/* CONFIG_CRC32_VERIFY */ +#endif +  U_BOOT_CMD(  	base,	2,	1,	do_mem_base,  	"print or set address offset", @@ -1336,27 +1264,3 @@ U_BOOT_CMD(  	"[.b, .w, .l] address value delay(ms)"  );  #endif /* CONFIG_MX_CYCLIC */ - -#ifdef CONFIG_CMD_MD5SUM -U_BOOT_CMD( -	md5sum,	3,	1,	do_md5sum, -	"compute MD5 message digest", -	"address count" -); -#endif - -#ifdef CONFIG_CMD_SHA1SUM -U_BOOT_CMD( -	sha1sum,	3,	1,	do_sha1sum, -	"compute SHA1 message digest", -	"address count" -); -#endif /* CONFIG_CMD_SHA1SUM */ - -#ifdef CONFIG_CMD_UNZIP -U_BOOT_CMD( -	unzip,	4,	1,	do_unzip, -	"unzip a memory region", -	"srcaddr dstaddr [dstsize]" -); -#endif /* CONFIG_CMD_UNZIP */ diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c index 4323f76b3..6166749ad 100644 --- a/common/cmd_mmc.c +++ b/common/cmd_mmc.c @@ -104,7 +104,8 @@ static void print_mmcinfo(struct mmc *mmc)  			(mmc->version >> 4) & 0xf, mmc->version & 0xf);  	printf("High Capacity: %s\n", mmc->high_capacity ? "Yes" : "No"); -	printf("Capacity: %lld\n", mmc->capacity); +	puts("Capacity: "); +	print_size(mmc->capacity, "\n");  	printf("Bus Width: %d-bit\n", mmc->bus_width);  } diff --git a/common/cmd_mmc_spi.c b/common/cmd_mmc_spi.c new file mode 100644 index 000000000..63fe31337 --- /dev/null +++ b/common/cmd_mmc_spi.c @@ -0,0 +1,88 @@ +/* + * Command for mmc_spi setup. + * + * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw> + * Licensed under the GPL-2 or later. + */ + +#include <common.h> +#include <mmc.h> +#include <spi.h> + +#ifndef CONFIG_MMC_SPI_BUS +# define CONFIG_MMC_SPI_BUS 0 +#endif +#ifndef CONFIG_MMC_SPI_CS +# define CONFIG_MMC_SPI_CS 1 +#endif +/* in SPI mode, MMC speed limit is 20MHz, while SD speed limit is 25MHz */ +#ifndef CONFIG_MMC_SPI_SPEED +# define CONFIG_MMC_SPI_SPEED 25000000 +#endif +/* MMC and SD specs only seem to care that sampling is on the + * rising edge ... meaning SPI modes 0 or 3.  So either SPI mode + * should be legit.  We'll use mode 0 since the steady state is 0, + * which is appropriate for hotplugging, unless the platform data + * specify mode 3 (if hardware is not compatible to mode 0). + */ +#ifndef CONFIG_MMC_SPI_MODE +# define CONFIG_MMC_SPI_MODE SPI_MODE_0 +#endif + +static int do_mmc_spi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	uint bus = CONFIG_MMC_SPI_BUS; +	uint cs = CONFIG_MMC_SPI_CS; +	uint speed = CONFIG_MMC_SPI_SPEED; +	uint mode = CONFIG_MMC_SPI_MODE; +	char *endp; +	struct mmc *mmc; + +	if (argc < 2) +		goto usage; + +	cs = simple_strtoul(argv[1], &endp, 0); +	if (*argv[1] == 0 || (*endp != 0 && *endp != ':')) +		goto usage; +	if (*endp == ':') { +		if (endp[1] == 0) +			goto usage; +		bus = cs; +		cs = simple_strtoul(endp + 1, &endp, 0); +		if (*endp != 0) +			goto usage; +	} +	if (argc >= 3) { +		speed = simple_strtoul(argv[2], &endp, 0); +		if (*argv[2] == 0 || *endp != 0) +			goto usage; +	} +	if (argc >= 4) { +		mode = simple_strtoul(argv[3], &endp, 16); +		if (*argv[3] == 0 || *endp != 0) +			goto usage; +	} +	if (!spi_cs_is_valid(bus, cs)) { +		printf("Invalid SPI bus %u cs %u\n", bus, cs); +		return 1; +	} + +	mmc = mmc_spi_init(bus, cs, speed, mode); +	if (!mmc) { +		printf("Failed to create MMC Device\n"); +		return 1; +	} +	printf("%s: %d at %u:%u hz %u mode %u\n", mmc->name, mmc->block_dev.dev, +	       bus, cs, speed, mode); +	return 0; + +usage: +	cmd_usage(cmdtp); +	return 1; +} + +U_BOOT_CMD( +	mmc_spi,	4,	0,	do_mmc_spi, +	"mmc_spi setup", +	"[bus:]cs [hz] [mode]	- setup mmc_spi device" +); diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index 6d8512aec..204a0945e 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -559,6 +559,7 @@ static int do_env_delete(cmd_tbl_t * cmdtp, int flag, int argc, char * const arg  	return 0;  } +#ifdef CONFIG_CMD_EXPORTENV  /*   * env export [-t | -b | -c] addr [size]   *	-t:	export as text format; if size is given, data will be @@ -695,7 +696,9 @@ sep_err:  		cmd);  	return 1;  } +#endif +#ifdef CONFIG_CMD_IMPORTENV  /*   * env import [-d] [-t | -b | -c] addr [size]   *	-d:	delete existing environment before importing; @@ -805,6 +808,7 @@ sep_err:  		cmd);  	return 1;  } +#endif  #if defined(CONFIG_CMD_RUN)  extern int do_run (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); @@ -822,8 +826,12 @@ static cmd_tbl_t cmd_env_sub[] = {  #if defined(CONFIG_CMD_EDITENV)  	U_BOOT_CMD_MKENT(edit, 2, 0, do_env_edit, "", ""),  #endif +#if defined(CONFIG_CMD_EXPORTENV)  	U_BOOT_CMD_MKENT(export, 4, 0, do_env_export, "", ""), +#endif +#if defined(CONFIG_CMD_IMPORTENV)  	U_BOOT_CMD_MKENT(import, 5, 0, do_env_import, "", ""), +#endif  	U_BOOT_CMD_MKENT(print, CONFIG_SYS_MAXARGS, 1, do_env_print, "", ""),  #if defined(CONFIG_CMD_RUN)  	U_BOOT_CMD_MKENT(run, CONFIG_SYS_MAXARGS, 1, do_run, "", ""), diff --git a/common/cmd_sha1sum.c b/common/cmd_sha1sum.c new file mode 100644 index 000000000..bb3cff01f --- /dev/null +++ b/common/cmd_sha1sum.c @@ -0,0 +1,53 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * 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 <command.h> +#include <sha1.h> + +static int do_sha1sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	unsigned long addr, len; +	unsigned int i; +	u8 output[20]; + +	if (argc < 3) +		return cmd_usage(cmdtp); + +	addr = simple_strtoul(argv[1], NULL, 16); +	len = simple_strtoul(argv[2], NULL, 16); + +	sha1_csum((unsigned char *) addr, len, output); +	printf("SHA1 for %08lx ... %08lx ==> ", addr, addr + len - 1); +	for (i = 0; i < 20; i++) +		printf("%02x", output[i]); +	printf("\n"); + +	return 0; +} + +U_BOOT_CMD( +	sha1sum,	3,	1,	do_sha1sum, +	"compute SHA1 message digest", +	"address count" +); diff --git a/common/cmd_unzip.c b/common/cmd_unzip.c new file mode 100644 index 000000000..6483b9267 --- /dev/null +++ b/common/cmd_unzip.c @@ -0,0 +1,59 @@ +/* + * (C) Copyright 2000 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * 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 <command.h> + +static int do_unzip(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	unsigned long src, dst; +	unsigned long src_len = ~0UL, dst_len = ~0UL; +	char buf[32]; + +	switch (argc) { +		case 4: +			dst_len = simple_strtoul(argv[3], NULL, 16); +			/* fall through */ +		case 3: +			src = simple_strtoul(argv[1], NULL, 16); +			dst = simple_strtoul(argv[2], NULL, 16); +			break; +		default: +			return cmd_usage(cmdtp); +	} + +	if (gunzip((void *) dst, dst_len, (void *) src, &src_len) != 0) +		return 1; + +	printf("Uncompressed size: %ld = 0x%lX\n", src_len, src_len); +	sprintf(buf, "%lX", src_len); +	setenv("filesize", buf); + +	return 0; +} + +U_BOOT_CMD( +	unzip,	4,	1,	do_unzip, +	"unzip a memory region", +	"srcaddr dstaddr [dstsize]" +); diff --git a/common/fdt_support.c b/common/fdt_support.c index 6c98e5b07..edcf04a21 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -394,7 +394,7 @@ int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)  {  	int err, nodeoffset;  	int addr_cell_len, size_cell_len, len; -	u8 tmp[banks * 8]; +	u8 tmp[banks * 16]; /* Up to 64-bit address + 64-bit size */  	int bank;  	err = fdt_check_header(blob); diff --git a/drivers/i2c/omap24xx_i2c.c b/drivers/i2c/omap24xx_i2c.c index 215be3419..71251d800 100644 --- a/drivers/i2c/omap24xx_i2c.c +++ b/drivers/i2c/omap24xx_i2c.c @@ -321,43 +321,23 @@ int i2c_probe (uchar chip)  	/* wait until bus not busy */  	wait_for_bb (); -	/* try to read one byte */ +	/* try to write one byte */  	writew (1, &i2c_base->cnt);  	/* set slave address */  	writew (chip, &i2c_base->sa);  	/* stop bit needed here */ -	writew (I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_STP, &i2c_base->con); +	writew(I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_TRX | +	       I2C_CON_STP, &i2c_base->con); -	while (1) { -		status = wait_for_pin(); -		if (status == 0 || status & I2C_STAT_AL) { -			res = 1; -			goto probe_exit; -		} -		if (status & I2C_STAT_NACK) { -			res = 1; -			writew(0xff, &i2c_base->stat); -			writew (readw (&i2c_base->con) | I2C_CON_STP, &i2c_base->con); -			wait_for_bb (); -			break; -		} -		if (status & I2C_STAT_ARDY) { -			writew(I2C_STAT_ARDY, &i2c_base->stat); -			break; -		} -		if (status & I2C_STAT_RRDY) { -			res = 0; -#if defined(CONFIG_OMAP243X) || defined(CONFIG_OMAP34XX) || \ -    defined(CONFIG_OMAP44XX) -			readb(&i2c_base->data); -#else -			readw(&i2c_base->data); -#endif -			writew(I2C_STAT_RRDY, &i2c_base->stat); -		} -	} +	status = wait_for_pin(); + +	/* check for ACK (!NAK) */ +	if (!(status & I2C_STAT_NACK)) +		res = 0; + +	/* abort transfer (force idle state) */ +	writew(0, &i2c_base->con); -probe_exit:  	flush_fifo();  	writew (0, &i2c_base->cnt); /* don't allow any more data in...we don't want it.*/  	writew(0xFFFF, &i2c_base->stat); diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile index 3496f0aa0..9aca3a2bd 100644 --- a/drivers/mmc/Makefile +++ b/drivers/mmc/Makefile @@ -31,6 +31,7 @@ COBJS-$(CONFIG_DAVINCI_MMC) += davinci_mmc.o  COBJS-$(CONFIG_FSL_ESDHC) += fsl_esdhc.o  COBJS-$(CONFIG_GENERIC_MMC) += mmc.o  COBJS-$(CONFIG_GENERIC_ATMEL_MCI) += gen_atmel_mci.o +COBJS-$(CONFIG_MMC_SPI) += mmc_spi.o  COBJS-$(CONFIG_MXC_MMC) += mxcmmc.o  COBJS-$(CONFIG_OMAP3_MMC) += omap3_mmc.o  COBJS-$(CONFIG_OMAP_HSMMC) += omap_hsmmc.o diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c index 4f1b5150c..2838795fe 100644 --- a/drivers/mmc/fsl_esdhc.c +++ b/drivers/mmc/fsl_esdhc.c @@ -332,11 +332,11 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)  		do {  			irqstat = esdhc_read32(®s->irqstat); -			if (irqstat & DATA_ERR) -				return COMM_ERR; -  			if (irqstat & IRQSTAT_DTOE)  				return TIMEOUT; + +			if (irqstat & DATA_ERR) +				return COMM_ERR;  		} while (!(irqstat & IRQSTAT_TC) &&  				(esdhc_read32(®s->prsstat) & PRSSTAT_DLA));  #endif diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 6805b33f7..f27b7c79e 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -30,9 +30,13 @@  #include <part.h>  #include <malloc.h>  #include <linux/list.h> -#include <mmc.h>  #include <div64.h> +/* Set block count limit because of 16 bit register limit on some hardware*/ +#ifndef CONFIG_SYS_MMC_MAX_BLK_COUNT +#define CONFIG_SYS_MMC_MAX_BLK_COUNT 65535 +#endif +  static struct list_head mmc_devices;  static int cur_dev_num = -1; @@ -45,7 +49,100 @@ int board_mmc_getcd(u8 *cd, struct mmc *mmc)__attribute__((weak,  int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)  { +#ifdef CONFIG_MMC_TRACE +	int ret; +	int i; +	u8 *ptr; + +	printf("CMD_SEND:%d\n", cmd->cmdidx); +	printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg); +	printf("\t\tFLAG\t\t\t %d\n", cmd->flags); +	ret = mmc->send_cmd(mmc, cmd, data); +	switch (cmd->resp_type) { +		case MMC_RSP_NONE: +			printf("\t\tMMC_RSP_NONE\n"); +			break; +		case MMC_RSP_R1: +			printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n", +				cmd->response[0]); +			break; +		case MMC_RSP_R1b: +			printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n", +				cmd->response[0]); +			break; +		case MMC_RSP_R2: +			printf("\t\tMMC_RSP_R2\t\t 0x%08X \n", +				cmd->response[0]); +			printf("\t\t          \t\t 0x%08X \n", +				cmd->response[1]); +			printf("\t\t          \t\t 0x%08X \n", +				cmd->response[2]); +			printf("\t\t          \t\t 0x%08X \n", +				cmd->response[3]); +			printf("\n"); +			printf("\t\t\t\t\tDUMPING DATA\n"); +			for (i = 0; i < 4; i++) { +				int j; +				printf("\t\t\t\t\t%03d - ", i*4); +				ptr = &cmd->response[i]; +				ptr += 3; +				for (j = 0; j < 4; j++) +					printf("%02X ", *ptr--); +				printf("\n"); +			} +			break; +		case MMC_RSP_R3: +			printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n", +				cmd->response[0]); +			break; +		default: +			printf("\t\tERROR MMC rsp not supported\n"); +			break; +	} +	return ret; +#else  	return mmc->send_cmd(mmc, cmd, data); +#endif +} + +int mmc_send_status(struct mmc *mmc, int timeout) +{ +	struct mmc_cmd cmd; +	int err; +#ifdef CONFIG_MMC_TRACE +	int status; +#endif + +	cmd.cmdidx = MMC_CMD_SEND_STATUS; +	cmd.resp_type = MMC_RSP_R1; +	cmd.cmdarg = 0; +	cmd.flags = 0; + +	do { +		err = mmc_send_cmd(mmc, &cmd, NULL); +		if (err) +			return err; +		else if (cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) +			break; + +		udelay(1000); + +		if (cmd.response[0] & MMC_STATUS_MASK) { +			printf("Status Error: 0x%08X\n", cmd.response[0]); +			return COMM_ERR; +		} +	} while (timeout--); + +#ifdef CONFIG_MMC_TRACE +	status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9; +	printf("CURR STATE:%d\n", status); +#endif +	if (!timeout) { +		printf("Timeout waiting card ready\n"); +		return TIMEOUT; +	} + +	return 0;  }  int mmc_set_blocklen(struct mmc *mmc, int len) @@ -82,6 +179,7 @@ mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)  {  	struct mmc_cmd cmd;  	struct mmc_data data; +	int timeout = 1000;  	if ((start + blkcnt) > mmc->block_dev.lba) {  		printf("MMC: block number 0x%lx exceeds max(0x%lx)\n", @@ -112,7 +210,10 @@ mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)  		return 0;  	} -	if (blkcnt > 1) { +	/* SPI multiblock writes terminate using a special +	 * token, not a STOP_TRANSMISSION request. +	 */ +	if (!mmc_host_is_spi(mmc) && blkcnt > 1) {  		cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;  		cmd.cmdarg = 0;  		cmd.resp_type = MMC_RSP_R1b; @@ -121,6 +222,9 @@ mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)  			printf("mmc fail to send stop cmd\n");  			return 0;  		} + +		/* Waiting for the ready status */ +		mmc_send_status(mmc, timeout);  	}  	return blkcnt; @@ -139,11 +243,8 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)  		return 0;  	do { -		/* -		 * The 65535 constraint comes from some hardware has -		 * only 16 bit width block number counter -		 */ -		cur = (blocks_todo > 65535) ? 65535 : blocks_todo; +		cur = (blocks_todo > CONFIG_SYS_MMC_MAX_BLK_COUNT) ? +		       CONFIG_SYS_MMC_MAX_BLK_COUNT : blocks_todo;  		if(mmc_write_blocks(mmc, start, cur, src) != cur)  			return 0;  		blocks_todo -= cur; @@ -158,6 +259,7 @@ int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)  {  	struct mmc_cmd cmd;  	struct mmc_data data; +	int timeout = 1000;  	if (blkcnt > 1)  		cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK; @@ -189,6 +291,9 @@ int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)  			printf("mmc fail to send stop cmd\n");  			return 0;  		} + +		/* Waiting for the ready status */ +		mmc_send_status(mmc, timeout);  	}  	return blkcnt; @@ -215,11 +320,8 @@ static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst)  		return 0;  	do { -		/* -		 * The 65535 constraint comes from some hardware has -		 * only 16 bit width block number counter -		 */ -		cur = (blocks_todo > 65535) ? 65535 : blocks_todo; +		cur = (blocks_todo > CONFIG_SYS_MMC_MAX_BLK_COUNT) ? +		       CONFIG_SYS_MMC_MAX_BLK_COUNT : blocks_todo;  		if(mmc_read_blocks(mmc, dst, start, cur) != cur)  			return 0;  		blocks_todo -= cur; @@ -280,7 +382,8 @@ sd_send_op_cond(struct mmc *mmc)  		 * how to manage low voltages SD card is not yet  		 * specified.  		 */ -		cmd.cmdarg = mmc->voltages & 0xff8000; +		cmd.cmdarg = mmc_host_is_spi(mmc) ? 0 : +			(mmc->voltages & 0xff8000);  		if (mmc->version == SD_VERSION_2)  			cmd.cmdarg |= OCR_HCS; @@ -299,6 +402,18 @@ sd_send_op_cond(struct mmc *mmc)  	if (mmc->version != SD_VERSION_2)  		mmc->version = SD_VERSION_1_0; +	if (mmc_host_is_spi(mmc)) { /* read OCR for spi */ +		cmd.cmdidx = MMC_CMD_SPI_READ_OCR; +		cmd.resp_type = MMC_RSP_R3; +		cmd.cmdarg = 0; +		cmd.flags = 0; + +		err = mmc_send_cmd(mmc, &cmd, NULL); + +		if (err) +			return err; +	} +  	mmc->ocr = cmd.response[0];  	mmc->high_capacity = ((mmc->ocr & OCR_HCS) == OCR_HCS); @@ -309,17 +424,33 @@ sd_send_op_cond(struct mmc *mmc)  int mmc_send_op_cond(struct mmc *mmc)  { -	int timeout = 1000; +	int timeout = 10000;  	struct mmc_cmd cmd;  	int err;  	/* Some cards seem to need this */  	mmc_go_idle(mmc); + 	/* Asking to the card its capabilities */ + 	cmd.cmdidx = MMC_CMD_SEND_OP_COND; + 	cmd.resp_type = MMC_RSP_R3; + 	cmd.cmdarg = 0; + 	cmd.flags = 0; +  + 	err = mmc_send_cmd(mmc, &cmd, NULL); +  + 	if (err) + 		return err; +  + 	udelay(1000); +   	do {  		cmd.cmdidx = MMC_CMD_SEND_OP_COND;  		cmd.resp_type = MMC_RSP_R3; -		cmd.cmdarg = OCR_HCS | mmc->voltages; +		cmd.cmdarg = (mmc_host_is_spi(mmc) ? 0 : +				(mmc->voltages & +				(cmd.response[0] & OCR_VOLTAGE_MASK)) | +				(cmd.response[0] & OCR_ACCESS_MODE));  		cmd.flags = 0;  		err = mmc_send_cmd(mmc, &cmd, NULL); @@ -333,6 +464,18 @@ int mmc_send_op_cond(struct mmc *mmc)  	if (timeout <= 0)  		return UNUSABLE_ERR; +	if (mmc_host_is_spi(mmc)) { /* read OCR for spi */ +		cmd.cmdidx = MMC_CMD_SPI_READ_OCR; +		cmd.resp_type = MMC_RSP_R3; +		cmd.cmdarg = 0; +		cmd.flags = 0; + +		err = mmc_send_cmd(mmc, &cmd, NULL); + +		if (err) +			return err; +	} +  	mmc->version = MMC_VERSION_UNKNOWN;  	mmc->ocr = cmd.response[0]; @@ -369,15 +512,23 @@ int mmc_send_ext_csd(struct mmc *mmc, char *ext_csd)  int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)  {  	struct mmc_cmd cmd; +	int timeout = 1000; +	int ret;  	cmd.cmdidx = MMC_CMD_SWITCH;  	cmd.resp_type = MMC_RSP_R1b;  	cmd.cmdarg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | -		(index << 16) | -		(value << 8); +				 (index << 16) | +				 (value << 8);  	cmd.flags = 0; -	return mmc_send_cmd(mmc, &cmd, NULL); +	ret = mmc_send_cmd(mmc, &cmd, NULL); + +	/* Waiting for the ready status */ +	mmc_send_status(mmc, timeout); + +	return ret; +  }  int mmc_change_freq(struct mmc *mmc) @@ -388,6 +539,9 @@ int mmc_change_freq(struct mmc *mmc)  	mmc->card_caps = 0; +	if (mmc_host_is_spi(mmc)) +		return 0; +  	/* Only version 4 supports high-speed */  	if (mmc->version < MMC_VERSION_4)  		return 0; @@ -399,9 +553,6 @@ int mmc_change_freq(struct mmc *mmc)  	if (err)  		return err; -	if (ext_csd[212] || ext_csd[213] || ext_csd[214] || ext_csd[215]) -		mmc->high_capacity = 1; -  	cardtype = ext_csd[196] & 0xf;  	err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1); @@ -461,6 +612,9 @@ int sd_change_freq(struct mmc *mmc)  	mmc->card_caps = 0; +	if (mmc_host_is_spi(mmc)) +		return 0; +  	/* Read the SCR to find out if this card supports higher speeds */  	cmd.cmdidx = MMC_CMD_APP_CMD;  	cmd.resp_type = MMC_RSP_R1; @@ -512,6 +666,9 @@ retry_scr:  			break;  	} +	if (mmc->scr[0] & SD_DATA_4BIT) +		mmc->card_caps |= MMC_MODE_4BIT; +  	/* Version 1.0 doesn't support switching */  	if (mmc->version == SD_VERSION_1_0)  		return 0; @@ -529,9 +686,6 @@ retry_scr:  			break;  	} -	if (mmc->scr[0] & SD_DATA_4BIT) -		mmc->card_caps |= MMC_MODE_4BIT; -  	/* If high-speed isn't supported, we return */  	if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))  		return 0; @@ -549,7 +703,7 @@ retry_scr:  /* frequency bases */  /* divided by 10 to be nice to platforms without floating point */ -int fbase[] = { +static const int fbase[] = {  	10000,  	100000,  	1000000, @@ -559,7 +713,7 @@ int fbase[] = {  /* Multiplier values for TRAN_SPEED.  Multiplied by 10 to be nice   * to platforms without floating point.   */ -int multipliers[] = { +static const int multipliers[] = {  	0,	/* reserved */  	10,  	12, @@ -610,9 +764,24 @@ int mmc_startup(struct mmc *mmc)  	u64 cmult, csize;  	struct mmc_cmd cmd;  	char ext_csd[512]; +	int timeout = 1000; + +#ifdef CONFIG_MMC_SPI_CRC_ON +	if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */ +		cmd.cmdidx = MMC_CMD_SPI_CRC_ON_OFF; +		cmd.resp_type = MMC_RSP_R1; +		cmd.cmdarg = 1; +		cmd.flags = 0; +		err = mmc_send_cmd(mmc, &cmd, NULL); + +		if (err) +			return err; +	} +#endif  	/* Put the Card in Identify Mode */ -	cmd.cmdidx = MMC_CMD_ALL_SEND_CID; +	cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID : +		MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */  	cmd.resp_type = MMC_RSP_R2;  	cmd.cmdarg = 0;  	cmd.flags = 0; @@ -629,18 +798,20 @@ int mmc_startup(struct mmc *mmc)  	 * For SD cards, get the Relatvie Address.  	 * This also puts the cards into Standby State  	 */ -	cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR; -	cmd.cmdarg = mmc->rca << 16; -	cmd.resp_type = MMC_RSP_R6; -	cmd.flags = 0; +	if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */ +		cmd.cmdidx = SD_CMD_SEND_RELATIVE_ADDR; +		cmd.cmdarg = mmc->rca << 16; +		cmd.resp_type = MMC_RSP_R6; +		cmd.flags = 0; -	err = mmc_send_cmd(mmc, &cmd, NULL); +		err = mmc_send_cmd(mmc, &cmd, NULL); -	if (err) -		return err; +		if (err) +			return err; -	if (IS_SD(mmc)) -		mmc->rca = (cmd.response[0] >> 16) & 0xffff; +		if (IS_SD(mmc)) +			mmc->rca = (cmd.response[0] >> 16) & 0xffff; +	}  	/* Get the Card-Specific Data */  	cmd.cmdidx = MMC_CMD_SEND_CSD; @@ -650,6 +821,9 @@ int mmc_startup(struct mmc *mmc)  	err = mmc_send_cmd(mmc, &cmd, NULL); +	/* Waiting for the ready status */ +	mmc_send_status(mmc, timeout); +  	if (err)  		return err; @@ -716,14 +890,16 @@ int mmc_startup(struct mmc *mmc)  		mmc->write_bl_len = 512;  	/* Select the card, and put it into Transfer Mode */ -	cmd.cmdidx = MMC_CMD_SELECT_CARD; -	cmd.resp_type = MMC_RSP_R1b; -	cmd.cmdarg = mmc->rca << 16; -	cmd.flags = 0; -	err = mmc_send_cmd(mmc, &cmd, NULL); +	if (!mmc_host_is_spi(mmc)) { /* cmd not supported in spi */ +		cmd.cmdidx = MMC_CMD_SELECT_CARD; +		cmd.resp_type = MMC_RSP_R1b; +		cmd.cmdarg = mmc->rca << 16; +		cmd.flags = 0; +		err = mmc_send_cmd(mmc, &cmd, NULL); -	if (err) -		return err; +		if (err) +			return err; +	}  	if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {  		/* check  ext_csd version and capacity */ diff --git a/drivers/mmc/mmc_spi.c b/drivers/mmc/mmc_spi.c new file mode 100644 index 000000000..dc7574cbe --- /dev/null +++ b/drivers/mmc/mmc_spi.c @@ -0,0 +1,280 @@ +/* + * generic mmc spi driver + * + * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw> + * Licensed under the GPL-2 or later. + */ +#include <common.h> +#include <malloc.h> +#include <part.h> +#include <mmc.h> +#include <spi.h> +#include <crc.h> +#include <linux/crc7.h> +#include <linux/byteorder/swab.h> + +/* MMC/SD in SPI mode reports R1 status always */ +#define R1_SPI_IDLE		(1 << 0) +#define R1_SPI_ERASE_RESET	(1 << 1) +#define R1_SPI_ILLEGAL_COMMAND	(1 << 2) +#define R1_SPI_COM_CRC		(1 << 3) +#define R1_SPI_ERASE_SEQ	(1 << 4) +#define R1_SPI_ADDRESS		(1 << 5) +#define R1_SPI_PARAMETER	(1 << 6) +/* R1 bit 7 is always zero, reuse this bit for error */ +#define R1_SPI_ERROR		(1 << 7) + +/* Response tokens used to ack each block written: */ +#define SPI_MMC_RESPONSE_CODE(x)	((x) & 0x1f) +#define SPI_RESPONSE_ACCEPTED		((2 << 1)|1) +#define SPI_RESPONSE_CRC_ERR		((5 << 1)|1) +#define SPI_RESPONSE_WRITE_ERR		((6 << 1)|1) + +/* Read and write blocks start with these tokens and end with crc; + * on error, read tokens act like a subset of R2_SPI_* values. + */ +#define SPI_TOKEN_SINGLE	0xfe	/* single block r/w, multiblock read */ +#define SPI_TOKEN_MULTI_WRITE	0xfc	/* multiblock write */ +#define SPI_TOKEN_STOP_TRAN	0xfd	/* terminate multiblock write */ + +/* MMC SPI commands start with a start bit "0" and a transmit bit "1" */ +#define MMC_SPI_CMD(x) (0x40 | (x & 0x3f)) + +/* bus capability */ +#define MMC_SPI_VOLTAGE (MMC_VDD_32_33 | MMC_VDD_33_34) +#define MMC_SPI_MIN_CLOCK 400000 /* 400KHz to meet MMC spec */ + +/* timeout value */ +#define CTOUT 8 +#define RTOUT 3000000 /* 1 sec */ +#define WTOUT 3000000 /* 1 sec */ + +static uint mmc_spi_sendcmd(struct mmc *mmc, ushort cmdidx, u32 cmdarg) +{ +	struct spi_slave *spi = mmc->priv; +	u8 cmdo[7]; +	u8 r1; +	int i; +	cmdo[0] = 0xff; +	cmdo[1] = MMC_SPI_CMD(cmdidx); +	cmdo[2] = cmdarg >> 24; +	cmdo[3] = cmdarg >> 16; +	cmdo[4] = cmdarg >> 8; +	cmdo[5] = cmdarg; +	cmdo[6] = (crc7(0, &cmdo[1], 5) << 1) | 0x01; +	spi_xfer(spi, sizeof(cmdo) * 8, cmdo, NULL, 0); +	for (i = 0; i < CTOUT; i++) { +		spi_xfer(spi, 1 * 8, NULL, &r1, 0); +		if (i && (r1 & 0x80) == 0) /* r1 response */ +			break; +	} +	debug("%s:cmd%d resp%d %x\n", __func__, cmdidx, i, r1); +	return r1; +} + +static uint mmc_spi_readdata(struct mmc *mmc, void *xbuf, +				u32 bcnt, u32 bsize) +{ +	struct spi_slave *spi = mmc->priv; +	u8 *buf = xbuf; +	u8 r1; +	u16 crc; +	int i; +	while (bcnt--) { +		for (i = 0; i < RTOUT; i++) { +			spi_xfer(spi, 1 * 8, NULL, &r1, 0); +			if (r1 != 0xff) /* data token */ +				break; +		} +		debug("%s:tok%d %x\n", __func__, i, r1); +		if (r1 == SPI_TOKEN_SINGLE) { +			spi_xfer(spi, bsize * 8, NULL, buf, 0); +			spi_xfer(spi, 2 * 8, NULL, &crc, 0); +#ifdef CONFIG_MMC_SPI_CRC_ON +			if (swab16(cyg_crc16(buf, bsize)) != crc) { +				debug("%s: CRC error\n", mmc->name); +				r1 = R1_SPI_COM_CRC; +				break; +			} +#endif +			r1 = 0; +		} else { +			r1 = R1_SPI_ERROR; +			break; +		} +		buf += bsize; +	} +	return r1; +} + +static uint mmc_spi_writedata(struct mmc *mmc, const void *xbuf, +			      u32 bcnt, u32 bsize, int multi) +{ +	struct spi_slave *spi = mmc->priv; +	const u8 *buf = xbuf; +	u8 r1; +	u16 crc; +	u8 tok[2]; +	int i; +	tok[0] = 0xff; +	tok[1] = multi ? SPI_TOKEN_MULTI_WRITE : SPI_TOKEN_SINGLE; +	while (bcnt--) { +#ifdef CONFIG_MMC_SPI_CRC_ON +		crc = swab16(cyg_crc16((u8 *)buf, bsize)); +#endif +		spi_xfer(spi, 2 * 8, tok, NULL, 0); +		spi_xfer(spi, bsize * 8, buf, NULL, 0); +		spi_xfer(spi, 2 * 8, &crc, NULL, 0); +		for (i = 0; i < CTOUT; i++) { +			spi_xfer(spi, 1 * 8, NULL, &r1, 0); +			if ((r1 & 0x10) == 0) /* response token */ +				break; +		} +		debug("%s:tok%d %x\n", __func__, i, r1); +		if (SPI_MMC_RESPONSE_CODE(r1) == SPI_RESPONSE_ACCEPTED) { +			for (i = 0; i < WTOUT; i++) { /* wait busy */ +				spi_xfer(spi, 1 * 8, NULL, &r1, 0); +				if (i && r1 == 0xff) { +					r1 = 0; +					break; +				} +			} +			if (i == WTOUT) { +				debug("%s:wtout %x\n", __func__, r1); +				r1 = R1_SPI_ERROR; +				break; +			} +		} else { +			debug("%s: err %x\n", __func__, r1); +			r1 = R1_SPI_COM_CRC; +			break; +		} +		buf += bsize; +	} +	if (multi && bcnt == -1) { /* stop multi write */ +		tok[1] = SPI_TOKEN_STOP_TRAN; +		spi_xfer(spi, 2 * 8, tok, NULL, 0); +		for (i = 0; i < WTOUT; i++) { /* wait busy */ +			spi_xfer(spi, 1 * 8, NULL, &r1, 0); +			if (i && r1 == 0xff) { +				r1 = 0; +				break; +			} +		} +		if (i == WTOUT) { +			debug("%s:wstop %x\n", __func__, r1); +			r1 = R1_SPI_ERROR; +		} +	} +	return r1; +} + +static int mmc_spi_request(struct mmc *mmc, struct mmc_cmd *cmd, +		struct mmc_data *data) +{ +	struct spi_slave *spi = mmc->priv; +	u8 r1; +	int i; +	int ret = 0; +	debug("%s:cmd%d %x %x %x\n", __func__, +	      cmd->cmdidx, cmd->resp_type, cmd->cmdarg, cmd->flags); +	spi_claim_bus(spi); +	spi_cs_activate(spi); +	r1 = mmc_spi_sendcmd(mmc, cmd->cmdidx, cmd->cmdarg); +	if (r1 == 0xff) { /* no response */ +		ret = NO_CARD_ERR; +		goto done; +	} else if (r1 & R1_SPI_COM_CRC) { +		ret = COMM_ERR; +		goto done; +	} else if (r1 & ~R1_SPI_IDLE) { /* other errors */ +		ret = TIMEOUT; +		goto done; +	} else if (cmd->resp_type == MMC_RSP_R2) { +		r1 = mmc_spi_readdata(mmc, cmd->response, 1, 16); +		for (i = 0; i < 4; i++) +			cmd->response[i] = swab32(cmd->response[i]); +		debug("r128 %x %x %x %x\n", cmd->response[0], cmd->response[1], +		      cmd->response[2], cmd->response[3]); +	} else if (!data) { +		switch (cmd->cmdidx) { +		case SD_CMD_APP_SEND_OP_COND: +		case MMC_CMD_SEND_OP_COND: +			cmd->response[0] = (r1 & R1_SPI_IDLE) ? 0 : OCR_BUSY; +			break; +		case SD_CMD_SEND_IF_COND: +		case MMC_CMD_SPI_READ_OCR: +			spi_xfer(spi, 4 * 8, NULL, cmd->response, 0); +			cmd->response[0] = swab32(cmd->response[0]); +			debug("r32 %x\n", cmd->response[0]); +			break; +		} +	} else { +		debug("%s:data %x %x %x\n", __func__, +		      data->flags, data->blocks, data->blocksize); +		if (data->flags == MMC_DATA_READ) +			r1 = mmc_spi_readdata(mmc, data->dest, +				data->blocks, data->blocksize); +		else if  (data->flags == MMC_DATA_WRITE) +			r1 = mmc_spi_writedata(mmc, data->src, +				data->blocks, data->blocksize, +				(cmd->cmdidx == MMC_CMD_WRITE_MULTIPLE_BLOCK)); +		if (r1 & R1_SPI_COM_CRC) +			ret = COMM_ERR; +		else if (r1) /* other errors */ +			ret = TIMEOUT; +	} +done: +	spi_cs_deactivate(spi); +	spi_release_bus(spi); +	return ret; +} + +static void mmc_spi_set_ios(struct mmc *mmc) +{ +	struct spi_slave *spi = mmc->priv; +	debug("%s: clock %u\n", __func__, mmc->clock); +	if (mmc->clock) +		spi_set_speed(spi, mmc->clock); +} + +static int mmc_spi_init_p(struct mmc *mmc) +{ +	struct spi_slave *spi = mmc->priv; +	mmc->clock = 0; +	spi_set_speed(spi, MMC_SPI_MIN_CLOCK); +	spi_claim_bus(spi); +	/* cs deactivated for 100+ clock */ +	spi_xfer(spi, 18 * 8, NULL, NULL, 0); +	spi_release_bus(spi); +	return 0; +} + +struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode) +{ +	struct mmc *mmc; + +	mmc = malloc(sizeof(*mmc)); +	if (!mmc) +		return NULL; +	memset(mmc, 0, sizeof(*mmc)); +	mmc->priv = spi_setup_slave(bus, cs, speed, mode); +	if (!mmc->priv) { +		free(mmc); +		return NULL; +	} +	sprintf(mmc->name, "MMC_SPI"); +	mmc->send_cmd = mmc_spi_request; +	mmc->set_ios = mmc_spi_set_ios; +	mmc->init = mmc_spi_init_p; +	mmc->host_caps = MMC_MODE_SPI; + +	mmc->voltages = MMC_SPI_VOLTAGE; +	mmc->f_max = speed; +	mmc->f_min = MMC_SPI_MIN_CLOCK; +	mmc->block_dev.part_type = PART_TYPE_DOS; + +	mmc_register(mmc); + +	return mmc; +} diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index fa286a8d8..52f8575aa 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -2461,20 +2461,24 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd,  	/* check version */  	val = le16_to_cpu(p->revision); -	if (val == 1 || val > (1 << 4)) { -		printk(KERN_INFO "%s: unsupported ONFI " -					"version: %d\n", __func__, val); -		return 0; -	} - -	if (val & (1 << 4)) +	if (val & (1 << 5)) +		chip->onfi_version = 23; +	else if (val & (1 << 4))  		chip->onfi_version = 22;  	else if (val & (1 << 3))  		chip->onfi_version = 21;  	else if (val & (1 << 2))  		chip->onfi_version = 20; -	else +	else if (val & (1 << 1))  		chip->onfi_version = 10; +	else +		chip->onfi_version = 0; + +	if (!chip->onfi_version) { +		printk(KERN_INFO "%s: unsupported ONFI " +					"version: %d\n", __func__, val); +		return 0; +	}  	if (!mtd->name)  		mtd->name = p->model; @@ -2482,7 +2486,7 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd,  	mtd->writesize = le32_to_cpu(p->byte_per_page);  	mtd->erasesize = le32_to_cpu(p->pages_per_block) * mtd->writesize;  	mtd->oobsize = le16_to_cpu(p->spare_bytes_per_page); -	chip->chipsize = le32_to_cpu(p->blocks_per_lun) * mtd->erasesize; +	chip->chipsize = (uint64_t)le32_to_cpu(p->blocks_per_lun) * mtd->erasesize;  	*busw = 0;  	if (le16_to_cpu(p->features) & 1)  		*busw = NAND_BUSWIDTH_16; diff --git a/drivers/spi/cf_spi.c b/drivers/spi/cf_spi.c index 722aafc73..a883da936 100644 --- a/drivers/spi/cf_spi.c +++ b/drivers/spi/cf_spi.c @@ -49,6 +49,14 @@ extern void cfspi_release_bus(uint bus, uint cs);  DECLARE_GLOBAL_DATA_PTR; +#ifndef CONFIG_SPI_IDLE_VAL +#if defined(CONFIG_SPI_MMC) +#define CONFIG_SPI_IDLE_VAL	0xFFFF +#else +#define CONFIG_SPI_IDLE_VAL	0x0 +#endif +#endif +  #if defined(CONFIG_CF_DSPI)  /* DSPI specific mode */  #define SPI_MODE_MOD	0x00200000 @@ -145,7 +153,7 @@ int cfspi_xfer(struct spi_slave *slave, uint bitlen, const void *dout,  			}  			if (din != NULL) { -				cfspi_tx(ctrl, 0); +				cfspi_tx(ctrl, CONFIG_SPI_IDLE_VAL);  				if (cfslave->charbit == 16)  					*spi_rd16++ = cfspi_rx();  				else @@ -169,7 +177,7 @@ int cfspi_xfer(struct spi_slave *slave, uint bitlen, const void *dout,  		}  		if (din != NULL) { -			cfspi_tx(ctrl, 0); +			cfspi_tx(ctrl, CONFIG_SPI_IDLE_VAL);  			if (cfslave->charbit == 16)  				*spi_rd16 = cfspi_rx();  			else @@ -177,7 +185,7 @@ int cfspi_xfer(struct spi_slave *slave, uint bitlen, const void *dout,  		}  	} else {  		/* dummy read */ -		cfspi_tx(ctrl, 0); +		cfspi_tx(ctrl, CONFIG_SPI_IDLE_VAL);  		cfspi_rx();  	} diff --git a/include/config_cmd_defaults.h b/include/config_cmd_defaults.h index 9283daa3d..a55b268b9 100644 --- a/include/config_cmd_defaults.h +++ b/include/config_cmd_defaults.h @@ -1,7 +1,7 @@  /*   * config_cmd_defaults.h - sane defaults for everyone   * - * Copyright (c) 2010 Analog Devices Inc. + * Copyright (c) 2010-2011 Analog Devices Inc.   *   * Licensed under the GPL-2 or later.   */ @@ -10,5 +10,9 @@  #define _CONFIG_CMD_DEFAULTS_H_  #define CONFIG_CMD_BOOTM 1 +#define CONFIG_CMD_CRC32 1 +#define CONFIG_CMD_EXPORTENV 1 +#define CONFIG_CMD_GO 1 +#define CONFIG_CMD_IMPORTENV 1  #endif diff --git a/include/config_defaults.h b/include/config_defaults.h index abdf3beb0..0337163c2 100644 --- a/include/config_defaults.h +++ b/include/config_defaults.h @@ -12,7 +12,6 @@  /* Support bootm-ing different OSes */  #define CONFIG_BOOTM_LINUX 1  #define CONFIG_BOOTM_NETBSD 1 -#define CONFIG_BOOTM_OSE 1  #define CONFIG_BOOTM_RTEMS 1  #define CONFIG_GZIP 1 diff --git a/include/mmc.h b/include/mmc.h index fcd0fd1de..e0a56d9d2 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -44,6 +44,7 @@  #define MMC_MODE_HS_52MHz	0x010  #define MMC_MODE_4BIT		0x100  #define MMC_MODE_8BIT		0x200 +#define MMC_MODE_SPI		0x400  #define SD_DATA_4BIT	0x00040000 @@ -75,6 +76,8 @@  #define MMC_CMD_WRITE_SINGLE_BLOCK	24  #define MMC_CMD_WRITE_MULTIPLE_BLOCK	25  #define MMC_CMD_APP_CMD			55 +#define MMC_CMD_SPI_READ_OCR		58 +#define MMC_CMD_SPI_CRC_ON_OFF		59  #define SD_CMD_SEND_RELATIVE_ADDR	3  #define SD_CMD_SWITCH_FUNC		6 @@ -93,6 +96,12 @@  #define OCR_BUSY	0x80000000  #define OCR_HCS		0x40000000 +#define OCR_VOLTAGE_MASK	0x007FFF80 +#define OCR_ACCESS_MODE		0x60000000 + +#define MMC_STATUS_MASK		(~0x0206BF7F) +#define MMC_STATUS_RDY_FOR_DATA (1<<8) +#define MMC_STATUS_CURR_STATE	(0xf<<9)  #define MMC_VDD_165_195		0x00000080	/* VDD voltage 1.65 - 1.95 */  #define MMC_VDD_20_21		0x00000100	/* VDD voltage 2.0 ~ 2.1 */ @@ -291,6 +300,8 @@ int board_mmc_getcd(u8 *cd, struct mmc *mmc);  #ifdef CONFIG_GENERIC_MMC  int atmel_mci_init(void *regs); +#define mmc_host_is_spi(mmc)	((mmc)->host_caps & MMC_MODE_SPI) +struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode);  #else  int mmc_legacy_init(int verbose);  #endif diff --git a/nand_spl/board/freescale/mpc8536ds/Makefile b/nand_spl/board/freescale/mpc8536ds/Makefile index a0e1455e3..43da3df15 100644 --- a/nand_spl/board/freescale/mpc8536ds/Makefile +++ b/nand_spl/board/freescale/mpc8536ds/Makefile @@ -2,7 +2,7 @@  # (C) Copyright 2007  # Stefan Roese, DENX Software Engineering, sr@denx.de.  # -# Copyright 2009 Freescale Semiconductor, Inc. +# Copyright 2009-2011 Freescale Semiconductor, Inc.  #  # See file CREDITS for list of people who contributed to this  # project. @@ -32,8 +32,8 @@ include $(TOPDIR)/config.mk  nandobj	:= $(OBJTREE)/nand_spl/  LDSCRIPT= $(TOPDIR)/$(CPUDIR)/u-boot-nand_spl.lds -LDFLAGS := -T $(LDSCRIPT) -Ttext $(CONFIG_SYS_TEXT_BASE_SPL) $(LDFLAGS) \ -	   $(LDFLAGS_FINAL) +LDFLAGS := -T $(nandobj)u-boot-nand_spl.lds -Ttext $(CONFIG_SYS_TEXT_BASE_SPL) \ +		$(LDFLAGS) $(LDFLAGS_FINAL)  AFLAGS	+= -DCONFIG_NAND_SPL  CFLAGS	+= -DCONFIG_NAND_SPL @@ -56,11 +56,14 @@ $(nandobj)u-boot-spl-16k.bin: $(nandobj)u-boot-spl  $(nandobj)u-boot-spl.bin:	$(nandobj)u-boot-spl  	$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ -$(nandobj)u-boot-spl:	$(OBJS) +$(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds  	cd $(LNDIR) && $(LD) $(LDFLAGS) $(__OBJS) $(PLATFORM_LIBS) \  		-Map $(nandobj)u-boot-spl.map \  		-o $(nandobj)u-boot-spl +$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) +	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@ +  # create symbolic links for common files  $(obj)cache.c: diff --git a/nand_spl/board/freescale/mpc8569mds/Makefile b/nand_spl/board/freescale/mpc8569mds/Makefile index a0e1455e3..43da3df15 100644 --- a/nand_spl/board/freescale/mpc8569mds/Makefile +++ b/nand_spl/board/freescale/mpc8569mds/Makefile @@ -2,7 +2,7 @@  # (C) Copyright 2007  # Stefan Roese, DENX Software Engineering, sr@denx.de.  # -# Copyright 2009 Freescale Semiconductor, Inc. +# Copyright 2009-2011 Freescale Semiconductor, Inc.  #  # See file CREDITS for list of people who contributed to this  # project. @@ -32,8 +32,8 @@ include $(TOPDIR)/config.mk  nandobj	:= $(OBJTREE)/nand_spl/  LDSCRIPT= $(TOPDIR)/$(CPUDIR)/u-boot-nand_spl.lds -LDFLAGS := -T $(LDSCRIPT) -Ttext $(CONFIG_SYS_TEXT_BASE_SPL) $(LDFLAGS) \ -	   $(LDFLAGS_FINAL) +LDFLAGS := -T $(nandobj)u-boot-nand_spl.lds -Ttext $(CONFIG_SYS_TEXT_BASE_SPL) \ +		$(LDFLAGS) $(LDFLAGS_FINAL)  AFLAGS	+= -DCONFIG_NAND_SPL  CFLAGS	+= -DCONFIG_NAND_SPL @@ -56,11 +56,14 @@ $(nandobj)u-boot-spl-16k.bin: $(nandobj)u-boot-spl  $(nandobj)u-boot-spl.bin:	$(nandobj)u-boot-spl  	$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ -$(nandobj)u-boot-spl:	$(OBJS) +$(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds  	cd $(LNDIR) && $(LD) $(LDFLAGS) $(__OBJS) $(PLATFORM_LIBS) \  		-Map $(nandobj)u-boot-spl.map \  		-o $(nandobj)u-boot-spl +$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) +	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@ +  # create symbolic links for common files  $(obj)cache.c: diff --git a/nand_spl/board/freescale/mpc8572ds/Makefile b/nand_spl/board/freescale/mpc8572ds/Makefile index 092ce143e..43da3df15 100644 --- a/nand_spl/board/freescale/mpc8572ds/Makefile +++ b/nand_spl/board/freescale/mpc8572ds/Makefile @@ -2,7 +2,7 @@  # (C) Copyright 2007  # Stefan Roese, DENX Software Engineering, sr@denx.de.  # -# Copyright 2009-2010 Freescale Semiconductor, Inc. +# Copyright 2009-2011 Freescale Semiconductor, Inc.  #  # See file CREDITS for list of people who contributed to this  # project. @@ -32,8 +32,8 @@ include $(TOPDIR)/config.mk  nandobj	:= $(OBJTREE)/nand_spl/  LDSCRIPT= $(TOPDIR)/$(CPUDIR)/u-boot-nand_spl.lds -LDFLAGS := -T $(LDSCRIPT) -Ttext $(CONFIG_SYS_TEXT_BASE_SPL) $(LDFLAGS) \ -	   $(LDFLAGS_FINAL) +LDFLAGS := -T $(nandobj)u-boot-nand_spl.lds -Ttext $(CONFIG_SYS_TEXT_BASE_SPL) \ +		$(LDFLAGS) $(LDFLAGS_FINAL)  AFLAGS	+= -DCONFIG_NAND_SPL  CFLAGS	+= -DCONFIG_NAND_SPL @@ -56,11 +56,14 @@ $(nandobj)u-boot-spl-16k.bin: $(nandobj)u-boot-spl  $(nandobj)u-boot-spl.bin:	$(nandobj)u-boot-spl  	$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ -$(nandobj)u-boot-spl:	$(OBJS) +$(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds  	cd $(LNDIR) && $(LD) $(LDFLAGS) $(__OBJS) $(PLATFORM_LIBS) \  		-Map $(nandobj)u-boot-spl.map \  		-o $(nandobj)u-boot-spl +$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) +	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@ +  # create symbolic links for common files  $(obj)cache.c: diff --git a/nand_spl/board/freescale/p1_p2_rdb/Makefile b/nand_spl/board/freescale/p1_p2_rdb/Makefile index a0e1455e3..43da3df15 100644 --- a/nand_spl/board/freescale/p1_p2_rdb/Makefile +++ b/nand_spl/board/freescale/p1_p2_rdb/Makefile @@ -2,7 +2,7 @@  # (C) Copyright 2007  # Stefan Roese, DENX Software Engineering, sr@denx.de.  # -# Copyright 2009 Freescale Semiconductor, Inc. +# Copyright 2009-2011 Freescale Semiconductor, Inc.  #  # See file CREDITS for list of people who contributed to this  # project. @@ -32,8 +32,8 @@ include $(TOPDIR)/config.mk  nandobj	:= $(OBJTREE)/nand_spl/  LDSCRIPT= $(TOPDIR)/$(CPUDIR)/u-boot-nand_spl.lds -LDFLAGS := -T $(LDSCRIPT) -Ttext $(CONFIG_SYS_TEXT_BASE_SPL) $(LDFLAGS) \ -	   $(LDFLAGS_FINAL) +LDFLAGS := -T $(nandobj)u-boot-nand_spl.lds -Ttext $(CONFIG_SYS_TEXT_BASE_SPL) \ +		$(LDFLAGS) $(LDFLAGS_FINAL)  AFLAGS	+= -DCONFIG_NAND_SPL  CFLAGS	+= -DCONFIG_NAND_SPL @@ -56,11 +56,14 @@ $(nandobj)u-boot-spl-16k.bin: $(nandobj)u-boot-spl  $(nandobj)u-boot-spl.bin:	$(nandobj)u-boot-spl  	$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ -$(nandobj)u-boot-spl:	$(OBJS) +$(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds  	cd $(LNDIR) && $(LD) $(LDFLAGS) $(__OBJS) $(PLATFORM_LIBS) \  		-Map $(nandobj)u-boot-spl.map \  		-o $(nandobj)u-boot-spl +$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) +	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@ +  # create symbolic links for common files  $(obj)cache.c: diff --git a/nand_spl/nand_boot.c b/nand_spl/nand_boot.c index 76b8566fb..4a968784e 100644 --- a/nand_spl/nand_boot.c +++ b/nand_spl/nand_boot.c @@ -90,6 +90,10 @@ static int nand_command(struct mtd_info *mtd, int block, int page, int offs, u8  		cmd = NAND_CMD_READ0;  	} +	/* Shift the offset from byte addressing to word addressing. */ +	if (this->options & NAND_BUSWIDTH_16) +		offs >>= 1; +  	/* Begin command latch cycle */  	this->cmd_ctrl(mtd, cmd, NAND_CTRL_CLE | NAND_CTRL_CHANGE);  	/* Set ALE and clear CLE to start address cycle */ diff --git a/nand_spl/nand_boot_fsl_elbc.c b/nand_spl/nand_boot_fsl_elbc.c index 9547d4423..502605b1d 100644 --- a/nand_spl/nand_boot_fsl_elbc.c +++ b/nand_spl/nand_boot_fsl_elbc.c @@ -51,11 +51,11 @@ static void nand_load(unsigned int offs, int uboot_size, uchar *dst)  {  	fsl_lbc_t *regs = LBC_BASE_ADDR;  	uchar *buf = (uchar *)CONFIG_SYS_NAND_BASE; -	int large = in_be32(®s->bank[0].or) & OR_FCM_PGS; -	int block_shift = large ? 17 : 14; -	int block_size = 1 << block_shift; -	int page_size = large ? 2048 : 512; -	int bad_marker = large ? page_size + 0 : page_size + 5; +	const int large = CONFIG_SYS_NAND_OR_PRELIM & OR_FCM_PGS; +	const int block_shift = large ? 17 : 14; +	const int block_size = 1 << block_shift; +	const int page_size = large ? 2048 : 512; +	const int bad_marker = large ? page_size + 0 : page_size + 5;  	int fmr = (15 << FMR_CWTO_SHIFT) | (2 << FMR_AL_SHIFT) | 2;  	int pos = 0; |