Move the save, restore, and DPMS per-output settings to per-output files.

This commit is contained in:
Eric Anholt 2006-10-04 15:00:19 -07:00
parent 3e6f81f70f
commit 103b4edce7
9 changed files with 288 additions and 137 deletions

View File

@ -53,6 +53,7 @@ i810_drv_la_SOURCES = \
i830_bios.c \
i830_bios.h \
i830_common.h \
i830_crt.c \
i830_cursor.c \
i830_debug.c \
i830_debug.h \
@ -65,6 +66,7 @@ i810_drv_la_SOURCES = \
i830_gtf.c \
i830_i2c.c \
i830_io.c \
i830_lvds.c \
i830_memory.c \
i830_modes.c \
i830_video.c \

View File

@ -69,6 +69,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "i830_dri.h"
#endif
typedef struct _I830OutputRec I830OutputRec, *I830OutputPtr;
#include "common.h"
#include "i830_sdvo.h"
#include "i2c_vid.h"
@ -222,6 +224,23 @@ struct _I830OutputRec {
int type;
/* int pipe;
int flags;*/
/**
* Turns the output on/off, or sets intermediate power levels if available.
* Unsupported intermediate modes drop to the lower power setting.
*/
void (*dpms)(ScrnInfoPtr pScrn, I830OutputPtr output, int mode);
/**
* Saves the output's state for restoration on VT switch.
*/
void (*save)(ScrnInfoPtr pScrn, I830OutputPtr output);
/**
* Restore's the output's state at VT switch.
*/
void (*restore)(ScrnInfoPtr pScrn, I830OutputPtr output);
xf86MonPtr MonInfo;
I2CBusPtr pI2CBus;
I2CBusPtr pDDCBus;
@ -613,10 +632,23 @@ extern Bool I830FixOffset(ScrnInfoPtr pScrn, I830MemRange *mem);
extern Bool I830I2CInit(ScrnInfoPtr pScrn, I2CBusPtr *bus_ptr, int i2c_reg,
char *name);
/* i830_crt.c */
void I830CRTDPMS(ScrnInfoPtr pScrn, I830OutputPtr output, int mode);
void I830CRTSave(ScrnInfoPtr pScrn, I830OutputPtr output);
void I830CRTRestore(ScrnInfoPtr pScrn, I830OutputPtr output);
/* i830_dvo.c */
void I830DVODPMS(ScrnInfoPtr pScrn, I830OutputPtr output, int mode);
void I830DVOSave(ScrnInfoPtr pScrn, I830OutputPtr output);
void I830DVORestore(ScrnInfoPtr pScrn, I830OutputPtr output);
Bool I830I2CDetectDVOControllers(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus,
struct _I830DVODriver **retdrv);
/* i830_lvds.c */
void I830LVDSDPMS(ScrnInfoPtr pScrn, I830OutputPtr output, int mode);
void I830LVDSSave(ScrnInfoPtr pScrn, I830OutputPtr output);
void I830LVDSRestore(ScrnInfoPtr pScrn, I830OutputPtr output);
/* i830_memory.c */
Bool I830BindAGPMemory(ScrnInfoPtr pScrn);
Bool I830UnbindAGPMemory(ScrnInfoPtr pScrn);

75
src/i830_crt.c Normal file
View File

@ -0,0 +1,75 @@
/*
* Copyright © 2006 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Authors:
* Eric Anholt <eric@anholt.net>
*
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "xf86.h"
#include "i830.h"
void
I830CRTDPMS(ScrnInfoPtr pScrn, I830OutputPtr output, int mode)
{
I830Ptr pI830 = I830PTR(pScrn);
CARD32 temp;
temp = INREG(ADPA);
temp &= ~(ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE);
switch(mode) {
case DPMSModeOn:
break;
case DPMSModeStandby:
temp |= ADPA_HSYNC_CNTL_DISABLE;
break;
case DPMSModeSuspend:
temp |= ADPA_VSYNC_CNTL_DISABLE;
break;
case DPMSModeOff:
temp |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE;
break;
}
OUTREG(ADPA, temp);
}
void
I830CRTSave(ScrnInfoPtr pScrn, I830OutputPtr output)
{
I830Ptr pI830 = I830PTR(pScrn);
pI830->saveADPA = INREG(ADPA);
}
void
I830CRTRestore(ScrnInfoPtr pScrn, I830OutputPtr output)
{
I830Ptr pI830 = I830PTR(pScrn);
OUTREG(ADPA, pI830->saveADPA);
}

View File

@ -864,10 +864,10 @@ i830SetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode)
}
for (i = 0; i < pI830->num_outputs; i++) {
struct _I830OutputRec *output = &pI830->output[i];
I830OutputPtr output = &pI830->output[i];
if (output->sdvo_drv)
I830SDVOPreSetMode(output->sdvo_drv, pMode);
if (pI830->output[i].sdvo_drv != NULL)
pI830->output[i].dpms(pScrn, &pI830->output[i], DPMSModeOff);
if (output->i2c_drv != NULL)
output->i2c_drv->vid_rec->Mode(output->i2c_drv->dev_priv,

View File

@ -909,6 +909,9 @@ I830SetupOutputBusses(ScrnInfoPtr pScrn)
/* everyone has at least a single analog output */
pI830->output[i].type = I830_OUTPUT_ANALOG;
pI830->output[i].dpms = I830CRTDPMS;
pI830->output[i].save = I830CRTSave;
pI830->output[i].restore = I830CRTRestore;
/* setup the DDC bus for the analog output */
I830I2CInit(pScrn, &pI830->output[i].pDDCBus, GPIOA, "CRTDDC_A");
@ -917,6 +920,9 @@ I830SetupOutputBusses(ScrnInfoPtr pScrn)
if (IS_MOBILE(pI830) && !IS_I830(pI830)) {
/* Set up integrated LVDS */
pI830->output[i].type = I830_OUTPUT_LVDS;
pI830->output[i].dpms = I830LVDSDPMS;
pI830->output[i].save = I830LVDSSave;
pI830->output[i].restore = I830LVDSRestore;
I830I2CInit(pScrn, &pI830->output[i].pDDCBus, GPIOC, "LVDSDDC_C");
i++;
}
@ -924,18 +930,27 @@ I830SetupOutputBusses(ScrnInfoPtr pScrn)
if (IS_I9XX(pI830)) {
/* Set up SDVOB */
pI830->output[i].type = I830_OUTPUT_SDVO;
pI830->output[i].dpms = i830SDVODPMS;
pI830->output[i].save = i830SDVOSave;
pI830->output[i].restore = i830SDVORestore;
I830I2CInit(pScrn, &pI830->output[i].pI2CBus, GPIOE, "SDVOCTRL_E");
I830SDVOInit(pScrn, i, SDVOB);
i++;
/* Set up SDVOC */
pI830->output[i].type = I830_OUTPUT_SDVO;
pI830->output[i].dpms = i830SDVODPMS;
pI830->output[i].save = i830SDVOSave;
pI830->output[i].restore = i830SDVORestore;
pI830->output[i].pI2CBus = pI830->output[i-1].pI2CBus;
I830SDVOInit(pScrn, i, SDVOC);
i++;
} else {
/* set up DVO */
pI830->output[i].type = I830_OUTPUT_DVO;
pI830->output[i].dpms = I830DVODPMS;
pI830->output[i].save = I830DVOSave;
pI830->output[i].restore = I830DVORestore;
I830I2CInit(pScrn, &pI830->output[i].pDDCBus, GPIOD, "DVODDC_D");
I830I2CInit(pScrn, &pI830->output[i].pI2CBus, GPIOE, "DVOI2C_E");
@ -2600,31 +2615,6 @@ SaveHWState(ScrnInfoPtr pScrn)
pI830->saveVCLK_POST_DIV = INREG(VCLK_POST_DIV);
pI830->saveVGACNTRL = INREG(VGACNTRL);
pI830->saveADPA = INREG(ADPA);
pI830->savePFIT_CONTROL = INREG(PFIT_CONTROL);
pI830->savePP_ON = INREG(LVDSPP_ON);
pI830->savePP_OFF = INREG(LVDSPP_OFF);
pI830->saveLVDS = INREG(LVDS);
pI830->savePP_CONTROL = INREG(PP_CONTROL);
pI830->savePP_CYCLE = INREG(PP_CYCLE);
pI830->saveBLC_PWM_CTL = INREG(BLC_PWM_CTL);
pI830->backlight_duty_cycle = (pI830->saveBLC_PWM_CTL &
BACKLIGHT_DUTY_CYCLE_MASK);
/*
* If the light is off at server startup, just make it full brightness
*/
if (!pI830->backlight_duty_cycle)
pI830->backlight_duty_cycle = ((pI830->saveBLC_PWM_CTL &
BACKLIGHT_MODULATION_FREQ_MASK) >>
BACKLIGHT_MODULATION_FREQ_SHIFT);
if (!IS_I9XX(pI830)) {
pI830->saveDVOA = INREG(DVOA);
pI830->saveDVOB = INREG(DVOB);
pI830->saveDVOC = INREG(DVOC);
}
for(i = 0; i < 7; i++) {
pI830->saveSWF[i] = INREG(SWF0 + (i << 2));
pI830->saveSWF[i+7] = INREG(SWF00 + (i << 2));
@ -2634,17 +2624,8 @@ SaveHWState(ScrnInfoPtr pScrn)
pI830->saveSWF[16] = INREG(SWF32);
for (i = 0; i < pI830->num_outputs; i++) {
if (pI830->output[i].type == I830_OUTPUT_DVO &&
pI830->output[i].i2c_drv != NULL)
{
pI830->output[i].i2c_drv->vid_rec->SaveRegs(
pI830->output[i].i2c_drv->dev_priv);
}
if (pI830->output[i].type == I830_OUTPUT_SDVO &&
pI830->output[i].sdvo_drv != NULL)
{
i830SDVOSave(pScrn, i);
}
if (pI830->output[i].save != NULL)
pI830->output[i].save(pScrn, &pI830->output[i]);
}
vgaHWUnlock(hwp);
@ -2670,6 +2651,11 @@ RestoreHWState(ScrnInfoPtr pScrn)
vgaHWRestore(pScrn, vgaReg, VGA_SR_FONTS);
vgaHWLock(hwp);
/* Disable outputs */
for (i = 0; i < pI830->num_outputs; i++) {
pI830->output[i].dpms(pScrn, &pI830->output[i], DPMSModeOff);
}
/* First, disable display planes */
temp = INREG(DSPACNTR);
OUTREG(DSPACNTR, temp & ~DISPLAY_PLANE_ENABLE);
@ -2682,18 +2668,7 @@ RestoreHWState(ScrnInfoPtr pScrn)
temp = INREG(PIPEBCONF);
OUTREG(PIPEBCONF, temp & ~PIPEBCONF_ENABLE);
/* XXX: Wait for a vblank */
sleep(1);
i830SetLVDSPanelPower(pScrn, FALSE);
for (i = 0; i < pI830->num_outputs; i++) {
if (pI830->output[i].type == I830_OUTPUT_SDVO &&
pI830->output[i].sdvo_drv != NULL)
{
i830SDVOPreRestore(pScrn, i);
}
}
i830WaitForVblank(pScrn);
OUTREG(FPA0, pI830->saveFPA0);
OUTREG(FPA1, pI830->saveFPA1);
@ -2738,12 +2713,6 @@ RestoreHWState(ScrnInfoPtr pScrn)
OUTREG(DSPBSURF, pI830->saveDSPBBASE);
}
OUTREG(BLC_PWM_CTL, pI830->saveBLC_PWM_CTL);
OUTREG(LVDSPP_ON, pI830->savePP_ON);
OUTREG(LVDSPP_OFF, pI830->savePP_OFF);
OUTREG(PP_CYCLE, pI830->savePP_CYCLE);
OUTREG(PFIT_CONTROL, pI830->savePFIT_CONTROL);
OUTREG(VCLK_DIVISOR_VGA0, pI830->saveVCLK_DIVISOR_VGA0);
OUTREG(VCLK_DIVISOR_VGA1, pI830->saveVCLK_DIVISOR_VGA1);
OUTREG(VCLK_POST_DIV, pI830->saveVCLK_POST_DIV);
@ -2755,30 +2724,10 @@ RestoreHWState(ScrnInfoPtr pScrn)
OUTREG(DSPACNTR, pI830->saveDSPACNTR);
OUTREG(DSPBCNTR, pI830->saveDSPBCNTR);
OUTREG(ADPA, pI830->saveADPA);
OUTREG(LVDS, pI830->saveLVDS);
if (!IS_I9XX(pI830)) {
OUTREG(DVOA, pI830->saveDVOA);
OUTREG(DVOB, pI830->saveDVOB);
OUTREG(DVOC, pI830->saveDVOC);
}
for (i = 0; i < pI830->num_outputs; i++) {
if (pI830->output[i].type == I830_OUTPUT_DVO &&
pI830->output[i].i2c_drv != NULL)
{
pI830->output[i].i2c_drv->vid_rec->RestoreRegs(
pI830->output[i].i2c_drv->dev_priv);
}
if (pI830->output[i].type == I830_OUTPUT_SDVO &&
pI830->output[i].sdvo_drv != NULL)
{
i830SDVOPostRestore(pScrn, i);
}
pI830->output[i].restore(pScrn, &pI830->output[i]);
}
OUTREG(PP_CONTROL, pI830->savePP_CONTROL);
for(i = 0; i < 7; i++) {
OUTREG(SWF0 + (i << 2), pI830->saveSWF[i]);
OUTREG(SWF00 + (i << 2), pI830->saveSWF[i+7]);
@ -4204,39 +4153,6 @@ I830SaveScreen(ScreenPtr pScreen, int mode)
return TRUE;
}
static void
I830DPMSCRT(ScrnInfoPtr pScrn, int mode)
{
I830Ptr pI830 = I830PTR(pScrn);
CARD32 temp;
temp = INREG(ADPA);
temp &= ~(ADPA_HSYNC_CNTL_DISABLE|ADPA_VSYNC_CNTL_DISABLE);
switch(mode) {
case DPMSModeOn:
break;
case DPMSModeStandby:
temp |= ADPA_HSYNC_CNTL_DISABLE;
break;
case DPMSModeSuspend:
temp |= ADPA_VSYNC_CNTL_DISABLE;
break;
case DPMSModeOff:
temp |= ADPA_HSYNC_CNTL_DISABLE|ADPA_VSYNC_CNTL_DISABLE;
break;
}
OUTREG(ADPA, temp);
}
static void
I830DPMSLVDS(ScrnInfoPtr pScrn, int mode)
{
if (mode == DPMSModeOn)
i830SetLVDSPanelPower(pScrn, TRUE);
else
i830SetLVDSPanelPower(pScrn, FALSE);
}
/* Use the VBE version when available. */
static void
I830DisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode,
@ -4246,6 +4162,10 @@ I830DisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode,
int i;
CARD32 temp, ctrl, base;
for (i = 0; i < pI830->num_outputs; i++) {
pI830->output[i].dpms(pScrn, &pI830->output[i], PowerManagementMode);
}
for (i = 0; i < pI830->availablePipes; i++) {
if (i == 0) {
ctrl = DSPACNTR;
@ -4267,22 +4187,6 @@ I830DisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode,
}
}
if (pI830->operatingDevices & (PIPE_CRT_ACTIVE | (PIPE_CRT_ACTIVE<<8))) {
I830DPMSCRT(pScrn, PowerManagementMode);
}
if (pI830->operatingDevices & (PIPE_LCD_ACTIVE | (PIPE_LCD_ACTIVE<<8))) {
I830DPMSLVDS(pScrn, PowerManagementMode);
}
if (pI830->operatingDevices & (PIPE_DFP_ACTIVE | (PIPE_DFP_ACTIVE<<8))) {
/* TBD */
}
if (pI830->operatingDevices & (PIPE_DFP2_ACTIVE | (PIPE_DFP2_ACTIVE<<8))) {
/* TBD */
}
if (pI830->CursorInfoRec && !pI830->SWCursor && pI830->cursorOn) {
if (PowerManagementMode == DPMSModeOn)
pI830->CursorInfoRec->ShowCursor(pScrn);

View File

@ -54,6 +54,51 @@ struct _I830DVODriver i830_dvo_drivers[] =
#define I830_NUM_DVO_DRIVERS (sizeof(i830_dvo_drivers)/sizeof(struct _I830DVODriver))
void
I830DVODPMS(ScrnInfoPtr pScrn, I830OutputPtr output, int mode)
{
if (output->i2c_drv == NULL)
return;
if (mode == DPMSModeOn)
output->i2c_drv->vid_rec->Power(output->i2c_drv->dev_priv, TRUE);
else
output->i2c_drv->vid_rec->Power(output->i2c_drv->dev_priv, FALSE);
}
void
I830DVOSave(ScrnInfoPtr pScrn, I830OutputPtr output)
{
I830Ptr pI830 = I830PTR(pScrn);
if (output->i2c_drv == NULL)
return;
/* Each output should probably just save the registers it touches, but for
* now, use more overkill.
*/
pI830->saveDVOA = INREG(DVOA);
pI830->saveDVOB = INREG(DVOB);
pI830->saveDVOC = INREG(DVOC);
output->i2c_drv->vid_rec->SaveRegs(output->i2c_drv->dev_priv);
}
void
I830DVORestore(ScrnInfoPtr pScrn, I830OutputPtr output)
{
I830Ptr pI830 = I830PTR(pScrn);
if (output->i2c_drv == NULL)
return;
OUTREG(DVOA, pI830->saveDVOA);
OUTREG(DVOB, pI830->saveDVOB);
OUTREG(DVOC, pI830->saveDVOC);
output->i2c_drv->vid_rec->RestoreRegs(output->i2c_drv->dev_priv);
}
Bool
I830I2CDetectDVOControllers(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus,
struct _I830DVODriver **retdrv)

81
src/i830_lvds.c Normal file
View File

@ -0,0 +1,81 @@
/*
* Copyright © 2006 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Authors:
* Eric Anholt <eric@anholt.net>
*
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "xf86.h"
#include "i830.h"
void
I830LVDSDPMS(ScrnInfoPtr pScrn, I830OutputPtr output, int mode)
{
if (mode == DPMSModeOn)
i830SetLVDSPanelPower(pScrn, TRUE);
else
i830SetLVDSPanelPower(pScrn, FALSE);
}
void
I830LVDSSave(ScrnInfoPtr pScrn, I830OutputPtr output)
{
I830Ptr pI830 = I830PTR(pScrn);
pI830->savePFIT_CONTROL = INREG(PFIT_CONTROL);
pI830->savePP_ON = INREG(LVDSPP_ON);
pI830->savePP_OFF = INREG(LVDSPP_OFF);
pI830->saveLVDS = INREG(LVDS);
pI830->savePP_CONTROL = INREG(PP_CONTROL);
pI830->savePP_CYCLE = INREG(PP_CYCLE);
pI830->saveBLC_PWM_CTL = INREG(BLC_PWM_CTL);
pI830->backlight_duty_cycle = (pI830->saveBLC_PWM_CTL &
BACKLIGHT_DUTY_CYCLE_MASK);
/*
* If the light is off at server startup, just make it full brightness
*/
if (pI830->backlight_duty_cycle == 0) {
pI830->backlight_duty_cycle =
(pI830->saveBLC_PWM_CTL & BACKLIGHT_MODULATION_FREQ_MASK) >>
BACKLIGHT_MODULATION_FREQ_SHIFT;
}
}
void
I830LVDSRestore(ScrnInfoPtr pScrn, I830OutputPtr output)
{
I830Ptr pI830 = I830PTR(pScrn);
OUTREG(BLC_PWM_CTL, pI830->saveBLC_PWM_CTL);
OUTREG(LVDSPP_ON, pI830->savePP_ON);
OUTREG(LVDSPP_OFF, pI830->savePP_OFF);
OUTREG(PP_CYCLE, pI830->savePP_CYCLE);
OUTREG(PFIT_CONTROL, pI830->savePFIT_CONTROL);
OUTREG(LVDS, pI830->saveLVDS);
OUTREG(PP_CONTROL, pI830->savePP_CONTROL);
}

View File

@ -640,10 +640,13 @@ I830SDVOPostSetMode(I830SDVOPtr s, DisplayModePtr mode)
}
void
i830SDVOSave(ScrnInfoPtr pScrn, int output_index)
i830SDVOSave(ScrnInfoPtr pScrn, I830OutputPtr output)
{
I830Ptr pI830 = I830PTR(pScrn);
I830SDVOPtr sdvo = pI830->output[output_index].sdvo_drv;
I830SDVOPtr sdvo = output->sdvo_drv;
if (sdvo == NULL)
return;
sdvo->save_sdvo_mult = I830SDVOGetClockRateMult(sdvo);
I830SDVOGetActiveOutputs(sdvo, &sdvo->save_sdvo_active_1,
@ -677,19 +680,28 @@ i830SDVOSave(ScrnInfoPtr pScrn, int output_index)
}
void
i830SDVOPreRestore(ScrnInfoPtr pScrn, int output_index)
i830SDVODPMS(ScrnInfoPtr pScrn, I830OutputPtr output, int mode)
{
I830Ptr pI830 = I830PTR(pScrn);
I830SDVOPtr sdvo = pI830->output[output_index].sdvo_drv;
I830SDVOPtr sdvo = output->sdvo_drv;
I830SDVOSetActiveOutputs(sdvo, FALSE, FALSE);
if (sdvo == NULL)
return;
if (mode != DPMSModeOn)
I830SDVOSetActiveOutputs(sdvo, FALSE, FALSE);
else
I830SDVOSetActiveOutputs(sdvo, TRUE, FALSE);
}
void
i830SDVOPostRestore(ScrnInfoPtr pScrn, int output_index)
i830SDVORestore(ScrnInfoPtr pScrn, I830OutputPtr output)
{
I830Ptr pI830 = I830PTR(pScrn);
I830SDVOPtr sdvo = pI830->output[output_index].sdvo_drv;
I830SDVOPtr sdvo = output->sdvo_drv;
if (sdvo == NULL)
return;
if (sdvo->caps.caps & 0x1) {
I830SDVOSetTargetInput(sdvo, FALSE, FALSE);

View File

@ -56,13 +56,13 @@ typedef struct _i830_sdvo_dtd {
} __attribute__((packed)) i830_sdvo_dtd;
void
i830SDVOSave(ScrnInfoPtr pScrn, int output_index);
i830SDVODPMS(ScrnInfoPtr pScrn, I830OutputPtr output, int mode);
void
i830SDVOPreRestore(ScrnInfoPtr pScrn, int output_index);
i830SDVOSave(ScrnInfoPtr pScrn, I830OutputPtr output);
void
i830SDVOPostRestore(ScrnInfoPtr pScrn, int output_index);
i830SDVORestore(ScrnInfoPtr pScrn, I830OutputPtr output);
Bool
I830DetectSDVODisplays(ScrnInfoPtr pScrn, int output_index);