mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-25 17:53:34 -05:00
devres: add devm_memremap
Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
e836a256e8
commit
7d3dcf26a6
2 changed files with 43 additions and 0 deletions
|
@ -80,6 +80,10 @@ int check_signature(const volatile void __iomem *io_addr,
|
||||||
const unsigned char *signature, int length);
|
const unsigned char *signature, int length);
|
||||||
void devm_ioremap_release(struct device *dev, void *res);
|
void devm_ioremap_release(struct device *dev, void *res);
|
||||||
|
|
||||||
|
void *devm_memremap(struct device *dev, resource_size_t offset,
|
||||||
|
size_t size, unsigned long flags);
|
||||||
|
void devm_memunmap(struct device *dev, void *addr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some systems do not have legacy ISA devices.
|
* Some systems do not have legacy ISA devices.
|
||||||
* /dev/port is not a valid interface on these systems.
|
* /dev/port is not a valid interface on these systems.
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
#include <linux/device.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
@ -96,3 +97,41 @@ void memunmap(void *addr)
|
||||||
iounmap((void __iomem *) addr);
|
iounmap((void __iomem *) addr);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(memunmap);
|
EXPORT_SYMBOL(memunmap);
|
||||||
|
|
||||||
|
static void devm_memremap_release(struct device *dev, void *res)
|
||||||
|
{
|
||||||
|
memunmap(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int devm_memremap_match(struct device *dev, void *res, void *match_data)
|
||||||
|
{
|
||||||
|
return *(void **)res == match_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *devm_memremap(struct device *dev, resource_size_t offset,
|
||||||
|
size_t size, unsigned long flags)
|
||||||
|
{
|
||||||
|
void **ptr, *addr;
|
||||||
|
|
||||||
|
ptr = devres_alloc(devm_memremap_release, sizeof(*ptr), GFP_KERNEL);
|
||||||
|
if (!ptr)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
addr = memremap(offset, size, flags);
|
||||||
|
if (addr) {
|
||||||
|
*ptr = addr;
|
||||||
|
devres_add(dev, ptr);
|
||||||
|
} else
|
||||||
|
devres_free(ptr);
|
||||||
|
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(devm_memremap);
|
||||||
|
|
||||||
|
void devm_memunmap(struct device *dev, void *addr)
|
||||||
|
{
|
||||||
|
WARN_ON(devres_destroy(dev, devm_memremap_release, devm_memremap_match,
|
||||||
|
addr));
|
||||||
|
memunmap(addr);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(devm_memunmap);
|
||||||
|
|
Loading…
Add table
Reference in a new issue