[PATCH 2.6.15-rc4] mtd: Improvements to plat-ram map
Jason Gunthorpe
jgunthorpe at obsidianresearch.com
Fri Dec 2 23:08:29 EST 2005
This enhances plat-ram to take a map_probes argument in the platform_data
structure which allow plat-ram to support any direct-mapped device that
MTD supports.
A few items are also fixed:
- devinit/devexit are used to mark the driver probe/remove functions
so they can be discarded if hotplug is disabled
- Don't panic if probes is 0
- Actually use the partition list that is passed in
This driver isn't used in tree right now, but the general mechanism
it supports via the driver model could replace code in the simpler
map drivers with a few calls into platform_*.
Signed-off-by: Jason Gunthorpe <jgunthorpe at obsidianresearch.com>
---
drivers/mtd/maps/plat-ram.c | 46 ++++++++++++++++++++++++++----------------
include/linux/mtd/plat-ram.h | 5 +++--
2 files changed, 31 insertions(+), 20 deletions(-)
applies-to: cec49fea2095ec77123684854ed519f01cf890da
53f385a7d61739b1ec209ffddb79f39555bd878c
diff --git a/drivers/mtd/maps/plat-ram.c b/drivers/mtd/maps/plat-ram.c
index 5d3c754..b2aa4aa 100644
--- a/drivers/mtd/maps/plat-ram.c
+++ b/drivers/mtd/maps/plat-ram.c
@@ -47,6 +47,7 @@ struct platram_info {
struct mtd_info *mtd;
struct map_info map;
struct mtd_partition *partitions;
+ int free_partitions;
struct resource *area;
struct platdata_mtd_ram *pdata;
};
@@ -83,7 +84,7 @@ static inline void platram_setrw(struct
* called to remove the device from the driver's control
*/
-static int platram_remove(struct platform_device *pdev)
+static int __devexit platram_remove(struct platform_device *pdev)
{
struct platram_info *info = to_platram_info(pdev);
@@ -98,7 +99,8 @@ static int platram_remove(struct platfor
#ifdef CONFIG_MTD_PARTITIONS
if (info->partitions) {
del_mtd_partitions(info->mtd);
- kfree(info->partitions);
+ if (info->free_partitions)
+ kfree(info->partitions);
}
#endif
del_mtd_device(info->mtd);
@@ -130,7 +132,7 @@ static int platram_remove(struct platfor
* driver is found.
*/
-static int platram_probe(struct platform_device *pdev)
+static int __devinit platram_probe(struct platform_device *pdev)
{
struct platdata_mtd_ram *pdata;
struct platram_info *info;
@@ -176,7 +178,7 @@ static int platram_probe(struct platform
info->map.phys = res->start;
info->map.size = (res->end - res->start) + 1;
- info->map.name = pdata->mapname != NULL ? pdata->mapname : (char *)pdev->name;
+ info->map.name = pdata->mapname != NULL ? (char *)pdata->mapname : (char *)pdev->name;
info->map.bankwidth = pdata->bankwidth;
/* register our usage of the memory area */
@@ -205,7 +207,13 @@ static int platram_probe(struct platform
/* probe for the right mtd map driver */
- info->mtd = do_map_probe("map_ram" , &info->map);
+ if (pdata->map_probes != 0) {
+ const char **map_probes = pdata->map_probes;
+ for(; !info->mtd && *map_probes; map_probes++)
+ info->mtd = do_map_probe(*map_probes , &info->map);
+ }
+ else
+ info->mtd = do_map_probe("map_ram", &info->map);
if (info->mtd == NULL) {
dev_err(&pdev->dev, "failed to probe for map_ram\n");
err = -ENOMEM;
@@ -218,21 +226,23 @@ static int platram_probe(struct platform
/* check to see if there are any available partitions, or wether
* to add this device whole */
-
#ifdef CONFIG_MTD_PARTITIONS
- if (pdata->nr_partitions > 0) {
- const char **probes = { NULL };
-
- if (pdata->probes)
- probes = (const char **)pdata->probes;
-
- err = parse_mtd_partitions(info->mtd, probes,
- &info->partitions, 0);
- if (err > 0) {
- err = add_mtd_partitions(info->mtd, info->partitions,
- err);
+ if (pdata->nr_partitions == 0) {
+ if (pdata->probes) {
+ err = parse_mtd_partitions(info->mtd,
+ pdata->probes,
+ &info->partitions, 0);
+ info->free_partitions = 1;
+ if (err > 0)
+ add_mtd_partitions(info->mtd, info->partitions,
+ err);
}
}
+ else {
+ add_mtd_partitions(info->mtd,pdata->partitions,
+ pdata->nr_partitions);
+ }
+
#endif /* CONFIG_MTD_PARTITIONS */
if (add_mtd_device(info->mtd)) {
@@ -253,7 +263,7 @@ static int platram_probe(struct platform
static struct platform_driver platram_driver = {
.probe = platram_probe,
- .remove = platram_remove,
+ .remove = __devexit_p(platram_remove),
.driver = {
.name = "mtd-ram",
.owner = THIS_MODULE,
diff --git a/include/linux/mtd/plat-ram.h b/include/linux/mtd/plat-ram.h
index 2332eda..2b87684 100644
--- a/include/linux/mtd/plat-ram.h
+++ b/include/linux/mtd/plat-ram.h
@@ -21,8 +21,9 @@
#define PLATRAM_RW (1)
struct platdata_mtd_ram {
- char *mapname;
- char **probes;
+ const char *mapname;
+ const char **map_probes;
+ const char **probes;
struct mtd_partition *partitions;
int nr_partitions;
int bankwidth;
---
0.99.9k
More information about the linux-mtd
mailing list