[PATCH v2 03/15] mtd: maps: physmap: Use platform_get_resource() to retrieve iomem resources

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxx>
Reviewed-by: Ricardo Ribalda Delgado <ricardo.ribalda@xxxxxxxxx>
---
Changes in v2:
- Add Ricardo's R-b
- Fix the platform_get_resource() ret code check
---
 drivers/mtd/maps/physmap.c | 29 ++++++++++++++++++-----------
 1 file 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.
 		 */
-- 
2.14.1




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux