|
@@ -3573,17 +3573,20 @@ err:
|
|
|
*/
|
|
|
int do_unregister_con_driver(const struct consw *csw)
|
|
|
{
|
|
|
- int i, retval = -ENODEV;
|
|
|
+ int i;
|
|
|
|
|
|
/* cannot unregister a bound driver */
|
|
|
if (con_is_bound(csw))
|
|
|
- goto err;
|
|
|
+ return -EBUSY;
|
|
|
+
|
|
|
+ if (csw == conswitchp)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
for (i = 0; i < MAX_NR_CON_DRIVER; i++) {
|
|
|
struct con_driver *con_driver = ®istered_con_driver[i];
|
|
|
|
|
|
if (con_driver->con == csw &&
|
|
|
- con_driver->flag & CON_DRIVER_FLAG_MODULE) {
|
|
|
+ con_driver->flag & CON_DRIVER_FLAG_INIT) {
|
|
|
vtconsole_deinit_device(con_driver);
|
|
|
device_destroy(vtconsole_class,
|
|
|
MKDEV(0, con_driver->node));
|
|
@@ -3594,12 +3597,11 @@ int do_unregister_con_driver(const struct consw *csw)
|
|
|
con_driver->flag = 0;
|
|
|
con_driver->first = 0;
|
|
|
con_driver->last = 0;
|
|
|
- retval = 0;
|
|
|
- break;
|
|
|
+ return 0;
|
|
|
}
|
|
|
}
|
|
|
-err:
|
|
|
- return retval;
|
|
|
+
|
|
|
+ return -ENODEV;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(do_unregister_con_driver);
|
|
|
|