1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * IO definitions for the Hexagon architecture 4 * 5 * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved. 6 */ 7 8 #ifndef _ASM_IO_H 9 #define _ASM_IO_H 10 11 #include <linux/types.h> 12 #include <asm/page.h> 13 #include <asm/cacheflush.h> 14 15 extern int remap_area_pages(unsigned long start, unsigned long phys_addr, 16 unsigned long end, unsigned long flags); 17 18 /* 19 * virt_to_phys - map virtual address to physical 20 * @address: address to map 21 */ 22 static inline unsigned long virt_to_phys(volatile void *address) 23 { 24 return __pa(address); 25 } 26 27 /* 28 * phys_to_virt - map physical address to virtual 29 * @address: address to map 30 */ 31 static inline void *phys_to_virt(unsigned long address) 32 { 33 return __va(address); 34 } 35 36 /* 37 * readb - read byte from memory mapped device 38 * @addr: pointer to memory 39 * 40 */ 41 static inline u8 __raw_readb(const volatile void __iomem *addr) 42 { 43 u8 val; 44 asm volatile( 45 "%0 = memb(%1);" 46 : "=&r" (val) 47 : "r" (addr) 48 ); 49 return val; 50 } 51 #define __raw_readb __raw_readb 52 53 static inline u16 __raw_readw(const volatile void __iomem *addr) 54 { 55 u16 val; 56 asm volatile( 57 "%0 = memh(%1);" 58 : "=&r" (val) 59 : "r" (addr) 60 ); 61 return val; 62 } 63 #define __raw_readw __raw_readw 64 65 static inline u32 __raw_readl(const volatile void __iomem *addr) 66 { 67 u32 val; 68 asm volatile( 69 "%0 = memw(%1);" 70 : "=&r" (val) 71 : "r" (addr) 72 ); 73 return val; 74 } 75 #define __raw_readl __raw_readl 76 77 /* 78 * writeb - write a byte to a memory location 79 * @data: data to write to 80 * @addr: pointer to memory 81 * 82 */ 83 static inline void __raw_writeb(u8 data, volatile void __iomem *addr) 84 { 85 asm volatile( 86 "memb(%0) = %1;" 87 : 88 : "r" (addr), "r" (data) 89 : "memory" 90 ); 91 } 92 #define __raw_writeb __raw_writeb 93 94 static inline void __raw_writew(u16 data, volatile void __iomem *addr) 95 { 96 asm volatile( 97 "memh(%0) = %1;" 98 : 99 : "r" (addr), "r" (data) 100 : "memory" 101 ); 102 103 } 104 #define __raw_writew __raw_writew 105 106 static inline void __raw_writel(u32 data, volatile void __iomem *addr) 107 { 108 asm volatile( 109 "memw(%0) = %1;" 110 : 111 : "r" (addr), "r" (data) 112 : "memory" 113 ); 114 } 115 #define __raw_writel __raw_writel 116 117 /* 118 * I/O memory mapping functions. 119 */ 120 #define _PAGE_IOREMAP (_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \ 121 (__HEXAGON_C_DEV << 6)) 122 123 /* 124 * These defines are necessary to use the generic io.h for filling in 125 * the missing parts of the API contract. This is because the platform 126 * uses (inline) functions rather than defines and the generic helper 127 * fills in the undefined. 128 */ 129 #define virt_to_phys virt_to_phys 130 #define phys_to_virt phys_to_virt 131 #include <asm-generic/io.h> 132 133 #endif 134