]> git.ipfire.org Git - people/ms/u-boot.git/blob - arch/blackfin/include/asm/system.h
Add GPL-2.0+ SPDX-License-Identifier to source files
[people/ms/u-boot.git] / arch / blackfin / include / asm / system.h
1 /*
2 * U-boot - system.h
3 *
4 * Copyright (c) 2005-2007 Analog Devices Inc.
5 *
6 * SPDX-License-Identifier: GPL-2.0+
7 */
8
9 #ifndef _BLACKFIN_SYSTEM_H
10 #define _BLACKFIN_SYSTEM_H
11
12 /*
13 * Interrupt configuring macros.
14 */
15
16 extern int irq_flags;
17
18 #define local_irq_enable() \
19 __asm__ __volatile__ ( \
20 "sti %0;" \
21 : \
22 : "d" (irq_flags) \
23 )
24
25 #define local_irq_disable() \
26 do { \
27 int __tmp_dummy; \
28 __asm__ __volatile__ ( \
29 "cli %0;" \
30 : "=d" (__tmp_dummy) \
31 ); \
32 } while (0)
33
34 # define local_irq_save(x) \
35 __asm__ __volatile__ ( \
36 "cli %0;" \
37 : "=&d" (x) \
38 )
39
40 #define local_save_flags(x) \
41 __asm__ __volatile__ ( \
42 "cli %0;" \
43 "sti %0;" \
44 : "=d" (x) \
45 )
46
47 #define irqs_enabled_from_flags(x) ((x) != 0x1f)
48
49 #define local_irq_restore(x) \
50 do { \
51 if (irqs_enabled_from_flags(x)) \
52 local_irq_enable(); \
53 } while (0)
54
55 /*
56 * Force strict CPU ordering.
57 */
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)
65
66 #define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
67
68 struct __xchg_dummy {
69 unsigned long a[100];
70 };
71 #define __xg(x) ((volatile struct __xchg_dummy *)(x))
72
73 static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
74 int size)
75 {
76 unsigned long tmp = 0;
77 unsigned long flags = 0;
78
79 local_irq_save(flags);
80
81 switch (size) {
82 case 1:
83 __asm__ __volatile__
84 ("%0 = b%2 (z);\n\t"
85 "b%2 = %1;\n\t"
86 : "=&d" (tmp) : "d" (x), "m" (*__xg(ptr)) : "memory");
87 break;
88 case 2:
89 __asm__ __volatile__
90 ("%0 = w%2 (z);\n\t"
91 "w%2 = %1;\n\t"
92 : "=&d" (tmp) : "d" (x), "m" (*__xg(ptr)) : "memory");
93 break;
94 case 4:
95 __asm__ __volatile__
96 ("%0 = %2;\n\t"
97 "%2 = %1;\n\t"
98 : "=&d" (tmp) : "d" (x), "m" (*__xg(ptr)) : "memory");
99 break;
100 }
101 local_irq_restore(flags);
102 return tmp;
103 }
104
105 void bfin_reset_boot_spi_cs(unsigned short pin);
106
107 #endif /* _BLACKFIN_SYSTEM_H */