| /* Generic I/O port emulation, based on MN10300 code | 
 |  * | 
 |  * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. | 
 |  * Written by David Howells (dhowells@redhat.com) | 
 |  * | 
 |  * This program is free software; you can redistribute it and/or | 
 |  * modify it under the terms of the GNU General Public Licence | 
 |  * as published by the Free Software Foundation; either version | 
 |  * 2 of the Licence, or (at your option) any later version. | 
 |  * | 
 |  * Modified for Akaros (mostly just trimmed down and change b->8, w->16, etc). | 
 |  * Arches can't override these either.  I'm undecided about void* vs uintptr_t | 
 |  * for the addr parameter. | 
 |  */ | 
 |  | 
 | #pragma once | 
 |  | 
 | #include <sys/types.h> | 
 | #include <endian.h> | 
 |  | 
 | #define __iomem | 
 | #define __force | 
 |  | 
 | /* | 
 |  * __raw_{read,write}{8,16,32,64}() access memory in native endianness. | 
 |  * | 
 |  * On some architectures memory mapped IO needs to be accessed differently. | 
 |  * On the simple architectures, we just read/write the memory location | 
 |  * directly. | 
 |  */ | 
 | static inline uint8_t __raw_read8(const volatile uint8_t __iomem *addr) | 
 | { | 
 | 	return *(const volatile uint8_t __force *)addr; | 
 | } | 
 |  | 
 | static inline uint16_t __raw_read16(const volatile uint16_t __iomem *addr) | 
 | { | 
 | 	return *(const volatile uint16_t __force *)addr; | 
 | } | 
 |  | 
 | static inline uint32_t __raw_read32(const volatile uint32_t __iomem *addr) | 
 | { | 
 | 	return *(const volatile uint32_t __force *)addr; | 
 | } | 
 |  | 
 | static inline uint64_t __raw_read64(const volatile uint64_t __iomem *addr) | 
 | { | 
 | 	return *(const volatile uint64_t __force *)addr; | 
 | } | 
 |  | 
 | static inline void __raw_write8(uint8_t value, volatile uint8_t __iomem *addr) | 
 | { | 
 | 	*(volatile uint8_t __force *)addr = value; | 
 | } | 
 |  | 
 | static inline void __raw_write16(uint16_t value, | 
 |                                  volatile uint16_t __iomem *addr) | 
 | { | 
 | 	*(volatile uint16_t __force *)addr = value; | 
 | } | 
 |  | 
 | static inline void __raw_write32(uint32_t value, | 
 |                                  volatile uint32_t __iomem *addr) | 
 | { | 
 | 	*(volatile uint32_t __force *)addr = value; | 
 | } | 
 |  | 
 | static inline void __raw_write64(uint64_t value, | 
 |                                  volatile uint64_t __iomem *addr) | 
 | { | 
 | 	*(volatile uint64_t __force *)addr = value; | 
 | } | 
 |  | 
 | /* | 
 |  * {read,write}{8,16,32,64}() access little endian memory and return result in | 
 |  * native endianness. | 
 |  */ | 
 | static inline uint8_t read8(const volatile uint8_t __iomem *addr) | 
 | { | 
 | 	return __raw_read8(addr); | 
 | } | 
 |  | 
 | static inline uint16_t read16(const volatile uint16_t __iomem *addr) | 
 | { | 
 | 	return le16_to_cpu(__raw_read16(addr)); | 
 | } | 
 |  | 
 | static inline uint32_t read32(const volatile uint32_t __iomem *addr) | 
 | { | 
 | 	return le32_to_cpu(__raw_read32(addr)); | 
 | } | 
 |  | 
 | static inline uint64_t read64(const volatile uint64_t __iomem *addr) | 
 | { | 
 | 	return le64_to_cpu(__raw_read64(addr)); | 
 | } | 
 |  | 
 | static inline void write8(uint8_t value, volatile uint8_t __iomem *addr) | 
 | { | 
 | 	__raw_write8(value, addr); | 
 | } | 
 |  | 
 | static inline void write16(uint16_t value, volatile uint16_t __iomem *addr) | 
 | { | 
 | 	__raw_write16(cpu_to_le16(value), addr); | 
 | } | 
 |  | 
 | static inline void write32(uint32_t value, volatile uint32_t __iomem *addr) | 
 | { | 
 | 	__raw_write32(cpu_to_le32(value), addr); | 
 | } | 
 |  | 
 | static inline void write64(uint64_t value, volatile uint64_t __iomem *addr) | 
 | { | 
 | 	__raw_write64(cpu_to_le64(value), addr); | 
 | } |