From: "Antonino A. Daplas" 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 Signed-off-by: Andrew Morton --- drivers/video/i810/i810_main.c | 56 ++++++++++++++++++++--------------------- 1 files changed, 28 insertions(+), 28 deletions(-) diff -puN drivers/video/i810/i810_main.c~i810fb-fix-suspend-and-resume-hooks drivers/video/i810/i810_main.c --- devel/drivers/video/i810/i810_main.c~i810fb-fix-suspend-and-resume-hooks 2006-01-03 20:00:14.000000000 -0800 +++ devel-akpm/drivers/video/i810/i810_main.c 2006-01-03 20:00:14.000000000 -0800 @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -1517,35 +1518,28 @@ static int i810fb_suspend(struct pci_dev { 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 { struct fb_info *info = pci_get_drvdata(dev); struct i810fb_par *par = info->par; + int cur_state = par->cur_state; + + par->cur_state = PM_EVENT_ON; - if (par->cur_state == 0) + 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; } /*********************************************************************** _