initial revision
[ucgine.git] / arch / stm32 / include / ucg_irq.h
1 /*
2  * Copyright 2015, Olivier MATZ <zer0@droids-corp.org>
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *     * Neither the name of the University of California, Berkeley nor the
13  *       names of its contributors may be used to endorse or promote products
14  *       derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #ifndef UCG_IRQ_H_
29 #define UCG_IRQ_H_
30
31 #include <stdint.h>
32
33 typedef uint32_t ucg_irqflags_t;
34
35 static inline uint32_t __ucg_get_primask(void)
36 {
37         ucg_irqflags_t primask_reg;
38
39         asm volatile (
40                 "mrs %0, primask\n"
41                 : "=r" (primask_reg)
42                 :
43                 : );
44
45         return primask_reg;
46 }
47
48 static inline void __ucg_set_primask(ucg_irqflags_t primask_reg)
49 {
50         asm volatile (
51                 "msr primask, %0\n"
52                 :
53                 : "r" (primask_reg)
54                 : );
55 }
56
57 static inline void ucg_irq_lock(void)
58 {
59         __asm volatile ("cpsid i");
60 }
61
62 static inline void ucg_irq_unlock(void)
63 {
64         __asm volatile ("cpsie i");
65 }
66
67 static inline ucg_irqflags_t ucg_irq_lock_save(void)
68 {
69         ucg_irqflags_t flags;
70
71         flags = __ucg_get_primask();
72         ucg_irq_lock();
73         return flags;
74 }
75
76 static inline void ucg_irq_unlock_restore(ucg_irqflags_t flags)
77 {
78         __ucg_set_primask(flags);
79 }
80
81 static inline int ucg_irq_locked(void)
82 {
83         ucg_irqflags_t flags = __ucg_get_primask();
84         return !!flags;
85 }
86
87 #endif /* UCG_IRQ_H_ */