diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-25 16:46:44 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-25 16:46:44 -0800 | 
| commit | fffddfd6c8e0c10c42c6e2cc54ba880fcc36ebbb (patch) | |
| tree | 71bc5e597124dbaf7550f1e089d675718b3ed5c0 /drivers/tty/vt/vt.c | |
| parent | 69086a78bdc973ec0b722be790b146e84ba8a8c4 (diff) | |
| parent | be88298b0a3f771a4802f20c5e66af74bfd1dff1 (diff) | |
| download | olio-linux-3.10-fffddfd6c8e0c10c42c6e2cc54ba880fcc36ebbb.tar.xz olio-linux-3.10-fffddfd6c8e0c10c42c6e2cc54ba880fcc36ebbb.zip  | |
Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
Pull drm merge from Dave Airlie:
 "Highlights:
   - TI LCD controller KMS driver
   - TI OMAP KMS driver merged from staging
   - drop gma500 stub driver
   - the fbcon locking fixes
   - the vgacon dirty like zebra fix.
   - open firmware videomode and hdmi common code helpers
   - major locking rework for kms object handling - pageflip/cursor
     won't block on polling anymore!
   - fbcon helper and prime helper cleanups
   - i915: all over the map, haswell power well enhancements, valleyview
     macro horrors cleaned up, killing lots of legacy GTT code,
   - radeon: CS ioctl unification, deprecated UMS support, gpu reset
     rework, VM fixes
   - nouveau: reworked thermal code, external dp/tmds encoder support
     (anx9805), fences sleep instead of polling,
   - exynos: all over the driver fixes."
Lovely conflict in radeon/evergreen_cs.c between commit de0babd60d8d
("drm/radeon: enforce use of radeon_get_ib_value when reading user cmd")
and the new changes that modified that evergreen_dma_cs_parse()
function.
* 'drm-next' of git://people.freedesktop.org/~airlied/linux: (508 commits)
  drm/tilcdc: only build on arm
  drm/i915: Revert hdmi HDP pin checks
  drm/tegra: Add list of framebuffers to debugfs
  drm/tegra: Fix color expansion
  drm/tegra: Split DC_CMD_STATE_CONTROL register write
  drm/tegra: Implement page-flipping support
  drm/tegra: Implement VBLANK support
  drm/tegra: Implement .mode_set_base()
  drm/tegra: Add plane support
  drm/tegra: Remove bogus tegra_framebuffer structure
  drm: Add consistency check for page-flipping
  drm/radeon: Use generic HDMI infoframe helpers
  drm/tegra: Use generic HDMI infoframe helpers
  drm: Add EDID helper documentation
  drm: Add HDMI infoframe helpers
  video: Add generic HDMI infoframe helpers
  drm: Add some missing forward declarations
  drm: Move mode tables to drm_edid.c
  drm: Remove duplicate drm_mode_cea_vic()
  gma500: Fix n, m1 and m2 clock limits for sdvo and lvds
  ...
