9
0
Fork 0

[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
This commit is contained in:
Sascha Hauer 2008-02-26 11:28:55 +01:00
parent 51c840cd18
commit 3d3c13d8f8
6 changed files with 127 additions and 118 deletions

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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,

View File

@ -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;
}

View File

@ -209,6 +209,30 @@ static inline uchar flash_read_uchar (flash_info_t * info, uint offset)
#endif
}
#ifdef CONFIG_DRIVER_CFI_BANK_WIDTH_1
#define bankwidth_is_1(info) (info->portwidth == 1)
#else
#define bankwidth_is_1(info) 0
#endif
#ifdef CONFIG_DRIVER_CFI_BANK_WIDTH_2
#define bankwidth_is_2(info) (info->portwidth == 2)
#else
#define bankwidth_is_2(info) 0
#endif
#ifdef CONFIG_DRIVER_CFI_BANK_WIDTH_4
#define bankwidth_is_4(info) (info->portwidth == 4)
#else
#define bankwidth_is_4(info) 0
#endif
#ifdef CONFIG_DRIVER_CFI_BANK_WIDTH_8
#define bankwidth_is_8(info) (info->portwidth == 8)
#else
#define bankwidth_is_8(info) 0
#endif
typedef union {
unsigned char c;
unsigned short w;
@ -225,22 +249,17 @@ typedef union {
static inline void flash_write_word(flash_info_t *info, cfiword_t datum, void *addr)
{
switch (info->portwidth) {
case FLASH_CFI_8BIT:
if (bankwidth_is_1(info)) {
debug("fw addr %p val %02x\n", addr, datum.c);
writeb(datum.c, addr);
break;
case FLASH_CFI_16BIT:
} else if (bankwidth_is_2(info)) {
debug("fw addr %p val %04x\n", addr, datum.w);
writew(datum.w, addr);
break;
case FLASH_CFI_32BIT:
} else if (bankwidth_is_4(info)) {
debug("fw addr %p val %08x\n", addr, datum.l);
writel(datum.l, addr);
break;
case FLASH_CFI_64BIT:
} else if (bankwidth_is_8(info)) {
memcpy((void *)addr, &datum.ll, 8);
break;
}
}