[MTD] Unlock NOR flash automatically where necessary
authorHåvard Skinnemoen <hskinnemoen@atmel.com>
Fri, 22 Sep 2006 09:07:08 +0000 (10:07 +0100)
committerDavid Woodhouse <dwmw2@infradead.org>
Fri, 22 Sep 2006 09:07:08 +0000 (10:07 +0100)
Introduce the MTD_STUPID_LOCK flag which indicates that the flash chip is
always locked after power-up, so all sectors need to be unlocked before it
is usable.

If this flag is set, and the chip provides an unlock() operation,
mtd_add_device will unlock the whole MTD device if it's writeable.  This
means that non-writeable partitions will stay locked.

Set MTD_STUPID_LOCK in fixup_use_atmel_lock() so that these chips will work
as expected.

Signed-off-by: Håvard Skinnemoen <hskinnemoen@atmel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
drivers/mtd/chips/cfi_cmdset_0002.c
drivers/mtd/mtdcore.c
include/mtd/mtd-abi.h

index a482e8922de102c15b514f3d672ad074a585c290..702ae4cd8691c510e33ecc3892bccd0c16653f61 100644 (file)
@@ -212,6 +212,7 @@ static void fixup_use_atmel_lock(struct mtd_info *mtd, void *param)
 {
        mtd->lock = cfi_atmel_lock;
        mtd->unlock = cfi_atmel_unlock;
+       mtd->flags |= MTD_STUPID_LOCK;
 }
 
 static struct cfi_fixup cfi_fixup_table[] = {
index 168d3ba063c3637ca48373312271e59f897f4fb4..c4d26de74349e55f9ae32269ff780b0dde50e767 100644 (file)
@@ -57,6 +57,16 @@ int add_mtd_device(struct mtd_info *mtd)
                        mtd->index = i;
                        mtd->usecount = 0;
 
+                       /* Some chips always power up locked. Unlock them now */
+                       if ((mtd->flags & MTD_WRITEABLE)
+                           && (mtd->flags & MTD_STUPID_LOCK) && mtd->unlock) {
+                               if (mtd->unlock(mtd, 0, mtd->size))
+                                       printk(KERN_WARNING
+                                              "%s: unlock failed, "
+                                              "writes may not work\n",
+                                              mtd->name);
+                       }
+
                        DEBUG(0, "mtd: Giving out device %d to %s\n",i, mtd->name);
                        /* No need to get a refcount on the module containing
                           the notifier, since we hold the mtd_table_mutex */
index 1da3f7fa79934914a36ca2f2fbfdfd2f17eb062d..b0a67b7ffdcd2697b1b281c4b3ff1c1733214216 100644 (file)
@@ -34,6 +34,7 @@ struct mtd_oob_buf {
 #define MTD_WRITEABLE          0x400   /* Device is writeable */
 #define MTD_BIT_WRITEABLE      0x800   /* Single bits can be flipped */
 #define MTD_NO_ERASE           0x1000  /* No erase necessary */
+#define MTD_STUPID_LOCK                0x2000  /* Always locked after reset */
 
 // Some common devices / combinations of capabilities
 #define MTD_CAP_ROM            0