aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm/ioremap.c
diff options
context:
space:
mode:
authorRussell King <rmk@dyn-67.arm.linux.org.uk>2007-05-05 15:59:27 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2007-05-05 15:59:27 -0400
commit3603ab2b62ad8372fc93816b080b370dd55d7cec (patch)
treee9012ae43fe5988c288074ee12fc4a0fc2f6b63a /arch/arm/mm/ioremap.c
parent0af92befeb4b330c46cce6b520b2cc775cd6931f (diff)
[ARM] mm 10: allow memory type to be specified with ioremap
__ioremap() took a set of page table flags (specifically the cacheable and bufferable bits) to control the mapping type. However, with the advent of ARMv6, this is far too limited. Replace the page table flags with a memory type index, so that the desired attributes can be selected from the mem_type table. Finally, to prevent silent miscompilation due to the differing arguments, rename the __ioremap() and __ioremap_pfn() functions. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mm/ioremap.c')
-rw-r--r--arch/arm/mm/ioremap.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c
index 216623eece35..d6167ad4e011 100644
--- a/arch/arm/mm/ioremap.c
+++ b/arch/arm/mm/ioremap.c
@@ -262,11 +262,10 @@ remap_area_supersections(unsigned long virt, unsigned long pfn,
262 * mapping. See include/asm-arm/proc-armv/pgtable.h for more information. 262 * mapping. See include/asm-arm/proc-armv/pgtable.h for more information.
263 */ 263 */
264void __iomem * 264void __iomem *
265__ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size, 265__arm_ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size,
266 unsigned long flags) 266 unsigned int mtype)
267{ 267{
268 const struct mem_type *type; 268 const struct mem_type *type;
269 struct mem_type t;
270 int err; 269 int err;
271 unsigned long addr; 270 unsigned long addr;
272 struct vm_struct * area; 271 struct vm_struct * area;
@@ -277,10 +276,9 @@ __ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size,
277 if (pfn >= 0x100000 && (__pfn_to_phys(pfn) & ~SUPERSECTION_MASK)) 276 if (pfn >= 0x100000 && (__pfn_to_phys(pfn) & ~SUPERSECTION_MASK))
278 return NULL; 277 return NULL;
279 278
280 t = *get_mem_type(MT_DEVICE); 279 type = get_mem_type(mtype);
281 t.prot_sect |= flags; 280 if (!type)
282 t.prot_pte |= flags; 281 return NULL;
283 type = &t;
284 282
285 size = PAGE_ALIGN(size); 283 size = PAGE_ALIGN(size);
286 284
@@ -311,10 +309,10 @@ __ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size,
311 flush_cache_vmap(addr, addr + size); 309 flush_cache_vmap(addr, addr + size);
312 return (void __iomem *) (offset + addr); 310 return (void __iomem *) (offset + addr);
313} 311}
314EXPORT_SYMBOL(__ioremap_pfn); 312EXPORT_SYMBOL(__arm_ioremap_pfn);
315 313
316void __iomem * 314void __iomem *
317__ioremap(unsigned long phys_addr, size_t size, unsigned long flags) 315__arm_ioremap(unsigned long phys_addr, size_t size, unsigned int mtype)
318{ 316{
319 unsigned long last_addr; 317 unsigned long last_addr;
320 unsigned long offset = phys_addr & ~PAGE_MASK; 318 unsigned long offset = phys_addr & ~PAGE_MASK;
@@ -332,9 +330,9 @@ __ioremap(unsigned long phys_addr, size_t size, unsigned long flags)
332 */ 330 */
333 size = PAGE_ALIGN(last_addr + 1) - phys_addr; 331 size = PAGE_ALIGN(last_addr + 1) - phys_addr;
334 332
335 return __ioremap_pfn(pfn, offset, size, flags); 333 return __arm_ioremap_pfn(pfn, offset, size, mtype);
336} 334}
337EXPORT_SYMBOL(__ioremap); 335EXPORT_SYMBOL(__arm_ioremap);
338 336
339void __iounmap(volatile void __iomem *addr) 337void __iounmap(volatile void __iomem *addr)
340{ 338{