diff mbox

fb: only enable console lock in fb for VGA console

Message ID CAGA24M+PmObK3ZJWvtNhBzxO4WkGk_xyveQiZNtZe7xGdHrbFw@mail.gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jun Nie Sept. 29, 2012, 5:29 a.m. UTC
If VGA console is not enable, we do not have to
involve console lock/unlock in FB framework to avoid
hold the lock unnecessarily. Otherwise, UART console
output may be blocked by FB pan_display etc operations,
which hold the console lock. This may block the
panic log out on UART, where the lock may never be
released by FB.

Signed-off-by: Jun Nie <njun@marvell.com>
---
 drivers/video/arkfb.c                  |   11 +++++------
 drivers/video/aty/aty128fb.c           |   11 +++++------
 drivers/video/aty/atyfb_base.c         |   11 +++++------
 drivers/video/aty/radeon_pm.c          |    9 ++++-----
 drivers/video/chipsfb.c                |    8 ++++----
 drivers/video/da8xx-fb.c               |    9 ++++-----
 drivers/video/fb-puv3.c                |    9 ++++-----
 drivers/video/fbmem.c                  |   28 ++++++++++++++++++++++------
 drivers/video/fbsysfs.c                |   21 ++++++++++-----------
 drivers/video/geode/gxfb_core.c        |    9 ++++-----
 drivers/video/geode/lxfb_core.c        |    8 ++++----
 drivers/video/i740fb.c                 |   11 +++++------
 drivers/video/i810/i810_main.c         |    9 ++++-----
 drivers/video/jz4740_fb.c              |    9 ++++-----
 drivers/video/mx3fb.c                  |    9 ++++-----
 drivers/video/nvidia/nvidia.c          |    9 ++++-----
 drivers/video/ps3fb.c                  |   15 +++++++--------
 drivers/video/pxafb.c                  |    5 ++---
 drivers/video/s3fb.c                   |   15 +++++++--------
 drivers/video/savage/savagefb_driver.c |    9 ++++-----
 drivers/video/sh_mobile_lcdcfb.c       |   13 ++++++-------
 drivers/video/sm501fb.c                |    9 ++++-----
 drivers/video/tmiofb.c                 |   11 +++++------
 drivers/video/via/viafbdev.c           |    8 ++++----
 drivers/video/vt8623fb.c               |   11 +++++------
 drivers/video/xen-fbfront.c            |    5 ++---
 include/linux/fb.h                     |    2 ++
 27 files changed, 140 insertions(+), 144 deletions(-)

 extern int num_registered_fb;

Comments

Benjamin Herrenschmidt Sept. 29, 2012, 5:58 a.m. UTC | #1
On Sat, 2012-09-29 at 13:29 +0800, Jun Nie wrote:
> If VGA console is not enable, we do not have to
> involve console lock/unlock in FB framework to avoid
> hold the lock unnecessarily. Otherwise, UART console
> output may be blocked by FB pan_display etc operations,
> which hold the console lock. This may block the
> panic log out on UART, where the lock may never be
> released by FB.

And you end up removing all locking from the entire fbdev layer ... did
you actually think about what you were doing here ?

Ben.

