]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - lib/ioremap.c
Merge tag 'f2fs-for-5.5' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs
[linux.git] / lib / ioremap.c
index 0a2ffadc6d71e4f0444f63cd6f6900ad10ff02da..3f0e18543de84f9b94d64a8a6d79ef5e35ea8d7a 100644 (file)
@@ -231,3 +231,42 @@ int ioremap_page_range(unsigned long addr,
 
        return err;
 }
+
+#ifdef CONFIG_GENERIC_IOREMAP
+void __iomem *ioremap_prot(phys_addr_t addr, size_t size, unsigned long prot)
+{
+       unsigned long offset, vaddr;
+       phys_addr_t last_addr;
+       struct vm_struct *area;
+
+       /* Disallow wrap-around or zero size */
+       last_addr = addr + size - 1;
+       if (!size || last_addr < addr)
+               return NULL;
+
+       /* Page-align mappings */
+       offset = addr & (~PAGE_MASK);
+       addr -= offset;
+       size = PAGE_ALIGN(size + offset);
+
+       area = get_vm_area_caller(size, VM_IOREMAP,
+                       __builtin_return_address(0));
+       if (!area)
+               return NULL;
+       vaddr = (unsigned long)area->addr;
+
+       if (ioremap_page_range(vaddr, vaddr + size, addr, __pgprot(prot))) {
+               free_vm_area(area);
+               return NULL;
+       }
+
+       return (void __iomem *)(vaddr + offset);
+}
+EXPORT_SYMBOL(ioremap_prot);
+
+void iounmap(volatile void __iomem *addr)
+{
+       vunmap((void *)((unsigned long)addr & PAGE_MASK));
+}
+EXPORT_SYMBOL(iounmap);
+#endif /* CONFIG_GENERIC_IOREMAP */