aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/tridentfb.c29
-rw-r--r--include/video/trident.h1
2 files changed, 24 insertions, 6 deletions
diff --git a/drivers/video/tridentfb.c b/drivers/video/tridentfb.c
index e79788a778f..9668be881fe 100644
--- a/drivers/video/tridentfb.c
+++ b/drivers/video/tridentfb.c
@@ -87,7 +87,17 @@ MODULE_PARM_DESC(crt, "Define if CRT is connected");
static int is_oldclock(int id)
{
- return (id == TGUI9660);
+ return (id == TGUI9660) ||
+ (id == CYBER9320);
+}
+
+static int is_oldprotect(int id)
+{
+ return (id == TGUI9660) ||
+ (id == PROVIDIA9685) ||
+ (id == CYBER9320) ||
+ (id == CYBER9382) ||
+ (id == CYBER9385);
}
static int is_blade(int id)
@@ -143,6 +153,7 @@ static int iscyber(int id)
case CYBER9320:
case TGUI9660:
+ case PROVIDIA9685:
case IMAGE975:
case IMAGE985:
case BLADE3D:
@@ -905,14 +916,14 @@ static int tridentfb_set_par(struct fb_info *info)
hsyncend = (var->xres + var->right_margin + var->hsync_len) / 8 - 1;
htotal = (var->xres + var->left_margin + var->right_margin +
var->hsync_len) / 8 - 5;
- hblankstart = hdispend + 2;
+ hblankstart = hdispend + 1;
hblankend = htotal + 3;
vdispend = var->yres - 1;
vsyncstart = var->yres + var->lower_margin;
vsyncend = vsyncstart + var->vsync_len;
vtotal = var->upper_margin + vsyncend - 2;
- vblankstart = vdispend + 2;
+ vblankstart = vdispend + 1;
vblankend = vtotal;
crtc_unlock(par);
@@ -1020,15 +1031,18 @@ static int tridentfb_set_par(struct fb_info *info)
write3X4(par, PixelBusReg, tmp);
- tmp = 0x10;
+ tmp = read3X4(par, DRAMControl);
+ if (!is_oldprotect(par->chip_id))
+ tmp |= 0x10;
if (iscyber(par->chip_id))
tmp |= 0x20;
write3X4(par, DRAMControl, tmp); /* both IO, linear enable */
write3X4(par, InterfaceSel, read3X4(par, InterfaceSel) | 0x40);
- write3X4(par, Performance, 0x92);
+ if (!is_xp(par->chip_id))
+ write3X4(par, Performance, read3X4(par, Performance) | 0x10);
/* MMIO & PCI read and write burst enable */
- write3X4(par, PCIReg, 0x07);
+ write3X4(par, PCIReg, read3X4(par, PCIReg) | 0x06);
/* convert from picoseconds to kHz */
vclk = PICOS2KHZ(info->var.pixclock);
@@ -1230,6 +1244,9 @@ static int __devinit trident_pci_probe(struct pci_dev *dev,
revision = vga_io_rseq(RevisionID);
switch (revision) {
+ case 0x21:
+ chip_id = PROVIDIA9685;
+ break;
case 0x22:
case 0x23:
chip_id = CYBER9397;
diff --git a/include/video/trident.h b/include/video/trident.h
index 51ec5a95d1a..fa690b9fcc1 100644
--- a/include/video/trident.h
+++ b/include/video/trident.h
@@ -25,6 +25,7 @@
#define CYBER9520 0x9520
#define CYBER9525DVD 0x9525
#define TGUI9660 0x9660
+#define PROVIDIA9685 0x9685
#define IMAGE975 0x9750
#define IMAGE985 0x9850
#define BLADE3D 0x9880