162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/include/asm-m68k/raw_io.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * 10/20/00 RZ: - created from bits of io.h and ide.h to cleanup namespace 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef _RAW_IO_H 1062306a36Sopenharmony_ci#define _RAW_IO_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#ifdef __KERNEL__ 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <asm/byteorder.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* ++roman: The assignments to temp. vars avoid that gcc sometimes generates 1762306a36Sopenharmony_ci * two accesses to memory, which may be undesirable for some devices. 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_ci#define in_8(addr) \ 2062306a36Sopenharmony_ci ({ u8 __v = (*(__force volatile u8 *) (unsigned long)(addr)); __v; }) 2162306a36Sopenharmony_ci#define in_be16(addr) \ 2262306a36Sopenharmony_ci ({ u16 __v = (*(__force volatile u16 *) (unsigned long)(addr)); __v; }) 2362306a36Sopenharmony_ci#define in_be32(addr) \ 2462306a36Sopenharmony_ci ({ u32 __v = (*(__force volatile u32 *) (unsigned long)(addr)); __v; }) 2562306a36Sopenharmony_ci#define in_le16(addr) \ 2662306a36Sopenharmony_ci ({ u16 __v = le16_to_cpu(*(__force volatile __le16 *) (unsigned long)(addr)); __v; }) 2762306a36Sopenharmony_ci#define in_le32(addr) \ 2862306a36Sopenharmony_ci ({ u32 __v = le32_to_cpu(*(__force volatile __le32 *) (unsigned long)(addr)); __v; }) 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#define out_8(addr,b) (void)((*(__force volatile u8 *) (unsigned long)(addr)) = (b)) 3162306a36Sopenharmony_ci#define out_be16(addr,w) (void)((*(__force volatile u16 *) (unsigned long)(addr)) = (w)) 3262306a36Sopenharmony_ci#define out_be32(addr,l) (void)((*(__force volatile u32 *) (unsigned long)(addr)) = (l)) 3362306a36Sopenharmony_ci#define out_le16(addr,w) (void)((*(__force volatile __le16 *) (unsigned long)(addr)) = cpu_to_le16(w)) 3462306a36Sopenharmony_ci#define out_le32(addr,l) (void)((*(__force volatile __le32 *) (unsigned long)(addr)) = cpu_to_le32(l)) 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define raw_inb in_8 3762306a36Sopenharmony_ci#define raw_inw in_be16 3862306a36Sopenharmony_ci#define raw_inl in_be32 3962306a36Sopenharmony_ci#define __raw_readb in_8 4062306a36Sopenharmony_ci#define __raw_readw in_be16 4162306a36Sopenharmony_ci#define __raw_readl in_be32 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define raw_outb(val,port) out_8((port),(val)) 4462306a36Sopenharmony_ci#define raw_outw(val,port) out_be16((port),(val)) 4562306a36Sopenharmony_ci#define raw_outl(val,port) out_be32((port),(val)) 4662306a36Sopenharmony_ci#define __raw_writeb(val,addr) out_8((addr),(val)) 4762306a36Sopenharmony_ci#define __raw_writew(val,addr) out_be16((addr),(val)) 4862306a36Sopenharmony_ci#define __raw_writel(val,addr) out_be32((addr),(val)) 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* 5162306a36Sopenharmony_ci * Atari ROM port (cartridge port) ISA adapter, used for the EtherNEC NE2000 5262306a36Sopenharmony_ci * network card driver. 5362306a36Sopenharmony_ci * The ISA adapter connects address lines A9-A13 to ISA address lines A0-A4, 5462306a36Sopenharmony_ci * and hardwires the rest of the ISA addresses for a base address of 0x300. 5562306a36Sopenharmony_ci * 5662306a36Sopenharmony_ci * Data lines D8-D15 are connected to ISA data lines D0-D7 for reading. 5762306a36Sopenharmony_ci * For writes, address lines A1-A8 are latched to ISA data lines D0-D7 5862306a36Sopenharmony_ci * (meaning the bit pattern on A1-A8 can be read back as byte). 5962306a36Sopenharmony_ci * 6062306a36Sopenharmony_ci * Read and write operations are distinguished by the base address used: 6162306a36Sopenharmony_ci * reads are from the ROM A side range, writes are through the B side range 6262306a36Sopenharmony_ci * addresses (A side base + 0x10000). 6362306a36Sopenharmony_ci * 6462306a36Sopenharmony_ci * Reads and writes are byte only. 6562306a36Sopenharmony_ci * 6662306a36Sopenharmony_ci * 16 bit reads and writes are necessary for the NetUSBee adapter's USB 6762306a36Sopenharmony_ci * chipset - 16 bit words are read straight off the ROM port while 16 bit 6862306a36Sopenharmony_ci * reads are split into two byte writes. The low byte is latched to the 6962306a36Sopenharmony_ci * NetUSBee buffer by a read from the _read_ window (with the data pattern 7062306a36Sopenharmony_ci * asserted as A1-A8 address pattern). The high byte is then written to the 7162306a36Sopenharmony_ci * write range as usual, completing the write cycle. 7262306a36Sopenharmony_ci */ 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#if defined(CONFIG_ATARI_ROM_ISA) 7562306a36Sopenharmony_ci#define rom_in_8(addr) \ 7662306a36Sopenharmony_ci ({ u16 __v = (*(__force volatile u16 *) (addr)); __v >>= 8; __v; }) 7762306a36Sopenharmony_ci#define rom_in_be16(addr) \ 7862306a36Sopenharmony_ci ({ u16 __v = (*(__force volatile u16 *) (addr)); __v; }) 7962306a36Sopenharmony_ci#define rom_in_le16(addr) \ 8062306a36Sopenharmony_ci ({ u16 __v = le16_to_cpu(*(__force volatile u16 *) (addr)); __v; }) 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci#define rom_out_8(addr, b) \ 8362306a36Sopenharmony_ci (void)({u8 __maybe_unused __w, __v = (b); u32 _addr = ((u32) (addr)); \ 8462306a36Sopenharmony_ci __w = ((*(__force volatile u8 *) ((_addr | 0x10000) + (__v<<1)))); }) 8562306a36Sopenharmony_ci#define rom_out_be16(addr, w) \ 8662306a36Sopenharmony_ci (void)({u16 __maybe_unused __w, __v = (w); u32 _addr = ((u32) (addr)); \ 8762306a36Sopenharmony_ci __w = ((*(__force volatile u16 *) ((_addr & 0xFFFF0000UL) + ((__v & 0xFF)<<1)))); \ 8862306a36Sopenharmony_ci __w = ((*(__force volatile u16 *) ((_addr | 0x10000) + ((__v >> 8)<<1)))); }) 8962306a36Sopenharmony_ci#define rom_out_le16(addr, w) \ 9062306a36Sopenharmony_ci (void)({u16 __maybe_unused __w, __v = (w); u32 _addr = ((u32) (addr)); \ 9162306a36Sopenharmony_ci __w = ((*(__force volatile u16 *) ((_addr & 0xFFFF0000UL) + ((__v >> 8)<<1)))); \ 9262306a36Sopenharmony_ci __w = ((*(__force volatile u16 *) ((_addr | 0x10000) + ((__v & 0xFF)<<1)))); }) 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci#define raw_rom_inb rom_in_8 9562306a36Sopenharmony_ci#define raw_rom_inw rom_in_be16 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci#define raw_rom_outb(val, port) rom_out_8((port), (val)) 9862306a36Sopenharmony_ci#define raw_rom_outw(val, port) rom_out_be16((port), (val)) 9962306a36Sopenharmony_ci#endif /* CONFIG_ATARI_ROM_ISA */ 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cistatic inline void raw_insb(volatile u8 __iomem *port, u8 *buf, unsigned int len) 10262306a36Sopenharmony_ci{ 10362306a36Sopenharmony_ci unsigned int i; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci for (i = 0; i < len; i++) 10662306a36Sopenharmony_ci *buf++ = in_8(port); 10762306a36Sopenharmony_ci} 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cistatic inline void raw_outsb(volatile u8 __iomem *port, const u8 *buf, 11062306a36Sopenharmony_ci unsigned int nr) 11162306a36Sopenharmony_ci{ 11262306a36Sopenharmony_ci unsigned int tmp; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci if (nr & 15) { 11562306a36Sopenharmony_ci tmp = (nr & 15) - 1; 11662306a36Sopenharmony_ci asm volatile ( 11762306a36Sopenharmony_ci "1: moveb %0@+,%2@; dbra %1,1b" 11862306a36Sopenharmony_ci : "=a" (buf), "=d" (tmp) 11962306a36Sopenharmony_ci : "a" (port), "0" (buf), 12062306a36Sopenharmony_ci "1" (tmp)); 12162306a36Sopenharmony_ci } 12262306a36Sopenharmony_ci if (nr >> 4) { 12362306a36Sopenharmony_ci tmp = (nr >> 4) - 1; 12462306a36Sopenharmony_ci asm volatile ( 12562306a36Sopenharmony_ci "1: " 12662306a36Sopenharmony_ci "moveb %0@+,%2@; " 12762306a36Sopenharmony_ci "moveb %0@+,%2@; " 12862306a36Sopenharmony_ci "moveb %0@+,%2@; " 12962306a36Sopenharmony_ci "moveb %0@+,%2@; " 13062306a36Sopenharmony_ci "moveb %0@+,%2@; " 13162306a36Sopenharmony_ci "moveb %0@+,%2@; " 13262306a36Sopenharmony_ci "moveb %0@+,%2@; " 13362306a36Sopenharmony_ci "moveb %0@+,%2@; " 13462306a36Sopenharmony_ci "moveb %0@+,%2@; " 13562306a36Sopenharmony_ci "moveb %0@+,%2@; " 13662306a36Sopenharmony_ci "moveb %0@+,%2@; " 13762306a36Sopenharmony_ci "moveb %0@+,%2@; " 13862306a36Sopenharmony_ci "moveb %0@+,%2@; " 13962306a36Sopenharmony_ci "moveb %0@+,%2@; " 14062306a36Sopenharmony_ci "moveb %0@+,%2@; " 14162306a36Sopenharmony_ci "moveb %0@+,%2@; " 14262306a36Sopenharmony_ci "dbra %1,1b" 14362306a36Sopenharmony_ci : "=a" (buf), "=d" (tmp) 14462306a36Sopenharmony_ci : "a" (port), "0" (buf), 14562306a36Sopenharmony_ci "1" (tmp)); 14662306a36Sopenharmony_ci } 14762306a36Sopenharmony_ci} 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_cistatic inline void raw_insw(volatile u16 __iomem *port, u16 *buf, unsigned int nr) 15062306a36Sopenharmony_ci{ 15162306a36Sopenharmony_ci unsigned int tmp; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci if (nr & 15) { 15462306a36Sopenharmony_ci tmp = (nr & 15) - 1; 15562306a36Sopenharmony_ci asm volatile ( 15662306a36Sopenharmony_ci "1: movew %2@,%0@+; dbra %1,1b" 15762306a36Sopenharmony_ci : "=a" (buf), "=d" (tmp) 15862306a36Sopenharmony_ci : "a" (port), "0" (buf), 15962306a36Sopenharmony_ci "1" (tmp)); 16062306a36Sopenharmony_ci } 16162306a36Sopenharmony_ci if (nr >> 4) { 16262306a36Sopenharmony_ci tmp = (nr >> 4) - 1; 16362306a36Sopenharmony_ci asm volatile ( 16462306a36Sopenharmony_ci "1: " 16562306a36Sopenharmony_ci "movew %2@,%0@+; " 16662306a36Sopenharmony_ci "movew %2@,%0@+; " 16762306a36Sopenharmony_ci "movew %2@,%0@+; " 16862306a36Sopenharmony_ci "movew %2@,%0@+; " 16962306a36Sopenharmony_ci "movew %2@,%0@+; " 17062306a36Sopenharmony_ci "movew %2@,%0@+; " 17162306a36Sopenharmony_ci "movew %2@,%0@+; " 17262306a36Sopenharmony_ci "movew %2@,%0@+; " 17362306a36Sopenharmony_ci "movew %2@,%0@+; " 17462306a36Sopenharmony_ci "movew %2@,%0@+; " 17562306a36Sopenharmony_ci "movew %2@,%0@+; " 17662306a36Sopenharmony_ci "movew %2@,%0@+; " 17762306a36Sopenharmony_ci "movew %2@,%0@+; " 17862306a36Sopenharmony_ci "movew %2@,%0@+; " 17962306a36Sopenharmony_ci "movew %2@,%0@+; " 18062306a36Sopenharmony_ci "movew %2@,%0@+; " 18162306a36Sopenharmony_ci "dbra %1,1b" 18262306a36Sopenharmony_ci : "=a" (buf), "=d" (tmp) 18362306a36Sopenharmony_ci : "a" (port), "0" (buf), 18462306a36Sopenharmony_ci "1" (tmp)); 18562306a36Sopenharmony_ci } 18662306a36Sopenharmony_ci} 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistatic inline void raw_outsw(volatile u16 __iomem *port, const u16 *buf, 18962306a36Sopenharmony_ci unsigned int nr) 19062306a36Sopenharmony_ci{ 19162306a36Sopenharmony_ci unsigned int tmp; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci if (nr & 15) { 19462306a36Sopenharmony_ci tmp = (nr & 15) - 1; 19562306a36Sopenharmony_ci asm volatile ( 19662306a36Sopenharmony_ci "1: movew %0@+,%2@; dbra %1,1b" 19762306a36Sopenharmony_ci : "=a" (buf), "=d" (tmp) 19862306a36Sopenharmony_ci : "a" (port), "0" (buf), 19962306a36Sopenharmony_ci "1" (tmp)); 20062306a36Sopenharmony_ci } 20162306a36Sopenharmony_ci if (nr >> 4) { 20262306a36Sopenharmony_ci tmp = (nr >> 4) - 1; 20362306a36Sopenharmony_ci asm volatile ( 20462306a36Sopenharmony_ci "1: " 20562306a36Sopenharmony_ci "movew %0@+,%2@; " 20662306a36Sopenharmony_ci "movew %0@+,%2@; " 20762306a36Sopenharmony_ci "movew %0@+,%2@; " 20862306a36Sopenharmony_ci "movew %0@+,%2@; " 20962306a36Sopenharmony_ci "movew %0@+,%2@; " 21062306a36Sopenharmony_ci "movew %0@+,%2@; " 21162306a36Sopenharmony_ci "movew %0@+,%2@; " 21262306a36Sopenharmony_ci "movew %0@+,%2@; " 21362306a36Sopenharmony_ci "movew %0@+,%2@; " 21462306a36Sopenharmony_ci "movew %0@+,%2@; " 21562306a36Sopenharmony_ci "movew %0@+,%2@; " 21662306a36Sopenharmony_ci "movew %0@+,%2@; " 21762306a36Sopenharmony_ci "movew %0@+,%2@; " 21862306a36Sopenharmony_ci "movew %0@+,%2@; " 21962306a36Sopenharmony_ci "movew %0@+,%2@; " 22062306a36Sopenharmony_ci "movew %0@+,%2@; " 22162306a36Sopenharmony_ci "dbra %1,1b" 22262306a36Sopenharmony_ci : "=a" (buf), "=d" (tmp) 22362306a36Sopenharmony_ci : "a" (port), "0" (buf), 22462306a36Sopenharmony_ci "1" (tmp)); 22562306a36Sopenharmony_ci } 22662306a36Sopenharmony_ci} 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cistatic inline void raw_insl(volatile u32 __iomem *port, u32 *buf, unsigned int nr) 22962306a36Sopenharmony_ci{ 23062306a36Sopenharmony_ci unsigned int tmp; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci if (nr & 15) { 23362306a36Sopenharmony_ci tmp = (nr & 15) - 1; 23462306a36Sopenharmony_ci asm volatile ( 23562306a36Sopenharmony_ci "1: movel %2@,%0@+; dbra %1,1b" 23662306a36Sopenharmony_ci : "=a" (buf), "=d" (tmp) 23762306a36Sopenharmony_ci : "a" (port), "0" (buf), 23862306a36Sopenharmony_ci "1" (tmp)); 23962306a36Sopenharmony_ci } 24062306a36Sopenharmony_ci if (nr >> 4) { 24162306a36Sopenharmony_ci tmp = (nr >> 4) - 1; 24262306a36Sopenharmony_ci asm volatile ( 24362306a36Sopenharmony_ci "1: " 24462306a36Sopenharmony_ci "movel %2@,%0@+; " 24562306a36Sopenharmony_ci "movel %2@,%0@+; " 24662306a36Sopenharmony_ci "movel %2@,%0@+; " 24762306a36Sopenharmony_ci "movel %2@,%0@+; " 24862306a36Sopenharmony_ci "movel %2@,%0@+; " 24962306a36Sopenharmony_ci "movel %2@,%0@+; " 25062306a36Sopenharmony_ci "movel %2@,%0@+; " 25162306a36Sopenharmony_ci "movel %2@,%0@+; " 25262306a36Sopenharmony_ci "movel %2@,%0@+; " 25362306a36Sopenharmony_ci "movel %2@,%0@+; " 25462306a36Sopenharmony_ci "movel %2@,%0@+; " 25562306a36Sopenharmony_ci "movel %2@,%0@+; " 25662306a36Sopenharmony_ci "movel %2@,%0@+; " 25762306a36Sopenharmony_ci "movel %2@,%0@+; " 25862306a36Sopenharmony_ci "movel %2@,%0@+; " 25962306a36Sopenharmony_ci "movel %2@,%0@+; " 26062306a36Sopenharmony_ci "dbra %1,1b" 26162306a36Sopenharmony_ci : "=a" (buf), "=d" (tmp) 26262306a36Sopenharmony_ci : "a" (port), "0" (buf), 26362306a36Sopenharmony_ci "1" (tmp)); 26462306a36Sopenharmony_ci } 26562306a36Sopenharmony_ci} 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cistatic inline void raw_outsl(volatile u32 __iomem *port, const u32 *buf, 26862306a36Sopenharmony_ci unsigned int nr) 26962306a36Sopenharmony_ci{ 27062306a36Sopenharmony_ci unsigned int tmp; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci if (nr & 15) { 27362306a36Sopenharmony_ci tmp = (nr & 15) - 1; 27462306a36Sopenharmony_ci asm volatile ( 27562306a36Sopenharmony_ci "1: movel %0@+,%2@; dbra %1,1b" 27662306a36Sopenharmony_ci : "=a" (buf), "=d" (tmp) 27762306a36Sopenharmony_ci : "a" (port), "0" (buf), 27862306a36Sopenharmony_ci "1" (tmp)); 27962306a36Sopenharmony_ci } 28062306a36Sopenharmony_ci if (nr >> 4) { 28162306a36Sopenharmony_ci tmp = (nr >> 4) - 1; 28262306a36Sopenharmony_ci asm volatile ( 28362306a36Sopenharmony_ci "1: " 28462306a36Sopenharmony_ci "movel %0@+,%2@; " 28562306a36Sopenharmony_ci "movel %0@+,%2@; " 28662306a36Sopenharmony_ci "movel %0@+,%2@; " 28762306a36Sopenharmony_ci "movel %0@+,%2@; " 28862306a36Sopenharmony_ci "movel %0@+,%2@; " 28962306a36Sopenharmony_ci "movel %0@+,%2@; " 29062306a36Sopenharmony_ci "movel %0@+,%2@; " 29162306a36Sopenharmony_ci "movel %0@+,%2@; " 29262306a36Sopenharmony_ci "movel %0@+,%2@; " 29362306a36Sopenharmony_ci "movel %0@+,%2@; " 29462306a36Sopenharmony_ci "movel %0@+,%2@; " 29562306a36Sopenharmony_ci "movel %0@+,%2@; " 29662306a36Sopenharmony_ci "movel %0@+,%2@; " 29762306a36Sopenharmony_ci "movel %0@+,%2@; " 29862306a36Sopenharmony_ci "movel %0@+,%2@; " 29962306a36Sopenharmony_ci "movel %0@+,%2@; " 30062306a36Sopenharmony_ci "dbra %1,1b" 30162306a36Sopenharmony_ci : "=a" (buf), "=d" (tmp) 30262306a36Sopenharmony_ci : "a" (port), "0" (buf), 30362306a36Sopenharmony_ci "1" (tmp)); 30462306a36Sopenharmony_ci } 30562306a36Sopenharmony_ci} 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_cistatic inline void raw_insw_swapw(volatile u16 __iomem *port, u16 *buf, 30962306a36Sopenharmony_ci unsigned int nr) 31062306a36Sopenharmony_ci{ 31162306a36Sopenharmony_ci if ((nr) % 8) 31262306a36Sopenharmony_ci __asm__ __volatile__ 31362306a36Sopenharmony_ci ("\tmovel %0,%/a0\n\t" 31462306a36Sopenharmony_ci "movel %1,%/a1\n\t" 31562306a36Sopenharmony_ci "movel %2,%/d6\n\t" 31662306a36Sopenharmony_ci "subql #1,%/d6\n" 31762306a36Sopenharmony_ci "1:\tmovew %/a0@,%/d0\n\t" 31862306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 31962306a36Sopenharmony_ci "movew %/d0,%/a1@+\n\t" 32062306a36Sopenharmony_ci "dbra %/d6,1b" 32162306a36Sopenharmony_ci : 32262306a36Sopenharmony_ci : "g" (port), "g" (buf), "g" (nr) 32362306a36Sopenharmony_ci : "d0", "a0", "a1", "d6"); 32462306a36Sopenharmony_ci else 32562306a36Sopenharmony_ci __asm__ __volatile__ 32662306a36Sopenharmony_ci ("movel %0,%/a0\n\t" 32762306a36Sopenharmony_ci "movel %1,%/a1\n\t" 32862306a36Sopenharmony_ci "movel %2,%/d6\n\t" 32962306a36Sopenharmony_ci "lsrl #3,%/d6\n\t" 33062306a36Sopenharmony_ci "subql #1,%/d6\n" 33162306a36Sopenharmony_ci "1:\tmovew %/a0@,%/d0\n\t" 33262306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 33362306a36Sopenharmony_ci "movew %/d0,%/a1@+\n\t" 33462306a36Sopenharmony_ci "movew %/a0@,%/d0\n\t" 33562306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 33662306a36Sopenharmony_ci "movew %/d0,%/a1@+\n\t" 33762306a36Sopenharmony_ci "movew %/a0@,%/d0\n\t" 33862306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 33962306a36Sopenharmony_ci "movew %/d0,%/a1@+\n\t" 34062306a36Sopenharmony_ci "movew %/a0@,%/d0\n\t" 34162306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 34262306a36Sopenharmony_ci "movew %/d0,%/a1@+\n\t" 34362306a36Sopenharmony_ci "movew %/a0@,%/d0\n\t" 34462306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 34562306a36Sopenharmony_ci "movew %/d0,%/a1@+\n\t" 34662306a36Sopenharmony_ci "movew %/a0@,%/d0\n\t" 34762306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 34862306a36Sopenharmony_ci "movew %/d0,%/a1@+\n\t" 34962306a36Sopenharmony_ci "movew %/a0@,%/d0\n\t" 35062306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 35162306a36Sopenharmony_ci "movew %/d0,%/a1@+\n\t" 35262306a36Sopenharmony_ci "movew %/a0@,%/d0\n\t" 35362306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 35462306a36Sopenharmony_ci "movew %/d0,%/a1@+\n\t" 35562306a36Sopenharmony_ci "dbra %/d6,1b" 35662306a36Sopenharmony_ci : 35762306a36Sopenharmony_ci : "g" (port), "g" (buf), "g" (nr) 35862306a36Sopenharmony_ci : "d0", "a0", "a1", "d6"); 35962306a36Sopenharmony_ci} 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_cistatic inline void raw_outsw_swapw(volatile u16 __iomem *port, const u16 *buf, 36262306a36Sopenharmony_ci unsigned int nr) 36362306a36Sopenharmony_ci{ 36462306a36Sopenharmony_ci if ((nr) % 8) 36562306a36Sopenharmony_ci __asm__ __volatile__ 36662306a36Sopenharmony_ci ("movel %0,%/a0\n\t" 36762306a36Sopenharmony_ci "movel %1,%/a1\n\t" 36862306a36Sopenharmony_ci "movel %2,%/d6\n\t" 36962306a36Sopenharmony_ci "subql #1,%/d6\n" 37062306a36Sopenharmony_ci "1:\tmovew %/a1@+,%/d0\n\t" 37162306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 37262306a36Sopenharmony_ci "movew %/d0,%/a0@\n\t" 37362306a36Sopenharmony_ci "dbra %/d6,1b" 37462306a36Sopenharmony_ci : 37562306a36Sopenharmony_ci : "g" (port), "g" (buf), "g" (nr) 37662306a36Sopenharmony_ci : "d0", "a0", "a1", "d6"); 37762306a36Sopenharmony_ci else 37862306a36Sopenharmony_ci __asm__ __volatile__ 37962306a36Sopenharmony_ci ("movel %0,%/a0\n\t" 38062306a36Sopenharmony_ci "movel %1,%/a1\n\t" 38162306a36Sopenharmony_ci "movel %2,%/d6\n\t" 38262306a36Sopenharmony_ci "lsrl #3,%/d6\n\t" 38362306a36Sopenharmony_ci "subql #1,%/d6\n" 38462306a36Sopenharmony_ci "1:\tmovew %/a1@+,%/d0\n\t" 38562306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 38662306a36Sopenharmony_ci "movew %/d0,%/a0@\n\t" 38762306a36Sopenharmony_ci "movew %/a1@+,%/d0\n\t" 38862306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 38962306a36Sopenharmony_ci "movew %/d0,%/a0@\n\t" 39062306a36Sopenharmony_ci "movew %/a1@+,%/d0\n\t" 39162306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 39262306a36Sopenharmony_ci "movew %/d0,%/a0@\n\t" 39362306a36Sopenharmony_ci "movew %/a1@+,%/d0\n\t" 39462306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 39562306a36Sopenharmony_ci "movew %/d0,%/a0@\n\t" 39662306a36Sopenharmony_ci "movew %/a1@+,%/d0\n\t" 39762306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 39862306a36Sopenharmony_ci "movew %/d0,%/a0@\n\t" 39962306a36Sopenharmony_ci "movew %/a1@+,%/d0\n\t" 40062306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 40162306a36Sopenharmony_ci "movew %/d0,%/a0@\n\t" 40262306a36Sopenharmony_ci "movew %/a1@+,%/d0\n\t" 40362306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 40462306a36Sopenharmony_ci "movew %/d0,%/a0@\n\t" 40562306a36Sopenharmony_ci "movew %/a1@+,%/d0\n\t" 40662306a36Sopenharmony_ci "rolw #8,%/d0\n\t" 40762306a36Sopenharmony_ci "movew %/d0,%/a0@\n\t" 40862306a36Sopenharmony_ci "dbra %/d6,1b" 40962306a36Sopenharmony_ci : 41062306a36Sopenharmony_ci : "g" (port), "g" (buf), "g" (nr) 41162306a36Sopenharmony_ci : "d0", "a0", "a1", "d6"); 41262306a36Sopenharmony_ci} 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci#if defined(CONFIG_ATARI_ROM_ISA) 41662306a36Sopenharmony_cistatic inline void raw_rom_insb(volatile u8 __iomem *port, u8 *buf, unsigned int len) 41762306a36Sopenharmony_ci{ 41862306a36Sopenharmony_ci unsigned int i; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci for (i = 0; i < len; i++) 42162306a36Sopenharmony_ci *buf++ = rom_in_8(port); 42262306a36Sopenharmony_ci} 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_cistatic inline void raw_rom_outsb(volatile u8 __iomem *port, const u8 *buf, 42562306a36Sopenharmony_ci unsigned int len) 42662306a36Sopenharmony_ci{ 42762306a36Sopenharmony_ci unsigned int i; 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci for (i = 0; i < len; i++) 43062306a36Sopenharmony_ci rom_out_8(port, *buf++); 43162306a36Sopenharmony_ci} 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_cistatic inline void raw_rom_insw(volatile u16 __iomem *port, u16 *buf, 43462306a36Sopenharmony_ci unsigned int nr) 43562306a36Sopenharmony_ci{ 43662306a36Sopenharmony_ci unsigned int i; 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci for (i = 0; i < nr; i++) 43962306a36Sopenharmony_ci *buf++ = rom_in_be16(port); 44062306a36Sopenharmony_ci} 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_cistatic inline void raw_rom_outsw(volatile u16 __iomem *port, const u16 *buf, 44362306a36Sopenharmony_ci unsigned int nr) 44462306a36Sopenharmony_ci{ 44562306a36Sopenharmony_ci unsigned int i; 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_ci for (i = 0; i < nr; i++) 44862306a36Sopenharmony_ci rom_out_be16(port, *buf++); 44962306a36Sopenharmony_ci} 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_cistatic inline void raw_rom_insw_swapw(volatile u16 __iomem *port, u16 *buf, 45262306a36Sopenharmony_ci unsigned int nr) 45362306a36Sopenharmony_ci{ 45462306a36Sopenharmony_ci unsigned int i; 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_ci for (i = 0; i < nr; i++) 45762306a36Sopenharmony_ci *buf++ = rom_in_le16(port); 45862306a36Sopenharmony_ci} 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_cistatic inline void raw_rom_outsw_swapw(volatile u16 __iomem *port, const u16 *buf, 46162306a36Sopenharmony_ci unsigned int nr) 46262306a36Sopenharmony_ci{ 46362306a36Sopenharmony_ci unsigned int i; 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_ci for (i = 0; i < nr; i++) 46662306a36Sopenharmony_ci rom_out_le16(port, *buf++); 46762306a36Sopenharmony_ci} 46862306a36Sopenharmony_ci#endif /* CONFIG_ATARI_ROM_ISA */ 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_ci#endif /* __KERNEL__ */ 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_ci#endif /* _RAW_IO_H */ 473