summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2006-02-05 18:22:12 +0000
committerLuc Verhaegen <libv@skynet.be>2006-02-05 18:22:12 +0000
commit609adcfdec1eababd745a88097dbbec59ff9661f (patch)
tree660a936a55b094e9b7ae7460564e0c4e144026cd
parent44d140ed0db6d22e53f3e345aef4f33b055fe2a2 (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.c25
-rw-r--r--src/via_driver.c48
-rw-r--r--src/via_driver.h1
-rw-r--r--src/via_mode.c27
-rw-r--r--src/via_vt162x.c6
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);