if (info->mtd[i] != NULL)
                        map_destroy(info->mtd[i]);
        }
+
+       if (physmap_data->exit)
+               physmap_data->exit(dev);
+
        return 0;
 }
 
                                        "map_rom",
                                        NULL };
 #ifdef CONFIG_MTD_PARTITIONS
-static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
+static const char *part_probe_types[] = { "cmdlinepart", "RedBoot",
+#ifdef CONFIG_MTD_AFS_PARTS
+                                         "afs",
+#endif
+                                         NULL };
 #endif
 
 static int physmap_flash_probe(struct platform_device *dev)
                goto err_out;
        }
 
+       if (physmap_data->init) {
+               err = physmap_data->init(dev);
+               if (err)
+                       goto err_out;
+       }
+
        platform_set_drvdata(dev, info);
 
        for (i = 0; i < dev->num_resources; i++) {
 
 
 struct physmap_flash_data {
        unsigned int            width;
+       int                     (*init)(struct platform_device *);
+       void                    (*exit)(struct platform_device *);
        void                    (*set_vpp)(struct map_info *, int);
        unsigned int            nr_parts;
        unsigned int            pfow_base;