| From 643503476701505084af2f49f4679c4c967c8d47 Mon Sep 17 00:00:00 2001 |
| From: Tuowen Zhao <ztuowen@gmail.com> |
| Date: Wed, 16 Oct 2019 15:06:28 -0600 |
| Subject: [PATCH] lib: devres: add a helper function for ioremap_uc |
| |
| commit e537654b7039aacfe8ae629d49655c0e5692ad44 upstream. |
| |
| Implement a resource managed strongly uncachable ioremap function. |
| |
| Cc: <stable@vger.kernel.org> # v4.19+ |
| Tested-by: AceLan Kao <acelan.kao@canonical.com> |
| Signed-off-by: Tuowen Zhao <ztuowen@gmail.com> |
| Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> |
| Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Acked-by: Luis Chamberlain <mcgrof@kernel.org> |
| Signed-off-by: Lee Jones <lee.jones@linaro.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/include/linux/io.h b/include/linux/io.h |
| index 9876e5801a9d..715f41dbe315 100644 |
| --- a/include/linux/io.h |
| +++ b/include/linux/io.h |
| @@ -63,6 +63,8 @@ static inline void devm_ioport_unmap(struct device *dev, void __iomem *addr) |
| |
| void __iomem *devm_ioremap(struct device *dev, resource_size_t offset, |
| resource_size_t size); |
| +void __iomem *devm_ioremap_uc(struct device *dev, resource_size_t offset, |
| + resource_size_t size); |
| void __iomem *devm_ioremap_nocache(struct device *dev, resource_size_t offset, |
| resource_size_t size); |
| void __iomem *devm_ioremap_wc(struct device *dev, resource_size_t offset, |
| diff --git a/lib/devres.c b/lib/devres.c |
| index 6a0e9bd6524a..17624d35e82d 100644 |
| --- a/lib/devres.c |
| +++ b/lib/devres.c |
| @@ -9,6 +9,7 @@ |
| enum devm_ioremap_type { |
| DEVM_IOREMAP = 0, |
| DEVM_IOREMAP_NC, |
| + DEVM_IOREMAP_UC, |
| DEVM_IOREMAP_WC, |
| }; |
| |
| @@ -39,6 +40,9 @@ static void __iomem *__devm_ioremap(struct device *dev, resource_size_t offset, |
| case DEVM_IOREMAP_NC: |
| addr = ioremap_nocache(offset, size); |
| break; |
| + case DEVM_IOREMAP_UC: |
| + addr = ioremap_uc(offset, size); |
| + break; |
| case DEVM_IOREMAP_WC: |
| addr = ioremap_wc(offset, size); |
| break; |
| @@ -69,6 +73,21 @@ void __iomem *devm_ioremap(struct device *dev, resource_size_t offset, |
| EXPORT_SYMBOL(devm_ioremap); |
| |
| /** |
| + * devm_ioremap_uc - Managed ioremap_uc() |
| + * @dev: Generic device to remap IO address for |
| + * @offset: Resource address to map |
| + * @size: Size of map |
| + * |
| + * Managed ioremap_uc(). Map is automatically unmapped on driver detach. |
| + */ |
| +void __iomem *devm_ioremap_uc(struct device *dev, resource_size_t offset, |
| + resource_size_t size) |
| +{ |
| + return __devm_ioremap(dev, offset, size, DEVM_IOREMAP_UC); |
| +} |
| +EXPORT_SYMBOL_GPL(devm_ioremap_uc); |
| + |
| +/** |
| * devm_ioremap_nocache - Managed ioremap_nocache() |
| * @dev: Generic device to remap IO address for |
| * @offset: Resource address to map |
| -- |
| 2.7.4 |
| |