aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAbhilash Kesavan <a.kesavan@samsung.com>2015-02-06 08:45:27 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-03-16 16:11:32 -0400
commit34644524bce91883d5051a7eaf3ec5464ed149bf (patch)
tree17b63c826d7ce18d388250788df674b9bed995ec
parent71a49d16f06de2ccdf52ca247d496a2bb1ca36fe (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.txt1
-rw-r--r--include/linux/io.h2
-rw-r--r--lib/devres.c28
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);
65void __iomem *devm_ioremap_nocache(struct device *dev, resource_size_t offset, 65void __iomem *devm_ioremap_nocache(struct device *dev, resource_size_t offset,
66 resource_size_t size); 66 resource_size_t size);
67void __iomem *devm_ioremap_wc(struct device *dev, resource_size_t offset,
68 resource_size_t size);
67void devm_iounmap(struct device *dev, void __iomem *addr); 69void devm_iounmap(struct device *dev, void __iomem *addr);
68int check_signature(const volatile void __iomem *io_addr, 70int 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,
72EXPORT_SYMBOL(devm_ioremap_nocache); 72EXPORT_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 */
82void __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}
100EXPORT_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