summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2007-07-05 18:01:24 +0200
committerSascha Hauer <sha@octopus.labnet.pengutronix.de>2007-07-05 18:01:24 +0200
commit658cc34395e3780dc46d6ffdc61c95130d362661 (patch)
tree2a56eb0438b75e2ddc44970ff8be4d7af97e65fa /drivers
parent873c1d746ea291cdf0b73dbcc1f7f289984472f2 (diff)
downloadbarebox-658cc34395e3780dc46d6ffdc61c95130d362661.tar.gz
barebox-658cc34395e3780dc46d6ffdc61c95130d362661.tar.xz
svn_rev_118
thousands of things
Diffstat (limited to 'drivers')
-rw-r--r--drivers/cfi_flash.c70
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)) {