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