diff options
author | Håvard Skinnemoen <hskinnemoen@atmel.com> | 2006-09-22 05:07:08 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2006-09-22 05:07:08 -0400 |
commit | 187ef15268e638603dea55a91fdfa29feaed6d13 (patch) | |
tree | a3895b43f90ed87ae54e3b066468ac2c8fdf31ee | |
parent | e478bec0ba0a83a48a0f6982934b6de079e7e6b3 (diff) |
[MTD] Unlock NOR flash automatically where necessary
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>
-rw-r--r-- | drivers/mtd/chips/cfi_cmdset_0002.c | 1 | ||||
-rw-r--r-- | drivers/mtd/mtdcore.c | 10 | ||||
-rw-r--r-- | include/mtd/mtd-abi.h | 1 |
3 files changed, 12 insertions, 0 deletions
diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c index a482e8922de1..702ae4cd8691 100644 --- a/drivers/mtd/chips/cfi_cmdset_0002.c +++ b/drivers/mtd/chips/cfi_cmdset_0002.c | |||
@@ -212,6 +212,7 @@ static void fixup_use_atmel_lock(struct mtd_info *mtd, void *param) | |||
212 | { | 212 | { |
213 | mtd->lock = cfi_atmel_lock; | 213 | mtd->lock = cfi_atmel_lock; |
214 | mtd->unlock = cfi_atmel_unlock; | 214 | mtd->unlock = cfi_atmel_unlock; |
215 | mtd->flags |= MTD_STUPID_LOCK; | ||
215 | } | 216 | } |
216 | 217 | ||
217 | static struct cfi_fixup cfi_fixup_table[] = { | 218 | static struct cfi_fixup cfi_fixup_table[] = { |
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 168d3ba063c3..c4d26de74349 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c | |||
@@ -57,6 +57,16 @@ int add_mtd_device(struct mtd_info *mtd) | |||
57 | mtd->index = i; | 57 | mtd->index = i; |
58 | mtd->usecount = 0; | 58 | mtd->usecount = 0; |
59 | 59 | ||
60 | /* Some chips always power up locked. Unlock them now */ | ||
61 | if ((mtd->flags & MTD_WRITEABLE) | ||
62 | && (mtd->flags & MTD_STUPID_LOCK) && mtd->unlock) { | ||
63 | if (mtd->unlock(mtd, 0, mtd->size)) | ||
64 | printk(KERN_WARNING | ||
65 | "%s: unlock failed, " | ||
66 | "writes may not work\n", | ||
67 | mtd->name); | ||
68 | } | ||
69 | |||
60 | DEBUG(0, "mtd: Giving out device %d to %s\n",i, mtd->name); | 70 | DEBUG(0, "mtd: Giving out device %d to %s\n",i, mtd->name); |
61 | /* No need to get a refcount on the module containing | 71 | /* No need to get a refcount on the module containing |
62 | the notifier, since we hold the mtd_table_mutex */ | 72 | the notifier, since we hold the mtd_table_mutex */ |
diff --git a/include/mtd/mtd-abi.h b/include/mtd/mtd-abi.h index 1da3f7fa7993..b0a67b7ffdcd 100644 --- a/include/mtd/mtd-abi.h +++ b/include/mtd/mtd-abi.h | |||
@@ -34,6 +34,7 @@ struct mtd_oob_buf { | |||
34 | #define MTD_WRITEABLE 0x400 /* Device is writeable */ | 34 | #define MTD_WRITEABLE 0x400 /* Device is writeable */ |
35 | #define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */ | 35 | #define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */ |
36 | #define MTD_NO_ERASE 0x1000 /* No erase necessary */ | 36 | #define MTD_NO_ERASE 0x1000 /* No erase necessary */ |
37 | #define MTD_STUPID_LOCK 0x2000 /* Always locked after reset */ | ||
37 | 38 | ||
38 | // Some common devices / combinations of capabilities | 39 | // Some common devices / combinations of capabilities |
39 | #define MTD_CAP_ROM 0 | 40 | #define MTD_CAP_ROM 0 |