Merge branch 'next' of git://www.denx.de/git/u-boot-cfi-flash into next
This commit is contained in:
commit
6afde8bfd0
|
@ -74,6 +74,20 @@ flash_info_t flash_info[CFI_MAX_FLASH_BANKS]; /* FLASH chips info */
|
||||||
#define CONFIG_SYS_FLASH_CFI_WIDTH FLASH_CFI_8BIT
|
#define CONFIG_SYS_FLASH_CFI_WIDTH FLASH_CFI_8BIT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 0xffff is an undefined value for the configuration register. When
|
||||||
|
* this value is returned, the configuration register shall not be
|
||||||
|
* written at all (default mode).
|
||||||
|
*/
|
||||||
|
static u16 cfi_flash_config_reg(int i)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_SYS_CFI_FLASH_CONFIG_REGS
|
||||||
|
return ((u16 [])CONFIG_SYS_CFI_FLASH_CONFIG_REGS)[i];
|
||||||
|
#else
|
||||||
|
return 0xffff;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_SYS_MAX_FLASH_BANKS_DETECT)
|
#if defined(CONFIG_SYS_MAX_FLASH_BANKS_DETECT)
|
||||||
int cfi_flash_num_flash_banks = CONFIG_SYS_MAX_FLASH_BANKS_DETECT;
|
int cfi_flash_num_flash_banks = CONFIG_SYS_MAX_FLASH_BANKS_DETECT;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1112,18 +1126,18 @@ static int sector_erased(flash_info_t *info, int i)
|
||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
int size;
|
int size;
|
||||||
volatile unsigned long *flash;
|
u32 *flash;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if whole sector is erased
|
* Check if whole sector is erased
|
||||||
*/
|
*/
|
||||||
size = flash_sector_size(info, i);
|
size = flash_sector_size(info, i);
|
||||||
flash = (volatile unsigned long *) info->start[i];
|
flash = (u32 *)info->start[i];
|
||||||
/* divide by 4 for longword access */
|
/* divide by 4 for longword access */
|
||||||
size = size >> 2;
|
size = size >> 2;
|
||||||
|
|
||||||
for (k = 0; k < size; k++) {
|
for (k = 0; k < size; k++) {
|
||||||
if (*flash++ != 0xffffffff)
|
if (flash_read32(flash++) != 0xffffffff)
|
||||||
return 0; /* not erased */
|
return 0; /* not erased */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1426,6 +1440,11 @@ int flash_real_protect (flash_info_t * info, long sector, int prot)
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flash needs to be in status register read mode for
|
||||||
|
* flash_full_status_check() to work correctly
|
||||||
|
*/
|
||||||
|
flash_write_cmd(info, sector, 0, FLASH_CMD_READ_STATUS);
|
||||||
if ((retcode =
|
if ((retcode =
|
||||||
flash_full_status_check (info, sector, info->erase_blk_tout,
|
flash_full_status_check (info, sector, info->erase_blk_tout,
|
||||||
prot ? "protect" : "unprotect")) == 0) {
|
prot ? "protect" : "unprotect")) == 0) {
|
||||||
|
@ -1975,6 +1994,13 @@ ulong flash_get_size (phys_addr_t base, int banknum)
|
||||||
case CFI_CMDSET_INTEL_PROG_REGIONS:
|
case CFI_CMDSET_INTEL_PROG_REGIONS:
|
||||||
case CFI_CMDSET_INTEL_EXTENDED:
|
case CFI_CMDSET_INTEL_EXTENDED:
|
||||||
case CFI_CMDSET_INTEL_STANDARD:
|
case CFI_CMDSET_INTEL_STANDARD:
|
||||||
|
/*
|
||||||
|
* Set flash to read-id mode. Otherwise
|
||||||
|
* reading protected status is not
|
||||||
|
* guaranteed.
|
||||||
|
*/
|
||||||
|
flash_write_cmd(info, sect_cnt, 0,
|
||||||
|
FLASH_CMD_READ_ID);
|
||||||
info->protect[sect_cnt] =
|
info->protect[sect_cnt] =
|
||||||
flash_isset (info, sect_cnt,
|
flash_isset (info, sect_cnt,
|
||||||
FLASH_OFFSET_PROTECT,
|
FLASH_OFFSET_PROTECT,
|
||||||
|
@ -2021,6 +2047,31 @@ void flash_set_verbose(uint v)
|
||||||
flash_verbose = v;
|
flash_verbose = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cfi_flash_set_config_reg(u32 base, u16 val)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_SYS_CFI_FLASH_CONFIG_REGS
|
||||||
|
/*
|
||||||
|
* Only set this config register if really defined
|
||||||
|
* to a valid value (0xffff is invalid)
|
||||||
|
*/
|
||||||
|
if (val == 0xffff)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set configuration register. Data is "encrypted" in the 16 lower
|
||||||
|
* address bits.
|
||||||
|
*/
|
||||||
|
flash_write16(FLASH_CMD_SETUP, (void *)(base + (val << 1)));
|
||||||
|
flash_write16(FLASH_CMD_SET_CR_CONFIRM, (void *)(base + (val << 1)));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Finally issue reset-command to bring device back to
|
||||||
|
* read-array mode
|
||||||
|
*/
|
||||||
|
flash_write16(FLASH_CMD_RESET, (void *)base);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
/*-----------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
unsigned long flash_init (void)
|
unsigned long flash_init (void)
|
||||||
|
@ -2044,6 +2095,10 @@ unsigned long flash_init (void)
|
||||||
for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
|
for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; ++i) {
|
||||||
flash_info[i].flash_id = FLASH_UNKNOWN;
|
flash_info[i].flash_id = FLASH_UNKNOWN;
|
||||||
|
|
||||||
|
/* Optionally write flash configuration register */
|
||||||
|
cfi_flash_set_config_reg(cfi_flash_bank_addr(i),
|
||||||
|
cfi_flash_config_reg(i));
|
||||||
|
|
||||||
if (!flash_detect_legacy(cfi_flash_bank_addr(i), i))
|
if (!flash_detect_legacy(cfi_flash_bank_addr(i), i))
|
||||||
flash_get_size(cfi_flash_bank_addr(i), i);
|
flash_get_size(cfi_flash_bank_addr(i), i);
|
||||||
size += flash_info[i].size;
|
size += flash_info[i].size;
|
||||||
|
|
|
@ -32,6 +32,8 @@
|
||||||
#define FLASH_CMD_ERASE_CONFIRM 0xD0
|
#define FLASH_CMD_ERASE_CONFIRM 0xD0
|
||||||
#define FLASH_CMD_WRITE 0x40
|
#define FLASH_CMD_WRITE 0x40
|
||||||
#define FLASH_CMD_PROTECT 0x60
|
#define FLASH_CMD_PROTECT 0x60
|
||||||
|
#define FLASH_CMD_SETUP 0x60
|
||||||
|
#define FLASH_CMD_SET_CR_CONFIRM 0x03
|
||||||
#define FLASH_CMD_PROTECT_SET 0x01
|
#define FLASH_CMD_PROTECT_SET 0x01
|
||||||
#define FLASH_CMD_PROTECT_CLEAR 0xD0
|
#define FLASH_CMD_PROTECT_CLEAR 0xD0
|
||||||
#define FLASH_CMD_CLEAR_STATUS 0x50
|
#define FLASH_CMD_CLEAR_STATUS 0x50
|
||||||
|
|
Loading…
Reference in New Issue