diff options
author | Maxim Levitsky <maximlevitsky@gmail.com> | 2010-02-22 13:39:40 -0500 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2010-02-26 13:44:57 -0500 |
commit | 93edbad69b0491d794c2ec86bcc65c69eac676e3 (patch) | |
tree | e3bd7b55c549f0373bfc9e3f1082458b9cd10fa2 | |
parent | 5e81e88a4c140586d9212999cea683bcd66a15c6 (diff) |
mtd: Workaround wrong write protect status on some xD cards
Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
-rw-r--r-- | drivers/mtd/nand/nand_base.c | 8 | ||||
-rw-r--r-- | include/linux/mtd/nand.h | 6 |
2 files changed, 13 insertions, 1 deletions
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 1c4823696be2..b9dc65c7253c 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
@@ -434,6 +434,11 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) | |||
434 | static int nand_check_wp(struct mtd_info *mtd) | 434 | static int nand_check_wp(struct mtd_info *mtd) |
435 | { | 435 | { |
436 | struct nand_chip *chip = mtd->priv; | 436 | struct nand_chip *chip = mtd->priv; |
437 | |||
438 | /* broken xD cards report WP despite being writable */ | ||
439 | if (chip->options & NAND_BROKEN_XD) | ||
440 | return 0; | ||
441 | |||
437 | /* Check the WP bit */ | 442 | /* Check the WP bit */ |
438 | chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1); | 443 | chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1); |
439 | return (chip->read_byte(mtd) & NAND_STATUS_WP) ? 0 : 1; | 444 | return (chip->read_byte(mtd) & NAND_STATUS_WP) ? 0 : 1; |
@@ -3175,7 +3180,8 @@ int nand_scan_tail(struct mtd_info *mtd) | |||
3175 | 3180 | ||
3176 | /* Fill in remaining MTD driver data */ | 3181 | /* Fill in remaining MTD driver data */ |
3177 | mtd->type = MTD_NANDFLASH; | 3182 | mtd->type = MTD_NANDFLASH; |
3178 | mtd->flags = MTD_CAP_NANDFLASH; | 3183 | mtd->flags = (chip->options & NAND_ROM) ? MTD_CAP_ROM : |
3184 | MTD_CAP_NANDFLASH; | ||
3179 | mtd->erase = nand_erase; | 3185 | mtd->erase = nand_erase; |
3180 | mtd->point = NULL; | 3186 | mtd->point = NULL; |
3181 | mtd->unpoint = NULL; | 3187 | mtd->unpoint = NULL; |
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index d152bdf9161f..8bdacb885f90 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h | |||
@@ -182,6 +182,12 @@ typedef enum { | |||
182 | /* Chip does not allow subpage writes */ | 182 | /* Chip does not allow subpage writes */ |
183 | #define NAND_NO_SUBPAGE_WRITE 0x00000200 | 183 | #define NAND_NO_SUBPAGE_WRITE 0x00000200 |
184 | 184 | ||
185 | /* Device is one of 'new' xD cards that expose fake nand command set */ | ||
186 | #define NAND_BROKEN_XD 0x00000400 | ||
187 | |||
188 | /* Device behaves just like nand, but is readonly */ | ||
189 | #define NAND_ROM 0x00000800 | ||
190 | |||
185 | /* Options valid for Samsung large page devices */ | 191 | /* Options valid for Samsung large page devices */ |
186 | #define NAND_SAMSUNG_LP_OPTIONS \ | 192 | #define NAND_SAMSUNG_LP_OPTIONS \ |
187 | (NAND_NO_PADDING | NAND_CACHEPRG | NAND_COPYBACK) | 193 | (NAND_NO_PADDING | NAND_CACHEPRG | NAND_COPYBACK) |