aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2013-05-21 15:03:46 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2013-08-30 16:52:15 -0400
commitc0fcbc56d93220c772a524e49ed2612fe5787a98 (patch)
treef73c08952c144ed89118e8f92f083459aa991d39
parent8268df26369f7779d3394ec066d72cc00232efe1 (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.c43
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
67static 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
67static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len, 103static 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/**************************************************