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