From: Akinobu Mita This patch adds a flag to serio driver indicating whether registration is complete and check that flag in serio_unregister_driver. Cc: Dmitry Torokhov Signed-off-by: Akinobu Mita Signed-off-by: Andrew Morton --- drivers/input/serio/serio.c | 7 ++++++- include/linux/serio.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff -puN drivers/input/serio/serio.c~input-check-whether-serio-dirver-registration-is-completed drivers/input/serio/serio.c --- a/drivers/input/serio/serio.c~input-check-whether-serio-dirver-registration-is-completed +++ a/drivers/input/serio/serio.c @@ -797,6 +797,8 @@ static void serio_add_driver(struct seri printk(KERN_ERR "serio: driver_register() failed for %s, error: %d\n", drv->driver.name, error); + else + drv->registered = 1; } int __serio_register_driver(struct serio_driver *drv, struct module *owner) @@ -823,7 +825,10 @@ start_over: } } - driver_unregister(&drv->driver); + if (drv->registered) { + driver_unregister(&drv->driver); + drv->registered = 0; + } mutex_unlock(&serio_mutex); } diff -puN include/linux/serio.h~input-check-whether-serio-dirver-registration-is-completed include/linux/serio.h --- a/include/linux/serio.h~input-check-whether-serio-dirver-registration-is-completed +++ a/include/linux/serio.h @@ -68,6 +68,7 @@ struct serio_driver { void (*cleanup)(struct serio *); struct device_driver driver; + int registered; }; #define to_serio_driver(d) container_of(d, struct serio_driver, driver) _