From: James S. <jsi...@us...> - 2002-01-19 23:52:40
|
Update of /cvsroot/linuxconsole/ruby/linux/drivers/video/tdfx In directory usw-pr-cvs1:/tmp/cvs-serv13694 Modified Files: 3dfxfb.c Log Message: Added proper pixclock handling. Index: 3dfxfb.c =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/video/tdfx/3dfxfb.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- 3dfxfb.c 2002/01/08 21:51:36 1.17 +++ 3dfxfb.c 2002/01/19 23:52:37 1.18 @@ -579,7 +579,26 @@ memset(®, 0, sizeof(reg)); cpp = (info->var.bits_per_pixel + 7)/8; - + + reg.vidcfg = VIDCFG_VIDPROC_ENABLE | VIDCFG_DESK_ENABLE | VIDCFG_CURS_X11 | + ((cpp - 1) << VIDCFG_PIXFMT_SHIFT) | + (cpp != 1 ? VIDCFG_CLUT_BYPASS : 0); + + /* PLL settings */ + freq = PICOS2KHZ(info->var.pixclock); + + reg.dacmode = 0; + reg.vidcfg &= ~VIDCFG_2X; + + if (freq > par->max_pixclock/2) { + freq = freq > par->max_pixclock ? par->max_pixclock : freq; + reg.dacmode |= DACMODE_2X; + reg.vidcfg |= VIDCFG_2X; + par->hdispend >>= 1; + par->hsyncsta >>= 1; + par->hsyncend >>= 1; + par->htotal >>= 1; + } wd = (info->var.xres >> 3) - 1; hd = (info->var.xres >> 3) - 1; @@ -646,9 +665,7 @@ reg.crt[0x02] = hbs; reg.crt[0x03] = 0x80 | (hbe & 0x1f); reg.crt[0x04] = hs; - reg.crt[0x05] = - ((hbe & 0x20) << 2) | - (he & 0x1f); + reg.crt[0x05] = ((hbe & 0x20) << 2) | (he & 0x1f); reg.crt[0x06] = vt; reg.crt[0x07] = ((vs & 0x200) >> 2) | @@ -660,9 +677,7 @@ ((vd & 0x100) >> 7) | ((vt & 0x100) >> 8); reg.crt[0x08] = 0x00; - reg.crt[0x09] = - 0x40 | - ((vbs & 0x200) >> 4); + reg.crt[0x09] = 0x40 | ((vbs & 0x200) >> 4); reg.crt[0x0a] = 0x00; reg.crt[0x0b] = 0x00; reg.crt[0x0c] = 0x00; @@ -670,9 +685,7 @@ reg.crt[0x0e] = 0x00; reg.crt[0x0f] = 0x00; reg.crt[0x10] = vs; - reg.crt[0x11] = - (ve & 0x0f) | - 0x20; + reg.crt[0x11] = (ve & 0x0f) | 0x20; reg.crt[0x12] = vd; reg.crt[0x13] = wd; reg.crt[0x14] = 0x00; @@ -701,13 +714,6 @@ VGAINIT0_EXTSHIFTOUT; reg.vgainit1 = tdfx_inl(VGAINIT1) & 0x1fffff; - reg.vidcfg = - VIDCFG_VIDPROC_ENABLE | - VIDCFG_DESK_ENABLE | - VIDCFG_CURS_X11 | - ((cpp - 1) << VIDCFG_PIXFMT_SHIFT) | - (cpp != 1 ? VIDCFG_CLUT_BYPASS : 0); - /* Setup the cursor */ par->hwcursor.enable=reg.vidcfg | VIDCFG_HWCURSOR_ENABLE; par->hwcursor.disable=reg.vidcfg; @@ -762,6 +768,13 @@ } #endif do_write_regs(®); + + if (reg.vidcfg & VIDCFG_2X) { + par->hdispend <<= 1; + par->hsyncsta <<= 1; + par->hsyncend <<= 1; + par->htotal <<= 1; + } memcpy(info->par, par, sizeof(struct tdfx_par)); /* Now change fb_fix_screeninfo according to changes in par */ |