[MTD] [MAPS] Extend plat-ram to support a supplied probe type
authorFlorian Fainelli <florian.fainelli@telecomint.eu>
Mon, 3 Mar 2008 17:30:24 +0000 (18:30 +0100)
committerDavid Woodhouse <dwmw2@infradead.org>
Tue, 22 Apr 2008 19:10:10 +0000 (20:10 +0100)
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 (jedec, cfi, amd ..)

A few items are also fixed:
- Don't panic if probes is 0
- Actually use the partition list that is passed in

Signed-off-by: Florian Fainelli <florian.fainelli@telecomint.eu>
Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
drivers/mtd/maps/plat-ram.c
include/linux/mtd/plat-ram.h

index 7160e0eb09af19fc3aeabb6448881c1041d24cb7..f0b10ca0502920240b9fee8e3ff728df1808d451 100644 (file)
@@ -47,6 +47,7 @@ struct platram_info {
        struct mtd_info         *mtd;
        struct map_info          map;
        struct mtd_partition    *partitions;
+       bool                    free_partitions;
        struct resource         *area;
        struct platdata_mtd_ram *pdata;
 };
@@ -98,7 +99,8 @@ static int platram_remove(struct platform_device *pdev)
 #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);
@@ -176,7 +178,8 @@ static int platram_probe(struct platform_device *pdev)
 
        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 */
@@ -203,9 +206,19 @@ static int platram_probe(struct platform_device *pdev)
 
        dev_dbg(&pdev->dev, "initialised map, probing for mtd\n");
 
-       /* probe for the right mtd map driver */
+       /* probe for the right mtd map driver
+        * supplied by the platform_data struct */
+
+       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);
+       }
+       /* fallback to map_ram */
+       else
+               info->mtd = do_map_probe("map_ram", &info->map);
 
-       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;
@@ -220,19 +233,21 @@ static int platram_probe(struct platform_device *pdev)
         * 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,
+       if (!pdata->nr_partitions) {
+               /* try to probe using the supplied probe type */
+               if (pdata->probes) {
+                       err = parse_mtd_partitions(info->mtd, pdata->probes,
                                           &info->partitions, 0);
-               if (err > 0) {
-                       err = add_mtd_partitions(info->mtd, info->partitions,
-                                                err);
+                       info->free_partitions = 1;
+                       if (err > 0)
+                               err = add_mtd_partitions(info->mtd,
+                                       info->partitions, err);
                }
        }
+       /* use the static mapping */
+       else
+               err = add_mtd_partitions(info->mtd, pdata->partitions,
+                               pdata->nr_partitions);
 #endif /* CONFIG_MTD_PARTITIONS */
 
        if (add_mtd_device(info->mtd)) {
@@ -240,7 +255,9 @@ static int platram_probe(struct platform_device *pdev)
                err = -ENOMEM;
        }
 
-       dev_info(&pdev->dev, "registered mtd device\n");
+       if (!err)
+               dev_info(&pdev->dev, "registered mtd device\n");
+
        return err;
 
  exit_free:
index 9667863bd7e3c95496bf0cd0b47e1e589b5ed9ca..0e37ad07bce2bb4895d9913350958d80016b83d5 100644 (file)
@@ -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;