Commit a455e298 authored by Peter Popovec's avatar Peter Popovec Committed by Dmitry Torokhov

Input: walkera0701 - fix crash on startup

The driver's timer must be set up before enabling IRQ handler, otherwise
bad things may happen.
Reported-and-tested-by: default avatarFengguang Wu <fengguang.wu@intel.com>
Signed-off-by: default avatarPeter Popovec <popovec@fei.tuke.sk>
CC: stable@vger.kernel.org
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent da5ee074
...@@ -196,6 +196,7 @@ static void walkera0701_close(struct input_dev *dev) ...@@ -196,6 +196,7 @@ static void walkera0701_close(struct input_dev *dev)
struct walkera_dev *w = input_get_drvdata(dev); struct walkera_dev *w = input_get_drvdata(dev);
parport_disable_irq(w->parport); parport_disable_irq(w->parport);
hrtimer_cancel(&w->timer);
} }
static int walkera0701_connect(struct walkera_dev *w, int parport) static int walkera0701_connect(struct walkera_dev *w, int parport)
...@@ -224,6 +225,9 @@ static int walkera0701_connect(struct walkera_dev *w, int parport) ...@@ -224,6 +225,9 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
if (parport_claim(w->pardevice)) if (parport_claim(w->pardevice))
goto init_err1; goto init_err1;
hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
w->timer.function = timer_handler;
w->input_dev = input_allocate_device(); w->input_dev = input_allocate_device();
if (!w->input_dev) if (!w->input_dev)
goto init_err2; goto init_err2;
...@@ -254,8 +258,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport) ...@@ -254,8 +258,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
if (err) if (err)
goto init_err3; goto init_err3;
hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
w->timer.function = timer_handler;
return 0; return 0;
init_err3: init_err3:
...@@ -271,7 +273,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport) ...@@ -271,7 +273,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport)
static void walkera0701_disconnect(struct walkera_dev *w) static void walkera0701_disconnect(struct walkera_dev *w)
{ {
hrtimer_cancel(&w->timer);
input_unregister_device(w->input_dev); input_unregister_device(w->input_dev);
parport_release(w->pardevice); parport_release(w->pardevice);
parport_unregister_device(w->pardevice); parport_unregister_device(w->pardevice);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment