#include "accelerant.h"
#include "i810_regs.h"
#define DPMS_SYNC_SELECT 0x5002
#define H_SYNC_OFF 0x02
#define V_SYNC_OFF 0x08
uint32
I810_DPMSCapabilities(void)
{
return B_DPMS_ON | B_DPMS_STAND_BY | B_DPMS_SUSPEND | B_DPMS_OFF;
}
uint32
I810_GetDPMSMode(void)
{
uint32 tmp = INREG8(DPMS_SYNC_SELECT) & (H_SYNC_OFF | V_SYNC_OFF);
uint32 mode;
if (tmp == 0 )
mode = B_DPMS_ON;
else if (tmp == H_SYNC_OFF)
mode = B_DPMS_STAND_BY;
else if (tmp == V_SYNC_OFF)
mode = B_DPMS_SUSPEND;
else
mode = B_DPMS_OFF;
TRACE("I810_DPMSMode() mode: %d\n", mode);
return mode;
}
status_t
I810_SetDPMSMode(uint32 dpmsMode)
{
TRACE("I810_SetDPMSMode() mode: %d\n", dpmsMode);
uint8 seq01 = ReadSeqReg(1) & ~0x20;
uint8 dpmsSyncSelect = 0;
switch (dpmsMode) {
case B_DPMS_ON:
break;
case B_DPMS_STAND_BY:
seq01 |= 0x20;
dpmsSyncSelect = H_SYNC_OFF;
break;
case B_DPMS_SUSPEND:
seq01 |= 0x20;
dpmsSyncSelect = V_SYNC_OFF;
break;
case B_DPMS_OFF:
seq01 |= 0x20;
dpmsSyncSelect = H_SYNC_OFF | V_SYNC_OFF;
break;
default:
TRACE("Invalid DPMS mode %d\n", dpmsMode);
return B_ERROR;
}
WriteSeqReg(1, seq01);
OUTREG8(DPMS_SYNC_SELECT, dpmsSyncSelect);
return B_OK;
}