mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 18:39:59 +00:00
[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: Antonino Daplas <adaplas@pol.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
740f14ba53
commit
c5eec03f31
1 changed files with 28 additions and 28 deletions
|
@ -42,6 +42,7 @@
|
|||
#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>
|
||||
|
@ -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 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;
|
||||
|
||||
switch (state.event) {
|
||||
case 1:
|
||||
blank = VESA_VSYNC_SUSPEND;
|
||||
break;
|
||||
case 2:
|
||||
blank = VESA_HSYNC_SUSPEND;
|
||||
break;
|
||||
case 3:
|
||||
blank = VESA_POWERDOWN;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
if (state.event == PM_EVENT_FREEZE) {
|
||||
dev->dev.power.power_state = state;
|
||||
return 0;
|
||||
}
|
||||
info->fbops->fb_blank(blank, info);
|
||||
|
||||
if (!prev_state) {
|
||||
agp_unbind_memory(par->i810_gtt.i810_fb_memory);
|
||||
agp_unbind_memory(par->i810_gtt.i810_cursor_memory);
|
||||
pci_disable_device(dev);
|
||||
}
|
||||
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_cursor_memory);
|
||||
|
||||
pci_save_state(dev);
|
||||
pci_disable_device(dev);
|
||||
pci_set_power_state(dev, pci_choose_state(dev, state));
|
||||
release_console_sem();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1554,22 +1548,28 @@ static int i810fb_resume(struct pci_dev *dev)
|
|||
{
|
||||
struct fb_info *info = pci_get_drvdata(dev);
|
||||
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;
|
||||
}
|
||||
|
||||
pci_restore_state(dev);
|
||||
acquire_console_sem();
|
||||
pci_set_power_state(dev, PCI_D0);
|
||||
pci_restore_state(dev);
|
||||
pci_enable_device(dev);
|
||||
pci_set_master(dev);
|
||||
agp_bind_memory(par->i810_gtt.i810_fb_memory,
|
||||
par->fb.offset);
|
||||
agp_bind_memory(par->i810_gtt.i810_cursor_memory,
|
||||
par->cursor_heap.offset);
|
||||
|
||||
i810fb_set_par(info);
|
||||
fb_set_suspend (info, 0);
|
||||
info->fbops->fb_blank(VESA_NO_BLANKING, info);
|
||||
|
||||
par->cur_state = 0;
|
||||
|
||||
release_console_sem();
|
||||
return 0;
|
||||
}
|
||||
/***********************************************************************
|
||||
|
|
Loading…
Reference in a new issue