1 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
2 Subject: [PATCH] mtd: bcm47xxsflash: implement erasing support
3 Date: Tue, 21 May 2013 21:03:46 +0200
5 Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
7 This has been succesfully tested on BCM4706.
9 drivers/mtd/devices/bcm47xxsflash.c | 43 +++++++++++++++++++++++++++++++++--
10 1 file changed, 41 insertions(+), 2 deletions(-)
12 --- a/drivers/mtd/devices/bcm47xxsflash.c
13 +++ b/drivers/mtd/devices/bcm47xxsflash.c
14 @@ -64,6 +64,42 @@ static int bcm47xxsflash_poll(struct bcm
16 **************************************************/
18 +static int bcm47xxsflash_erase(struct mtd_info *mtd, struct erase_info *erase)
20 + struct bcm47xxsflash *b47s = mtd->priv;
23 + switch (b47s->type) {
24 + case BCM47XXSFLASH_TYPE_ST:
25 + bcm47xxsflash_cmd(b47s, OPCODE_ST_WREN);
26 + b47s->cc_write(b47s, BCMA_CC_FLASHADDR, erase->addr);
27 + /* Newer flashes have "sub-sectors" which can be erased
28 + * independently with a new command: ST_SSE. The ST_SE command
29 + * erases 64KB just as before.
31 + if (b47s->blocksize < (64 * 1024))
32 + bcm47xxsflash_cmd(b47s, OPCODE_ST_SSE);
34 + bcm47xxsflash_cmd(b47s, OPCODE_ST_SE);
36 + case BCM47XXSFLASH_TYPE_ATMEL:
37 + b47s->cc_write(b47s, BCMA_CC_FLASHADDR, erase->addr << 1);
38 + bcm47xxsflash_cmd(b47s, OPCODE_AT_PAGE_ERASE);
42 + err = bcm47xxsflash_poll(b47s, HZ);
44 + erase->state = MTD_ERASE_FAILED;
46 + erase->state = MTD_ERASE_DONE;
48 + if (erase->callback)
49 + erase->callback(erase);
54 static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len,
55 size_t *retlen, u_char *buf)
57 @@ -88,12 +124,15 @@ static void bcm47xxsflash_fill_mtd(struc
58 mtd->name = "bcm47xxsflash";
59 mtd->owner = THIS_MODULE;
61 - mtd->size = b47s->size;
62 - mtd->_read = bcm47xxsflash_read;
64 /* TODO: implement writing support and verify/change following code */
65 mtd->flags = MTD_CAP_ROM;
66 + mtd->size = b47s->size;
67 + mtd->erasesize = b47s->blocksize;
68 mtd->writebufsize = mtd->writesize = 1;
70 + mtd->_erase = bcm47xxsflash_erase;
71 + mtd->_read = bcm47xxsflash_read;
74 /**************************************************