From 8eb861fb61fda78e6c142ffa66c586357aaa2e44 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 22 Jan 2007 15:50:14 +0800 Subject: [PATCH] Replace the custom SaveScreen function with a generic function calling DPMS. With this, additional power saving occurs with the core screensaver, for example by turning off LVDS backlight. --- src/i830_driver.c | 54 +-------------------------------------------- src/i830_xf86Crtc.c | 22 ++++++++++++++++++ src/i830_xf86Crtc.h | 3 +++ 3 files changed, 26 insertions(+), 53 deletions(-) diff --git a/src/i830_driver.c b/src/i830_driver.c index 20781aa0..43f47252 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -316,7 +316,6 @@ const char *i830_output_type_names[] = { static void i830AdjustFrame(int scrnIndex, int x, int y, int flags); static Bool I830CloseScreen(int scrnIndex, ScreenPtr pScreen); -static Bool I830SaveScreen(ScreenPtr pScreen, int unblack); static Bool I830EnterVT(int scrnIndex, int flags); static CARD32 I830CheckDevicesTimer(OsTimerPtr timer, CARD32 now, pointer arg); static Bool SaveHWState(ScrnInfoPtr pScrn); @@ -2891,7 +2890,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering: Not available\n"); #endif - pScreen->SaveScreen = I830SaveScreen; + pScreen->SaveScreen = xf86SaveScreen; pI830->CloseScreen = pScreen->CloseScreen; pScreen->CloseScreen = I830CloseScreen; @@ -3262,57 +3261,6 @@ I830SwitchMode(int scrnIndex, DisplayModePtr mode, int flags) return ret; } -static Bool -I830SaveScreen(ScreenPtr pScreen, int mode) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - I830Ptr pI830 = I830PTR(pScrn); - Bool on = xf86IsUnblank(mode); - CARD32 temp, ctrl, base, surf; - int i; - - DPRINTF(PFX, "I830SaveScreen: %d, on is %s\n", mode, BOOLTOSTRING(on)); - - if (pScrn->vtSema) { - for (i = 0; i < xf86_config->num_crtc; i++) { - if (i == 0) { - ctrl = DSPACNTR; - base = DSPABASE; - surf = DSPASURF; - } else { - ctrl = DSPBCNTR; - base = DSPBADDR; - surf = DSPBSURF; - } - if (xf86_config->crtc[i]->enabled) { - temp = INREG(ctrl); - if (on) - temp |= DISPLAY_PLANE_ENABLE; - else - temp &= ~DISPLAY_PLANE_ENABLE; - OUTREG(ctrl, temp); - /* Flush changes */ - temp = INREG(base); - OUTREG(base, temp); - if (IS_I965G(pI830)) { - temp = INREG(surf); - OUTREG(surf, temp); - } - } - } - - if (pI830->CursorInfoRec && !pI830->SWCursor && pI830->cursorOn) { - if (on) - pI830->CursorInfoRec->ShowCursor(pScrn); - else - pI830->CursorInfoRec->HideCursor(pScrn); - pI830->cursorOn = TRUE; - } - } - return TRUE; -} - static Bool I830CloseScreen(int scrnIndex, ScreenPtr pScreen) { diff --git a/src/i830_xf86Crtc.c b/src/i830_xf86Crtc.c index ceb8f2ef..34fa7369 100644 --- a/src/i830_xf86Crtc.c +++ b/src/i830_xf86Crtc.c @@ -1237,6 +1237,9 @@ xf86DPMSSet(ScrnInfoPtr pScrn, int mode, int flags) xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); int i; + if (!pScrn->vtSema) + return; + if (mode == DPMSModeOff) { for (i = 0; i < config->num_output; i++) { xf86OutputPtr output = config->output[i]; @@ -1260,6 +1263,25 @@ xf86DPMSSet(ScrnInfoPtr pScrn, int mode, int flags) } } +/** + * Implement the screensaver by just calling down into the driver DPMS hooks. + * + * Even for monitors with no DPMS support, by the definition of our DPMS hooks, + * the outputs will still get disabled (blanked). + */ +Bool +xf86SaveScreen(ScreenPtr pScreen, int mode) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + + if (xf86IsUnblank(mode)) + xf86DPMSSet(pScrn, DPMSModeOn, 0); + else + xf86DPMSSet(pScrn, DPMSModeOff, 0); + + return TRUE; +} + #ifdef RANDR_12_INTERFACE #define EDID_ATOM_NAME "EDID_DATA" diff --git a/src/i830_xf86Crtc.h b/src/i830_xf86Crtc.h index b5f2fc20..04374b7d 100644 --- a/src/i830_xf86Crtc.h +++ b/src/i830_xf86Crtc.h @@ -452,6 +452,9 @@ xf86InitialConfiguration (ScrnInfoPtr pScrn); void xf86DPMSSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags); +Bool +xf86SaveScreen(ScreenPtr pScreen, int mode); + /** * Set the EDID information for the specified output */