summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2012-04-10 10:38:23 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2012-04-10 10:38:23 +0200
commit705a2e2e259e8cb448ca7ec5a0c80b7487980113 (patch)
treef2cd6538097a36a237681923704d57e51e55a70f /drivers
parentfe3de245d1b7421da49a0124dc254ea4194c44ee (diff)
parent7eebd3b4c6a0b22ee389752dcd5b4ef1fe6fac7b (diff)
downloadbarebox-705a2e2e259e8cb448ca7ec5a0c80b7487980113.tar.gz
barebox-705a2e2e259e8cb448ca7ec5a0c80b7487980113.tar.xz
Merge branch 'work/cfi-fixes'
Diffstat (limited to 'drivers')
-rw-r--r--drivers/nor/cfi_flash_intel.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/nor/cfi_flash_intel.c b/drivers/nor/cfi_flash_intel.c
index 6318cfec83..32e581a395 100644
--- a/drivers/nor/cfi_flash_intel.c
+++ b/drivers/nor/cfi_flash_intel.c
@@ -57,6 +57,9 @@ static int intel_flash_write_cfibuffer (struct flash_info *info, ulong dest, con
int retcode;
void *src = (void*)cp;
void *dst = (void *)dest;
+ /* reduce width due to possible alignment problems */
+ const unsigned long ptr = (unsigned long)dest | (unsigned long)cp | info->portwidth;
+ const int width = ptr & -ptr;
sector = find_sector (info, dest);
flash_write_cmd (info, sector, 0, FLASH_CMD_CLEAR_STATUS);
@@ -68,22 +71,27 @@ static int intel_flash_write_cfibuffer (struct flash_info *info, ulong dest, con
return retcode;
/* reduce the number of loops by the width of the port */
- cnt = len >> (info->portwidth - 1);
+ cnt = len / width;
- flash_write_cmd(info, sector, 0, (u32)cnt - 1);
+ flash_write_cmd(info, sector, 0, cnt - 1);
while (cnt-- > 0) {
- if (bankwidth_is_1(info)) {
+ switch (width) {
+ case 1:
flash_write8(flash_read8(src), dst);
src += 1, dst += 1;
- } else if (bankwidth_is_2(info)) {
+ break;
+ case 2:
flash_write16(flash_read16(src), dst);
src += 2, dst += 2;
- } else if (bankwidth_is_4(info)) {
+ break;
+ case 4:
flash_write32(flash_read32(src), dst);
src += 4, dst += 4;
- } else if (bankwidth_is_8(info)) {
+ break;
+ case 8:
flash_write64(flash_read64(src), dst);
src += 8, dst += 8;
+ break;
}
}