[PATCH] savagefb: Fix black screen on load in Savage IX
[powerpc.git] / drivers / video / savage / savagefb_driver.c
index 4729af4..d952bf3 100644 (file)
@@ -46,7 +46,6 @@
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/mm.h>
-#include <linux/tty.h>
 #include <linux/slab.h>
 #include <linux/delay.h>
 #include <linux/fb.h>
@@ -385,6 +384,19 @@ SavageSetup2DEngine(struct savagefb_par  *par)
        BCI_SEND(0);
        BCI_SEND(BCI_CMD_SETREG | (1 << 16) | BCI_GBD2);
        BCI_SEND(GlobalBitmapDescriptor);
+
+       /*
+        * I don't know why, sending this twice fixes the intial black screen,
+        * prevents X from crashing at least in Toshiba laptops with SavageIX.
+        * --Tony
+        */
+       par->bci_ptr = 0;
+       par->SavageWaitFifo(par, 4);
+
+       BCI_SEND(BCI_CMD_SETREG | (1 << 16) | BCI_GBD1);
+       BCI_SEND(0);
+       BCI_SEND(BCI_CMD_SETREG | (1 << 16) | BCI_GBD2);
+       BCI_SEND(GlobalBitmapDescriptor);
 }
 
 static void savagefb_set_clip(struct fb_info *info)
@@ -834,7 +846,8 @@ static void savage_set_default_par(struct savagefb_par *par,
        vga_out8(0x3d5, cr66, par);
 }
 
-static void savage_update_var(struct fb_var_screeninfo *var, struct fb_videomode *modedb)
+static void savage_update_var(struct fb_var_screeninfo *var,
+                             const struct fb_videomode *modedb)
 {
        var->xres = var->xres_virtual = modedb->xres;
        var->yres = modedb->yres;
@@ -903,7 +916,7 @@ static int savagefb_check_var(struct fb_var_screeninfo   *var,
        }
 
        if (!mode_valid) {
-               struct fb_videomode *mode;
+               const struct fb_videomode *mode;
 
                mode = fb_find_best_mode(var, &info->modelist);
                if (mode) {
@@ -2207,11 +2220,10 @@ static int __devinit savagefb_probe(struct pci_dev* dev,
                             info->monspecs.modedb, info->monspecs.modedb_len,
                             NULL, 8);
        } else if (info->monspecs.modedb != NULL) {
-               struct fb_videomode *modedb;
+               const struct fb_videomode *mode;
 
-               modedb = fb_find_best_display(&info->monspecs,
-                                             &info->modelist);
-               savage_update_var(&info->var, modedb);
+               mode = fb_find_best_display(&info->monspecs, &info->modelist);
+               savage_update_var(&info->var, mode);
        }
 
        /* maximize virtual vertical length */
@@ -2324,24 +2336,24 @@ static void __devexit savagefb_remove(struct pci_dev *dev)
        }
 }
 
-static int savagefb_suspend(struct pci_dev* dev, pm_message_t state)
+static int savagefb_suspend(struct pci_dev *dev, pm_message_t mesg)
 {
        struct fb_info *info = pci_get_drvdata(dev);
        struct savagefb_par *par = info->par;
 
        DBG("savagefb_suspend");
 
-
-       par->pm_state = state.event;
+       if (mesg.event == PM_EVENT_PRETHAW)
+               mesg.event = PM_EVENT_FREEZE;
+       par->pm_state = mesg.event;
+       dev->dev.power.power_state = mesg;
 
        /*
         * For PM_EVENT_FREEZE, do not power down so the console
         * can remain active.
         */
-       if (state.event == PM_EVENT_FREEZE) {
-               dev->dev.power.power_state = state;
+       if (mesg.event == PM_EVENT_FREEZE)
                return 0;
-       }
 
        acquire_console_sem();
        fb_set_suspend(info, 1);
@@ -2354,7 +2366,7 @@ static int savagefb_suspend(struct pci_dev* dev, pm_message_t state)
        savage_disable_mmio(par);
        pci_save_state(dev);
        pci_disable_device(dev);
-       pci_set_power_state(dev, pci_choose_state(dev, state));
+       pci_set_power_state(dev, pci_choose_state(dev, mesg));
        release_console_sem();
 
        return 0;