Commit eafee594 authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

nds32: use generic ioremap



Use the generic ioremap_prot and iounmap helpers.

Note that the io.h include in pgtable.h had to be removed to not create
an include loop.  As far as I can tell there was no need for it to
start with.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Acked-by: default avatarGreentime Hu <green.hu@gmail.com>
parent 0055f67b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ config NDS32
	select GENERIC_CLOCKEVENTS
	select GENERIC_IRQ_CHIP
	select GENERIC_IRQ_SHOW
	select GENERIC_IOREMAP
	select GENERIC_LIB_ASHLDI3
	select GENERIC_LIB_ASHRDI3
	select GENERIC_LIB_CMPDI2
+1 −2
Original line number Diff line number Diff line
@@ -6,8 +6,6 @@

#include <linux/types.h>

void __iomem *ioremap(phys_addr_t phys_addr, size_t size);
extern void iounmap(volatile void __iomem *addr);
#define __raw_writeb __raw_writeb
static inline void __raw_writeb(u8 val, volatile void __iomem *addr)
{
@@ -80,6 +78,7 @@ static inline u32 __raw_readl(const volatile void __iomem *addr)
#define writeb(v,c)	({ __iowmb(); writeb_relaxed((v),(c)); })
#define writew(v,c)	({ __iowmb(); writew_relaxed((v),(c)); })
#define writel(v,c)	({ __iowmb(); writel_relaxed((v),(c)); })

#include <asm-generic/io.h>

#endif /* __ASM_NDS32_IO_H */
+3 −1
Original line number Diff line number Diff line
@@ -12,7 +12,6 @@
#include <asm/nds32.h>
#ifndef __ASSEMBLY__
#include <asm/fixmap.h>
#include <asm/io.h>
#include <nds32_intrinsic.h>
#endif

@@ -130,6 +129,9 @@ extern void __pgd_error(const char *file, int line, unsigned long val);
#define _PAGE_CACHE		_PAGE_C_MEM_WB
#endif

#define _PAGE_IOREMAP \
	(_PAGE_V | _PAGE_M_KRW | _PAGE_D | _PAGE_G | _PAGE_C_DEV)

/*
 * + Level 1 descriptor (PMD)
 */
+1 −2
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only
obj-y				:= extable.o tlb.o \
				   fault.o init.o ioremap.o mmap.o \
obj-y				:= extable.o tlb.o fault.o init.o mmap.o \
                                   mm-nds32.o cacheflush.o proc.o

obj-$(CONFIG_ALIGNMENT_TRAP)	+= alignment.o

arch/nds32/mm/ioremap.c

deleted100644 → 0
+0 −62
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
// Copyright (C) 2005-2017 Andes Technology Corporation

#include <linux/vmalloc.h>
#include <linux/io.h>
#include <linux/mm.h>
#include <asm/pgtable.h>

void __iomem *ioremap(phys_addr_t phys_addr, size_t size);

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

	/* Don't allow wraparound or zero size */
	last_addr = phys_addr + size - 1;
	if (!size || last_addr < phys_addr)
		return NULL;

	/*
	 * Mappings have to be page-aligned
	 */
	offset = phys_addr & ~PAGE_MASK;
	phys_addr &= PAGE_MASK;
	size = PAGE_ALIGN(last_addr + 1) - phys_addr;

	/*
	 * Ok, go for it..
	 */
	area = get_vm_area_caller(size, VM_IOREMAP, caller);
	if (!area)
		return NULL;

	area->phys_addr = phys_addr;
	addr = (unsigned long)area->addr;
	prot = __pgprot(_PAGE_V | _PAGE_M_KRW | _PAGE_D |
			_PAGE_G | _PAGE_C_DEV);
	if (ioremap_page_range(addr, addr + size, phys_addr, prot)) {
		vunmap((void *)addr);
		return NULL;
	}
	return (__force void __iomem *)(offset + (char *)addr);

}

void __iomem *ioremap(phys_addr_t phys_addr, size_t size)
{
	return __ioremap_caller(phys_addr, size,
				__builtin_return_address(0));
}

EXPORT_SYMBOL(ioremap);

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

EXPORT_SYMBOL(iounmap);