static int chipsfb_pci_resume(struct pci_dev *pdev) { struct fb_info *p = pci_get_drvdata(pdev); console_lock(); fb_set_suspend(p, 0); chipsfb_blank(0, p); console_unlock(); pdev->dev.power.power_state = PMSG_ON; return 0; }
/* * Save the contents of the frame buffer when we go to sleep, * and restore it when we wake up again. */ int chips_sleep_notify(struct pmu_sleep_notifier *self, int when) { struct fb_info *p = &chipsfb_info; int nb = p->var.yres * p->fix.line_length; if (p->screen_base == NULL) return PBOOK_SLEEP_OK; switch (when) { case PBOOK_SLEEP_REQUEST: save_framebuffer = vmalloc(nb); if (save_framebuffer == NULL) return PBOOK_SLEEP_REFUSE; break; case PBOOK_SLEEP_REJECT: if (save_framebuffer) { vfree(save_framebuffer); save_framebuffer = NULL; } break; case PBOOK_SLEEP_NOW: chipsfb_blank(1, p); if (save_framebuffer) memcpy(save_framebuffer, p->screen_base, nb); break; case PBOOK_WAKE: if (save_framebuffer) { memcpy(p->screen_base, save_framebuffer, nb); vfree(save_framebuffer); save_framebuffer = NULL; } chipsfb_blank(0, p); break; } return PBOOK_SLEEP_OK; }
static int chipsfb_pci_suspend(struct pci_dev *pdev, pm_message_t state) { struct fb_info *p = pci_get_drvdata(pdev); if (state.event == pdev->dev.power.power_state.event) return 0; if (!(state.event & PM_EVENT_SLEEP)) goto done; console_lock(); chipsfb_blank(1, p); fb_set_suspend(p, 1); console_unlock(); done: pdev->dev.power.power_state = state; return 0; }
static int chipsfb_pci_suspend(struct pci_dev *pdev, pm_message_t state) { struct fb_info *p = pci_get_drvdata(pdev); if (state.event == pdev->dev.power.power_state.event) return 0; if (state.event != PM_SUSPEND_MEM) goto done; acquire_console_sem(); chipsfb_blank(1, p); fb_set_suspend(p, 1); release_console_sem(); done: pdev->dev.power.power_state = state; return 0; }