Messages in this thread Patch in this message | | | Subject | [PATCH] drivers: Inline code in devm_platform_ioremap_resource() from two functions | From | Markus Elfring <> | Date | Fri, 14 Jun 2019 11:22:40 +0200 |
| |
From: Markus Elfring <elfring@users.sourceforge.net> 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 <elfring@users.sourceforge.net> --- 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
| |