input: Add support for Qualcomm PMIC8XXX power key
[pandora-kernel.git] / include / linux / jump_label.h
index 7880f18..83e745f 100644 (file)
@@ -1,20 +1,43 @@
 #ifndef _LINUX_JUMP_LABEL_H
 #define _LINUX_JUMP_LABEL_H
 
+#include <linux/types.h>
+#include <linux/compiler.h>
+
 #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL)
+
+struct jump_label_key {
+       atomic_t enabled;
+       struct jump_entry *entries;
+#ifdef CONFIG_MODULES
+       struct jump_label_mod *next;
+#endif
+};
+
 # include <asm/jump_label.h>
 # define HAVE_JUMP_LABEL
 #endif
 
 enum jump_label_type {
+       JUMP_LABEL_DISABLE = 0,
        JUMP_LABEL_ENABLE,
-       JUMP_LABEL_DISABLE
 };
 
 struct module;
 
 #ifdef HAVE_JUMP_LABEL
 
+#ifdef CONFIG_MODULES
+#define JUMP_LABEL_INIT {{ 0 }, NULL, NULL}
+#else
+#define JUMP_LABEL_INIT {{ 0 }, NULL}
+#endif
+
+static __always_inline bool static_branch(struct jump_label_key *key)
+{
+       return arch_static_branch(key);
+}
+
 extern struct jump_entry __start___jump_table[];
 extern struct jump_entry __stop___jump_table[];
 
@@ -23,37 +46,37 @@ extern void jump_label_unlock(void);
 extern void arch_jump_label_transform(struct jump_entry *entry,
                                 enum jump_label_type type);
 extern void arch_jump_label_text_poke_early(jump_label_t addr);
-extern void jump_label_update(unsigned long key, enum jump_label_type type);
-extern void jump_label_apply_nops(struct module *mod);
 extern int jump_label_text_reserved(void *start, void *end);
+extern void jump_label_inc(struct jump_label_key *key);
+extern void jump_label_dec(struct jump_label_key *key);
+extern bool jump_label_enabled(struct jump_label_key *key);
+extern void jump_label_apply_nops(struct module *mod);
 
-#define jump_label_enable(key) \
-       jump_label_update((unsigned long)key, JUMP_LABEL_ENABLE);
+#else
 
-#define jump_label_disable(key) \
-       jump_label_update((unsigned long)key, JUMP_LABEL_DISABLE);
+#include <asm/atomic.h>
 
-#else
+#define JUMP_LABEL_INIT {ATOMIC_INIT(0)}
 
-#define JUMP_LABEL(key, label)                 \
-do {                                           \
-       if (unlikely(*key))                     \
-               goto label;                     \
-} while (0)
+struct jump_label_key {
+       atomic_t enabled;
+};
 
-#define jump_label_enable(cond_var)    \
-do {                                   \
-       *(cond_var) = 1;                        \
-} while (0)
+static __always_inline bool static_branch(struct jump_label_key *key)
+{
+       if (unlikely(atomic_read(&key->enabled)))
+               return true;
+       return false;
+}
 
-#define jump_label_disable(cond_var)   \
-do {                                   \
-       *(cond_var) = 0;                        \
-} while (0)
+static inline void jump_label_inc(struct jump_label_key *key)
+{
+       atomic_inc(&key->enabled);
+}
 
-static inline int jump_label_apply_nops(struct module *mod)
+static inline void jump_label_dec(struct jump_label_key *key)
 {
-       return 0;
+       atomic_dec(&key->enabled);
 }
 
 static inline int jump_label_text_reserved(void *start, void *end)
@@ -64,16 +87,16 @@ static inline int jump_label_text_reserved(void *start, void *end)
 static inline void jump_label_lock(void) {}
 static inline void jump_label_unlock(void) {}
 
-#endif
+static inline bool jump_label_enabled(struct jump_label_key *key)
+{
+       return !!atomic_read(&key->enabled);
+}
 
-#define COND_STMT(key, stmt)                                   \
-do {                                                           \
-       __label__ jl_enabled;                                   \
-       JUMP_LABEL(key, jl_enabled);                            \
-       if (0) {                                                \
-jl_enabled:                                                    \
-               stmt;                                           \
-       }                                                       \
-} while (0)
+static inline int jump_label_apply_nops(struct module *mod)
+{
+       return 0;
+}
+
+#endif
 
 #endif