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 * const 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
->bcma_cc
= container_of(sflash
, struct bcma_drv_cc
, sflash
);
66 switch (b47s
->bcma_cc
->capabilities
& BCMA_CC_CAP_FLASHT
) {
67 case BCMA_CC_FLASHT_STSER
:
68 b47s
->type
= BCM47XXSFLASH_TYPE_ST
;
70 case BCMA_CC_FLASHT_ATSER
:
71 b47s
->type
= BCM47XXSFLASH_TYPE_ATMEL
;
75 b47s
->window
= sflash
->window
;
76 b47s
->blocksize
= sflash
->blocksize
;
77 b47s
->numblocks
= sflash
->numblocks
;
78 b47s
->size
= sflash
->size
;
79 bcm47xxsflash_fill_mtd(b47s
);
81 err
= mtd_device_parse_register(&b47s
->mtd
, probes
, NULL
, NULL
, 0);
83 pr_err("Failed to register MTD device: %d\n", err
);
95 static int bcm47xxsflash_bcma_remove(struct platform_device
*pdev
)
97 struct bcma_sflash
*sflash
= dev_get_platdata(&pdev
->dev
);
98 struct bcm47xxsflash
*b47s
= sflash
->priv
;
100 mtd_device_unregister(&b47s
->mtd
);
106 static struct platform_driver bcma_sflash_driver
= {
107 .probe
= bcm47xxsflash_bcma_probe
,
108 .remove
= bcm47xxsflash_bcma_remove
,
110 .name
= "bcma_sflash",
111 .owner
= THIS_MODULE
,
115 /**************************************************
117 **************************************************/
119 static int __init
bcm47xxsflash_init(void)
123 err
= platform_driver_register(&bcma_sflash_driver
);
125 pr_err("Failed to register BCMA serial flash driver: %d\n",
131 static void __exit
bcm47xxsflash_exit(void)
133 platform_driver_unregister(&bcma_sflash_driver
);
136 module_init(bcm47xxsflash_init
);
137 module_exit(bcm47xxsflash_exit
);