Commit c78a7c2d authored by David Brownell's avatar David Brownell Committed by Greg Kroah-Hartman

PM: video drivers and PM_EVENT_PRETHAW

Video drivers which explicitly test for messages reporting PM_EVENT_FREEZE
will now handle PM_EVENT_PRETHAW the same way.
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Pavel Machek <pavel@ucw.cz>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent b887d2e6
...@@ -2621,25 +2621,28 @@ static int radeon_restore_pci_cfg(struct radeonfb_info *rinfo) ...@@ -2621,25 +2621,28 @@ static int radeon_restore_pci_cfg(struct radeonfb_info *rinfo)
} }
int radeonfb_pci_suspend(struct pci_dev *pdev, pm_message_t state) int radeonfb_pci_suspend(struct pci_dev *pdev, pm_message_t mesg)
{ {
struct fb_info *info = pci_get_drvdata(pdev); struct fb_info *info = pci_get_drvdata(pdev);
struct radeonfb_info *rinfo = info->par; struct radeonfb_info *rinfo = info->par;
int i; int i;
if (state.event == pdev->dev.power.power_state.event) if (mesg.event == pdev->dev.power.power_state.event)
return 0; return 0;
printk(KERN_DEBUG "radeonfb (%s): suspending to state: %d...\n", printk(KERN_DEBUG "radeonfb (%s): suspending for event: %d...\n",
pci_name(pdev), state.event); pci_name(pdev), mesg.event);
/* For suspend-to-disk, we cheat here. We don't suspend anything and /* For suspend-to-disk, we cheat here. We don't suspend anything and
* let fbcon continue drawing until we are all set. That shouldn't * let fbcon continue drawing until we are all set. That shouldn't
* really cause any problem at this point, provided that the wakeup * really cause any problem at this point, provided that the wakeup
* code knows that any state in memory may not match the HW * code knows that any state in memory may not match the HW
*/ */
if (state.event == PM_EVENT_FREEZE) switch (mesg.event) {
case PM_EVENT_FREEZE: /* about to take snapshot */
case PM_EVENT_PRETHAW: /* before restoring snapshot */
goto done; goto done;
}
acquire_console_sem(); acquire_console_sem();
...@@ -2706,7 +2709,7 @@ int radeonfb_pci_suspend(struct pci_dev *pdev, pm_message_t state) ...@@ -2706,7 +2709,7 @@ int radeonfb_pci_suspend(struct pci_dev *pdev, pm_message_t state)
release_console_sem(); release_console_sem();
done: done:
pdev->dev.power.power_state = state; pdev->dev.power.power_state = mesg;
return 0; return 0;
} }
......
...@@ -1554,15 +1554,17 @@ static struct fb_ops i810fb_ops __devinitdata = { ...@@ -1554,15 +1554,17 @@ static struct fb_ops i810fb_ops __devinitdata = {
/*********************************************************************** /***********************************************************************
* Power Management * * Power Management *
***********************************************************************/ ***********************************************************************/
static int i810fb_suspend(struct pci_dev *dev, pm_message_t state) static int i810fb_suspend(struct pci_dev *dev, pm_message_t mesg)
{ {
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;
par->cur_state = state.event; par->cur_state = mesg.event;
if (state.event == PM_EVENT_FREEZE) { switch (mesg.event) {
dev->dev.power.power_state = state; case PM_EVENT_FREEZE:
case PM_EVENT_PRETHAW:
dev->dev.power.power_state = mesg;
return 0; return 0;
} }
...@@ -1578,7 +1580,7 @@ static int i810fb_suspend(struct pci_dev *dev, pm_message_t state) ...@@ -1578,7 +1580,7 @@ static int i810fb_suspend(struct pci_dev *dev, pm_message_t state)
pci_save_state(dev); pci_save_state(dev);
pci_disable_device(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(); release_console_sem();
return 0; return 0;
......
...@@ -950,24 +950,25 @@ static struct fb_ops nvidia_fb_ops = { ...@@ -950,24 +950,25 @@ static struct fb_ops nvidia_fb_ops = {
}; };
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int nvidiafb_suspend(struct pci_dev *dev, pm_message_t state) static int nvidiafb_suspend(struct pci_dev *dev, pm_message_t mesg)
{ {
struct fb_info *info = pci_get_drvdata(dev); struct fb_info *info = pci_get_drvdata(dev);
struct nvidia_par *par = info->par; struct nvidia_par *par = info->par;
if (mesg.event == PM_EVENT_PRETHAW)
mesg.event = PM_EVENT_FREEZE;
acquire_console_sem(); acquire_console_sem();
par->pm_state = state.event; par->pm_state = mesg.event;
if (state.event == PM_EVENT_FREEZE) { if (mesg.event == PM_EVENT_SUSPEND) {
dev->dev.power.power_state = state;
} else {
fb_set_suspend(info, 1); fb_set_suspend(info, 1);
nvidiafb_blank(FB_BLANK_POWERDOWN, info); nvidiafb_blank(FB_BLANK_POWERDOWN, info);
nvidia_write_regs(par, &par->SavedReg); nvidia_write_regs(par, &par->SavedReg);
pci_save_state(dev); pci_save_state(dev);
pci_disable_device(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));
} }
dev->dev.power.power_state = mesg;
release_console_sem(); release_console_sem();
return 0; return 0;
......
...@@ -2323,24 +2323,24 @@ static void __devexit savagefb_remove(struct pci_dev *dev) ...@@ -2323,24 +2323,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 fb_info *info = pci_get_drvdata(dev);
struct savagefb_par *par = info->par; struct savagefb_par *par = info->par;
DBG("savagefb_suspend"); DBG("savagefb_suspend");
if (mesg.event == PM_EVENT_PRETHAW)
par->pm_state = state.event; 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 * For PM_EVENT_FREEZE, do not power down so the console
* can remain active. * can remain active.
*/ */
if (state.event == PM_EVENT_FREEZE) { if (mesg.event == PM_EVENT_FREEZE)
dev->dev.power.power_state = state;
return 0; return 0;
}
acquire_console_sem(); acquire_console_sem();
fb_set_suspend(info, 1); fb_set_suspend(info, 1);
...@@ -2353,7 +2353,7 @@ static int savagefb_suspend(struct pci_dev* dev, pm_message_t state) ...@@ -2353,7 +2353,7 @@ static int savagefb_suspend(struct pci_dev* dev, pm_message_t state)
savage_disable_mmio(par); savage_disable_mmio(par);
pci_save_state(dev); pci_save_state(dev);
pci_disable_device(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(); release_console_sem();
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