diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2013-05-21 15:03:46 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2013-08-30 16:52:15 -0400 |
commit | c0fcbc56d93220c772a524e49ed2612fe5787a98 (patch) | |
tree | f73c08952c144ed89118e8f92f083459aa991d39 | |
parent | 8268df26369f7779d3394ec066d72cc00232efe1 (diff) |
mtd: bcm47xxsflash: implement erasing support
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
-rw-r--r-- | drivers/mtd/devices/bcm47xxsflash.c | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/drivers/mtd/devices/bcm47xxsflash.c b/drivers/mtd/devices/bcm47xxsflash.c index e9e38877a571..534cb741b107 100644 --- a/drivers/mtd/devices/bcm47xxsflash.c +++ b/drivers/mtd/devices/bcm47xxsflash.c | |||
@@ -64,6 +64,42 @@ static int bcm47xxsflash_poll(struct bcm47xxsflash *b47s, int timeout) | |||
64 | * MTD ops | 64 | * MTD ops |
65 | **************************************************/ | 65 | **************************************************/ |
66 | 66 | ||
67 | static int bcm47xxsflash_erase(struct mtd_info *mtd, struct erase_info *erase) | ||
68 | { | ||
69 | struct bcm47xxsflash *b47s = mtd->priv; | ||
70 | int err; | ||
71 | |||
72 | switch (b47s->type) { | ||
73 | case BCM47XXSFLASH_TYPE_ST: | ||
74 | bcm47xxsflash_cmd(b47s, OPCODE_ST_WREN); | ||
75 | b47s->cc_write(b47s, BCMA_CC_FLASHADDR, erase->addr); | ||
76 | /* Newer flashes have "sub-sectors" which can be erased | ||
77 | * independently with a new command: ST_SSE. The ST_SE command | ||
78 | * erases 64KB just as before. | ||
79 | */ | ||
80 | if (b47s->blocksize < (64 * 1024)) | ||
81 | bcm47xxsflash_cmd(b47s, OPCODE_ST_SSE); | ||
82 | else | ||
83 | bcm47xxsflash_cmd(b47s, OPCODE_ST_SE); | ||
84 | break; | ||
85 | case BCM47XXSFLASH_TYPE_ATMEL: | ||
86 | b47s->cc_write(b47s, BCMA_CC_FLASHADDR, erase->addr << 1); | ||
87 | bcm47xxsflash_cmd(b47s, OPCODE_AT_PAGE_ERASE); | ||
88 | break; | ||
89 | } | ||
90 | |||
91 | err = bcm47xxsflash_poll(b47s, HZ); | ||
92 | if (err) | ||
93 | erase->state = MTD_ERASE_FAILED; | ||
94 | else | ||
95 | erase->state = MTD_ERASE_DONE; | ||
96 | |||
97 | if (erase->callback) | ||
98 | erase->callback(erase); | ||
99 | |||
100 | return err; | ||
101 | } | ||
102 | |||
67 | static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len, | 103 | static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len, |
68 | size_t *retlen, u_char *buf) | 104 | size_t *retlen, u_char *buf) |
69 | { | 105 | { |
@@ -88,12 +124,15 @@ static void bcm47xxsflash_fill_mtd(struct bcm47xxsflash *b47s) | |||
88 | mtd->name = "bcm47xxsflash"; | 124 | mtd->name = "bcm47xxsflash"; |
89 | mtd->owner = THIS_MODULE; | 125 | mtd->owner = THIS_MODULE; |
90 | mtd->type = MTD_ROM; | 126 | mtd->type = MTD_ROM; |
91 | mtd->size = b47s->size; | ||
92 | mtd->_read = bcm47xxsflash_read; | ||
93 | 127 | ||
94 | /* TODO: implement writing support and verify/change following code */ | 128 | /* TODO: implement writing support and verify/change following code */ |
95 | mtd->flags = MTD_CAP_ROM; | 129 | mtd->flags = MTD_CAP_ROM; |
130 | mtd->size = b47s->size; | ||
131 | mtd->erasesize = b47s->blocksize; | ||
96 | mtd->writebufsize = mtd->writesize = 1; | 132 | mtd->writebufsize = mtd->writesize = 1; |
133 | |||
134 | mtd->_erase = bcm47xxsflash_erase; | ||
135 | mtd->_read = bcm47xxsflash_read; | ||
97 | } | 136 | } |
98 | 137 | ||
99 | /************************************************** | 138 | /************************************************** |