summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@bootlin.com>2018-10-19 10:48:56 +0300
committerBoris Brezillon <boris.brezillon@bootlin.com>2018-11-06 00:23:43 +0300
commitc7f6dc60a319edac986486580b2fc31475ceba11 (patch)
tree7d18e42d8f548b855b1f69c059e6616995437f3d /drivers
parent00142d6ffeb67b22e1f5259c9f3af540ed1d2b62 (diff)
downloadlinux-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')
-rw-r--r--drivers/mtd/maps/physmap.c29
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.
*/