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 de0babd60d
("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
...
Esse commit está contido em:
@@ -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)
|
||||
{
|
||||
@@ -3123,6 +3134,18 @@ static int con_is_graphics(const struct consw *csw, int first, int last)
|
||||
* or 0 on success.
|
||||
*/
|
||||
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;
|
||||
@@ -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)
|
||||
|
Referência em uma nova issue
Block a user