diff options
author | Abhilash Kesavan <a.kesavan@samsung.com> | 2015-02-06 08:45:27 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-03-16 16:11:32 -0400 |
commit | 34644524bce91883d5051a7eaf3ec5464ed149bf (patch) | |
tree | 17b63c826d7ce18d388250788df674b9bed995ec | |
parent | 71a49d16f06de2ccdf52ca247d496a2bb1ca36fe (diff) |
lib: devres: add a helper function for ioremap_wc
Implement a resource managed writecombine ioremap function.
Signed-off-by: Abhilash Kesavan <a.kesavan@samsung.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | Documentation/driver-model/devres.txt | 1 | ||||
-rw-r--r-- | include/linux/io.h | 2 | ||||
-rw-r--r-- | lib/devres.c | 28 |
3 files changed, 31 insertions, 0 deletions
diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt index 6d1e8eeb5990..7fe7fd263aba 100644 --- a/Documentation/driver-model/devres.txt +++ b/Documentation/driver-model/devres.txt | |||
@@ -276,6 +276,7 @@ IOMAP | |||
276 | devm_ioport_unmap() | 276 | devm_ioport_unmap() |
277 | devm_ioremap() | 277 | devm_ioremap() |
278 | devm_ioremap_nocache() | 278 | devm_ioremap_nocache() |
279 | devm_ioremap_wc() | ||
279 | devm_ioremap_resource() : checks resource, requests memory region, ioremaps | 280 | devm_ioremap_resource() : checks resource, requests memory region, ioremaps |
280 | devm_iounmap() | 281 | devm_iounmap() |
281 | pcim_iomap() | 282 | pcim_iomap() |
diff --git a/include/linux/io.h b/include/linux/io.h index fa02e55e5a2e..42b33f03d1df 100644 --- a/include/linux/io.h +++ b/include/linux/io.h | |||
@@ -64,6 +64,8 @@ void __iomem *devm_ioremap(struct device *dev, resource_size_t offset, | |||
64 | resource_size_t size); | 64 | resource_size_t size); |
65 | void __iomem *devm_ioremap_nocache(struct device *dev, resource_size_t offset, | 65 | void __iomem *devm_ioremap_nocache(struct device *dev, resource_size_t offset, |
66 | resource_size_t size); | 66 | resource_size_t size); |
67 | void __iomem *devm_ioremap_wc(struct device *dev, resource_size_t offset, | ||
68 | resource_size_t size); | ||
67 | void devm_iounmap(struct device *dev, void __iomem *addr); | 69 | void devm_iounmap(struct device *dev, void __iomem *addr); |
68 | int check_signature(const volatile void __iomem *io_addr, | 70 | int check_signature(const volatile void __iomem *io_addr, |
69 | const unsigned char *signature, int length); | 71 | const unsigned char *signature, int length); |
diff --git a/lib/devres.c b/lib/devres.c index 0f1dd2e9d2c1..fbe2aac522e6 100644 --- a/lib/devres.c +++ b/lib/devres.c | |||
@@ -72,6 +72,34 @@ void __iomem *devm_ioremap_nocache(struct device *dev, resource_size_t offset, | |||
72 | EXPORT_SYMBOL(devm_ioremap_nocache); | 72 | EXPORT_SYMBOL(devm_ioremap_nocache); |
73 | 73 | ||
74 | /** | 74 | /** |
75 | * devm_ioremap_wc - Managed ioremap_wc() | ||
76 | * @dev: Generic device to remap IO address for | ||
77 | * @offset: BUS offset to map | ||
78 | * @size: Size of map | ||
79 | * | ||
80 | * Managed ioremap_wc(). Map is automatically unmapped on driver detach. | ||
81 | */ | ||
82 | void __iomem *devm_ioremap_wc(struct device *dev, resource_size_t offset, | ||
83 | resource_size_t size) | ||
84 | { | ||
85 | void __iomem **ptr, *addr; | ||
86 | |||
87 | ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL); | ||
88 | if (!ptr) | ||
89 | return NULL; | ||
90 | |||
91 | addr = ioremap_wc(offset, size); | ||
92 | if (addr) { | ||
93 | *ptr = addr; | ||
94 | devres_add(dev, ptr); | ||
95 | } else | ||
96 | devres_free(ptr); | ||
97 | |||
98 | return addr; | ||
99 | } | ||
100 | EXPORT_SYMBOL(devm_ioremap_wc); | ||
101 | |||
102 | /** | ||
75 | * devm_iounmap - Managed iounmap() | 103 | * devm_iounmap - Managed iounmap() |
76 | * @dev: Generic device to unmap for | 104 | * @dev: Generic device to unmap for |
77 | * @addr: Address to unmap | 105 | * @addr: Address to unmap |