> Signed-off-by: Jun Nie <njun@marvell.com>
> ---
>  drivers/video/arkfb.c                  |   11 +++++------
>  drivers/video/aty/aty128fb.c           |   11 +++++------
>  drivers/video/aty/atyfb_base.c         |   11 +++++------
>  drivers/video/aty/radeon_pm.c          |    9 ++++-----
>  drivers/video/chipsfb.c                |    8 ++++----
>  drivers/video/da8xx-fb.c               |    9 ++++-----
>  drivers/video/fb-puv3.c                |    9 ++++-----
>  drivers/video/fbmem.c                  |   28 ++++++++++++++++++++++------
>  drivers/video/fbsysfs.c                |   21 ++++++++++-----------
>  drivers/video/geode/gxfb_core.c        |    9 ++++-----
>  drivers/video/geode/lxfb_core.c        |    8 ++++----
>  drivers/video/i740fb.c                 |   11 +++++------
>  drivers/video/i810/i810_main.c         |    9 ++++-----
>  drivers/video/jz4740_fb.c              |    9 ++++-----
>  drivers/video/mx3fb.c                  |    9 ++++-----
>  drivers/video/nvidia/nvidia.c          |    9 ++++-----
>  drivers/video/ps3fb.c                  |   15 +++++++--------
>  drivers/video/pxafb.c                  |    5 ++---
>  drivers/video/s3fb.c                   |   15 +++++++--------
>  drivers/video/savage/savagefb_driver.c |    9 ++++-----
>  drivers/video/sh_mobile_lcdcfb.c       |   13 ++++++-------
>  drivers/video/sm501fb.c                |    9 ++++-----
>  drivers/video/tmiofb.c                 |   11 +++++------
>  drivers/video/via/viafbdev.c           |    8 ++++----
>  drivers/video/vt8623fb.c               |   11 +++++------
>  drivers/video/xen-fbfront.c            |    5 ++---
>  include/linux/fb.h                     |    2 ++
>  27 files changed, 140 insertions(+), 144 deletions(-)
> 
> diff --git a/drivers/video/arkfb.c b/drivers/video/arkfb.c
> index 555dd4c..774d902 100644
> --- a/drivers/video/arkfb.c
> +++ b/drivers/video/arkfb.c
> @@ -23,7 +23,6 @@
>  #include <linux/svga.h>
>  #include <linux/init.h>
>  #include <linux/pci.h>
> -#include <linux/console.h> /* Why should fb driver call console
> functions? because console_lock() */
>  #include <video/vga.h>
> 
>  #ifdef CONFIG_MTRR
> @@ -1124,12 +1123,12 @@ static int ark_pci_suspend (struct pci_dev*
> dev, pm_message_t state)
> 
>  	dev_info(info->device, "suspend\n");
> 
> -	console_lock();
> +	fb_console_lock();
>  	mutex_lock(&(par->open_lock));
> 
>  	if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
>  		mutex_unlock(&(par->open_lock));
> -		console_unlock();
> +		fb_console_unlock();
>  		return 0;
>  	}
> 
> @@ -1140,7 +1139,7 @@ static int ark_pci_suspend (struct pci_dev* dev,
> pm_message_t state)
>  	pci_set_power_state(dev, pci_choose_state(dev, state));
> 
>  	mutex_unlock(&(par->open_lock));
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> @@ -1155,7 +1154,7 @@ static int ark_pci_resume (struct pci_dev* dev)
> 
>  	dev_info(info->device, "resume\n");
> 
> -	console_lock();
> +	fb_console_lock();
>  	mutex_lock(&(par->open_lock));
> 
>  	if (par->ref_count == 0)
> @@ -1174,7 +1173,7 @@ static int ark_pci_resume (struct pci_dev* dev)
> 
>  fail:
>  	mutex_unlock(&(par->open_lock));
> -	console_unlock();
> +	fb_console_unlock();
>  	return 0;
>  }
>  #else
> diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c
> index 747442d..1c6b80b 100644
> --- a/drivers/video/aty/aty128fb.c
> +++ b/drivers/video/aty/aty128fb.c
> @@ -60,7 +60,6 @@
>  #include <linux/init.h>
>  #include <linux/pci.h>
>  #include <linux/ioport.h>
> -#include <linux/console.h>
>  #include <linux/backlight.h>
>  #include <asm/io.h>
> 
> @@ -1884,7 +1883,7 @@ static void aty128_early_resume(void *data)
>  		return;
>  	pci_restore_state(par->pdev);
>  	aty128_do_resume(par->pdev);
> -	console_unlock();
> +	fb_console_unlock();
>  }
>  #endif /* CONFIG_PPC_PMAC */
> 
> @@ -2461,7 +2460,7 @@ static int aty128_pci_suspend(struct pci_dev
> *pdev, pm_message_t state)
> 
>  	printk(KERN_DEBUG "aty128fb: suspending...\n");
>  	
> -	console_lock();
> +	fb_console_lock();
> 
>  	fb_set_suspend(info, 1);
> 
> @@ -2493,7 +2492,7 @@ static int aty128_pci_suspend(struct pci_dev
> *pdev, pm_message_t state)
>  	if (state.event != PM_EVENT_ON)
>  		aty128_set_suspend(par, 1);
> 
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	pdev->dev.power.power_state = state;
> 
> @@ -2550,9 +2549,9 @@ static int aty128_pci_resume(struct pci_dev *pdev)
>  {
>  	int rc;
> 
> -	console_lock();
> +	fb_console_lock();
>  	rc = aty128_do_resume(pdev);
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return rc;
>  }
> diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c
> index 3f2e8c1..9bb15ab 100644
> --- a/drivers/video/aty/atyfb_base.c
> +++ b/drivers/video/aty/atyfb_base.c
> @@ -58,7 +58,6 @@
>  #include <linux/slab.h>
>  #include <linux/vmalloc.h>
>  #include <linux/delay.h>
> -#include <linux/console.h>
>  #include <linux/fb.h>
>  #include <linux/init.h>
>  #include <linux/pci.h>
> @@ -2065,7 +2064,7 @@ static int atyfb_pci_suspend(struct pci_dev
> *pdev, pm_message_t state)
>  	if (state.event == pdev->dev.power.power_state.event)
>  		return 0;
> 
> -	console_lock();
> +	fb_console_lock();
> 
>  	fb_set_suspend(info, 1);
> 
> @@ -2093,14 +2092,14 @@ static int atyfb_pci_suspend(struct pci_dev
> *pdev, pm_message_t state)
>  		par->lock_blank = 0;
>  		atyfb_blank(FB_BLANK_UNBLANK, info);
>  		fb_set_suspend(info, 0);
> -		console_unlock();
> +		fb_console_unlock();
>  		return -EIO;
>  	}
>  #else
>  	pci_set_power_state(pdev, pci_choose_state(pdev, state));
>  #endif
> 
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	pdev->dev.power.power_state = state;
> 
> @@ -2129,7 +2128,7 @@ static int atyfb_pci_resume(struct pci_dev *pdev)
>  	if (pdev->dev.power.power_state.event == PM_EVENT_ON)
>  		return 0;
> 
> -	console_lock();
> +	fb_console_lock();
> 
>  	/*
>  	 * PCI state will have been restored by the core, so
> @@ -2157,7 +2156,7 @@ static int atyfb_pci_resume(struct pci_dev *pdev)
>  	par->lock_blank = 0;
>  	atyfb_blank(FB_BLANK_UNBLANK, info);
> 
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	pdev->dev.power.power_state = PMSG_ON;
> 
> diff --git a/drivers/video/aty/radeon_pm.c b/drivers/video/aty/radeon_pm.c
> index 92bda58..a2f07da 100644
> --- a/drivers/video/aty/radeon_pm.c
> +++ b/drivers/video/aty/radeon_pm.c
> @@ -16,7 +16,6 @@
> 
>  #include "radeonfb.h"
> 
> -#include <linux/console.h>
>  #include <linux/agp_backend.h>
> 
>  #ifdef CONFIG_PPC_PMAC
> @@ -2626,7 +2625,7 @@ int radeonfb_pci_suspend(struct pci_dev *pdev,
> pm_message_t mesg)
>  		goto done;
>  	}
> 
> -	console_lock();
> +	fb_console_lock();
> 
>  	fb_set_suspend(info, 1);
> 
> @@ -2690,7 +2689,7 @@ int radeonfb_pci_suspend(struct pci_dev *pdev,
> pm_message_t mesg)
>  	if (rinfo->pm_mode & radeon_pm_d2)
>  		radeon_set_suspend(rinfo, 1);
> 
> -	console_unlock();
> +	fb_console_unlock();
> 
>   done:
>  	pdev->dev.power.power_state = mesg;
> @@ -2718,7 +2717,7 @@ int radeonfb_pci_resume(struct pci_dev *pdev)
>  		if (!console_trylock())
>  			return 0;
>  	} else
> -		console_lock();
> +		fb_console_lock();
> 
>  	printk(KERN_DEBUG "radeonfb (%s): resuming from state: %d...\n",
>  	       pci_name(pdev), pdev->dev.power.power_state.event);
> @@ -2783,7 +2782,7 @@ int radeonfb_pci_resume(struct pci_dev *pdev)
>  	pdev->dev.power.power_state = PMSG_ON;
> 
>   bail:
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return rc;
>  }
> diff --git a/drivers/video/chipsfb.c b/drivers/video/chipsfb.c
> index cff742a..d50fa6b 100644
> --- a/drivers/video/chipsfb.c
> +++ b/drivers/video/chipsfb.c
> @@ -460,10 +460,10 @@ static int chipsfb_pci_suspend(struct pci_dev
> *pdev, pm_message_t state)
>  	if (!(state.event & PM_EVENT_SLEEP))
>  		goto done;
> 
> -	console_lock();
> +	fb_console_lock();
>  	chipsfb_blank(1, p);
>  	fb_set_suspend(p, 1);
> -	console_unlock();
> +	fb_console_unlock();
>   done:
>  	pdev->dev.power.power_state = state;
>  	return 0;
> @@ -473,10 +473,10 @@ static int chipsfb_pci_resume(struct pci_dev *pdev)
>  {
>          struct fb_info *p = pci_get_drvdata(pdev);
> 
> -	console_lock();
> +	fb_console_lock();
>  	fb_set_suspend(p, 0);
>  	chipsfb_blank(0, p);
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	pdev->dev.power.power_state = PMSG_ON;
>  	return 0;
> diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
> index 7ae9d53..9a36bbc 100644
> --- a/drivers/video/da8xx-fb.c
> +++ b/drivers/video/da8xx-fb.c
> @@ -29,7 +29,6 @@
>  #include <linux/interrupt.h>
>  #include <linux/clk.h>
>  #include <linux/cpufreq.h>
> -#include <linux/console.h>
>  #include <linux/spinlock.h>
>  #include <linux/slab.h>
>  #include <linux/delay.h>
> @@ -1406,14 +1405,14 @@ static int fb_suspend(struct platform_device
> *dev, pm_message_t state)
>  	struct fb_info *info = platform_get_drvdata(dev);
>  	struct da8xx_fb_par *par = info->par;
> 
> -	console_lock();
> +	fb_console_lock();
>  	if (par->panel_power_ctrl)
>  		par->panel_power_ctrl(0);
> 
>  	fb_set_suspend(info, 1);
>  	lcd_disable_raster();
>  	clk_disable(par->lcdc_clk);
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> @@ -1422,7 +1421,7 @@ static int fb_resume(struct platform_device *dev)
>  	struct fb_info *info = platform_get_drvdata(dev);
>  	struct da8xx_fb_par *par = info->par;
> 
> -	console_lock();
> +	fb_console_lock();
>  	clk_enable(par->lcdc_clk);
>  	lcd_enable_raster();
> 
> @@ -1430,7 +1429,7 @@ static int fb_resume(struct platform_device *dev)
>  		par->panel_power_ctrl(1);
> 
>  	fb_set_suspend(info, 0);
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> diff --git a/drivers/video/fb-puv3.c b/drivers/video/fb-puv3.c
> index 60a787f..87c8c4e 100644
> --- a/drivers/video/fb-puv3.c
> +++ b/drivers/video/fb-puv3.c
> @@ -17,7 +17,6 @@
>  #include <linux/clk.h>
>  #include <linux/fb.h>
>  #include <linux/init.h>
> -#include <linux/console.h>
> 
>  #include <asm/sizes.h>
>  #include <mach/hardware.h>
> @@ -759,7 +758,7 @@ static int unifb_resume(struct platform_device *dev)
>  	if (dev->dev.power.power_state.event == PM_EVENT_ON)
>  		return 0;
> 
> -	console_lock();
> +	fb_console_lock();
> 
>  	if (dev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
>  		writel(unifb_regs[0], UDE_FSA);
> @@ -775,7 +774,7 @@ static int unifb_resume(struct platform_device *dev)
>  	}
>  	dev->dev.power.power_state = PMSG_ON;
> 
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return rc;
>  }
> @@ -804,11 +803,11 @@ static int unifb_suspend(struct platform_device
> *dev, pm_message_t mesg)
>  		goto done;
>  	}
> 
> -	console_lock();
> +	fb_console_lock();
> 
>  	/* do nothing... */
> 
> -	console_unlock();
> +	fb_console_unlock();
> 
>  done:
>  	dev->dev.power.power_state = mesg;
> diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
> index 0dff12a..c2d4627 100644
> --- a/drivers/video/fbmem.c
> +++ b/drivers/video/fbmem.c
> @@ -85,6 +85,22 @@ EXPORT_SYMBOL(lock_fb_info);
>   * Helpers
>   */
> 
> +void fb_console_lock(void)
> +{
> +#ifdef CONFIG_FRAMEBUFFER_CONSOLE
> +	console_lock();
> +#endif
> +}
> +EXPORT_SYMBOL(fb_console_lock);
> +
> +void fb_console_unlock(void)
> +{
> +#ifdef CONFIG_FRAMEBUFFER_CONSOLE
> +	console_unlock();
> +#endif
> +}
> +EXPORT_SYMBOL(fb_console_unlock);
> +
>  int fb_get_color_depth(struct fb_var_screeninfo *var,
>  		       struct fb_fix_screeninfo *fix)
>  {
> @@ -1101,11 +1117,11 @@ static long do_fb_ioctl(struct fb_info *info,
> unsigned int cmd,
>  			return -EFAULT;
>  		if (!lock_fb_info(info))
>  			return -ENODEV;
> -		console_lock();
> +		fb_console_lock();
>  		info->flags |= FBINFO_MISC_USEREVENT;
>  		ret = fb_set_var(info, &var);
>  		info->flags &= ~FBINFO_MISC_USEREVENT;
> -		console_unlock();
> +		fb_console_unlock();
>  		unlock_fb_info(info);
>  		if (!ret && copy_to_user(argp, &var, sizeof(var)))
>  			ret = -EFAULT;
> @@ -1137,9 +1153,9 @@ static long do_fb_ioctl(struct fb_info *info,
> unsigned int cmd,
>  			return -EFAULT;
>  		if (!lock_fb_info(info))
>  			return -ENODEV;
> -		console_lock();
> +		fb_console_lock();
>  		ret = fb_pan_display(info, &var);
> -		console_unlock();
> +		fb_console_unlock();
>  		unlock_fb_info(info);
>  		if (ret == 0 && copy_to_user(argp, &var, sizeof(var)))
>  			return -EFAULT;
> @@ -1184,11 +1200,11 @@ static long do_fb_ioctl(struct fb_info *info,
> unsigned int cmd,
>  	case FBIOBLANK:
>  		if (!lock_fb_info(info))
>  			return -ENODEV;
> -		console_lock();
> +		fb_console_lock();
>  		info->flags |= FBINFO_MISC_USEREVENT;
>  		ret = fb_blank(info, arg);
>  		info->flags &= ~FBINFO_MISC_USEREVENT;
> -		console_unlock();
> +		fb_console_unlock();
>  		unlock_fb_info(info);
>  		break;
>  	default:
> diff --git a/drivers/video/fbsysfs.c b/drivers/video/fbsysfs.c
> index a55e366..976d8f5 100644
> --- a/drivers/video/fbsysfs.c
> +++ b/drivers/video/fbsysfs.c
> @@ -18,7 +18,6 @@
>  #include <linux/kernel.h>
>  #include <linux/slab.h>
>  #include <linux/fb.h>
> -#include <linux/console.h>
>  #include <linux/module.h>
> 
>  #define FB_SYSFS_FLAG_ATTR 1
> @@ -92,11 +91,11 @@ static int activate(struct fb_info *fb_info,
> struct fb_var_screeninfo *var)
>  	int err;
> 
>  	var->activate |= FB_ACTIVATE_FORCE;
> -	console_lock();
> +	fb_console_lock();
>  	fb_info->flags |= FBINFO_MISC_USEREVENT;
>  	err = fb_set_var(fb_info, var);
>  	fb_info->flags &= ~FBINFO_MISC_USEREVENT;
> -	console_unlock();
> +	fb_console_unlock();
>  	if (err)
>  		return err;
>  	return 0;
> @@ -177,7 +176,7 @@ static ssize_t store_modes(struct device *device,
>  	if (i * sizeof(struct fb_videomode) != count)
>  		return -EINVAL;
> 
> -	console_lock();
> +	fb_console_lock();
>  	list_splice(&fb_info->modelist, &old_list);
>  	fb_videomode_to_modelist((const struct fb_videomode *)buf, i,
>  				 &fb_info->modelist);
> @@ -187,7 +186,7 @@ static ssize_t store_modes(struct device *device,
>  	} else
>  		fb_destroy_modelist(&old_list);
> 
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> @@ -303,11 +302,11 @@ static ssize_t store_blank(struct device *device,
>  	char *last = NULL;
>  	int err;
> 
> -	console_lock();
> +	fb_console_lock();
>  	fb_info->flags |= FBINFO_MISC_USEREVENT;
>  	err = fb_blank(fb_info, simple_strtoul(buf, &last, 0));
>  	fb_info->flags &= ~FBINFO_MISC_USEREVENT;
> -	console_unlock();
> +	fb_console_unlock();
>  	if (err < 0)
>  		return err;
>  	return count;
> @@ -366,9 +365,9 @@ static ssize_t store_pan(struct device *device,
>  		return -EINVAL;
>  	var.yoffset = simple_strtoul(last, &last, 0);
> 
> -	console_lock();
> +	fb_console_lock();
>  	err = fb_pan_display(fb_info, &var);
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	if (err < 0)
>  		return err;
> @@ -403,9 +402,9 @@ static ssize_t store_fbstate(struct device *device,
> 
>  	if (!lock_fb_info(fb_info))
>  		return -ENODEV;
> -	console_lock();
> +	fb_console_lock();
>  	fb_set_suspend(fb_info, (int)state);
> -	console_unlock();
> +	fb_console_unlock();
>  	unlock_fb_info(fb_info);
> 
>  	return count;
> diff --git a/drivers/video/geode/gxfb_core.c b/drivers/video/geode/gxfb_core.c
> index b4f19db..ba7dd0a 100644
> --- a/drivers/video/geode/gxfb_core.c
> +++ b/drivers/video/geode/gxfb_core.c
> @@ -27,7 +27,6 @@
>  #include <linux/mm.h>
>  #include <linux/delay.h>
>  #include <linux/fb.h>
> -#include <linux/console.h>
>  #include <linux/suspend.h>
>  #include <linux/init.h>
>  #include <linux/pci.h>
> @@ -344,10 +343,10 @@ static int gxfb_suspend(struct pci_dev *pdev,
> pm_message_t state)
>  	struct fb_info *info = pci_get_drvdata(pdev);
> 
>  	if (state.event == PM_EVENT_SUSPEND) {
> -		console_lock();
> +		fb_console_lock();
>  		gx_powerdown(info);
>  		fb_set_suspend(info, 1);
> -		console_unlock();
> +		fb_console_unlock();
>  	}
> 
>  	/* there's no point in setting PCI states; we emulate PCI, so
> @@ -361,7 +360,7 @@ static int gxfb_resume(struct pci_dev *pdev)
>  	struct fb_info *info = pci_get_drvdata(pdev);
>  	int ret;
> 
> -	console_lock();
> +	fb_console_lock();
>  	ret = gx_powerup(info);
>  	if (ret) {
>  		printk(KERN_ERR "gxfb:  power up failed!\n");
> @@ -369,7 +368,7 @@ static int gxfb_resume(struct pci_dev *pdev)
>  	}
> 
>  	fb_set_suspend(info, 0);
> -	console_unlock();
> +	fb_console_unlock();
>  	return 0;
>  }
>  #endif
> diff --git a/drivers/video/geode/lxfb_core.c b/drivers/video/geode/lxfb_core.c
> index 416851c..5341bf1 100644
> --- a/drivers/video/geode/lxfb_core.c
> +++ b/drivers/video/geode/lxfb_core.c
> @@ -465,10 +465,10 @@ static int lxfb_suspend(struct pci_dev *pdev,
> pm_message_t state)
>  	struct fb_info *info = pci_get_drvdata(pdev);
> 
>  	if (state.event == PM_EVENT_SUSPEND) {
> -		console_lock();
> +		fb_console_lock();
>  		lx_powerdown(info);
>  		fb_set_suspend(info, 1);
> -		console_unlock();
> +		fb_console_unlock();
>  	}
> 
>  	/* there's no point in setting PCI states; we emulate PCI, so
> @@ -482,7 +482,7 @@ static int lxfb_resume(struct pci_dev *pdev)
>  	struct fb_info *info = pci_get_drvdata(pdev);
>  	int ret;
> 
> -	console_lock();
> +	fb_console_lock();
>  	ret = lx_powerup(info);
>  	if (ret) {
>  		printk(KERN_ERR "lxfb:  power up failed!\n");
> @@ -490,7 +490,7 @@ static int lxfb_resume(struct pci_dev *pdev)
>  	}
> 
>  	fb_set_suspend(info, 0);
> -	console_unlock();
> +	fb_console_unlock();
>  	return 0;
>  }
>  #else
> diff --git a/drivers/video/i740fb.c b/drivers/video/i740fb.c
> index ff3f880..b3fe538 100644
> --- a/drivers/video/i740fb.c
> +++ b/drivers/video/i740fb.c
> @@ -24,7 +24,6 @@
>  #include <linux/pci_ids.h>
>  #include <linux/i2c.h>
>  #include <linux/i2c-algo-bit.h>
> -#include <linux/console.h>
>  #include <video/vga.h>
> 
>  #ifdef CONFIG_MTRR
> @@ -1210,13 +1209,13 @@ static int i740fb_suspend(struct pci_dev *dev,
> pm_message_t state)
>  	if (state.event == PM_EVENT_FREEZE || state.event == PM_EVENT_PRETHAW)
>  		return 0;
> 
> -	console_lock();
> +	fb_console_lock();
>  	mutex_lock(&(par->open_lock));
> 
>  	/* do nothing if framebuffer is not active */
>  	if (par->ref_count == 0) {
>  		mutex_unlock(&(par->open_lock));
> -		console_unlock();
> +		fb_console_unlock();
>  		return 0;
>  	}
> 
> @@ -1227,7 +1226,7 @@ static int i740fb_suspend(struct pci_dev *dev,
> pm_message_t state)
>  	pci_set_power_state(dev, pci_choose_state(dev, state));
> 
>  	mutex_unlock(&(par->open_lock));
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> @@ -1237,7 +1236,7 @@ static int i740fb_resume(struct pci_dev *dev)
>  	struct fb_info *info = pci_get_drvdata(dev);
>  	struct i740fb_par *par = info->par;
> 
> -	console_lock();
> +	fb_console_lock();
>  	mutex_lock(&(par->open_lock));
> 
>  	if (par->ref_count == 0)
> @@ -1253,7 +1252,7 @@ static int i740fb_resume(struct pci_dev *dev)
> 
>  fail:
>  	mutex_unlock(&(par->open_lock));
> -	console_unlock();
> +	fb_console_unlock();
>  	return 0;
>  }
>  #else
> diff --git a/drivers/video/i810/i810_main.c b/drivers/video/i810/i810_main.c
> index b83f361..84fe1ed 100644
> --- a/drivers/video/i810/i810_main.c
> +++ b/drivers/video/i810/i810_main.c
> @@ -40,7 +40,6 @@
>  #include <linux/pci_ids.h>
>  #include <linux/resource.h>
>  #include <linux/unistd.h>
> -#include <linux/console.h>
> 
>  #include <asm/io.h>
>  #include <asm/div64.h>
> @@ -1574,7 +1573,7 @@ static int i810fb_suspend(struct pci_dev *dev,
> pm_message_t mesg)
>  		return 0;
>  	}
> 
> -	console_lock();
> +	fb_console_lock();
>  	fb_set_suspend(info, 1);
> 
>  	if (info->fbops->fb_sync)
> @@ -1587,7 +1586,7 @@ static int i810fb_suspend(struct pci_dev *dev,
> pm_message_t mesg)
>  	pci_save_state(dev);
>  	pci_disable_device(dev);
>  	pci_set_power_state(dev, pci_choose_state(dev, mesg));
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> @@ -1605,7 +1604,7 @@ static int i810fb_resume(struct pci_dev *dev)
>  		return 0;
>  	}
> 
> -	console_lock();
> +	fb_console_lock();
>  	pci_set_power_state(dev, PCI_D0);
>  	pci_restore_state(dev);
> 
> @@ -1621,7 +1620,7 @@ static int i810fb_resume(struct pci_dev *dev)
>  	fb_set_suspend (info, 0);
>  	info->fbops->fb_blank(VESA_NO_BLANKING, info);
>  fail:
> -	console_unlock();
> +	fb_console_unlock();
>  	return 0;
>  }
>  /***********************************************************************
> diff --git a/drivers/video/jz4740_fb.c b/drivers/video/jz4740_fb.c
> index de36693..7e9301a 100644
> --- a/drivers/video/jz4740_fb.c
> +++ b/drivers/video/jz4740_fb.c
> @@ -21,7 +21,6 @@
>  #include <linux/clk.h>
>  #include <linux/delay.h>
> 
> -#include <linux/console.h>
>  #include <linux/fb.h>
> 
>  #include <linux/dma-mapping.h>
> @@ -778,9 +777,9 @@ static int jzfb_suspend(struct device *dev)
>  {
>  	struct jzfb *jzfb = dev_get_drvdata(dev);
> 
> -	console_lock();
> +	fb_console_lock();
>  	fb_set_suspend(jzfb->fb, 1);
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	mutex_lock(&jzfb->lock);
>  	if (jzfb->is_enabled)
> @@ -800,9 +799,9 @@ static int jzfb_resume(struct device *dev)
>  		jzfb_enable(jzfb);
>  	mutex_unlock(&jzfb->lock);
> 
> -	console_lock();
> +	fb_console_lock();
>  	fb_set_suspend(jzfb->fb, 0);
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> diff --git a/drivers/video/mx3fb.c b/drivers/video/mx3fb.c
> index c89f8a8..da25fa1 100644
> --- a/drivers/video/mx3fb.c
> +++ b/drivers/video/mx3fb.c
> @@ -23,7 +23,6 @@
>  #include <linux/ioport.h>
>  #include <linux/dma-mapping.h>
>  #include <linux/dmaengine.h>
> -#include <linux/console.h>
>  #include <linux/clk.h>
>  #include <linux/mutex.h>
> 
> @@ -1204,9 +1203,9 @@ static int mx3fb_suspend(struct platform_device
> *pdev, pm_message_t state)
>  	struct mx3fb_data *mx3fb = platform_get_drvdata(pdev);
>  	struct mx3fb_info *mx3_fbi = mx3fb->fbi->par;
> 
> -	console_lock();
> +	fb_console_lock();
>  	fb_set_suspend(mx3fb->fbi, 1);
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	if (mx3_fbi->blank == FB_BLANK_UNBLANK) {
>  		sdc_disable_channel(mx3_fbi);
> @@ -1229,9 +1228,9 @@ static int mx3fb_resume(struct platform_device *pdev)
>  		sdc_set_brightness(mx3fb, mx3fb->backlight_level);
>  	}
> 
> -	console_lock();
> +	fb_console_lock();
>  	fb_set_suspend(mx3fb->fbi, 0);
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> diff --git a/drivers/video/nvidia/nvidia.c b/drivers/video/nvidia/nvidia.c
> index fe13ac5..f47eb2a 100644
> --- a/drivers/video/nvidia/nvidia.c
> +++ b/drivers/video/nvidia/nvidia.c
> @@ -19,7 +19,6 @@
>  #include <linux/fb.h>
>  #include <linux/init.h>
>  #include <linux/pci.h>
> -#include <linux/console.h>
>  #include <linux/backlight.h>
>  #ifdef CONFIG_MTRR
>  #include <asm/mtrr.h>
> @@ -1057,7 +1056,7 @@ static int nvidiafb_suspend(struct pci_dev *dev,
> pm_message_t mesg)
> 
>  	if (mesg.event == PM_EVENT_PRETHAW)
>  		mesg.event = PM_EVENT_FREEZE;
> -	console_lock();
> +	fb_console_lock();
>  	par->pm_state = mesg.event;
> 
>  	if (mesg.event & PM_EVENT_SLEEP) {
> @@ -1070,7 +1069,7 @@ static int nvidiafb_suspend(struct pci_dev *dev,
> pm_message_t mesg)
>  	}
>  	dev->dev.power.power_state = mesg;
> 
> -	console_unlock();
> +	fb_console_unlock();
>  	return 0;
>  }
> 
> @@ -1079,7 +1078,7 @@ static int nvidiafb_resume(struct pci_dev *dev)
>  	struct fb_info *info = pci_get_drvdata(dev);
>  	struct nvidia_par *par = info->par;
> 
> -	console_lock();
> +	fb_console_lock();
>  	pci_set_power_state(dev, PCI_D0);
> 
>  	if (par->pm_state != PM_EVENT_FREEZE) {
> @@ -1097,7 +1096,7 @@ static int nvidiafb_resume(struct pci_dev *dev)
>  	nvidiafb_blank(FB_BLANK_UNBLANK, info);
> 
>  fail:
> -	console_unlock();
> +	fb_console_unlock();
>  	return 0;
>  }
>  #else
> diff --git a/drivers/video/ps3fb.c b/drivers/video/ps3fb.c
> index 213fbbc..cb2e174 100644
> --- a/drivers/video/ps3fb.c
> +++ b/drivers/video/ps3fb.c
> @@ -23,7 +23,6 @@
>  #include <linux/string.h>
>  #include <linux/mm.h>
>  #include <linux/interrupt.h>
> -#include <linux/console.h>
>  #include <linux/ioctl.h>
>  #include <linux/kthread.h>
>  #include <linux/freezer.h>
> @@ -515,7 +514,7 @@ static int ps3fb_release(struct fb_info *info, int user)
>  			atomic_set(&ps3fb.ext_flip, 0);
>  			if (console_trylock()) {
>  				ps3fb_sync(info, 0);	/* single buffer */
> -				console_unlock();
> +				fb_console_unlock();
>  			}
>  		}
>  	}
> @@ -830,14 +829,14 @@ static int ps3fb_ioctl(struct fb_info *info,
> unsigned int cmd,
>  			if (vmode) {
>  				var = info->var;
>  				fb_videomode_to_var(&var, vmode);
> -				console_lock();
> +				fb_console_lock();
>  				info->flags |= FBINFO_MISC_USEREVENT;
>  				/* Force, in case only special bits changed */
>  				var.activate |= FB_ACTIVATE_FORCE;
>  				par->new_mode_id = val;
>  				retval = fb_set_var(info, &var);
>  				info->flags &= ~FBINFO_MISC_USEREVENT;
> -				console_unlock();
> +				fb_console_unlock();
>  			}
>  			break;
>  		}
> @@ -881,9 +880,9 @@ static int ps3fb_ioctl(struct fb_info *info,
> unsigned int cmd,
>  			break;
> 
>  		dev_dbg(info->device, "PS3FB_IOCTL_FSEL:%d\n", val);
> -		console_lock();
> +		fb_console_lock();
>  		retval = ps3fb_sync(info, val);
> -		console_unlock();
> +		fb_console_unlock();
>  		break;
> 
>  	default:
> @@ -903,9 +902,9 @@ static int ps3fbd(void *arg)
>  		set_current_state(TASK_INTERRUPTIBLE);
>  		if (ps3fb.is_kicked) {
>  			ps3fb.is_kicked = 0;
> -			console_lock();
> +			fb_console_lock();
>  			ps3fb_sync(info, 0);	/* single buffer */
> -			console_unlock();
> +			fb_console_unlock();
>  		}
>  		schedule();
>  	}
> diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c
> index 3f90255..a1af212 100644
> --- a/drivers/video/pxafb.c
> +++ b/drivers/video/pxafb.c
> @@ -54,7 +54,6 @@
>  #include <linux/mutex.h>
>  #include <linux/kthread.h>
>  #include <linux/freezer.h>
> -#include <linux/console.h>
> 
>  #include <mach/hardware.h>
>  #include <asm/io.h>
> @@ -733,9 +732,9 @@ static int overlayfb_open(struct fb_info *info, int user)
> 
>  	if (ofb->usage++ == 0) {
>  		/* unblank the base framebuffer */
> -		console_lock();
> +		fb_console_lock();
>  		fb_blank(&ofb->fbi->fb, FB_BLANK_UNBLANK);
> -		console_unlock();
> +		fb_console_unlock();
>  	}
> 
>  	return 0;
> diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c
> index 1d00736..7759c82 100644
> --- a/drivers/video/s3fb.c
> +++ b/drivers/video/s3fb.c
> @@ -22,7 +22,6 @@
>  #include <linux/svga.h>
>  #include <linux/init.h>
>  #include <linux/pci.h>
> -#include <linux/console.h> /* Why should fb driver call console
> functions? because console_lock() */
>  #include <video/vga.h>
> 
>  #include <linux/i2c.h>
> @@ -1445,12 +1444,12 @@ static int s3_pci_suspend(struct pci_dev* dev,
> pm_message_t state)
> 
>  	dev_info(info->device, "suspend\n");
> 
> -	console_lock();
> +	fb_fb_console_lock();
>  	mutex_lock(&(par->open_lock));
> 
>  	if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
>  		mutex_unlock(&(par->open_lock));
> -		console_unlock();
> +		fb_console_unlock();
>  		return 0;
>  	}
> 
> @@ -1461,7 +1460,7 @@ static int s3_pci_suspend(struct pci_dev* dev,
> pm_message_t state)
>  	pci_set_power_state(dev, pci_choose_state(dev, state));
> 
>  	mutex_unlock(&(par->open_lock));
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> @@ -1477,12 +1476,12 @@ static int s3_pci_resume(struct pci_dev* dev)
> 
>  	dev_info(info->device, "resume\n");
> 
> -	console_lock();
> +	fb_fb_console_lock();
>  	mutex_lock(&(par->open_lock));
> 
>  	if (par->ref_count == 0) {
>  		mutex_unlock(&(par->open_lock));
> -		console_unlock();
> +		fb_console_unlock();
>  		return 0;
>  	}
> 
> @@ -1491,7 +1490,7 @@ static int s3_pci_resume(struct pci_dev* dev)
>  	err = pci_enable_device(dev);
>  	if (err) {
>  		mutex_unlock(&(par->open_lock));
> -		console_unlock();
> +		fb_console_unlock();
>  		dev_err(info->device, "error %d enabling device for resume\n", err);
>  		return err;
>  	}
> @@ -1501,7 +1500,7 @@ static int s3_pci_resume(struct pci_dev* dev)
>  	fb_set_suspend(info, 0);
> 
>  	mutex_unlock(&(par->open_lock));
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> diff --git a/drivers/video/savage/savagefb_driver.c
> b/drivers/video/savage/savagefb_driver.c
> index 0d0f52c..bf64221 100644
> --- a/drivers/video/savage/savagefb_driver.c
> +++ b/drivers/video/savage/savagefb_driver.c
> @@ -51,7 +51,6 @@
>  #include <linux/fb.h>
>  #include <linux/pci.h>
>  #include <linux/init.h>
> -#include <linux/console.h>
> 
>  #include <asm/io.h>
>  #include <asm/irq.h>
> @@ -2391,7 +2390,7 @@ static int savagefb_suspend(struct pci_dev *dev,
> pm_message_t mesg)
>  	if (mesg.event == PM_EVENT_FREEZE)
>  		return 0;
> 
> -	console_lock();
> +	fb_console_lock();
>  	fb_set_suspend(info, 1);
> 
>  	if (info->fbops->fb_sync)
> @@ -2403,7 +2402,7 @@ static int savagefb_suspend(struct pci_dev *dev,
> pm_message_t mesg)
>  	pci_save_state(dev);
>  	pci_disable_device(dev);
>  	pci_set_power_state(dev, pci_choose_state(dev, mesg));
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> @@ -2427,7 +2426,7 @@ static int savagefb_resume(struct pci_dev* dev)
>  		return 0;
>  	}
> 
> -	console_lock();
> +	fb_console_lock();
> 
>  	pci_set_power_state(dev, PCI_D0);
>  	pci_restore_state(dev);
> @@ -2441,7 +2440,7 @@ static int savagefb_resume(struct pci_dev* dev)
>  	savagefb_set_par(info);
>  	fb_set_suspend(info, 0);
>  	savagefb_blank(FB_BLANK_UNBLANK, info);
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c
> index 699487c..2bc1119 100644
> --- a/drivers/video/sh_mobile_lcdcfb.c
> +++ b/drivers/video/sh_mobile_lcdcfb.c
> @@ -11,7 +11,6 @@
>  #include <linux/atomic.h>
>  #include <linux/backlight.h>
>  #include <linux/clk.h>
> -#include <linux/console.h>
>  #include <linux/ctype.h>
>  #include <linux/dma-mapping.h>
>  #include <linux/delay.h>
> @@ -575,7 +574,7 @@ static int sh_mobile_lcdc_display_notify(struct
> sh_mobile_lcdc_chan *ch,
>  	case SH_MOBILE_LCDC_EVENT_DISPLAY_CONNECT:
>  		/* HDMI plug in */
>  		if (lock_fb_info(info)) {
> -			console_lock();
> +			fb_console_lock();
> 
>  			ch->display.width = monspec->max_x * 10;
>  			ch->display.height = monspec->max_y * 10;
> @@ -594,7 +593,7 @@ static int sh_mobile_lcdc_display_notify(struct
> sh_mobile_lcdc_chan *ch,
>  				fb_set_suspend(info, 0);
>  			}
> 
> -			console_unlock();
> +			fb_console_unlock();
>  			unlock_fb_info(info);
>  		}
>  		break;
> @@ -602,9 +601,9 @@ static int sh_mobile_lcdc_display_notify(struct
> sh_mobile_lcdc_chan *ch,
>  	case SH_MOBILE_LCDC_EVENT_DISPLAY_DISCONNECT:
>  		/* HDMI disconnect */
>  		if (lock_fb_info(info)) {
> -			console_lock();
> +			fb_console_lock();
>  			fb_set_suspend(info, 1);
> -			console_unlock();
> +			fb_console_unlock();
>  			unlock_fb_info(info);
>  		}
>  		break;
> @@ -1934,9 +1933,9 @@ static int sh_mobile_lcdc_release(struct fb_info
> *info, int user)
> 
>  	/* Nothing to reconfigure, when called from fbcon */
>  	if (user) {
> -		console_lock();
> +		fb_console_lock();
>  		sh_mobile_fb_reconfig(info);
> -		console_unlock();
> +		fb_console_unlock();
>  	}
> 
>  	mutex_unlock(&ch->open_lock);
> diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
> index 3690eff..536f922 100644
> --- a/drivers/video/sm501fb.c
> +++ b/drivers/video/sm501fb.c
> @@ -28,7 +28,6 @@
>  #include <linux/wait.h>
>  #include <linux/platform_device.h>
>  #include <linux/clk.h>
> -#include <linux/console.h>
>  #include <linux/io.h>
> 
>  #include <asm/uaccess.h>
> @@ -2104,9 +2103,9 @@ static int sm501fb_suspend_fb(struct sm501fb_info *info,
> 
>  	/* tell console/fb driver we are suspending */
> 
> -	console_lock();
> +	fb_console_lock();
>  	fb_set_suspend(fbi, 1);
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	/* backup copies in case chip is powered down over suspend */
> 
> @@ -2163,9 +2162,9 @@ static void sm501fb_resume_fb(struct sm501fb_info *info,
>  		memcpy_toio(par->cursor.k_addr, par->store_cursor,
>  			    par->cursor.size);
> 
> -	console_lock();
> +	fb_console_lock();
>  	fb_set_suspend(fbi, 0);
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	vfree(par->store_fb);
>  	vfree(par->store_cursor);
> diff --git a/drivers/video/tmiofb.c b/drivers/video/tmiofb.c
> index 8e4a446..e266b6b 100644
> --- a/drivers/video/tmiofb.c
> +++ b/drivers/video/tmiofb.c
> @@ -25,8 +25,7 @@
>  #include <linux/fb.h>
>  #include <linux/interrupt.h>
>  #include <linux/delay.h>
> -/* Why should fb driver call console functions? because console_lock() */
> -#include <linux/console.h>
> +/* Why should fb driver call console functions? because fb_console_lock() */
>  #include <linux/mfd/core.h>
>  #include <linux/mfd/tmio.h>
>  #include <linux/uaccess.h>
> @@ -938,7 +937,7 @@ static int tmiofb_suspend(struct platform_device
> *dev, pm_message_t state)
>  	const struct mfd_cell *cell = mfd_get_cell(dev);
>  	int retval = 0;
> 
> -	console_lock();
> +	fb_console_lock();
> 
>  	fb_set_suspend(info, 1);
> 
> @@ -959,7 +958,7 @@ static int tmiofb_suspend(struct platform_device
> *dev, pm_message_t state)
>  	if (cell->suspend)
>  		retval = cell->suspend(dev);
> 
> -	console_unlock();
> +	fb_fb_console_unlock();
> 
>  	return retval;
>  }
> @@ -970,7 +969,7 @@ static int tmiofb_resume(struct platform_device *dev)
>  	const struct mfd_cell *cell = mfd_get_cell(dev);
>  	int retval = 0;
> 
> -	console_lock();
> +	fb_console_lock();
> 
>  	if (cell->resume) {
>  		retval = cell->resume(dev);
> @@ -986,7 +985,7 @@ static int tmiofb_resume(struct platform_device *dev)
> 
>  	fb_set_suspend(info, 0);
>  out:
> -	console_unlock();
> +	fb_fb_console_unlock();
>  	return retval;
>  }
>  #else
> diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c
> index c80e770..d36b173 100644
> --- a/drivers/video/via/viafbdev.c
> +++ b/drivers/video/via/viafbdev.c
> @@ -1698,17 +1698,17 @@ static int parse_mode(const char *str, u32
> devices, u32 *xres, u32 *yres)
>  #ifdef CONFIG_PM
>  static int viafb_suspend(void *unused)
>  {
> -	console_lock();
> +	fb_console_lock();
>  	fb_set_suspend(viafbinfo, 1);
>  	viafb_sync(viafbinfo);
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> 
>  static int viafb_resume(void *unused)
>  {
> -	console_lock();
> +	fb_console_lock();
>  	if (viaparinfo->shared->vdev->engine_mmio)
>  		viafb_reset_engine(viaparinfo);
>  	viafb_set_par(viafbinfo);
> @@ -1716,7 +1716,7 @@ static int viafb_resume(void *unused)
>  		viafb_set_par(viafbinfo1);
>  	fb_set_suspend(viafbinfo, 0);
> 
> -	console_unlock();
> +	fb_console_unlock();
>  	return 0;
>  }
> 
> diff --git a/drivers/video/vt8623fb.c b/drivers/video/vt8623fb.c
> index 4e74d26..cb48d4d 100644
> --- a/drivers/video/vt8623fb.c
> +++ b/drivers/video/vt8623fb.c
> @@ -23,7 +23,6 @@
>  #include <linux/svga.h>
>  #include <linux/init.h>
>  #include <linux/pci.h>
> -#include <linux/console.h> /* Why should fb driver call console
> functions? because console_lock() */
>  #include <video/vga.h>
> 
>  #ifdef CONFIG_MTRR
> @@ -845,12 +844,12 @@ static int vt8623_pci_suspend(struct pci_dev*
> dev, pm_message_t state)
> 
>  	dev_info(info->device, "suspend\n");
> 
> -	console_lock();
> +	fb_console_lock();
>  	mutex_lock(&(par->open_lock));
> 
>  	if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
>  		mutex_unlock(&(par->open_lock));
> -		console_unlock();
> +		fb_console_unlock();
>  		return 0;
>  	}
> 
> @@ -861,7 +860,7 @@ static int vt8623_pci_suspend(struct pci_dev* dev,
> pm_message_t state)
>  	pci_set_power_state(dev, pci_choose_state(dev, state));
> 
>  	mutex_unlock(&(par->open_lock));
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> @@ -876,7 +875,7 @@ static int vt8623_pci_resume(struct pci_dev* dev)
> 
>  	dev_info(info->device, "resume\n");
> 
> -	console_lock();
> +	fb_console_lock();
>  	mutex_lock(&(par->open_lock));
> 
>  	if (par->ref_count == 0)
> @@ -895,7 +894,7 @@ static int vt8623_pci_resume(struct pci_dev* dev)
> 
>  fail:
>  	mutex_unlock(&(par->open_lock));
> -	console_unlock();
> +	fb_console_unlock();
> 
>  	return 0;
>  }
> diff --git a/drivers/video/xen-fbfront.c b/drivers/video/xen-fbfront.c
> index b7f5173..770397e7 100644
> --- a/drivers/video/xen-fbfront.c
> +++ b/drivers/video/xen-fbfront.c
> @@ -18,7 +18,6 @@
>   * frame buffer.
>   */
> 
> -#include <linux/console.h>
>  #include <linux/kernel.h>
>  #include <linux/errno.h>
>  #include <linux/fb.h>
> @@ -495,12 +494,12 @@ xenfb_make_preferred_console(void)
>  	if (console_set_on_cmdline)
>  		return;
> 
> -	console_lock();
> +	fb_console_lock();
>  	for_each_console(c) {
>  		if (!strcmp(c->name, "tty") && c->index == 0)
>  			break;
>  	}
> -	console_unlock();
> +	fb_console_unlock();
>  	if (c) {
>  		unregister_console(c);
>  		c->flags |= CON_CONSDEV;
> diff --git a/include/linux/fb.h b/include/linux/fb.h
> index ac3f1c6..7ae96ad 100644
> --- a/include/linux/fb.h
> +++ b/include/linux/fb.h
> @@ -1021,6 +1021,8 @@ extern int fb_get_color_depth(struct
> fb_var_screeninfo *var,
>  			      struct fb_fix_screeninfo *fix);
>  extern int fb_get_options(char *name, char **option);
>  extern int fb_new_modelist(struct fb_info *info);
> +extern void fb_console_unlock(void);
> +extern void fb_console_lock(void);
> 
>  extern struct fb_info *registered_fb[FB_MAX];
>  extern int num_registered_fb;


--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jun Nie Sept. 29, 2012, 6:03 a.m. UTC | #2
2012/9/29 Benjamin Herrenschmidt <benh@kernel.crashing.org>:
> On Sat, 2012-09-29 at 13:29 +0800, Jun Nie wrote:
>> If VGA console is not enable, we do not have to
>> involve console lock/unlock in FB framework to avoid
>> hold the lock unnecessarily. Otherwise, UART console
>> output may be blocked by FB pan_display etc operations,
>> which hold the console lock. This may block the
>> panic log out on UART, where the lock may never be
>> released by FB.
>
> And you end up removing all locking from the entire fbdev layer ... did
> you actually think about what you were doing here ?
>
> Ben.
>
Hi Ben,
    Yes. If framebuffer console is disabled, I do not see any need to
hold console lock in FB. Please help indicate the risk if any. Thanks!

Jun
>> Signed-off-by: Jun Nie <njun@marvell.com>
>> ---
>>  drivers/video/arkfb.c                  |   11 +++++------
>>  drivers/video/aty/aty128fb.c           |   11 +++++------
>>  drivers/video/aty/atyfb_base.c         |   11 +++++------
>>  drivers/video/aty/radeon_pm.c          |    9 ++++-----
>>  drivers/video/chipsfb.c                |    8 ++++----
>>  drivers/video/da8xx-fb.c               |    9 ++++-----
>>  drivers/video/fb-puv3.c                |    9 ++++-----
>>  drivers/video/fbmem.c                  |   28 ++++++++++++++++++++++------
>>  drivers/video/fbsysfs.c                |   21 ++++++++++-----------
>>  drivers/video/geode/gxfb_core.c        |    9 ++++-----
>>  drivers/video/geode/lxfb_core.c        |    8 ++++----
>>  drivers/video/i740fb.c                 |   11 +++++------
>>  drivers/video/i810/i810_main.c         |    9 ++++-----
>>  drivers/video/jz4740_fb.c              |    9 ++++-----
>>  drivers/video/mx3fb.c                  |    9 ++++-----
>>  drivers/video/nvidia/nvidia.c          |    9 ++++-----
>>  drivers/video/ps3fb.c                  |   15 +++++++--------
>>  drivers/video/pxafb.c                  |    5 ++---
>>  drivers/video/s3fb.c                   |   15 +++++++--------
>>  drivers/video/savage/savagefb_driver.c |    9 ++++-----
>>  drivers/video/sh_mobile_lcdcfb.c       |   13 ++++++-------
>>  drivers/video/sm501fb.c                |    9 ++++-----
>>  drivers/video/tmiofb.c                 |   11 +++++------
>>  drivers/video/via/viafbdev.c           |    8 ++++----
>>  drivers/video/vt8623fb.c               |   11 +++++------
>>  drivers/video/xen-fbfront.c            |    5 ++---
>>  include/linux/fb.h                     |    2 ++
>>  27 files changed, 140 insertions(+), 144 deletions(-)
>>
>> diff --git a/drivers/video/arkfb.c b/drivers/video/arkfb.c
>> index 555dd4c..774d902 100644
>> --- a/drivers/video/arkfb.c
>> +++ b/drivers/video/arkfb.c
>> @@ -23,7 +23,6 @@
>>  #include <linux/svga.h>
>>  #include <linux/init.h>
>>  #include <linux/pci.h>
>> -#include <linux/console.h> /* Why should fb driver call console
>> functions? because console_lock() */
>>  #include <video/vga.h>
>>
>>  #ifdef CONFIG_MTRR
>> @@ -1124,12 +1123,12 @@ static int ark_pci_suspend (struct pci_dev*
>> dev, pm_message_t state)
>>
>>       dev_info(info->device, "suspend\n");
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       mutex_lock(&(par->open_lock));
>>
>>       if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
>>               mutex_unlock(&(par->open_lock));
>> -             console_unlock();
>> +             fb_console_unlock();
>>               return 0;
>>       }
>>
>> @@ -1140,7 +1139,7 @@ static int ark_pci_suspend (struct pci_dev* dev,
>> pm_message_t state)
>>       pci_set_power_state(dev, pci_choose_state(dev, state));
>>
>>       mutex_unlock(&(par->open_lock));
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> @@ -1155,7 +1154,7 @@ static int ark_pci_resume (struct pci_dev* dev)
>>
>>       dev_info(info->device, "resume\n");
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       mutex_lock(&(par->open_lock));
>>
>>       if (par->ref_count == 0)
>> @@ -1174,7 +1173,7 @@ static int ark_pci_resume (struct pci_dev* dev)
>>
>>  fail:
>>       mutex_unlock(&(par->open_lock));
>> -     console_unlock();
>> +     fb_console_unlock();
>>       return 0;
>>  }
>>  #else
>> diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c
>> index 747442d..1c6b80b 100644
>> --- a/drivers/video/aty/aty128fb.c
>> +++ b/drivers/video/aty/aty128fb.c
>> @@ -60,7 +60,6 @@
>>  #include <linux/init.h>
>>  #include <linux/pci.h>
>>  #include <linux/ioport.h>
>> -#include <linux/console.h>
>>  #include <linux/backlight.h>
>>  #include <asm/io.h>
>>
>> @@ -1884,7 +1883,7 @@ static void aty128_early_resume(void *data)
>>               return;
>>       pci_restore_state(par->pdev);
>>       aty128_do_resume(par->pdev);
>> -     console_unlock();
>> +     fb_console_unlock();
>>  }
>>  #endif /* CONFIG_PPC_PMAC */
>>
>> @@ -2461,7 +2460,7 @@ static int aty128_pci_suspend(struct pci_dev
>> *pdev, pm_message_t state)
>>
>>       printk(KERN_DEBUG "aty128fb: suspending...\n");
>>
>> -     console_lock();
>> +     fb_console_lock();
>>
>>       fb_set_suspend(info, 1);
>>
>> @@ -2493,7 +2492,7 @@ static int aty128_pci_suspend(struct pci_dev
>> *pdev, pm_message_t state)
>>       if (state.event != PM_EVENT_ON)
>>               aty128_set_suspend(par, 1);
>>
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       pdev->dev.power.power_state = state;
>>
>> @@ -2550,9 +2549,9 @@ static int aty128_pci_resume(struct pci_dev *pdev)
>>  {
>>       int rc;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       rc = aty128_do_resume(pdev);
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return rc;
>>  }
>> diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c
>> index 3f2e8c1..9bb15ab 100644
>> --- a/drivers/video/aty/atyfb_base.c
>> +++ b/drivers/video/aty/atyfb_base.c
>> @@ -58,7 +58,6 @@
>>  #include <linux/slab.h>
>>  #include <linux/vmalloc.h>
>>  #include <linux/delay.h>
>> -#include <linux/console.h>
>>  #include <linux/fb.h>
>>  #include <linux/init.h>
>>  #include <linux/pci.h>
>> @@ -2065,7 +2064,7 @@ static int atyfb_pci_suspend(struct pci_dev
>> *pdev, pm_message_t state)
>>       if (state.event == pdev->dev.power.power_state.event)
>>               return 0;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>
>>       fb_set_suspend(info, 1);
>>
>> @@ -2093,14 +2092,14 @@ static int atyfb_pci_suspend(struct pci_dev
>> *pdev, pm_message_t state)
>>               par->lock_blank = 0;
>>               atyfb_blank(FB_BLANK_UNBLANK, info);
>>               fb_set_suspend(info, 0);
>> -             console_unlock();
>> +             fb_console_unlock();
>>               return -EIO;
>>       }
>>  #else
>>       pci_set_power_state(pdev, pci_choose_state(pdev, state));
>>  #endif
>>
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       pdev->dev.power.power_state = state;
>>
>> @@ -2129,7 +2128,7 @@ static int atyfb_pci_resume(struct pci_dev *pdev)
>>       if (pdev->dev.power.power_state.event == PM_EVENT_ON)
>>               return 0;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>
>>       /*
>>        * PCI state will have been restored by the core, so
>> @@ -2157,7 +2156,7 @@ static int atyfb_pci_resume(struct pci_dev *pdev)
>>       par->lock_blank = 0;
>>       atyfb_blank(FB_BLANK_UNBLANK, info);
>>
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       pdev->dev.power.power_state = PMSG_ON;
>>
>> diff --git a/drivers/video/aty/radeon_pm.c b/drivers/video/aty/radeon_pm.c
>> index 92bda58..a2f07da 100644
>> --- a/drivers/video/aty/radeon_pm.c
>> +++ b/drivers/video/aty/radeon_pm.c
>> @@ -16,7 +16,6 @@
>>
>>  #include "radeonfb.h"
>>
>> -#include <linux/console.h>
>>  #include <linux/agp_backend.h>
>>
>>  #ifdef CONFIG_PPC_PMAC
>> @@ -2626,7 +2625,7 @@ int radeonfb_pci_suspend(struct pci_dev *pdev,
>> pm_message_t mesg)
>>               goto done;
>>       }
>>
>> -     console_lock();
>> +     fb_console_lock();
>>
>>       fb_set_suspend(info, 1);
>>
>> @@ -2690,7 +2689,7 @@ int radeonfb_pci_suspend(struct pci_dev *pdev,
>> pm_message_t mesg)
>>       if (rinfo->pm_mode & radeon_pm_d2)
>>               radeon_set_suspend(rinfo, 1);
>>
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>   done:
>>       pdev->dev.power.power_state = mesg;
>> @@ -2718,7 +2717,7 @@ int radeonfb_pci_resume(struct pci_dev *pdev)
>>               if (!console_trylock())
>>                       return 0;
>>       } else
>> -             console_lock();
>> +             fb_console_lock();
>>
>>       printk(KERN_DEBUG "radeonfb (%s): resuming from state: %d...\n",
>>              pci_name(pdev), pdev->dev.power.power_state.event);
>> @@ -2783,7 +2782,7 @@ int radeonfb_pci_resume(struct pci_dev *pdev)
>>       pdev->dev.power.power_state = PMSG_ON;
>>
>>   bail:
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return rc;
>>  }
>> diff --git a/drivers/video/chipsfb.c b/drivers/video/chipsfb.c
>> index cff742a..d50fa6b 100644
>> --- a/drivers/video/chipsfb.c
>> +++ b/drivers/video/chipsfb.c
>> @@ -460,10 +460,10 @@ static int chipsfb_pci_suspend(struct pci_dev
>> *pdev, pm_message_t state)
>>       if (!(state.event & PM_EVENT_SLEEP))
>>               goto done;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       chipsfb_blank(1, p);
>>       fb_set_suspend(p, 1);
>> -     console_unlock();
>> +     fb_console_unlock();
>>   done:
>>       pdev->dev.power.power_state = state;
>>       return 0;
>> @@ -473,10 +473,10 @@ static int chipsfb_pci_resume(struct pci_dev *pdev)
>>  {
>>          struct fb_info *p = pci_get_drvdata(pdev);
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       fb_set_suspend(p, 0);
>>       chipsfb_blank(0, p);
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       pdev->dev.power.power_state = PMSG_ON;
>>       return 0;
>> diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
>> index 7ae9d53..9a36bbc 100644
>> --- a/drivers/video/da8xx-fb.c
>> +++ b/drivers/video/da8xx-fb.c
>> @@ -29,7 +29,6 @@
>>  #include <linux/interrupt.h>
>>  #include <linux/clk.h>
>>  #include <linux/cpufreq.h>
>> -#include <linux/console.h>
>>  #include <linux/spinlock.h>
>>  #include <linux/slab.h>
>>  #include <linux/delay.h>
>> @@ -1406,14 +1405,14 @@ static int fb_suspend(struct platform_device
>> *dev, pm_message_t state)
>>       struct fb_info *info = platform_get_drvdata(dev);
>>       struct da8xx_fb_par *par = info->par;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       if (par->panel_power_ctrl)
>>               par->panel_power_ctrl(0);
>>
>>       fb_set_suspend(info, 1);
>>       lcd_disable_raster();
>>       clk_disable(par->lcdc_clk);
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> @@ -1422,7 +1421,7 @@ static int fb_resume(struct platform_device *dev)
>>       struct fb_info *info = platform_get_drvdata(dev);
>>       struct da8xx_fb_par *par = info->par;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       clk_enable(par->lcdc_clk);
>>       lcd_enable_raster();
>>
>> @@ -1430,7 +1429,7 @@ static int fb_resume(struct platform_device *dev)
>>               par->panel_power_ctrl(1);
>>
>>       fb_set_suspend(info, 0);
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> diff --git a/drivers/video/fb-puv3.c b/drivers/video/fb-puv3.c
>> index 60a787f..87c8c4e 100644
>> --- a/drivers/video/fb-puv3.c
>> +++ b/drivers/video/fb-puv3.c
>> @@ -17,7 +17,6 @@
>>  #include <linux/clk.h>
>>  #include <linux/fb.h>
>>  #include <linux/init.h>
>> -#include <linux/console.h>
>>
>>  #include <asm/sizes.h>
>>  #include <mach/hardware.h>
>> @@ -759,7 +758,7 @@ static int unifb_resume(struct platform_device *dev)
>>       if (dev->dev.power.power_state.event == PM_EVENT_ON)
>>               return 0;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>
>>       if (dev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
>>               writel(unifb_regs[0], UDE_FSA);
>> @@ -775,7 +774,7 @@ static int unifb_resume(struct platform_device *dev)
>>       }
>>       dev->dev.power.power_state = PMSG_ON;
>>
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return rc;
>>  }
>> @@ -804,11 +803,11 @@ static int unifb_suspend(struct platform_device
>> *dev, pm_message_t mesg)
>>               goto done;
>>       }
>>
>> -     console_lock();
>> +     fb_console_lock();
>>
>>       /* do nothing... */
>>
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>  done:
>>       dev->dev.power.power_state = mesg;
>> diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
>> index 0dff12a..c2d4627 100644
>> --- a/drivers/video/fbmem.c
>> +++ b/drivers/video/fbmem.c
>> @@ -85,6 +85,22 @@ EXPORT_SYMBOL(lock_fb_info);
>>   * Helpers
>>   */
>>
>> +void fb_console_lock(void)
>> +{
>> +#ifdef CONFIG_FRAMEBUFFER_CONSOLE
>> +     console_lock();
>> +#endif
>> +}
>> +EXPORT_SYMBOL(fb_console_lock);
>> +
>> +void fb_console_unlock(void)
>> +{
>> +#ifdef CONFIG_FRAMEBUFFER_CONSOLE
>> +     console_unlock();
>> +#endif
>> +}
>> +EXPORT_SYMBOL(fb_console_unlock);
>> +
>>  int fb_get_color_depth(struct fb_var_screeninfo *var,
>>                      struct fb_fix_screeninfo *fix)
>>  {
>> @@ -1101,11 +1117,11 @@ static long do_fb_ioctl(struct fb_info *info,
>> unsigned int cmd,
>>                       return -EFAULT;
>>               if (!lock_fb_info(info))
>>                       return -ENODEV;
>> -             console_lock();
>> +             fb_console_lock();
>>               info->flags |= FBINFO_MISC_USEREVENT;
>>               ret = fb_set_var(info, &var);
>>               info->flags &= ~FBINFO_MISC_USEREVENT;
>> -             console_unlock();
>> +             fb_console_unlock();
>>               unlock_fb_info(info);
>>               if (!ret && copy_to_user(argp, &var, sizeof(var)))
>>                       ret = -EFAULT;
>> @@ -1137,9 +1153,9 @@ static long do_fb_ioctl(struct fb_info *info,
>> unsigned int cmd,
>>                       return -EFAULT;
>>               if (!lock_fb_info(info))
>>                       return -ENODEV;
>> -             console_lock();
>> +             fb_console_lock();
>>               ret = fb_pan_display(info, &var);
>> -             console_unlock();
>> +             fb_console_unlock();
>>               unlock_fb_info(info);
>>               if (ret == 0 && copy_to_user(argp, &var, sizeof(var)))
>>                       return -EFAULT;
>> @@ -1184,11 +1200,11 @@ static long do_fb_ioctl(struct fb_info *info,
>> unsigned int cmd,
>>       case FBIOBLANK:
>>               if (!lock_fb_info(info))
>>                       return -ENODEV;
>> -             console_lock();
>> +             fb_console_lock();
>>               info->flags |= FBINFO_MISC_USEREVENT;
>>               ret = fb_blank(info, arg);
>>               info->flags &= ~FBINFO_MISC_USEREVENT;
>> -             console_unlock();
>> +             fb_console_unlock();
>>               unlock_fb_info(info);
>>               break;
>>       default:
>> diff --git a/drivers/video/fbsysfs.c b/drivers/video/fbsysfs.c
>> index a55e366..976d8f5 100644
>> --- a/drivers/video/fbsysfs.c
>> +++ b/drivers/video/fbsysfs.c
>> @@ -18,7 +18,6 @@
>>  #include <linux/kernel.h>
>>  #include <linux/slab.h>
>>  #include <linux/fb.h>
>> -#include <linux/console.h>
>>  #include <linux/module.h>
>>
>>  #define FB_SYSFS_FLAG_ATTR 1
>> @@ -92,11 +91,11 @@ static int activate(struct fb_info *fb_info,
>> struct fb_var_screeninfo *var)
>>       int err;
>>
>>       var->activate |= FB_ACTIVATE_FORCE;
>> -     console_lock();
>> +     fb_console_lock();
>>       fb_info->flags |= FBINFO_MISC_USEREVENT;
>>       err = fb_set_var(fb_info, var);
>>       fb_info->flags &= ~FBINFO_MISC_USEREVENT;
>> -     console_unlock();
>> +     fb_console_unlock();
>>       if (err)
>>               return err;
>>       return 0;
>> @@ -177,7 +176,7 @@ static ssize_t store_modes(struct device *device,
>>       if (i * sizeof(struct fb_videomode) != count)
>>               return -EINVAL;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       list_splice(&fb_info->modelist, &old_list);
>>       fb_videomode_to_modelist((const struct fb_videomode *)buf, i,
>>                                &fb_info->modelist);
>> @@ -187,7 +186,7 @@ static ssize_t store_modes(struct device *device,
>>       } else
>>               fb_destroy_modelist(&old_list);
>>
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> @@ -303,11 +302,11 @@ static ssize_t store_blank(struct device *device,
>>       char *last = NULL;
>>       int err;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       fb_info->flags |= FBINFO_MISC_USEREVENT;
>>       err = fb_blank(fb_info, simple_strtoul(buf, &last, 0));
>>       fb_info->flags &= ~FBINFO_MISC_USEREVENT;
>> -     console_unlock();
>> +     fb_console_unlock();
>>       if (err < 0)
>>               return err;
>>       return count;
>> @@ -366,9 +365,9 @@ static ssize_t store_pan(struct device *device,
>>               return -EINVAL;
>>       var.yoffset = simple_strtoul(last, &last, 0);
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       err = fb_pan_display(fb_info, &var);
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       if (err < 0)
>>               return err;
>> @@ -403,9 +402,9 @@ static ssize_t store_fbstate(struct device *device,
>>
>>       if (!lock_fb_info(fb_info))
>>               return -ENODEV;
>> -     console_lock();
>> +     fb_console_lock();
>>       fb_set_suspend(fb_info, (int)state);
>> -     console_unlock();
>> +     fb_console_unlock();
>>       unlock_fb_info(fb_info);
>>
>>       return count;
>> diff --git a/drivers/video/geode/gxfb_core.c b/drivers/video/geode/gxfb_core.c
>> index b4f19db..ba7dd0a 100644
>> --- a/drivers/video/geode/gxfb_core.c
>> +++ b/drivers/video/geode/gxfb_core.c
>> @@ -27,7 +27,6 @@
>>  #include <linux/mm.h>
>>  #include <linux/delay.h>
>>  #include <linux/fb.h>
>> -#include <linux/console.h>
>>  #include <linux/suspend.h>
>>  #include <linux/init.h>
>>  #include <linux/pci.h>
>> @@ -344,10 +343,10 @@ static int gxfb_suspend(struct pci_dev *pdev,
>> pm_message_t state)
>>       struct fb_info *info = pci_get_drvdata(pdev);
>>
>>       if (state.event == PM_EVENT_SUSPEND) {
>> -             console_lock();
>> +             fb_console_lock();
>>               gx_powerdown(info);
>>               fb_set_suspend(info, 1);
>> -             console_unlock();
>> +             fb_console_unlock();
>>       }
>>
>>       /* there's no point in setting PCI states; we emulate PCI, so
>> @@ -361,7 +360,7 @@ static int gxfb_resume(struct pci_dev *pdev)
>>       struct fb_info *info = pci_get_drvdata(pdev);
>>       int ret;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       ret = gx_powerup(info);
>>       if (ret) {
>>               printk(KERN_ERR "gxfb:  power up failed!\n");
>> @@ -369,7 +368,7 @@ static int gxfb_resume(struct pci_dev *pdev)
>>       }
>>
>>       fb_set_suspend(info, 0);
>> -     console_unlock();
>> +     fb_console_unlock();
>>       return 0;
>>  }
>>  #endif
>> diff --git a/drivers/video/geode/lxfb_core.c b/drivers/video/geode/lxfb_core.c
>> index 416851c..5341bf1 100644
>> --- a/drivers/video/geode/lxfb_core.c
>> +++ b/drivers/video/geode/lxfb_core.c
>> @@ -465,10 +465,10 @@ static int lxfb_suspend(struct pci_dev *pdev,
>> pm_message_t state)
>>       struct fb_info *info = pci_get_drvdata(pdev);
>>
>>       if (state.event == PM_EVENT_SUSPEND) {
>> -             console_lock();
>> +             fb_console_lock();
>>               lx_powerdown(info);
>>               fb_set_suspend(info, 1);
>> -             console_unlock();
>> +             fb_console_unlock();
>>       }
>>
>>       /* there's no point in setting PCI states; we emulate PCI, so
>> @@ -482,7 +482,7 @@ static int lxfb_resume(struct pci_dev *pdev)
>>       struct fb_info *info = pci_get_drvdata(pdev);
>>       int ret;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       ret = lx_powerup(info);
>>       if (ret) {
>>               printk(KERN_ERR "lxfb:  power up failed!\n");
>> @@ -490,7 +490,7 @@ static int lxfb_resume(struct pci_dev *pdev)
>>       }
>>
>>       fb_set_suspend(info, 0);
>> -     console_unlock();
>> +     fb_console_unlock();
>>       return 0;
>>  }
>>  #else
>> diff --git a/drivers/video/i740fb.c b/drivers/video/i740fb.c
>> index ff3f880..b3fe538 100644
>> --- a/drivers/video/i740fb.c
>> +++ b/drivers/video/i740fb.c
>> @@ -24,7 +24,6 @@
>>  #include <linux/pci_ids.h>
>>  #include <linux/i2c.h>
>>  #include <linux/i2c-algo-bit.h>
>> -#include <linux/console.h>
>>  #include <video/vga.h>
>>
>>  #ifdef CONFIG_MTRR
>> @@ -1210,13 +1209,13 @@ static int i740fb_suspend(struct pci_dev *dev,
>> pm_message_t state)
>>       if (state.event == PM_EVENT_FREEZE || state.event == PM_EVENT_PRETHAW)
>>               return 0;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       mutex_lock(&(par->open_lock));
>>
>>       /* do nothing if framebuffer is not active */
>>       if (par->ref_count == 0) {
>>               mutex_unlock(&(par->open_lock));
>> -             console_unlock();
>> +             fb_console_unlock();
>>               return 0;
>>       }
>>
>> @@ -1227,7 +1226,7 @@ static int i740fb_suspend(struct pci_dev *dev,
>> pm_message_t state)
>>       pci_set_power_state(dev, pci_choose_state(dev, state));
>>
>>       mutex_unlock(&(par->open_lock));
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> @@ -1237,7 +1236,7 @@ static int i740fb_resume(struct pci_dev *dev)
>>       struct fb_info *info = pci_get_drvdata(dev);
>>       struct i740fb_par *par = info->par;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       mutex_lock(&(par->open_lock));
>>
>>       if (par->ref_count == 0)
>> @@ -1253,7 +1252,7 @@ static int i740fb_resume(struct pci_dev *dev)
>>
>>  fail:
>>       mutex_unlock(&(par->open_lock));
>> -     console_unlock();
>> +     fb_console_unlock();
>>       return 0;
>>  }
>>  #else
>> diff --git a/drivers/video/i810/i810_main.c b/drivers/video/i810/i810_main.c
>> index b83f361..84fe1ed 100644
>> --- a/drivers/video/i810/i810_main.c
>> +++ b/drivers/video/i810/i810_main.c
>> @@ -40,7 +40,6 @@
>>  #include <linux/pci_ids.h>
>>  #include <linux/resource.h>
>>  #include <linux/unistd.h>
>> -#include <linux/console.h>
>>
>>  #include <asm/io.h>
>>  #include <asm/div64.h>
>> @@ -1574,7 +1573,7 @@ static int i810fb_suspend(struct pci_dev *dev,
>> pm_message_t mesg)
>>               return 0;
>>       }
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       fb_set_suspend(info, 1);
>>
>>       if (info->fbops->fb_sync)
>> @@ -1587,7 +1586,7 @@ static int i810fb_suspend(struct pci_dev *dev,
>> pm_message_t mesg)
>>       pci_save_state(dev);
>>       pci_disable_device(dev);
>>       pci_set_power_state(dev, pci_choose_state(dev, mesg));
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> @@ -1605,7 +1604,7 @@ static int i810fb_resume(struct pci_dev *dev)
>>               return 0;
>>       }
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       pci_set_power_state(dev, PCI_D0);
>>       pci_restore_state(dev);
>>
>> @@ -1621,7 +1620,7 @@ static int i810fb_resume(struct pci_dev *dev)
>>       fb_set_suspend (info, 0);
>>       info->fbops->fb_blank(VESA_NO_BLANKING, info);
>>  fail:
>> -     console_unlock();
>> +     fb_console_unlock();
>>       return 0;
>>  }
>>  /***********************************************************************
>> diff --git a/drivers/video/jz4740_fb.c b/drivers/video/jz4740_fb.c
>> index de36693..7e9301a 100644
>> --- a/drivers/video/jz4740_fb.c
>> +++ b/drivers/video/jz4740_fb.c
>> @@ -21,7 +21,6 @@
>>  #include <linux/clk.h>
>>  #include <linux/delay.h>
>>
>> -#include <linux/console.h>
>>  #include <linux/fb.h>
>>
>>  #include <linux/dma-mapping.h>
>> @@ -778,9 +777,9 @@ static int jzfb_suspend(struct device *dev)
>>  {
>>       struct jzfb *jzfb = dev_get_drvdata(dev);
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       fb_set_suspend(jzfb->fb, 1);
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       mutex_lock(&jzfb->lock);
>>       if (jzfb->is_enabled)
>> @@ -800,9 +799,9 @@ static int jzfb_resume(struct device *dev)
>>               jzfb_enable(jzfb);
>>       mutex_unlock(&jzfb->lock);
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       fb_set_suspend(jzfb->fb, 0);
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> diff --git a/drivers/video/mx3fb.c b/drivers/video/mx3fb.c
>> index c89f8a8..da25fa1 100644
>> --- a/drivers/video/mx3fb.c
>> +++ b/drivers/video/mx3fb.c
>> @@ -23,7 +23,6 @@
>>  #include <linux/ioport.h>
>>  #include <linux/dma-mapping.h>
>>  #include <linux/dmaengine.h>
>> -#include <linux/console.h>
>>  #include <linux/clk.h>
>>  #include <linux/mutex.h>
>>
>> @@ -1204,9 +1203,9 @@ static int mx3fb_suspend(struct platform_device
>> *pdev, pm_message_t state)
>>       struct mx3fb_data *mx3fb = platform_get_drvdata(pdev);
>>       struct mx3fb_info *mx3_fbi = mx3fb->fbi->par;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       fb_set_suspend(mx3fb->fbi, 1);
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       if (mx3_fbi->blank == FB_BLANK_UNBLANK) {
>>               sdc_disable_channel(mx3_fbi);
>> @@ -1229,9 +1228,9 @@ static int mx3fb_resume(struct platform_device *pdev)
>>               sdc_set_brightness(mx3fb, mx3fb->backlight_level);
>>       }
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       fb_set_suspend(mx3fb->fbi, 0);
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> diff --git a/drivers/video/nvidia/nvidia.c b/drivers/video/nvidia/nvidia.c
>> index fe13ac5..f47eb2a 100644
>> --- a/drivers/video/nvidia/nvidia.c
>> +++ b/drivers/video/nvidia/nvidia.c
>> @@ -19,7 +19,6 @@
>>  #include <linux/fb.h>
>>  #include <linux/init.h>
>>  #include <linux/pci.h>
>> -#include <linux/console.h>
>>  #include <linux/backlight.h>
>>  #ifdef CONFIG_MTRR
>>  #include <asm/mtrr.h>
>> @@ -1057,7 +1056,7 @@ static int nvidiafb_suspend(struct pci_dev *dev,
>> pm_message_t mesg)
>>
>>       if (mesg.event == PM_EVENT_PRETHAW)
>>               mesg.event = PM_EVENT_FREEZE;
>> -     console_lock();
>> +     fb_console_lock();
>>       par->pm_state = mesg.event;
>>
>>       if (mesg.event & PM_EVENT_SLEEP) {
>> @@ -1070,7 +1069,7 @@ static int nvidiafb_suspend(struct pci_dev *dev,
>> pm_message_t mesg)
>>       }
>>       dev->dev.power.power_state = mesg;
>>
>> -     console_unlock();
>> +     fb_console_unlock();
>>       return 0;
>>  }
>>
>> @@ -1079,7 +1078,7 @@ static int nvidiafb_resume(struct pci_dev *dev)
>>       struct fb_info *info = pci_get_drvdata(dev);
>>       struct nvidia_par *par = info->par;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       pci_set_power_state(dev, PCI_D0);
>>
>>       if (par->pm_state != PM_EVENT_FREEZE) {
>> @@ -1097,7 +1096,7 @@ static int nvidiafb_resume(struct pci_dev *dev)
>>       nvidiafb_blank(FB_BLANK_UNBLANK, info);
>>
>>  fail:
>> -     console_unlock();
>> +     fb_console_unlock();
>>       return 0;
>>  }
>>  #else
>> diff --git a/drivers/video/ps3fb.c b/drivers/video/ps3fb.c
>> index 213fbbc..cb2e174 100644
>> --- a/drivers/video/ps3fb.c
>> +++ b/drivers/video/ps3fb.c
>> @@ -23,7 +23,6 @@
>>  #include <linux/string.h>
>>  #include <linux/mm.h>
>>  #include <linux/interrupt.h>
>> -#include <linux/console.h>
>>  #include <linux/ioctl.h>
>>  #include <linux/kthread.h>
>>  #include <linux/freezer.h>
>> @@ -515,7 +514,7 @@ static int ps3fb_release(struct fb_info *info, int user)
>>                       atomic_set(&ps3fb.ext_flip, 0);
>>                       if (console_trylock()) {
>>                               ps3fb_sync(info, 0);    /* single buffer */
>> -                             console_unlock();
>> +                             fb_console_unlock();
>>                       }
>>               }
>>       }
>> @@ -830,14 +829,14 @@ static int ps3fb_ioctl(struct fb_info *info,
>> unsigned int cmd,
>>                       if (vmode) {
>>                               var = info->var;
>>                               fb_videomode_to_var(&var, vmode);
>> -                             console_lock();
>> +                             fb_console_lock();
>>                               info->flags |= FBINFO_MISC_USEREVENT;
>>                               /* Force, in case only special bits changed */
>>                               var.activate |= FB_ACTIVATE_FORCE;
>>                               par->new_mode_id = val;
>>                               retval = fb_set_var(info, &var);
>>                               info->flags &= ~FBINFO_MISC_USEREVENT;
>> -                             console_unlock();
>> +                             fb_console_unlock();
>>                       }
>>                       break;
>>               }
>> @@ -881,9 +880,9 @@ static int ps3fb_ioctl(struct fb_info *info,
>> unsigned int cmd,
>>                       break;
>>
>>               dev_dbg(info->device, "PS3FB_IOCTL_FSEL:%d\n", val);
>> -             console_lock();
>> +             fb_console_lock();
>>               retval = ps3fb_sync(info, val);
>> -             console_unlock();
>> +             fb_console_unlock();
>>               break;
>>
>>       default:
>> @@ -903,9 +902,9 @@ static int ps3fbd(void *arg)
>>               set_current_state(TASK_INTERRUPTIBLE);
>>               if (ps3fb.is_kicked) {
>>                       ps3fb.is_kicked = 0;
>> -                     console_lock();
>> +                     fb_console_lock();
>>                       ps3fb_sync(info, 0);    /* single buffer */
>> -                     console_unlock();
>> +                     fb_console_unlock();
>>               }
>>               schedule();
>>       }
>> diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c
>> index 3f90255..a1af212 100644
>> --- a/drivers/video/pxafb.c
>> +++ b/drivers/video/pxafb.c
>> @@ -54,7 +54,6 @@
>>  #include <linux/mutex.h>
>>  #include <linux/kthread.h>
>>  #include <linux/freezer.h>
>> -#include <linux/console.h>
>>
>>  #include <mach/hardware.h>
>>  #include <asm/io.h>
>> @@ -733,9 +732,9 @@ static int overlayfb_open(struct fb_info *info, int user)
>>
>>       if (ofb->usage++ == 0) {
>>               /* unblank the base framebuffer */
>> -             console_lock();
>> +             fb_console_lock();
>>               fb_blank(&ofb->fbi->fb, FB_BLANK_UNBLANK);
>> -             console_unlock();
>> +             fb_console_unlock();
>>       }
>>
>>       return 0;
>> diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c
>> index 1d00736..7759c82 100644
>> --- a/drivers/video/s3fb.c
>> +++ b/drivers/video/s3fb.c
>> @@ -22,7 +22,6 @@
>>  #include <linux/svga.h>
>>  #include <linux/init.h>
>>  #include <linux/pci.h>
>> -#include <linux/console.h> /* Why should fb driver call console
>> functions? because console_lock() */
>>  #include <video/vga.h>
>>
>>  #include <linux/i2c.h>
>> @@ -1445,12 +1444,12 @@ static int s3_pci_suspend(struct pci_dev* dev,
>> pm_message_t state)
>>
>>       dev_info(info->device, "suspend\n");
>>
>> -     console_lock();
>> +     fb_fb_console_lock();
>>       mutex_lock(&(par->open_lock));
>>
>>       if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
>>               mutex_unlock(&(par->open_lock));
>> -             console_unlock();
>> +             fb_console_unlock();
>>               return 0;
>>       }
>>
>> @@ -1461,7 +1460,7 @@ static int s3_pci_suspend(struct pci_dev* dev,
>> pm_message_t state)
>>       pci_set_power_state(dev, pci_choose_state(dev, state));
>>
>>       mutex_unlock(&(par->open_lock));
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> @@ -1477,12 +1476,12 @@ static int s3_pci_resume(struct pci_dev* dev)
>>
>>       dev_info(info->device, "resume\n");
>>
>> -     console_lock();
>> +     fb_fb_console_lock();
>>       mutex_lock(&(par->open_lock));
>>
>>       if (par->ref_count == 0) {
>>               mutex_unlock(&(par->open_lock));
>> -             console_unlock();
>> +             fb_console_unlock();
>>               return 0;
>>       }
>>
>> @@ -1491,7 +1490,7 @@ static int s3_pci_resume(struct pci_dev* dev)
>>       err = pci_enable_device(dev);
>>       if (err) {
>>               mutex_unlock(&(par->open_lock));
>> -             console_unlock();
>> +             fb_console_unlock();
>>               dev_err(info->device, "error %d enabling device for resume\n", err);
>>               return err;
>>       }
>> @@ -1501,7 +1500,7 @@ static int s3_pci_resume(struct pci_dev* dev)
>>       fb_set_suspend(info, 0);
>>
>>       mutex_unlock(&(par->open_lock));
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> diff --git a/drivers/video/savage/savagefb_driver.c
>> b/drivers/video/savage/savagefb_driver.c
>> index 0d0f52c..bf64221 100644
>> --- a/drivers/video/savage/savagefb_driver.c
>> +++ b/drivers/video/savage/savagefb_driver.c
>> @@ -51,7 +51,6 @@
>>  #include <linux/fb.h>
>>  #include <linux/pci.h>
>>  #include <linux/init.h>
>> -#include <linux/console.h>
>>
>>  #include <asm/io.h>
>>  #include <asm/irq.h>
>> @@ -2391,7 +2390,7 @@ static int savagefb_suspend(struct pci_dev *dev,
>> pm_message_t mesg)
>>       if (mesg.event == PM_EVENT_FREEZE)
>>               return 0;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       fb_set_suspend(info, 1);
>>
>>       if (info->fbops->fb_sync)
>> @@ -2403,7 +2402,7 @@ static int savagefb_suspend(struct pci_dev *dev,
>> pm_message_t mesg)
>>       pci_save_state(dev);
>>       pci_disable_device(dev);
>>       pci_set_power_state(dev, pci_choose_state(dev, mesg));
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> @@ -2427,7 +2426,7 @@ static int savagefb_resume(struct pci_dev* dev)
>>               return 0;
>>       }
>>
>> -     console_lock();
>> +     fb_console_lock();
>>
>>       pci_set_power_state(dev, PCI_D0);
>>       pci_restore_state(dev);
>> @@ -2441,7 +2440,7 @@ static int savagefb_resume(struct pci_dev* dev)
>>       savagefb_set_par(info);
>>       fb_set_suspend(info, 0);
>>       savagefb_blank(FB_BLANK_UNBLANK, info);
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c
>> index 699487c..2bc1119 100644
>> --- a/drivers/video/sh_mobile_lcdcfb.c
>> +++ b/drivers/video/sh_mobile_lcdcfb.c
>> @@ -11,7 +11,6 @@
>>  #include <linux/atomic.h>
>>  #include <linux/backlight.h>
>>  #include <linux/clk.h>
>> -#include <linux/console.h>
>>  #include <linux/ctype.h>
>>  #include <linux/dma-mapping.h>
>>  #include <linux/delay.h>
>> @@ -575,7 +574,7 @@ static int sh_mobile_lcdc_display_notify(struct
>> sh_mobile_lcdc_chan *ch,
>>       case SH_MOBILE_LCDC_EVENT_DISPLAY_CONNECT:
>>               /* HDMI plug in */
>>               if (lock_fb_info(info)) {
>> -                     console_lock();
>> +                     fb_console_lock();
>>
>>                       ch->display.width = monspec->max_x * 10;
>>                       ch->display.height = monspec->max_y * 10;
>> @@ -594,7 +593,7 @@ static int sh_mobile_lcdc_display_notify(struct
>> sh_mobile_lcdc_chan *ch,
>>                               fb_set_suspend(info, 0);
>>                       }
>>
>> -                     console_unlock();
>> +                     fb_console_unlock();
>>                       unlock_fb_info(info);
>>               }
>>               break;
>> @@ -602,9 +601,9 @@ static int sh_mobile_lcdc_display_notify(struct
>> sh_mobile_lcdc_chan *ch,
>>       case SH_MOBILE_LCDC_EVENT_DISPLAY_DISCONNECT:
>>               /* HDMI disconnect */
>>               if (lock_fb_info(info)) {
>> -                     console_lock();
>> +                     fb_console_lock();
>>                       fb_set_suspend(info, 1);
>> -                     console_unlock();
>> +                     fb_console_unlock();
>>                       unlock_fb_info(info);
>>               }
>>               break;
>> @@ -1934,9 +1933,9 @@ static int sh_mobile_lcdc_release(struct fb_info
>> *info, int user)
>>
>>       /* Nothing to reconfigure, when called from fbcon */
>>       if (user) {
>> -             console_lock();
>> +             fb_console_lock();
>>               sh_mobile_fb_reconfig(info);
>> -             console_unlock();
>> +             fb_console_unlock();
>>       }
>>
>>       mutex_unlock(&ch->open_lock);
>> diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
>> index 3690eff..536f922 100644
>> --- a/drivers/video/sm501fb.c
>> +++ b/drivers/video/sm501fb.c
>> @@ -28,7 +28,6 @@
>>  #include <linux/wait.h>
>>  #include <linux/platform_device.h>
>>  #include <linux/clk.h>
>> -#include <linux/console.h>
>>  #include <linux/io.h>
>>
>>  #include <asm/uaccess.h>
>> @@ -2104,9 +2103,9 @@ static int sm501fb_suspend_fb(struct sm501fb_info *info,
>>
>>       /* tell console/fb driver we are suspending */
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       fb_set_suspend(fbi, 1);
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       /* backup copies in case chip is powered down over suspend */
>>
>> @@ -2163,9 +2162,9 @@ static void sm501fb_resume_fb(struct sm501fb_info *info,
>>               memcpy_toio(par->cursor.k_addr, par->store_cursor,
>>                           par->cursor.size);
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       fb_set_suspend(fbi, 0);
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       vfree(par->store_fb);
>>       vfree(par->store_cursor);
>> diff --git a/drivers/video/tmiofb.c b/drivers/video/tmiofb.c
>> index 8e4a446..e266b6b 100644
>> --- a/drivers/video/tmiofb.c
>> +++ b/drivers/video/tmiofb.c
>> @@ -25,8 +25,7 @@
>>  #include <linux/fb.h>
>>  #include <linux/interrupt.h>
>>  #include <linux/delay.h>
>> -/* Why should fb driver call console functions? because console_lock() */
>> -#include <linux/console.h>
>> +/* Why should fb driver call console functions? because fb_console_lock() */
>>  #include <linux/mfd/core.h>
>>  #include <linux/mfd/tmio.h>
>>  #include <linux/uaccess.h>
>> @@ -938,7 +937,7 @@ static int tmiofb_suspend(struct platform_device
>> *dev, pm_message_t state)
>>       const struct mfd_cell *cell = mfd_get_cell(dev);
>>       int retval = 0;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>
>>       fb_set_suspend(info, 1);
>>
>> @@ -959,7 +958,7 @@ static int tmiofb_suspend(struct platform_device
>> *dev, pm_message_t state)
>>       if (cell->suspend)
>>               retval = cell->suspend(dev);
>>
>> -     console_unlock();
>> +     fb_fb_console_unlock();
>>
>>       return retval;
>>  }
>> @@ -970,7 +969,7 @@ static int tmiofb_resume(struct platform_device *dev)
>>       const struct mfd_cell *cell = mfd_get_cell(dev);
>>       int retval = 0;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>
>>       if (cell->resume) {
>>               retval = cell->resume(dev);
>> @@ -986,7 +985,7 @@ static int tmiofb_resume(struct platform_device *dev)
>>
>>       fb_set_suspend(info, 0);
>>  out:
>> -     console_unlock();
>> +     fb_fb_console_unlock();
>>       return retval;
>>  }
>>  #else
>> diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c
>> index c80e770..d36b173 100644
>> --- a/drivers/video/via/viafbdev.c
>> +++ b/drivers/video/via/viafbdev.c
>> @@ -1698,17 +1698,17 @@ static int parse_mode(const char *str, u32
>> devices, u32 *xres, u32 *yres)
>>  #ifdef CONFIG_PM
>>  static int viafb_suspend(void *unused)
>>  {
>> -     console_lock();
>> +     fb_console_lock();
>>       fb_set_suspend(viafbinfo, 1);
>>       viafb_sync(viafbinfo);
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>>
>>  static int viafb_resume(void *unused)
>>  {
>> -     console_lock();
>> +     fb_console_lock();
>>       if (viaparinfo->shared->vdev->engine_mmio)
>>               viafb_reset_engine(viaparinfo);
>>       viafb_set_par(viafbinfo);
>> @@ -1716,7 +1716,7 @@ static int viafb_resume(void *unused)
>>               viafb_set_par(viafbinfo1);
>>       fb_set_suspend(viafbinfo, 0);
>>
>> -     console_unlock();
>> +     fb_console_unlock();
>>       return 0;
>>  }
>>
>> diff --git a/drivers/video/vt8623fb.c b/drivers/video/vt8623fb.c
>> index 4e74d26..cb48d4d 100644
>> --- a/drivers/video/vt8623fb.c
>> +++ b/drivers/video/vt8623fb.c
>> @@ -23,7 +23,6 @@
>>  #include <linux/svga.h>
>>  #include <linux/init.h>
>>  #include <linux/pci.h>
>> -#include <linux/console.h> /* Why should fb driver call console
>> functions? because console_lock() */
>>  #include <video/vga.h>
>>
>>  #ifdef CONFIG_MTRR
>> @@ -845,12 +844,12 @@ static int vt8623_pci_suspend(struct pci_dev*
>> dev, pm_message_t state)
>>
>>       dev_info(info->device, "suspend\n");
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       mutex_lock(&(par->open_lock));
>>
>>       if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
>>               mutex_unlock(&(par->open_lock));
>> -             console_unlock();
>> +             fb_console_unlock();
>>               return 0;
>>       }
>>
>> @@ -861,7 +860,7 @@ static int vt8623_pci_suspend(struct pci_dev* dev,
>> pm_message_t state)
>>       pci_set_power_state(dev, pci_choose_state(dev, state));
>>
>>       mutex_unlock(&(par->open_lock));
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> @@ -876,7 +875,7 @@ static int vt8623_pci_resume(struct pci_dev* dev)
>>
>>       dev_info(info->device, "resume\n");
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       mutex_lock(&(par->open_lock));
>>
>>       if (par->ref_count == 0)
>> @@ -895,7 +894,7 @@ static int vt8623_pci_resume(struct pci_dev* dev)
>>
>>  fail:
>>       mutex_unlock(&(par->open_lock));
>> -     console_unlock();
>> +     fb_console_unlock();
>>
>>       return 0;
>>  }
>> diff --git a/drivers/video/xen-fbfront.c b/drivers/video/xen-fbfront.c
>> index b7f5173..770397e7 100644
>> --- a/drivers/video/xen-fbfront.c
>> +++ b/drivers/video/xen-fbfront.c
>> @@ -18,7 +18,6 @@
>>   * frame buffer.
>>   */
>>
>> -#include <linux/console.h>
>>  #include <linux/kernel.h>
>>  #include <linux/errno.h>
>>  #include <linux/fb.h>
>> @@ -495,12 +494,12 @@ xenfb_make_preferred_console(void)
>>       if (console_set_on_cmdline)
>>               return;
>>
>> -     console_lock();
>> +     fb_console_lock();
>>       for_each_console(c) {
>>               if (!strcmp(c->name, "tty") && c->index == 0)
>>                       break;
>>       }
>> -     console_unlock();
>> +     fb_console_unlock();
>>       if (c) {
>>               unregister_console(c);
>>               c->flags |= CON_CONSDEV;
>> diff --git a/include/linux/fb.h b/include/linux/fb.h
>> index ac3f1c6..7ae96ad 100644
>> --- a/include/linux/fb.h
>> +++ b/include/linux/fb.h
>> @@ -1021,6 +1021,8 @@ extern int fb_get_color_depth(struct
>> fb_var_screeninfo *var,
>>                             struct fb_fix_screeninfo *fix);
>>  extern int fb_get_options(char *name, char **option);
>>  extern int fb_new_modelist(struct fb_info *info);
>> +extern void fb_console_unlock(void);
>> +extern void fb_console_lock(void);
>>
>>  extern struct fb_info *registered_fb[FB_MAX];
>>  extern int num_registered_fb;
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Geert Uytterhoeven Sept. 29, 2012, 7:37 a.m. UTC | #3
On Sat, Sep 29, 2012 at 7:29 AM, Jun Nie <niej0001@gmail.com> wrote:
> If VGA console is not enable, we do not have to
     ^^^
Frame buffer console?

> involve console lock/unlock in FB framework to avoid

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jun Nie Sept. 29, 2012, 8:11 a.m. UTC | #4
2012/9/29 Geert Uytterhoeven <geert@linux-m68k.org>:
> On Sat, Sep 29, 2012 at 7:29 AM, Jun Nie <niej0001@gmail.com> wrote:
>> If VGA console is not enable, we do not have to
>      ^^^
> Frame buffer console?
>
Yes, I mean framebuffer console. I add VGA console for I see it in the
drivers/video/console/Kconfig. If you guys feel confused by VGA
console, I will change it to framebuffer console.
Jun

>> involve console lock/unlock in FB framework to avoid
>
> Gr{oetje,eeting}s,
>
>                         Geert
>
> --
> Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
>
> In personal conversations with technical people, I call myself a hacker. But
> when I'm talking to journalists I just say "programmer" or something like that.
>                                 -- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Benjamin Herrenschmidt Sept. 29, 2012, 10:43 a.m. UTC | #5
On Sat, 2012-09-29 at 14:03 +0800, Jun Nie wrote:

> Hi Ben,
>     Yes. If framebuffer console is disabled, I do not see any need to
> hold console lock in FB. Please help indicate the risk if any. Thanks!

Because there is no other lock left in the entire fbdev layer.. a lot of
fbdev drivers have no locking of their own and rely on the console
semaphore in more than one way.

Ben.

> Jun
> >> Signed-off-by: Jun Nie <njun@marvell.com>
> >> ---
> >>  drivers/video/arkfb.c                  |   11 +++++------
> >>  drivers/video/aty/aty128fb.c           |   11 +++++------
> >>  drivers/video/aty/atyfb_base.c         |   11 +++++------
> >>  drivers/video/aty/radeon_pm.c          |    9 ++++-----
> >>  drivers/video/chipsfb.c                |    8 ++++----
> >>  drivers/video/da8xx-fb.c               |    9 ++++-----
> >>  drivers/video/fb-puv3.c                |    9 ++++-----
> >>  drivers/video/fbmem.c                  |   28 ++++++++++++++++++++++------
> >>  drivers/video/fbsysfs.c                |   21 ++++++++++-----------
> >>  drivers/video/geode/gxfb_core.c        |    9 ++++-----
> >>  drivers/video/geode/lxfb_core.c        |    8 ++++----
> >>  drivers/video/i740fb.c                 |   11 +++++------
> >>  drivers/video/i810/i810_main.c         |    9 ++++-----
> >>  drivers/video/jz4740_fb.c              |    9 ++++-----
> >>  drivers/video/mx3fb.c                  |    9 ++++-----
> >>  drivers/video/nvidia/nvidia.c          |    9 ++++-----
> >>  drivers/video/ps3fb.c                  |   15 +++++++--------
> >>  drivers/video/pxafb.c                  |    5 ++---
> >>  drivers/video/s3fb.c                   |   15 +++++++--------
> >>  drivers/video/savage/savagefb_driver.c |    9 ++++-----
> >>  drivers/video/sh_mobile_lcdcfb.c       |   13 ++++++-------
> >>  drivers/video/sm501fb.c                |    9 ++++-----
> >>  drivers/video/tmiofb.c                 |   11 +++++------
> >>  drivers/video/via/viafbdev.c           |    8 ++++----
> >>  drivers/video/vt8623fb.c               |   11 +++++------
> >>  drivers/video/xen-fbfront.c            |    5 ++---
> >>  include/linux/fb.h                     |    2 ++
> >>  27 files changed, 140 insertions(+), 144 deletions(-)
> >>
> >> diff --git a/drivers/video/arkfb.c b/drivers/video/arkfb.c
> >> index 555dd4c..774d902 100644
> >> --- a/drivers/video/arkfb.c
> >> +++ b/drivers/video/arkfb.c
> >> @@ -23,7 +23,6 @@
> >>  #include <linux/svga.h>
> >>  #include <linux/init.h>
> >>  #include <linux/pci.h>
> >> -#include <linux/console.h> /* Why should fb driver call console
> >> functions? because console_lock() */
> >>  #include <video/vga.h>
> >>
> >>  #ifdef CONFIG_MTRR
> >> @@ -1124,12 +1123,12 @@ static int ark_pci_suspend (struct pci_dev*
> >> dev, pm_message_t state)
> >>
> >>       dev_info(info->device, "suspend\n");
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       mutex_lock(&(par->open_lock));
> >>
> >>       if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
> >>               mutex_unlock(&(par->open_lock));
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>               return 0;
> >>       }
> >>
> >> @@ -1140,7 +1139,7 @@ static int ark_pci_suspend (struct pci_dev* dev,
> >> pm_message_t state)
> >>       pci_set_power_state(dev, pci_choose_state(dev, state));
> >>
> >>       mutex_unlock(&(par->open_lock));
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> @@ -1155,7 +1154,7 @@ static int ark_pci_resume (struct pci_dev* dev)
> >>
> >>       dev_info(info->device, "resume\n");
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       mutex_lock(&(par->open_lock));
> >>
> >>       if (par->ref_count == 0)
> >> @@ -1174,7 +1173,7 @@ static int ark_pci_resume (struct pci_dev* dev)
> >>
> >>  fail:
> >>       mutex_unlock(&(par->open_lock));
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>       return 0;
> >>  }
> >>  #else
> >> diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c
> >> index 747442d..1c6b80b 100644
> >> --- a/drivers/video/aty/aty128fb.c
> >> +++ b/drivers/video/aty/aty128fb.c
> >> @@ -60,7 +60,6 @@
> >>  #include <linux/init.h>
> >>  #include <linux/pci.h>
> >>  #include <linux/ioport.h>
> >> -#include <linux/console.h>
> >>  #include <linux/backlight.h>
> >>  #include <asm/io.h>
> >>
> >> @@ -1884,7 +1883,7 @@ static void aty128_early_resume(void *data)
> >>               return;
> >>       pci_restore_state(par->pdev);
> >>       aty128_do_resume(par->pdev);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>  }
> >>  #endif /* CONFIG_PPC_PMAC */
> >>
> >> @@ -2461,7 +2460,7 @@ static int aty128_pci_suspend(struct pci_dev
> >> *pdev, pm_message_t state)
> >>
> >>       printk(KERN_DEBUG "aty128fb: suspending...\n");
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>
> >>       fb_set_suspend(info, 1);
> >>
> >> @@ -2493,7 +2492,7 @@ static int aty128_pci_suspend(struct pci_dev
> >> *pdev, pm_message_t state)
> >>       if (state.event != PM_EVENT_ON)
> >>               aty128_set_suspend(par, 1);
> >>
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       pdev->dev.power.power_state = state;
> >>
> >> @@ -2550,9 +2549,9 @@ static int aty128_pci_resume(struct pci_dev *pdev)
> >>  {
> >>       int rc;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       rc = aty128_do_resume(pdev);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return rc;
> >>  }
> >> diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c
> >> index 3f2e8c1..9bb15ab 100644
> >> --- a/drivers/video/aty/atyfb_base.c
> >> +++ b/drivers/video/aty/atyfb_base.c
> >> @@ -58,7 +58,6 @@
> >>  #include <linux/slab.h>
> >>  #include <linux/vmalloc.h>
> >>  #include <linux/delay.h>
> >> -#include <linux/console.h>
> >>  #include <linux/fb.h>
> >>  #include <linux/init.h>
> >>  #include <linux/pci.h>
> >> @@ -2065,7 +2064,7 @@ static int atyfb_pci_suspend(struct pci_dev
> >> *pdev, pm_message_t state)
> >>       if (state.event == pdev->dev.power.power_state.event)
> >>               return 0;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>
> >>       fb_set_suspend(info, 1);
> >>
> >> @@ -2093,14 +2092,14 @@ static int atyfb_pci_suspend(struct pci_dev
> >> *pdev, pm_message_t state)
> >>               par->lock_blank = 0;
> >>               atyfb_blank(FB_BLANK_UNBLANK, info);
> >>               fb_set_suspend(info, 0);
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>               return -EIO;
> >>       }
> >>  #else
> >>       pci_set_power_state(pdev, pci_choose_state(pdev, state));
> >>  #endif
> >>
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       pdev->dev.power.power_state = state;
> >>
> >> @@ -2129,7 +2128,7 @@ static int atyfb_pci_resume(struct pci_dev *pdev)
> >>       if (pdev->dev.power.power_state.event == PM_EVENT_ON)
> >>               return 0;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>
> >>       /*
> >>        * PCI state will have been restored by the core, so
> >> @@ -2157,7 +2156,7 @@ static int atyfb_pci_resume(struct pci_dev *pdev)
> >>       par->lock_blank = 0;
> >>       atyfb_blank(FB_BLANK_UNBLANK, info);
> >>
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       pdev->dev.power.power_state = PMSG_ON;
> >>
> >> diff --git a/drivers/video/aty/radeon_pm.c b/drivers/video/aty/radeon_pm.c
> >> index 92bda58..a2f07da 100644
> >> --- a/drivers/video/aty/radeon_pm.c
> >> +++ b/drivers/video/aty/radeon_pm.c
> >> @@ -16,7 +16,6 @@
> >>
> >>  #include "radeonfb.h"
> >>
> >> -#include <linux/console.h>
> >>  #include <linux/agp_backend.h>
> >>
> >>  #ifdef CONFIG_PPC_PMAC
> >> @@ -2626,7 +2625,7 @@ int radeonfb_pci_suspend(struct pci_dev *pdev,
> >> pm_message_t mesg)
> >>               goto done;
> >>       }
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>
> >>       fb_set_suspend(info, 1);
> >>
> >> @@ -2690,7 +2689,7 @@ int radeonfb_pci_suspend(struct pci_dev *pdev,
> >> pm_message_t mesg)
> >>       if (rinfo->pm_mode & radeon_pm_d2)
> >>               radeon_set_suspend(rinfo, 1);
> >>
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>   done:
> >>       pdev->dev.power.power_state = mesg;
> >> @@ -2718,7 +2717,7 @@ int radeonfb_pci_resume(struct pci_dev *pdev)
> >>               if (!console_trylock())
> >>                       return 0;
> >>       } else
> >> -             console_lock();
> >> +             fb_console_lock();
> >>
> >>       printk(KERN_DEBUG "radeonfb (%s): resuming from state: %d...\n",
> >>              pci_name(pdev), pdev->dev.power.power_state.event);
> >> @@ -2783,7 +2782,7 @@ int radeonfb_pci_resume(struct pci_dev *pdev)
> >>       pdev->dev.power.power_state = PMSG_ON;
> >>
> >>   bail:
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return rc;
> >>  }
> >> diff --git a/drivers/video/chipsfb.c b/drivers/video/chipsfb.c
> >> index cff742a..d50fa6b 100644
> >> --- a/drivers/video/chipsfb.c
> >> +++ b/drivers/video/chipsfb.c
> >> @@ -460,10 +460,10 @@ static int chipsfb_pci_suspend(struct pci_dev
> >> *pdev, pm_message_t state)
> >>       if (!(state.event & PM_EVENT_SLEEP))
> >>               goto done;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       chipsfb_blank(1, p);
> >>       fb_set_suspend(p, 1);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>   done:
> >>       pdev->dev.power.power_state = state;
> >>       return 0;
> >> @@ -473,10 +473,10 @@ static int chipsfb_pci_resume(struct pci_dev *pdev)
> >>  {
> >>          struct fb_info *p = pci_get_drvdata(pdev);
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       fb_set_suspend(p, 0);
> >>       chipsfb_blank(0, p);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       pdev->dev.power.power_state = PMSG_ON;
> >>       return 0;
> >> diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
> >> index 7ae9d53..9a36bbc 100644
> >> --- a/drivers/video/da8xx-fb.c
> >> +++ b/drivers/video/da8xx-fb.c
> >> @@ -29,7 +29,6 @@
> >>  #include <linux/interrupt.h>
> >>  #include <linux/clk.h>
> >>  #include <linux/cpufreq.h>
> >> -#include <linux/console.h>
> >>  #include <linux/spinlock.h>
> >>  #include <linux/slab.h>
> >>  #include <linux/delay.h>
> >> @@ -1406,14 +1405,14 @@ static int fb_suspend(struct platform_device
> >> *dev, pm_message_t state)
> >>       struct fb_info *info = platform_get_drvdata(dev);
> >>       struct da8xx_fb_par *par = info->par;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       if (par->panel_power_ctrl)
> >>               par->panel_power_ctrl(0);
> >>
> >>       fb_set_suspend(info, 1);
> >>       lcd_disable_raster();
> >>       clk_disable(par->lcdc_clk);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> @@ -1422,7 +1421,7 @@ static int fb_resume(struct platform_device *dev)
> >>       struct fb_info *info = platform_get_drvdata(dev);
> >>       struct da8xx_fb_par *par = info->par;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       clk_enable(par->lcdc_clk);
> >>       lcd_enable_raster();
> >>
> >> @@ -1430,7 +1429,7 @@ static int fb_resume(struct platform_device *dev)
> >>               par->panel_power_ctrl(1);
> >>
> >>       fb_set_suspend(info, 0);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> diff --git a/drivers/video/fb-puv3.c b/drivers/video/fb-puv3.c
> >> index 60a787f..87c8c4e 100644
> >> --- a/drivers/video/fb-puv3.c
> >> +++ b/drivers/video/fb-puv3.c
> >> @@ -17,7 +17,6 @@
> >>  #include <linux/clk.h>
> >>  #include <linux/fb.h>
> >>  #include <linux/init.h>
> >> -#include <linux/console.h>
> >>
> >>  #include <asm/sizes.h>
> >>  #include <mach/hardware.h>
> >> @@ -759,7 +758,7 @@ static int unifb_resume(struct platform_device *dev)
> >>       if (dev->dev.power.power_state.event == PM_EVENT_ON)
> >>               return 0;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>
> >>       if (dev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
> >>               writel(unifb_regs[0], UDE_FSA);
> >> @@ -775,7 +774,7 @@ static int unifb_resume(struct platform_device *dev)
> >>       }
> >>       dev->dev.power.power_state = PMSG_ON;
> >>
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return rc;
> >>  }
> >> @@ -804,11 +803,11 @@ static int unifb_suspend(struct platform_device
> >> *dev, pm_message_t mesg)
> >>               goto done;
> >>       }
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>
> >>       /* do nothing... */
> >>
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>  done:
> >>       dev->dev.power.power_state = mesg;
> >> diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
> >> index 0dff12a..c2d4627 100644
> >> --- a/drivers/video/fbmem.c
> >> +++ b/drivers/video/fbmem.c
> >> @@ -85,6 +85,22 @@ EXPORT_SYMBOL(lock_fb_info);
> >>   * Helpers
> >>   */
> >>
> >> +void fb_console_lock(void)
> >> +{
> >> +#ifdef CONFIG_FRAMEBUFFER_CONSOLE
> >> +     console_lock();
> >> +#endif
> >> +}
> >> +EXPORT_SYMBOL(fb_console_lock);
> >> +
> >> +void fb_console_unlock(void)
> >> +{
> >> +#ifdef CONFIG_FRAMEBUFFER_CONSOLE
> >> +     console_unlock();
> >> +#endif
> >> +}
> >> +EXPORT_SYMBOL(fb_console_unlock);
> >> +
> >>  int fb_get_color_depth(struct fb_var_screeninfo *var,
> >>                      struct fb_fix_screeninfo *fix)
> >>  {
> >> @@ -1101,11 +1117,11 @@ static long do_fb_ioctl(struct fb_info *info,
> >> unsigned int cmd,
> >>                       return -EFAULT;
> >>               if (!lock_fb_info(info))
> >>                       return -ENODEV;
> >> -             console_lock();
> >> +             fb_console_lock();
> >>               info->flags |= FBINFO_MISC_USEREVENT;
> >>               ret = fb_set_var(info, &var);
> >>               info->flags &= ~FBINFO_MISC_USEREVENT;
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>               unlock_fb_info(info);
> >>               if (!ret && copy_to_user(argp, &var, sizeof(var)))
> >>                       ret = -EFAULT;
> >> @@ -1137,9 +1153,9 @@ static long do_fb_ioctl(struct fb_info *info,
> >> unsigned int cmd,
> >>                       return -EFAULT;
> >>               if (!lock_fb_info(info))
> >>                       return -ENODEV;
> >> -             console_lock();
> >> +             fb_console_lock();
> >>               ret = fb_pan_display(info, &var);
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>               unlock_fb_info(info);
> >>               if (ret == 0 && copy_to_user(argp, &var, sizeof(var)))
> >>                       return -EFAULT;
> >> @@ -1184,11 +1200,11 @@ static long do_fb_ioctl(struct fb_info *info,
> >> unsigned int cmd,
> >>       case FBIOBLANK:
> >>               if (!lock_fb_info(info))
> >>                       return -ENODEV;
> >> -             console_lock();
> >> +             fb_console_lock();
> >>               info->flags |= FBINFO_MISC_USEREVENT;
> >>               ret = fb_blank(info, arg);
> >>               info->flags &= ~FBINFO_MISC_USEREVENT;
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>               unlock_fb_info(info);
> >>               break;
> >>       default:
> >> diff --git a/drivers/video/fbsysfs.c b/drivers/video/fbsysfs.c
> >> index a55e366..976d8f5 100644
> >> --- a/drivers/video/fbsysfs.c
> >> +++ b/drivers/video/fbsysfs.c
> >> @@ -18,7 +18,6 @@
> >>  #include <linux/kernel.h>
> >>  #include <linux/slab.h>
> >>  #include <linux/fb.h>
> >> -#include <linux/console.h>
> >>  #include <linux/module.h>
> >>
> >>  #define FB_SYSFS_FLAG_ATTR 1
> >> @@ -92,11 +91,11 @@ static int activate(struct fb_info *fb_info,
> >> struct fb_var_screeninfo *var)
> >>       int err;
> >>
> >>       var->activate |= FB_ACTIVATE_FORCE;
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       fb_info->flags |= FBINFO_MISC_USEREVENT;
> >>       err = fb_set_var(fb_info, var);
> >>       fb_info->flags &= ~FBINFO_MISC_USEREVENT;
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>       if (err)
> >>               return err;
> >>       return 0;
> >> @@ -177,7 +176,7 @@ static ssize_t store_modes(struct device *device,
> >>       if (i * sizeof(struct fb_videomode) != count)
> >>               return -EINVAL;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       list_splice(&fb_info->modelist, &old_list);
> >>       fb_videomode_to_modelist((const struct fb_videomode *)buf, i,
> >>                                &fb_info->modelist);
> >> @@ -187,7 +186,7 @@ static ssize_t store_modes(struct device *device,
> >>       } else
> >>               fb_destroy_modelist(&old_list);
> >>
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> @@ -303,11 +302,11 @@ static ssize_t store_blank(struct device *device,
> >>       char *last = NULL;
> >>       int err;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       fb_info->flags |= FBINFO_MISC_USEREVENT;
> >>       err = fb_blank(fb_info, simple_strtoul(buf, &last, 0));
> >>       fb_info->flags &= ~FBINFO_MISC_USEREVENT;
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>       if (err < 0)
> >>               return err;
> >>       return count;
> >> @@ -366,9 +365,9 @@ static ssize_t store_pan(struct device *device,
> >>               return -EINVAL;
> >>       var.yoffset = simple_strtoul(last, &last, 0);
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       err = fb_pan_display(fb_info, &var);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       if (err < 0)
> >>               return err;
> >> @@ -403,9 +402,9 @@ static ssize_t store_fbstate(struct device *device,
> >>
> >>       if (!lock_fb_info(fb_info))
> >>               return -ENODEV;
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       fb_set_suspend(fb_info, (int)state);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>       unlock_fb_info(fb_info);
> >>
> >>       return count;
> >> diff --git a/drivers/video/geode/gxfb_core.c b/drivers/video/geode/gxfb_core.c
> >> index b4f19db..ba7dd0a 100644
> >> --- a/drivers/video/geode/gxfb_core.c
> >> +++ b/drivers/video/geode/gxfb_core.c
> >> @@ -27,7 +27,6 @@
> >>  #include <linux/mm.h>
> >>  #include <linux/delay.h>
> >>  #include <linux/fb.h>
> >> -#include <linux/console.h>
> >>  #include <linux/suspend.h>
> >>  #include <linux/init.h>
> >>  #include <linux/pci.h>
> >> @@ -344,10 +343,10 @@ static int gxfb_suspend(struct pci_dev *pdev,
> >> pm_message_t state)
> >>       struct fb_info *info = pci_get_drvdata(pdev);
> >>
> >>       if (state.event == PM_EVENT_SUSPEND) {
> >> -             console_lock();
> >> +             fb_console_lock();
> >>               gx_powerdown(info);
> >>               fb_set_suspend(info, 1);
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>       }
> >>
> >>       /* there's no point in setting PCI states; we emulate PCI, so
> >> @@ -361,7 +360,7 @@ static int gxfb_resume(struct pci_dev *pdev)
> >>       struct fb_info *info = pci_get_drvdata(pdev);
> >>       int ret;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       ret = gx_powerup(info);
> >>       if (ret) {
> >>               printk(KERN_ERR "gxfb:  power up failed!\n");
> >> @@ -369,7 +368,7 @@ static int gxfb_resume(struct pci_dev *pdev)
> >>       }
> >>
> >>       fb_set_suspend(info, 0);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>       return 0;
> >>  }
> >>  #endif
> >> diff --git a/drivers/video/geode/lxfb_core.c b/drivers/video/geode/lxfb_core.c
> >> index 416851c..5341bf1 100644
> >> --- a/drivers/video/geode/lxfb_core.c
> >> +++ b/drivers/video/geode/lxfb_core.c
> >> @@ -465,10 +465,10 @@ static int lxfb_suspend(struct pci_dev *pdev,
> >> pm_message_t state)
> >>       struct fb_info *info = pci_get_drvdata(pdev);
> >>
> >>       if (state.event == PM_EVENT_SUSPEND) {
> >> -             console_lock();
> >> +             fb_console_lock();
> >>               lx_powerdown(info);
> >>               fb_set_suspend(info, 1);
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>       }
> >>
> >>       /* there's no point in setting PCI states; we emulate PCI, so
> >> @@ -482,7 +482,7 @@ static int lxfb_resume(struct pci_dev *pdev)
> >>       struct fb_info *info = pci_get_drvdata(pdev);
> >>       int ret;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       ret = lx_powerup(info);
> >>       if (ret) {
> >>               printk(KERN_ERR "lxfb:  power up failed!\n");
> >> @@ -490,7 +490,7 @@ static int lxfb_resume(struct pci_dev *pdev)
> >>       }
> >>
> >>       fb_set_suspend(info, 0);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>       return 0;
> >>  }
> >>  #else
> >> diff --git a/drivers/video/i740fb.c b/drivers/video/i740fb.c
> >> index ff3f880..b3fe538 100644
> >> --- a/drivers/video/i740fb.c
> >> +++ b/drivers/video/i740fb.c
> >> @@ -24,7 +24,6 @@
> >>  #include <linux/pci_ids.h>
> >>  #include <linux/i2c.h>
> >>  #include <linux/i2c-algo-bit.h>
> >> -#include <linux/console.h>
> >>  #include <video/vga.h>
> >>
> >>  #ifdef CONFIG_MTRR
> >> @@ -1210,13 +1209,13 @@ static int i740fb_suspend(struct pci_dev *dev,
> >> pm_message_t state)
> >>       if (state.event == PM_EVENT_FREEZE || state.event == PM_EVENT_PRETHAW)
> >>               return 0;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       mutex_lock(&(par->open_lock));
> >>
> >>       /* do nothing if framebuffer is not active */
> >>       if (par->ref_count == 0) {
> >>               mutex_unlock(&(par->open_lock));
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>               return 0;
> >>       }
> >>
> >> @@ -1227,7 +1226,7 @@ static int i740fb_suspend(struct pci_dev *dev,
> >> pm_message_t state)
> >>       pci_set_power_state(dev, pci_choose_state(dev, state));
> >>
> >>       mutex_unlock(&(par->open_lock));
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> @@ -1237,7 +1236,7 @@ static int i740fb_resume(struct pci_dev *dev)
> >>       struct fb_info *info = pci_get_drvdata(dev);
> >>       struct i740fb_par *par = info->par;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       mutex_lock(&(par->open_lock));
> >>
> >>       if (par->ref_count == 0)
> >> @@ -1253,7 +1252,7 @@ static int i740fb_resume(struct pci_dev *dev)
> >>
> >>  fail:
> >>       mutex_unlock(&(par->open_lock));
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>       return 0;
> >>  }
> >>  #else
> >> diff --git a/drivers/video/i810/i810_main.c b/drivers/video/i810/i810_main.c
> >> index b83f361..84fe1ed 100644
> >> --- a/drivers/video/i810/i810_main.c
> >> +++ b/drivers/video/i810/i810_main.c
> >> @@ -40,7 +40,6 @@
> >>  #include <linux/pci_ids.h>
> >>  #include <linux/resource.h>
> >>  #include <linux/unistd.h>
> >> -#include <linux/console.h>
> >>
> >>  #include <asm/io.h>
> >>  #include <asm/div64.h>
> >> @@ -1574,7 +1573,7 @@ static int i810fb_suspend(struct pci_dev *dev,
> >> pm_message_t mesg)
> >>               return 0;
> >>       }
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       fb_set_suspend(info, 1);
> >>
> >>       if (info->fbops->fb_sync)
> >> @@ -1587,7 +1586,7 @@ static int i810fb_suspend(struct pci_dev *dev,
> >> pm_message_t mesg)
> >>       pci_save_state(dev);
> >>       pci_disable_device(dev);
> >>       pci_set_power_state(dev, pci_choose_state(dev, mesg));
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> @@ -1605,7 +1604,7 @@ static int i810fb_resume(struct pci_dev *dev)
> >>               return 0;
> >>       }
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       pci_set_power_state(dev, PCI_D0);
> >>       pci_restore_state(dev);
> >>
> >> @@ -1621,7 +1620,7 @@ static int i810fb_resume(struct pci_dev *dev)
> >>       fb_set_suspend (info, 0);
> >>       info->fbops->fb_blank(VESA_NO_BLANKING, info);
> >>  fail:
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>       return 0;
> >>  }
> >>  /***********************************************************************
> >> diff --git a/drivers/video/jz4740_fb.c b/drivers/video/jz4740_fb.c
> >> index de36693..7e9301a 100644
> >> --- a/drivers/video/jz4740_fb.c
> >> +++ b/drivers/video/jz4740_fb.c
> >> @@ -21,7 +21,6 @@
> >>  #include <linux/clk.h>
> >>  #include <linux/delay.h>
> >>
> >> -#include <linux/console.h>
> >>  #include <linux/fb.h>
> >>
> >>  #include <linux/dma-mapping.h>
> >> @@ -778,9 +777,9 @@ static int jzfb_suspend(struct device *dev)
> >>  {
> >>       struct jzfb *jzfb = dev_get_drvdata(dev);
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       fb_set_suspend(jzfb->fb, 1);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       mutex_lock(&jzfb->lock);
> >>       if (jzfb->is_enabled)
> >> @@ -800,9 +799,9 @@ static int jzfb_resume(struct device *dev)
> >>               jzfb_enable(jzfb);
> >>       mutex_unlock(&jzfb->lock);
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       fb_set_suspend(jzfb->fb, 0);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> diff --git a/drivers/video/mx3fb.c b/drivers/video/mx3fb.c
> >> index c89f8a8..da25fa1 100644
> >> --- a/drivers/video/mx3fb.c
> >> +++ b/drivers/video/mx3fb.c
> >> @@ -23,7 +23,6 @@
> >>  #include <linux/ioport.h>
> >>  #include <linux/dma-mapping.h>
> >>  #include <linux/dmaengine.h>
> >> -#include <linux/console.h>
> >>  #include <linux/clk.h>
> >>  #include <linux/mutex.h>
> >>
> >> @@ -1204,9 +1203,9 @@ static int mx3fb_suspend(struct platform_device
> >> *pdev, pm_message_t state)
> >>       struct mx3fb_data *mx3fb = platform_get_drvdata(pdev);
> >>       struct mx3fb_info *mx3_fbi = mx3fb->fbi->par;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       fb_set_suspend(mx3fb->fbi, 1);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       if (mx3_fbi->blank == FB_BLANK_UNBLANK) {
> >>               sdc_disable_channel(mx3_fbi);
> >> @@ -1229,9 +1228,9 @@ static int mx3fb_resume(struct platform_device *pdev)
> >>               sdc_set_brightness(mx3fb, mx3fb->backlight_level);
> >>       }
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       fb_set_suspend(mx3fb->fbi, 0);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> diff --git a/drivers/video/nvidia/nvidia.c b/drivers/video/nvidia/nvidia.c
> >> index fe13ac5..f47eb2a 100644
> >> --- a/drivers/video/nvidia/nvidia.c
> >> +++ b/drivers/video/nvidia/nvidia.c
> >> @@ -19,7 +19,6 @@
> >>  #include <linux/fb.h>
> >>  #include <linux/init.h>
> >>  #include <linux/pci.h>
> >> -#include <linux/console.h>
> >>  #include <linux/backlight.h>
> >>  #ifdef CONFIG_MTRR
> >>  #include <asm/mtrr.h>
> >> @@ -1057,7 +1056,7 @@ static int nvidiafb_suspend(struct pci_dev *dev,
> >> pm_message_t mesg)
> >>
> >>       if (mesg.event == PM_EVENT_PRETHAW)
> >>               mesg.event = PM_EVENT_FREEZE;
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       par->pm_state = mesg.event;
> >>
> >>       if (mesg.event & PM_EVENT_SLEEP) {
> >> @@ -1070,7 +1069,7 @@ static int nvidiafb_suspend(struct pci_dev *dev,
> >> pm_message_t mesg)
> >>       }
> >>       dev->dev.power.power_state = mesg;
> >>
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>       return 0;
> >>  }
> >>
> >> @@ -1079,7 +1078,7 @@ static int nvidiafb_resume(struct pci_dev *dev)
> >>       struct fb_info *info = pci_get_drvdata(dev);
> >>       struct nvidia_par *par = info->par;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       pci_set_power_state(dev, PCI_D0);
> >>
> >>       if (par->pm_state != PM_EVENT_FREEZE) {
> >> @@ -1097,7 +1096,7 @@ static int nvidiafb_resume(struct pci_dev *dev)
> >>       nvidiafb_blank(FB_BLANK_UNBLANK, info);
> >>
> >>  fail:
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>       return 0;
> >>  }
> >>  #else
> >> diff --git a/drivers/video/ps3fb.c b/drivers/video/ps3fb.c
> >> index 213fbbc..cb2e174 100644
> >> --- a/drivers/video/ps3fb.c
> >> +++ b/drivers/video/ps3fb.c
> >> @@ -23,7 +23,6 @@
> >>  #include <linux/string.h>
> >>  #include <linux/mm.h>
> >>  #include <linux/interrupt.h>
> >> -#include <linux/console.h>
> >>  #include <linux/ioctl.h>
> >>  #include <linux/kthread.h>
> >>  #include <linux/freezer.h>
> >> @@ -515,7 +514,7 @@ static int ps3fb_release(struct fb_info *info, int user)
> >>                       atomic_set(&ps3fb.ext_flip, 0);
> >>                       if (console_trylock()) {
> >>                               ps3fb_sync(info, 0);    /* single buffer */
> >> -                             console_unlock();
> >> +                             fb_console_unlock();
> >>                       }
> >>               }
> >>       }
> >> @@ -830,14 +829,14 @@ static int ps3fb_ioctl(struct fb_info *info,
> >> unsigned int cmd,
> >>                       if (vmode) {
> >>                               var = info->var;
> >>                               fb_videomode_to_var(&var, vmode);
> >> -                             console_lock();
> >> +                             fb_console_lock();
> >>                               info->flags |= FBINFO_MISC_USEREVENT;
> >>                               /* Force, in case only special bits changed */
> >>                               var.activate |= FB_ACTIVATE_FORCE;
> >>                               par->new_mode_id = val;
> >>                               retval = fb_set_var(info, &var);
> >>                               info->flags &= ~FBINFO_MISC_USEREVENT;
> >> -                             console_unlock();
> >> +                             fb_console_unlock();
> >>                       }
> >>                       break;
> >>               }
> >> @@ -881,9 +880,9 @@ static int ps3fb_ioctl(struct fb_info *info,
> >> unsigned int cmd,
> >>                       break;
> >>
> >>               dev_dbg(info->device, "PS3FB_IOCTL_FSEL:%d\n", val);
> >> -             console_lock();
> >> +             fb_console_lock();
> >>               retval = ps3fb_sync(info, val);
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>               break;
> >>
> >>       default:
> >> @@ -903,9 +902,9 @@ static int ps3fbd(void *arg)
> >>               set_current_state(TASK_INTERRUPTIBLE);
> >>               if (ps3fb.is_kicked) {
> >>                       ps3fb.is_kicked = 0;
> >> -                     console_lock();
> >> +                     fb_console_lock();
> >>                       ps3fb_sync(info, 0);    /* single buffer */
> >> -                     console_unlock();
> >> +                     fb_console_unlock();
> >>               }
> >>               schedule();
> >>       }
> >> diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c
> >> index 3f90255..a1af212 100644
> >> --- a/drivers/video/pxafb.c
> >> +++ b/drivers/video/pxafb.c
> >> @@ -54,7 +54,6 @@
> >>  #include <linux/mutex.h>
> >>  #include <linux/kthread.h>
> >>  #include <linux/freezer.h>
> >> -#include <linux/console.h>
> >>
> >>  #include <mach/hardware.h>
> >>  #include <asm/io.h>
> >> @@ -733,9 +732,9 @@ static int overlayfb_open(struct fb_info *info, int user)
> >>
> >>       if (ofb->usage++ == 0) {
> >>               /* unblank the base framebuffer */
> >> -             console_lock();
> >> +             fb_console_lock();
> >>               fb_blank(&ofb->fbi->fb, FB_BLANK_UNBLANK);
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>       }
> >>
> >>       return 0;
> >> diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c
> >> index 1d00736..7759c82 100644
> >> --- a/drivers/video/s3fb.c
> >> +++ b/drivers/video/s3fb.c
> >> @@ -22,7 +22,6 @@
> >>  #include <linux/svga.h>
> >>  #include <linux/init.h>
> >>  #include <linux/pci.h>
> >> -#include <linux/console.h> /* Why should fb driver call console
> >> functions? because console_lock() */
> >>  #include <video/vga.h>
> >>
> >>  #include <linux/i2c.h>
> >> @@ -1445,12 +1444,12 @@ static int s3_pci_suspend(struct pci_dev* dev,
> >> pm_message_t state)
> >>
> >>       dev_info(info->device, "suspend\n");
> >>
> >> -     console_lock();
> >> +     fb_fb_console_lock();
> >>       mutex_lock(&(par->open_lock));
> >>
> >>       if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
> >>               mutex_unlock(&(par->open_lock));
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>               return 0;
> >>       }
> >>
> >> @@ -1461,7 +1460,7 @@ static int s3_pci_suspend(struct pci_dev* dev,
> >> pm_message_t state)
> >>       pci_set_power_state(dev, pci_choose_state(dev, state));
> >>
> >>       mutex_unlock(&(par->open_lock));
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> @@ -1477,12 +1476,12 @@ static int s3_pci_resume(struct pci_dev* dev)
> >>
> >>       dev_info(info->device, "resume\n");
> >>
> >> -     console_lock();
> >> +     fb_fb_console_lock();
> >>       mutex_lock(&(par->open_lock));
> >>
> >>       if (par->ref_count == 0) {
> >>               mutex_unlock(&(par->open_lock));
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>               return 0;
> >>       }
> >>
> >> @@ -1491,7 +1490,7 @@ static int s3_pci_resume(struct pci_dev* dev)
> >>       err = pci_enable_device(dev);
> >>       if (err) {
> >>               mutex_unlock(&(par->open_lock));
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>               dev_err(info->device, "error %d enabling device for resume\n", err);
> >>               return err;
> >>       }
> >> @@ -1501,7 +1500,7 @@ static int s3_pci_resume(struct pci_dev* dev)
> >>       fb_set_suspend(info, 0);
> >>
> >>       mutex_unlock(&(par->open_lock));
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> diff --git a/drivers/video/savage/savagefb_driver.c
> >> b/drivers/video/savage/savagefb_driver.c
> >> index 0d0f52c..bf64221 100644
> >> --- a/drivers/video/savage/savagefb_driver.c
> >> +++ b/drivers/video/savage/savagefb_driver.c
> >> @@ -51,7 +51,6 @@
> >>  #include <linux/fb.h>
> >>  #include <linux/pci.h>
> >>  #include <linux/init.h>
> >> -#include <linux/console.h>
> >>
> >>  #include <asm/io.h>
> >>  #include <asm/irq.h>
> >> @@ -2391,7 +2390,7 @@ static int savagefb_suspend(struct pci_dev *dev,
> >> pm_message_t mesg)
> >>       if (mesg.event == PM_EVENT_FREEZE)
> >>               return 0;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       fb_set_suspend(info, 1);
> >>
> >>       if (info->fbops->fb_sync)
> >> @@ -2403,7 +2402,7 @@ static int savagefb_suspend(struct pci_dev *dev,
> >> pm_message_t mesg)
> >>       pci_save_state(dev);
> >>       pci_disable_device(dev);
> >>       pci_set_power_state(dev, pci_choose_state(dev, mesg));
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> @@ -2427,7 +2426,7 @@ static int savagefb_resume(struct pci_dev* dev)
> >>               return 0;
> >>       }
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>
> >>       pci_set_power_state(dev, PCI_D0);
> >>       pci_restore_state(dev);
> >> @@ -2441,7 +2440,7 @@ static int savagefb_resume(struct pci_dev* dev)
> >>       savagefb_set_par(info);
> >>       fb_set_suspend(info, 0);
> >>       savagefb_blank(FB_BLANK_UNBLANK, info);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c
> >> index 699487c..2bc1119 100644
> >> --- a/drivers/video/sh_mobile_lcdcfb.c
> >> +++ b/drivers/video/sh_mobile_lcdcfb.c
> >> @@ -11,7 +11,6 @@
> >>  #include <linux/atomic.h>
> >>  #include <linux/backlight.h>
> >>  #include <linux/clk.h>
> >> -#include <linux/console.h>
> >>  #include <linux/ctype.h>
> >>  #include <linux/dma-mapping.h>
> >>  #include <linux/delay.h>
> >> @@ -575,7 +574,7 @@ static int sh_mobile_lcdc_display_notify(struct
> >> sh_mobile_lcdc_chan *ch,
> >>       case SH_MOBILE_LCDC_EVENT_DISPLAY_CONNECT:
> >>               /* HDMI plug in */
> >>               if (lock_fb_info(info)) {
> >> -                     console_lock();
> >> +                     fb_console_lock();
> >>
> >>                       ch->display.width = monspec->max_x * 10;
> >>                       ch->display.height = monspec->max_y * 10;
> >> @@ -594,7 +593,7 @@ static int sh_mobile_lcdc_display_notify(struct
> >> sh_mobile_lcdc_chan *ch,
> >>                               fb_set_suspend(info, 0);
> >>                       }
> >>
> >> -                     console_unlock();
> >> +                     fb_console_unlock();
> >>                       unlock_fb_info(info);
> >>               }
> >>               break;
> >> @@ -602,9 +601,9 @@ static int sh_mobile_lcdc_display_notify(struct
> >> sh_mobile_lcdc_chan *ch,
> >>       case SH_MOBILE_LCDC_EVENT_DISPLAY_DISCONNECT:
> >>               /* HDMI disconnect */
> >>               if (lock_fb_info(info)) {
> >> -                     console_lock();
> >> +                     fb_console_lock();
> >>                       fb_set_suspend(info, 1);
> >> -                     console_unlock();
> >> +                     fb_console_unlock();
> >>                       unlock_fb_info(info);
> >>               }
> >>               break;
> >> @@ -1934,9 +1933,9 @@ static int sh_mobile_lcdc_release(struct fb_info
> >> *info, int user)
> >>
> >>       /* Nothing to reconfigure, when called from fbcon */
> >>       if (user) {
> >> -             console_lock();
> >> +             fb_console_lock();
> >>               sh_mobile_fb_reconfig(info);
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>       }
> >>
> >>       mutex_unlock(&ch->open_lock);
> >> diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
> >> index 3690eff..536f922 100644
> >> --- a/drivers/video/sm501fb.c
> >> +++ b/drivers/video/sm501fb.c
> >> @@ -28,7 +28,6 @@
> >>  #include <linux/wait.h>
> >>  #include <linux/platform_device.h>
> >>  #include <linux/clk.h>
> >> -#include <linux/console.h>
> >>  #include <linux/io.h>
> >>
> >>  #include <asm/uaccess.h>
> >> @@ -2104,9 +2103,9 @@ static int sm501fb_suspend_fb(struct sm501fb_info *info,
> >>
> >>       /* tell console/fb driver we are suspending */
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       fb_set_suspend(fbi, 1);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       /* backup copies in case chip is powered down over suspend */
> >>
> >> @@ -2163,9 +2162,9 @@ static void sm501fb_resume_fb(struct sm501fb_info *info,
> >>               memcpy_toio(par->cursor.k_addr, par->store_cursor,
> >>                           par->cursor.size);
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       fb_set_suspend(fbi, 0);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       vfree(par->store_fb);
> >>       vfree(par->store_cursor);
> >> diff --git a/drivers/video/tmiofb.c b/drivers/video/tmiofb.c
> >> index 8e4a446..e266b6b 100644
> >> --- a/drivers/video/tmiofb.c
> >> +++ b/drivers/video/tmiofb.c
> >> @@ -25,8 +25,7 @@
> >>  #include <linux/fb.h>
> >>  #include <linux/interrupt.h>
> >>  #include <linux/delay.h>
> >> -/* Why should fb driver call console functions? because console_lock() */
> >> -#include <linux/console.h>
> >> +/* Why should fb driver call console functions? because fb_console_lock() */
> >>  #include <linux/mfd/core.h>
> >>  #include <linux/mfd/tmio.h>
> >>  #include <linux/uaccess.h>
> >> @@ -938,7 +937,7 @@ static int tmiofb_suspend(struct platform_device
> >> *dev, pm_message_t state)
> >>       const struct mfd_cell *cell = mfd_get_cell(dev);
> >>       int retval = 0;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>
> >>       fb_set_suspend(info, 1);
> >>
> >> @@ -959,7 +958,7 @@ static int tmiofb_suspend(struct platform_device
> >> *dev, pm_message_t state)
> >>       if (cell->suspend)
> >>               retval = cell->suspend(dev);
> >>
> >> -     console_unlock();
> >> +     fb_fb_console_unlock();
> >>
> >>       return retval;
> >>  }
> >> @@ -970,7 +969,7 @@ static int tmiofb_resume(struct platform_device *dev)
> >>       const struct mfd_cell *cell = mfd_get_cell(dev);
> >>       int retval = 0;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>
> >>       if (cell->resume) {
> >>               retval = cell->resume(dev);
> >> @@ -986,7 +985,7 @@ static int tmiofb_resume(struct platform_device *dev)
> >>
> >>       fb_set_suspend(info, 0);
> >>  out:
> >> -     console_unlock();
> >> +     fb_fb_console_unlock();
> >>       return retval;
> >>  }
> >>  #else
> >> diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c
> >> index c80e770..d36b173 100644
> >> --- a/drivers/video/via/viafbdev.c
> >> +++ b/drivers/video/via/viafbdev.c
> >> @@ -1698,17 +1698,17 @@ static int parse_mode(const char *str, u32
> >> devices, u32 *xres, u32 *yres)
> >>  #ifdef CONFIG_PM
> >>  static int viafb_suspend(void *unused)
> >>  {
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       fb_set_suspend(viafbinfo, 1);
> >>       viafb_sync(viafbinfo);
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >>
> >>  static int viafb_resume(void *unused)
> >>  {
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       if (viaparinfo->shared->vdev->engine_mmio)
> >>               viafb_reset_engine(viaparinfo);
> >>       viafb_set_par(viafbinfo);
> >> @@ -1716,7 +1716,7 @@ static int viafb_resume(void *unused)
> >>               viafb_set_par(viafbinfo1);
> >>       fb_set_suspend(viafbinfo, 0);
> >>
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>       return 0;
> >>  }
> >>
> >> diff --git a/drivers/video/vt8623fb.c b/drivers/video/vt8623fb.c
> >> index 4e74d26..cb48d4d 100644
> >> --- a/drivers/video/vt8623fb.c
> >> +++ b/drivers/video/vt8623fb.c
> >> @@ -23,7 +23,6 @@
> >>  #include <linux/svga.h>
> >>  #include <linux/init.h>
> >>  #include <linux/pci.h>
> >> -#include <linux/console.h> /* Why should fb driver call console
> >> functions? because console_lock() */
> >>  #include <video/vga.h>
> >>
> >>  #ifdef CONFIG_MTRR
> >> @@ -845,12 +844,12 @@ static int vt8623_pci_suspend(struct pci_dev*
> >> dev, pm_message_t state)
> >>
> >>       dev_info(info->device, "suspend\n");
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       mutex_lock(&(par->open_lock));
> >>
> >>       if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
> >>               mutex_unlock(&(par->open_lock));
> >> -             console_unlock();
> >> +             fb_console_unlock();
> >>               return 0;
> >>       }
> >>
> >> @@ -861,7 +860,7 @@ static int vt8623_pci_suspend(struct pci_dev* dev,
> >> pm_message_t state)
> >>       pci_set_power_state(dev, pci_choose_state(dev, state));
> >>
> >>       mutex_unlock(&(par->open_lock));
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> @@ -876,7 +875,7 @@ static int vt8623_pci_resume(struct pci_dev* dev)
> >>
> >>       dev_info(info->device, "resume\n");
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       mutex_lock(&(par->open_lock));
> >>
> >>       if (par->ref_count == 0)
> >> @@ -895,7 +894,7 @@ static int vt8623_pci_resume(struct pci_dev* dev)
> >>
> >>  fail:
> >>       mutex_unlock(&(par->open_lock));
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>
> >>       return 0;
> >>  }
> >> diff --git a/drivers/video/xen-fbfront.c b/drivers/video/xen-fbfront.c
> >> index b7f5173..770397e7 100644
> >> --- a/drivers/video/xen-fbfront.c
> >> +++ b/drivers/video/xen-fbfront.c
> >> @@ -18,7 +18,6 @@
> >>   * frame buffer.
> >>   */
> >>
> >> -#include <linux/console.h>
> >>  #include <linux/kernel.h>
> >>  #include <linux/errno.h>
> >>  #include <linux/fb.h>
> >> @@ -495,12 +494,12 @@ xenfb_make_preferred_console(void)
> >>       if (console_set_on_cmdline)
> >>               return;
> >>
> >> -     console_lock();
> >> +     fb_console_lock();
> >>       for_each_console(c) {
> >>               if (!strcmp(c->name, "tty") && c->index == 0)
> >>                       break;
> >>       }
> >> -     console_unlock();
> >> +     fb_console_unlock();
> >>       if (c) {
> >>               unregister_console(c);
> >>               c->flags |= CON_CONSDEV;
> >> diff --git a/include/linux/fb.h b/include/linux/fb.h
> >> index ac3f1c6..7ae96ad 100644
> >> --- a/include/linux/fb.h
> >> +++ b/include/linux/fb.h
> >> @@ -1021,6 +1021,8 @@ extern int fb_get_color_depth(struct
> >> fb_var_screeninfo *var,
> >>                             struct fb_fix_screeninfo *fix);
> >>  extern int fb_get_options(char *name, char **option);
> >>  extern int fb_new_modelist(struct fb_info *info);
> >> +extern void fb_console_unlock(void);
> >> +extern void fb_console_lock(void);
> >>
> >>  extern struct fb_info *registered_fb[FB_MAX];
> >>  extern int num_registered_fb;
> >
> >


--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jun Nie Sept. 29, 2012, 10:46 a.m. UTC | #6
2012/9/29 Benjamin Herrenschmidt <benh@kernel.crashing.org>:
> On Sat, 2012-09-29 at 14:03 +0800, Jun Nie wrote:
>
>> Hi Ben,
>>     Yes. If framebuffer console is disabled, I do not see any need to
>> hold console lock in FB. Please help indicate the risk if any. Thanks!
>
> Because there is no other lock left in the entire fbdev layer.. a lot of
> fbdev drivers have no locking of their own and rely on the console
> semaphore in more than one way.
>
> Ben.
>
How about to add another fb_mutex? FB driver can only hold it when
framebuffer console is disabled, while hold both when fb console is
enabled.


>> Jun
>> >> Signed-off-by: Jun Nie <njun@marvell.com>
>> >> ---
>> >>  drivers/video/arkfb.c                  |   11 +++++------
>> >>  drivers/video/aty/aty128fb.c           |   11 +++++------
>> >>  drivers/video/aty/atyfb_base.c         |   11 +++++------
>> >>  drivers/video/aty/radeon_pm.c          |    9 ++++-----
>> >>  drivers/video/chipsfb.c                |    8 ++++----
>> >>  drivers/video/da8xx-fb.c               |    9 ++++-----
>> >>  drivers/video/fb-puv3.c                |    9 ++++-----
>> >>  drivers/video/fbmem.c                  |   28 ++++++++++++++++++++++------
>> >>  drivers/video/fbsysfs.c                |   21 ++++++++++-----------
>> >>  drivers/video/geode/gxfb_core.c        |    9 ++++-----
>> >>  drivers/video/geode/lxfb_core.c        |    8 ++++----
>> >>  drivers/video/i740fb.c                 |   11 +++++------
>> >>  drivers/video/i810/i810_main.c         |    9 ++++-----
>> >>  drivers/video/jz4740_fb.c              |    9 ++++-----
>> >>  drivers/video/mx3fb.c                  |    9 ++++-----
>> >>  drivers/video/nvidia/nvidia.c          |    9 ++++-----
>> >>  drivers/video/ps3fb.c                  |   15 +++++++--------
>> >>  drivers/video/pxafb.c                  |    5 ++---
>> >>  drivers/video/s3fb.c                   |   15 +++++++--------
>> >>  drivers/video/savage/savagefb_driver.c |    9 ++++-----
>> >>  drivers/video/sh_mobile_lcdcfb.c       |   13 ++++++-------
>> >>  drivers/video/sm501fb.c                |    9 ++++-----
>> >>  drivers/video/tmiofb.c                 |   11 +++++------
>> >>  drivers/video/via/viafbdev.c           |    8 ++++----
>> >>  drivers/video/vt8623fb.c               |   11 +++++------
>> >>  drivers/video/xen-fbfront.c            |    5 ++---
>> >>  include/linux/fb.h                     |    2 ++
>> >>  27 files changed, 140 insertions(+), 144 deletions(-)
>> >>
>> >> diff --git a/drivers/video/arkfb.c b/drivers/video/arkfb.c
>> >> index 555dd4c..774d902 100644
>> >> --- a/drivers/video/arkfb.c
>> >> +++ b/drivers/video/arkfb.c
>> >> @@ -23,7 +23,6 @@
>> >>  #include <linux/svga.h>
>> >>  #include <linux/init.h>
>> >>  #include <linux/pci.h>
>> >> -#include <linux/console.h> /* Why should fb driver call console
>> >> functions? because console_lock() */
>> >>  #include <video/vga.h>
>> >>
>> >>  #ifdef CONFIG_MTRR
>> >> @@ -1124,12 +1123,12 @@ static int ark_pci_suspend (struct pci_dev*
>> >> dev, pm_message_t state)
>> >>
>> >>       dev_info(info->device, "suspend\n");
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       mutex_lock(&(par->open_lock));
>> >>
>> >>       if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
>> >>               mutex_unlock(&(par->open_lock));
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>               return 0;
>> >>       }
>> >>
>> >> @@ -1140,7 +1139,7 @@ static int ark_pci_suspend (struct pci_dev* dev,
>> >> pm_message_t state)
>> >>       pci_set_power_state(dev, pci_choose_state(dev, state));
>> >>
>> >>       mutex_unlock(&(par->open_lock));
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> @@ -1155,7 +1154,7 @@ static int ark_pci_resume (struct pci_dev* dev)
>> >>
>> >>       dev_info(info->device, "resume\n");
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       mutex_lock(&(par->open_lock));
>> >>
>> >>       if (par->ref_count == 0)
>> >> @@ -1174,7 +1173,7 @@ static int ark_pci_resume (struct pci_dev* dev)
>> >>
>> >>  fail:
>> >>       mutex_unlock(&(par->open_lock));
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>       return 0;
>> >>  }
>> >>  #else
>> >> diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c
>> >> index 747442d..1c6b80b 100644
>> >> --- a/drivers/video/aty/aty128fb.c
>> >> +++ b/drivers/video/aty/aty128fb.c
>> >> @@ -60,7 +60,6 @@
>> >>  #include <linux/init.h>
>> >>  #include <linux/pci.h>
>> >>  #include <linux/ioport.h>
>> >> -#include <linux/console.h>
>> >>  #include <linux/backlight.h>
>> >>  #include <asm/io.h>
>> >>
>> >> @@ -1884,7 +1883,7 @@ static void aty128_early_resume(void *data)
>> >>               return;
>> >>       pci_restore_state(par->pdev);
>> >>       aty128_do_resume(par->pdev);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>  }
>> >>  #endif /* CONFIG_PPC_PMAC */
>> >>
>> >> @@ -2461,7 +2460,7 @@ static int aty128_pci_suspend(struct pci_dev
>> >> *pdev, pm_message_t state)
>> >>
>> >>       printk(KERN_DEBUG "aty128fb: suspending...\n");
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>
>> >>       fb_set_suspend(info, 1);
>> >>
>> >> @@ -2493,7 +2492,7 @@ static int aty128_pci_suspend(struct pci_dev
>> >> *pdev, pm_message_t state)
>> >>       if (state.event != PM_EVENT_ON)
>> >>               aty128_set_suspend(par, 1);
>> >>
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       pdev->dev.power.power_state = state;
>> >>
>> >> @@ -2550,9 +2549,9 @@ static int aty128_pci_resume(struct pci_dev *pdev)
>> >>  {
>> >>       int rc;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       rc = aty128_do_resume(pdev);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return rc;
>> >>  }
>> >> diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c
>> >> index 3f2e8c1..9bb15ab 100644
>> >> --- a/drivers/video/aty/atyfb_base.c
>> >> +++ b/drivers/video/aty/atyfb_base.c
>> >> @@ -58,7 +58,6 @@
>> >>  #include <linux/slab.h>
>> >>  #include <linux/vmalloc.h>
>> >>  #include <linux/delay.h>
>> >> -#include <linux/console.h>
>> >>  #include <linux/fb.h>
>> >>  #include <linux/init.h>
>> >>  #include <linux/pci.h>
>> >> @@ -2065,7 +2064,7 @@ static int atyfb_pci_suspend(struct pci_dev
>> >> *pdev, pm_message_t state)
>> >>       if (state.event == pdev->dev.power.power_state.event)
>> >>               return 0;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>
>> >>       fb_set_suspend(info, 1);
>> >>
>> >> @@ -2093,14 +2092,14 @@ static int atyfb_pci_suspend(struct pci_dev
>> >> *pdev, pm_message_t state)
>> >>               par->lock_blank = 0;
>> >>               atyfb_blank(FB_BLANK_UNBLANK, info);
>> >>               fb_set_suspend(info, 0);
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>               return -EIO;
>> >>       }
>> >>  #else
>> >>       pci_set_power_state(pdev, pci_choose_state(pdev, state));
>> >>  #endif
>> >>
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       pdev->dev.power.power_state = state;
>> >>
>> >> @@ -2129,7 +2128,7 @@ static int atyfb_pci_resume(struct pci_dev *pdev)
>> >>       if (pdev->dev.power.power_state.event == PM_EVENT_ON)
>> >>               return 0;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>
>> >>       /*
>> >>        * PCI state will have been restored by the core, so
>> >> @@ -2157,7 +2156,7 @@ static int atyfb_pci_resume(struct pci_dev *pdev)
>> >>       par->lock_blank = 0;
>> >>       atyfb_blank(FB_BLANK_UNBLANK, info);
>> >>
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       pdev->dev.power.power_state = PMSG_ON;
>> >>
>> >> diff --git a/drivers/video/aty/radeon_pm.c b/drivers/video/aty/radeon_pm.c
>> >> index 92bda58..a2f07da 100644
>> >> --- a/drivers/video/aty/radeon_pm.c
>> >> +++ b/drivers/video/aty/radeon_pm.c
>> >> @@ -16,7 +16,6 @@
>> >>
>> >>  #include "radeonfb.h"
>> >>
>> >> -#include <linux/console.h>
>> >>  #include <linux/agp_backend.h>
>> >>
>> >>  #ifdef CONFIG_PPC_PMAC
>> >> @@ -2626,7 +2625,7 @@ int radeonfb_pci_suspend(struct pci_dev *pdev,
>> >> pm_message_t mesg)
>> >>               goto done;
>> >>       }
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>
>> >>       fb_set_suspend(info, 1);
>> >>
>> >> @@ -2690,7 +2689,7 @@ int radeonfb_pci_suspend(struct pci_dev *pdev,
>> >> pm_message_t mesg)
>> >>       if (rinfo->pm_mode & radeon_pm_d2)
>> >>               radeon_set_suspend(rinfo, 1);
>> >>
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>   done:
>> >>       pdev->dev.power.power_state = mesg;
>> >> @@ -2718,7 +2717,7 @@ int radeonfb_pci_resume(struct pci_dev *pdev)
>> >>               if (!console_trylock())
>> >>                       return 0;
>> >>       } else
>> >> -             console_lock();
>> >> +             fb_console_lock();
>> >>
>> >>       printk(KERN_DEBUG "radeonfb (%s): resuming from state: %d...\n",
>> >>              pci_name(pdev), pdev->dev.power.power_state.event);
>> >> @@ -2783,7 +2782,7 @@ int radeonfb_pci_resume(struct pci_dev *pdev)
>> >>       pdev->dev.power.power_state = PMSG_ON;
>> >>
>> >>   bail:
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return rc;
>> >>  }
>> >> diff --git a/drivers/video/chipsfb.c b/drivers/video/chipsfb.c
>> >> index cff742a..d50fa6b 100644
>> >> --- a/drivers/video/chipsfb.c
>> >> +++ b/drivers/video/chipsfb.c
>> >> @@ -460,10 +460,10 @@ static int chipsfb_pci_suspend(struct pci_dev
>> >> *pdev, pm_message_t state)
>> >>       if (!(state.event & PM_EVENT_SLEEP))
>> >>               goto done;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       chipsfb_blank(1, p);
>> >>       fb_set_suspend(p, 1);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>   done:
>> >>       pdev->dev.power.power_state = state;
>> >>       return 0;
>> >> @@ -473,10 +473,10 @@ static int chipsfb_pci_resume(struct pci_dev *pdev)
>> >>  {
>> >>          struct fb_info *p = pci_get_drvdata(pdev);
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       fb_set_suspend(p, 0);
>> >>       chipsfb_blank(0, p);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       pdev->dev.power.power_state = PMSG_ON;
>> >>       return 0;
>> >> diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
>> >> index 7ae9d53..9a36bbc 100644
>> >> --- a/drivers/video/da8xx-fb.c
>> >> +++ b/drivers/video/da8xx-fb.c
>> >> @@ -29,7 +29,6 @@
>> >>  #include <linux/interrupt.h>
>> >>  #include <linux/clk.h>
>> >>  #include <linux/cpufreq.h>
>> >> -#include <linux/console.h>
>> >>  #include <linux/spinlock.h>
>> >>  #include <linux/slab.h>
>> >>  #include <linux/delay.h>
>> >> @@ -1406,14 +1405,14 @@ static int fb_suspend(struct platform_device
>> >> *dev, pm_message_t state)
>> >>       struct fb_info *info = platform_get_drvdata(dev);
>> >>       struct da8xx_fb_par *par = info->par;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       if (par->panel_power_ctrl)
>> >>               par->panel_power_ctrl(0);
>> >>
>> >>       fb_set_suspend(info, 1);
>> >>       lcd_disable_raster();
>> >>       clk_disable(par->lcdc_clk);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> @@ -1422,7 +1421,7 @@ static int fb_resume(struct platform_device *dev)
>> >>       struct fb_info *info = platform_get_drvdata(dev);
>> >>       struct da8xx_fb_par *par = info->par;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       clk_enable(par->lcdc_clk);
>> >>       lcd_enable_raster();
>> >>
>> >> @@ -1430,7 +1429,7 @@ static int fb_resume(struct platform_device *dev)
>> >>               par->panel_power_ctrl(1);
>> >>
>> >>       fb_set_suspend(info, 0);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> diff --git a/drivers/video/fb-puv3.c b/drivers/video/fb-puv3.c
>> >> index 60a787f..87c8c4e 100644
>> >> --- a/drivers/video/fb-puv3.c
>> >> +++ b/drivers/video/fb-puv3.c
>> >> @@ -17,7 +17,6 @@
>> >>  #include <linux/clk.h>
>> >>  #include <linux/fb.h>
>> >>  #include <linux/init.h>
>> >> -#include <linux/console.h>
>> >>
>> >>  #include <asm/sizes.h>
>> >>  #include <mach/hardware.h>
>> >> @@ -759,7 +758,7 @@ static int unifb_resume(struct platform_device *dev)
>> >>       if (dev->dev.power.power_state.event == PM_EVENT_ON)
>> >>               return 0;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>
>> >>       if (dev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
>> >>               writel(unifb_regs[0], UDE_FSA);
>> >> @@ -775,7 +774,7 @@ static int unifb_resume(struct platform_device *dev)
>> >>       }
>> >>       dev->dev.power.power_state = PMSG_ON;
>> >>
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return rc;
>> >>  }
>> >> @@ -804,11 +803,11 @@ static int unifb_suspend(struct platform_device
>> >> *dev, pm_message_t mesg)
>> >>               goto done;
>> >>       }
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>
>> >>       /* do nothing... */
>> >>
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>  done:
>> >>       dev->dev.power.power_state = mesg;
>> >> diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
>> >> index 0dff12a..c2d4627 100644
>> >> --- a/drivers/video/fbmem.c
>> >> +++ b/drivers/video/fbmem.c
>> >> @@ -85,6 +85,22 @@ EXPORT_SYMBOL(lock_fb_info);
>> >>   * Helpers
>> >>   */
>> >>
>> >> +void fb_console_lock(void)
>> >> +{
>> >> +#ifdef CONFIG_FRAMEBUFFER_CONSOLE
>> >> +     console_lock();
>> >> +#endif
>> >> +}
>> >> +EXPORT_SYMBOL(fb_console_lock);
>> >> +
>> >> +void fb_console_unlock(void)
>> >> +{
>> >> +#ifdef CONFIG_FRAMEBUFFER_CONSOLE
>> >> +     console_unlock();
>> >> +#endif
>> >> +}
>> >> +EXPORT_SYMBOL(fb_console_unlock);
>> >> +
>> >>  int fb_get_color_depth(struct fb_var_screeninfo *var,
>> >>                      struct fb_fix_screeninfo *fix)
>> >>  {
>> >> @@ -1101,11 +1117,11 @@ static long do_fb_ioctl(struct fb_info *info,
>> >> unsigned int cmd,
>> >>                       return -EFAULT;
>> >>               if (!lock_fb_info(info))
>> >>                       return -ENODEV;
>> >> -             console_lock();
>> >> +             fb_console_lock();
>> >>               info->flags |= FBINFO_MISC_USEREVENT;
>> >>               ret = fb_set_var(info, &var);
>> >>               info->flags &= ~FBINFO_MISC_USEREVENT;
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>               unlock_fb_info(info);
>> >>               if (!ret && copy_to_user(argp, &var, sizeof(var)))
>> >>                       ret = -EFAULT;
>> >> @@ -1137,9 +1153,9 @@ static long do_fb_ioctl(struct fb_info *info,
>> >> unsigned int cmd,
>> >>                       return -EFAULT;
>> >>               if (!lock_fb_info(info))
>> >>                       return -ENODEV;
>> >> -             console_lock();
>> >> +             fb_console_lock();
>> >>               ret = fb_pan_display(info, &var);
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>               unlock_fb_info(info);
>> >>               if (ret == 0 && copy_to_user(argp, &var, sizeof(var)))
>> >>                       return -EFAULT;
>> >> @@ -1184,11 +1200,11 @@ static long do_fb_ioctl(struct fb_info *info,
>> >> unsigned int cmd,
>> >>       case FBIOBLANK:
>> >>               if (!lock_fb_info(info))
>> >>                       return -ENODEV;
>> >> -             console_lock();
>> >> +             fb_console_lock();
>> >>               info->flags |= FBINFO_MISC_USEREVENT;
>> >>               ret = fb_blank(info, arg);
>> >>               info->flags &= ~FBINFO_MISC_USEREVENT;
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>               unlock_fb_info(info);
>> >>               break;
>> >>       default:
>> >> diff --git a/drivers/video/fbsysfs.c b/drivers/video/fbsysfs.c
>> >> index a55e366..976d8f5 100644
>> >> --- a/drivers/video/fbsysfs.c
>> >> +++ b/drivers/video/fbsysfs.c
>> >> @@ -18,7 +18,6 @@
>> >>  #include <linux/kernel.h>
>> >>  #include <linux/slab.h>
>> >>  #include <linux/fb.h>
>> >> -#include <linux/console.h>
>> >>  #include <linux/module.h>
>> >>
>> >>  #define FB_SYSFS_FLAG_ATTR 1
>> >> @@ -92,11 +91,11 @@ static int activate(struct fb_info *fb_info,
>> >> struct fb_var_screeninfo *var)
>> >>       int err;
>> >>
>> >>       var->activate |= FB_ACTIVATE_FORCE;
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       fb_info->flags |= FBINFO_MISC_USEREVENT;
>> >>       err = fb_set_var(fb_info, var);
>> >>       fb_info->flags &= ~FBINFO_MISC_USEREVENT;
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>       if (err)
>> >>               return err;
>> >>       return 0;
>> >> @@ -177,7 +176,7 @@ static ssize_t store_modes(struct device *device,
>> >>       if (i * sizeof(struct fb_videomode) != count)
>> >>               return -EINVAL;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       list_splice(&fb_info->modelist, &old_list);
>> >>       fb_videomode_to_modelist((const struct fb_videomode *)buf, i,
>> >>                                &fb_info->modelist);
>> >> @@ -187,7 +186,7 @@ static ssize_t store_modes(struct device *device,
>> >>       } else
>> >>               fb_destroy_modelist(&old_list);
>> >>
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> @@ -303,11 +302,11 @@ static ssize_t store_blank(struct device *device,
>> >>       char *last = NULL;
>> >>       int err;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       fb_info->flags |= FBINFO_MISC_USEREVENT;
>> >>       err = fb_blank(fb_info, simple_strtoul(buf, &last, 0));
>> >>       fb_info->flags &= ~FBINFO_MISC_USEREVENT;
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>       if (err < 0)
>> >>               return err;
>> >>       return count;
>> >> @@ -366,9 +365,9 @@ static ssize_t store_pan(struct device *device,
>> >>               return -EINVAL;
>> >>       var.yoffset = simple_strtoul(last, &last, 0);
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       err = fb_pan_display(fb_info, &var);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       if (err < 0)
>> >>               return err;
>> >> @@ -403,9 +402,9 @@ static ssize_t store_fbstate(struct device *device,
>> >>
>> >>       if (!lock_fb_info(fb_info))
>> >>               return -ENODEV;
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       fb_set_suspend(fb_info, (int)state);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>       unlock_fb_info(fb_info);
>> >>
>> >>       return count;
>> >> diff --git a/drivers/video/geode/gxfb_core.c b/drivers/video/geode/gxfb_core.c
>> >> index b4f19db..ba7dd0a 100644
>> >> --- a/drivers/video/geode/gxfb_core.c
>> >> +++ b/drivers/video/geode/gxfb_core.c
>> >> @@ -27,7 +27,6 @@
>> >>  #include <linux/mm.h>
>> >>  #include <linux/delay.h>
>> >>  #include <linux/fb.h>
>> >> -#include <linux/console.h>
>> >>  #include <linux/suspend.h>
>> >>  #include <linux/init.h>
>> >>  #include <linux/pci.h>
>> >> @@ -344,10 +343,10 @@ static int gxfb_suspend(struct pci_dev *pdev,
>> >> pm_message_t state)
>> >>       struct fb_info *info = pci_get_drvdata(pdev);
>> >>
>> >>       if (state.event == PM_EVENT_SUSPEND) {
>> >> -             console_lock();
>> >> +             fb_console_lock();
>> >>               gx_powerdown(info);
>> >>               fb_set_suspend(info, 1);
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>       }
>> >>
>> >>       /* there's no point in setting PCI states; we emulate PCI, so
>> >> @@ -361,7 +360,7 @@ static int gxfb_resume(struct pci_dev *pdev)
>> >>       struct fb_info *info = pci_get_drvdata(pdev);
>> >>       int ret;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       ret = gx_powerup(info);
>> >>       if (ret) {
>> >>               printk(KERN_ERR "gxfb:  power up failed!\n");
>> >> @@ -369,7 +368,7 @@ static int gxfb_resume(struct pci_dev *pdev)
>> >>       }
>> >>
>> >>       fb_set_suspend(info, 0);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>       return 0;
>> >>  }
>> >>  #endif
>> >> diff --git a/drivers/video/geode/lxfb_core.c b/drivers/video/geode/lxfb_core.c
>> >> index 416851c..5341bf1 100644
>> >> --- a/drivers/video/geode/lxfb_core.c
>> >> +++ b/drivers/video/geode/lxfb_core.c
>> >> @@ -465,10 +465,10 @@ static int lxfb_suspend(struct pci_dev *pdev,
>> >> pm_message_t state)
>> >>       struct fb_info *info = pci_get_drvdata(pdev);
>> >>
>> >>       if (state.event == PM_EVENT_SUSPEND) {
>> >> -             console_lock();
>> >> +             fb_console_lock();
>> >>               lx_powerdown(info);
>> >>               fb_set_suspend(info, 1);
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>       }
>> >>
>> >>       /* there's no point in setting PCI states; we emulate PCI, so
>> >> @@ -482,7 +482,7 @@ static int lxfb_resume(struct pci_dev *pdev)
>> >>       struct fb_info *info = pci_get_drvdata(pdev);
>> >>       int ret;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       ret = lx_powerup(info);
>> >>       if (ret) {
>> >>               printk(KERN_ERR "lxfb:  power up failed!\n");
>> >> @@ -490,7 +490,7 @@ static int lxfb_resume(struct pci_dev *pdev)
>> >>       }
>> >>
>> >>       fb_set_suspend(info, 0);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>       return 0;
>> >>  }
>> >>  #else
>> >> diff --git a/drivers/video/i740fb.c b/drivers/video/i740fb.c
>> >> index ff3f880..b3fe538 100644
>> >> --- a/drivers/video/i740fb.c
>> >> +++ b/drivers/video/i740fb.c
>> >> @@ -24,7 +24,6 @@
>> >>  #include <linux/pci_ids.h>
>> >>  #include <linux/i2c.h>
>> >>  #include <linux/i2c-algo-bit.h>
>> >> -#include <linux/console.h>
>> >>  #include <video/vga.h>
>> >>
>> >>  #ifdef CONFIG_MTRR
>> >> @@ -1210,13 +1209,13 @@ static int i740fb_suspend(struct pci_dev *dev,
>> >> pm_message_t state)
>> >>       if (state.event == PM_EVENT_FREEZE || state.event == PM_EVENT_PRETHAW)
>> >>               return 0;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       mutex_lock(&(par->open_lock));
>> >>
>> >>       /* do nothing if framebuffer is not active */
>> >>       if (par->ref_count == 0) {
>> >>               mutex_unlock(&(par->open_lock));
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>               return 0;
>> >>       }
>> >>
>> >> @@ -1227,7 +1226,7 @@ static int i740fb_suspend(struct pci_dev *dev,
>> >> pm_message_t state)
>> >>       pci_set_power_state(dev, pci_choose_state(dev, state));
>> >>
>> >>       mutex_unlock(&(par->open_lock));
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> @@ -1237,7 +1236,7 @@ static int i740fb_resume(struct pci_dev *dev)
>> >>       struct fb_info *info = pci_get_drvdata(dev);
>> >>       struct i740fb_par *par = info->par;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       mutex_lock(&(par->open_lock));
>> >>
>> >>       if (par->ref_count == 0)
>> >> @@ -1253,7 +1252,7 @@ static int i740fb_resume(struct pci_dev *dev)
>> >>
>> >>  fail:
>> >>       mutex_unlock(&(par->open_lock));
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>       return 0;
>> >>  }
>> >>  #else
>> >> diff --git a/drivers/video/i810/i810_main.c b/drivers/video/i810/i810_main.c
>> >> index b83f361..84fe1ed 100644
>> >> --- a/drivers/video/i810/i810_main.c
>> >> +++ b/drivers/video/i810/i810_main.c
>> >> @@ -40,7 +40,6 @@
>> >>  #include <linux/pci_ids.h>
>> >>  #include <linux/resource.h>
>> >>  #include <linux/unistd.h>
>> >> -#include <linux/console.h>
>> >>
>> >>  #include <asm/io.h>
>> >>  #include <asm/div64.h>
>> >> @@ -1574,7 +1573,7 @@ static int i810fb_suspend(struct pci_dev *dev,
>> >> pm_message_t mesg)
>> >>               return 0;
>> >>       }
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       fb_set_suspend(info, 1);
>> >>
>> >>       if (info->fbops->fb_sync)
>> >> @@ -1587,7 +1586,7 @@ static int i810fb_suspend(struct pci_dev *dev,
>> >> pm_message_t mesg)
>> >>       pci_save_state(dev);
>> >>       pci_disable_device(dev);
>> >>       pci_set_power_state(dev, pci_choose_state(dev, mesg));
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> @@ -1605,7 +1604,7 @@ static int i810fb_resume(struct pci_dev *dev)
>> >>               return 0;
>> >>       }
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       pci_set_power_state(dev, PCI_D0);
>> >>       pci_restore_state(dev);
>> >>
>> >> @@ -1621,7 +1620,7 @@ static int i810fb_resume(struct pci_dev *dev)
>> >>       fb_set_suspend (info, 0);
>> >>       info->fbops->fb_blank(VESA_NO_BLANKING, info);
>> >>  fail:
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>       return 0;
>> >>  }
>> >>  /***********************************************************************
>> >> diff --git a/drivers/video/jz4740_fb.c b/drivers/video/jz4740_fb.c
>> >> index de36693..7e9301a 100644
>> >> --- a/drivers/video/jz4740_fb.c
>> >> +++ b/drivers/video/jz4740_fb.c
>> >> @@ -21,7 +21,6 @@
>> >>  #include <linux/clk.h>
>> >>  #include <linux/delay.h>
>> >>
>> >> -#include <linux/console.h>
>> >>  #include <linux/fb.h>
>> >>
>> >>  #include <linux/dma-mapping.h>
>> >> @@ -778,9 +777,9 @@ static int jzfb_suspend(struct device *dev)
>> >>  {
>> >>       struct jzfb *jzfb = dev_get_drvdata(dev);
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       fb_set_suspend(jzfb->fb, 1);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       mutex_lock(&jzfb->lock);
>> >>       if (jzfb->is_enabled)
>> >> @@ -800,9 +799,9 @@ static int jzfb_resume(struct device *dev)
>> >>               jzfb_enable(jzfb);
>> >>       mutex_unlock(&jzfb->lock);
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       fb_set_suspend(jzfb->fb, 0);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> diff --git a/drivers/video/mx3fb.c b/drivers/video/mx3fb.c
>> >> index c89f8a8..da25fa1 100644
>> >> --- a/drivers/video/mx3fb.c
>> >> +++ b/drivers/video/mx3fb.c
>> >> @@ -23,7 +23,6 @@
>> >>  #include <linux/ioport.h>
>> >>  #include <linux/dma-mapping.h>
>> >>  #include <linux/dmaengine.h>
>> >> -#include <linux/console.h>
>> >>  #include <linux/clk.h>
>> >>  #include <linux/mutex.h>
>> >>
>> >> @@ -1204,9 +1203,9 @@ static int mx3fb_suspend(struct platform_device
>> >> *pdev, pm_message_t state)
>> >>       struct mx3fb_data *mx3fb = platform_get_drvdata(pdev);
>> >>       struct mx3fb_info *mx3_fbi = mx3fb->fbi->par;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       fb_set_suspend(mx3fb->fbi, 1);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       if (mx3_fbi->blank == FB_BLANK_UNBLANK) {
>> >>               sdc_disable_channel(mx3_fbi);
>> >> @@ -1229,9 +1228,9 @@ static int mx3fb_resume(struct platform_device *pdev)
>> >>               sdc_set_brightness(mx3fb, mx3fb->backlight_level);
>> >>       }
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       fb_set_suspend(mx3fb->fbi, 0);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> diff --git a/drivers/video/nvidia/nvidia.c b/drivers/video/nvidia/nvidia.c
>> >> index fe13ac5..f47eb2a 100644
>> >> --- a/drivers/video/nvidia/nvidia.c
>> >> +++ b/drivers/video/nvidia/nvidia.c
>> >> @@ -19,7 +19,6 @@
>> >>  #include <linux/fb.h>
>> >>  #include <linux/init.h>
>> >>  #include <linux/pci.h>
>> >> -#include <linux/console.h>
>> >>  #include <linux/backlight.h>
>> >>  #ifdef CONFIG_MTRR
>> >>  #include <asm/mtrr.h>
>> >> @@ -1057,7 +1056,7 @@ static int nvidiafb_suspend(struct pci_dev *dev,
>> >> pm_message_t mesg)
>> >>
>> >>       if (mesg.event == PM_EVENT_PRETHAW)
>> >>               mesg.event = PM_EVENT_FREEZE;
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       par->pm_state = mesg.event;
>> >>
>> >>       if (mesg.event & PM_EVENT_SLEEP) {
>> >> @@ -1070,7 +1069,7 @@ static int nvidiafb_suspend(struct pci_dev *dev,
>> >> pm_message_t mesg)
>> >>       }
>> >>       dev->dev.power.power_state = mesg;
>> >>
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>       return 0;
>> >>  }
>> >>
>> >> @@ -1079,7 +1078,7 @@ static int nvidiafb_resume(struct pci_dev *dev)
>> >>       struct fb_info *info = pci_get_drvdata(dev);
>> >>       struct nvidia_par *par = info->par;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       pci_set_power_state(dev, PCI_D0);
>> >>
>> >>       if (par->pm_state != PM_EVENT_FREEZE) {
>> >> @@ -1097,7 +1096,7 @@ static int nvidiafb_resume(struct pci_dev *dev)
>> >>       nvidiafb_blank(FB_BLANK_UNBLANK, info);
>> >>
>> >>  fail:
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>       return 0;
>> >>  }
>> >>  #else
>> >> diff --git a/drivers/video/ps3fb.c b/drivers/video/ps3fb.c
>> >> index 213fbbc..cb2e174 100644
>> >> --- a/drivers/video/ps3fb.c
>> >> +++ b/drivers/video/ps3fb.c
>> >> @@ -23,7 +23,6 @@
>> >>  #include <linux/string.h>
>> >>  #include <linux/mm.h>
>> >>  #include <linux/interrupt.h>
>> >> -#include <linux/console.h>
>> >>  #include <linux/ioctl.h>
>> >>  #include <linux/kthread.h>
>> >>  #include <linux/freezer.h>
>> >> @@ -515,7 +514,7 @@ static int ps3fb_release(struct fb_info *info, int user)
>> >>                       atomic_set(&ps3fb.ext_flip, 0);
>> >>                       if (console_trylock()) {
>> >>                               ps3fb_sync(info, 0);    /* single buffer */
>> >> -                             console_unlock();
>> >> +                             fb_console_unlock();
>> >>                       }
>> >>               }
>> >>       }
>> >> @@ -830,14 +829,14 @@ static int ps3fb_ioctl(struct fb_info *info,
>> >> unsigned int cmd,
>> >>                       if (vmode) {
>> >>                               var = info->var;
>> >>                               fb_videomode_to_var(&var, vmode);
>> >> -                             console_lock();
>> >> +                             fb_console_lock();
>> >>                               info->flags |= FBINFO_MISC_USEREVENT;
>> >>                               /* Force, in case only special bits changed */
>> >>                               var.activate |= FB_ACTIVATE_FORCE;
>> >>                               par->new_mode_id = val;
>> >>                               retval = fb_set_var(info, &var);
>> >>                               info->flags &= ~FBINFO_MISC_USEREVENT;
>> >> -                             console_unlock();
>> >> +                             fb_console_unlock();
>> >>                       }
>> >>                       break;
>> >>               }
>> >> @@ -881,9 +880,9 @@ static int ps3fb_ioctl(struct fb_info *info,
>> >> unsigned int cmd,
>> >>                       break;
>> >>
>> >>               dev_dbg(info->device, "PS3FB_IOCTL_FSEL:%d\n", val);
>> >> -             console_lock();
>> >> +             fb_console_lock();
>> >>               retval = ps3fb_sync(info, val);
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>               break;
>> >>
>> >>       default:
>> >> @@ -903,9 +902,9 @@ static int ps3fbd(void *arg)
>> >>               set_current_state(TASK_INTERRUPTIBLE);
>> >>               if (ps3fb.is_kicked) {
>> >>                       ps3fb.is_kicked = 0;
>> >> -                     console_lock();
>> >> +                     fb_console_lock();
>> >>                       ps3fb_sync(info, 0);    /* single buffer */
>> >> -                     console_unlock();
>> >> +                     fb_console_unlock();
>> >>               }
>> >>               schedule();
>> >>       }
>> >> diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c
>> >> index 3f90255..a1af212 100644
>> >> --- a/drivers/video/pxafb.c
>> >> +++ b/drivers/video/pxafb.c
>> >> @@ -54,7 +54,6 @@
>> >>  #include <linux/mutex.h>
>> >>  #include <linux/kthread.h>
>> >>  #include <linux/freezer.h>
>> >> -#include <linux/console.h>
>> >>
>> >>  #include <mach/hardware.h>
>> >>  #include <asm/io.h>
>> >> @@ -733,9 +732,9 @@ static int overlayfb_open(struct fb_info *info, int user)
>> >>
>> >>       if (ofb->usage++ == 0) {
>> >>               /* unblank the base framebuffer */
>> >> -             console_lock();
>> >> +             fb_console_lock();
>> >>               fb_blank(&ofb->fbi->fb, FB_BLANK_UNBLANK);
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>       }
>> >>
>> >>       return 0;
>> >> diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c
>> >> index 1d00736..7759c82 100644
>> >> --- a/drivers/video/s3fb.c
>> >> +++ b/drivers/video/s3fb.c
>> >> @@ -22,7 +22,6 @@
>> >>  #include <linux/svga.h>
>> >>  #include <linux/init.h>
>> >>  #include <linux/pci.h>
>> >> -#include <linux/console.h> /* Why should fb driver call console
>> >> functions? because console_lock() */
>> >>  #include <video/vga.h>
>> >>
>> >>  #include <linux/i2c.h>
>> >> @@ -1445,12 +1444,12 @@ static int s3_pci_suspend(struct pci_dev* dev,
>> >> pm_message_t state)
>> >>
>> >>       dev_info(info->device, "suspend\n");
>> >>
>> >> -     console_lock();
>> >> +     fb_fb_console_lock();
>> >>       mutex_lock(&(par->open_lock));
>> >>
>> >>       if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
>> >>               mutex_unlock(&(par->open_lock));
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>               return 0;
>> >>       }
>> >>
>> >> @@ -1461,7 +1460,7 @@ static int s3_pci_suspend(struct pci_dev* dev,
>> >> pm_message_t state)
>> >>       pci_set_power_state(dev, pci_choose_state(dev, state));
>> >>
>> >>       mutex_unlock(&(par->open_lock));
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> @@ -1477,12 +1476,12 @@ static int s3_pci_resume(struct pci_dev* dev)
>> >>
>> >>       dev_info(info->device, "resume\n");
>> >>
>> >> -     console_lock();
>> >> +     fb_fb_console_lock();
>> >>       mutex_lock(&(par->open_lock));
>> >>
>> >>       if (par->ref_count == 0) {
>> >>               mutex_unlock(&(par->open_lock));
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>               return 0;
>> >>       }
>> >>
>> >> @@ -1491,7 +1490,7 @@ static int s3_pci_resume(struct pci_dev* dev)
>> >>       err = pci_enable_device(dev);
>> >>       if (err) {
>> >>               mutex_unlock(&(par->open_lock));
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>               dev_err(info->device, "error %d enabling device for resume\n", err);
>> >>               return err;
>> >>       }
>> >> @@ -1501,7 +1500,7 @@ static int s3_pci_resume(struct pci_dev* dev)
>> >>       fb_set_suspend(info, 0);
>> >>
>> >>       mutex_unlock(&(par->open_lock));
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> diff --git a/drivers/video/savage/savagefb_driver.c
>> >> b/drivers/video/savage/savagefb_driver.c
>> >> index 0d0f52c..bf64221 100644
>> >> --- a/drivers/video/savage/savagefb_driver.c
>> >> +++ b/drivers/video/savage/savagefb_driver.c
>> >> @@ -51,7 +51,6 @@
>> >>  #include <linux/fb.h>
>> >>  #include <linux/pci.h>
>> >>  #include <linux/init.h>
>> >> -#include <linux/console.h>
>> >>
>> >>  #include <asm/io.h>
>> >>  #include <asm/irq.h>
>> >> @@ -2391,7 +2390,7 @@ static int savagefb_suspend(struct pci_dev *dev,
>> >> pm_message_t mesg)
>> >>       if (mesg.event == PM_EVENT_FREEZE)
>> >>               return 0;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       fb_set_suspend(info, 1);
>> >>
>> >>       if (info->fbops->fb_sync)
>> >> @@ -2403,7 +2402,7 @@ static int savagefb_suspend(struct pci_dev *dev,
>> >> pm_message_t mesg)
>> >>       pci_save_state(dev);
>> >>       pci_disable_device(dev);
>> >>       pci_set_power_state(dev, pci_choose_state(dev, mesg));
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> @@ -2427,7 +2426,7 @@ static int savagefb_resume(struct pci_dev* dev)
>> >>               return 0;
>> >>       }
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>
>> >>       pci_set_power_state(dev, PCI_D0);
>> >>       pci_restore_state(dev);
>> >> @@ -2441,7 +2440,7 @@ static int savagefb_resume(struct pci_dev* dev)
>> >>       savagefb_set_par(info);
>> >>       fb_set_suspend(info, 0);
>> >>       savagefb_blank(FB_BLANK_UNBLANK, info);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c
>> >> index 699487c..2bc1119 100644
>> >> --- a/drivers/video/sh_mobile_lcdcfb.c
>> >> +++ b/drivers/video/sh_mobile_lcdcfb.c
>> >> @@ -11,7 +11,6 @@
>> >>  #include <linux/atomic.h>
>> >>  #include <linux/backlight.h>
>> >>  #include <linux/clk.h>
>> >> -#include <linux/console.h>
>> >>  #include <linux/ctype.h>
>> >>  #include <linux/dma-mapping.h>
>> >>  #include <linux/delay.h>
>> >> @@ -575,7 +574,7 @@ static int sh_mobile_lcdc_display_notify(struct
>> >> sh_mobile_lcdc_chan *ch,
>> >>       case SH_MOBILE_LCDC_EVENT_DISPLAY_CONNECT:
>> >>               /* HDMI plug in */
>> >>               if (lock_fb_info(info)) {
>> >> -                     console_lock();
>> >> +                     fb_console_lock();
>> >>
>> >>                       ch->display.width = monspec->max_x * 10;
>> >>                       ch->display.height = monspec->max_y * 10;
>> >> @@ -594,7 +593,7 @@ static int sh_mobile_lcdc_display_notify(struct
>> >> sh_mobile_lcdc_chan *ch,
>> >>                               fb_set_suspend(info, 0);
>> >>                       }
>> >>
>> >> -                     console_unlock();
>> >> +                     fb_console_unlock();
>> >>                       unlock_fb_info(info);
>> >>               }
>> >>               break;
>> >> @@ -602,9 +601,9 @@ static int sh_mobile_lcdc_display_notify(struct
>> >> sh_mobile_lcdc_chan *ch,
>> >>       case SH_MOBILE_LCDC_EVENT_DISPLAY_DISCONNECT:
>> >>               /* HDMI disconnect */
>> >>               if (lock_fb_info(info)) {
>> >> -                     console_lock();
>> >> +                     fb_console_lock();
>> >>                       fb_set_suspend(info, 1);
>> >> -                     console_unlock();
>> >> +                     fb_console_unlock();
>> >>                       unlock_fb_info(info);
>> >>               }
>> >>               break;
>> >> @@ -1934,9 +1933,9 @@ static int sh_mobile_lcdc_release(struct fb_info
>> >> *info, int user)
>> >>
>> >>       /* Nothing to reconfigure, when called from fbcon */
>> >>       if (user) {
>> >> -             console_lock();
>> >> +             fb_console_lock();
>> >>               sh_mobile_fb_reconfig(info);
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>       }
>> >>
>> >>       mutex_unlock(&ch->open_lock);
>> >> diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
>> >> index 3690eff..536f922 100644
>> >> --- a/drivers/video/sm501fb.c
>> >> +++ b/drivers/video/sm501fb.c
>> >> @@ -28,7 +28,6 @@
>> >>  #include <linux/wait.h>
>> >>  #include <linux/platform_device.h>
>> >>  #include <linux/clk.h>
>> >> -#include <linux/console.h>
>> >>  #include <linux/io.h>
>> >>
>> >>  #include <asm/uaccess.h>
>> >> @@ -2104,9 +2103,9 @@ static int sm501fb_suspend_fb(struct sm501fb_info *info,
>> >>
>> >>       /* tell console/fb driver we are suspending */
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       fb_set_suspend(fbi, 1);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       /* backup copies in case chip is powered down over suspend */
>> >>
>> >> @@ -2163,9 +2162,9 @@ static void sm501fb_resume_fb(struct sm501fb_info *info,
>> >>               memcpy_toio(par->cursor.k_addr, par->store_cursor,
>> >>                           par->cursor.size);
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       fb_set_suspend(fbi, 0);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       vfree(par->store_fb);
>> >>       vfree(par->store_cursor);
>> >> diff --git a/drivers/video/tmiofb.c b/drivers/video/tmiofb.c
>> >> index 8e4a446..e266b6b 100644
>> >> --- a/drivers/video/tmiofb.c
>> >> +++ b/drivers/video/tmiofb.c
>> >> @@ -25,8 +25,7 @@
>> >>  #include <linux/fb.h>
>> >>  #include <linux/interrupt.h>
>> >>  #include <linux/delay.h>
>> >> -/* Why should fb driver call console functions? because console_lock() */
>> >> -#include <linux/console.h>
>> >> +/* Why should fb driver call console functions? because fb_console_lock() */
>> >>  #include <linux/mfd/core.h>
>> >>  #include <linux/mfd/tmio.h>
>> >>  #include <linux/uaccess.h>
>> >> @@ -938,7 +937,7 @@ static int tmiofb_suspend(struct platform_device
>> >> *dev, pm_message_t state)
>> >>       const struct mfd_cell *cell = mfd_get_cell(dev);
>> >>       int retval = 0;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>
>> >>       fb_set_suspend(info, 1);
>> >>
>> >> @@ -959,7 +958,7 @@ static int tmiofb_suspend(struct platform_device
>> >> *dev, pm_message_t state)
>> >>       if (cell->suspend)
>> >>               retval = cell->suspend(dev);
>> >>
>> >> -     console_unlock();
>> >> +     fb_fb_console_unlock();
>> >>
>> >>       return retval;
>> >>  }
>> >> @@ -970,7 +969,7 @@ static int tmiofb_resume(struct platform_device *dev)
>> >>       const struct mfd_cell *cell = mfd_get_cell(dev);
>> >>       int retval = 0;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>
>> >>       if (cell->resume) {
>> >>               retval = cell->resume(dev);
>> >> @@ -986,7 +985,7 @@ static int tmiofb_resume(struct platform_device *dev)
>> >>
>> >>       fb_set_suspend(info, 0);
>> >>  out:
>> >> -     console_unlock();
>> >> +     fb_fb_console_unlock();
>> >>       return retval;
>> >>  }
>> >>  #else
>> >> diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c
>> >> index c80e770..d36b173 100644
>> >> --- a/drivers/video/via/viafbdev.c
>> >> +++ b/drivers/video/via/viafbdev.c
>> >> @@ -1698,17 +1698,17 @@ static int parse_mode(const char *str, u32
>> >> devices, u32 *xres, u32 *yres)
>> >>  #ifdef CONFIG_PM
>> >>  static int viafb_suspend(void *unused)
>> >>  {
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       fb_set_suspend(viafbinfo, 1);
>> >>       viafb_sync(viafbinfo);
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >>
>> >>  static int viafb_resume(void *unused)
>> >>  {
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       if (viaparinfo->shared->vdev->engine_mmio)
>> >>               viafb_reset_engine(viaparinfo);
>> >>       viafb_set_par(viafbinfo);
>> >> @@ -1716,7 +1716,7 @@ static int viafb_resume(void *unused)
>> >>               viafb_set_par(viafbinfo1);
>> >>       fb_set_suspend(viafbinfo, 0);
>> >>
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>       return 0;
>> >>  }
>> >>
>> >> diff --git a/drivers/video/vt8623fb.c b/drivers/video/vt8623fb.c
>> >> index 4e74d26..cb48d4d 100644
>> >> --- a/drivers/video/vt8623fb.c
>> >> +++ b/drivers/video/vt8623fb.c
>> >> @@ -23,7 +23,6 @@
>> >>  #include <linux/svga.h>
>> >>  #include <linux/init.h>
>> >>  #include <linux/pci.h>
>> >> -#include <linux/console.h> /* Why should fb driver call console
>> >> functions? because console_lock() */
>> >>  #include <video/vga.h>
>> >>
>> >>  #ifdef CONFIG_MTRR
>> >> @@ -845,12 +844,12 @@ static int vt8623_pci_suspend(struct pci_dev*
>> >> dev, pm_message_t state)
>> >>
>> >>       dev_info(info->device, "suspend\n");
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       mutex_lock(&(par->open_lock));
>> >>
>> >>       if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
>> >>               mutex_unlock(&(par->open_lock));
>> >> -             console_unlock();
>> >> +             fb_console_unlock();
>> >>               return 0;
>> >>       }
>> >>
>> >> @@ -861,7 +860,7 @@ static int vt8623_pci_suspend(struct pci_dev* dev,
>> >> pm_message_t state)
>> >>       pci_set_power_state(dev, pci_choose_state(dev, state));
>> >>
>> >>       mutex_unlock(&(par->open_lock));
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> @@ -876,7 +875,7 @@ static int vt8623_pci_resume(struct pci_dev* dev)
>> >>
>> >>       dev_info(info->device, "resume\n");
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       mutex_lock(&(par->open_lock));
>> >>
>> >>       if (par->ref_count == 0)
>> >> @@ -895,7 +894,7 @@ static int vt8623_pci_resume(struct pci_dev* dev)
>> >>
>> >>  fail:
>> >>       mutex_unlock(&(par->open_lock));
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>
>> >>       return 0;
>> >>  }
>> >> diff --git a/drivers/video/xen-fbfront.c b/drivers/video/xen-fbfront.c
>> >> index b7f5173..770397e7 100644
>> >> --- a/drivers/video/xen-fbfront.c
>> >> +++ b/drivers/video/xen-fbfront.c
>> >> @@ -18,7 +18,6 @@
>> >>   * frame buffer.
>> >>   */
>> >>
>> >> -#include <linux/console.h>
>> >>  #include <linux/kernel.h>
>> >>  #include <linux/errno.h>
>> >>  #include <linux/fb.h>
>> >> @@ -495,12 +494,12 @@ xenfb_make_preferred_console(void)
>> >>       if (console_set_on_cmdline)
>> >>               return;
>> >>
>> >> -     console_lock();
>> >> +     fb_console_lock();
>> >>       for_each_console(c) {
>> >>               if (!strcmp(c->name, "tty") && c->index == 0)
>> >>                       break;
>> >>       }
>> >> -     console_unlock();
>> >> +     fb_console_unlock();
>> >>       if (c) {
>> >>               unregister_console(c);
>> >>               c->flags |= CON_CONSDEV;
>> >> diff --git a/include/linux/fb.h b/include/linux/fb.h
>> >> index ac3f1c6..7ae96ad 100644
>> >> --- a/include/linux/fb.h
>> >> +++ b/include/linux/fb.h
>> >> @@ -1021,6 +1021,8 @@ extern int fb_get_color_depth(struct
>> >> fb_var_screeninfo *var,
>> >>                             struct fb_fix_screeninfo *fix);
>> >>  extern int fb_get_options(char *name, char **option);
>> >>  extern int fb_new_modelist(struct fb_info *info);
>> >> +extern void fb_console_unlock(void);
>> >> +extern void fb_console_lock(void);
>> >>
>> >>  extern struct fb_info *registered_fb[FB_MAX];
>> >>  extern int num_registered_fb;
>> >
>> >
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Paul Mundt Sept. 30, 2012, 12:17 p.m. UTC | #7
On Sat, Sep 29, 2012 at 01:29:17PM +0800, Jun Nie wrote:
> diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c
> index 1d00736..7759c82 100644
> --- a/drivers/video/s3fb.c
> +++ b/drivers/video/s3fb.c
> @@ -1445,12 +1444,12 @@ static int s3_pci_suspend(struct pci_dev* dev,
> pm_message_t state)
> 
>  	dev_info(info->device, "suspend\n");
> 
> -	console_lock();
> +	fb_fb_console_lock();
>  	mutex_lock(&(par->open_lock));
> 
Compiling is overrated anyways.

> diff --git a/drivers/video/tmiofb.c b/drivers/video/tmiofb.c
> index 8e4a446..e266b6b 100644
> --- a/drivers/video/tmiofb.c
> +++ b/drivers/video/tmiofb.c
> @@ -959,7 +958,7 @@ static int tmiofb_suspend(struct platform_device
> *dev, pm_message_t state)
>  	if (cell->suspend)
>  		retval = cell->suspend(dev);
> 
> -	console_unlock();
> +	fb_fb_console_unlock();
> 
>  	return retval;
>  }
> @@ -986,7 +985,7 @@ static int tmiofb_resume(struct platform_device *dev)
> 
>  	fb_set_suspend(info, 0);
>  out:
> -	console_unlock();
> +	fb_fb_console_unlock();
>  	return retval;
>  }
>  #else

Here too.

Turning locks in to no-ops without auditing every single driver's use of
said lock and converting to something to protect the work being done
under lock suggests that this conversion is more mechanical than thought
out beyond your specific use case.

While you've obviously identified a problem that's worth pursuing, it's
going to take a bit more work than mechanical conversion, and it's going
to have to be something that's moved towards incrementally. If you
haven't even compile tested the impacted drivers, it suggests you haven't
spent a great deal of time thinking about what they are doing under said
lock, either..
--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jun Nie Oct. 9, 2012, 10:13 a.m. UTC | #8
2012/9/30 Paul Mundt <lethal@linux-sh.org>:
> On Sat, Sep 29, 2012 at 01:29:17PM +0800, Jun Nie wrote:
>> diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c
>> index 1d00736..7759c82 100644
>> --- a/drivers/video/s3fb.c
>> +++ b/drivers/video/s3fb.c
>> @@ -1445,12 +1444,12 @@ static int s3_pci_suspend(struct pci_dev* dev,
>> pm_message_t state)
>>
>>       dev_info(info->device, "suspend\n");
>>
>> -     console_lock();
>> +     fb_fb_console_lock();
>>       mutex_lock(&(par->open_lock));
>>
> Compiling is overrated anyways.
>
>> diff --git a/drivers/video/tmiofb.c b/drivers/video/tmiofb.c
>> index 8e4a446..e266b6b 100644
>> --- a/drivers/video/tmiofb.c
>> +++ b/drivers/video/tmiofb.c
>> @@ -959,7 +958,7 @@ static int tmiofb_suspend(struct platform_device
>> *dev, pm_message_t state)
>>       if (cell->suspend)
>>               retval = cell->suspend(dev);
>>
>> -     console_unlock();
>> +     fb_fb_console_unlock();
>>
>>       return retval;
>>  }
>> @@ -986,7 +985,7 @@ static int tmiofb_resume(struct platform_device *dev)
>>
>>       fb_set_suspend(info, 0);
>>  out:
>> -     console_unlock();
>> +     fb_fb_console_unlock();
>>       return retval;
>>  }
>>  #else
>
> Here too.
>
> Turning locks in to no-ops without auditing every single driver's use of
> said lock and converting to something to protect the work being done
> under lock suggests that this conversion is more mechanical than thought
> out beyond your specific use case.
>
> While you've obviously identified a problem that's worth pursuing, it's
> going to take a bit more work than mechanical conversion, and it's going
> to have to be something that's moved towards incrementally. If you
> haven't even compile tested the impacted drivers, it suggests you haven't
> spent a great deal of time thinking about what they are doing under said
> lock, either..

 Paul,
