summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Deucher <agd5f@yahoo.com>2004-10-17 20:29:32 +0000
committerAlex Deucher <agd5f@yahoo.com>2004-10-17 20:29:32 +0000
commit0147cb45138ccd06477dc7f973ae20c1405f2bf5 (patch)
tree4a0c7c74d78b11bb4b54d59d7907aca8d840becc
parentb66a0081cec6427604758371907ac6c7dca532a3 (diff)
- Add interlaced support to S3 driver (bug 332, Leo Savernik)XORG-6_8_99_3XORG-6_8_99_2XORG-6_8_99_1
- EmulateWheelTimeout (bug 323, Mathias Fröhlich) - single button double-click (bug 322, Rob Brown)
-rw-r--r--src/s3_driver.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/s3_driver.c b/src/s3_driver.c
index b5f537d..abd720e 100644
--- a/src/s3_driver.c
+++ b/src/s3_driver.c
@@ -699,7 +699,7 @@ static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
clockRanges->minClock = 15600;
clockRanges->maxClock = pS3->MaxClock;
clockRanges->clockIndex = -1;
- clockRanges->interlaceAllowed = FALSE; /* not yet */
+ clockRanges->interlaceAllowed = TRUE; /* not yet */
clockRanges->doubleScanAllowed = TRUE; /* not yet */
i = xf86ValidateModes(pScrn, pScrn->monitor->Modes,
@@ -1076,6 +1076,7 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
vgaRegPtr pVga = &hwp->ModeReg;
int vgaCRIndex = pS3->vgaCRIndex, vgaCRReg = pS3->vgaCRReg;
int vgaIOBase = hwp->IOBase;
+ int interlacedived = mode->Flags & V_INTERLACE ? 1 : 0;
int r, n, m;
unsigned char tmp;
@@ -1109,6 +1110,15 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
}
}
+ /* This shouldn't be needed -- they should be set by vgaHWInit() */
+ if (!mode->CrtcVAdjusted) {
+ mode->CrtcVTotal >>= interlacedived;
+ mode->CrtcVDisplay >>= interlacedived;
+ mode->CrtcVSyncStart >>= interlacedived;
+ mode->CrtcVSyncEnd >>= interlacedived;
+ mode->CrtcVAdjusted = TRUE;
+ }
+
if (!vgaHWInit(pScrn, mode))
return FALSE;
@@ -1387,9 +1397,15 @@ static Bool S3ModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
outb(vgaCRReg, new->cr62);
}
- outb(vgaCRIndex, 0x42);
- new->cr42 = inb(vgaCRReg) & ~0x20;
- outb(vgaCRReg, new->cr42);
+ if (mode->Flags & V_INTERLACE) {
+ outb(vgaCRIndex, 0x42);
+ new->cr42 = inb(vgaCRReg) | 0x20;
+ outb(vgaCRReg, new->cr42);
+ } else {
+ outb(vgaCRIndex, 0x42);
+ new->cr42 = inb(vgaCRReg) & ~0x20;
+ outb(vgaCRReg, new->cr42);
+ }
if (pS3->Chipset == PCI_CHIP_968) {
unsigned char a;