diff options
Diffstat (limited to 'target/linux/brcm47xx/patches-3.8/030-mtd-bcm47xxsflash-add-own-struct-for-abstrating-bus-.patch')
-rw-r--r-- | target/linux/brcm47xx/patches-3.8/030-mtd-bcm47xxsflash-add-own-struct-for-abstrating-bus-.patch | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/target/linux/brcm47xx/patches-3.8/030-mtd-bcm47xxsflash-add-own-struct-for-abstrating-bus-.patch b/target/linux/brcm47xx/patches-3.8/030-mtd-bcm47xxsflash-add-own-struct-for-abstrating-bus-.patch new file mode 100644 index 0000000000..30bdbb2a81 --- /dev/null +++ b/target/linux/brcm47xx/patches-3.8/030-mtd-bcm47xxsflash-add-own-struct-for-abstrating-bus-.patch @@ -0,0 +1,123 @@ +--- a/drivers/mtd/devices/bcm47xxsflash.c ++++ b/drivers/mtd/devices/bcm47xxsflash.c +@@ -5,6 +5,8 @@ + #include <linux/platform_device.h> + #include <linux/bcma/bcma.h> + ++#include "bcm47xxsflash.h" ++ + MODULE_LICENSE("GPL"); + MODULE_DESCRIPTION("Serial flash driver for BCMA bus"); + +@@ -13,26 +15,27 @@ static const char *probes[] = { "bcm47xx + static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) + { +- struct bcma_sflash *sflash = mtd->priv; ++ struct bcm47xxsflash *b47s = mtd->priv; + + /* Check address range */ + if ((from + len) > mtd->size) + return -EINVAL; + +- memcpy_fromio(buf, (void __iomem *)KSEG0ADDR(sflash->window + from), ++ memcpy_fromio(buf, (void __iomem *)KSEG0ADDR(b47s->window + from), + len); + + return len; + } + +-static void bcm47xxsflash_fill_mtd(struct bcma_sflash *sflash, +- struct mtd_info *mtd) ++static void bcm47xxsflash_fill_mtd(struct bcm47xxsflash *b47s) + { +- mtd->priv = sflash; ++ struct mtd_info *mtd = &b47s->mtd; ++ ++ mtd->priv = b47s; + mtd->name = "bcm47xxsflash"; + mtd->owner = THIS_MODULE; + mtd->type = MTD_ROM; +- mtd->size = sflash->size; ++ mtd->size = b47s->size; + mtd->_read = bcm47xxsflash_read; + + /* TODO: implement writing support and verify/change following code */ +@@ -43,16 +46,23 @@ static void bcm47xxsflash_fill_mtd(struc + static int bcm47xxsflash_probe(struct platform_device *pdev) + { + struct bcma_sflash *sflash = dev_get_platdata(&pdev->dev); ++ struct bcm47xxsflash *b47s; + int err; + +- sflash->mtd = kzalloc(sizeof(struct mtd_info), GFP_KERNEL); +- if (!sflash->mtd) { ++ b47s = kzalloc(sizeof(*b47s), GFP_KERNEL); ++ if (!b47s) { + err = -ENOMEM; + goto out; + } +- bcm47xxsflash_fill_mtd(sflash, sflash->mtd); ++ sflash->priv = b47s; ++ ++ b47s->window = sflash->window; ++ b47s->blocksize = sflash->blocksize; ++ b47s->numblocks = sflash->numblocks; ++ b47s->size = sflash->size; ++ bcm47xxsflash_fill_mtd(b47s); + +- err = mtd_device_parse_register(sflash->mtd, probes, NULL, NULL, 0); ++ err = mtd_device_parse_register(&b47s->mtd, probes, NULL, NULL, 0); + if (err) { + pr_err("Failed to register MTD device: %d\n", err); + goto err_dev_reg; +@@ -61,7 +71,7 @@ static int bcm47xxsflash_probe(struct pl + return 0; + + err_dev_reg: +- kfree(sflash->mtd); ++ kfree(&b47s->mtd); + out: + return err; + } +@@ -69,9 +79,10 @@ out: + static int bcm47xxsflash_remove(struct platform_device *pdev) + { + struct bcma_sflash *sflash = dev_get_platdata(&pdev->dev); ++ struct bcm47xxsflash *b47s = sflash->priv; + +- mtd_device_unregister(sflash->mtd); +- kfree(sflash->mtd); ++ mtd_device_unregister(&b47s->mtd); ++ kfree(b47s); + + return 0; + } +--- /dev/null ++++ b/drivers/mtd/devices/bcm47xxsflash.h +@@ -0,0 +1,15 @@ ++#ifndef __BCM47XXSFLASH_H ++#define __BCM47XXSFLASH_H ++ ++#include <linux/mtd/mtd.h> ++ ++struct bcm47xxsflash { ++ u32 window; ++ u32 blocksize; ++ u16 numblocks; ++ u32 size; ++ ++ struct mtd_info mtd; ++}; ++ ++#endif /* BCM47XXSFLASH */ +--- a/include/linux/bcma/bcma_driver_chipcommon.h ++++ b/include/linux/bcma/bcma_driver_chipcommon.h +@@ -528,6 +528,7 @@ struct bcma_sflash { + u32 size; + + struct mtd_info *mtd; ++ void *priv; + }; + #endif + |