diff options
-rw-r--r-- | arch/arm/include/asm/mmu.h | 4 | ||||
-rw-r--r-- | drivers/input/keyreset.c | 13 | ||||
-rw-r--r-- | include/linux/keyreset.h | 1 |
3 files changed, 16 insertions, 2 deletions
diff --git a/arch/arm/include/asm/mmu.h b/arch/arm/include/asm/mmu.h index 68870c776671..b4ffe9d5b526 100644 --- a/arch/arm/include/asm/mmu.h +++ b/arch/arm/include/asm/mmu.h @@ -13,6 +13,10 @@ typedef struct { #ifdef CONFIG_CPU_HAS_ASID #define ASID(mm) ((mm)->context.id & 255) + +/* init_mm.context.id_lock should be initialized. */ +#define INIT_MM_CONTEXT(name) \ + .context.id_lock = __SPIN_LOCK_UNLOCKED(name.context.id_lock), #else #define ASID(mm) (0) #endif diff --git a/drivers/input/keyreset.c b/drivers/input/keyreset.c index b51350602fc3..a5091ac19bbe 100644 --- a/drivers/input/keyreset.c +++ b/drivers/input/keyreset.c @@ -33,6 +33,7 @@ struct keyreset_state { int key_down; int key_up; int restart_disabled; + int (*reset_fn)(void); }; int restart_requested; @@ -88,8 +89,12 @@ static void keyreset_event(struct input_handle *handle, unsigned int type, if (restart_requested) panic("keyboard reset failed, %d", restart_requested); pr_info("keyboard reset\n"); - schedule_work(&restart_work); - restart_requested = 1; + if (state->reset_fn) { + restart_requested = state->reset_fn(); + } else { + schedule_work(&restart_work); + restart_requested = 1; + } } done: spin_unlock_irqrestore(&state->lock, flags); @@ -187,6 +192,10 @@ static int keyreset_probe(struct platform_device *pdev) __set_bit(key, state->upbit); } } + + if (pdata->reset_fn) + state->reset_fn = pdata->reset_fn; + state->input_handler.event = keyreset_event; state->input_handler.connect = keyreset_connect; state->input_handler.disconnect = keyreset_disconnect; diff --git a/include/linux/keyreset.h b/include/linux/keyreset.h index 50c4b952b8f7..a2ac49e5b684 100644 --- a/include/linux/keyreset.h +++ b/include/linux/keyreset.h @@ -20,6 +20,7 @@ #define KEYRESET_NAME "keyreset" struct keyreset_platform_data { + int (*reset_fn)(void); int *keys_up; int keys_down[]; /* 0 terminated */ }; |