Move the save, restore, and DPMS per-output settings to per-output files.
This commit is contained in:
parent
3e6f81f70f
commit
103b4edce7
|
|
@ -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 \
|
||||
|
|
|
|||
32
src/i830.h
32
src/i830.h
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue