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>
This commit is contained in:
parent
ac3e3fb424
commit
d746196361
@ -42,78 +42,11 @@
|
||||
*/
|
||||
#define VM_ARM_SECTION_MAPPING 0x80000000
|
||||
|
||||
static int remap_area_pte(pmd_t *pmd, unsigned long addr, unsigned long end,
|
||||
unsigned long phys_addr, const struct mem_type *type)
|
||||
{
|
||||
pgprot_t prot = __pgprot(type->prot_pte);
|
||||
pte_t *pte;
|
||||
|
||||
pte = pte_alloc_kernel(pmd, addr);
|
||||
if (!pte)
|
||||
return -ENOMEM;
|
||||
|
||||
do {
|
||||
if (!pte_none(*pte))
|
||||
goto bad;
|
||||
|
||||
set_pte_ext(pte, pfn_pte(phys_addr >> PAGE_SHIFT, prot), 0);
|
||||
phys_addr += PAGE_SIZE;
|
||||
} while (pte++, addr += PAGE_SIZE, addr != end);
|
||||
return 0;
|
||||
|
||||
bad:
|
||||
printk(KERN_CRIT "remap_area_pte: page already exists\n");
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline int remap_area_pmd(pgd_t *pgd, unsigned long addr,
|
||||
unsigned long end, unsigned long phys_addr,
|
||||
const struct mem_type *type)
|
||||
{
|
||||
unsigned long next;
|
||||
pmd_t *pmd;
|
||||
int ret = 0;
|
||||
|
||||
pmd = pmd_alloc(&init_mm, pgd, addr);
|
||||
if (!pmd)
|
||||
return -ENOMEM;
|
||||
|
||||
do {
|
||||
next = pmd_addr_end(addr, end);
|
||||
ret = remap_area_pte(pmd, addr, next, phys_addr, type);
|
||||
if (ret)
|
||||
return ret;
|
||||
phys_addr += next - addr;
|
||||
} while (pmd++, addr = next, addr != end);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int remap_area_pages(unsigned long start, unsigned long pfn,
|
||||
size_t size, const struct mem_type *type)
|
||||
{
|
||||
unsigned long addr = start;
|
||||
unsigned long next, end = start + size;
|
||||
unsigned long phys_addr = __pfn_to_phys(pfn);
|
||||
pgd_t *pgd;
|
||||
int err = 0;
|
||||
|
||||
BUG_ON(addr >= end);
|
||||
pgd = pgd_offset_k(addr);
|
||||
do {
|
||||
next = pgd_addr_end(addr, end);
|
||||
err = remap_area_pmd(pgd, addr, next, phys_addr, type);
|
||||
if (err)
|
||||
break;
|
||||
phys_addr += next - addr;
|
||||
} while (pgd++, addr = next, addr != end);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int ioremap_page(unsigned long virt, unsigned long phys,
|
||||
const struct mem_type *mtype)
|
||||
{
|
||||
return remap_area_pages(virt, __phys_to_pfn(phys), PAGE_SIZE, mtype);
|
||||
return ioremap_page_range(virt, virt + PAGE_SIZE, phys,
|
||||
__pgprot(mtype->prot_pte));
|
||||
}
|
||||
EXPORT_SYMBOL(ioremap_page);
|
||||
|
||||
@ -300,7 +233,8 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn,
|
||||
err = remap_area_sections(addr, pfn, size, type);
|
||||
} else
|
||||
#endif
|
||||
err = remap_area_pages(addr, pfn, size, type);
|
||||
err = ioremap_page_range(addr, addr + size, __pfn_to_phys(pfn),
|
||||
__pgprot(type->prot_pte));
|
||||
|
||||
if (err) {
|
||||
vunmap((void *)addr);
|
||||
|
Loading…
Reference in New Issue
Block a user