Thanks for pointing out the defect in my pacth. I did not compile for
every arch I changed.

I check console_lock usage and find it is used for three category
operations sync, a) console output. b) console configuration(font,
resize, connection, etc). c) FB system internal sync as Benjamin
mentioned. Usage A does not happen frequenty. Usage B is our target.
Usage C happens frequently and it may hold the lock for a long time,
while it is unrelated to console if framebuffer console is disabled.
For any system whose log relay on non-FB console, it may encounter no
log or partial log when panic. So it is common use case.

How do you think below code for this purpose?

#ifndef CONFIG_FRAMEBUFFER_CONSOLE
static DEFINE_MUTEX(fb_lock);
#endif
void fb_console_lock(void)
{
#ifdef CONFIG_FRAMEBUFFER_CONSOLE
        console_lock();
#else
        mutex_lock(&fb_lock);
#endif
}
EXPORT_SYMBOL(fb_console_lock);

void fb_console_unlock(void)
{
#ifdef CONFIG_FRAMEBUFFER_CONSOLE
        console_unlock();
#else
        mutex_unlock(&fb_lock);
#endif
}
EXPORT_SYMBOL(fb_console_unlock);
--
To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/video/arkfb.c b/drivers/video/arkfb.c
index 555dd4c..774d902 100644
--- a/drivers/video/arkfb.c
+++ b/drivers/video/arkfb.c
@@ -23,7 +23,6 @@ 
 #include <linux/svga.h>
 #include <linux/init.h>
 #include <linux/pci.h>
