1/* 2 * Copyright (C) 2008 Freescale Semiconductor, Inc. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 7 * 2 of the License, or (at your option) any later version. 8 */ 9 10#include <linux/device.h> /* devres_*(), devm_ioremap_release() */ 11#include <linux/gfp.h> 12#include <linux/io.h> /* ioremap_prot() */ 13#include <linux/export.h> /* EXPORT_SYMBOL() */ 14 15/** 16 * devm_ioremap_prot - Managed ioremap_prot() 17 * @dev: Generic device to remap IO address for 18 * @offset: BUS offset to map 19 * @size: Size of map 20 * @flags: Page flags 21 * 22 * Managed ioremap_prot(). Map is automatically unmapped on driver 23 * detach. 24 */ 25void __iomem *devm_ioremap_prot(struct device *dev, resource_size_t offset, 26 size_t size, unsigned long flags) 27{ 28 void __iomem **ptr, *addr; 29 30 ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL); 31 if (!ptr) 32 return NULL; 33 34 addr = ioremap_prot(offset, size, flags); 35 if (addr) { 36 *ptr = addr; 37 devres_add(dev, ptr); 38 } else 39 devres_free(ptr); 40 41 return addr; 42} 43EXPORT_SYMBOL(devm_ioremap_prot); 44