diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2007-07-05 18:01:24 +0200 |
---|---|---|
committer | Sascha Hauer <sha@octopus.labnet.pengutronix.de> | 2007-07-05 18:01:24 +0200 |
commit | 658cc34395e3780dc46d6ffdc61c95130d362661 (patch) | |
tree | 2a56eb0438b75e2ddc44970ff8be4d7af97e65fa /drivers | |
parent | 873c1d746ea291cdf0b73dbcc1f7f289984472f2 (diff) | |
download | barebox-658cc34395e3780dc46d6ffdc61c95130d362661.tar.gz barebox-658cc34395e3780dc46d6ffdc61c95130d362661.tar.xz |
svn_rev_118
thousands of things
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/cfi_flash.c | 70 |
1 files changed, 40 insertions, 30 deletions
diff --git a/drivers/cfi_flash.c b/drivers/cfi_flash.c index ee7e93ee98..1e0db22840 100644 --- a/drivers/cfi_flash.c +++ b/drivers/cfi_flash.c @@ -185,9 +185,6 @@ static int flash_write_cfiword (flash_info_t * info, ulong dest, cfiword_t cword static int flash_full_status_check (flash_info_t * info, flash_sect_t sector, uint64_t tout, char *prompt); ulong flash_get_size (flash_info_t *info, ulong base); -#if defined(CFG_ENV_IS_IN_FLASH) || defined(CFG_ENV_ADDR_REDUND) || (CFG_MONITOR_BASE >= CFG_FLASH_BASE) -static flash_info_t *flash_get_info(ulong base); -#endif #ifdef CFG_FLASH_USE_BUFFER_WRITE static int flash_write_cfibuffer (flash_info_t * info, ulong dest, uchar * cp, int len); #endif @@ -328,9 +325,7 @@ int cfi_probe (struct device_d *dev) struct cfi_platform_data *pdev = (struct cfi_platform_data *)dev->platform_data; flash_info_t *info = &pdev->finfo; - dev->map_flags = MAP_READ; - - printf("cfi_probe: %s base: 0x%08x size: 0x%08x\n", dev->name, dev->map_base, dev->size); +// printf("cfi_probe: %s base: 0x%08x size: 0x%08x\n", dev->name, dev->map_base, dev->size); /* Init: no FLASHes known */ info->flash_id = FLASH_UNKNOWN; @@ -396,43 +391,42 @@ int flash_erase_one (flash_info_t * info, long sect) return rcode; } -int cfi_erase(struct device_d *dev, struct memarea_info *mem) +int cfi_erase(struct device_d *dev, size_t count, unsigned long offset) { struct cfi_platform_data *pdata = dev->platform_data; flash_info_t *finfo = &pdata->finfo; unsigned long start, end; + int i, ret = 0; - printf("start: 0x%08x\n",mem->start); - printf("end: 0x%08x\n",mem->end); - printf("base: 0x%08x\n",mem->device->map_base); - start = flash_find_sector(finfo, mem->start + mem->device->map_base); - end = flash_find_sector(finfo, mem->end + mem->device->map_base); + start = flash_find_sector(finfo, dev->map_base + offset); + end = flash_find_sector(finfo, dev->map_base + offset + count - 1); - printf("would erase sectors %d to %d\n",start, end); - return 0; + for (i = start; i <= end; i++) { + ret = flash_erase_one (finfo, i); + if (ret) + goto out; + } +out: + putc('\n'); + return ret; } -static ssize_t cfi_write(struct device_d* dev, void* buf, size_t count, unsigned long offset) { - printf("cfi_write: buf=0x%08x count=0x%08x offset=0x%08x\n",buf, count, offset); - return count; -} +static ssize_t cfi_write(struct device_d* dev, void* buf, size_t count, unsigned long offset, ulong flags) +{ + struct cfi_platform_data *pdata = dev->platform_data; + flash_info_t *finfo = &pdata->finfo; + int ret; -static struct driver_d cfi_driver = { - .name = "nor", - .probe = cfi_probe, - .write = cfi_write, - .erase = cfi_erase, -}; +// printf("cfi_write: buf=0x%08x addr=0x%08x count=0x%08x\n",buf, dev->map_base + offset, count); -int flash_init(void) -{ - return register_driver(&cfi_driver); + ret = write_buff (finfo, buf, dev->map_base + offset, count); + return ret == 0 ? count : -1; } -/*----------------------------------------------------------------------- - */ -void flash_print_info (flash_info_t * info) +void cfi_info (struct device_d* dev) { + struct cfi_platform_data *pdata = dev->platform_data; + flash_info_t *info = &pdata->finfo; int i; if (info->flash_id != FLASH_MAN_CFI) { @@ -518,6 +512,20 @@ void flash_print_info (flash_info_t * info) return; } +static struct driver_d cfi_driver = { + .name = "cfi_flash", + .probe = cfi_probe, + .read = mem_read, + .write = cfi_write, + .erase = cfi_erase, + .info = cfi_info, +}; + +int flash_init(void) +{ + return register_driver(&cfi_driver); +} + /*----------------------------------------------------------------------- * Copy memory to flash, returns: * 0 - OK @@ -719,6 +727,8 @@ static int flash_status_check (flash_info_t * info, flash_sect_t sector, { uint64_t start; + tout *= 1000000; + /* Wait for command completion */ start = get_time_ns(); while (flash_is_busy (info, sector)) { |