diff options
Diffstat (limited to 'drivers/tty/vt')
-rw-r--r-- | drivers/tty/vt/vt.c | 117 |
1 files changed, 15 insertions, 102 deletions
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 740202d8a5c4..c677829baa8b 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c | |||
@@ -3086,17 +3086,6 @@ err: | |||
3086 | }; | 3086 | }; |
3087 | 3087 | ||
3088 | 3088 | ||
3089 | static int bind_con_driver(const struct consw *csw, int first, int last, | ||
3090 | int deflt) | ||
3091 | { | ||
3092 | int ret; | ||
3093 | |||
3094 | console_lock(); | ||
3095 | ret = do_bind_con_driver(csw, first, last, deflt); | ||
3096 | console_unlock(); | ||
3097 | return ret; | ||
3098 | } | ||
3099 | |||
3100 | #ifdef CONFIG_VT_HW_CONSOLE_BINDING | 3089 | #ifdef CONFIG_VT_HW_CONSOLE_BINDING |
3101 | static int con_is_graphics(const struct consw *csw, int first, int last) | 3090 | static int con_is_graphics(const struct consw *csw, int first, int last) |
3102 | { | 3091 | { |
@@ -3114,34 +3103,6 @@ static int con_is_graphics(const struct consw *csw, int first, int last) | |||
3114 | return retval; | 3103 | return retval; |
3115 | } | 3104 | } |
3116 | 3105 | ||
3117 | /** | ||
3118 | * unbind_con_driver - unbind a console driver | ||
3119 | * @csw: pointer to console driver to unregister | ||
3120 | * @first: first in range of consoles that @csw should be unbound from | ||
3121 | * @last: last in range of consoles that @csw should be unbound from | ||
3122 | * @deflt: should next bound console driver be default after @csw is unbound? | ||
3123 | * | ||
3124 | * To unbind a driver from all possible consoles, pass 0 as @first and | ||
3125 | * %MAX_NR_CONSOLES as @last. | ||
3126 | * | ||
3127 | * @deflt controls whether the console that ends up replacing @csw should be | ||
3128 | * the default console. | ||
3129 | * | ||
3130 | * RETURNS: | ||
3131 | * -ENODEV if @csw isn't a registered console driver or can't be unregistered | ||
3132 | * or 0 on success. | ||
3133 | */ | ||
3134 | int unbind_con_driver(const struct consw *csw, int first, int last, int deflt) | ||
3135 | { | ||
3136 | int retval; | ||
3137 | |||
3138 | console_lock(); | ||
3139 | retval = do_unbind_con_driver(csw, first, last, deflt); | ||
3140 | console_unlock(); | ||
3141 | return retval; | ||
3142 | } | ||
3143 | EXPORT_SYMBOL(unbind_con_driver); | ||
3144 | |||
3145 | /* unlocked version of unbind_con_driver() */ | 3106 | /* unlocked version of unbind_con_driver() */ |
3146 | int do_unbind_con_driver(const struct consw *csw, int first, int last, int deflt) | 3107 | int do_unbind_con_driver(const struct consw *csw, int first, int last, int deflt) |
3147 | { | 3108 | { |
@@ -3262,8 +3223,11 @@ static int vt_bind(struct con_driver *con) | |||
3262 | if (first == 0 && last == MAX_NR_CONSOLES -1) | 3223 | if (first == 0 && last == MAX_NR_CONSOLES -1) |
3263 | deflt = 1; | 3224 | deflt = 1; |
3264 | 3225 | ||
3265 | if (first != -1) | 3226 | if (first != -1) { |
3266 | bind_con_driver(csw, first, last, deflt); | 3227 | console_lock(); |
3228 | do_bind_con_driver(csw, first, last, deflt); | ||
3229 | console_unlock(); | ||
3230 | } | ||
3267 | 3231 | ||
3268 | first = -1; | 3232 | first = -1; |
3269 | last = -1; | 3233 | last = -1; |
@@ -3301,8 +3265,11 @@ static int vt_unbind(struct con_driver *con) | |||
3301 | if (first == 0 && last == MAX_NR_CONSOLES -1) | 3265 | if (first == 0 && last == MAX_NR_CONSOLES -1) |
3302 | deflt = 1; | 3266 | deflt = 1; |
3303 | 3267 | ||
3304 | if (first != -1) | 3268 | if (first != -1) { |
3305 | unbind_con_driver(csw, first, last, deflt); | 3269 | console_lock(); |
3270 | do_unbind_con_driver(csw, first, last, deflt); | ||
3271 | console_unlock(); | ||
3272 | } | ||
3306 | 3273 | ||
3307 | first = -1; | 3274 | first = -1; |
3308 | last = -1; | 3275 | last = -1; |
@@ -3574,29 +3541,9 @@ err: | |||
3574 | return retval; | 3541 | return retval; |
3575 | } | 3542 | } |
3576 | 3543 | ||
3577 | /** | ||
3578 | * register_con_driver - register console driver to console layer | ||
3579 | * @csw: console driver | ||
3580 | * @first: the first console to take over, minimum value is 0 | ||
3581 | * @last: the last console to take over, maximum value is MAX_NR_CONSOLES -1 | ||
3582 | * | ||
3583 | * DESCRIPTION: This function registers a console driver which can later | ||
3584 | * bind to a range of consoles specified by @first and @last. It will | ||
3585 | * also initialize the console driver by calling con_startup(). | ||
3586 | */ | ||
3587 | int register_con_driver(const struct consw *csw, int first, int last) | ||
3588 | { | ||
3589 | int retval; | ||
3590 | |||
3591 | console_lock(); | ||
3592 | retval = do_register_con_driver(csw, first, last); | ||
3593 | console_unlock(); | ||
3594 | return retval; | ||
3595 | } | ||
3596 | EXPORT_SYMBOL(register_con_driver); | ||
3597 | 3544 | ||
3598 | /** | 3545 | /** |
3599 | * unregister_con_driver - unregister console driver from console layer | 3546 | * do_unregister_con_driver - unregister console driver from console layer |
3600 | * @csw: console driver | 3547 | * @csw: console driver |
3601 | * | 3548 | * |
3602 | * DESCRIPTION: All drivers that registers to the console layer must | 3549 | * DESCRIPTION: All drivers that registers to the console layer must |
@@ -3606,17 +3553,6 @@ EXPORT_SYMBOL(register_con_driver); | |||
3606 | * | 3553 | * |
3607 | * The driver must unbind first prior to unregistration. | 3554 | * The driver must unbind first prior to unregistration. |
3608 | */ | 3555 | */ |
3609 | int unregister_con_driver(const struct consw *csw) | ||
3610 | { | ||
3611 | int retval; | ||
3612 | |||
3613 | console_lock(); | ||
3614 | retval = do_unregister_con_driver(csw); | ||
3615 | console_unlock(); | ||
3616 | return retval; | ||
3617 | } | ||
3618 | EXPORT_SYMBOL(unregister_con_driver); | ||
3619 | |||
3620 | int do_unregister_con_driver(const struct consw *csw) | 3556 | int do_unregister_con_driver(const struct consw *csw) |
3621 | { | 3557 | { |
3622 | int i, retval = -ENODEV; | 3558 | int i, retval = -ENODEV; |
@@ -3654,7 +3590,7 @@ EXPORT_SYMBOL_GPL(do_unregister_con_driver); | |||
3654 | * when a driver wants to take over some existing consoles | 3590 | * when a driver wants to take over some existing consoles |
3655 | * and become default driver for newly opened ones. | 3591 | * and become default driver for newly opened ones. |
3656 | * | 3592 | * |
3657 | * take_over_console is basically a register followed by unbind | 3593 | * do_take_over_console is basically a register followed by unbind |
3658 | */ | 3594 | */ |
3659 | int do_take_over_console(const struct consw *csw, int first, int last, int deflt) | 3595 | int do_take_over_console(const struct consw *csw, int first, int last, int deflt) |
3660 | { | 3596 | { |
@@ -3675,30 +3611,6 @@ int do_take_over_console(const struct consw *csw, int first, int last, int deflt | |||
3675 | } | 3611 | } |
3676 | EXPORT_SYMBOL_GPL(do_take_over_console); | 3612 | EXPORT_SYMBOL_GPL(do_take_over_console); |
3677 | 3613 | ||
3678 | /* | ||
3679 | * If we support more console drivers, this function is used | ||
3680 | * when a driver wants to take over some existing consoles | ||
3681 | * and become default driver for newly opened ones. | ||
3682 | * | ||
3683 | * take_over_console is basically a register followed by unbind | ||
3684 | */ | ||
3685 | int take_over_console(const struct consw *csw, int first, int last, int deflt) | ||
3686 | { | ||
3687 | int err; | ||
3688 | |||
3689 | err = register_con_driver(csw, first, last); | ||
3690 | /* | ||
3691 | * If we get an busy error we still want to bind the console driver | ||
3692 | * and return success, as we may have unbound the console driver | ||
3693 | * but not unregistered it. | ||
3694 | */ | ||
3695 | if (err == -EBUSY) | ||
3696 | err = 0; | ||
3697 | if (!err) | ||
3698 | bind_con_driver(csw, first, last, deflt); | ||
3699 | |||
3700 | return err; | ||
3701 | } | ||
3702 | 3614 | ||
3703 | /* | 3615 | /* |
3704 | * give_up_console is a wrapper to unregister_con_driver. It will only | 3616 | * give_up_console is a wrapper to unregister_con_driver. It will only |
@@ -3706,7 +3618,9 @@ int take_over_console(const struct consw *csw, int first, int last, int deflt) | |||
3706 | */ | 3618 | */ |
3707 | void give_up_console(const struct consw *csw) | 3619 | void give_up_console(const struct consw *csw) |
3708 | { | 3620 | { |
3709 | unregister_con_driver(csw); | 3621 | console_lock(); |
3622 | do_unregister_con_driver(csw); | ||
3623 | console_unlock(); | ||
3710 | } | 3624 | } |
3711 | 3625 | ||
3712 | static int __init vtconsole_class_init(void) | 3626 | static int __init vtconsole_class_init(void) |
@@ -4262,6 +4176,5 @@ EXPORT_SYMBOL(console_blanked); | |||
4262 | EXPORT_SYMBOL(vc_cons); | 4176 | EXPORT_SYMBOL(vc_cons); |
4263 | EXPORT_SYMBOL(global_cursor_default); | 4177 | EXPORT_SYMBOL(global_cursor_default); |
4264 | #ifndef VT_SINGLE_DRIVER | 4178 | #ifndef VT_SINGLE_DRIVER |
4265 | EXPORT_SYMBOL(take_over_console); | ||
4266 | EXPORT_SYMBOL(give_up_console); | 4179 | EXPORT_SYMBOL(give_up_console); |
4267 | #endif | 4180 | #endif |