linux/arch/m68k/include/asm/io_mm.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * linux/include/asm-m68k/io.h
   4 *
   5 * 4/1/00 RZ: - rewritten to avoid clashes between ISA/PCI and other
   6 *              IO access
   7 *            - added Q40 support
   8 *            - added skeleton for GG-II and Amiga PCMCIA
   9 * 2/3/01 RZ: - moved a few more defs into raw_io.h
  10 *
  11 * inX/outX should not be used by any driver unless it does
  12 * ISA access. Other drivers should use function defined in raw_io.h
  13 * or define its own macros on top of these.
  14 *
  15 *    inX(),outX()              are for ISA I/O
  16 *    isa_readX(),isa_writeX()  are for ISA memory
  17 */
  18
  19#ifndef _M68K_IO_MM_H
  20#define _M68K_IO_MM_H
  21
  22#ifdef __KERNEL__
  23
  24#include <linux/compiler.h>
  25#include <asm/raw_io.h>
  26#include <asm/virtconvert.h>
  27#include <asm/kmap.h>
  28
  29#include <asm-generic/iomap.h>
  30
  31#ifdef CONFIG_ATARI
  32#define atari_readb   raw_inb
  33#define atari_writeb  raw_outb
  34
  35#define atari_inb_p   raw_inb
  36#define atari_outb_p  raw_outb
  37#endif
  38
  39
  40/*
  41 * IO/MEM definitions for various ISA bridges
  42 */
  43
  44
  45#ifdef CONFIG_Q40
  46
  47#define q40_isa_io_base  0xff400000
  48#define q40_isa_mem_base 0xff800000
  49
  50#define Q40_ISA_IO_B(ioaddr) (q40_isa_io_base+1+4*((unsigned long)(ioaddr)))
  51#define Q40_ISA_IO_W(ioaddr) (q40_isa_io_base+  4*((unsigned long)(ioaddr)))
  52#define Q40_ISA_MEM_B(madr)  (q40_isa_mem_base+1+4*((unsigned long)(madr)))
  53#define Q40_ISA_MEM_W(madr)  (q40_isa_mem_base+  4*((unsigned long)(madr)))
  54
  55#define MULTI_ISA 0
  56#endif /* Q40 */
  57
  58#ifdef CONFIG_AMIGA_PCMCIA
  59#include <asm/amigayle.h>
  60
  61#define AG_ISA_IO_B(ioaddr) ( GAYLE_IO+(ioaddr)+(((ioaddr)&1)*GAYLE_ODD) )
  62#define AG_ISA_IO_W(ioaddr) ( GAYLE_IO+(ioaddr) )
  63
  64#ifndef MULTI_ISA
  65#define MULTI_ISA 0
  66#else
  67#undef MULTI_ISA
  68#define MULTI_ISA 1
  69#endif
  70#endif /* AMIGA_PCMCIA */
  71
  72#ifdef CONFIG_ATARI_ROM_ISA
  73
  74#define enec_isa_read_base  0xfffa0000
  75#define enec_isa_write_base 0xfffb0000
  76
  77#define ENEC_ISA_IO_B(ioaddr)   (enec_isa_read_base+((((unsigned long)(ioaddr))&0x7F)<<9))
  78#define ENEC_ISA_IO_W(ioaddr)   (enec_isa_read_base+((((unsigned long)(ioaddr))&0x7F)<<9))
  79#define ENEC_ISA_MEM_B(madr)    (enec_isa_read_base+((((unsigned long)(madr))&0x7F)<<9))
  80#define ENEC_ISA_MEM_W(madr)    (enec_isa_read_base+((((unsigned long)(madr))&0x7F)<<9))
  81
  82#ifndef MULTI_ISA
  83#define MULTI_ISA 0
  84#else
  85#undef MULTI_ISA
  86#define MULTI_ISA 1
  87#endif
  88#endif /* ATARI_ROM_ISA */
  89
  90
  91#if defined(CONFIG_ISA) || defined(CONFIG_ATARI_ROM_ISA)
  92
  93#if MULTI_ISA == 0
  94#undef MULTI_ISA
  95#endif
  96
  97#define ISA_TYPE_Q40  (1)
  98#define ISA_TYPE_AG   (2)
  99#define ISA_TYPE_ENEC (3)
 100
 101#if defined(CONFIG_Q40) && !defined(MULTI_ISA)
 102#define ISA_TYPE ISA_TYPE_Q40
 103#define ISA_SEX  0
 104#endif
 105#if defined(CONFIG_AMIGA_PCMCIA) && !defined(MULTI_ISA)
 106#define ISA_TYPE ISA_TYPE_AG
 107#define ISA_SEX  1
 108#endif
 109#if defined(CONFIG_ATARI_ROM_ISA) && !defined(MULTI_ISA)
 110#define ISA_TYPE ISA_TYPE_ENEC
 111#define ISA_SEX  0
 112#endif
 113
 114#ifdef MULTI_ISA
 115extern int isa_type;
 116extern int isa_sex;
 117
 118#define ISA_TYPE isa_type
 119#define ISA_SEX  isa_sex
 120#endif
 121
 122/*
 123 * define inline addr translation functions. Normally only one variant will
 124 * be compiled in so the case statement will be optimised away
 125 */
 126
 127static inline u8 __iomem *isa_itb(unsigned long addr)
 128{
 129  switch(ISA_TYPE)
 130    {
 131#ifdef CONFIG_Q40
 132    case ISA_TYPE_Q40: return (u8 __iomem *)Q40_ISA_IO_B(addr);
 133#endif
 134#ifdef CONFIG_AMIGA_PCMCIA
 135    case ISA_TYPE_AG: return (u8 __iomem *)AG_ISA_IO_B(addr);
 136#endif
 137#ifdef CONFIG_ATARI_ROM_ISA
 138    case ISA_TYPE_ENEC: return (u8 __iomem *)ENEC_ISA_IO_B(addr);
 139#endif
 140    default: return NULL; /* avoid warnings, just in case */
 141    }
 142}
 143static inline u16 __iomem *isa_itw(unsigned long addr)
 144{
 145  switch(ISA_TYPE)
 146    {
 147#ifdef CONFIG_Q40
 148    case ISA_TYPE_Q40: return (u16 __iomem *)Q40_ISA_IO_W(addr);
 149#endif
 150#ifdef CONFIG_AMIGA_PCMCIA
 151    case ISA_TYPE_AG: return (u16 __iomem *)AG_ISA_IO_W(addr);
 152#endif
 153#ifdef CONFIG_ATARI_ROM_ISA
 154    case ISA_TYPE_ENEC: return (u16 __iomem *)ENEC_ISA_IO_W(addr);
 155#endif
 156    default: return NULL; /* avoid warnings, just in case */
 157    }
 158}
 159static inline u32 __iomem *isa_itl(unsigned long addr)
 160{
 161  switch(ISA_TYPE)
 162    {
 163#ifdef CONFIG_AMIGA_PCMCIA
 164    case ISA_TYPE_AG: return (u32 __iomem *)AG_ISA_IO_W(addr);
 165#endif
 166    default: return 0; /* avoid warnings, just in case */
 167    }
 168}
 169static inline u8 __iomem *isa_mtb(unsigned long addr)
 170{
 171  switch(ISA_TYPE)
 172    {
 173#ifdef CONFIG_Q40
 174    case ISA_TYPE_Q40: return (u8 __iomem *)Q40_ISA_MEM_B(addr);
 175#endif
 176#ifdef CONFIG_AMIGA_PCMCIA
 177    case ISA_TYPE_AG: return (u8 __iomem *)addr;
 178#endif
 179#ifdef CONFIG_ATARI_ROM_ISA
 180    case ISA_TYPE_ENEC: return (u8 __iomem *)ENEC_ISA_MEM_B(addr);
 181#endif
 182    default: return NULL; /* avoid warnings, just in case */
 183    }
 184}
 185static inline u16 __iomem *isa_mtw(unsigned long addr)
 186{
 187  switch(ISA_TYPE)
 188    {
 189#ifdef CONFIG_Q40
 190    case ISA_TYPE_Q40: return (u16 __iomem *)Q40_ISA_MEM_W(addr);
 191#endif
 192#ifdef CONFIG_AMIGA_PCMCIA
 193    case ISA_TYPE_AG: return (u16 __iomem *)addr;
 194#endif
 195#ifdef CONFIG_ATARI_ROM_ISA
 196    case ISA_TYPE_ENEC: return (u16 __iomem *)ENEC_ISA_MEM_W(addr);
 197#endif
 198    default: return NULL; /* avoid warnings, just in case */
 199    }
 200}
 201
 202
 203#define isa_inb(port)      in_8(isa_itb(port))
 204#define isa_inw(port)      (ISA_SEX ? in_be16(isa_itw(port)) : in_le16(isa_itw(port)))
 205#define isa_inl(port)      (ISA_SEX ? in_be32(isa_itl(port)) : in_le32(isa_itl(port)))
 206#define isa_outb(val,port) out_8(isa_itb(port),(val))
 207#define isa_outw(val,port) (ISA_SEX ? out_be16(isa_itw(port),(val)) : out_le16(isa_itw(port),(val)))
 208#define isa_outl(val,port) (ISA_SEX ? out_be32(isa_itl(port),(val)) : out_le32(isa_itl(port),(val)))
 209
 210#define isa_readb(p)       in_8(isa_mtb((unsigned long)(p)))
 211#define isa_readw(p)       \
 212        (ISA_SEX ? in_be16(isa_mtw((unsigned long)(p))) \
 213                 : in_le16(isa_mtw((unsigned long)(p))))
 214#define isa_writeb(val,p)  out_8(isa_mtb((unsigned long)(p)),(val))
 215#define isa_writew(val,p)  \
 216        (ISA_SEX ? out_be16(isa_mtw((unsigned long)(p)),(val))  \
 217                 : out_le16(isa_mtw((unsigned long)(p)),(val)))
 218
 219#ifdef CONFIG_ATARI_ROM_ISA
 220#define isa_rom_inb(port)      rom_in_8(isa_itb(port))
 221#define isa_rom_inw(port)       \
 222        (ISA_SEX ? rom_in_be16(isa_itw(port))   \
 223                 : rom_in_le16(isa_itw(port)))
 224
 225#define isa_rom_outb(val, port) rom_out_8(isa_itb(port), (val))
 226#define isa_rom_outw(val, port) \
 227        (ISA_SEX ? rom_out_be16(isa_itw(port), (val))   \
 228                 : rom_out_le16(isa_itw(port), (val)))
 229
 230#define isa_rom_readb(p)       rom_in_8(isa_mtb((unsigned long)(p)))
 231#define isa_rom_readw(p)       \
 232        (ISA_SEX ? rom_in_be16(isa_mtw((unsigned long)(p)))     \
 233                 : rom_in_le16(isa_mtw((unsigned long)(p))))
 234#define isa_rom_readw_swap(p)       \
 235        (ISA_SEX ? rom_in_le16(isa_mtw((unsigned long)(p)))     \
 236                 : rom_in_be16(isa_mtw((unsigned long)(p))))
 237#define isa_rom_readw_raw(p)   rom_in_be16(isa_mtw((unsigned long)(p)))
 238
 239#define isa_rom_writeb(val, p)  rom_out_8(isa_mtb((unsigned long)(p)), (val))
 240#define isa_rom_writew(val, p)  \
 241        (ISA_SEX ? rom_out_be16(isa_mtw((unsigned long)(p)), (val))     \
 242                 : rom_out_le16(isa_mtw((unsigned long)(p)), (val)))
 243#define isa_rom_writew_swap(val, p)  \
 244        (ISA_SEX ? rom_out_le16(isa_mtw((unsigned long)(p)), (val))     \
 245                 : rom_out_be16(isa_mtw((unsigned long)(p)), (val)))
 246#define isa_rom_writew_raw(val, p)  rom_out_be16(isa_mtw((unsigned long)(p)), (val))
 247#endif /* CONFIG_ATARI_ROM_ISA */
 248
 249static inline void isa_delay(void)
 250{
 251  switch(ISA_TYPE)
 252    {
 253#ifdef CONFIG_Q40
 254    case ISA_TYPE_Q40: isa_outb(0,0x80); break;
 255#endif
 256#ifdef CONFIG_AMIGA_PCMCIA
 257    case ISA_TYPE_AG: break;
 258#endif
 259#ifdef CONFIG_ATARI_ROM_ISA
 260    case ISA_TYPE_ENEC: break;
 261#endif
 262    default: break; /* avoid warnings */
 263    }
 264}
 265
 266#define isa_inb_p(p)      ({u8 v=isa_inb(p);isa_delay();v;})
 267#define isa_outb_p(v,p)   ({isa_outb((v),(p));isa_delay();})
 268#define isa_inw_p(p)      ({u16 v=isa_inw(p);isa_delay();v;})
 269#define isa_outw_p(v,p)   ({isa_outw((v),(p));isa_delay();})
 270#define isa_inl_p(p)      ({u32 v=isa_inl(p);isa_delay();v;})
 271#define isa_outl_p(v,p)   ({isa_outl((v),(p));isa_delay();})
 272
 273#define isa_insb(port, buf, nr) raw_insb(isa_itb(port), (u8 *)(buf), (nr))
 274#define isa_outsb(port, buf, nr) raw_outsb(isa_itb(port), (u8 *)(buf), (nr))
 275
 276#define isa_insw(port, buf, nr)     \
 277       (ISA_SEX ? raw_insw(isa_itw(port), (u16 *)(buf), (nr)) :    \
 278                  raw_insw_swapw(isa_itw(port), (u16 *)(buf), (nr)))
 279
 280#define isa_outsw(port, buf, nr)    \
 281       (ISA_SEX ? raw_outsw(isa_itw(port), (u16 *)(buf), (nr)) :  \
 282                  raw_outsw_swapw(isa_itw(port), (u16 *)(buf), (nr)))
 283
 284#define isa_insl(port, buf, nr)     \
 285       (ISA_SEX ? raw_insl(isa_itl(port), (u32 *)(buf), (nr)) :    \
 286                  raw_insw_swapw(isa_itw(port), (u16 *)(buf), (nr)<<1))
 287
 288#define isa_outsl(port, buf, nr)    \
 289       (ISA_SEX ? raw_outsl(isa_itl(port), (u32 *)(buf), (nr)) :  \
 290                  raw_outsw_swapw(isa_itw(port), (u16 *)(buf), (nr)<<1))
 291
 292
 293#ifdef CONFIG_ATARI_ROM_ISA
 294#define isa_rom_inb_p(p)        ({ u8 _v = isa_rom_inb(p); isa_delay(); _v; })
 295#define isa_rom_inw_p(p)        ({ u16 _v = isa_rom_inw(p); isa_delay(); _v; })
 296#define isa_rom_outb_p(v, p)    ({ isa_rom_outb((v), (p)); isa_delay(); })
 297#define isa_rom_outw_p(v, p)    ({ isa_rom_outw((v), (p)); isa_delay(); })
 298
 299#define isa_rom_insb(port, buf, nr) raw_rom_insb(isa_itb(port), (u8 *)(buf), (nr))
 300
 301#define isa_rom_insw(port, buf, nr)     \
 302       (ISA_SEX ? raw_rom_insw(isa_itw(port), (u16 *)(buf), (nr)) :    \
 303                  raw_rom_insw_swapw(isa_itw(port), (u16 *)(buf), (nr)))
 304
 305#define isa_rom_outsb(port, buf, nr) raw_rom_outsb(isa_itb(port), (u8 *)(buf), (nr))
 306
 307#define isa_rom_outsw(port, buf, nr)    \
 308       (ISA_SEX ? raw_rom_outsw(isa_itw(port), (u16 *)(buf), (nr)) :  \
 309                  raw_rom_outsw_swapw(isa_itw(port), (u16 *)(buf), (nr)))
 310#endif /* CONFIG_ATARI_ROM_ISA */
 311
 312#endif  /* CONFIG_ISA || CONFIG_ATARI_ROM_ISA */
 313
 314
 315#if defined(CONFIG_ISA) && !defined(CONFIG_ATARI_ROM_ISA)
 316#define inb     isa_inb
 317#define inb_p   isa_inb_p
 318#define outb    isa_outb
 319#define outb_p  isa_outb_p
 320#define inw     isa_inw
 321#define inw_p   isa_inw_p
 322#define outw    isa_outw
 323#define outw_p  isa_outw_p
 324#define inl     isa_inl
 325#define inl_p   isa_inl_p
 326#define outl    isa_outl
 327#define outl_p  isa_outl_p
 328#define insb    isa_insb
 329#define insw    isa_insw
 330#define insl    isa_insl
 331#define outsb   isa_outsb
 332#define outsw   isa_outsw
 333#define outsl   isa_outsl
 334#define readb   isa_readb
 335#define readw   isa_readw
 336#define writeb  isa_writeb
 337#define writew  isa_writew
 338#endif  /* CONFIG_ISA && !CONFIG_ATARI_ROM_ISA */
 339
 340#ifdef CONFIG_ATARI_ROM_ISA
 341/*
 342 * kernel with both ROM port ISA and IDE compiled in, those have
 343 * conflicting defs for in/out. Simply consider port < 1024
 344 * ROM port ISA and everything else regular ISA for IDE. read,write defined
 345 * below.
 346 */
 347#define inb(port)       ((port) < 1024 ? isa_rom_inb(port) : in_8(port))
 348#define inb_p(port)     ((port) < 1024 ? isa_rom_inb_p(port) : in_8(port))
 349#define inw(port)       ((port) < 1024 ? isa_rom_inw(port) : in_le16(port))
 350#define inw_p(port)     ((port) < 1024 ? isa_rom_inw_p(port) : in_le16(port))
 351#define inl             isa_inl
 352#define inl_p           isa_inl_p
 353
 354#define outb(val, port) ((port) < 1024 ? isa_rom_outb((val), (port)) : out_8((port), (val)))
 355#define outb_p(val, port) ((port) < 1024 ? isa_rom_outb_p((val), (port)) : out_8((port), (val)))
 356#define outw(val, port) ((port) < 1024 ? isa_rom_outw((val), (port)) : out_le16((port), (val)))
 357#define outw_p(val, port) ((port) < 1024 ? isa_rom_outw_p((val), (port)) : out_le16((port), (val)))
 358#define outl            isa_outl
 359#define outl_p          isa_outl_p
 360
 361#define insb(port, buf, nr)     ((port) < 1024 ? isa_rom_insb((port), (buf), (nr)) : isa_insb((port), (buf), (nr)))
 362#define insw(port, buf, nr)     ((port) < 1024 ? isa_rom_insw((port), (buf), (nr)) : isa_insw((port), (buf), (nr)))
 363#define insl                    isa_insl
 364#define outsb(port, buf, nr)    ((port) < 1024 ? isa_rom_outsb((port), (buf), (nr)) : isa_outsb((port), (buf), (nr)))
 365#define outsw(port, buf, nr)    ((port) < 1024 ? isa_rom_outsw((port), (buf), (nr)) : isa_outsw((port), (buf), (nr)))
 366#define outsl                   isa_outsl
 367
 368#define readb(addr)             in_8(addr)
 369#define writeb(val, addr)       out_8((addr), (val))
 370#define readw(addr)             in_le16(addr)
 371#define writew(val, addr)       out_le16((addr), (val))
 372#endif /* CONFIG_ATARI_ROM_ISA */
 373
 374#define readl(addr)      in_le32(addr)
 375#define writel(val,addr) out_le32((addr),(val))
 376
 377#define readsb(port, buf, nr)     raw_insb((port), (u8 *)(buf), (nr))
 378#define readsw(port, buf, nr)     raw_insw((port), (u16 *)(buf), (nr))
 379#define readsl(port, buf, nr)     raw_insl((port), (u32 *)(buf), (nr))
 380#define writesb(port, buf, nr)    raw_outsb((port), (u8 *)(buf), (nr))
 381#define writesw(port, buf, nr)    raw_outsw((port), (u16 *)(buf), (nr))
 382#define writesl(port, buf, nr)    raw_outsl((port), (u32 *)(buf), (nr))
 383
 384#ifndef CONFIG_SUN3
 385#define IO_SPACE_LIMIT 0xffff
 386#else
 387#define IO_SPACE_LIMIT 0x0fffffff
 388#endif
 389
 390#endif /* __KERNEL__ */
 391
 392#define __ARCH_HAS_NO_PAGE_ZERO_MAPPED          1
 393
 394/*
 395 * Convert a physical pointer to a virtual kernel pointer for /dev/mem
 396 * access
 397 */
 398#define xlate_dev_mem_ptr(p)    __va(p)
 399
 400#define readb_relaxed(addr)     readb(addr)
 401#define readw_relaxed(addr)     readw(addr)
 402#define readl_relaxed(addr)     readl(addr)
 403
 404#define writeb_relaxed(b, addr) writeb(b, addr)
 405#define writew_relaxed(b, addr) writew(b, addr)
 406#define writel_relaxed(b, addr) writel(b, addr)
 407
 408#endif /* _M68K_IO_MM_H */
 409