aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/vt
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/tty/vt')
-rw-r--r--drivers/tty/vt/vt.c117
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
3089static 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
3101static int con_is_graphics(const struct consw *csw, int first, int last) 3090static 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 */
3134int 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}
3143EXPORT_SYMBOL(unbind_con_driver);
3144
3145/* unlocked version of unbind_con_driver() */ 3106/* unlocked version of unbind_con_driver() */
3146int do_unbind_con_driver(const struct consw *csw, int first, int last, int deflt) 3107int 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 */
3587int 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}
3596EXPORT_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 */
3609int 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}
3618EXPORT_SYMBOL(unregister_con_driver);
3619
3620int do_unregister_con_driver(const struct consw *csw) 3556int 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 */
3659int do_take_over_console(const struct consw *csw, int first, int last, int deflt) 3595int 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}
3676EXPORT_SYMBOL_GPL(do_take_over_console); 3612EXPORT_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 */
3685int 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 */
3707void give_up_console(const struct consw *csw) 3619void 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
3712static int __init vtconsole_class_init(void) 3626static int __init vtconsole_class_init(void)
@@ -4262,6 +4176,5 @@ EXPORT_SYMBOL(console_blanked);
4262EXPORT_SYMBOL(vc_cons); 4176EXPORT_SYMBOL(vc_cons);
4263EXPORT_SYMBOL(global_cursor_default); 4177EXPORT_SYMBOL(global_cursor_default);
4264#ifndef VT_SINGLE_DRIVER 4178#ifndef VT_SINGLE_DRIVER
4265EXPORT_SYMBOL(take_over_console);
4266EXPORT_SYMBOL(give_up_console); 4179EXPORT_SYMBOL(give_up_console);
4267#endif 4180#endif