-#include <linux/console.h> /* Why should fb driver call console
functions? because console_lock() */
 #include <video/vga.h>

 #ifdef CONFIG_MTRR
@@ -1124,12 +1123,12 @@  static int ark_pci_suspend (struct pci_dev*
dev, pm_message_t state)

 	dev_info(info->device, "suspend\n");

-	console_lock();
+	fb_console_lock();
 	mutex_lock(&(par->open_lock));

 	if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
 		mutex_unlock(&(par->open_lock));
-		console_unlock();
+		fb_console_unlock();
 		return 0;
 	}

@@ -1140,7 +1139,7 @@  static int ark_pci_suspend (struct pci_dev* dev,
pm_message_t state)
 	pci_set_power_state(dev, pci_choose_state(dev, state));

 	mutex_unlock(&(par->open_lock));
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
@@ -1155,7 +1154,7 @@  static int ark_pci_resume (struct pci_dev* dev)

 	dev_info(info->device, "resume\n");

-	console_lock();
+	fb_console_lock();
 	mutex_lock(&(par->open_lock));

 	if (par->ref_count == 0)
@@ -1174,7 +1173,7 @@  static int ark_pci_resume (struct pci_dev* dev)

 fail:
 	mutex_unlock(&(par->open_lock));
-	console_unlock();
+	fb_console_unlock();
 	return 0;
 }
 #else
diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c
index 747442d..1c6b80b 100644
--- a/drivers/video/aty/aty128fb.c
+++ b/drivers/video/aty/aty128fb.c
@@ -60,7 +60,6 @@ 
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/ioport.h>
-#include <linux/console.h>
 #include <linux/backlight.h>
 #include <asm/io.h>

@@ -1884,7 +1883,7 @@  static void aty128_early_resume(void *data)
 		return;
 	pci_restore_state(par->pdev);
 	aty128_do_resume(par->pdev);
-	console_unlock();
+	fb_console_unlock();
 }
 #endif /* CONFIG_PPC_PMAC */

@@ -2461,7 +2460,7 @@  static int aty128_pci_suspend(struct pci_dev
*pdev, pm_message_t state)

 	printk(KERN_DEBUG "aty128fb: suspending...\n");
 	
-	console_lock();
+	fb_console_lock();

 	fb_set_suspend(info, 1);

@@ -2493,7 +2492,7 @@  static int aty128_pci_suspend(struct pci_dev
*pdev, pm_message_t state)
 	if (state.event != PM_EVENT_ON)
 		aty128_set_suspend(par, 1);

-	console_unlock();
+	fb_console_unlock();

 	pdev->dev.power.power_state = state;

@@ -2550,9 +2549,9 @@  static int aty128_pci_resume(struct pci_dev *pdev)
 {
 	int rc;

-	console_lock();
+	fb_console_lock();
 	rc = aty128_do_resume(pdev);
-	console_unlock();
+	fb_console_unlock();

 	return rc;
 }
diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c
index 3f2e8c1..9bb15ab 100644
--- a/drivers/video/aty/atyfb_base.c
+++ b/drivers/video/aty/atyfb_base.c
@@ -58,7 +58,6 @@ 
 #include <linux/slab.h>
 #include <linux/vmalloc.h>
 #include <linux/delay.h>
-#include <linux/console.h>
 #include <linux/fb.h>
 #include <linux/init.h>
 #include <linux/pci.h>
@@ -2065,7 +2064,7 @@  static int atyfb_pci_suspend(struct pci_dev
*pdev, pm_message_t state)
 	if (state.event == pdev->dev.power.power_state.event)
 		return 0;

-	console_lock();
+	fb_console_lock();

 	fb_set_suspend(info, 1);

@@ -2093,14 +2092,14 @@  static int atyfb_pci_suspend(struct pci_dev
*pdev, pm_message_t state)
 		par->lock_blank = 0;
 		atyfb_blank(FB_BLANK_UNBLANK, info);
 		fb_set_suspend(info, 0);
-		console_unlock();
+		fb_console_unlock();
 		return -EIO;
 	}
 #else
 	pci_set_power_state(pdev, pci_choose_state(pdev, state));
 #endif

-	console_unlock();
+	fb_console_unlock();

 	pdev->dev.power.power_state = state;

