#include "accelerant.h"
#include "rage128.h"
uint32
Rage128_DPMSCapabilities(void)
{
return B_DPMS_ON | B_DPMS_STAND_BY | B_DPMS_SUSPEND | B_DPMS_OFF;
}
uint32
Rage128_GetDPMSMode(void)
{
uint32 tmp = INREG(R128_CRTC_EXT_CNTL);
uint32 mode;
if( (tmp & R128_CRTC_DISPLAY_DIS) == 0 )
mode = B_DPMS_ON;
else if( (tmp & R128_CRTC_VSYNC_DIS) == 0 )
mode = B_DPMS_STAND_BY;
else if( (tmp & R128_CRTC_HSYNC_DIS) == 0 )
mode = B_DPMS_SUSPEND;
else
mode = B_DPMS_OFF;
TRACE("Rage128_DPMSMode() mode: %d\n", mode);
return mode;
}
status_t
Rage128_SetDPMSMode(uint32 dpmsMode)
{
SharedInfo& si = *gInfo.sharedInfo;
TRACE("Rage128_SetDPMSMode() mode: %d, display type: %d\n", dpmsMode, si.displayType);
int mask = (R128_CRTC_DISPLAY_DIS
| R128_CRTC_HSYNC_DIS
| R128_CRTC_VSYNC_DIS);
switch (dpmsMode) {
case B_DPMS_ON:
OUTREGM(R128_CRTC_EXT_CNTL, 0, mask);
break;
case B_DPMS_STAND_BY:
OUTREGM(R128_CRTC_EXT_CNTL,
R128_CRTC_DISPLAY_DIS | R128_CRTC_HSYNC_DIS, mask);
break;
case B_DPMS_SUSPEND:
OUTREGM(R128_CRTC_EXT_CNTL,
R128_CRTC_DISPLAY_DIS | R128_CRTC_VSYNC_DIS, mask);
break;
case B_DPMS_OFF:
OUTREGM(R128_CRTC_EXT_CNTL, mask, mask);
break;
default:
TRACE("Invalid DPMS mode %d\n", dpmsMode);
return B_ERROR;
}
if (si.displayType == MT_LAPTOP) {
uint32 genCtrl;
switch (dpmsMode) {
case B_DPMS_ON:
genCtrl = INREG(R128_LVDS_GEN_CNTL);
genCtrl |= R128_LVDS_ON | R128_LVDS_EN | R128_LVDS_BLON | R128_LVDS_DIGON;
genCtrl &= ~R128_LVDS_DISPLAY_DIS;
OUTREG(R128_LVDS_GEN_CNTL, genCtrl);
break;
case B_DPMS_STAND_BY:
case B_DPMS_SUSPEND:
case B_DPMS_OFF:
genCtrl = INREG(R128_LVDS_GEN_CNTL);
genCtrl |= R128_LVDS_DISPLAY_DIS;
OUTREG(R128_LVDS_GEN_CNTL, genCtrl);
snooze(10);
genCtrl &= ~(R128_LVDS_ON | R128_LVDS_EN | R128_LVDS_BLON | R128_LVDS_DIGON);
OUTREG(R128_LVDS_GEN_CNTL, genCtrl);
break;
default:
TRACE("Invalid DPMS mode %d\n", dpmsMode);
return B_ERROR;
}
}
if (gInfo.sharedInfo->displayType == MT_DVI) {
switch (dpmsMode) {
case B_DPMS_ON:
OUTREG(R128_FP_GEN_CNTL, INREG(R128_FP_GEN_CNTL)
| (R128_FP_FPON | R128_FP_TDMS_EN));
break;
case B_DPMS_STAND_BY:
case B_DPMS_SUSPEND:
case B_DPMS_OFF:
OUTREG(R128_FP_GEN_CNTL, INREG(R128_FP_GEN_CNTL)
& ~(R128_FP_FPON | R128_FP_TDMS_EN));
break;
default:
TRACE("Invalid DPMS mode %d\n", dpmsMode);
return B_ERROR;
}
}
return B_OK;
}