diff options
Diffstat (limited to 'arch/m68k/include/asm/raw_io.h')
| -rw-r--r-- | arch/m68k/include/asm/raw_io.h | 109 | 
1 files changed, 108 insertions, 1 deletions
diff --git a/arch/m68k/include/asm/raw_io.h b/arch/m68k/include/asm/raw_io.h index d9eb9834ccc..932faa35655 100644 --- a/arch/m68k/include/asm/raw_io.h +++ b/arch/m68k/include/asm/raw_io.h @@ -10,7 +10,7 @@  #ifdef __KERNEL__ -#include <asm/types.h> +#include <asm/byteorder.h>  /* Values for nocacheflag and cmode */ @@ -60,6 +60,57 @@ extern void __iounmap(void *addr, unsigned long size);  #define __raw_writew(val,addr) out_be16((addr),(val))  #define __raw_writel(val,addr) out_be32((addr),(val)) +/* + * Atari ROM port (cartridge port) ISA adapter, used for the EtherNEC NE2000 + * network card driver. + * The ISA adapter connects address lines A9-A13 to ISA address lines A0-A4, + * and hardwires the rest of the ISA addresses for a base address of 0x300. + * + * Data lines D8-D15 are connected to ISA data lines D0-D7 for reading. + * For writes, address lines A1-A8 are latched to ISA data lines D0-D7 + * (meaning the bit pattern on A1-A8 can be read back as byte). + * + * Read and write operations are distinguished by the base address used: + * reads are from the ROM A side range, writes are through the B side range + * addresses (A side base + 0x10000). + * + * Reads and writes are byte only. + * + * 16 bit reads and writes are necessary for the NetUSBee adapter's USB + * chipset - 16 bit words are read straight off the ROM port while 16 bit + * reads are split into two byte writes. The low byte is latched to the + * NetUSBee buffer by a read from the _read_ window (with the data pattern + * asserted as A1-A8 address pattern). The high byte is then written to the + * write range as usual, completing the write cycle. + */ + +#if defined(CONFIG_ATARI_ROM_ISA) +#define rom_in_8(addr) \ +	({ u16 __v = (*(__force volatile u16 *) (addr)); __v >>= 8; __v; }) +#define rom_in_be16(addr) \ +	({ u16 __v = (*(__force volatile u16 *) (addr)); __v; }) +#define rom_in_le16(addr) \ +	({ u16 __v = le16_to_cpu(*(__force volatile u16 *) (addr)); __v; }) + +#define rom_out_8(addr, b)	\ +	({u8 __w, __v = (b);  u32 _addr = ((u32) (addr)); \ +	__w = ((*(__force volatile u8 *)  ((_addr | 0x10000) + (__v<<1)))); }) +#define rom_out_be16(addr, w)	\ +	({u16 __w, __v = (w); u32 _addr = ((u32) (addr)); \ +	__w = ((*(__force volatile u16 *) ((_addr & 0xFFFF0000UL) + ((__v & 0xFF)<<1)))); \ +	__w = ((*(__force volatile u16 *) ((_addr | 0x10000) + ((__v >> 8)<<1)))); }) +#define rom_out_le16(addr, w)	\ +	({u16 __w, __v = (w); u32 _addr = ((u32) (addr)); \ +	__w = ((*(__force volatile u16 *) ((_addr & 0xFFFF0000UL) + ((__v >> 8)<<1)))); \ +	__w = ((*(__force volatile u16 *) ((_addr | 0x10000) + ((__v & 0xFF)<<1)))); }) + +#define raw_rom_inb rom_in_8 +#define raw_rom_inw rom_in_be16 + +#define raw_rom_outb(val, port) rom_out_8((port), (val)) +#define raw_rom_outw(val, port) rom_out_be16((port), (val)) +#endif /* CONFIG_ATARI_ROM_ISA */ +  static inline void raw_insb(volatile u8 __iomem *port, u8 *buf, unsigned int len)  {  	unsigned int i; @@ -342,6 +393,62 @@ static inline void raw_outsw_swapw(volatile u16 __iomem *port, const u16 *buf,  		: "d0", "a0", "a1", "d6");  } + +#if defined(CONFIG_ATARI_ROM_ISA) +static inline void raw_rom_insb(volatile u8 __iomem *port, u8 *buf, unsigned int len) +{ +	unsigned int i; + +	for (i = 0; i < len; i++) +		*buf++ = rom_in_8(port); +} + +static inline void raw_rom_outsb(volatile u8 __iomem *port, const u8 *buf, +			     unsigned int len) +{ +	unsigned int i; + +	for (i = 0; i < len; i++) +		rom_out_8(port, *buf++); +} + +static inline void raw_rom_insw(volatile u16 __iomem *port, u16 *buf, +				   unsigned int nr) +{ +	unsigned int i; + +	for (i = 0; i < nr; i++) +		*buf++ = rom_in_be16(port); +} + +static inline void raw_rom_outsw(volatile u16 __iomem *port, const u16 *buf, +				   unsigned int nr) +{ +	unsigned int i; + +	for (i = 0; i < nr; i++) +		rom_out_be16(port, *buf++); +} + +static inline void raw_rom_insw_swapw(volatile u16 __iomem *port, u16 *buf, +				   unsigned int nr) +{ +	unsigned int i; + +	for (i = 0; i < nr; i++) +		*buf++ = rom_in_le16(port); +} + +static inline void raw_rom_outsw_swapw(volatile u16 __iomem *port, const u16 *buf, +				   unsigned int nr) +{ +	unsigned int i; + +	for (i = 0; i < nr; i++) +		rom_out_le16(port, *buf++); +} +#endif /* CONFIG_ATARI_ROM_ISA */ +  #endif /* __KERNEL__ */  #endif /* _RAW_IO_H */  |