fb: remove fb_save_state() and fb_restore_state operations
authorKrzysztof Helt <krzysztof.h1@wp.pl>
Wed, 11 Nov 2009 22:26:22 +0000 (14:26 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 12 Nov 2009 15:25:56 +0000 (07:25 -0800)
Remove fb_save_state() and fb_restore_state operations from frame buffer layer.
They are used only in two drivers:
1. savagefb  - and cause bug #11248
2. uvesafb

Usage of these operations is misunderstood in both drivers so kill these
operations, fix the bug #11248 and avoid confusion in the future.

Tested on Savage 3D/MV card and the patch fixes the bug #11248.

The frame buffer layer uses these funtions during switch between graphics
and text mode of the console, but these drivers saves state before
switching of the frame buffer (in the fb_open) and after releasing it (in
the fb_release).  This defeats the purpose of these operations.

Addresses http://bugzilla.kernel.org/show_bug.cgi?id=11248

Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
Reported-by: Jochen Hein <jochen@jochen.org>
Tested-by: Jochen Hein <jochen@jochen.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Michal Januszewski <spock@gentoo.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/video/atafb.c
drivers/video/console/fbcon.c
drivers/video/savage/savagefb_driver.c
drivers/video/uvesafb.c
include/linux/fb.h

index 8cd279be74e5de975d1e3871f806673e67de3783..37624f74e88b0dc43d8f0a1eff27421d5648be5d 100644 (file)
@@ -329,12 +329,6 @@ extern unsigned char fontdata_8x16[];
  *
  *     * perform fb specific mmap *
  *     int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);
- *
- *     * save current hardware state *
- *     void (*fb_save_state)(struct fb_info *info);
- *
- *     * restore saved state *
- *     void (*fb_restore_state)(struct fb_info *info);
  * } ;
  */
 
index 5a686cea23f4931db5ad56b8cfe7f07471de90fd..3681c6a8821239ad58858a062e0f2e6177f994fa 100644 (file)
@@ -2311,14 +2311,11 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
                ops->graphics = 1;
 
                if (!blank) {
-                       if (info->fbops->fb_save_state)
-                               info->fbops->fb_save_state(info);
                        var.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE;
                        fb_set_var(info, &var);
                        ops->graphics = 0;
                        ops->var = info->var;
-               } else if (info->fbops->fb_restore_state)
-                       info->fbops->fb_restore_state(info);
+               }
        }
 
        if (!fbcon_is_inactive(vc, info)) {
index 37b135d5d12ed92de0d46cd08c6250bbae297c20..0857b3b8c495220e27db6c0addc2abacd4315461 100644 (file)
@@ -1606,22 +1606,6 @@ static int savagefb_blank(int blank, struct fb_info *info)
        return (blank == FB_BLANK_NORMAL) ? 1 : 0;
 }
 
-static void savagefb_save_state(struct fb_info *info)
-{
-       struct savagefb_par *par = info->par;
-
-       savage_get_default_par(par, &par->save);
-}
-
-static void savagefb_restore_state(struct fb_info *info)
-{
-       struct savagefb_par *par = info->par;
-
-       savagefb_blank(FB_BLANK_POWERDOWN, info);
-       savage_set_default_par(par, &par->save);
-       savagefb_blank(FB_BLANK_UNBLANK, info);
-}
-
 static int savagefb_open(struct fb_info *info, int user)
 {
        struct savagefb_par *par = info->par;
@@ -1667,8 +1651,6 @@ static struct fb_ops savagefb_ops = {
        .fb_setcolreg   = savagefb_setcolreg,
        .fb_pan_display = savagefb_pan_display,
        .fb_blank       = savagefb_blank,
-       .fb_save_state  = savagefb_save_state,
-       .fb_restore_state = savagefb_restore_state,
 #if defined(CONFIG_FB_SAVAGE_ACCEL)
        .fb_fillrect    = savagefb_fillrect,
        .fb_copyarea    = savagefb_copyarea,
index e35232a1857199926882234faf795e61cd755cc7..54fbb2995a5f3007d2ed5fbceea54738e9314904 100644 (file)
@@ -1411,23 +1411,6 @@ static int uvesafb_check_var(struct fb_var_screeninfo *var,
        return 0;
 }
 
-static void uvesafb_save_state(struct fb_info *info)
-{
-       struct uvesafb_par *par = info->par;
-
-       if (par->vbe_state_saved)
-               kfree(par->vbe_state_saved);
-
-       par->vbe_state_saved = uvesafb_vbe_state_save(par);
-}
-
-static void uvesafb_restore_state(struct fb_info *info)
-{
-       struct uvesafb_par *par = info->par;
-
-       uvesafb_vbe_state_restore(par, par->vbe_state_saved);
-}
-
 static struct fb_ops uvesafb_ops = {
        .owner          = THIS_MODULE,
        .fb_open        = uvesafb_open,
@@ -1441,8 +1424,6 @@ static struct fb_ops uvesafb_ops = {
        .fb_imageblit   = cfb_imageblit,
        .fb_check_var   = uvesafb_check_var,
        .fb_set_par     = uvesafb_set_par,
-       .fb_save_state  = uvesafb_save_state,
-       .fb_restore_state = uvesafb_restore_state,
 };
 
 static void __devinit uvesafb_init_info(struct fb_info *info,
@@ -1459,15 +1440,6 @@ static void __devinit uvesafb_init_info(struct fb_info *info,
        info->fix.ypanstep = par->ypan ? 1 : 0;
        info->fix.ywrapstep = (par->ypan > 1) ? 1 : 0;
 
-       /*
-        * If we were unable to get the state buffer size, disable
-        * functions for saving and restoring the hardware state.
-        */
-       if (par->vbe_state_size == 0) {
-               info->fbops->fb_save_state = NULL;
-               info->fbops->fb_restore_state = NULL;
-       }
-
        /* Disable blanking if the user requested so. */
        if (!blank)
                info->fbops->fb_blank = NULL;
index a34bdf5a9d232e8d6d0c8a1d4efc1d2d069856b4..de9c722e7b90e0827bb39a9ce3c26eb641914599 100644 (file)
@@ -669,12 +669,6 @@ struct fb_ops {
        /* perform fb specific mmap */
        int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);
 
-       /* save current hardware state */
-       void (*fb_save_state)(struct fb_info *info);
-
-       /* restore saved state */
-       void (*fb_restore_state)(struct fb_info *info);
-
        /* get capability given var */
        void (*fb_get_caps)(struct fb_info *info, struct fb_blit_caps *caps,
                            struct fb_var_screeninfo *var);