diff options
| author | wdenk <wdenk> | 2002-08-17 09:36:01 +0000 | 
|---|---|---|
| committer | wdenk <wdenk> | 2002-08-17 09:36:01 +0000 | 
| commit | affae2bff825c1a8d2cfeaf7b270188d251d39d2 (patch) | |
| tree | e025ca5a84cdcd70cff986e09f89e1aaa360499c /board/esd/adciop/flash.c | |
| parent | cf356ef708390102d493c53d18fd19a5963c6aa9 (diff) | |
| download | olio-uboot-2014.01-affae2bff825c1a8d2cfeaf7b270188d251d39d2.tar.xz olio-uboot-2014.01-affae2bff825c1a8d2cfeaf7b270188d251d39d2.zip | |
Initial revision
Diffstat (limited to 'board/esd/adciop/flash.c')
| -rw-r--r-- | board/esd/adciop/flash.c | 113 | 
1 files changed, 113 insertions, 0 deletions
| diff --git a/board/esd/adciop/flash.c b/board/esd/adciop/flash.c new file mode 100644 index 000000000..46ae03b3c --- /dev/null +++ b/board/esd/adciop/flash.c @@ -0,0 +1,113 @@ +/* + * (C) Copyright 2001 + * Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com + * + * 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 <ppc4xx.h> +#include <asm/processor.h> + +/* + * include common flash code (for esd boards) + */ +#include "../common/flash.c" + +/*----------------------------------------------------------------------- + * Functions + */ +static ulong flash_get_size (vu_long *addr, flash_info_t *info); +static void flash_get_offsets (ulong base, flash_info_t *info); + +/*----------------------------------------------------------------------- + */ + +unsigned long flash_init (void) +{ +	unsigned long size_b0, size_b1; +	int i; + +	/* Init: no FLASHes known */ +	for (i=0; i<CFG_MAX_FLASH_BANKS; ++i) { +		flash_info[i].flash_id = FLASH_UNKNOWN; +	} + +	size_b0 = flash_get_size((vu_long *)FLASH_BASE0_PRELIM, &flash_info[0]); + +	if (flash_info[0].flash_id == FLASH_UNKNOWN) { +		printf ("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n", +			size_b0, size_b0<<20); +	} + +	size_b1 = flash_get_size((vu_long *)FLASH_BASE1_PRELIM, &flash_info[1]); + +	if (size_b1 > size_b0) { +		printf ("## ERROR: " +			"Bank 1 (0x%08lx = %ld MB) > Bank 0 (0x%08lx = %ld MB)\n", +			size_b1, size_b1<<20, +			size_b0, size_b0<<20 +		); +		flash_info[0].flash_id	= FLASH_UNKNOWN; +		flash_info[1].flash_id	= FLASH_UNKNOWN; +		flash_info[0].sector_count	= -1; +		flash_info[1].sector_count	= -1; +		flash_info[0].size		= 0; +		flash_info[1].size		= 0; +		return (0); +	} + +	/* Re-do sizing to get full correct info */ +	size_b0 = flash_get_size((vu_long *)FLASH_BASE0_PRELIM, &flash_info[0]); + +	flash_get_offsets (FLASH_BASE0_PRELIM, &flash_info[0]); + +	/* monitor protection ON by default */ +	flash_protect(FLAG_PROTECT_SET, +		      FLASH_BASE0_PRELIM+size_b0-CFG_MONITOR_LEN, +		      FLASH_BASE0_PRELIM+size_b0-1, +		      &flash_info[0]); + +	if (size_b1) { +		/* Re-do sizing to get full correct info */ +		size_b1 = flash_get_size((vu_long *)(FLASH_BASE0_PRELIM + size_b0), +					  &flash_info[1]); + +		flash_get_offsets (FLASH_BASE0_PRELIM + size_b0, &flash_info[1]); + +		/* monitor protection ON by default */ +		flash_protect(FLAG_PROTECT_SET, +			      FLASH_BASE0_PRELIM+size_b0+size_b1-CFG_MONITOR_LEN, +			      FLASH_BASE0_PRELIM+size_b0+size_b1-1, +			      &flash_info[1]); +                /* monitor protection OFF by default (one is enough) */ +                flash_protect(FLAG_PROTECT_CLEAR, +			      FLASH_BASE0_PRELIM+size_b0-CFG_MONITOR_LEN, +			      FLASH_BASE0_PRELIM+size_b0-1, +			      &flash_info[0]); +	} else { +		flash_info[1].flash_id = FLASH_UNKNOWN; +		flash_info[1].sector_count = -1; +	} + +	flash_info[0].size = size_b0; +	flash_info[1].size = size_b1; + +	return (size_b0 + size_b1); +} |