mtd: maps: Prepare merging of physmap and physmap_of
authorBoris Brezillon <boris.brezillon@bootlin.com>
Fri, 19 Oct 2018 07:49:03 +0000 (09:49 +0200)
committerBoris Brezillon <boris.brezillon@bootlin.com>
Mon, 5 Nov 2018 21:24:20 +0000 (22:24 +0100)
We want to merge the physmap and physmap_of driver, but before we can
do that we must prepare things to create physmap.o out of several .c
files. Rename physmap.c into physmap-core.c and add a new Makefile
rule to create physmap.o (right now it only contains physmap-core.o).

Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
Reviewed-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
drivers/mtd/maps/Makefile
drivers/mtd/maps/physmap-core.c [new file with mode: 0644]
drivers/mtd/maps/physmap.c [deleted file]

index 51acf1fec19b54bce18f66893e901024f1574899..2574909edffd811117a22e033472d99454b991b8 100644 (file)
@@ -17,6 +17,8 @@ obj-$(CONFIG_MTD_ICHXROM)     += ichxrom.o
 obj-$(CONFIG_MTD_CK804XROM)    += ck804xrom.o
 obj-$(CONFIG_MTD_TSUNAMI)      += tsunami_flash.o
 obj-$(CONFIG_MTD_PXA2XX)       += pxa2xx-flash.o
+physmap-objs-y                 += physmap-core.o
+physmap-objs                   := $(physmap-objs-y)
 obj-$(CONFIG_MTD_PHYSMAP)      += physmap.o
 physmap_of-objs-y              += physmap_of_core.o
 physmap_of-objs-$(CONFIG_MTD_PHYSMAP_OF_VERSATILE) += physmap_of_versatile.o
