diff options
author | Matthias Brugger <matthias.bgg@gmail.com> | 2014-07-18 05:36:39 -0400 |
---|---|---|
committer | Daniel Lezcano <daniel.lezcano@linaro.org> | 2014-07-23 06:02:30 -0400 |
commit | efd342fb0031a17758571dce42e3f373d94e2fec (patch) | |
tree | 914578b4b0944ae5ca884e18ffe13cd223dccb14 /drivers/of/address.c | |
parent | 7e1391876c8f95df9241deb78fa98e799e7bb05e (diff) |
of: Provide a function to request and map memory
A call to of_iomap does not request the memory region. This patch adds the
function of_io_request_and_map which requests the memory region before
mapping it.
Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Suggested-by: Rob Herring <robh@kernel.org>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Diffstat (limited to 'drivers/of/address.c')
-rw-r--r-- | drivers/of/address.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/of/address.c b/drivers/of/address.c index 5edfcb0da37d..e3718250d66e 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c | |||
@@ -702,6 +702,42 @@ void __iomem *of_iomap(struct device_node *np, int index) | |||
702 | } | 702 | } |
703 | EXPORT_SYMBOL(of_iomap); | 703 | EXPORT_SYMBOL(of_iomap); |
704 | 704 | ||
705 | /* | ||
706 | * of_io_request_and_map - Requests a resource and maps the memory mapped IO | ||
707 | * for a given device_node | ||
708 | * @device: the device whose io range will be mapped | ||
709 | * @index: index of the io range | ||
710 | * @name: name of the resource | ||
711 | * | ||
712 | * Returns a pointer to the requested and mapped memory or an ERR_PTR() encoded | ||
713 | * error code on failure. Usage example: | ||
714 | * | ||
715 | * base = of_io_request_and_map(node, 0, "foo"); | ||
716 | * if (IS_ERR(base)) | ||
717 | * return PTR_ERR(base); | ||
718 | */ | ||
719 | void __iomem *of_io_request_and_map(struct device_node *np, int index, | ||
720 | char *name) | ||
721 | { | ||
722 | struct resource res; | ||
723 | void __iomem *mem; | ||
724 | |||
725 | if (of_address_to_resource(np, index, &res)) | ||
726 | return IOMEM_ERR_PTR(-EINVAL); | ||
727 | |||
728 | if (!request_mem_region(res.start, resource_size(&res), name)) | ||
729 | return IOMEM_ERR_PTR(-EBUSY); | ||
730 | |||
731 | mem = ioremap(res.start, resource_size(&res)); | ||
732 | if (!mem) { | ||
733 | release_mem_region(res.start, resource_size(&res)); | ||
734 | return IOMEM_ERR_PTR(-ENOMEM); | ||
735 | } | ||
736 | |||
737 | return mem; | ||
738 | } | ||
739 | EXPORT_SYMBOL(of_io_request_and_map); | ||
740 | |||
705 | /** | 741 | /** |
706 | * of_dma_get_range - Get DMA range info | 742 | * of_dma_get_range - Get DMA range info |
707 | * @np: device node to get DMA range info | 743 | * @np: device node to get DMA range info |