@@ -2129,7 +2128,7 @@  static int atyfb_pci_resume(struct pci_dev *pdev)
 	if (pdev->dev.power.power_state.event == PM_EVENT_ON)
 		return 0;

-	console_lock();
+	fb_console_lock();

 	/*
 	 * PCI state will have been restored by the core, so
@@ -2157,7 +2156,7 @@  static int atyfb_pci_resume(struct pci_dev *pdev)
 	par->lock_blank = 0;
 	atyfb_blank(FB_BLANK_UNBLANK, info);

-	console_unlock();
+	fb_console_unlock();

 	pdev->dev.power.power_state = PMSG_ON;

diff --git a/drivers/video/aty/radeon_pm.c b/drivers/video/aty/radeon_pm.c
index 92bda58..a2f07da 100644
--- a/drivers/video/aty/radeon_pm.c
+++ b/drivers/video/aty/radeon_pm.c
@@ -16,7 +16,6 @@ 

 #include "radeonfb.h"

-#include <linux/console.h>
 #include <linux/agp_backend.h>

 #ifdef CONFIG_PPC_PMAC
@@ -2626,7 +2625,7 @@  int radeonfb_pci_suspend(struct pci_dev *pdev,
pm_message_t mesg)
 		goto done;
 	}

-	console_lock();
+	fb_console_lock();

 	fb_set_suspend(info, 1);

@@ -2690,7 +2689,7 @@  int radeonfb_pci_suspend(struct pci_dev *pdev,
pm_message_t mesg)
 	if (rinfo->pm_mode & radeon_pm_d2)
 		radeon_set_suspend(rinfo, 1);

-	console_unlock();
+	fb_console_unlock();

  done:
 	pdev->dev.power.power_state = mesg;
@@ -2718,7 +2717,7 @@  int radeonfb_pci_resume(struct pci_dev *pdev)
 		if (!console_trylock())
 			return 0;
 	} else
-		console_lock();
+		fb_console_lock();

 	printk(KERN_DEBUG "radeonfb (%s): resuming from state: %d...\n",
 	       pci_name(pdev), pdev->dev.power.power_state.event);
@@ -2783,7 +2782,7 @@  int radeonfb_pci_resume(struct pci_dev *pdev)
 	pdev->dev.power.power_state = PMSG_ON;

  bail:
-	console_unlock();
+	fb_console_unlock();

 	return rc;
 }
diff --git a/drivers/video/chipsfb.c b/drivers/video/chipsfb.c
index cff742a..d50fa6b 100644
--- a/drivers/video/chipsfb.c
+++ b/drivers/video/chipsfb.c
@@ -460,10 +460,10 @@  static int chipsfb_pci_suspend(struct pci_dev
*pdev, pm_message_t state)
 	if (!(state.event & PM_EVENT_SLEEP))
 		goto done;

-	console_lock();
+	fb_console_lock();
 	chipsfb_blank(1, p);
 	fb_set_suspend(p, 1);
-	console_unlock();
+	fb_console_unlock();
  done:
 	pdev->dev.power.power_state = state;
 	return 0;
@@ -473,10 +473,10 @@  static int chipsfb_pci_resume(struct pci_dev *pdev)
 {
         struct fb_info *p = pci_get_drvdata(pdev);

-	console_lock();
+	fb_console_lock();
 	fb_set_suspend(p, 0);
 	chipsfb_blank(0, p);
-	console_unlock();
+	fb_console_unlock();

 	pdev->dev.power.power_state = PMSG_ON;
 	return 0;
diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index 7ae9d53..9a36bbc 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -29,7 +29,6 @@ 
 #include <linux/interrupt.h>
 #include <linux/clk.h>
 #include <linux/cpufreq.h>
-#include <linux/console.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
 #include <linux/delay.h>
@@ -1406,14 +1405,14 @@  static int fb_suspend(struct platform_device
*dev, pm_message_t state)
 	struct fb_info *info = platform_get_drvdata(dev);
 	struct da8xx_fb_par *par = info->par;

-	console_lock();
+	fb_console_lock();
 	if (par->panel_power_ctrl)
 		par->panel_power_ctrl(0);

 	fb_set_suspend(info, 1);
 	lcd_disable_raster();
 	clk_disable(par->lcdc_clk);
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
@@ -1422,7 +1421,7 @@  static int fb_resume(struct platform_device *dev)
 	struct fb_info *info = platform_get_drvdata(dev);
 	struct da8xx_fb_par *par = info->par;

-	console_lock();
+	fb_console_lock();
 	clk_enable(par->lcdc_clk);
 	lcd_enable_raster();

@@ -1430,7 +1429,7 @@  static int fb_resume(struct platform_device *dev)
 		par->panel_power_ctrl(1);

 	fb_set_suspend(info, 0);
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
diff --git a/drivers/video/fb-puv3.c b/drivers/video/fb-puv3.c
index 60a787f..87c8c4e 100644
--- a/drivers/video/fb-puv3.c
+++ b/drivers/video/fb-puv3.c
@@ -17,7 +17,6 @@ 
 #include <linux/clk.h>
 #include <linux/fb.h>
 #include <linux/init.h>
-#include <linux/console.h>

 #include <asm/sizes.h>
 #include <mach/hardware.h>
@@ -759,7 +758,7 @@  static int unifb_resume(struct platform_device *dev)
 	if (dev->dev.power.power_state.event == PM_EVENT_ON)
 		return 0;

-	console_lock();
+	fb_console_lock();

 	if (dev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
 		writel(unifb_regs[0], UDE_FSA);
@@ -775,7 +774,7 @@  static int unifb_resume(struct platform_device *dev)
 	}
 	dev->dev.power.power_state = PMSG_ON;

-	console_unlock();
+	fb_console_unlock();

 	return rc;
 }
@@ -804,11 +803,11 @@  static int unifb_suspend(struct platform_device
*dev, pm_message_t mesg)
 		goto done;
 	}

-	console_lock();
+	fb_console_lock();

 	/* do nothing... */

-	console_unlock();
+	fb_console_unlock();

 done:
 	dev->dev.power.power_state = mesg;
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
index 0dff12a..c2d4627 100644
--- a/drivers/video/fbmem.c
+++ b/drivers/video/fbmem.c
@@ -85,6 +85,22 @@  EXPORT_SYMBOL(lock_fb_info);
  * Helpers
  */

