brcm47xx: deactivate mips wait instruction only for BCM4706
[openwrt.git] / target / linux / brcm47xx / patches-3.10 / 052-mtd_bcm47xxsflash_implement_erasing_support.patch
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
4
5 Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
6 ---
7 This has been succesfully tested on BCM4706.
8 ---
9  drivers/mtd/devices/bcm47xxsflash.c |   43 +++++++++++++++++++++++++++++++++--
10  1 file changed, 41 insertions(+), 2 deletions(-)
11
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
15   * MTD ops
16   **************************************************/
17  
18 +static int bcm47xxsflash_erase(struct mtd_info *mtd, struct erase_info *erase)
19 +{
20 +       struct bcm47xxsflash *b47s = mtd->priv;
21 +       int err;
22 +
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.
30 +                */
31 +               if (b47s->blocksize < (64 * 1024))
32 +                       bcm47xxsflash_cmd(b47s, OPCODE_ST_SSE);
33 +               else
34 +                       bcm47xxsflash_cmd(b47s, OPCODE_ST_SE);
35 +               break;
36 +       case BCM47XXSFLASH_TYPE_ATMEL:
37 +               b47s->cc_write(b47s, BCMA_CC_FLASHADDR, erase->addr << 1);
38 +               bcm47xxsflash_cmd(b47s, OPCODE_AT_PAGE_ERASE);
39 +               break;
40 +       }
41 +
42 +       err = bcm47xxsflash_poll(b47s, HZ);
43 +       if (err)
44 +               erase->state = MTD_ERASE_FAILED;
45 +       else
46 +               erase->state = MTD_ERASE_DONE;
47 +
48 +       if (erase->callback)
49 +               erase->callback(erase);
50 +
51 +       return err;
52 +}
53 +
54  static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len,
55                               size_t *retlen, u_char *buf)
56  {
57 @@ -88,12 +124,15 @@ static void bcm47xxsflash_fill_mtd(struc
58         mtd->name = "bcm47xxsflash";
59         mtd->owner = THIS_MODULE;
60         mtd->type = MTD_ROM;
61 -       mtd->size = b47s->size;
62 -       mtd->_read = bcm47xxsflash_read;
63  
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;
69 +
70 +       mtd->_erase = bcm47xxsflash_erase;
71 +       mtd->_read = bcm47xxsflash_read;
72  }
73  
74  /**************************************************