[adm5120] more generic handling of Macronix flash chips, fix #2008
[openwrt/svn-archive/archive.git] / target / linux / adm5120-2.6 / patches-2.6.22 / 101-cfi-fixup-macronix-bootloc.patch
index 543cb940a485f45348c8a1becdf580e7d241e3dc..5740d4ac606ee1a0030e01a423595772ea94b963 100644 (file)
@@ -2,7 +2,7 @@ Index: linux-2.6.22-rc6/drivers/mtd/chips/cfi_cmdset_0002.c
 ===================================================================
 --- linux-2.6.22-rc6.orig/drivers/mtd/chips/cfi_cmdset_0002.c
 +++ linux-2.6.22-rc6/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -47,12 +47,17 @@
+@@ -47,12 +47,19 @@
  #define MANUFACTURER_AMD      0x0001
  #define MANUFACTURER_ATMEL    0x001F
  #define MANUFACTURER_SST      0x00BF
@@ -15,48 +15,56 @@ Index: linux-2.6.22-rc6/drivers/mtd/chips/cfi_cmdset_0002.c
  
 +/* Macronix */
 +#define MX29LV160B    0x2249  /* MX29LV160 Bottom-boot chip */
++#define MX29LV160T    0x22C4  /* MX29LV160 Top-boot chip */
 +#define MX29LV320B    0x22A8  /* MX29LV320 Bottom-boot chip */
++#define MX29LV320T    0x22A7  /* MX29LV320 Top-boot chip */
 +
  static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
  static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
  static int cfi_amdstd_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
-@@ -217,6 +222,35 @@ static void fixup_use_atmel_lock(struct 
+@@ -217,6 +224,41 @@ static void fixup_use_atmel_lock(struct 
        mtd->flags |= MTD_STUPID_LOCK;
  }
  
 +#ifdef CONFIG_MTD_CFI_FIXUP_MACRONIX_BOOTLOC
 +/*
-+ * Some Macronix chips has bad bootblock information in the CFI table
++ * Some Macronix chips has no/bad bootblock information in the CFI table
 + */
 +static void fixup_macronix_bootloc(struct mtd_info *mtd, void* param)
 +{
 +      struct map_info *map = mtd->priv;
 +      struct cfi_private *cfi = map->fldrv_priv;
 +      struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
-+      __u8 major = extp->MajorVersion;
-+      __u8 minor = extp->MinorVersion;
++      __u8 t;
 +
 +      switch (cfi->id) {
 +      /* TODO: put affected chip ids here */
 +      case MX29LV160B:
 +      case MX29LV320B:
-+              if (((major << 8) | minor) != 0x3131)
-+                      break;
++              t = 2;  /* Bottom boot */
++              break;
++      case MX29LV160T:
++      case MX29LV320T:
++              t = 3;  /* Top boot */
++              break;
++      default:
++              return;
++      }
 +
-+              if (extp->TopBottom == 2)
-+                      break;
++      if (extp->TopBottom == t)
++              /* boot location detected by the CFI layer is correct */
++              return;
 +
-+              extp->TopBottom = 2;    /* Bottom boot */
-+              printk("%s: weird Macronix chip detected, id:0x%04X, boot location "
-+                      "forced to bottom\n", map->name, cfi->id);
-+      }
++      extp->TopBottom = t;
++      printk("%s: Macronix chip detected, id:0x%04X, boot location forced "
++              "to %s\n", map->name, cfi->id, (t == 2) ? "bottom" : "top");
 +}
 +#endif /* CONFIG_MTD_CFI_FIXUP_MACRONIX_BOOTLOC */
 +
  static struct cfi_fixup cfi_fixup_table[] = {
  #ifdef AMD_BOOTLOC_BUG
        { CFI_MFR_AMD, CFI_ID_ANY, fixup_amd_bootblock, NULL },
-@@ -231,6 +265,9 @@ static struct cfi_fixup cfi_fixup_table[
+@@ -231,6 +273,9 @@ static struct cfi_fixup cfi_fixup_table[
        { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
  #endif
        { CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
@@ -78,8 +86,8 @@ Index: linux-2.6.22-rc6/drivers/mtd/chips/Kconfig
 +      bool "Force bottom boot for Macronix flash chips"
 +      depends on MTD_CFI_AMDSTD
 +      help
-+        Some Macronix flash chips have wrong boot-block location in the
-+        CFI table, and the driver may detect the type incorrectly. Select 
++        Some Macronix flash chips have no/wrong boot-block location in the
++        CFI table, and the driver may detect the type incorrectly. Select
 +        this if your board has such chip.
 +
  config MTD_CFI_STAA