+void fb_console_lock(void)
+{
+#ifdef CONFIG_FRAMEBUFFER_CONSOLE
+	console_lock();
+#endif
+}
+EXPORT_SYMBOL(fb_console_lock);
+
+void fb_console_unlock(void)
+{
+#ifdef CONFIG_FRAMEBUFFER_CONSOLE
+	console_unlock();
+#endif
+}
+EXPORT_SYMBOL(fb_console_unlock);
+
 int fb_get_color_depth(struct fb_var_screeninfo *var,
 		       struct fb_fix_screeninfo *fix)
 {
@@ -1101,11 +1117,11 @@  static long do_fb_ioctl(struct fb_info *info,
unsigned int cmd,
 			return -EFAULT;
 		if (!lock_fb_info(info))
 			return -ENODEV;
-		console_lock();
+		fb_console_lock();
 		info->flags |= FBINFO_MISC_USEREVENT;
 		ret = fb_set_var(info, &var);
 		info->flags &= ~FBINFO_MISC_USEREVENT;
-		console_unlock();
+		fb_console_unlock();
 		unlock_fb_info(info);
 		if (!ret && copy_to_user(argp, &var, sizeof(var)))
 			ret = -EFAULT;
@@ -1137,9 +1153,9 @@  static long do_fb_ioctl(struct fb_info *info,
unsigned int cmd,
 			return -EFAULT;
 		if (!lock_fb_info(info))
 			return -ENODEV;
-		console_lock();
+		fb_console_lock();
 		ret = fb_pan_display(info, &var);
-		console_unlock();
+		fb_console_unlock();
 		unlock_fb_info(info);
 		if (ret == 0 && copy_to_user(argp, &var, sizeof(var)))
 			return -EFAULT;
@@ -1184,11 +1200,11 @@  static long do_fb_ioctl(struct fb_info *info,
unsigned int cmd,
 	case FBIOBLANK:
 		if (!lock_fb_info(info))
 			return -ENODEV;
-		console_lock();
+		fb_console_lock();
 		info->flags |= FBINFO_MISC_USEREVENT;
 		ret = fb_blank(info, arg);
 		info->flags &= ~FBINFO_MISC_USEREVENT;
-		console_unlock();
+		fb_console_unlock();
 		unlock_fb_info(info);
 		break;
 	default:
diff --git a/drivers/video/fbsysfs.c b/drivers/video/fbsysfs.c
index a55e366..976d8f5 100644
--- a/drivers/video/fbsysfs.c
+++ b/drivers/video/fbsysfs.c
@@ -18,7 +18,6 @@ 
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/fb.h>
-#include <linux/console.h>
 #include <linux/module.h>

 #define FB_SYSFS_FLAG_ATTR 1
@@ -92,11 +91,11 @@  static int activate(struct fb_info *fb_info,
struct fb_var_screeninfo *var)
 	int err;

 	var->activate |= FB_ACTIVATE_FORCE;
-	console_lock();
+	fb_console_lock();
 	fb_info->flags |= FBINFO_MISC_USEREVENT;
 	err = fb_set_var(fb_info, var);
 	fb_info->flags &= ~FBINFO_MISC_USEREVENT;
-	console_unlock();
+	fb_console_unlock();
 	if (err)
 		return err;
 	return 0;
@@ -177,7 +176,7 @@  static ssize_t store_modes(struct device *device,
 	if (i * sizeof(struct fb_videomode) != count)
 		return -EINVAL;

-	console_lock();
+	fb_console_lock();
 	list_splice(&fb_info->modelist, &old_list);
 	fb_videomode_to_modelist((const struct fb_videomode *)buf, i,
 				 &fb_info->modelist);
@@ -187,7 +186,7 @@  static ssize_t store_modes(struct device *device,
 	} else
 		fb_destroy_modelist(&old_list);

-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
@@ -303,11 +302,11 @@  static ssize_t store_blank(struct device *device,
 	char *last = NULL;
 	int err;

-	console_lock();
+	fb_console_lock();
 	fb_info->flags |= FBINFO_MISC_USEREVENT;
 	err = fb_blank(fb_info, simple_strtoul(buf, &last, 0));
 	fb_info->flags &= ~FBINFO_MISC_USEREVENT;
-	console_unlock();
+	fb_console_unlock();
 	if (err < 0)
 		return err;
 	return count;
@@ -366,9 +365,9 @@  static ssize_t store_pan(struct device *device,
 		return -EINVAL;
 	var.yoffset = simple_strtoul(last, &last, 0);

-	console_lock();
+	fb_console_lock();
 	err = fb_pan_display(fb_info, &var);
-	console_unlock();
+	fb_console_unlock();

 	if (err < 0)
 		return err;
@@ -403,9 +402,9 @@  static ssize_t store_fbstate(struct device *device,

 	if (!lock_fb_info(fb_info))
 		return -ENODEV;
-	console_lock();
+	fb_console_lock();
 	fb_set_suspend(fb_info, (int)state);
-	console_unlock();
+	fb_console_unlock();
 	unlock_fb_info(fb_info);

 	return count;
diff --git a/drivers/video/geode/gxfb_core.c b/drivers/video/geode/gxfb_core.c
index b4f19db..ba7dd0a 100644
--- a/drivers/video/geode/gxfb_core.c
+++ b/drivers/video/geode/gxfb_core.c
@@ -27,7 +27,6 @@ 
 #include <linux/mm.h>
 #include <linux/delay.h>
 #include <linux/fb.h>
-#include <linux/console.h>
 #include <linux/suspend.h>
 #include <linux/init.h>
 #include <linux/pci.h>
@@ -344,10 +343,10 @@  static int gxfb_suspend(struct pci_dev *pdev,
pm_message_t state)
 	struct fb_info *info = pci_get_drvdata(pdev);

 	if (state.event == PM_EVENT_SUSPEND) {
-		console_lock();
+		fb_console_lock();
 		gx_powerdown(info);
 		fb_set_suspend(info, 1);
-		console_unlock();
+		fb_console_unlock();
 	}

 	/* there's no point in setting PCI states; we emulate PCI, so
@@ -361,7 +360,7 @@  static int gxfb_resume(struct pci_dev *pdev)
 	struct fb_info *info = pci_get_drvdata(pdev);
 	int ret;

-	console_lock();
+	fb_console_lock();
 	ret = gx_powerup(info);
 	if (ret) {
 		printk(KERN_ERR "gxfb:  power up failed!\n");
@@ -369,7 +368,7 @@  static int gxfb_resume(struct pci_dev *pdev)
 	}

 	fb_set_suspend(info, 0);
-	console_unlock();
+	fb_console_unlock();
 	return 0;
 }
 #endif
diff --git a/drivers/video/geode/lxfb_core.c b/drivers/video/geode/lxfb_core.c
index 416851c..5341bf1 100644
--- a/drivers/video/geode/lxfb_core.c
+++ b/drivers/video/geode/lxfb_core.c
@@ -465,10 +465,10 @@  static int lxfb_suspend(struct pci_dev *pdev,
pm_message_t state)
 	struct fb_info *info = pci_get_drvdata(pdev);

 	if (state.event == PM_EVENT_SUSPEND) {
-		console_lock();
+		fb_console_lock();
 		lx_powerdown(info);
 		fb_set_suspend(info, 1);
-		console_unlock();
+		fb_console_unlock();
 	}

 	/* there's no point in setting PCI states; we emulate PCI, so
@@ -482,7 +482,7 @@  static int lxfb_resume(struct pci_dev *pdev)
 	struct fb_info *info = pci_get_drvdata(pdev);
 	int ret;

-	console_lock();
+	fb_console_lock();
 	ret = lx_powerup(info);
 	if (ret) {
 		printk(KERN_ERR "lxfb:  power up failed!\n");
@@ -490,7 +490,7 @@  static int lxfb_resume(struct pci_dev *pdev)
 	}

 	fb_set_suspend(info, 0);
-	console_unlock();
+	fb_console_unlock();
 	return 0;
 }
 #else
diff --git a/drivers/video/i740fb.c b/drivers/video/i740fb.c
index ff3f880..b3fe538 100644
--- a/drivers/video/i740fb.c
+++ b/drivers/video/i740fb.c
@@ -24,7 +24,6 @@ 
 #include <linux/pci_ids.h>
 #include <linux/i2c.h>
 #include <linux/i2c-algo-bit.h>
-#include <linux/console.h>
 #include <video/vga.h>

 #ifdef CONFIG_MTRR
@@ -1210,13 +1209,13 @@  static int i740fb_suspend(struct pci_dev *dev,
pm_message_t state)
 	if (state.event == PM_EVENT_FREEZE || state.event == PM_EVENT_PRETHAW)
 		return 0;

-	console_lock();
+	fb_console_lock();
 	mutex_lock(&(par->open_lock));

 	/* do nothing if framebuffer is not active */
 	if (par->ref_count == 0) {
 		mutex_unlock(&(par->open_lock));
-		console_unlock();
+		fb_console_unlock();
 		return 0;
 	}

@@ -1227,7 +1226,7 @@  static int i740fb_suspend(struct pci_dev *dev,
pm_message_t state)
 	pci_set_power_state(dev, pci_choose_state(dev, state));

 	mutex_unlock(&(par->open_lock));
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
@@ -1237,7 +1236,7 @@  static int i740fb_resume(struct pci_dev *dev)
 	struct fb_info *info = pci_get_drvdata(dev);
 	struct i740fb_par *par = info->par;

-	console_lock();
+	fb_console_lock();
 	mutex_lock(&(par->open_lock));

 	if (par->ref_count == 0)
@@ -1253,7 +1252,7 @@  static int i740fb_resume(struct pci_dev *dev)

 fail:
 	mutex_unlock(&(par->open_lock));
-	console_unlock();
+	fb_console_unlock();
 	return 0;
 }
 #else
diff --git a/drivers/video/i810/i810_main.c b/drivers/video/i810/i810_main.c
index b83f361..84fe1ed 100644
--- a/drivers/video/i810/i810_main.c
+++ b/drivers/video/i810/i810_main.c
@@ -40,7 +40,6 @@ 
 #include <linux/pci_ids.h>
 #include <linux/resource.h>
 #include <linux/unistd.h>
-#include <linux/console.h>

 #include <asm/io.h>
 #include <asm/div64.h>
@@ -1574,7 +1573,7 @@  static int i810fb_suspend(struct pci_dev *dev,
pm_message_t mesg)
 		return 0;
 	}

-	console_lock();
+	fb_console_lock();
 	fb_set_suspend(info, 1);

 	if (info->fbops->fb_sync)
@@ -1587,7 +1586,7 @@  static int i810fb_suspend(struct pci_dev *dev,
pm_message_t mesg)
 	pci_save_state(dev);
 	pci_disable_device(dev);
 	pci_set_power_state(dev, pci_choose_state(dev, mesg));
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
@@ -1605,7 +1604,7 @@  static int i810fb_resume(struct pci_dev *dev)
 		return 0;
 	}

-	console_lock();
+	fb_console_lock();
 	pci_set_power_state(dev, PCI_D0);
 	pci_restore_state(dev);

@@ -1621,7 +1620,7 @@  static int i810fb_resume(struct pci_dev *dev)
 	fb_set_suspend (info, 0);
 	info->fbops->fb_blank(VESA_NO_BLANKING, info);
 fail:
-	console_unlock();
+	fb_console_unlock();
 	return 0;
 }
 /***********************************************************************
diff --git a/drivers/video/jz4740_fb.c b/drivers/video/jz4740_fb.c
index de36693..7e9301a 100644
--- a/drivers/video/jz4740_fb.c
+++ b/drivers/video/jz4740_fb.c
@@ -21,7 +21,6 @@ 
 #include <linux/clk.h>
 #include <linux/delay.h>

-#include <linux/console.h>
 #include <linux/fb.h>

 #include <linux/dma-mapping.h>
@@ -778,9 +777,9 @@  static int jzfb_suspend(struct device *dev)
 {
 	struct jzfb *jzfb = dev_get_drvdata(dev);

-	console_lock();
+	fb_console_lock();
 	fb_set_suspend(jzfb->fb, 1);
-	console_unlock();
+	fb_console_unlock();

 	mutex_lock(&jzfb->lock);
 	if (jzfb->is_enabled)
@@ -800,9 +799,9 @@  static int jzfb_resume(struct device *dev)
 		jzfb_enable(jzfb);
 	mutex_unlock(&jzfb->lock);

-	console_lock();
+	fb_console_lock();
 	fb_set_suspend(jzfb->fb, 0);
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
diff --git a/drivers/video/mx3fb.c b/drivers/video/mx3fb.c
index c89f8a8..da25fa1 100644
--- a/drivers/video/mx3fb.c
+++ b/drivers/video/mx3fb.c
@@ -23,7 +23,6 @@ 
 #include <linux/ioport.h>
 #include <linux/dma-mapping.h>
 #include <linux/dmaengine.h>
-#include <linux/console.h>
 #include <linux/clk.h>
 #include <linux/mutex.h>

@@ -1204,9 +1203,9 @@  static int mx3fb_suspend(struct platform_device
*pdev, pm_message_t state)
 	struct mx3fb_data *mx3fb = platform_get_drvdata(pdev);
 	struct mx3fb_info *mx3_fbi = mx3fb->fbi->par;

-	console_lock();
+	fb_console_lock();
 	fb_set_suspend(mx3fb->fbi, 1);
-	console_unlock();
+	fb_console_unlock();

 	if (mx3_fbi->blank == FB_BLANK_UNBLANK) {
 		sdc_disable_channel(mx3_fbi);
@@ -1229,9 +1228,9 @@  static int mx3fb_resume(struct platform_device *pdev)
 		sdc_set_brightness(mx3fb, mx3fb->backlight_level);
 	}

-	console_lock();
+	fb_console_lock();
 	fb_set_suspend(mx3fb->fbi, 0);
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
diff --git a/drivers/video/nvidia/nvidia.c b/drivers/video/nvidia/nvidia.c
index fe13ac5..f47eb2a 100644
--- a/drivers/video/nvidia/nvidia.c
+++ b/drivers/video/nvidia/nvidia.c
@@ -19,7 +19,6 @@ 
 #include <linux/fb.h>
 #include <linux/init.h>
 #include <linux/pci.h>
-#include <linux/console.h>
 #include <linux/backlight.h>
 #ifdef CONFIG_MTRR
 #include <asm/mtrr.h>
@@ -1057,7 +1056,7 @@  static int nvidiafb_suspend(struct pci_dev *dev,
pm_message_t mesg)

 	if (mesg.event == PM_EVENT_PRETHAW)
 		mesg.event = PM_EVENT_FREEZE;
-	console_lock();
+	fb_console_lock();
 	par->pm_state = mesg.event;

 	if (mesg.event & PM_EVENT_SLEEP) {
@@ -1070,7 +1069,7 @@  static int nvidiafb_suspend(struct pci_dev *dev,
pm_message_t mesg)
 	}
 	dev->dev.power.power_state = mesg;

-	console_unlock();
+	fb_console_unlock();
 	return 0;
 }

@@ -1079,7 +1078,7 @@  static int nvidiafb_resume(struct pci_dev *dev)
 	struct fb_info *info = pci_get_drvdata(dev);
 	struct nvidia_par *par = info->par;

-	console_lock();
+	fb_console_lock();
 	pci_set_power_state(dev, PCI_D0);

 	if (par->pm_state != PM_EVENT_FREEZE) {
@@ -1097,7 +1096,7 @@  static int nvidiafb_resume(struct pci_dev *dev)
 	nvidiafb_blank(FB_BLANK_UNBLANK, info);

 fail:
-	console_unlock();
+	fb_console_unlock();
 	return 0;
 }
 #else
diff --git a/drivers/video/ps3fb.c b/drivers/video/ps3fb.c
index 213fbbc..cb2e174 100644
--- a/drivers/video/ps3fb.c
+++ b/drivers/video/ps3fb.c
@@ -23,7 +23,6 @@ 
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/interrupt.h>
-#include <linux/console.h>
 #include <linux/ioctl.h>
 #include <linux/kthread.h>
 #include <linux/freezer.h>
@@ -515,7 +514,7 @@  static int ps3fb_release(struct fb_info *info, int user)
 			atomic_set(&ps3fb.ext_flip, 0);
 			if (console_trylock()) {
 				ps3fb_sync(info, 0);	/* single buffer */
-				console_unlock();
+				fb_console_unlock();
 			}
 		}
 	}
@@ -830,14 +829,14 @@  static int ps3fb_ioctl(struct fb_info *info,
unsigned int cmd,
 			if (vmode) {
 				var = info->var;
 				fb_videomode_to_var(&var, vmode);
-				console_lock();
+				fb_console_lock();
 				info->flags |= FBINFO_MISC_USEREVENT;
 				/* Force, in case only special bits changed */
 				var.activate |= FB_ACTIVATE_FORCE;
 				par->new_mode_id = val;
 				retval = fb_set_var(info, &var);
 				info->flags &= ~FBINFO_MISC_USEREVENT;
-				console_unlock();
+				fb_console_unlock();
 			}
 			break;
 		}
@@ -881,9 +880,9 @@  static int ps3fb_ioctl(struct fb_info *info,
unsigned int cmd,
 			break;

 		dev_dbg(info->device, "PS3FB_IOCTL_FSEL:%d\n", val);
-		console_lock();
+		fb_console_lock();
 		retval = ps3fb_sync(info, val);
-		console_unlock();
+		fb_console_unlock();
 		break;

 	default:
@@ -903,9 +902,9 @@  static int ps3fbd(void *arg)
 		set_current_state(TASK_INTERRUPTIBLE);
 		if (ps3fb.is_kicked) {
 			ps3fb.is_kicked = 0;
-			console_lock();
+			fb_console_lock();
 			ps3fb_sync(info, 0);	/* single buffer */
-			console_unlock();
+			fb_console_unlock();
 		}
 		schedule();
 	}
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c
index 3f90255..a1af212 100644
--- a/drivers/video/pxafb.c
+++ b/drivers/video/pxafb.c
@@ -54,7 +54,6 @@ 
 #include <linux/mutex.h>
 #include <linux/kthread.h>
 #include <linux/freezer.h>
-#include <linux/console.h>

 #include <mach/hardware.h>
 #include <asm/io.h>
@@ -733,9 +732,9 @@  static int overlayfb_open(struct fb_info *info, int user)

 	if (ofb->usage++ == 0) {
 		/* unblank the base framebuffer */
-		console_lock();
+		fb_console_lock();
 		fb_blank(&ofb->fbi->fb, FB_BLANK_UNBLANK);
-		console_unlock();
+		fb_console_unlock();
 	}

 	return 0;
diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c
index 1d00736..7759c82 100644
--- a/drivers/video/s3fb.c
+++ b/drivers/video/s3fb.c
@@ -22,7 +22,6 @@ 
 #include <linux/svga.h>
 #include <linux/init.h>
 #include <linux/pci.h>
-#include <linux/console.h> /* Why should fb driver call console
functions? because console_lock() */
 #include <video/vga.h>

 #include <linux/i2c.h>
@@ -1445,12 +1444,12 @@  static int s3_pci_suspend(struct pci_dev* dev,
pm_message_t state)

 	dev_info(info->device, "suspend\n");

-	console_lock();
+	fb_fb_console_lock();
 	mutex_lock(&(par->open_lock));

 	if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
 		mutex_unlock(&(par->open_lock));
-		console_unlock();
+		fb_console_unlock();
 		return 0;
 	}

@@ -1461,7 +1460,7 @@  static int s3_pci_suspend(struct pci_dev* dev,
pm_message_t state)
 	pci_set_power_state(dev, pci_choose_state(dev, state));

 	mutex_unlock(&(par->open_lock));
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
@@ -1477,12 +1476,12 @@  static int s3_pci_resume(struct pci_dev* dev)

 	dev_info(info->device, "resume\n");

-	console_lock();
+	fb_fb_console_lock();
 	mutex_lock(&(par->open_lock));

 	if (par->ref_count == 0) {
 		mutex_unlock(&(par->open_lock));
-		console_unlock();
+		fb_console_unlock();
 		return 0;
 	}

@@ -1491,7 +1490,7 @@  static int s3_pci_resume(struct pci_dev* dev)
 	err = pci_enable_device(dev);
 	if (err) {
 		mutex_unlock(&(par->open_lock));
-		console_unlock();
+		fb_console_unlock();
 		dev_err(info->device, "error %d enabling device for resume\n", err);
 		return err;
 	}
@@ -1501,7 +1500,7 @@  static int s3_pci_resume(struct pci_dev* dev)
 	fb_set_suspend(info, 0);

 	mutex_unlock(&(par->open_lock));
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
diff --git a/drivers/video/savage/savagefb_driver.c
b/drivers/video/savage/savagefb_driver.c
index 0d0f52c..bf64221 100644
--- a/drivers/video/savage/savagefb_driver.c
+++ b/drivers/video/savage/savagefb_driver.c
@@ -51,7 +51,6 @@ 
 #include <linux/fb.h>
 #include <linux/pci.h>
 #include <linux/init.h>
-#include <linux/console.h>

 #include <asm/io.h>
 #include <asm/irq.h>
@@ -2391,7 +2390,7 @@  static int savagefb_suspend(struct pci_dev *dev,
pm_message_t mesg)
 	if (mesg.event == PM_EVENT_FREEZE)
 		return 0;

-	console_lock();
+	fb_console_lock();
 	fb_set_suspend(info, 1);

 	if (info->fbops->fb_sync)
@@ -2403,7 +2402,7 @@  static int savagefb_suspend(struct pci_dev *dev,
pm_message_t mesg)
 	pci_save_state(dev);
 	pci_disable_device(dev);
 	pci_set_power_state(dev, pci_choose_state(dev, mesg));
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
@@ -2427,7 +2426,7 @@  static int savagefb_resume(struct pci_dev* dev)
 		return 0;
 	}

-	console_lock();
+	fb_console_lock();

 	pci_set_power_state(dev, PCI_D0);
 	pci_restore_state(dev);
@@ -2441,7 +2440,7 @@  static int savagefb_resume(struct pci_dev* dev)
 	savagefb_set_par(info);
 	fb_set_suspend(info, 0);
 	savagefb_blank(FB_BLANK_UNBLANK, info);
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c
index 699487c..2bc1119 100644
--- a/drivers/video/sh_mobile_lcdcfb.c
+++ b/drivers/video/sh_mobile_lcdcfb.c
@@ -11,7 +11,6 @@ 
 #include <linux/atomic.h>
 #include <linux/backlight.h>
 #include <linux/clk.h>
-#include <linux/console.h>
 #include <linux/ctype.h>
 #include <linux/dma-mapping.h>
 #include <linux/delay.h>
@@ -575,7 +574,7 @@  static int sh_mobile_lcdc_display_notify(struct
sh_mobile_lcdc_chan *ch,
 	case SH_MOBILE_LCDC_EVENT_DISPLAY_CONNECT:
 		/* HDMI plug in */
 		if (lock_fb_info(info)) {
-			console_lock();
+			fb_console_lock();

 			ch->display.width = monspec->max_x * 10;
 			ch->display.height = monspec->max_y * 10;
@@ -594,7 +593,7 @@  static int sh_mobile_lcdc_display_notify(struct
sh_mobile_lcdc_chan *ch,
 				fb_set_suspend(info, 0);
 			}

-			console_unlock();
+			fb_console_unlock();
 			unlock_fb_info(info);
 		}
 		break;
@@ -602,9 +601,9 @@  static int sh_mobile_lcdc_display_notify(struct
sh_mobile_lcdc_chan *ch,
 	case SH_MOBILE_LCDC_EVENT_DISPLAY_DISCONNECT:
 		/* HDMI disconnect */
 		if (lock_fb_info(info)) {
-			console_lock();
+			fb_console_lock();
 			fb_set_suspend(info, 1);
-			console_unlock();
+			fb_console_unlock();
 			unlock_fb_info(info);
 		}
 		break;
@@ -1934,9 +1933,9 @@  static int sh_mobile_lcdc_release(struct fb_info
*info, int user)

 	/* Nothing to reconfigure, when called from fbcon */
 	if (user) {
-		console_lock();
+		fb_console_lock();
 		sh_mobile_fb_reconfig(info);
-		console_unlock();
+		fb_console_unlock();
 	}

 	mutex_unlock(&ch->open_lock);
diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c
index 3690eff..536f922 100644
--- a/drivers/video/sm501fb.c
+++ b/drivers/video/sm501fb.c
@@ -28,7 +28,6 @@ 
 #include <linux/wait.h>
 #include <linux/platform_device.h>
 #include <linux/clk.h>
-#include <linux/console.h>
 #include <linux/io.h>

 #include <asm/uaccess.h>
@@ -2104,9 +2103,9 @@  static int sm501fb_suspend_fb(struct sm501fb_info *info,

 	/* tell console/fb driver we are suspending */

-	console_lock();
+	fb_console_lock();
 	fb_set_suspend(fbi, 1);
-	console_unlock();
+	fb_console_unlock();

 	/* backup copies in case chip is powered down over suspend */

@@ -2163,9 +2162,9 @@  static void sm501fb_resume_fb(struct sm501fb_info *info,
 		memcpy_toio(par->cursor.k_addr, par->store_cursor,
 			    par->cursor.size);

-	console_lock();
+	fb_console_lock();
 	fb_set_suspend(fbi, 0);
-	console_unlock();
+	fb_console_unlock();

 	vfree(par->store_fb);
 	vfree(par->store_cursor);
diff --git a/drivers/video/tmiofb.c b/drivers/video/tmiofb.c
index 8e4a446..e266b6b 100644
--- a/drivers/video/tmiofb.c
+++ b/drivers/video/tmiofb.c
@@ -25,8 +25,7 @@ 
 #include <linux/fb.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
-/* Why should fb driver call console functions? because console_lock() */
-#include <linux/console.h>
+/* Why should fb driver call console functions? because fb_console_lock() */
 #include <linux/mfd/core.h>
 #include <linux/mfd/tmio.h>
 #include <linux/uaccess.h>
@@ -938,7 +937,7 @@  static int tmiofb_suspend(struct platform_device
*dev, pm_message_t state)
 	const struct mfd_cell *cell = mfd_get_cell(dev);
 	int retval = 0;

-	console_lock();
+	fb_console_lock();

 	fb_set_suspend(info, 1);

@@ -959,7 +958,7 @@  static int tmiofb_suspend(struct platform_device
*dev, pm_message_t state)
 	if (cell->suspend)
 		retval = cell->suspend(dev);

-	console_unlock();
+	fb_fb_console_unlock();

 	return retval;
 }
@@ -970,7 +969,7 @@  static int tmiofb_resume(struct platform_device *dev)
 	const struct mfd_cell *cell = mfd_get_cell(dev);
 	int retval = 0;

-	console_lock();
+	fb_console_lock();

 	if (cell->resume) {
 		retval = cell->resume(dev);
@@ -986,7 +985,7 @@  static int tmiofb_resume(struct platform_device *dev)

 	fb_set_suspend(info, 0);
 out:
-	console_unlock();
+	fb_fb_console_unlock();
 	return retval;
 }
 #else
diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c
index c80e770..d36b173 100644
--- a/drivers/video/via/viafbdev.c
+++ b/drivers/video/via/viafbdev.c
@@ -1698,17 +1698,17 @@  static int parse_mode(const char *str, u32
devices, u32 *xres, u32 *yres)
 #ifdef CONFIG_PM
 static int viafb_suspend(void *unused)
 {
-	console_lock();
+	fb_console_lock();
 	fb_set_suspend(viafbinfo, 1);
 	viafb_sync(viafbinfo);
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }

 static int viafb_resume(void *unused)
 {
-	console_lock();
+	fb_console_lock();
 	if (viaparinfo->shared->vdev->engine_mmio)
 		viafb_reset_engine(viaparinfo);
 	viafb_set_par(viafbinfo);
@@ -1716,7 +1716,7 @@  static int viafb_resume(void *unused)
 		viafb_set_par(viafbinfo1);
 	fb_set_suspend(viafbinfo, 0);

-	console_unlock();
+	fb_console_unlock();
 	return 0;
 }

diff --git a/drivers/video/vt8623fb.c b/drivers/video/vt8623fb.c
index 4e74d26..cb48d4d 100644
--- a/drivers/video/vt8623fb.c
+++ b/drivers/video/vt8623fb.c
@@ -23,7 +23,6 @@ 
 #include <linux/svga.h>
 #include <linux/init.h>
 #include <linux/pci.h>
-#include <linux/console.h> /* Why should fb driver call console
functions? because console_lock() */
 #include <video/vga.h>

 #ifdef CONFIG_MTRR
@@ -845,12 +844,12 @@  static int vt8623_pci_suspend(struct pci_dev*
dev, pm_message_t state)

 	dev_info(info->device, "suspend\n");

-	console_lock();
+	fb_console_lock();
 	mutex_lock(&(par->open_lock));

 	if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
 		mutex_unlock(&(par->open_lock));
-		console_unlock();
+		fb_console_unlock();
 		return 0;
 	}

@@ -861,7 +860,7 @@  static int vt8623_pci_suspend(struct pci_dev* dev,
pm_message_t state)
 	pci_set_power_state(dev, pci_choose_state(dev, state));

 	mutex_unlock(&(par->open_lock));
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
@@ -876,7 +875,7 @@  static int vt8623_pci_resume(struct pci_dev* dev)

 	dev_info(info->device, "resume\n");

-	console_lock();
+	fb_console_lock();
 	mutex_lock(&(par->open_lock));

 	if (par->ref_count == 0)
@@ -895,7 +894,7 @@  static int vt8623_pci_resume(struct pci_dev* dev)

 fail:
 	mutex_unlock(&(par->open_lock));
-	console_unlock();
+	fb_console_unlock();

 	return 0;
 }
diff --git a/drivers/video/xen-fbfront.c b/drivers/video/xen-fbfront.c
index b7f5173..770397e7 100644
--- a/drivers/video/xen-fbfront.c
+++ b/drivers/video/xen-fbfront.c
@@ -18,7 +18,6 @@ 
  * frame buffer.
  */

-#include <linux/console.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/fb.h>
@@ -495,12 +494,12 @@  xenfb_make_preferred_console(void)
 	if (console_set_on_cmdline)
 		return;

-	console_lock();
+	fb_console_lock();
 	for_each_console(c) {
 		if (!strcmp(c->name, "tty") && c->index == 0)
 			break;
 	}
-	console_unlock();
+	fb_console_unlock();
 	if (c) {
 		unregister_console(c);
 		c->flags |= CON_CONSDEV;
diff --git a/include/linux/fb.h b/include/linux/fb.h
index ac3f1c6..7ae96ad 100644
--- a/include/linux/fb.h
+++ b/include/linux/fb.h
@@ -1021,6 +1021,8 @@  extern int fb_get_color_depth(struct
fb_var_screeninfo *var,
 			      struct fb_fix_screeninfo *fix);
 extern int fb_get_options(char *name, char **option);
 extern int fb_new_modelist(struct fb_info *info);
+extern void fb_console_unlock(void);
+extern void fb_console_lock(void);

 extern struct fb_info *registered_fb[FB_MAX];