mtd: bcm47xxsflash: add own struct for abstrating bus type
authorRafał Miłecki <zajec5@gmail.com>
Sun, 6 Jan 2013 20:28:50 +0000 (21:28 +0100)
committerArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Mon, 4 Feb 2013 07:26:30 +0000 (09:26 +0200)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
drivers/mtd/devices/bcm47xxsflash.c
drivers/mtd/devices/bcm47xxsflash.h [new file with mode: 0644]
include/linux/bcma/bcma_driver_chipcommon.h

index 4714584..8fe1a09 100644 (file)
@@ -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[] = { "bcm47xxpart", NULL };
 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(struct bcma_sflash *sflash,
 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 platform_device *pdev)
        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;
 }
diff --git a/drivers/mtd/devices/bcm47xxsflash.h b/drivers/mtd/devices/bcm47xxsflash.h
new file mode 100644 (file)
index 0000000..ebf6f71
--- /dev/null
@@ -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 */
index 9a0e3fa..a5bfda6 100644 (file)
@@ -528,6 +528,7 @@ struct bcma_sflash {
        u32 size;
 
        struct mtd_info *mtd;
+       void *priv;
 };
 #endif