ARM: provide runtime hook for ioremap/iounmap
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@calxeda.com> Cc: Russell King <linux@arm.linux.org.uk> Reviewed-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Nicolas Pitre <nico@linaro.org>
This commit is contained in:
		
					parent
					
						
							
								47168824fa
							
						
					
				
			
			
				commit
				
					
						4fe7ef3a08
					
				
			
		
					 2 changed files with 20 additions and 4 deletions
				
			
		|  | @ -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(unsigned long, size_t, unsigned int); | ||||||
| extern void __iomem *__arm_ioremap_exec(unsigned long, size_t, bool cached); | extern void __iomem *__arm_ioremap_exec(unsigned long, size_t, bool cached); | ||||||
| extern void __iounmap(volatile void __iomem *addr); | 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... |  * Bad read/write accesses... | ||||||
|  | @ -266,7 +271,7 @@ extern void _memset_io(volatile void __iomem *, int, size_t); | ||||||
|  */ |  */ | ||||||
| #ifndef __arch_ioremap | #ifndef __arch_ioremap | ||||||
| #define __arch_ioremap			__arm_ioremap | #define __arch_ioremap			__arm_ioremap | ||||||
| #define __arch_iounmap			__iounmap | #define __arch_iounmap			__arm_iounmap | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define ioremap(cookie,size)		__arch_ioremap((cookie), (size), MT_DEVICE) | #define ioremap(cookie,size)		__arch_ioremap((cookie), (size), MT_DEVICE) | ||||||
|  |  | ||||||
|  | @ -306,11 +306,15 @@ __arm_ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size, | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(__arm_ioremap_pfn); | EXPORT_SYMBOL(__arm_ioremap_pfn); | ||||||
| 
 | 
 | ||||||
|  | void __iomem * (*arch_ioremap_caller)(unsigned long, size_t, | ||||||
|  | 				      unsigned int, void *) = | ||||||
|  | 	__arm_ioremap_caller; | ||||||
|  | 
 | ||||||
| void __iomem * | void __iomem * | ||||||
| __arm_ioremap(unsigned long phys_addr, size_t size, unsigned int mtype) | __arm_ioremap(unsigned long phys_addr, size_t size, unsigned int mtype) | ||||||
| { | { | ||||||
| 	return __arm_ioremap_caller(phys_addr, size, mtype, | 	return arch_ioremap_caller(phys_addr, size, mtype, | ||||||
| 			__builtin_return_address(0)); | 		__builtin_return_address(0)); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(__arm_ioremap); | EXPORT_SYMBOL(__arm_ioremap); | ||||||
| 
 | 
 | ||||||
|  | @ -369,4 +373,11 @@ void __iounmap(volatile void __iomem *io_addr) | ||||||
| 
 | 
 | ||||||
| 	vunmap(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); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Rob Herring
				Rob Herring