Commit c5eec03f authored by Antonino A. Daplas's avatar Antonino A. Daplas Committed by Linus Torvalds

[PATCH] i810fb: Fix suspend and resume hooks

The i810fb suspend and resume hooks have suffered bitrot over time.  Update to
current framework, but functionality still not guaranteed to work.
Signed-off-by: default avatarAntonino Daplas <adaplas@pol.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 740f14ba
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#include <linux/pci_ids.h> #include <linux/pci_ids.h>
#include <linux/resource.h> #include <linux/resource.h>
#include <linux/unistd.h> #include <linux/unistd.h>
#include <linux/console.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/div64.h> #include <asm/div64.h>
...@@ -1517,35 +1518,28 @@ static int i810fb_suspend(struct pci_dev *dev, pm_message_t state) ...@@ -1517,35 +1518,28 @@ static int i810fb_suspend(struct pci_dev *dev, pm_message_t state)
{ {
struct fb_info *info = pci_get_drvdata(dev); struct fb_info *info = pci_get_drvdata(dev);
struct i810fb_par *par = info->par; struct i810fb_par *par = info->par;
int blank = 0, prev_state = par->cur_state;
if (state.event == prev_state)
return 0;
par->cur_state = state.event; par->cur_state = state.event;
switch (state.event) { if (state.event == PM_EVENT_FREEZE) {
case 1: dev->dev.power.power_state = state;
blank = VESA_VSYNC_SUSPEND; return 0;
break;
case 2:
blank = VESA_HSYNC_SUSPEND;
break;
case 3:
blank = VESA_POWERDOWN;
break;
default:
return -EINVAL;
} }
info->fbops->fb_blank(blank, info);
if (!prev_state) { acquire_console_sem();
fb_set_suspend(info, 1);
if (info->fbops->fb_sync)
info->fbops->fb_sync(info);
i810fb_blank(FB_BLANK_POWERDOWN, info);
agp_unbind_memory(par->i810_gtt.i810_fb_memory); agp_unbind_memory(par->i810_gtt.i810_fb_memory);
agp_unbind_memory(par->i810_gtt.i810_cursor_memory); agp_unbind_memory(par->i810_gtt.i810_cursor_memory);
pci_disable_device(dev);
}
pci_save_state(dev); 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, state));
release_console_sem();
return 0; return 0;
} }
...@@ -1554,22 +1548,28 @@ static int i810fb_resume(struct pci_dev *dev) ...@@ -1554,22 +1548,28 @@ static int i810fb_resume(struct pci_dev *dev)
{ {
struct fb_info *info = pci_get_drvdata(dev); struct fb_info *info = pci_get_drvdata(dev);
struct i810fb_par *par = info->par; struct i810fb_par *par = info->par;
int cur_state = par->cur_state;
if (par->cur_state == 0) par->cur_state = PM_EVENT_ON;
if (cur_state == PM_EVENT_FREEZE) {
pci_set_power_state(dev, PCI_D0);
return 0; return 0;
}
pci_restore_state(dev); acquire_console_sem();
pci_set_power_state(dev, PCI_D0); pci_set_power_state(dev, PCI_D0);
pci_restore_state(dev);
pci_enable_device(dev); pci_enable_device(dev);
pci_set_master(dev);
agp_bind_memory(par->i810_gtt.i810_fb_memory, agp_bind_memory(par->i810_gtt.i810_fb_memory,
par->fb.offset); par->fb.offset);
agp_bind_memory(par->i810_gtt.i810_cursor_memory, agp_bind_memory(par->i810_gtt.i810_cursor_memory,
par->cursor_heap.offset); par->cursor_heap.offset);
i810fb_set_par(info);
fb_set_suspend (info, 0);
info->fbops->fb_blank(VESA_NO_BLANKING, info); info->fbops->fb_blank(VESA_NO_BLANKING, info);
release_console_sem();
par->cur_state = 0;
return 0; return 0;
} }
/*********************************************************************** /***********************************************************************
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment