#include "accelerant.h"
#include "mach64.h"
uint32
Mach64_DPMSCapabilities(void)
{
return B_DPMS_ON | B_DPMS_STAND_BY | B_DPMS_SUSPEND | B_DPMS_OFF;
}
uint32
Mach64_GetDPMSMode(void)
{
uint32 tmp = INREG(CRTC_GEN_CNTL);
uint32 mode;
if( (tmp & CRTC_DISPLAY_DIS) == 0 )
mode = B_DPMS_ON;
else if( (tmp & CRTC_VSYNC_DIS) == 0 )
mode = B_DPMS_STAND_BY;
else if( (tmp & CRTC_HSYNC_DIS) == 0 )
mode = B_DPMS_SUSPEND;
else
mode = B_DPMS_OFF;
TRACE("Mach64_DPMSMode() mode: %d\n", mode);
return mode;
}
status_t
Mach64_SetDPMSMode(uint32 dpmsMode)
{
TRACE("Mach64_SetDPMSMode() mode: %d, display type: %d\n", dpmsMode, gInfo.sharedInfo->displayType);
int mask = (CRTC_HSYNC_DIS | CRTC_VSYNC_DIS);
switch (dpmsMode) {
case B_DPMS_ON:
OUTREGM(CRTC_GEN_CNTL, 0, mask);
break;
case B_DPMS_STAND_BY:
OUTREGM(CRTC_GEN_CNTL, CRTC_HSYNC_DIS, mask);
break;
case B_DPMS_SUSPEND:
OUTREGM(CRTC_GEN_CNTL, CRTC_VSYNC_DIS, mask);
break;
case B_DPMS_OFF:
OUTREGM(CRTC_GEN_CNTL, mask, mask);
break;
default:
TRACE("Invalid DPMS mode %d\n", dpmsMode);
return B_ERROR;
}
if (gInfo.sharedInfo->displayType == MT_LAPTOP) {
uint32 powerMgmt = (Mach64_GetLCDReg(LCD_POWER_MANAGEMENT)
& ~(STANDBY_NOW | SUSPEND_NOW | POWER_BLON | AUTO_POWER_UP));
switch (dpmsMode) {
case B_DPMS_ON:
powerMgmt |= (POWER_BLON | AUTO_POWER_UP);
break;
case B_DPMS_STAND_BY:
powerMgmt |= STANDBY_NOW;
break;
case B_DPMS_SUSPEND:
powerMgmt |= SUSPEND_NOW;
break;
case B_DPMS_OFF:
powerMgmt |= STANDBY_NOW | SUSPEND_NOW;
break;
}
Mach64_PutLCDReg(LCD_POWER_MANAGEMENT, powerMgmt);
}
return B_OK;
}