Linux Audio

Check our new training course

Loading...
v6.8
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _IO_H
  3#define _IO_H
  4
  5#include "types.h"
  6
  7/*
  8 * Low-level I/O routines.
  9 *
 10 * Copied from <file:arch/powerpc/include/asm/io.h> (which has no copyright)
 11 */
 12static inline int in_8(const volatile unsigned char *addr)
 13{
 14	int ret;
 15
 16	__asm__ __volatile__("lbz%U1%X1 %0,%1; twi 0,%0,0; isync"
 17			     : "=r" (ret) : "m" (*addr));
 18	return ret;
 19}
 20
 21static inline void out_8(volatile unsigned char *addr, int val)
 22{
 23	__asm__ __volatile__("stb%U0%X0 %1,%0; sync"
 24			     : "=m" (*addr) : "r" (val));
 25}
 26
 27static inline unsigned in_le16(const volatile u16 *addr)
 28{
 29	unsigned ret;
 30
 31	__asm__ __volatile__("lhbrx %0,0,%1; twi 0,%0,0; isync"
 32			     : "=r" (ret) : "r" (addr), "m" (*addr));
 33
 34	return ret;
 35}
 36
 37static inline unsigned in_be16(const volatile u16 *addr)
 38{
 39	unsigned ret;
 40
 41	__asm__ __volatile__("lhz%U1%X1 %0,%1; twi 0,%0,0; isync"
 42			     : "=r" (ret) : "m" (*addr));
 43	return ret;
 44}
 45
 46static inline void out_le16(volatile u16 *addr, int val)
 47{
 48	__asm__ __volatile__("sthbrx %1,0,%2; sync" : "=m" (*addr)
 49			     : "r" (val), "r" (addr));
 50}
 51
 52static inline void out_be16(volatile u16 *addr, int val)
 53{
 54	__asm__ __volatile__("sth%U0%X0 %1,%0; sync"
 55			     : "=m" (*addr) : "r" (val));
 56}
 57
 58static inline unsigned in_le32(const volatile unsigned *addr)
 59{
 60	unsigned ret;
 61
 62	__asm__ __volatile__("lwbrx %0,0,%1; twi 0,%0,0; isync"
 63			     : "=r" (ret) : "r" (addr), "m" (*addr));
 64	return ret;
 65}
 66
 67static inline unsigned in_be32(const volatile unsigned *addr)
 68{
 69	unsigned ret;
 70
 71	__asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync"
 72			     : "=r" (ret) : "m" (*addr));
 73	return ret;
 74}
 75
 76static inline void out_le32(volatile unsigned *addr, int val)
 77{
 78	__asm__ __volatile__("stwbrx %1,0,%2; sync" : "=m" (*addr)
 79			     : "r" (val), "r" (addr));
 80}
 81
 82static inline void out_be32(volatile unsigned *addr, int val)
 83{
 84	__asm__ __volatile__("stw%U0%X0 %1,%0; sync"
 85			     : "=m" (*addr) : "r" (val));
 86}
 87
 88static inline void sync(void)
 89{
 90	asm volatile("sync" : : : "memory");
 91}
 92
 93static inline void eieio(void)
 94{
 95	asm volatile("eieio" : : : "memory");
 96}
 97
 98static inline void barrier(void)
 99{
100	asm volatile("" : : : "memory");
101}
102
103#endif /* _IO_H */
v6.13.7
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _IO_H
  3#define _IO_H
  4
  5#include "types.h"
  6
  7/*
  8 * Low-level I/O routines.
  9 *
 10 * Copied from <file:arch/powerpc/include/asm/io.h> (which has no copyright)
 11 */
 12static inline int in_8(const volatile unsigned char *addr)
 13{
 14	int ret;
 15
 16	__asm__ __volatile__("lbz%U1%X1 %0,%1; twi 0,%0,0; isync"
 17			     : "=r" (ret) : "m" (*addr));
 18	return ret;
 19}
 20
 21static inline void out_8(volatile unsigned char *addr, int val)
 22{
 23	__asm__ __volatile__("stb%U0%X0 %1,%0; sync"
 24			     : "=m" (*addr) : "r" (val));
 25}
 26
 27static inline unsigned in_le16(const volatile u16 *addr)
 28{
 29	unsigned ret;
 30
 31	__asm__ __volatile__("lhbrx %0,0,%1; twi 0,%0,0; isync"
 32			     : "=r" (ret) : "r" (addr), "m" (*addr));
 33
 34	return ret;
 35}
 36
 37static inline unsigned in_be16(const volatile u16 *addr)
 38{
 39	unsigned ret;
 40
 41	__asm__ __volatile__("lhz%U1%X1 %0,%1; twi 0,%0,0; isync"
 42			     : "=r" (ret) : "m" (*addr));
 43	return ret;
 44}
 45
 46static inline void out_le16(volatile u16 *addr, int val)
 47{
 48	__asm__ __volatile__("sthbrx %1,0,%2; sync" : "=m" (*addr)
 49			     : "r" (val), "r" (addr));
 50}
 51
 52static inline void out_be16(volatile u16 *addr, int val)
 53{
 54	__asm__ __volatile__("sth%U0%X0 %1,%0; sync"
 55			     : "=m" (*addr) : "r" (val));
 56}
 57
 58static inline unsigned in_le32(const volatile unsigned *addr)
 59{
 60	unsigned ret;
 61
 62	__asm__ __volatile__("lwbrx %0,0,%1; twi 0,%0,0; isync"
 63			     : "=r" (ret) : "r" (addr), "m" (*addr));
 64	return ret;
 65}
 66
 67static inline unsigned in_be32(const volatile unsigned *addr)
 68{
 69	unsigned ret;
 70
 71	__asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync"
 72			     : "=r" (ret) : "m" (*addr));
 73	return ret;
 74}
 75
 76static inline void out_le32(volatile unsigned *addr, int val)
 77{
 78	__asm__ __volatile__("stwbrx %1,0,%2; sync" : "=m" (*addr)
 79			     : "r" (val), "r" (addr));
 80}
 81
 82static inline void out_be32(volatile unsigned *addr, int val)
 83{
 84	__asm__ __volatile__("stw%U0%X0 %1,%0; sync"
 85			     : "=m" (*addr) : "r" (val));
 86}
 87
 88static inline void sync(void)
 89{
 90	asm volatile("sync" : : : "memory");
 91}
 92
 93static inline void eieio(void)
 94{
 95	asm volatile("eieio" : : : "memory");
 96}
 97
 98static inline void barrier(void)
 99{
100	asm volatile("" : : : "memory");
101}
102
103#endif /* _IO_H */