MTD: Convert Atmel PRI information to AMD format

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Thu Aug 17 08:59:01 EDT 2006


Commit:     5b0c5c2c0d04c29f85abb485378ba5476c7aeec2
Parent:     0b6c0bb3f9621b128011bcd5f65047c73afdde3b
commit 5b0c5c2c0d04c29f85abb485378ba5476c7aeec2
Author:     Haavard Skinnemoen <hskinnemoen at atmel.com>
AuthorDate: Wed Aug 9 10:54:44 2006 +0200
Commit:     Josh Boyer <jwboyer at gmail.com>
CommitDate: Wed Aug 16 20:13:06 2006 -0500

    MTD: Convert Atmel PRI information to AMD format
    
    Atmel flash chips don't have PRI information in the same format as
    AMD flash chips. This patch installs a fixup for all Atmel chips that
    converts the relevant PRI fields into AMD format.
    
    Only the fields that are actually used by the command set is actually
    converted. The rest are initialized to zero (which should be safe)
    
    Signed-off-by: Haavard Skinnemoen <hskinnemoen at atmel.com>
    Signed-off-by: Josh Boyer <jwboyer at gmail.com>
---
 drivers/mtd/chips/cfi_cmdset_0002.c |   21 +++++++++++++++++++++
 include/linux/mtd/cfi.h             |   13 +++++++++++++
 2 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
index 9885726..8901c44 100644
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
@@ -161,6 +161,26 @@ static void fixup_use_write_buffers(stru
 	}
 }
 
+/* Atmel chips don't use the same PRI format as AMD chips */
+static void fixup_convert_atmel_pri(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;
+	struct cfi_pri_atmel atmel_pri;
+
+	memcpy(&atmel_pri, extp, sizeof(atmel_pri));
+	memset(extp + 5, 0, sizeof(*extp) - 5);
+
+	if (atmel_pri.Features & 0x02)
+		extp->EraseSuspend = 2;
+
+	if (atmel_pri.BottomBoot)
+		extp->TopBottom = 2;
+	else
+		extp->TopBottom = 3;
+}
+
 static void fixup_use_secsi(struct mtd_info *mtd, void *param)
 {
 	/* Setup for chips with a secsi area */
@@ -192,6 +212,7 @@ #endif
 #if !FORCE_WORD_WRITE
 	{ CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
 #endif
+	{ CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
 	{ 0, 0, NULL, NULL }
 };
 static struct cfi_fixup jedec_fixup_table[] = {
diff --git a/include/linux/mtd/cfi.h b/include/linux/mtd/cfi.h
index 09bfae6..123948b 100644
--- a/include/linux/mtd/cfi.h
+++ b/include/linux/mtd/cfi.h
@@ -199,6 +199,18 @@ struct cfi_pri_amdstd {
 	uint8_t  TopBottom;
 } __attribute__((packed));
 
+/* Vendor-Specific PRI for Atmel chips (command set 0x0002) */
+
+struct cfi_pri_atmel {
+	uint8_t pri[3];
+	uint8_t MajorVersion;
+	uint8_t MinorVersion;
+	uint8_t Features;
+	uint8_t BottomBoot;
+	uint8_t BurstMode;
+	uint8_t PageMode;
+} __attribute__((packed));
+
 struct cfi_pri_query {
 	uint8_t  NumFields;
 	uint32_t ProtField[1]; /* Not host ordered */
@@ -464,6 +476,7 @@ #define CFI_MFR_ANY 0xffff
 #define CFI_ID_ANY  0xffff
 
 #define CFI_MFR_AMD 0x0001
+#define CFI_MFR_ATMEL 0x001F
 #define CFI_MFR_ST  0x0020 	/* STMicroelectronics */
 
 void cfi_fixup(struct mtd_info *mtd, struct cfi_fixup* fixups);



More information about the linux-mtd-cvs mailing list