Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=22d832edcace45b26ced76efef6c863449e4e060
Commit:     22d832edcace45b26ced76efef6c863449e4e060
Parent:     f7829158bce2c8180bf7a1cb922cad812d3a2788
Author:     Antonino A. Daplas <[EMAIL PROTECTED]>
AuthorDate: Tue May 8 00:38:36 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Tue May 8 11:15:29 2007 -0700

    savagefb: VGA state save and restore
    
    Allow the saving and restoration of VGA text mode.  The state is saved on 
the
    first open and restored on the last close. Because of the VGA registers are
    linearly mapped to the MMIO space, MMIO access is used which is not limited 
to
    X86 platforms nor to the primary display device.
    
    An echo 0 > /sys/class/vtconsole/vtcon1/bind will convert the display from
    graphics to text mode.
    
    Signed-off-by: Antonino Daplas <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 drivers/video/Makefile                 |    2 +-
 drivers/video/savage/savagefb.h        |   10 ++++++-
 drivers/video/savage/savagefb_driver.c |   39 ++++++++++++++++++++++++++++++++
 3 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index c8b43eb..1e1845d 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -38,7 +38,7 @@ obj-$(CONFIG_FB_ATY128)                 += aty/ macmodes.o
 obj-$(CONFIG_FB_RADEON)                  += aty/
 obj-$(CONFIG_FB_SIS)             += sis/
 obj-$(CONFIG_FB_KYRO)             += kyro/
-obj-$(CONFIG_FB_SAVAGE)                  += savage/
+obj-$(CONFIG_FB_SAVAGE)                  += savage/ vgastate.o
 obj-$(CONFIG_FB_GEODE)           += geode/
 obj-$(CONFIG_FB_MBX)             += mbx/
 obj-$(CONFIG_FB_I810)             += vgastate.o
diff --git a/drivers/video/savage/savagefb.h b/drivers/video/savage/savagefb.h
index e648a6c..8bfdfc3 100644
--- a/drivers/video/savage/savagefb.h
+++ b/drivers/video/savage/savagefb.h
@@ -15,6 +15,8 @@
 #include <linux/i2c.h>
 #include <linux/i2c-id.h>
 #include <linux/i2c-algo-bit.h>
+#include <linux/mutex.h>
+#include <video/vga.h>
 #include "../edid.h"
 
 #ifdef SAVAGEFB_DEBUG
@@ -189,8 +191,12 @@ struct savagefb_par {
        struct savagefb_i2c_chan chan;
        struct savage_reg state;
        struct savage_reg save;
+       struct savage_reg initial;
+       struct vgastate vgastate;
+       struct mutex open_lock;
        unsigned char   *edid;
        u32 pseudo_palette[16];
+       u32 open_count;
        int paletteEnabled;
        int pm_state;
        int display_type;
@@ -203,7 +209,7 @@ struct savagefb_par {
        int clock[4];
        int MCLK, REFCLK, LCDclk;
        struct {
-               u8   __iomem *vbase;
+               void   __iomem *vbase;
                u32    pbase;
                u32    len;
 #ifdef CONFIG_MTRR
@@ -212,7 +218,7 @@ struct savagefb_par {
        } video;
 
        struct {
-               volatile u8  __iomem *vbase;
+               void  __iomem *vbase;
                u32           pbase;
                u32           len;
        } mmio;
diff --git a/drivers/video/savage/savagefb_driver.c 
b/drivers/video/savage/savagefb_driver.c
index 0166ec2..3d7507a 100644
--- a/drivers/video/savage/savagefb_driver.c
+++ b/drivers/video/savage/savagefb_driver.c
@@ -1623,8 +1623,46 @@ static void savagefb_restore_state(struct fb_info *info)
        savagefb_blank(FB_BLANK_UNBLANK, info);
 }
 
+static int savagefb_open(struct fb_info *info, int user)
+{
+       struct savagefb_par *par = info->par;
+
+       mutex_lock(&par->open_lock);
+
+       if (!par->open_count) {
+               memset(&par->vgastate, 0, sizeof(par->vgastate));
+               par->vgastate.flags = VGA_SAVE_CMAP | VGA_SAVE_FONTS |
+                       VGA_SAVE_MODE;
+               par->vgastate.vgabase = par->mmio.vbase + 0x8000;
+               save_vga(&par->vgastate);
+               savage_get_default_par(par, &par->initial);
+       }
+
+       par->open_count++;
+       mutex_unlock(&par->open_lock);
+       return 0;
+}
+
+static int savagefb_release(struct fb_info *info, int user)
+{
+       struct savagefb_par *par = info->par;
+
+       mutex_lock(&par->open_lock);
+
+       if (par->open_count == 1) {
+               savage_set_default_par(par, &par->initial);
+               restore_vga(&par->vgastate);
+       }
+
+       par->open_count--;
+       mutex_unlock(&par->open_lock);
+       return 0;
+}
+
 static struct fb_ops savagefb_ops = {
        .owner          = THIS_MODULE,
+       .fb_open        = savagefb_open,
+       .fb_release     = savagefb_release,
        .fb_check_var   = savagefb_check_var,
        .fb_set_par     = savagefb_set_par,
        .fb_setcolreg   = savagefb_setcolreg,
@@ -2173,6 +2211,7 @@ static int __devinit savagefb_probe(struct pci_dev* dev,
        if (!info)
                return -ENOMEM;
        par = info->par;
+       mutex_init(&par->open_lock);
        err = pci_enable_device(dev);
        if (err)
                goto failed_enable;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to