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;
                                }
 
 #define FLASH_CFI_X8           0x00
 #define FLASH_CFI_X16          0x01
 #define FLASH_CFI_X8X16                0x02
+#define FLASH_CFI_X16X32       0x05
 
 /* convert between bit value and numeric value */
 #define CFI_FLASH_SHIFT_WIDTH  3