Make GPE disable more robust
[linux-2.6] / include / asm-avr32 / bug.h
1 /*
2  * Copyright (C) 2006 Atmel Corporation
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8 #ifndef __ASM_AVR32_BUG_H
9 #define __ASM_AVR32_BUG_H
10
11 #ifdef CONFIG_BUG
12
13 /*
14  * According to our Chief Architect, this compact opcode is very
15  * unlikely to ever be implemented.
16  */
17 #define AVR32_BUG_OPCODE        0x5df0
18
19 #ifdef CONFIG_DEBUG_BUGVERBOSE
20
21 #define _BUG_OR_WARN(flags)                                             \
22         asm volatile(                                                   \
23                 "1:     .hword  %0\n"                                   \
24                 "       .section __bug_table,\"a\",@progbits\n"         \
25                 "2:     .long   1b\n"                                   \
26                 "       .long   %1\n"                                   \
27                 "       .short  %2\n"                                   \
28                 "       .short  %3\n"                                   \
29                 "       .org    2b + %4\n"                              \
30                 "       .previous"                                      \
31                 :                                                       \
32                 : "i"(AVR32_BUG_OPCODE), "i"(__FILE__),                 \
33                   "i"(__LINE__), "i"(flags),                            \
34                   "i"(sizeof(struct bug_entry)))
35
36 #else
37
38 #define _BUG_OR_WARN(flags)                                             \
39         asm volatile(                                                   \
40                 "1:     .hword  %0\n"                                   \
41                 "       .section __bug_table,\"a\",@progbits\n"         \
42                 "2:     .long   1b\n"                                   \
43                 "       .short  %1\n"                                   \
44                 "       .org    2b + %2\n"                              \
45                 "       .previous"                                      \
46                 :                                                       \
47                 : "i"(AVR32_BUG_OPCODE), "i"(flags),                    \
48                   "i"(sizeof(struct bug_entry)))
49
50 #endif /* CONFIG_DEBUG_BUGVERBOSE */
51
52 #define BUG()                                                           \
53         do {                                                            \
54                 _BUG_OR_WARN(0);                                        \
55                 for (;;);                                               \
56         } while (0)
57
58 #define WARN_ON(condition)                                                      \
59         ({                                                              \
60                 int __ret_warn_on = !!(condition);                      \
61                 if (unlikely(__ret_warn_on))                            \
62                         _BUG_OR_WARN(BUGFLAG_WARNING);                  \
63                 unlikely(__ret_warn_on);                                \
64         })
65
66 #define HAVE_ARCH_BUG
67 #define HAVE_ARCH_WARN_ON
68
69 #endif /* CONFIG_BUG */
70
71 #include <asm-generic/bug.h>
72
73 #endif /* __ASM_AVR32_BUG_H */