Commit 0055f67b authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

csky: use generic ioremap



Use the generic ioremap_prot and iounmap helpers.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Acked-by: default avatarGuo Ren <guoren@kernel.org>
parent 1246b814
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ config CSKY
	select IRQ_DOMAIN
	select HANDLE_DOMAIN_IRQ
	select DW_APB_TIMER_OF
	select GENERIC_IOREMAP
	select GENERIC_LIB_ASHLDI3
	select GENERIC_LIB_ASHRDI3
	select GENERIC_LIB_LSHRDI3
+3 −5
Original line number Diff line number Diff line
@@ -36,11 +36,9 @@
/*
 * I/O memory mapping functions.
 */
extern void __iomem *__ioremap(phys_addr_t addr, size_t size, pgprot_t prot);
extern void iounmap(void *addr);

#define ioremap(addr, size)		__ioremap((addr), (size), pgprot_noncached(PAGE_KERNEL))
#define ioremap_wc(addr, size)		__ioremap((addr), (size), pgprot_writecombine(PAGE_KERNEL))
#define ioremap_wc(addr, size) \
	ioremap_prot((addr), (size), \
		(_PAGE_IOREMAP & ~_CACHE_MASK) | _CACHE_UNCACHED)

#include <asm-generic/io.h>

+4 −0
Original line number Diff line number Diff line
@@ -86,6 +86,10 @@
#define PAGE_USERIO	__pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
				_CACHE_CACHED)

#define _PAGE_IOREMAP \
	(_PAGE_PRESENT | __READABLE | __WRITEABLE | _PAGE_GLOBAL | \
	 _CACHE_UNCACHED | _PAGE_SO)

#define __P000	PAGE_NONE
#define __P001	PAGE_READONLY
#define __P010	PAGE_COPY
+0 −45
Original line number Diff line number Diff line
@@ -3,53 +3,8 @@

#include <linux/export.h>
#include <linux/mm.h>
#include <linux/vmalloc.h>
#include <linux/io.h>

#include <asm/pgtable.h>

static void __iomem *__ioremap_caller(phys_addr_t addr, size_t size,
				      pgprot_t prot, void *caller)
{
	phys_addr_t last_addr;
	unsigned long offset, vaddr;
	struct vm_struct *area;

	last_addr = addr + size - 1;
	if (!size || last_addr < addr)
		return NULL;

	offset = addr & (~PAGE_MASK);
	addr &= PAGE_MASK;
	size = PAGE_ALIGN(size + offset);

	area = get_vm_area_caller(size, VM_IOREMAP, caller);
	if (!area)
		return NULL;

	vaddr = (unsigned long)area->addr;

	if (ioremap_page_range(vaddr, vaddr + size, addr, prot)) {
		free_vm_area(area);
		return NULL;
	}

	return (void __iomem *)(vaddr + offset);
}

void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot)
{
	return __ioremap_caller(phys_addr, size, prot,
				__builtin_return_address(0));
}
EXPORT_SYMBOL(__ioremap);

void iounmap(void __iomem *addr)
{
	vunmap((void *)((unsigned long)addr & PAGE_MASK));
}
EXPORT_SYMBOL(iounmap);

pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
			      unsigned long size, pgprot_t vma_prot)
{