1 // SPDX-License-Identifier: GPL-2.0-only
3 * I/O remap functions for Hexagon
5 * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
9 #include <linux/vmalloc.h>
12 void __iomem
*ioremap(unsigned long phys_addr
, unsigned long size
)
14 unsigned long last_addr
, addr
;
15 unsigned long offset
= phys_addr
& ~PAGE_MASK
;
16 struct vm_struct
*area
;
18 pgprot_t prot
= __pgprot(_PAGE_PRESENT
|_PAGE_READ
|_PAGE_WRITE
19 |(__HEXAGON_C_DEV
<< 6));
21 last_addr
= phys_addr
+ size
- 1;
23 /* Wrapping not allowed */
24 if (!size
|| (last_addr
< phys_addr
))
27 /* Rounds up to next page size, including whole-page offset */
28 size
= PAGE_ALIGN(offset
+ size
);
30 area
= get_vm_area(size
, VM_IOREMAP
);
31 addr
= (unsigned long)area
->addr
;
33 if (ioremap_page_range(addr
, addr
+size
, phys_addr
, prot
)) {
38 return (void __iomem
*) (offset
+ addr
);
41 void iounmap(const volatile void __iomem
*addr
)
43 vunmap((void *) ((unsigned long) addr
& PAGE_MASK
));