123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- // SPDX-License-Identifier: GPL-2.0
- // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
- #include <linux/export.h>
- #include <linux/mm.h>
- #include <linux/vmalloc.h>
- #include <linux/io.h>
- #include <asm/pgtable.h>
- void __iomem *ioremap(phys_addr_t addr, size_t size)
- {
- phys_addr_t last_addr;
- unsigned long offset, vaddr;
- struct vm_struct *area;
- pgprot_t prot;
- 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_ALLOC, __builtin_return_address(0));
- if (!area)
- return NULL;
- vaddr = (unsigned long)area->addr;
- prot = __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE |
- _PAGE_GLOBAL | _CACHE_UNCACHED);
- if (ioremap_page_range(vaddr, vaddr + size, addr, prot)) {
- free_vm_area(area);
- return NULL;
- }
- return (void __iomem *)(vaddr + offset);
- }
- EXPORT_SYMBOL(ioremap);
- void iounmap(void __iomem *addr)
- {
- vunmap((void *)((unsigned long)addr & PAGE_MASK));
- }
- EXPORT_SYMBOL(iounmap);
|