110713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek#ifndef _ASM_MICROBLAZE_ATOMIC_H
210713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek#define _ASM_MICROBLAZE_ATOMIC_H
310713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek
4c40d04df152a1111c5bbcb632278394dabd2b73dDavid Howells#include <asm/cmpxchg.h>
50a58458341fd571e521be542ff746a4a8995980cRemis Lima Baima#include <asm-generic/atomic.h>
6eacb6ec9ae5932ea02a44268684a56e4b5996ccfDaniel Borkmann#include <asm-generic/atomic64.h>
710713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek
810713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek/*
910713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek * Atomically test *v and decrement if it is greater than 0.
1010713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek * The function returns the old value of *v minus 1.
1110713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek */
1210713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simekstatic inline int atomic_dec_if_positive(atomic_t *v)
1310713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek{
1410713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek	unsigned long flags;
1510713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek	int res;
1610713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek
1710713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek	local_irq_save(flags);
1810713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek	res = v->counter - 1;
1910713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek	if (res >= 0)
2010713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek		v->counter = res;
2110713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek	local_irq_restore(flags);
2210713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek
2310713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek	return res;
2410713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek}
2510713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek
2610713b1d9f4e64468e9b9d38c32eea0814568b92Michal Simek#endif /* _ASM_MICROBLAZE_ATOMIC_H */
27