18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _ASM_MICROBLAZE_ATOMIC_H
38c2ecf20Sopenharmony_ci#define _ASM_MICROBLAZE_ATOMIC_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <asm/cmpxchg.h>
68c2ecf20Sopenharmony_ci#include <asm-generic/atomic.h>
78c2ecf20Sopenharmony_ci#include <asm-generic/atomic64.h>
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci/*
108c2ecf20Sopenharmony_ci * Atomically test *v and decrement if it is greater than 0.
118c2ecf20Sopenharmony_ci * The function returns the old value of *v minus 1.
128c2ecf20Sopenharmony_ci */
138c2ecf20Sopenharmony_cistatic inline int atomic_dec_if_positive(atomic_t *v)
148c2ecf20Sopenharmony_ci{
158c2ecf20Sopenharmony_ci	unsigned long flags;
168c2ecf20Sopenharmony_ci	int res;
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci	local_irq_save(flags);
198c2ecf20Sopenharmony_ci	res = v->counter - 1;
208c2ecf20Sopenharmony_ci	if (res >= 0)
218c2ecf20Sopenharmony_ci		v->counter = res;
228c2ecf20Sopenharmony_ci	local_irq_restore(flags);
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	return res;
258c2ecf20Sopenharmony_ci}
268c2ecf20Sopenharmony_ci#define atomic_dec_if_positive atomic_dec_if_positive
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci#endif /* _ASM_MICROBLAZE_ATOMIC_H */
29