Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+4 −3
Original line number Original line Diff line number Diff line
@@ -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)
	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)
	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)


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);