Skip to content

Commit

Permalink
ARM: use generic ioremap_page_range()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Russell King committed Jul 27, 2010
1 parent ac3e3fb commit d746196
Showing 1 changed file with 4 additions and 70 deletions.
74 changes: 4 additions & 70 deletions arch/arm/mm/ioremap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit d746196

Please sign in to comment.