|
@@ -855,10 +855,16 @@ static void atkbd_disconnect(struct serio *serio)
|
|
|
|
|
|
atkbd_disable(atkbd);
|
|
|
|
|
|
- /* make sure we don't have a command in flight */
|
|
|
+ input_unregister_device(atkbd->dev);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Make sure we don't have a command in flight.
|
|
|
+ * Note that since atkbd->enabled is false event work will keep
|
|
|
+ * rescheduling itself until it gets canceled and will not try
|
|
|
+ * accessing freed input device or serio port.
|
|
|
+ */
|
|
|
cancel_delayed_work_sync(&atkbd->event_work);
|
|
|
|
|
|
- input_unregister_device(atkbd->dev);
|
|
|
serio_close(serio);
|
|
|
serio_set_drvdata(serio, NULL);
|
|
|
kfree(atkbd);
|