diff options
author | Boris Brezillon <boris.brezillon@bootlin.com> | 2018-10-19 10:48:56 +0300 |
---|---|---|
committer | Boris Brezillon <boris.brezillon@bootlin.com> | 2018-11-06 00:23:43 +0300 |
commit | c7f6dc60a319edac986486580b2fc31475ceba11 (patch) | |
tree | 7d18e42d8f548b855b1f69c059e6616995437f3d /drivers/mtd/maps/physmap.c | |
parent | 00142d6ffeb67b22e1f5259c9f3af540ed1d2b62 (diff) | |
download | linux-c7f6dc60a319edac986486580b2fc31475ceba11.tar.xz |
mtd: maps: physmap: Use platform_get_resource() to retrieve iomem resources
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>
Diffstat (limited to 'drivers/mtd/maps/physmap.c')
-rw-r--r-- | drivers/mtd/maps/physmap.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/drivers/mtd/maps/physmap.c b/drivers/mtd/maps/physmap.c index 4010afee4a33..a097f0cf519a 100644 --- a/drivers/mtd/maps/physmap.c +++ b/drivers/mtd/maps/physmap.c @@ -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. */ |