Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+28 −28
Original line number Diff line number Diff line
@@ -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) { 
	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_disable_device(dev);
	}

	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;
}
/***********************************************************************