diff options
author | Luc Verhaegen <libv@skynet.be> | 2006-02-05 18:22:12 +0000 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2006-02-05 18:22:12 +0000 |
commit | 609adcfdec1eababd745a88097dbbec59ff9661f (patch) | |
tree | 660a936a55b094e9b7ae7460564e0c4e144026cd | |
parent | 44d140ed0db6d22e53f3e345aef4f33b055fe2a2 (diff) |
[devel-shield_modes_by_power]
- Move up memset from PrimaryMode to ScreenInit.
- Power off or unsync all outputs before WriteMode. Power on again
afterwards.
-rw-r--r-- | src/via_ch7xxx.c | 25 | ||||
-rw-r--r-- | src/via_driver.c | 48 | ||||
-rw-r--r-- | src/via_driver.h | 1 | ||||
-rw-r--r-- | src/via_mode.c | 27 | ||||
-rw-r--r-- | src/via_vt162x.c | 6 |
5 files changed, 40 insertions, 67 deletions
diff --git a/src/via_ch7xxx.c b/src/via_ch7xxx.c index 0b47171..fd9c5dc 100644 --- a/src/via_ch7xxx.c +++ b/src/via_ch7xxx.c @@ -212,7 +212,6 @@ CH7011Save(struct ViaOutput *Output) xf86I2CReadByte(Output->I2CDev, i, &(Private->Regs[i])); i = 0x49; xf86I2CReadByte(Output->I2CDev, i, &(Private->Regs[i])); - /* Private->Regs[0x10] = 0x00; */ /* Fix common restoration issue: When !CIVEN then force CIVC1 = 0 */ if ((Private->Regs[0x10] & 0x11) == 0x10) { @@ -220,7 +219,6 @@ CH7011Save(struct ViaOutput *Output) "(CIVC).\n", __func__); Private->Regs[0x10] &= 0xEF; } - } /* @@ -230,7 +228,6 @@ static void CH7011Restore(struct ViaOutput *Output) { struct CH7xxxOutputPrivate *Private = Output->Private; - CARD8 save; int i; VIAFUNC(Output->scrnIndex); @@ -245,15 +242,6 @@ CH7011Restore(struct ViaOutput *Output) xf86I2CWriteByte(Output->I2CDev, 0x49, Private->Regs[0x49]); usleep(1); - - /* Fix common restoration issue: When !CIVEN then force CIVC1 = 0 */ - xf86I2CReadByte(Output->I2CDev, 0x10, &save); - /* if ((save & 0x11) == 0x10) { */ - if (save != Private->Regs[0x10]) { - xf86DrvMsg(Output->scrnIndex, X_WARNING, "%s: Caught bad restoration " - "(CIVC).\n", __func__); - xf86I2CWriteByte(Output->I2CDev, 0x10, save & 0xEF); - } } /* @@ -415,10 +403,6 @@ CH7011TVMode(struct ViaOutput *Output, DisplayModePtr mode) Table = (struct CH7011TableRec *) mode->Private; - /* Disable TV avoid set mode garbage */ - xf86I2CWriteByte(Output->I2CDev, 0x49, 0x3E); - xf86I2CWriteByte(Output->I2CDev, 0x1E, 0xD0); - xf86I2CWriteByte(Output->I2CDev, 0x00, Table->Mode); xf86I2CWriteByte(Output->I2CDev, 0x01, 0x3F); @@ -481,9 +465,6 @@ CH7011TVMode(struct ViaOutput *Output, DisplayModePtr mode) xf86I2CWriteByte(Output->I2CDev, 0x48, 0x10); xf86I2CWriteByte(Output->I2CDev, 0x48, 0x18); - - /* Turn TV CH7011 DAC On */ - xf86I2CWriteByte(Output->I2CDev, 0x49, 0x20); } /* @@ -497,12 +478,12 @@ CH7xxxTVPower(struct ViaOutput *Output, Bool On) VIAFUNC(Output->scrnIndex); if (On) { - /* Plainly enables all DACs - should be more specific. */ - xf86I2CWriteByte(Output->I2CDev, 0x49, 0x20); - /* POUTE */ xf86I2CReadByte(Output->I2CDev, 0x1E, &save); xf86I2CWriteByte(Output->I2CDev, 0x1E, save | 0x02); + + /* Plainly enables all DACs - should be more specific. */ + xf86I2CWriteByte(Output->I2CDev, 0x49, 0x20); } else { xf86I2CWriteByte(Output->I2CDev, 0x49, 0x3E); diff --git a/src/via_driver.c b/src/via_driver.c index ec1baf7..881bb34 100644 --- a/src/via_driver.c +++ b/src/via_driver.c @@ -1481,6 +1481,9 @@ VIAEnterVT(int scrnIndex, int flags) VIAFUNC(scrnIndex); VIASave(pScrn); + + ViaOutputsPower(pScrn, FALSE); + VIAWriteMode(pScrn, pScrn->currentMode); vgaHWUnlock(hwp); @@ -1493,7 +1496,9 @@ VIAEnterVT(int scrnIndex, int flags) VIADRIRingBufferInit(pScrn); DRIUnlock(screenInfo.screens[scrnIndex]); } -#endif +#endif + + ViaOutputsPower(pScrn, TRUE); return TRUE; } @@ -1976,13 +1981,14 @@ VIAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) vgaHWUnlock(hwp); - pVia->FirstInit = TRUE; - vgaHWBlankScreen(pScrn, FALSE); + ViaOutputsPower(pScrn, FALSE); VIAWriteMode(pScrn, pScrn->currentMode); - - pVia->FirstInit = FALSE; + + /* Stop previous content from disturbing users. */ + memset(pVia->FBBase, 0x00, + pScrn->virtualX * pScrn->virtualY * (pScrn->bitsPerPixel >> 3)); /* Darken the screen for aesthetic reasons and set the viewport */ VIASaveScreen(pScreen, SCREEN_SAVER_ON); @@ -2127,6 +2133,8 @@ VIAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) ViaVideoInit(pScrn, pScreen); #endif + ViaOutputsPower(pScrn, TRUE); + if (serverGeneration == 1) xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); @@ -2347,7 +2355,9 @@ VIASwitchMode(int scrnIndex, DisplayModePtr mode, int flags) VIAPtr pVia = VIAPTR(pScrn); VIAFUNC(scrnIndex); - + + ViaOutputsPower(pScrn, FALSE); + #ifdef XF86DRI if (pVia->directRenderingEnabled) DRILock(pScrn->pScreen, 0); @@ -2370,40 +2380,28 @@ VIASwitchMode(int scrnIndex, DisplayModePtr mode, int flags) VIADRIRingBufferInit(pScrn); DRIUnlock(screenInfo.screens[scrnIndex]); } -#endif +#endif + + ViaOutputsPower(pScrn, TRUE); + return TRUE; } - +/* + * + */ static void VIADPMS(ScrnInfoPtr pScrn, int mode, int flags) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - VIAPtr pVia = VIAPTR(pScrn); - CARD8 val; - VIAFUNC(pScrn->scrnIndex); - /* Clear DPMS setting */ - val = hwp->readCrtc(hwp, 0x36); - val &= 0xCF; - - /* Turn Off CRT, if user doesn't want crt on */ - if (!pVia->IsSecondary && !pVia->CrtActive) - val |= 0x30; - switch (mode) { case DPMSModeOn: ViaOutputsPower(pScrn, TRUE); - - hwp->writeCrtc(hwp, 0x36, val); break; case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: ViaOutputsPower(pScrn, FALSE); - - val |= 0x30; - hwp->writeCrtc(hwp, 0x36, val); break; default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Invalid DPMS mode %d\n", mode); diff --git a/src/via_driver.h b/src/via_driver.h index d89cdb3..9e9f866 100644 --- a/src/via_driver.h +++ b/src/via_driver.h @@ -151,7 +151,6 @@ typedef struct _VIA { int Bpp, Bpl; unsigned PlaneMask; - Bool FirstInit; unsigned long videoRambytes; int videoRamKbytes; int FBFreeStart; diff --git a/src/via_mode.c b/src/via_mode.c index b6d7ad8..a262f86 100644 --- a/src/via_mode.c +++ b/src/via_mode.c @@ -474,10 +474,6 @@ ViaOutputsInit(ScrnInfoPtr pScrn) break; } - /* Save now */ - if (Output->Save) - Output->Save(Output); - /* Dump registers as early as possible */ if (pVia->PrintTVRegs && Output->PrintRegs) Output->PrintRegs(Output, __func__); @@ -547,11 +543,15 @@ ViaOutputsSense(ScrnInfoPtr pScrn) /* * Power according to On all active devices, power off when inactive. + * + * CRT requires owner for secondary. */ void ViaOutputsPower(ScrnInfoPtr pScrn, Bool On) { - struct ViaOutput *Output = VIAPTR(pScrn)->Outputs; + vgaHWPtr hwp = VGAHWPTR(pScrn); + VIAPtr pVia = VIAPTR(pScrn); + struct ViaOutput *Output = pVia->Outputs; ViaDebug(pScrn->scrnIndex, "%s: %s.\n", __func__, On ? "On" : "Off"); @@ -565,6 +565,12 @@ ViaOutputsPower(ScrnInfoPtr pScrn, Bool On) Output = Output->Next; } + + /* CRT */ + if ((pVia->CrtActive == TRUE) && (On == TRUE)) + ViaCrtcMask(hwp, 0x36, 0x00, 0x30); + else + ViaCrtcMask(hwp, 0x36, 0x30, 0x30); } /* @@ -663,7 +669,7 @@ ViaOutputMode(ScrnInfoPtr pScrn, struct ViaOutput *Output, DisplayModePtr Mode) } /* Disable LCD Scaling */ - if (!pVia->SAMM || pVia->FirstInit) + if (!pVia->SAMM) hwp->writeCrtc(hwp, 0x79, 0x00); } else { if ((pVia->Chipset == VT3122) && VT3122_REV_IS_AX(pVia->ChipRev)) @@ -1332,18 +1338,13 @@ ViaModePrimary(ScrnInfoPtr pScrn, DisplayModePtr mode) ViaModePrimaryVGA(pScrn, mode); - /* Don't do this before the Sequencer is set: locks up VT7205 and VT3108 */ - if (pVia->FirstInit) - memset(pVia->FBBase, 0x00, pVia->videoRambytes); - /* Enable MMIO & PCI burst (1 wait state) */ ViaSeqMask(hwp, 0x1A, 0x06, 0x06); ViaSetPrimaryFIFO(pScrn, mode); - if (!pVia->CrtActive) - ViaCrtcMask(hwp, 0x36, 0x30, 0x30); - else + /* Make sure that Primary owns the CRT */ + if (pVia->CrtActive) ViaSeqMask(hwp, 0x16, 0x00, 0x40); /* Work around panel blob. */ diff --git a/src/via_vt162x.c b/src/via_vt162x.c index d1d74c5..e24a8c4 100644 --- a/src/via_vt162x.c +++ b/src/via_vt162x.c @@ -514,9 +514,6 @@ VT1621Mode(struct ViaOutput *Output, DisplayModePtr mode) for (i = 0; i < 0x10; i++) xf86I2CWriteByte(Output->I2CDev, 0x52 + i, Table.TVS[i]); - /* Turn on all Composite and S-Video output */ - xf86I2CWriteByte(Output->I2CDev, 0x0E, 0x00); - if (Private->DotCrawl) { if (Table.DotCrawlSubCarrier) { xf86I2CReadByte(Output->I2CDev, 0x11, &i); @@ -569,9 +566,6 @@ VT1622Mode(struct ViaOutput *Output, DisplayModePtr mode) for (i = 0; i < 0x1B; i++) xf86I2CWriteByte(Output->I2CDev, 0x4A + i, Table.TV2[i]); - /* Turn on all Composite and S-Video output */ - xf86I2CWriteByte(Output->I2CDev, 0x0E, 0x00); - if (Private->DotCrawl) { if (Table.DotCrawlSubCarrier) { xf86I2CReadByte(Output->I2CDev, 0x11, &save); |