Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+4 -70
+4 -70
arch/arm/mm/ioremap.c
··· 42 42 */ 43 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 45 int ioremap_page(unsigned long virt, unsigned long phys, 114 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 51 EXPORT_SYMBOL(ioremap_page); 119 52 ··· 233 300 err = remap_area_sections(addr, pfn, size, type); 234 301 } else 235 302 #endif 236 - err = remap_area_pages(addr, pfn, size, type); 303 + err = ioremap_page_range(addr, addr + size, __pfn_to_phys(pfn), 304 + __pgprot(type->prot_pte)); 237 305 238 306 if (err) { 239 307 vunmap((void *)addr);