Linux Audio

Check our new training course

Loading...
v5.4
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef __ASM_SH_BITOPS_LLSC_H
  3#define __ASM_SH_BITOPS_LLSC_H
  4
  5static inline void set_bit(int nr, volatile void *addr)
  6{
  7	int	mask;
  8	volatile unsigned int *a = addr;
  9	unsigned long tmp;
 10
 11	a += nr >> 5;
 12	mask = 1 << (nr & 0x1f);
 13
 14	__asm__ __volatile__ (
 15		"1:						\n\t"
 16		"movli.l	@%1, %0	! set_bit		\n\t"
 17		"or		%2, %0				\n\t"
 18		"movco.l	%0, @%1				\n\t"
 19		"bf		1b				\n\t"
 20		: "=&z" (tmp)
 21		: "r" (a), "r" (mask)
 22		: "t", "memory"
 23	);
 24}
 25
 26static inline void clear_bit(int nr, volatile void *addr)
 27{
 28	int	mask;
 29	volatile unsigned int *a = addr;
 30	unsigned long tmp;
 31
 32	a += nr >> 5;
 33	mask = 1 << (nr & 0x1f);
 34
 35	__asm__ __volatile__ (
 36		"1:						\n\t"
 37		"movli.l	@%1, %0	! clear_bit		\n\t"
 38		"and		%2, %0				\n\t"
 39		"movco.l	%0, @%1				\n\t"
 40		"bf		1b				\n\t"
 41		: "=&z" (tmp)
 42		: "r" (a), "r" (~mask)
 43		: "t", "memory"
 44	);
 45}
 46
 47static inline void change_bit(int nr, volatile void *addr)
 48{
 49	int	mask;
 50	volatile unsigned int *a = addr;
 51	unsigned long tmp;
 52
 53	a += nr >> 5;
 54	mask = 1 << (nr & 0x1f);
 55
 56	__asm__ __volatile__ (
 57		"1:						\n\t"
 58		"movli.l	@%1, %0	! change_bit		\n\t"
 59		"xor		%2, %0				\n\t"
 60		"movco.l	%0, @%1				\n\t"
 61		"bf		1b				\n\t"
 62		: "=&z" (tmp)
 63		: "r" (a), "r" (mask)
 64		: "t", "memory"
 65	);
 66}
 67
 68static inline int test_and_set_bit(int nr, volatile void *addr)
 69{
 70	int	mask, retval;
 71	volatile unsigned int *a = addr;
 72	unsigned long tmp;
 73
 74	a += nr >> 5;
 75	mask = 1 << (nr & 0x1f);
 76
 77	__asm__ __volatile__ (
 78		"1:						\n\t"
 79		"movli.l	@%2, %0	! test_and_set_bit	\n\t"
 80		"mov		%0, %1				\n\t"
 81		"or		%3, %0				\n\t"
 82		"movco.l	%0, @%2				\n\t"
 83		"bf		1b				\n\t"
 84		"and		%3, %1				\n\t"
 85		: "=&z" (tmp), "=&r" (retval)
 86		: "r" (a), "r" (mask)
 87		: "t", "memory"
 88	);
 89
 90	return retval != 0;
 91}
 92
 93static inline int test_and_clear_bit(int nr, volatile void *addr)
 94{
 95	int	mask, retval;
 96	volatile unsigned int *a = addr;
 97	unsigned long tmp;
 98
 99	a += nr >> 5;
100	mask = 1 << (nr & 0x1f);
101
102	__asm__ __volatile__ (
103		"1:						\n\t"
104		"movli.l	@%2, %0	! test_and_clear_bit	\n\t"
105		"mov		%0, %1				\n\t"
106		"and		%4, %0				\n\t"
107		"movco.l	%0, @%2				\n\t"
108		"bf		1b				\n\t"
109		"and		%3, %1				\n\t"
110		"synco						\n\t"
111		: "=&z" (tmp), "=&r" (retval)
112		: "r" (a), "r" (mask), "r" (~mask)
113		: "t", "memory"
114	);
115
116	return retval != 0;
117}
118
119static inline int test_and_change_bit(int nr, volatile void *addr)
120{
121	int	mask, retval;
122	volatile unsigned int *a = addr;
123	unsigned long tmp;
124
125	a += nr >> 5;
126	mask = 1 << (nr & 0x1f);
127
128	__asm__ __volatile__ (
129		"1:						\n\t"
130		"movli.l	@%2, %0	! test_and_change_bit	\n\t"
131		"mov		%0, %1				\n\t"
132		"xor		%3, %0				\n\t"
133		"movco.l	%0, @%2				\n\t"
134		"bf		1b				\n\t"
135		"and		%3, %1				\n\t"
136		"synco						\n\t"
137		: "=&z" (tmp), "=&r" (retval)
138		: "r" (a), "r" (mask)
139		: "t", "memory"
140	);
141
142	return retval != 0;
143}
144
145#include <asm-generic/bitops/non-atomic.h>
146
147#endif /* __ASM_SH_BITOPS_LLSC_H */
v6.13.7
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef __ASM_SH_BITOPS_LLSC_H
  3#define __ASM_SH_BITOPS_LLSC_H
  4
  5static inline void set_bit(int nr, volatile void *addr)
  6{
  7	int	mask;
  8	volatile unsigned int *a = addr;
  9	unsigned long tmp;
 10
 11	a += nr >> 5;
 12	mask = 1 << (nr & 0x1f);
 13
 14	__asm__ __volatile__ (
 15		"1:						\n\t"
 16		"movli.l	@%1, %0	! set_bit		\n\t"
 17		"or		%2, %0				\n\t"
 18		"movco.l	%0, @%1				\n\t"
 19		"bf		1b				\n\t"
 20		: "=&z" (tmp)
 21		: "r" (a), "r" (mask)
 22		: "t", "memory"
 23	);
 24}
 25
 26static inline void clear_bit(int nr, volatile void *addr)
 27{
 28	int	mask;
 29	volatile unsigned int *a = addr;
 30	unsigned long tmp;
 31
 32	a += nr >> 5;
 33	mask = 1 << (nr & 0x1f);
 34
 35	__asm__ __volatile__ (
 36		"1:						\n\t"
 37		"movli.l	@%1, %0	! clear_bit		\n\t"
 38		"and		%2, %0				\n\t"
 39		"movco.l	%0, @%1				\n\t"
 40		"bf		1b				\n\t"
 41		: "=&z" (tmp)
 42		: "r" (a), "r" (~mask)
 43		: "t", "memory"
 44	);
 45}
 46
 47static inline void change_bit(int nr, volatile void *addr)
 48{
 49	int	mask;
 50	volatile unsigned int *a = addr;
 51	unsigned long tmp;
 52
 53	a += nr >> 5;
 54	mask = 1 << (nr & 0x1f);
 55
 56	__asm__ __volatile__ (
 57		"1:						\n\t"
 58		"movli.l	@%1, %0	! change_bit		\n\t"
 59		"xor		%2, %0				\n\t"
 60		"movco.l	%0, @%1				\n\t"
 61		"bf		1b				\n\t"
 62		: "=&z" (tmp)
 63		: "r" (a), "r" (mask)
 64		: "t", "memory"
 65	);
 66}
 67
 68static inline int test_and_set_bit(int nr, volatile void *addr)
 69{
 70	int	mask, retval;
 71	volatile unsigned int *a = addr;
 72	unsigned long tmp;
 73
 74	a += nr >> 5;
 75	mask = 1 << (nr & 0x1f);
 76
 77	__asm__ __volatile__ (
 78		"1:						\n\t"
 79		"movli.l	@%2, %0	! test_and_set_bit	\n\t"
 80		"mov		%0, %1				\n\t"
 81		"or		%3, %0				\n\t"
 82		"movco.l	%0, @%2				\n\t"
 83		"bf		1b				\n\t"
 84		"and		%3, %1				\n\t"
 85		: "=&z" (tmp), "=&r" (retval)
 86		: "r" (a), "r" (mask)
 87		: "t", "memory"
 88	);
 89
 90	return retval != 0;
 91}
 92
 93static inline int test_and_clear_bit(int nr, volatile void *addr)
 94{
 95	int	mask, retval;
 96	volatile unsigned int *a = addr;
 97	unsigned long tmp;
 98
 99	a += nr >> 5;
100	mask = 1 << (nr & 0x1f);
101
102	__asm__ __volatile__ (
103		"1:						\n\t"
104		"movli.l	@%2, %0	! test_and_clear_bit	\n\t"
105		"mov		%0, %1				\n\t"
106		"and		%4, %0				\n\t"
107		"movco.l	%0, @%2				\n\t"
108		"bf		1b				\n\t"
109		"and		%3, %1				\n\t"
110		"synco						\n\t"
111		: "=&z" (tmp), "=&r" (retval)
112		: "r" (a), "r" (mask), "r" (~mask)
113		: "t", "memory"
114	);
115
116	return retval != 0;
117}
118
119static inline int test_and_change_bit(int nr, volatile void *addr)
120{
121	int	mask, retval;
122	volatile unsigned int *a = addr;
123	unsigned long tmp;
124
125	a += nr >> 5;
126	mask = 1 << (nr & 0x1f);
127
128	__asm__ __volatile__ (
129		"1:						\n\t"
130		"movli.l	@%2, %0	! test_and_change_bit	\n\t"
131		"mov		%0, %1				\n\t"
132		"xor		%3, %0				\n\t"
133		"movco.l	%0, @%2				\n\t"
134		"bf		1b				\n\t"
135		"and		%3, %1				\n\t"
136		"synco						\n\t"
137		: "=&z" (tmp), "=&r" (retval)
138		: "r" (a), "r" (mask)
139		: "t", "memory"
140	);
141
142	return retval != 0;
143}
144
145#include <asm-generic/bitops/non-atomic.h>
146
147#endif /* __ASM_SH_BITOPS_LLSC_H */