|
@@ -1231,9 +1231,26 @@ static int flash_detect_cfi (flash_info_t * info)
|
|
|
debug ("port %d bits chip %d bits\n",
|
|
|
info->portwidth << CFI_FLASH_SHIFT_WIDTH,
|
|
|
info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
|
|
|
- /* this probably only works if info->interface == FLASH_CFI_X8X16 */
|
|
|
- info->addr_unlock1 = (info->portwidth == FLASH_CFI_8BIT) ? 0xAAA : 0x555;
|
|
|
- info->addr_unlock2 = (info->portwidth == FLASH_CFI_8BIT) ? 0x555 : 0x2AA;
|
|
|
+
|
|
|
+ /* calculate command offsets as in the Linux driver */
|
|
|
+ info->addr_unlock1 = 0x555;
|
|
|
+ info->addr_unlock2 = 0x2aa;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * modify the unlock address if we are
|
|
|
+ * in compatibility mode
|
|
|
+ */
|
|
|
+ if ( /* x8/x16 in x8 mode */
|
|
|
+ ((info->chipwidth == FLASH_CFI_BY8) &&
|
|
|
+ (info->interface == FLASH_CFI_X8X16)) ||
|
|
|
+ /* x16/x32 in x16 mode */
|
|
|
+ ((info->chipwidth == FLASH_CFI_BY16) &&
|
|
|
+ (info->interface == FLASH_CFI_X16X32)))
|
|
|
+ {
|
|
|
+ info->addr_unlock1 = 0xaaa;
|
|
|
+ info->addr_unlock2 = 0x555;
|
|
|
+ }
|
|
|
+
|
|
|
info->name = "CFI conformant";
|
|
|
return 1;
|
|
|
}
|