1/*
2 * Copyright 2012 Haiku, Inc.  All rights reserved.
3 * Distributed under the terms of the MIT license.
4 *
5 * Authors:
6 *		Gerald Zajac
7 */
8
9/*!
10	Haiku Intel-810 video driver was adapted from the X.org intel driver which
11	has the following copyright.
12
13	Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
14	All Rights Reserved.
15 */
16
17
18#include "accelerant.h"
19#include "i810_regs.h"
20
21
22#define DPMS_SYNC_SELECT	0x5002
23#define H_SYNC_OFF			0x02
24#define V_SYNC_OFF			0x08
25
26
27uint32
28I810_DPMSCapabilities(void)
29{
30	// Return DPMS modes supported by this device.
31
32	return B_DPMS_ON | B_DPMS_STAND_BY | B_DPMS_SUSPEND | B_DPMS_OFF;
33}
34
35
36uint32
37I810_GetDPMSMode(void)
38{
39	// Return the current DPMS mode.
40
41	uint32 tmp = INREG8(DPMS_SYNC_SELECT) & (H_SYNC_OFF | V_SYNC_OFF);
42	uint32 mode;
43
44	if (tmp == 0 )
45		mode = B_DPMS_ON;
46	else if (tmp == H_SYNC_OFF)
47		mode = B_DPMS_STAND_BY;
48	else if (tmp == V_SYNC_OFF)
49		mode = B_DPMS_SUSPEND;
50	else
51		mode = B_DPMS_OFF;
52
53	TRACE("I810_DPMSMode() mode: %d\n", mode);
54	return mode;
55}
56
57
58status_t
59I810_SetDPMSMode(uint32 dpmsMode)
60{
61	// Set the display into one of the Display Power Management modes,
62	// and return B_OK if successful, else return B_ERROR.
63
64	TRACE("I810_SetDPMSMode() mode: %d\n", dpmsMode);
65
66	uint8 seq01 = ReadSeqReg(1) & ~0x20;
67	uint8 dpmsSyncSelect = 0;
68
69	switch (dpmsMode) {
70		case B_DPMS_ON:
71			// Screen: On; HSync: On, VSync: On.
72			break;
73
74		case B_DPMS_STAND_BY:
75			// Screen: Off; HSync: Off, VSync: On.
76			seq01 |= 0x20;
77			dpmsSyncSelect = H_SYNC_OFF;
78			break;
79
80		case B_DPMS_SUSPEND:
81			// Screen: Off; HSync: On, VSync: Off.
82			seq01 |= 0x20;
83			dpmsSyncSelect = V_SYNC_OFF;
84			break;
85
86		case B_DPMS_OFF:
87			// Screen: Off; HSync: Off, VSync: Off.
88			seq01 |= 0x20;
89			dpmsSyncSelect = H_SYNC_OFF | V_SYNC_OFF;
90			break;
91
92		default:
93			TRACE("Invalid DPMS mode %d\n", dpmsMode);
94			return B_ERROR;
95	}
96
97	WriteSeqReg(1, seq01);		// turn the screen on/off
98	OUTREG8(DPMS_SYNC_SELECT, dpmsSyncSelect);		// set DPMS mode
99
100	return B_OK;
101}
102