linux/arch/alpha/include/asm/io_trivial.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/* Trivial implementations of basic i/o routines.  Assumes that all
   3   of the hard work has been done by ioremap and ioportmap, and that
   4   access to i/o space is linear.  */
   5
   6/* This file may be included multiple times.  */
   7
   8#if IO_CONCAT(__IO_PREFIX,trivial_io_bw)
   9__EXTERN_INLINE unsigned int
  10IO_CONCAT(__IO_PREFIX,ioread8)(const void __iomem *a)
  11{
  12        return __kernel_ldbu(*(const volatile u8 __force *)a);
  13}
  14
  15__EXTERN_INLINE unsigned int
  16IO_CONCAT(__IO_PREFIX,ioread16)(const void __iomem *a)
  17{
  18        return __kernel_ldwu(*(const volatile u16 __force *)a);
  19}
  20
  21__EXTERN_INLINE void
  22IO_CONCAT(__IO_PREFIX,iowrite8)(u8 b, void __iomem *a)
  23{
  24        __kernel_stb(b, *(volatile u8 __force *)a);
  25}
  26
  27__EXTERN_INLINE void
  28IO_CONCAT(__IO_PREFIX,iowrite16)(u16 b, void __iomem *a)
  29{
  30        __kernel_stw(b, *(volatile u16 __force *)a);
  31}
  32#endif
  33
  34#if IO_CONCAT(__IO_PREFIX,trivial_io_lq)
  35__EXTERN_INLINE unsigned int
  36IO_CONCAT(__IO_PREFIX,ioread32)(const void __iomem *a)
  37{
  38        return *(const volatile u32 __force *)a;
  39}
  40
  41__EXTERN_INLINE void
  42IO_CONCAT(__IO_PREFIX,iowrite32)(u32 b, void __iomem *a)
  43{
  44        *(volatile u32 __force *)a = b;
  45}
  46#endif
  47
  48#if IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 1
  49__EXTERN_INLINE u8
  50IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a)
  51{
  52        return __kernel_ldbu(*(const volatile u8 __force *)a);
  53}
  54
  55__EXTERN_INLINE u16
  56IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a)
  57{
  58        return __kernel_ldwu(*(const volatile u16 __force *)a);
  59}
  60
  61__EXTERN_INLINE void
  62IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a)
  63{
  64        __kernel_stb(b, *(volatile u8 __force *)a);
  65}
  66
  67__EXTERN_INLINE void
  68IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a)
  69{
  70        __kernel_stw(b, *(volatile u16 __force *)a);
  71}
  72#elif IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 2
  73__EXTERN_INLINE u8
  74IO_CONCAT(__IO_PREFIX,readb)(const volatile void __iomem *a)
  75{
  76        const void __iomem *addr = (const void __iomem *)a;
  77        return IO_CONCAT(__IO_PREFIX,ioread8)(addr);
  78}
  79
  80__EXTERN_INLINE u16
  81IO_CONCAT(__IO_PREFIX,readw)(const volatile void __iomem *a)
  82{
  83        const void __iomem *addr = (const void __iomem *)a;
  84        return IO_CONCAT(__IO_PREFIX,ioread16)(addr);
  85}
  86
  87__EXTERN_INLINE void
  88IO_CONCAT(__IO_PREFIX,writeb)(u8 b, volatile void __iomem *a)
  89{
  90        void __iomem *addr = (void __iomem *)a;
  91        IO_CONCAT(__IO_PREFIX,iowrite8)(b, addr);
  92}
  93
  94__EXTERN_INLINE void
  95IO_CONCAT(__IO_PREFIX,writew)(u16 b, volatile void __iomem *a)
  96{
  97        void __iomem *addr = (void __iomem *)a;
  98        IO_CONCAT(__IO_PREFIX,iowrite16)(b, addr);
  99}
 100#endif
 101
 102#if IO_CONCAT(__IO_PREFIX,trivial_rw_lq) == 1
 103__EXTERN_INLINE u32
 104IO_CONCAT(__IO_PREFIX,readl)(const volatile void __iomem *a)
 105{
 106        return *(const volatile u32 __force *)a;
 107}
 108
 109__EXTERN_INLINE u64
 110IO_CONCAT(__IO_PREFIX,readq)(const volatile void __iomem *a)
 111{
 112        return *(const volatile u64 __force *)a;
 113}
 114
 115__EXTERN_INLINE void
 116IO_CONCAT(__IO_PREFIX,writel)(u32 b, volatile void __iomem *a)
 117{
 118        *(volatile u32 __force *)a = b;
 119}
 120
 121__EXTERN_INLINE void
 122IO_CONCAT(__IO_PREFIX,writeq)(u64 b, volatile void __iomem *a)
 123{
 124        *(volatile u64 __force *)a = b;
 125}
 126#endif
 127
 128#if IO_CONCAT(__IO_PREFIX,trivial_iounmap)
 129__EXTERN_INLINE void IO_CONCAT(__IO_PREFIX,iounmap)(volatile void __iomem *a)
 130{
 131}
 132#endif
 133