Diffstat (limited to 'drivers/tty/vt/vt.c')
| -rw-r--r-- | drivers/tty/vt/vt.c | 136 | 
1 files changed, 98 insertions, 38 deletions
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 6c4abeaf690..fbd447b390f 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c @@ -638,7 +638,7 @@ static inline void save_screen(struct vc_data *vc)   *	Redrawing of screen   */ -static void clear_buffer_attributes(struct vc_data *vc) +void clear_buffer_attributes(struct vc_data *vc)  {  	unsigned short *p = (unsigned short *)vc->vc_origin;  	int count = vc->vc_screenbuf_size / 2; @@ -2987,7 +2987,7 @@ int __init vty_init(const struct file_operations *console_fops)  static struct class *vtconsole_class; -static int bind_con_driver(const struct consw *csw, int first, int last, +static int do_bind_con_driver(const struct consw *csw, int first, int last,  			   int deflt)  {  	struct module *owner = csw->owner; @@ -2998,7 +2998,7 @@ static int bind_con_driver(const struct consw *csw, int first, int last,  	if (!try_module_get(owner))  		return -ENODEV; -	console_lock(); +	WARN_CONSOLE_UNLOCKED();  	/* check if driver is registered */  	for (i = 0; i < MAX_NR_CON_DRIVER; i++) { @@ -3083,11 +3083,22 @@ static int bind_con_driver(const struct consw *csw, int first, int last,  	retval = 0;  err: -	console_unlock();  	module_put(owner);  	return retval;  }; + +static int bind_con_driver(const struct consw *csw, int first, int last, +			   int deflt) +{ +	int ret; + +	console_lock(); +	ret = do_bind_con_driver(csw, first, last, deflt); +	console_unlock(); +	return ret; +} +  #ifdef CONFIG_VT_HW_CONSOLE_BINDING  static int con_is_graphics(const struct consw *csw, int first, int last)  { @@ -3124,6 +3135,18 @@ static int con_is_graphics(const struct consw *csw, int first, int last)   */  int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)  { +	int retval; + +	console_lock(); +	retval = do_unbind_con_driver(csw, first, last, deflt); +	console_unlock(); +	return retval; +} +EXPORT_SYMBOL(unbind_con_driver); + +/* unlocked version of unbind_con_driver() */ +int do_unbind_con_driver(const struct consw *csw, int first, int last, int deflt) +{  	struct module *owner = csw->owner;  	const struct consw *defcsw = NULL;  	struct con_driver *con_driver = NULL, *con_back = NULL; @@ -3132,7 +3155,7 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)  	if (!try_module_get(owner))  		return -ENODEV; -	console_lock(); +	WARN_CONSOLE_UNLOCKED();  	/* check if driver is registered and if it is unbindable */  	for (i = 0; i < MAX_NR_CON_DRIVER; i++) { @@ -3145,10 +3168,8 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)  		}  	} -	if (retval) { -		console_unlock(); +	if (retval)  		goto err; -	}  	retval = -ENODEV; @@ -3164,15 +3185,11 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)  		}  	} -	if (retval) { -		console_unlock(); +	if (retval)  		goto err; -	} -	if (!con_is_bound(csw)) { -		console_unlock(); +	if (!con_is_bound(csw))  		goto err; -	}  	first = max(first, con_driver->first);  	last = min(last, con_driver->last); @@ -3199,15 +3216,14 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)  	if (!con_is_bound(csw))  		con_driver->flag &= ~CON_DRIVER_FLAG_INIT; -	console_unlock();  	/* ignore return value, binding should not fail */ -	bind_con_driver(defcsw, first, last, deflt); +	do_bind_con_driver(defcsw, first, last, deflt);  err:  	module_put(owner);  	return retval;  } -EXPORT_SYMBOL(unbind_con_driver); +EXPORT_SYMBOL_GPL(do_unbind_con_driver);  static int vt_bind(struct con_driver *con)  { @@ -3492,28 +3508,18 @@ int con_debug_leave(void)  }  EXPORT_SYMBOL_GPL(con_debug_leave); -/** - * register_con_driver - register console driver to console layer - * @csw: console driver - * @first: the first console to take over, minimum value is 0 - * @last: the last console to take over, maximum value is MAX_NR_CONSOLES -1 - * - * DESCRIPTION: This function registers a console driver which can later - * bind to a range of consoles specified by @first and @last. It will - * also initialize the console driver by calling con_startup(). - */ -int register_con_driver(const struct consw *csw, int first, int last) +static int do_register_con_driver(const struct consw *csw, int first, int last)  {  	struct module *owner = csw->owner;  	struct con_driver *con_driver;  	const char *desc;  	int i, retval = 0; +	WARN_CONSOLE_UNLOCKED(); +  	if (!try_module_get(owner))  		return -ENODEV; -	console_lock(); -  	for (i = 0; i < MAX_NR_CON_DRIVER; i++) {  		con_driver = ®istered_con_driver[i]; @@ -3566,10 +3572,29 @@ int register_con_driver(const struct consw *csw, int first, int last)  	}  err: -	console_unlock();  	module_put(owner);  	return retval;  } + +/** + * register_con_driver - register console driver to console layer + * @csw: console driver + * @first: the first console to take over, minimum value is 0 + * @last: the last console to take over, maximum value is MAX_NR_CONSOLES -1 + * + * DESCRIPTION: This function registers a console driver which can later + * bind to a range of consoles specified by @first and @last. It will + * also initialize the console driver by calling con_startup(). + */ +int register_con_driver(const struct consw *csw, int first, int last) +{ +	int retval; + +	console_lock(); +	retval = do_register_con_driver(csw, first, last); +	console_unlock(); +	return retval; +}  EXPORT_SYMBOL(register_con_driver);  /** @@ -3585,9 +3610,18 @@ EXPORT_SYMBOL(register_con_driver);   */  int unregister_con_driver(const struct consw *csw)  { -	int i, retval = -ENODEV; +	int retval;  	console_lock(); +	retval = do_unregister_con_driver(csw); +	console_unlock(); +	return retval; +} +EXPORT_SYMBOL(unregister_con_driver); + +int do_unregister_con_driver(const struct consw *csw) +{ +	int i, retval = -ENODEV;  	/* cannot unregister a bound driver */  	if (con_is_bound(csw)) @@ -3613,27 +3647,53 @@ int unregister_con_driver(const struct consw *csw)  		}  	}  err: -	console_unlock();  	return retval;  } -EXPORT_SYMBOL(unregister_con_driver); +EXPORT_SYMBOL_GPL(do_unregister_con_driver);  /*   *	If we support more console drivers, this function is used   *	when a driver wants to take over some existing consoles   *	and become default driver for newly opened ones.   * - *      take_over_console is basically a register followed by unbind + *	take_over_console is basically a register followed by unbind + */ +int do_take_over_console(const struct consw *csw, int first, int last, int deflt) +{ +	int err; + +	err = do_register_con_driver(csw, first, last); +	/* +	 * If we get an busy error we still want to bind the console driver +	 * and return success, as we may have unbound the console driver +	 * but not unregistered it. +	 */ +	if (err == -EBUSY) +		err = 0; +	if (!err) +		do_bind_con_driver(csw, first, last, deflt); + +	return err; +} +EXPORT_SYMBOL_GPL(do_take_over_console); + +/* + *	If we support more console drivers, this function is used + *	when a driver wants to take over some existing consoles + *	and become default driver for newly opened ones. + * + *	take_over_console is basically a register followed by unbind   */  int take_over_console(const struct consw *csw, int first, int last, int deflt)  {  	int err;  	err = register_con_driver(csw, first, last); -	/* if we get an busy error we still want to bind the console driver +	/* +	 * If we get an busy error we still want to bind the console driver  	 * and return success, as we may have unbound the console driver -	 * but not unregistered it. -	*/ +	 * but not unregistered it. +	 */  	if (err == -EBUSY)  		err = 0;  	if (!err)  |