[PATCH v5 1/7] ARM: provide runtime hook for ioremap/iounmap

Nicolas Pitre nico at fluxnic.net
Tue Mar 6 16:57:21 EST 2012


On Tue, 6 Mar 2012, Rob Herring wrote:

> From: Rob Herring <rob.herring at calxeda.com>
> 
> We have compile time over-ride of ioremap and iounmap, but an run-time
> override is needed for multi-platform builds. This adds an extra function
> pointer check, but ioremap is not peformance critical. The option for
> compile time selection remains.
> 
> The caller variant is used here to provide correct caller information as
> ARM can only support level 0 for __builtin_return_address.
> 
> Signed-off-by: Rob Herring <rob.herring at calxeda.com>
> Cc: Russell King <linux at arm.linux.org.uk>

Reviewed-by: Nicolas Pitre <nico at linaro.org>

> ---
>  arch/arm/include/asm/io.h |    7 ++++++-
>  arch/arm/mm/ioremap.c     |   17 ++++++++++++++---
>  2 files changed, 20 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h
> index 9275828..6c363c1 100644
> --- a/arch/arm/include/asm/io.h
> +++ b/arch/arm/include/asm/io.h
> @@ -83,6 +83,11 @@ extern void __iomem *__arm_ioremap_pfn(unsigned long, unsigned long, size_t, uns
>  extern void __iomem *__arm_ioremap(unsigned long, size_t, unsigned int);
>  extern void __iomem *__arm_ioremap_exec(unsigned long, size_t, bool cached);
>  extern void __iounmap(volatile void __iomem *addr);
> +extern void __arm_iounmap(volatile void __iomem *addr);
> +
> +extern void __iomem * (*arch_ioremap_caller)(unsigned long, size_t,
> +	unsigned int, void *);
> +extern void (*arch_iounmap)(volatile void __iomem *);
>  
>  /*
>   * Bad read/write accesses...
> @@ -266,7 +271,7 @@ extern void _memset_io(volatile void __iomem *, int, size_t);
>   */
>  #ifndef __arch_ioremap
>  #define __arch_ioremap			__arm_ioremap
> -#define __arch_iounmap			__iounmap
> +#define __arch_iounmap			__arm_iounmap
>  #endif
>  
>  #define ioremap(cookie,size)		__arch_ioremap((cookie), (size), MT_DEVICE)
> diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c
> index 80632e8..0246290 100644
> --- a/arch/arm/mm/ioremap.c
> +++ b/arch/arm/mm/ioremap.c
> @@ -306,11 +306,15 @@ __arm_ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size,
>  }
>  EXPORT_SYMBOL(__arm_ioremap_pfn);
>  
> +void __iomem * (*arch_ioremap_caller)(unsigned long, size_t,
> +				      unsigned int, void *) =
> +	__arm_ioremap_caller;
> +
>  void __iomem *
>  __arm_ioremap(unsigned long phys_addr, size_t size, unsigned int mtype)
>  {
> -	return __arm_ioremap_caller(phys_addr, size, mtype,
> -			__builtin_return_address(0));
> +	return arch_ioremap_caller(phys_addr, size, mtype,
> +		__builtin_return_address(0));
>  }
>  EXPORT_SYMBOL(__arm_ioremap);
>  
> @@ -369,4 +373,11 @@ void __iounmap(volatile void __iomem *io_addr)
>  
>  	vunmap(addr);
>  }
> -EXPORT_SYMBOL(__iounmap);
> +
> +void (*arch_iounmap)(volatile void __iomem *) = __iounmap;
> +
> +void __arm_iounmap(volatile void __iomem *io_addr)
> +{
> +	arch_iounmap(io_addr);
> +}
> +EXPORT_SYMBOL(__arm_iounmap);
> -- 
> 1.7.5.4
> 



More information about the linux-arm-kernel mailing list