From: Markus Elfring <[email protected]>
Date: Fri, 14 Jun 2019 11:05:33 +0200

Two function calls were combined in this function implementation.
Inline corresponding code so that extra error checks can be avoided here.

Signed-off-by: Markus Elfring <[email protected]>
---
 drivers/base/platform.c | 39 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 34 insertions(+), 5 deletions(-)

diff --git a/drivers/base/platform.c b/drivers/base/platform.c
index 4d1729853d1a..baadca72f949 100644
--- a/drivers/base/platform.c
+++ b/drivers/base/platform.c
@@ -80,8 +80,8 @@ struct resource *platform_get_resource(struct platform_device 
*dev,
 EXPORT_SYMBOL_GPL(platform_get_resource);

 /**
- * devm_platform_ioremap_resource - call devm_ioremap_resource() for a platform
- *                                 device
+ * devm_platform_ioremap_resource
+ * Achieve devm_ioremap_resource() functionality for a platform device
  *
  * @pdev: platform device to use both for memory resource lookup as well as
  *        resource management
@@ -91,10 +91,39 @@ EXPORT_SYMBOL_GPL(platform_get_resource);
 void __iomem *devm_platform_ioremap_resource(struct platform_device *pdev,
                                             unsigned int index)
 {
-       struct resource *res;
+       u32 i;

-       res = platform_get_resource(pdev, IORESOURCE_MEM, index);
-       return devm_ioremap_resource(&pdev->dev, res);
+       for (i = 0; i < pdev->num_resources; i++) {
+               struct resource *res = &pdev->resource[i];
+
+               if (resource_type(res) == IORESOURCE_MEM && index-- == 0) {
+                       struct device *dev = &pdev->dev;
+                       resource_size_t size = resource_size(res);
+                       void __iomem *dest;
+
+                       if (!devm_request_mem_region(dev,
+                                                    res->start,
+                                                    size,
+                                                    dev_name(dev))) {
+                               dev_err(dev,
+                                       "can't request region for resource 
%pR\n",
+                                       res);
+                               return IOMEM_ERR_PTR(-EBUSY);
+                       }
+
+                       dest = devm_ioremap(dev, res->start, size);
+                       if (!dest) {
+                               dev_err(dev,
+                                       "ioremap failed for resource %pR\n",
+                                       res);
+                               devm_release_mem_region(dev, res->start, size);
+                               dest = IOMEM_ERR_PTR(-ENOMEM);
+                       }
+
+                       return dest;
+               }
+       }
+       return IOMEM_ERR_PTR(-EINVAL);
 }
 EXPORT_SYMBOL_GPL(devm_platform_ioremap_resource);
 #endif /* CONFIG_HAS_IOMEM */
--
2.22.0

Reply via email to