1 /* Public domain. */ 2 3 #ifndef _LINUX_IOSYS_MAP_H 4 #define _LINUX_IOSYS_MAP_H 5 6 #include <linux/io.h> 7 #include <linux/string.h> 8 9 struct iosys_map { 10 union { 11 void *vaddr_iomem; 12 void *vaddr; 13 }; 14 bool is_iomem; 15 bus_space_handle_t bsh; 16 bus_size_t size; 17 }; 18 19 static inline void 20 iosys_map_incr(struct iosys_map *ism, size_t n) 21 { 22 if (ism->is_iomem) 23 ism->vaddr_iomem += n; 24 else 25 ism->vaddr += n; 26 } 27 28 static inline void 29 iosys_map_memcpy_to(struct iosys_map *ism, size_t off, const void *src, 30 size_t len) 31 { 32 if (ism->is_iomem) 33 memcpy_toio(ism->vaddr_iomem + off, src, len); 34 else 35 memcpy(ism->vaddr + off, src, len); 36 } 37 38 static inline bool 39 iosys_map_is_null(const struct iosys_map *ism) 40 { 41 if (ism->is_iomem) 42 return (ism->vaddr_iomem == NULL); 43 else 44 return (ism->vaddr == NULL); 45 } 46 47 static inline bool 48 iosys_map_is_set(const struct iosys_map *ism) 49 { 50 if (ism->is_iomem) 51 return (ism->vaddr_iomem != NULL); 52 else 53 return (ism->vaddr != NULL); 54 } 55 56 static inline void 57 iosys_map_clear(struct iosys_map *ism) 58 { 59 if (ism->is_iomem) { 60 ism->vaddr_iomem = NULL; 61 ism->is_iomem = false; 62 } else { 63 ism->vaddr = NULL; 64 } 65 } 66 67 static inline void 68 iosys_map_set_vaddr_iomem(struct iosys_map *ism, void *addr) 69 { 70 ism->vaddr_iomem = addr; 71 ism->is_iomem = true; 72 } 73 74 static inline void 75 iosys_map_set_vaddr(struct iosys_map *ism, void *addr) 76 { 77 ism->vaddr = addr; 78 ism->is_iomem = false; 79 } 80 81 #endif 82