4 * Copyright (c) 2005-2007 Analog Devices Inc.
6 * SPDX-License-Identifier: GPL-2.0+
9 #ifndef _BLACKFIN_SYSTEM_H
10 #define _BLACKFIN_SYSTEM_H
13 * Interrupt configuring macros.
18 #define local_irq_enable() \
19 __asm__ __volatile__ ( \
25 #define local_irq_disable() \
28 __asm__ __volatile__ ( \
30 : "=d" (__tmp_dummy) \
34 # define local_irq_save(x) \
35 __asm__ __volatile__ ( \
40 #define local_save_flags(x) \
41 __asm__ __volatile__ ( \
47 #define irqs_enabled_from_flags(x) ((x) != 0x1f)
49 #define local_irq_restore(x) \
51 if (irqs_enabled_from_flags(x)) \
56 * Force strict CPU ordering.
58 #define nop() asm volatile ("nop;\n\t"::)
59 #define mb() asm volatile ("" : : :"memory")
60 #define rmb() asm volatile ("" : : :"memory")
61 #define wmb() asm volatile ("" : : :"memory")
62 #define set_rmb(var, value) do { xchg(&var, value); } while (0)
63 #define set_mb(var, value) set_rmb(var, value)
64 #define set_wmb(var, value) do { var = value; wmb(); } while (0)
66 #define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
71 #define __xg(x) ((volatile struct __xchg_dummy *)(x))
73 static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
76 unsigned long tmp = 0;
77 unsigned long flags = 0;
79 local_irq_save(flags);
86 : "=&d" (tmp) : "d" (x), "m" (*__xg(ptr)) : "memory");
92 : "=&d" (tmp) : "d" (x), "m" (*__xg(ptr)) : "memory");
98 : "=&d" (tmp) : "d" (x), "m" (*__xg(ptr)) : "memory");
101 local_irq_restore(flags);
105 void bfin_reset_boot_spi_cs(unsigned short pin);
107 #endif /* _BLACKFIN_SYSTEM_H */