summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2008-02-26 11:28:55 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2008-02-26 11:28:55 +0100
commit3d3c13d8f8238d0ed6e3e23841737de53b2c424f (patch)
tree7a4a9c8a53a2996778c284a85493beb1da3575eb /drivers
parent51c840cd18acd8a9f656b1491bc8ff100acccbd0 (diff)
downloadbarebox-3d3c13d8f8238d0ed6e3e23841737de53b2c424f.tar.gz
barebox-3d3c13d8f8238d0ed6e3e23841737de53b2c424f.tar.xz
[CFI Driver] - Update Kconfig help texts
- Turn switch/case into if/else to be able to optimize out unused code when not all bankwidths are needed
Diffstat (limited to 'drivers')
-rw-r--r--drivers/Kconfig54
-rw-r--r--drivers/Makefile2
-rw-r--r--drivers/cfi_flash_amd.c33
-rw-r--r--drivers/cfi_flash_intel.c35
-rw-r--r--drivers/cfi_flash_new.c84
5 files changed, 99 insertions, 109 deletions
diff --git a/drivers/Kconfig b/drivers/Kconfig
index e4a488da5c..eeb582b8f9 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -10,14 +10,68 @@ config HAS_CFI
config DRIVER_CFI
bool "cfi flash driver"
+ help
+ If you have NOR Flash devices connected to your system and wish
+ to use them say yes here.
+
config DRIVER_CFI_NEW
+ depends on DRIVER_CFI
+ default y
bool "new cfi flash driver"
+ help
+ The old cfi flash driver is mainly an adopted version from U-Boot v1
+ whereas the new driver contains some more experimental features such
+ as selecting the supported chiptypes and bus widths making the driver
+ smaller.
+ Normally you should stick with the new driver, but if you experience
+ troubles you could try the old driver. Please report if the new driver
+ breaks something.
+
+config DRIVER_CFI_OLD
+ bool
+ default y
+ depends on !DRIVER_CFI_NEW
+
config DRIVER_CFI_INTEL
depends on DRIVER_CFI_NEW
bool "Support Intel flash chips"
+
config DRIVER_CFI_AMD
depends on DRIVER_CFI_NEW
bool "support AMD flash chips"
+
+config DRIVER_CFI_BANK_WIDTH_1
+ bool "Support 8-bit buswidth"
+ depends on DRIVER_CFI_NEW
+ default y
+ help
+ If you wish to support CFI devices on a physical bus which is
+ 8 bits wide, say 'Y'.
+
+config DRIVER_CFI_BANK_WIDTH_2
+ bool "Support 16-bit buswidth"
+ depends on DRIVER_CFI_NEW
+ default y
+ help
+ If you wish to support CFI devices on a physical bus which is
+ 16 bits wide, say 'Y'.
+
+config DRIVER_CFI_BANK_WIDTH_4
+ bool "Support 32-bit buswidth"
+ depends on DRIVER_CFI_NEW
+ default y
+ help
+ If you wish to support CFI devices on a physical bus which is
+ 32 bits wide, say 'Y'.
+
+config DRIVER_CFI_BANK_WIDTH_8
+ bool "Support 64-bit buswidth"
+ depends on DRIVER_CFI_NEW
+ default n
+ help
+ If you wish to support CFI devices on a physical bus which is
+ 64 bits wide, say 'Y'.
+
config CFI_BUFFER_WRITE
bool "use cfi driver with buffer write"
depends on DRIVER_CFI || DRIVER_CFI_NEW
diff --git a/drivers/Makefile b/drivers/Makefile
index 3845305f27..ecba682f48 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -1,7 +1,7 @@
obj-y += net/
obj-y += serial/
obj-y += nand/
-obj-$(CONFIG_DRIVER_CFI) += cfi_flash.o
+obj-$(CONFIG_DRIVER_CFI_OLD) += cfi_flash.o
obj-$(CONFIG_DRIVER_CFI_NEW) += cfi_flash_new.o
obj-$(CONFIG_DRIVER_CFI_INTEL) += cfi_flash_intel.o
obj-$(CONFIG_DRIVER_CFI_AMD) += cfi_flash_amd.o
diff --git a/drivers/cfi_flash_amd.c b/drivers/cfi_flash_amd.c
index b565a85350..6d7130f53f 100644
--- a/drivers/cfi_flash_amd.c
+++ b/drivers/cfi_flash_amd.c
@@ -47,24 +47,18 @@ static int flash_toggle (flash_info_t * info, flash_sect_t sect, uint offset, uc
cptr.cp = flash_make_addr (info, sect, offset);
flash_make_cmd (info, cmd, &cword);
- switch (info->portwidth) {
- case FLASH_CFI_8BIT:
+ if (bankwidth_is_1(info)) {
retval = ((cptr.cp[0] & cword.c) != (cptr.cp[0] & cword.c));
- break;
- case FLASH_CFI_16BIT:
+ } else if (bankwidth_is_2(info)) {
retval = ((cptr.wp[0] & cword.w) != (cptr.wp[0] & cword.w));
- break;
- case FLASH_CFI_32BIT:
+ } else if (bankwidth_is_4(info)) {
retval = ((cptr.lp[0] & cword.l) != (cptr.lp[0] & cword.l));
- break;
- case FLASH_CFI_64BIT:
+ } else if (bankwidth_is_8(info)) {
retval = ((cptr.llp[0] & cword.ll) !=
(cptr.llp[0] & cword.ll));
- break;
- default:
+ } else
retval = 0;
- break;
- }
+
return retval;
}
@@ -120,29 +114,22 @@ static int amd_flash_write_cfibuffer (flash_info_t * info, ulong dest, const uch
flash_make_cmd (info, AMD_CMD_WRITE_TO_BUFFER, &cword);
flash_write_word(info, cword, (void *)dest);
- switch (info->portwidth) {
- case FLASH_CFI_8BIT:
+ if (bankwidth_is_1(info)) {
cnt = len;
flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
while (cnt-- > 0) *dst.cp++ = *src.cp++;
- break;
- case FLASH_CFI_16BIT:
+ } else if (bankwidth_is_2(info)) {
cnt = len >> 1;
flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
while (cnt-- > 0) *dst.wp++ = *src.wp++;
- break;
- case FLASH_CFI_32BIT:
+ } else if (bankwidth_is_4(info)) {
cnt = len >> 2;
flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
while (cnt-- > 0) *dst.lp++ = *src.lp++;
- break;
- case FLASH_CFI_64BIT:
+ } else if (bankwidth_is_8(info)) {
cnt = len >> 3;
flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
while (cnt-- > 0) *dst.llp++ = *src.llp++;
- break;
- default:
- return ERR_INVAL;
}
flash_write_cmd (info, sector, 0, AMD_CMD_WRITE_BUFFER_CONFIRM);
diff --git a/drivers/cfi_flash_intel.c b/drivers/cfi_flash_intel.c
index d6594fc081..18b377cc53 100644
--- a/drivers/cfi_flash_intel.c
+++ b/drivers/cfi_flash_intel.c
@@ -108,41 +108,18 @@ static int intel_flash_write_cfibuffer (flash_info_t * info, ulong dest, const u
if ((retcode = flash_status_check (info, sector, info->buffer_write_tout,
"write to buffer")) == ERR_OK) {
/* reduce the number of loops by the width of the port */
- switch (info->portwidth) {
- case FLASH_CFI_8BIT:
- cnt = len;
- break;
- case FLASH_CFI_16BIT:
- cnt = len >> 1;
- break;
- case FLASH_CFI_32BIT:
- cnt = len >> 2;
- break;
- case FLASH_CFI_64BIT:
- cnt = len >> 3;
- break;
- default:
- return ERR_INVAL;
- break;
- }
+ cnt = len >> (info->portwidth - 1);
+
flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
while (cnt-- > 0) {
- switch (info->portwidth) {
- case FLASH_CFI_8BIT:
+ if (bankwidth_is_1(info)) {
*dst.cp++ = *src.cp++;
- break;
- case FLASH_CFI_16BIT:
+ } else if (bankwidth_is_2(info)) {
*dst.wp++ = *src.wp++;
- break;
- case FLASH_CFI_32BIT:
+ } else if (bankwidth_is_4(info)) {
*dst.lp++ = *src.lp++;
- break;
- case FLASH_CFI_64BIT:
+ } else if (bankwidth_is_8(info)) {
*dst.llp++ = *src.llp++;
- break;
- default:
- return ERR_INVAL;
- break;
}
}
flash_write_cmd (info, sector, 0,
diff --git a/drivers/cfi_flash_new.c b/drivers/cfi_flash_new.c
index 848bd3c580..f2d4314b98 100644
--- a/drivers/cfi_flash_new.c
+++ b/drivers/cfi_flash_new.c
@@ -83,11 +83,9 @@ static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c)
unsigned long long ll;
#endif
- switch (info->portwidth) {
- case FLASH_CFI_8BIT:
+ if (bankwidth_is_1(info)) {
cword->c = c;
- break;
- case FLASH_CFI_16BIT:
+ } else if (bankwidth_is_2(info)) {
#if defined(__LITTLE_ENDIAN)
w = c;
w <<= 8;
@@ -95,8 +93,7 @@ static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c)
#else
cword->w = (cword->w << 8) | c;
#endif
- break;
- case FLASH_CFI_32BIT:
+ } else if (bankwidth_is_4(info)) {
#if defined(__LITTLE_ENDIAN)
l = c;
l <<= 24;
@@ -104,8 +101,7 @@ static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c)
#else
cword->l = (cword->l << 8) | c;
#endif
- break;
- case FLASH_CFI_64BIT:
+ } else if (bankwidth_is_8(info)) {
#if defined(__LITTLE_ENDIAN)
ll = c;
ll <<= 56;
@@ -113,7 +109,6 @@ static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c)
#else
cword->ll = (cword->ll << 8) | c;
#endif
- break;
}
}
@@ -129,22 +124,17 @@ static int flash_write_cfiword (flash_info_t * info, ulong dest,
/* Check if Flash is (sufficiently) erased */
- switch (info->portwidth) {
- case FLASH_CFI_8BIT:
+ if (bankwidth_is_1(info)) {
flag = ((cptr.cp[0] & cword.c) == cword.c);
- break;
- case FLASH_CFI_16BIT:
+ } else if (bankwidth_is_2(info)) {
flag = ((cptr.wp[0] & cword.w) == cword.w);
- break;
- case FLASH_CFI_32BIT:
+ } else if (bankwidth_is_4(info)) {
flag = ((cptr.lp[0] & cword.l) == cword.l);
- break;
- case FLASH_CFI_64BIT:
+ } else if (bankwidth_is_8(info)) {
flag = ((cptr.llp[0] & cword.ll) == cword.ll);
- break;
- default:
+ } else
return 2;
- }
+
if (!flag)
return 2;
@@ -153,19 +143,14 @@ static int flash_write_cfiword (flash_info_t * info, ulong dest,
info->cfi_cmd_set->flash_prepare_write(info);
- switch (info->portwidth) {
- case FLASH_CFI_8BIT:
+ if (bankwidth_is_1(info)) {
cptr.cp[0] = cword.c;
- break;
- case FLASH_CFI_16BIT:
+ } else if (bankwidth_is_2(info)) {
cptr.wp[0] = cword.w;
- break;
- case FLASH_CFI_32BIT:
+ } else if (bankwidth_is_4(info)) {
cptr.lp[0] = cword.l;
- break;
- case FLASH_CFI_64BIT:
+ } else if (bankwidth_is_8(info)) {
cptr.llp[0] = cword.ll;
- break;
}
/* re-enable interrupts if necessary */
@@ -322,7 +307,7 @@ static int flash_detect_cfi (flash_info_t * info)
/*
* The following code cannot be run from FLASH!
*/
-ulong flash_get_size (flash_info_t *info, ulong base)
+static ulong flash_get_size (flash_info_t *info, ulong base)
{
int i, j;
flash_sect_t sect_cnt;
@@ -531,7 +516,7 @@ static int cfi_probe (struct device_d *dev)
* when the passed address is greater or equal to the sector address
* we have a match
*/
-flash_sect_t find_sector (flash_info_t * info, ulong addr)
+static inline flash_sect_t find_sector (flash_info_t * info, ulong addr)
{
flash_sect_t sector;
@@ -878,7 +863,6 @@ int flash_status_check (flash_info_t * info, flash_sect_t sector,
void flash_make_cmd (flash_info_t * info, uchar cmd, void *cmdbuf)
{
int i;
- cfiword_t val;
uchar *cp = (uchar *) cmdbuf;
#if defined(__LITTLE_ENDIAN)
@@ -913,20 +897,16 @@ int flash_isequal (flash_info_t * info, flash_sect_t sect, uint offset, uchar cm
flash_make_cmd (info, cmd, &cword);
debug ("is= cmd %x(%c) addr %p ", cmd, cmd, cptr.cp);
- switch (info->portwidth) {
- case FLASH_CFI_8BIT:
+ if (bankwidth_is_1(info)) {
debug ("is= %x %x\n", cptr.cp[0], cword.c);
retval = (cptr.cp[0] == cword.c);
- break;
- case FLASH_CFI_16BIT:
+ } else if (bankwidth_is_2(info)) {
debug ("is= %4.4x %4.4x\n", cptr.wp[0], cword.w);
retval = (cptr.wp[0] == cword.w);
- break;
- case FLASH_CFI_32BIT:
+ } else if (bankwidth_is_4(info)) {
debug ("is= %8.8lx %8.8lx\n", cptr.lp[0], cword.l);
retval = (cptr.lp[0] == cword.l);
- break;
- case FLASH_CFI_64BIT:
+ } else if (bankwidth_is_8(info)) {
#ifdef DEBUG
{
char str1[20];
@@ -938,11 +918,9 @@ int flash_isequal (flash_info_t * info, flash_sect_t sect, uint offset, uchar cm
}
#endif
retval = (cptr.llp[0] == cword.ll);
- break;
- default:
+ } else
retval = 0;
- break;
- }
+
return retval;
}
@@ -954,23 +932,17 @@ int flash_isset (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd)
cptr.cp = flash_make_addr (info, sect, offset);
flash_make_cmd (info, cmd, &cword);
- switch (info->portwidth) {
- case FLASH_CFI_8BIT:
+ if (bankwidth_is_1(info)) {
retval = ((cptr.cp[0] & cword.c) == cword.c);
- break;
- case FLASH_CFI_16BIT:
+ } else if (bankwidth_is_2(info)) {
retval = ((cptr.wp[0] & cword.w) == cword.w);
- break;
- case FLASH_CFI_32BIT:
+ } else if (bankwidth_is_4(info)) {
retval = ((cptr.lp[0] & cword.l) == cword.l);
- break;
- case FLASH_CFI_64BIT:
+ } else if (bankwidth_is_8(info)) {
retval = ((cptr.llp[0] & cword.ll) == cword.ll);
- break;
- default:
+ } else
retval = 0;
- break;
- }
+
return retval;
}