diff --git a/drivers/mtd/maps/physmap-core.c b/drivers/mtd/maps/physmap-core.c
new file mode 100644 (file)
index 0000000..e27051b
--- /dev/null
@@ -0,0 +1,295 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Normal mappings of chips in physical memory
+ *
+ * Copyright (C) 2003 MontaVista Software Inc.
+ * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net
+ *
+ * 031022 - [jsun] add run-time configure and partition setup
+ */
+
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/physmap.h>
+#include <linux/mtd/concat.h>
+#include <linux/io.h>
+
+struct physmap_flash_info {
+       unsigned int            nmaps;
+       struct mtd_info         **mtds;
+       struct mtd_info         *cmtd;
+       struct map_info         *maps;
+       spinlock_t              vpp_lock;
+       int                     vpp_refcnt;
+};
+
+static int physmap_flash_remove(struct platform_device *dev)
+{
+       struct physmap_flash_info *info;
+       struct physmap_flash_data *physmap_data;
+       int i, err;
+
+       info = platform_get_drvdata(dev);
+       if (!info)
+               return 0;
+
+       physmap_data = dev_get_platdata(&dev->dev);
+
+       if (info->cmtd) {
+               err = mtd_device_unregister(info->cmtd);
+               if (err)
+                       return err;
+
+               if (info->cmtd != info->mtds[0])
+                       mtd_concat_destroy(info->cmtd);
+       }
+
+       for (i = 0; i < info->nmaps; i++) {
+               if (info->mtds[i])
+                       map_destroy(info->mtds[i]);
+       }
+
+       if (physmap_data->exit)
+               physmap_data->exit(dev);
+
+       return 0;
+}
+
+static void physmap_set_vpp(struct map_info *map, int state)
+{
+       struct platform_device *pdev;
+       struct physmap_flash_data *physmap_data;
+       struct physmap_flash_info *info;
+       unsigned long flags;
+
+       pdev = (struct platform_device *)map->map_priv_1;
+       physmap_data = dev_get_platdata(&pdev->dev);
+
+       if (!physmap_data->set_vpp)
+               return;
+
+       info = platform_get_drvdata(pdev);
+
+       spin_lock_irqsave(&info->vpp_lock, flags);
+       if (state) {
+               if (++info->vpp_refcnt == 1)    /* first nested 'on' */
+                       physmap_data->set_vpp(pdev, 1);
+       } else {
+               if (--info->vpp_refcnt == 0)    /* last nested 'off' */
+                       physmap_data->set_vpp(pdev, 0);
+       }
+       spin_unlock_irqrestore(&info->vpp_lock, flags);
+}
+
+static const char * const rom_probe_types[] = {
+       "cfi_probe", "jedec_probe", "qinfo_probe", "map_rom", NULL
+};
+
+static const char * const part_probe_types[] = {
+       "cmdlinepart", "RedBoot", "afs", NULL
+};
+
+static int physmap_flash_probe(struct platform_device *dev)
+{
+       struct physmap_flash_data *physmap_data;
+       struct physmap_flash_info *info;
+       const char * const *probe_type;
+       const char * const *part_types;
+       int err = 0;
+       int i;
+
+       physmap_data = dev_get_platdata(&dev->dev);
+       if (!physmap_data)
+               return -ENODEV;
+
+       info = devm_kzalloc(&dev->dev, sizeof(*info), GFP_KERNEL);
+       if (!info)
+               return -ENOMEM;
+
+       while (platform_get_resource(dev, IORESOURCE_MEM, info->nmaps))
+               info->nmaps++;
+
+       if (!info->nmaps)
+               return -ENODEV;
+
+       info->maps = devm_kzalloc(&dev->dev,
+                                 sizeof(*info->maps) * info->nmaps,
+                                 GFP_KERNEL);
+       if (!info->maps)
+               return -ENOMEM;
+
+       info->mtds = devm_kzalloc(&dev->dev,
+                                 sizeof(*info->mtds) * info->nmaps,
+                                 GFP_KERNEL);
+       if (!info->mtds)
+               return -ENOMEM;
+
+       if (physmap_data->init) {
+               err = physmap_data->init(dev);
+               if (err)
+                       goto err_out;
+       }
+
+       platform_set_drvdata(dev, info);
+
+       for (i = 0; i < info->nmaps; i++) {
+               struct resource *res;
+
+               res = platform_get_resource(dev, IORESOURCE_MEM, i);
+               info->maps[i].virt = devm_ioremap_resource(&dev->dev, res);
+               if (IS_ERR(info->maps[i].virt)) {
+                       err = PTR_ERR(info->maps[i].virt);
+                       goto err_out;
+               }
+
+               dev_notice(&dev->dev, "physmap platform flash device: %pR\n",
+                          res);
+
+               info->maps[i].name = dev_name(&dev->dev);
+               info->maps[i].phys = res->start;
+               info->maps[i].size = resource_size(res);
+               info->maps[i].bankwidth = physmap_data->width;
+               info->maps[i].set_vpp = physmap_set_vpp;
+               info->maps[i].pfow_base = physmap_data->pfow_base;
+               info->maps[i].map_priv_1 = (unsigned long)dev;
+
+               simple_map_init(&info->maps[i]);
+
+               probe_type = rom_probe_types;
+               if (!physmap_data->probe_type) {
+                       for (; !info->mtds[i] && *probe_type; probe_type++)
+                               info->mtds[i] = do_map_probe(*probe_type,
+                                                            &info->maps[i]);
+               } else {
+                       info->mtds[i] = do_map_probe(physmap_data->probe_type,
+                                                    &info->maps[i]);
+               }
+
+               if (!info->mtds[i]) {
+                       dev_err(&dev->dev, "map_probe failed\n");
+                       err = -ENXIO;
+                       goto err_out;
+               }
+               info->mtds[i]->dev.parent = &dev->dev;
+       }
+
+       if (info->nmaps == 1) {
+               info->cmtd = info->mtds[0];
+       } else {
+               /*
+                * We detected multiple devices. Concatenate them together.
+                */
+               info->cmtd = mtd_concat_create(info->mtds, info->nmaps,
+                                              dev_name(&dev->dev));
+               if (!info->cmtd)
+                       err = -ENXIO;
+       }
+       if (err)
+               goto err_out;
+
+       spin_lock_init(&info->vpp_lock);
+
+       part_types = physmap_data->part_probe_types ? : part_probe_types;
+
+       err = mtd_device_parse_register(info->cmtd, part_types, NULL,
+                                       physmap_data->parts,
+                                       physmap_data->nr_parts);
+       if (err)
+               goto err_out;
+
+       return 0;
+
+err_out:
+       physmap_flash_remove(dev);
+       return err;
+}
+
+#ifdef CONFIG_PM
+static void physmap_flash_shutdown(struct platform_device *dev)
+{
+       struct physmap_flash_info *info = platform_get_drvdata(dev);
+       int i;
+
+       for (i = 0; i < info->nmaps && info->mtds[i]; i++)
+               if (mtd_suspend(info->mtds[i]) == 0)
+                       mtd_resume(info->mtds[i]);
+}
+#else
+#define physmap_flash_shutdown NULL
+#endif
+
+static struct platform_driver physmap_flash_driver = {
+       .probe          = physmap_flash_probe,
+       .remove         = physmap_flash_remove,
+       .shutdown       = physmap_flash_shutdown,
+       .driver         = {
+               .name   = "physmap-flash",
+       },
+};
+
+#ifdef CONFIG_MTD_PHYSMAP_COMPAT
+static struct physmap_flash_data physmap_flash_data = {
+       .width          = CONFIG_MTD_PHYSMAP_BANKWIDTH,
+};
+
+static struct resource physmap_flash_resource = {
+       .start          = CONFIG_MTD_PHYSMAP_START,
+       .end            = CONFIG_MTD_PHYSMAP_START + CONFIG_MTD_PHYSMAP_LEN - 1,
+       .flags          = IORESOURCE_MEM,
+};
+
+static struct platform_device physmap_flash = {
+       .name           = "physmap-flash",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &physmap_flash_data,
+       },
+       .num_resources  = 1,
+       .resource       = &physmap_flash_resource,
+};
+#endif
+
+static int __init physmap_init(void)
+{
+       int err;
+
+       err = platform_driver_register(&physmap_flash_driver);
+#ifdef CONFIG_MTD_PHYSMAP_COMPAT
+       if (err == 0) {
+               err = platform_device_register(&physmap_flash);
+               if (err)
+                       platform_driver_unregister(&physmap_flash_driver);
+       }
+#endif
+
+       return err;
+}
+
+static void __exit physmap_exit(void)
+{
+#ifdef CONFIG_MTD_PHYSMAP_COMPAT
+       platform_device_unregister(&physmap_flash);
+#endif
+       platform_driver_unregister(&physmap_flash_driver);
+}
+
+module_init(physmap_init);
+module_exit(physmap_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
+MODULE_DESCRIPTION("Generic configurable MTD map driver");
+
+/* legacy platform drivers can't hotplug or coldplg */
+#ifndef CONFIG_MTD_PHYSMAP_COMPAT
+/* work with hotplug and coldplug */
+MODULE_ALIAS("platform:physmap-flash");
+#endif
diff --git a/drivers/mtd/maps/physmap.c b/drivers/mtd/maps/physmap.c
deleted file mode 100644 (file)
index e27051b..0000000
+++ /dev/null
@@ -1,295 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Normal mappings of chips in physical memory
- *
- * Copyright (C) 2003 MontaVista Software Inc.
- * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net
- *
- * 031022 - [jsun] add run-time configure and partition setup
- */
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/device.h>
-#include <linux/platform_device.h>
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/map.h>
-#include <linux/mtd/partitions.h>
-#include <linux/mtd/physmap.h>
-#include <linux/mtd/concat.h>
-#include <linux/io.h>
-
-struct physmap_flash_info {
-       unsigned int            nmaps;
-       struct mtd_info         **mtds;
-       struct mtd_info         *cmtd;
-       struct map_info         *maps;
-       spinlock_t              vpp_lock;
-       int                     vpp_refcnt;
-};
-
-static int physmap_flash_remove(struct platform_device *dev)
-{
-       struct physmap_flash_info *info;
-       struct physmap_flash_data *physmap_data;
-       int i, err;
-
-       info = platform_get_drvdata(dev);
-       if (!info)
-               return 0;
-
-       physmap_data = dev_get_platdata(&dev->dev);
-
-       if (info->cmtd) {
-               err = mtd_device_unregister(info->cmtd);
-               if (err)
-                       return err;
-
-               if (info->cmtd != info->mtds[0])
-                       mtd_concat_destroy(info->cmtd);
-       }
-
-       for (i = 0; i < info->nmaps; i++) {
-               if (info->mtds[i])
-                       map_destroy(info->mtds[i]);
-       }
-
-       if (physmap_data->exit)
-               physmap_data->exit(dev);
-
-       return 0;
-}
-
-static void physmap_set_vpp(struct map_info *map, int state)
-{
-       struct platform_device *pdev;
-       struct physmap_flash_data *physmap_data;
-       struct physmap_flash_info *info;
-       unsigned long flags;
-
-       pdev = (struct platform_device *)map->map_priv_1;
-       physmap_data = dev_get_platdata(&pdev->dev);
-
-       if (!physmap_data->set_vpp)
-               return;
-
-       info = platform_get_drvdata(pdev);
-
-       spin_lock_irqsave(&info->vpp_lock, flags);
-       if (state) {
-               if (++info->vpp_refcnt == 1)    /* first nested 'on' */
-                       physmap_data->set_vpp(pdev, 1);
-       } else {
-               if (--info->vpp_refcnt == 0)    /* last nested 'off' */
-                       physmap_data->set_vpp(pdev, 0);
-       }
-       spin_unlock_irqrestore(&info->vpp_lock, flags);
-}
-
-static const char * const rom_probe_types[] = {
-       "cfi_probe", "jedec_probe", "qinfo_probe", "map_rom", NULL
-};
-
-static const char * const part_probe_types[] = {
-       "cmdlinepart", "RedBoot", "afs", NULL
-};
-
-static int physmap_flash_probe(struct platform_device *dev)
-{
-       struct physmap_flash_data *physmap_data;
-       struct physmap_flash_info *info;
-       const char * const *probe_type;
-       const char * const *part_types;
-       int err = 0;
-       int i;
-
-       physmap_data = dev_get_platdata(&dev->dev);
-       if (!physmap_data)
-               return -ENODEV;
-
-       info = devm_kzalloc(&dev->dev, sizeof(*info), GFP_KERNEL);
-       if (!info)
-               return -ENOMEM;
-
-       while (platform_get_resource(dev, IORESOURCE_MEM, info->nmaps))
-               info->nmaps++;
-
-       if (!info->nmaps)
-               return -ENODEV;
-
-       info->maps = devm_kzalloc(&dev->dev,
-                                 sizeof(*info->maps) * info->nmaps,
-                                 GFP_KERNEL);
-       if (!info->maps)
-               return -ENOMEM;
-
-       info->mtds = devm_kzalloc(&dev->dev,
-                                 sizeof(*info->mtds) * info->nmaps,
-                                 GFP_KERNEL);
-       if (!info->mtds)
-               return -ENOMEM;
-
-       if (physmap_data->init) {
-               err = physmap_data->init(dev);
-               if (err)
-                       goto err_out;
-       }
-
-       platform_set_drvdata(dev, info);
-
-       for (i = 0; i < info->nmaps; i++) {
-               struct resource *res;
-
-               res = platform_get_resource(dev, IORESOURCE_MEM, i);
-               info->maps[i].virt = devm_ioremap_resource(&dev->dev, res);
-               if (IS_ERR(info->maps[i].virt)) {
-                       err = PTR_ERR(info->maps[i].virt);
-                       goto err_out;
-               }
-
-               dev_notice(&dev->dev, "physmap platform flash device: %pR\n",
-                          res);
-
-               info->maps[i].name = dev_name(&dev->dev);
-               info->maps[i].phys = res->start;
-               info->maps[i].size = resource_size(res);
-               info->maps[i].bankwidth = physmap_data->width;
-               info->maps[i].set_vpp = physmap_set_vpp;
-               info->maps[i].pfow_base = physmap_data->pfow_base;
-               info->maps[i].map_priv_1 = (unsigned long)dev;
-
-               simple_map_init(&info->maps[i]);
-
-               probe_type = rom_probe_types;
-               if (!physmap_data->probe_type) {
-                       for (; !info->mtds[i] && *probe_type; probe_type++)
-                               info->mtds[i] = do_map_probe(*probe_type,
-                                                            &info->maps[i]);
-               } else {
-                       info->mtds[i] = do_map_probe(physmap_data->probe_type,
-                                                    &info->maps[i]);
-               }
-
-               if (!info->mtds[i]) {
-                       dev_err(&dev->dev, "map_probe failed\n");
-                       err = -ENXIO;
-                       goto err_out;
-               }
-               info->mtds[i]->dev.parent = &dev->dev;
-       }
-
-       if (info->nmaps == 1) {
-               info->cmtd = info->mtds[0];
-       } else {
-               /*
-                * We detected multiple devices. Concatenate them together.
-                */
-               info->cmtd = mtd_concat_create(info->mtds, info->nmaps,
-                                              dev_name(&dev->dev));
-               if (!info->cmtd)
-                       err = -ENXIO;
-       }
-       if (err)
-               goto err_out;
-
-       spin_lock_init(&info->vpp_lock);
-
-       part_types = physmap_data->part_probe_types ? : part_probe_types;
-
-       err = mtd_device_parse_register(info->cmtd, part_types, NULL,
-                                       physmap_data->parts,
-                                       physmap_data->nr_parts);
-       if (err)
-               goto err_out;
-
-       return 0;
-
-err_out:
-       physmap_flash_remove(dev);
-       return err;
-}
-
-#ifdef CONFIG_PM
-static void physmap_flash_shutdown(struct platform_device *dev)
-{
-       struct physmap_flash_info *info = platform_get_drvdata(dev);
-       int i;
-
-       for (i = 0; i < info->nmaps && info->mtds[i]; i++)
-               if (mtd_suspend(info->mtds[i]) == 0)
-                       mtd_resume(info->mtds[i]);
-}
-#else
-#define physmap_flash_shutdown NULL
-#endif
-
-static struct platform_driver physmap_flash_driver = {
-       .probe          = physmap_flash_probe,
-       .remove         = physmap_flash_remove,
-       .shutdown       = physmap_flash_shutdown,
-       .driver         = {
-               .name   = "physmap-flash",
-       },
-};
-
-#ifdef CONFIG_MTD_PHYSMAP_COMPAT
-static struct physmap_flash_data physmap_flash_data = {
-       .width          = CONFIG_MTD_PHYSMAP_BANKWIDTH,
-};
-
-static struct resource physmap_flash_resource = {
-       .start          = CONFIG_MTD_PHYSMAP_START,
-       .end            = CONFIG_MTD_PHYSMAP_START + CONFIG_MTD_PHYSMAP_LEN - 1,
-       .flags          = IORESOURCE_MEM,
-};
-
-static struct platform_device physmap_flash = {
-       .name           = "physmap-flash",
-       .id             = 0,
-       .dev            = {
-               .platform_data  = &physmap_flash_data,
-       },
-       .num_resources  = 1,
-       .resource       = &physmap_flash_resource,
-};
-#endif
-
-static int __init physmap_init(void)
-{
-       int err;
-
-       err = platform_driver_register(&physmap_flash_driver);
-#ifdef CONFIG_MTD_PHYSMAP_COMPAT
-       if (err == 0) {
-               err = platform_device_register(&physmap_flash);
-               if (err)
-                       platform_driver_unregister(&physmap_flash_driver);
-       }
-#endif
-
-       return err;
-}
-
-static void __exit physmap_exit(void)
-{
-#ifdef CONFIG_MTD_PHYSMAP_COMPAT
-       platform_device_unregister(&physmap_flash);
-#endif
-       platform_driver_unregister(&physmap_flash_driver);
-}
-
-module_init(physmap_init);
-module_exit(physmap_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
-MODULE_DESCRIPTION("Generic configurable MTD map driver");
-
-/* legacy platform drivers can't hotplug or coldplg */
-#ifndef CONFIG_MTD_PHYSMAP_COMPAT
-/* work with hotplug and coldplug */
-MODULE_ALIAS("platform:physmap-flash");
-#endif