mtd: bcm63xxpart: check version marker string for newer CFEs
Jonas Gorski [Sat, 17 Dec 2011 12:58:14 +0000 (13:58 +0100)]
Recent CFEs do not contain the CFE1CFE1 magic anymore, so check for the
"cfe-v" version marker string instead. As very old CFEs do not have
this string, leave the CFE1CFE1 magic as a fallback for detection.

Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>

drivers/mtd/bcm63xxpart.c

index ac7d3c8..9933b34 100644 (file)
 #include <linux/mtd/partitions.h>
 
 #include <asm/mach-bcm63xx/bcm963xx_tag.h>
+#include <asm/mach-bcm63xx/board_bcm963xx.h>
 
 #define BCM63XX_EXTENDED_SIZE  0xBFC00000      /* Extended flash address */
 
+#define BCM63XX_CFE_MAGIC_OFFSET 0x4e0
+
 static int bcm63xx_detect_cfe(struct mtd_info *master)
 {
-       int idoffset = 0x4e0;
-       static char idstring[8] = "CFE1CFE1";
        char buf[9];
        int ret;
        size_t retlen;
 
-       ret = master->read(master, idoffset, 8, &retlen, (void *)buf);
+       ret = master->read(master, BCM963XX_CFE_VERSION_OFFSET, 5, &retlen,
+                          (void *)buf);
+       buf[retlen] = 0;
+
+       if (ret)
+               return ret;
+
+       if (strncmp("cfe-v", buf, 5) == 0)
+               return 0;
+
+       /* very old CFE's do not have the cfe-v string, so check for magic */
+       ret = master->read(master, BCM63XX_CFE_MAGIC_OFFSET, 8, &retlen,
+                          (void *)buf);
        buf[retlen] = 0;
-       pr_info("Read Signature value of %s\n", buf);
 
-       return strncmp(idstring, buf, 8);
+       return strncmp("CFE1CFE1", buf, 8);
 }
 
 static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,