diff options
| author | Hector Martin <marcan@marcan.st> | 2021-02-11 21:46:59 +0900 |
|---|---|---|
| committer | Hector Martin <marcan@marcan.st> | 2021-02-11 22:56:23 +0900 |
| commit | 937351e37861082319fc07f4dca659d833da5a63 (patch) | |
| tree | ada3d725fe343404278630c91545176fb424e8f3 | |
| parent | aacd239d9ab8edf623e68063b6a96218a1c029f9 (diff) | |
| download | playground-937351e37861082319fc07f4dca659d833da5a63.tar.gz | |
lib: devres: Introduce devm_ioremap_np()
This maps to ioremap_np(). It is automatically selected for
devm_ioremap_resource() when the resource has the
IORESOURCE_MEM_NONPOSTED flag set.
Signed-off-by: Hector Martin <marcan@marcan.st>
| -rw-r--r-- | include/linux/io.h | 2 | ||||
| -rw-r--r-- | lib/devres.c | 22 |
2 files changed, 24 insertions, 0 deletions
diff --git a/include/linux/io.h b/include/linux/io.h index 8394c56babc26..d718354ed3e16 100644 --- a/include/linux/io.h +++ b/include/linux/io.h @@ -68,6 +68,8 @@ void __iomem *devm_ioremap_uc(struct device *dev, resource_size_t offset, resource_size_t size); void __iomem *devm_ioremap_wc(struct device *dev, resource_size_t offset, resource_size_t size); +void __iomem *devm_ioremap_np(struct device *dev, resource_size_t offset, + resource_size_t size); void devm_iounmap(struct device *dev, void __iomem *addr); int check_signature(const volatile void __iomem *io_addr, const unsigned char *signature, int length); diff --git a/lib/devres.c b/lib/devres.c index 2a4ff5d642886..4679dbb1bf5f8 100644 --- a/lib/devres.c +++ b/lib/devres.c @@ -10,6 +10,7 @@ enum devm_ioremap_type { DEVM_IOREMAP = 0, DEVM_IOREMAP_UC, DEVM_IOREMAP_WC, + DEVM_IOREMAP_NP, }; void devm_ioremap_release(struct device *dev, void *res) @@ -42,6 +43,9 @@ static void __iomem *__devm_ioremap(struct device *dev, resource_size_t offset, case DEVM_IOREMAP_WC: addr = ioremap_wc(offset, size); break; + case DEVM_IOREMAP_NP: + addr = ioremap_np(offset, size); + break; } if (addr) { @@ -99,6 +103,21 @@ void __iomem *devm_ioremap_wc(struct device *dev, resource_size_t offset, EXPORT_SYMBOL(devm_ioremap_wc); /** + * devm_ioremap_np - Managed ioremap_np() + * @dev: Generic device to remap IO address for + * @offset: Resource address to map + * @size: Size of map + * + * Managed ioremap_np(). Map is automatically unmapped on driver detach. + */ +void __iomem *devm_ioremap_np(struct device *dev, resource_size_t offset, + resource_size_t size) +{ + return __devm_ioremap(dev, offset, size, DEVM_IOREMAP_NP); +} +EXPORT_SYMBOL(devm_ioremap_np); + +/** * devm_iounmap - Managed iounmap() * @dev: Generic device to unmap for * @addr: Address to unmap @@ -128,6 +147,9 @@ __devm_ioremap_resource(struct device *dev, const struct resource *res, return IOMEM_ERR_PTR(-EINVAL); } + if (type == DEVM_IOREMAP && res->flags & IORESOURCE_MEM_NONPOSTED) + type = DEVM_IOREMAP_NP; + size = resource_size(res); if (res->name) |
