input: 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
3b79b73e8e
commit
068da28761
1 changed files with 4 additions and 2 deletions
|
@ -27,9 +27,10 @@ struct keyreset_state {
|
||||||
int restart_requested;
|
int restart_requested;
|
||||||
int (*reset_fn)(void);
|
int (*reset_fn)(void);
|
||||||
struct platform_device *pdev_child;
|
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();
|
sys_sync();
|
||||||
kernel_restart(NULL);
|
kernel_restart(NULL);
|
||||||
|
@ -44,7 +45,7 @@ static void do_reset_fn(void *priv)
|
||||||
state->restart_requested = state->reset_fn();
|
state->restart_requested = state->reset_fn();
|
||||||
} else {
|
} else {
|
||||||
pr_info("keyboard reset\n");
|
pr_info("keyboard reset\n");
|
||||||
do_restart();
|
schedule_work(&state->restart_work);
|
||||||
state->restart_requested = 1;
|
state->restart_requested = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,6 +70,7 @@ static int keyreset_probe(struct platform_device *pdev)
|
||||||
if (!state->pdev_child)
|
if (!state->pdev_child)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
state->pdev_child->dev.parent = &pdev->dev;
|
state->pdev_child->dev.parent = &pdev->dev;
|
||||||
|
INIT_WORK(&state->restart_work, do_restart);
|
||||||
|
|
||||||
keyp = pdata->keys_down;
|
keyp = pdata->keys_down;
|
||||||
while ((key = *keyp++)) {
|
while ((key = *keyp++)) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue