diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-07-26 05:29:13 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-07-27 05:43:47 -0400 |
| commit | d746196361c9c635128249bb6cf13e709ae6abe1 (patch) | |
| tree | 112d387c207d06849c7ced234df9d9bcdc9bf7f5 | |
| parent | ac3e3fb424d44109dda3b1a3459e1b30fa60ac4a (diff) | |
ARM: use generic ioremap_page_range()
We don't need our own implementation of this, use the generic
library implementation instead.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | arch/arm/mm/ioremap.c | 74 |
1 files changed, 4 insertions, 70 deletions
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index 03f11935ed08..ab506272b2d3 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c | |||
| @@ -42,78 +42,11 @@ | |||
| 42 | */ | 42 | */ |
| 43 | #define VM_ARM_SECTION_MAPPING 0x80000000 | 43 | #define VM_ARM_SECTION_MAPPING 0x80000000 |
| 44 | 44 | ||
| 45 | static int remap_area_pte(pmd_t *pmd, unsigned long addr, unsigned long end, | ||
| 46 | unsigned long phys_addr, const struct mem_type *type) | ||
| 47 | { | ||
| 48 | pgprot_t prot = __pgprot(type->prot_pte); | ||
| 49 | pte_t *pte; | ||
| 50 | |||
| 51 | pte = pte_alloc_kernel(pmd, addr); | ||
| 52 | if (!pte) | ||
| 53 | return -ENOMEM; | ||
| 54 | |||
| 55 | do { | ||
| 56 | if (!pte_none(*pte)) | ||
| 57 | goto bad; | ||
| 58 | |||
| 59 | set_pte_ext(pte, pfn_pte(phys_addr >> PAGE_SHIFT, prot), 0); | ||
| 60 | phys_addr += PAGE_SIZE; | ||
| 61 | } while (pte++, addr += PAGE_SIZE, addr != end); | ||
| 62 | return 0; | ||
| 63 | |||
| 64 | bad: | ||
| 65 | printk(KERN_CRIT "remap_area_pte: page already exists\n"); | ||
| 66 | BUG(); | ||
| 67 | } | ||
| 68 | |||
| 69 | static inline int remap_area_pmd(pgd_t *pgd, unsigned long addr, | ||
| 70 | unsigned long end, unsigned long phys_addr, | ||
| 71 | const struct mem_type *type) | ||
| 72 | { | ||
| 73 | unsigned long next; | ||
| 74 | pmd_t *pmd; | ||
| 75 | int ret = 0; | ||
| 76 | |||
| 77 | pmd = pmd_alloc(&init_mm, pgd, addr); | ||
| 78 | if (!pmd) | ||
| 79 | return -ENOMEM; | ||
| 80 | |||
| 81 | do { | ||
| 82 | next = pmd_addr_end(addr, end); | ||
| 83 | ret = remap_area_pte(pmd, addr, next, phys_addr, type); | ||
| 84 | if (ret) | ||
| 85 | return ret; | ||
| 86 | phys_addr += next - addr; | ||
| 87 | } while (pmd++, addr = next, addr != end); | ||
| 88 | return ret; | ||
| 89 | } | ||
| 90 | |||
| 91 | static int remap_area_pages(unsigned long start, unsigned long pfn, | ||
| 92 | size_t size, const struct mem_type *type) | ||
| 93 | { | ||
| 94 | unsigned long addr = start; | ||
| 95 | unsigned long next, end = start + size; | ||
| 96 | unsigned long phys_addr = __pfn_to_phys(pfn); | ||
| 97 | pgd_t *pgd; | ||
| 98 | int err = 0; | ||
| 99 | |||
| 100 | BUG_ON(addr >= end); | ||
| 101 | pgd = pgd_offset_k(addr); | ||
| 102 | do { | ||
| 103 | next = pgd_addr_end(addr, end); | ||
| 104 | err = remap_area_pmd(pgd, addr, next, phys_addr, type); | ||
| 105 | if (err) | ||
| 106 | break; | ||
| 107 | phys_addr += next - addr; | ||
| 108 | } while (pgd++, addr = next, addr != end); | ||
| 109 | |||
| 110 | return err; | ||
| 111 | } | ||
| 112 | |||
| 113 | int ioremap_page(unsigned long virt, unsigned long phys, | 45 | int ioremap_page(unsigned long virt, unsigned long phys, |
| 114 | const struct mem_type *mtype) | 46 | const struct mem_type *mtype) |
| 115 | { | 47 | { |
| 116 | return remap_area_pages(virt, __phys_to_pfn(phys), PAGE_SIZE, mtype); | 48 | return ioremap_page_range(virt, virt + PAGE_SIZE, phys, |
| 49 | __pgprot(mtype->prot_pte)); | ||
| 117 | } | 50 | } |
| 118 | EXPORT_SYMBOL(ioremap_page); | 51 | EXPORT_SYMBOL(ioremap_page); |
| 119 | 52 | ||
| @@ -300,7 +233,8 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn, | |||
| 300 | err = remap_area_sections(addr, pfn, size, type); | 233 | err = remap_area_sections(addr, pfn, size, type); |
| 301 | } else | 234 | } else |
| 302 | #endif | 235 | #endif |
| 303 | err = remap_area_pages(addr, pfn, size, type); | 236 | err = ioremap_page_range(addr, addr + size, __pfn_to_phys(pfn), |
| 237 | __pgprot(type->prot_pte)); | ||
| 304 | 238 | ||
| 305 | if (err) { | 239 | if (err) { |
| 306 | vunmap((void *)addr); | 240 | vunmap((void *)addr); |
