1 #include <linux/kernel.h>
2 #include <linux/module.h>
3 #include <linux/slab.h>
4 #include <linux/mtd/mtd.h>
5 #include <linux/platform_device.h>
6 #include <linux/bcma/bcma.h>
8 #include "bcm47xxsflash.h"
10 MODULE_LICENSE("GPL");
11 MODULE_DESCRIPTION("Serial flash driver for BCMA bus");
13 static const char *probes
[] = { "bcm47xxpart", NULL
};
15 static int bcm47xxsflash_read(struct mtd_info
*mtd
, loff_t from
, size_t len
,
16 size_t *retlen
, u_char
*buf
)
18 struct bcm47xxsflash
*b47s
= mtd
->priv
;
20 /* Check address range */
21 if ((from
+ len
) > mtd
->size
)
24 memcpy_fromio(buf
, (void __iomem
*)KSEG0ADDR(b47s
->window
+ from
),
31 static void bcm47xxsflash_fill_mtd(struct bcm47xxsflash
*b47s
)
33 struct mtd_info
*mtd
= &b47s
->mtd
;
36 mtd
->name
= "bcm47xxsflash";
37 mtd
->owner
= THIS_MODULE
;
39 mtd
->size
= b47s
->size
;
40 mtd
->_read
= bcm47xxsflash_read
;
42 /* TODO: implement writing support and verify/change following code */
43 mtd
->flags
= MTD_CAP_ROM
;
44 mtd
->writebufsize
= mtd
->writesize
= 1;
47 /**************************************************
49 **************************************************/
51 static int bcm47xxsflash_bcma_probe(struct platform_device
*pdev
)
53 struct bcma_sflash
*sflash
= dev_get_platdata(&pdev
->dev
);
54 struct bcm47xxsflash
*b47s
;
57 b47s
= kzalloc(sizeof(*b47s
), GFP_KERNEL
);
64 b47s
->window
= sflash
->window
;
65 b47s
->blocksize
= sflash
->blocksize
;
66 b47s
->numblocks
= sflash
->numblocks
;
67 b47s
->size
= sflash
->size
;
68 bcm47xxsflash_fill_mtd(b47s
);
70 err
= mtd_device_parse_register(&b47s
->mtd
, probes
, NULL
, NULL
, 0);
72 pr_err("Failed to register MTD device: %d\n", err
);
84 static int bcm47xxsflash_bcma_remove(struct platform_device
*pdev
)
86 struct bcma_sflash
*sflash
= dev_get_platdata(&pdev
->dev
);
87 struct bcm47xxsflash
*b47s
= sflash
->priv
;
89 mtd_device_unregister(&b47s
->mtd
);
95 static struct platform_driver bcma_sflash_driver
= {
96 .probe
= bcm47xxsflash_bcma_probe
,
97 .remove
= bcm47xxsflash_bcma_remove
,
99 .name
= "bcma_sflash",
100 .owner
= THIS_MODULE
,
104 /**************************************************
106 **************************************************/
108 static int __init
bcm47xxsflash_init(void)
112 err
= platform_driver_register(&bcma_sflash_driver
);
114 pr_err("Failed to register BCMA serial flash driver: %d\n",
120 static void __exit
bcm47xxsflash_exit(void)
122 platform_driver_unregister(&bcma_sflash_driver
);
125 module_init(bcm47xxsflash_init
);
126 module_exit(bcm47xxsflash_exit
);