Haiku S3 Savage driver adapted from the X.org Savage driver.
Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
Copyright (c) 2003-2006, X.Org Foundation
Copyright 2007-2008 Haiku, Inc. All rights reserved.
Distributed under the terms of the MIT license.
Authors:
Gerald Zajac 2006-2008
*/
#include "accel.h"
#include "savage.h"
uint32
Savage_DPMSCapabilities(void)
{
return B_DPMS_ON | B_DPMS_STAND_BY | B_DPMS_SUSPEND | B_DPMS_OFF;
}
uint32
Savage_GetDPMSMode(void)
{
SharedInfo& si = *gInfo.sharedInfo;
uint32 mode = B_DPMS_ON;
if (si.displayType == MT_CRT) {
switch (ReadSeqReg(0x0d) & 0x70) {
case 0:
mode = B_DPMS_ON;
break;
case 0x10:
mode = B_DPMS_STAND_BY;
break;
case 0x40:
mode = B_DPMS_SUSPEND;
break;
case 0x50:
mode = B_DPMS_OFF;
break;
default:
TRACE("Unknown DPMS mode, reg sr0D: 0x%X\n", ReadSeqReg(0x0d));
}
} else if (si.displayType == MT_LCD || si.displayType == MT_DFP) {
mode = ((ReadSeqReg(0x31) & 0x10) ? B_DPMS_ON : B_DPMS_OFF);
}
TRACE("Savage_GetDPMSMode() mode: %d\n", mode);
return mode;
}
status_t
Savage_SetDPMSMode(uint32 dpmsMode)
{
SharedInfo& si = *gInfo.sharedInfo;
TRACE("Savage_SetDPMSMode() mode: %d, display type: %d\n", dpmsMode, si.displayType);
if (si.displayType == MT_CRT) {
WriteSeqReg(0x08, 0x06);
uint8 sr0D = ReadSeqReg(0x0d) & 0x03;
switch (dpmsMode) {
case B_DPMS_ON:
break;
case B_DPMS_STAND_BY:
sr0D |= 0x10;
break;
case B_DPMS_SUSPEND:
sr0D |= 0x40;
break;
case B_DPMS_OFF:
sr0D |= 0x50;
break;
default:
TRACE("Invalid DPMS mode %d\n", dpmsMode);
return B_ERROR;
}
WriteSeqReg(0x0d, sr0D);
} else if (si.displayType == MT_LCD || si.displayType == MT_DFP) {
switch (dpmsMode) {
case B_DPMS_ON:
WriteSeqReg(0x31, 0x10, 0x10);
break;
case B_DPMS_STAND_BY:
case B_DPMS_SUSPEND:
case B_DPMS_OFF:
WriteSeqReg(0x31, 0x00, 0x10);
break;
default:
TRACE("Invalid DPMS mode %d\n", dpmsMode);
return B_ERROR;
}
}
return B_OK;
}