mtd/maps: uclinux: depend on MTD_RAM being built into the kernel
[safe/jmp/linux-2.6] / drivers / mtd / maps / physmap.c
index d3a2acc..380648e 100644 (file)
@@ -29,6 +29,7 @@ struct physmap_flash_info {
        struct map_info         map[MAX_RESOURCES];
 #ifdef CONFIG_MTD_PARTITIONS
        int                     nr_parts;
+       struct mtd_partition    *parts;
 #endif
 };
 
@@ -45,30 +46,39 @@ static int physmap_flash_remove(struct platform_device *dev)
 
        physmap_data = dev->dev.platform_data;
 
-#ifdef CONFIG_MTD_CONCAT
-       if (info->cmtd != info->mtd[0]) {
+       if (info->cmtd) {
+#ifdef CONFIG_MTD_PARTITIONS
+               if (info->nr_parts || physmap_data->nr_parts)
+                       del_mtd_partitions(info->cmtd);
+               else
+                       del_mtd_device(info->cmtd);
+#else
                del_mtd_device(info->cmtd);
-               mtd_concat_destroy(info->cmtd);
+#endif
        }
+#ifdef CONFIG_MTD_PARTITIONS
+       if (info->nr_parts)
+               kfree(info->parts);
 #endif
 
-       for (i = 0; i < MAX_RESOURCES; i++) {
-               if (info->mtd[i] != NULL) {
-#ifdef CONFIG_MTD_PARTITIONS
-                       if (info->nr_parts || physmap_data->nr_parts)
-                               del_mtd_partitions(info->mtd[i]);
-                       else
-                               del_mtd_device(info->mtd[i]);
-#else
-                       del_mtd_device(info->mtd[i]);
+#ifdef CONFIG_MTD_CONCAT
+       if (info->cmtd != info->mtd[0])
+               mtd_concat_destroy(info->cmtd);
 #endif
+
+       for (i = 0; i < MAX_RESOURCES; i++) {
+               if (info->mtd[i] != NULL)
                        map_destroy(info->mtd[i]);
-               }
        }
        return 0;
 }
 
-static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", "map_rom", NULL };
+static const char *rom_probe_types[] = {
+                                       "cfi_probe",
+                                       "jedec_probe",
+                                       "qinfo_probe",
+                                       "map_rom",
+                                       NULL };
 #ifdef CONFIG_MTD_PARTITIONS
 static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
 #endif
@@ -81,9 +91,6 @@ static int physmap_flash_probe(struct platform_device *dev)
        int err = 0;
        int i;
        int devices_found = 0;
-#ifdef CONFIG_MTD_PARTITIONS
-       struct mtd_partition *parts;
-#endif
 
        physmap_data = dev->dev.platform_data;
        if (physmap_data == NULL)
@@ -117,6 +124,7 @@ static int physmap_flash_probe(struct platform_device *dev)
                info->map[i].size = dev->resource[i].end - dev->resource[i].start + 1;
                info->map[i].bankwidth = physmap_data->width;
                info->map[i].set_vpp = physmap_data->set_vpp;
+               info->map[i].pfow_base = physmap_data->pfow_base;
 
                info->map[i].virt = devm_ioremap(&dev->dev, info->map[i].phys,
                                                 info->map[i].size);
@@ -139,6 +147,7 @@ static int physmap_flash_probe(struct platform_device *dev)
                        devices_found++;
                }
                info->mtd[i]->owner = THIS_MODULE;
+               info->mtd[i]->dev.parent = &dev->dev;
        }
 
        if (devices_found == 1) {
@@ -161,10 +170,11 @@ static int physmap_flash_probe(struct platform_device *dev)
                goto err_out;
 
 #ifdef CONFIG_MTD_PARTITIONS
-       err = parse_mtd_partitions(info->cmtd, part_probe_types, &parts, 0);
+       err = parse_mtd_partitions(info->cmtd, part_probe_types,
+                               &info->parts, 0);
        if (err > 0) {
-               add_mtd_partitions(info->cmtd, parts, err);
-               kfree(parts);
+               add_mtd_partitions(info->cmtd, info->parts, err);
+               info->nr_parts = err;
                return 0;
        }
 
@@ -185,42 +195,6 @@ err_out:
 }
 
 #ifdef CONFIG_PM
-static int physmap_flash_suspend(struct platform_device *dev, pm_message_t state)
-{
-       struct physmap_flash_info *info = platform_get_drvdata(dev);
-       int ret = 0;
-       int i;
-
-       for (i = 0; i < MAX_RESOURCES && info->mtd[i]; i++)
-               if (info->mtd[i]->suspend) {
-                       ret = info->mtd[i]->suspend(info->mtd[i]);
-                       if (ret)
-                               goto fail;
-               }
-
-       return 0;
-fail:
-       for (--i; i >= 0; --i)
-               if (info->mtd[i]->suspend) {
-                       BUG_ON(!info->mtd[i]->resume);
-                       info->mtd[i]->resume(info->mtd[i]);
-               }
-
-       return ret;
-}
-
-static int physmap_flash_resume(struct platform_device *dev)
-{
-       struct physmap_flash_info *info = platform_get_drvdata(dev);
-       int i;
-
-       for (i = 0; i < MAX_RESOURCES && info->mtd[i]; i++)
-               if (info->mtd[i]->resume)
-                       info->mtd[i]->resume(info->mtd[i]);
-
-       return 0;
-}
-
 static void physmap_flash_shutdown(struct platform_device *dev)
 {
        struct physmap_flash_info *info = platform_get_drvdata(dev);
@@ -232,16 +206,12 @@ static void physmap_flash_shutdown(struct platform_device *dev)
                                info->mtd[i]->resume(info->mtd[i]);
 }
 #else
-#define physmap_flash_suspend NULL
-#define physmap_flash_resume NULL
 #define physmap_flash_shutdown NULL
 #endif
 
 static struct platform_driver physmap_flash_driver = {
        .probe          = physmap_flash_probe,
        .remove         = physmap_flash_remove,
-       .suspend        = physmap_flash_suspend,
-       .resume         = physmap_flash_resume,
        .shutdown       = physmap_flash_shutdown,
        .driver         = {
                .name   = "physmap-flash",