18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __ASM_SH_BITOPS_CAS_H
38c2ecf20Sopenharmony_ci#define __ASM_SH_BITOPS_CAS_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_cistatic inline unsigned __bo_cas(volatile unsigned *p, unsigned old, unsigned new)
68c2ecf20Sopenharmony_ci{
78c2ecf20Sopenharmony_ci	__asm__ __volatile__("cas.l %1,%0,@r0"
88c2ecf20Sopenharmony_ci		: "+r"(new)
98c2ecf20Sopenharmony_ci		: "r"(old), "z"(p)
108c2ecf20Sopenharmony_ci		: "t", "memory" );
118c2ecf20Sopenharmony_ci	return new;
128c2ecf20Sopenharmony_ci}
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_cistatic inline void set_bit(int nr, volatile void *addr)
158c2ecf20Sopenharmony_ci{
168c2ecf20Sopenharmony_ci	unsigned mask, old;
178c2ecf20Sopenharmony_ci	volatile unsigned *a = addr;
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci	a += nr >> 5;
208c2ecf20Sopenharmony_ci	mask = 1U << (nr & 0x1f);
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	do old = *a;
238c2ecf20Sopenharmony_ci	while (__bo_cas(a, old, old|mask) != old);
248c2ecf20Sopenharmony_ci}
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistatic inline void clear_bit(int nr, volatile void *addr)
278c2ecf20Sopenharmony_ci{
288c2ecf20Sopenharmony_ci	unsigned mask, old;
298c2ecf20Sopenharmony_ci	volatile unsigned *a = addr;
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci	a += nr >> 5;
328c2ecf20Sopenharmony_ci	mask = 1U << (nr & 0x1f);
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	do old = *a;
358c2ecf20Sopenharmony_ci	while (__bo_cas(a, old, old&~mask) != old);
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cistatic inline void change_bit(int nr, volatile void *addr)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	unsigned mask, old;
418c2ecf20Sopenharmony_ci	volatile unsigned *a = addr;
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci	a += nr >> 5;
448c2ecf20Sopenharmony_ci	mask = 1U << (nr & 0x1f);
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	do old = *a;
478c2ecf20Sopenharmony_ci	while (__bo_cas(a, old, old^mask) != old);
488c2ecf20Sopenharmony_ci}
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_cistatic inline int test_and_set_bit(int nr, volatile void *addr)
518c2ecf20Sopenharmony_ci{
528c2ecf20Sopenharmony_ci	unsigned mask, old;
538c2ecf20Sopenharmony_ci	volatile unsigned *a = addr;
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	a += nr >> 5;
568c2ecf20Sopenharmony_ci	mask = 1U << (nr & 0x1f);
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci	do old = *a;
598c2ecf20Sopenharmony_ci	while (__bo_cas(a, old, old|mask) != old);
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	return !!(old & mask);
628c2ecf20Sopenharmony_ci}
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_cistatic inline int test_and_clear_bit(int nr, volatile void *addr)
658c2ecf20Sopenharmony_ci{
668c2ecf20Sopenharmony_ci	unsigned mask, old;
678c2ecf20Sopenharmony_ci	volatile unsigned *a = addr;
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci	a += nr >> 5;
708c2ecf20Sopenharmony_ci	mask = 1U << (nr & 0x1f);
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci	do old = *a;
738c2ecf20Sopenharmony_ci	while (__bo_cas(a, old, old&~mask) != old);
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci	return !!(old & mask);
768c2ecf20Sopenharmony_ci}
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_cistatic inline int test_and_change_bit(int nr, volatile void *addr)
798c2ecf20Sopenharmony_ci{
808c2ecf20Sopenharmony_ci	unsigned mask, old;
818c2ecf20Sopenharmony_ci	volatile unsigned *a = addr;
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	a += nr >> 5;
848c2ecf20Sopenharmony_ci	mask = 1U << (nr & 0x1f);
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci	do old = *a;
878c2ecf20Sopenharmony_ci	while (__bo_cas(a, old, old^mask) != old);
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci	return !!(old & mask);
908c2ecf20Sopenharmony_ci}
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci#include <asm-generic/bitops/non-atomic.h>
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci#endif /* __ASM_SH_BITOPS_CAS_H */
95