mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
Fix bug in adaption of Stefano Babic's CFI driver patch.
This commit is contained in:
parent
9c0f42ecfe
commit
92eb729bad
1 changed files with 21 additions and 15 deletions
|
@ -104,6 +104,7 @@
|
|||
#define FLASH_OFFSET_DEVICE_ID2 0x0E
|
||||
#define FLASH_OFFSET_DEVICE_ID3 0x0F
|
||||
#define FLASH_OFFSET_CFI 0x55
|
||||
#define FLASH_OFFSET_CFI_ALT 0x555
|
||||
#define FLASH_OFFSET_CFI_RESP 0x10
|
||||
#define FLASH_OFFSET_PRIMARY_VENDOR 0x13
|
||||
#define FLASH_OFFSET_EXT_QUERY_T_P_ADDR 0x15 /* extended query table primary addr */
|
||||
|
@ -154,6 +155,8 @@ typedef union {
|
|||
|
||||
#define NUM_ERASE_REGIONS 4 /* max. number of erase regions */
|
||||
|
||||
static uint flash_offset_cfi[2]={FLASH_OFFSET_CFI,FLASH_OFFSET_CFI_ALT};
|
||||
|
||||
/* use CFG_MAX_FLASH_BANKS_DETECT if defined */
|
||||
#ifdef CFG_MAX_FLASH_BANKS_DETECT
|
||||
static ulong bank_base[CFG_MAX_FLASH_BANKS_DETECT] = CFG_FLASH_BANKS_LIST;
|
||||
|
@ -343,7 +346,7 @@ unsigned long flash_init (void)
|
|||
if (flash_info[i].flash_id == FLASH_UNKNOWN) {
|
||||
#ifndef CFG_FLASH_QUIET_TEST
|
||||
printf ("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",
|
||||
i, flash_info[i].size, flash_info[i].size << 20);
|
||||
i+1, flash_info[i].size, flash_info[i].size << 20);
|
||||
#endif /* CFG_FLASH_QUIET_TEST */
|
||||
}
|
||||
#ifdef CFG_FLASH_PROTECTION
|
||||
|
@ -1136,6 +1139,7 @@ static void flash_read_jedec_ids (flash_info_t * info)
|
|||
*/
|
||||
static int flash_detect_cfi (flash_info_t * info)
|
||||
{
|
||||
int cfi_offset;
|
||||
debug ("flash detect cfi\n");
|
||||
|
||||
for (info->portwidth = CFG_FLASH_CFI_WIDTH;
|
||||
|
@ -1144,20 +1148,22 @@ static int flash_detect_cfi (flash_info_t * info)
|
|||
info->chipwidth <= info->portwidth;
|
||||
info->chipwidth <<= 1) {
|
||||
flash_write_cmd (info, 0, 0, info->cmd_reset);
|
||||
flash_write_cmd (info, 0, FLASH_OFFSET_CFI, FLASH_CMD_CFI);
|
||||
if (flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP, 'Q')
|
||||
&& flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 1, 'R')
|
||||
&& flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 2, 'Y')) {
|
||||
info->interface = flash_read_ushort (info, 0, FLASH_OFFSET_INTERFACE);
|
||||
info->cfi_offset=flash_offset_cfi[cfi_offset];
|
||||
debug ("device interface is %d\n",
|
||||
info->interface);
|
||||
debug ("found port %d chip %d ",
|
||||
info->portwidth, info->chipwidth);
|
||||
debug ("port %d bits chip %d bits\n",
|
||||
info->portwidth << CFI_FLASH_SHIFT_WIDTH,
|
||||
info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
|
||||
return 1;
|
||||
for (cfi_offset=0; cfi_offset < sizeof(flash_offset_cfi)/sizeof(uint); cfi_offset++) {
|
||||
flash_write_cmd (info, 0, flash_offset_cfi[cfi_offset], FLASH_CMD_CFI);
|
||||
if (flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP, 'Q')
|
||||
&& flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 1, 'R')
|
||||
&& flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 2, 'Y')) {
|
||||
info->interface = flash_read_ushort (info, 0, FLASH_OFFSET_INTERFACE);
|
||||
info->cfi_offset=flash_offset_cfi[cfi_offset];
|
||||
debug ("device interface is %d\n",
|
||||
info->interface);
|
||||
debug ("found port %d chip %d ",
|
||||
info->portwidth, info->chipwidth);
|
||||
debug ("port %d bits chip %d bits\n",
|
||||
info->portwidth << CFI_FLASH_SHIFT_WIDTH,
|
||||
info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue