ANDROID: input: keyreset: Made keyreset more robust
Switched do_restart to run in a seperate workqueue to handle cases where kernel_restart hangs. Change-Id: I1ecd61f8d0859f1a86d37c692351d644b5db9c69 Signed-off-by: Daniel Rosenberg <drosen@google.com>
This commit is contained in:
parent
3bf11af86a
commit
a9fab763ed
1 changed files with 4 additions and 2 deletions
|
@ -27,9 +27,10 @@ struct keyreset_state {
|
|||
int restart_requested;
|
||||
int (*reset_fn)(void);
|
||||
struct platform_device *pdev_child;
|
||||
struct work_struct restart_work;
|
||||
};
|
||||
|
||||
static void do_restart(void)
|
||||
static void do_restart(struct work_struct *unused)
|
||||
{
|
||||
sys_sync();
|
||||
kernel_restart(NULL);
|
||||
|
@ -44,7 +45,7 @@ static void do_reset_fn(void *priv)
|
|||
state->restart_requested = state->reset_fn();
|
||||
} else {
|
||||
pr_info("keyboard reset\n");
|
||||
do_restart();
|
||||
schedule_work(&state->restart_work);
|
||||
state->restart_requested = 1;
|
||||
}
|
||||
}
|
||||
|
@ -69,6 +70,7 @@ static int keyreset_probe(struct platform_device *pdev)
|
|||
if (!state->pdev_child)
|
||||
return -ENOMEM;
|
||||
state->pdev_child->dev.parent = &pdev->dev;
|
||||
INIT_WORK(&state->restart_work, do_restart);
|
||||
|
||||
keyp = pdata->keys_down;
|
||||
while ((key = *keyp++)) {
|
||||
|
|
Loading…
Reference in a new issue