Path: blob/master/arch/openrisc/include/asm/bitops/atomic.h
26496 views
/*1* Copyright (C) 2014 Stefan Kristiansson <[email protected]>2*3* This file is licensed under the terms of the GNU General Public License4* version 2. This program is licensed "as is" without any warranty of any5* kind, whether express or implied.6*/78#ifndef __ASM_OPENRISC_BITOPS_ATOMIC_H9#define __ASM_OPENRISC_BITOPS_ATOMIC_H1011static inline void set_bit(int nr, volatile unsigned long *addr)12{13unsigned long mask = BIT_MASK(nr);14unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);15unsigned long tmp;1617__asm__ __volatile__(18"1: l.lwa %0,0(%1) \n"19" l.or %0,%0,%2 \n"20" l.swa 0(%1),%0 \n"21" l.bnf 1b \n"22" l.nop \n"23: "=&r"(tmp)24: "r"(p), "r"(mask)25: "cc", "memory");26}2728static inline void clear_bit(int nr, volatile unsigned long *addr)29{30unsigned long mask = BIT_MASK(nr);31unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);32unsigned long tmp;3334__asm__ __volatile__(35"1: l.lwa %0,0(%1) \n"36" l.and %0,%0,%2 \n"37" l.swa 0(%1),%0 \n"38" l.bnf 1b \n"39" l.nop \n"40: "=&r"(tmp)41: "r"(p), "r"(~mask)42: "cc", "memory");43}4445static inline void change_bit(int nr, volatile unsigned long *addr)46{47unsigned long mask = BIT_MASK(nr);48unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);49unsigned long tmp;5051__asm__ __volatile__(52"1: l.lwa %0,0(%1) \n"53" l.xor %0,%0,%2 \n"54" l.swa 0(%1),%0 \n"55" l.bnf 1b \n"56" l.nop \n"57: "=&r"(tmp)58: "r"(p), "r"(mask)59: "cc", "memory");60}6162static inline int test_and_set_bit(int nr, volatile unsigned long *addr)63{64unsigned long mask = BIT_MASK(nr);65unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);66unsigned long old;67unsigned long tmp;6869__asm__ __volatile__(70"1: l.lwa %0,0(%2) \n"71" l.or %1,%0,%3 \n"72" l.swa 0(%2),%1 \n"73" l.bnf 1b \n"74" l.nop \n"75: "=&r"(old), "=&r"(tmp)76: "r"(p), "r"(mask)77: "cc", "memory");7879return (old & mask) != 0;80}8182static inline int test_and_clear_bit(int nr, volatile unsigned long *addr)83{84unsigned long mask = BIT_MASK(nr);85unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);86unsigned long old;87unsigned long tmp;8889__asm__ __volatile__(90"1: l.lwa %0,0(%2) \n"91" l.and %1,%0,%3 \n"92" l.swa 0(%2),%1 \n"93" l.bnf 1b \n"94" l.nop \n"95: "=&r"(old), "=&r"(tmp)96: "r"(p), "r"(~mask)97: "cc", "memory");9899return (old & mask) != 0;100}101102static inline int test_and_change_bit(int nr, volatile unsigned long *addr)103{104unsigned long mask = BIT_MASK(nr);105unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);106unsigned long old;107unsigned long tmp;108109__asm__ __volatile__(110"1: l.lwa %0,0(%2) \n"111" l.xor %1,%0,%3 \n"112" l.swa 0(%2),%1 \n"113" l.bnf 1b \n"114" l.nop \n"115: "=&r"(old), "=&r"(tmp)116: "r"(p), "r"(mask)117: "cc", "memory");118119return (old & mask) != 0;120}121122#endif /* __ASM_OPENRISC_BITOPS_ATOMIC_H */123124125