mtd: maps: physmap: Use platform_get_resource() to retrieve iomem resources
authorBoris Brezillon <boris.brezillon@bootlin.com>
Fri, 19 Oct 2018 07:48:56 +0000 (09:48 +0200)
committerBoris Brezillon <boris.brezillon@bootlin.com>
Mon, 5 Nov 2018 21:23:43 +0000 (22:23 +0100)
Stop manipulating the dev->resource array directly and use the
platform_get_resource() helper instead.

While at it, fix the loop check so that we never overflow the info->maps
and info->mtds array even if the number of resources attached to the
platform dev is higher than MAX_RESOURCES.

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/physmap.c

index 4010afee4a33d6f7eeca174ea11bcb6f43ec5322..a097f0cf519af0a1403cbbf539b88a12d2506b97 100644 (file)
@@ -122,23 +122,28 @@ static int physmap_flash_probe(struct platform_device *dev)
 
        platform_set_drvdata(dev, info);
 
-       for (i = 0; i < dev->num_resources; i++) {
+       for (i = 0; i < MAX_RESOURCES; i++) {
+               struct resource *res;
+
+               res = platform_get_resource(dev, IORESOURCE_MEM, i);
+               if (!res)
+                       break;
+
                printk(KERN_NOTICE "physmap platform flash device: %.8llx at %.8llx\n",
-                      (unsigned long long)resource_size(&dev->resource[i]),
-                      (unsigned long long)dev->resource[i].start);
+                      (unsigned long long)resource_size(res),
+                      (unsigned long long)res->start);
 
-               if (!devm_request_mem_region(&dev->dev,
-                       dev->resource[i].start,
-                       resource_size(&dev->resource[i]),
-                       dev_name(&dev->dev))) {
+               if (!devm_request_mem_region(&dev->dev, res->start,
+                                            resource_size(res),
+                                            dev_name(&dev->dev))) {
                        dev_err(&dev->dev, "Could not reserve memory region\n");
                        err = -ENOMEM;
                        goto err_out;
                }
 
                info->maps[i].name = dev_name(&dev->dev);
-               info->maps[i].phys = dev->resource[i].start;
-               info->maps[i].size = resource_size(&dev->resource[i]);
+               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;
@@ -172,9 +177,11 @@ static int physmap_flash_probe(struct platform_device *dev)
                info->mtds[i]->dev.parent = &dev->dev;
        }
 
-       if (devices_found == 1) {
+       if (!devices_found) {
+               err = -ENODEV;
+       } else if (devices_found == 1) {
                info->cmtd = info->mtds[0];
-       } else if (devices_found > 1) {
+       } else {
                /*
                 * We detected multiple devices. Concatenate them together.
                 */