Better macronix bottom boot handling, thanks Gabor !

SVN-Revision: 7618
This commit is contained in:
Florian Fainelli 2007-06-13 18:10:25 +00:00
parent d4c8b230b5
commit ff76ce5d3e
5 changed files with 95 additions and 35 deletions

View file

@ -144,7 +144,7 @@ CONFIG_MTD_BLOCK2MTD=y
CONFIG_MTD_CFI=y
# CONFIG_MTD_CFI_ADV_OPTIONS is not set
CONFIG_MTD_CFI_AMDSTD=y
CONFIG_MTD_CFI_AMDSTD_FORCE_BOTTOM_BOOT=y
CONFIG_MTD_CFI_FIXUP_MACRONIX_BOOTLOC=y
CONFIG_MTD_CFI_I1=y
CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_CFI_I4 is not set

View file

@ -30,6 +30,8 @@ MODULE_DESCRIPTION("ADM5120 USB Host Controller Driver");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jeroen Vreeken (pe1rxq@amsat.org)");
#define PFX "adm5120-hcd: "
#define ADMHCD_REG_CONTROL 0x00
#define ADMHCD_REG_INTSTATUS 0x04
#define ADMHCD_REG_INTENABLE 0x08
@ -826,11 +828,13 @@ static struct platform_driver adm5120hcd_driver = {
static int __init adm5120hcd_init(void)
{
if (usb_disabled())
if (usb_disabled())
return -ENODEV;
if (!adm5120_board.has_usb)
if (!adm5120_board.has_usb) {
printk(KERN_DEBUG PFX "this board does not have USB\n");
return -ENODEV;
printk(KERN_INFO PFX "registered\n");
return platform_driver_register(&adm5120hcd_driver);
}

View file

@ -0,0 +1,87 @@
Index: linux-2.6.21.1/drivers/mtd/chips/cfi_cmdset_0002.c
===================================================================
--- linux-2.6.21.1.orig/drivers/mtd/chips/cfi_cmdset_0002.c
+++ linux-2.6.21.1/drivers/mtd/chips/cfi_cmdset_0002.c
@@ -47,12 +47,17 @@
#define MANUFACTURER_AMD 0x0001
#define MANUFACTURER_ATMEL 0x001F
#define MANUFACTURER_SST 0x00BF
+#define MANUFACTURER_MACRONIX 0x00C2
#define SST49LF004B 0x0060
#define SST49LF040B 0x0050
#define SST49LF008A 0x005a
#define AT49BV6416 0x00d6
#define MANUFACTURER_SAMSUNG 0x00ec
+/* Macronix */
+#define MX29LV160B 0x2249 /* MX29LV160 Bottom-boot chip */
+#define MX29LV320B 0x22A8 /* MX29LV320 Bottom-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
mtd->flags |= MTD_STUPID_LOCK;
}
+#ifdef CONFIG_MTD_CFI_FIXUP_MACRONIX_BOOTLOC
+/*
+ * Some Macronix chips has 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;
+
+ switch (cfi->id) {
+ /* TODO: put affected chip ids here */
+ case MX29LV160B:
+ case MX29LV320B:
+ if (((major << 8) | minor) != 0x3131)
+ break;
+
+ if (extp->TopBottom == 2)
+ break;
+
+ extp->TopBottom = 2; /* Bottom boot */
+ printk("%s: weird Macronix chip detected, id:0x%04X, boot location "
+ "forced to bottom\n", map->name, cfi->id);
+ }
+}
+#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[
{ CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
#endif
{ CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
+#ifdef CONFIG_MTD_CFI_FIXUP_MACRONIX_BOOTLOC
+ { MANUFACTURER_MACRONIX, CFI_ID_ANY, fixup_macronix_bootloc, NULL, },
+#endif
{ 0, 0, NULL, NULL }
};
static struct cfi_fixup jedec_fixup_table[] = {
Index: linux-2.6.21.1/drivers/mtd/chips/Kconfig
===================================================================
--- linux-2.6.21.1.orig/drivers/mtd/chips/Kconfig
+++ linux-2.6.21.1/drivers/mtd/chips/Kconfig
@@ -199,6 +199,14 @@ config MTD_CFI_AMDSTD
provides support for one of those command sets, used on chips
including the AMD Am29LV320.
+config MTD_CFI_FIXUP_MACRONIX_BOOTLOC
+ 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
+ this if your board has such chip.
+
config MTD_CFI_STAA
tristate "Support for ST (Advanced Architecture) flash chips"
depends on MTD_GEN_PROBE

View file

@ -1,31 +0,0 @@
--- linux-2.6.19.2/drivers/mtd/chips/Kconfig.old 2007-01-11 03:10:36.000000000 +0800
+++ linux-2.6.19.2/drivers/mtd/chips/Kconfig 2007-03-29 14:43:32.000000000 +0800
@@ -199,6 +199,14 @@
provides support for one of those command sets, used on chips
including the AMD Am29LV320.
+config MTD_CFI_AMDSTD_FORCE_BOTTOM_BOOT
+ bool "Force bottom boot for Macronix flash chips"
+ depends on MTD_CFI_AMDSTD
+ help
+ Some Macronix flash chips have wrong CFI info, and the driver may
+ detect the type incorrectly. Select this if the chip part number
+ ends with BTC.
+
config MTD_CFI_STAA
tristate "Support for ST (Advanced Architecture) flash chips"
depends on MTD_GEN_PROBE
--- linux-2.6.19.2/drivers/mtd/chips/cfi_cmdset_0002.c.old 2007-03-22 16:14:56.000000000 +0800
+++ linux-2.6.19.2/drivers/mtd/chips/cfi_cmdset_0002.c 2007-03-29 14:07:28.000000000 +0800
@@ -320,6 +320,11 @@
cfi_tell_features(extp);
#endif
+#ifdef CONFIG_MTD_CFI_AMDSTD_FORCE_BOTTOM_BOOT
+ extp->TopBottom = 2;
+ bootloc = extp->TopBottom;
+#endif
+
bootloc = extp->TopBottom;
if ((bootloc != 2) && (bootloc != 3)) {
printk(KERN_WARNING "%s: CFI does not contain boot "

View file

@ -144,7 +144,7 @@ CONFIG_MTD_BLOCK2MTD=y
CONFIG_MTD_CFI=y
# CONFIG_MTD_CFI_ADV_OPTIONS is not set
CONFIG_MTD_CFI_AMDSTD=y
CONFIG_MTD_CFI_AMDSTD_FORCE_BOTTOM_BOOT=y
CONFIG_MTD_CFI_FIXUP_MACRONIX_BOOTLOC=y
CONFIG_MTD_CFI_I1=y
CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_CFI_I4 is not set