Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

matroxfb: rectify jitter (G450/G550)

This builds upon my previous attempts to resolve some jitter problems seen
with the Matrox G450 and G550 -based cards, including odd disparities observed
between x86 and Power -based machines in a somewhat less hackish way (removing
the hacked ifdefs).

Apparently, preference should be given to use the DVI PLL when frequencies
permit, the Standard PLL otherwise. The max pixel clock for the panellink
interface is extracted from the PInS information on the card and used as a
limit to determine which PLL to use.

Signed-off-by: Paul A. Clarke <pc@us.ibm.com>
Acked-by: Petr Vandrovec <petr@vandrovec.name>
Signed-off-by: Antonino Daplas <adaplas@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Paul A. Clarke and committed by
Linus Torvalds
e798bd95 acb73865

+30 -10
+13 -10
drivers/video/matrox/g450_pll.c
··· 331 331 tmp |= M1064_XPIXCLKCTRL_PLL_UP; 332 332 } 333 333 matroxfb_DAC_out(PMINFO M1064_XPIXCLKCTRL, tmp); 334 - #ifdef __powerpc__ 335 - /* This is necessary to avoid jitter on PowerPC 336 - * (OpenFirmware) systems, but apparently 337 - * introduces jitter, at least on a x86-64 338 - * using DVI. 339 - * A simple workaround is disable for non-PPC. 340 - */ 341 - matroxfb_DAC_out(PMINFO M1064_XDVICLKCTRL, 0); 342 - #endif /* __powerpc__ */ 343 - matroxfb_DAC_out(PMINFO M1064_XPWRCTRL, xpwrctrl); 334 + /* DVI PLL preferred for frequencies up to 335 + panel link max, standard PLL otherwise */ 336 + if (fout >= MINFO->max_pixel_clock_panellink) 337 + tmp = 0; 338 + else tmp = 339 + M1064_XDVICLKCTRL_DVIDATAPATHSEL | 340 + M1064_XDVICLKCTRL_C1DVICLKSEL | 341 + M1064_XDVICLKCTRL_C1DVICLKEN | 342 + M1064_XDVICLKCTRL_DVILOOPCTL | 343 + M1064_XDVICLKCTRL_P1LOOPBWDTCTL; 344 + matroxfb_DAC_out(PMINFO M1064_XDVICLKCTRL,tmp); 345 + matroxfb_DAC_out(PMINFO M1064_XPWRCTRL, 346 + xpwrctrl); 344 347 345 348 matroxfb_DAC_unlock_irqrestore(flags); 346 349 }
+15
drivers/video/matrox/matroxfb_DAC1064.h
··· 33 33 #define M1064_XCURCTRL_3COLOR 0x01 /* transparent, 0, 1, 2 */ 34 34 #define M1064_XCURCTRL_XGA 0x02 /* 0, 1, transparent, complement */ 35 35 #define M1064_XCURCTRL_XWIN 0x03 /* transparent, transparent, 0, 1 */ 36 + /* drive DVI by standard(0)/DVI(1) PLL */ 37 + /* if set(1), C?DVICLKEN and C?DVICLKSEL must be set(1) */ 38 + #define M1064_XDVICLKCTRL_DVIDATAPATHSEL 0x01 39 + /* drive CRTC1 by standard(0)/DVI(1) PLL */ 40 + #define M1064_XDVICLKCTRL_C1DVICLKSEL 0x02 41 + /* drive CRTC2 by standard(0)/DVI(1) PLL */ 42 + #define M1064_XDVICLKCTRL_C2DVICLKSEL 0x04 43 + /* pixel clock allowed to(0)/blocked from(1) driving CRTC1 */ 44 + #define M1064_XDVICLKCTRL_C1DVICLKEN 0x08 45 + /* DVI PLL loop filter bandwidth selection bits */ 46 + #define M1064_XDVICLKCTRL_DVILOOPCTL 0x30 47 + /* CRTC2 pixel clock allowed to(0)/blocked from(1) driving CRTC2 */ 48 + #define M1064_XDVICLKCTRL_C2DVICLKEN 0x40 49 + /* P1PLL loop filter bandwith selection */ 50 + #define M1064_XDVICLKCTRL_P1LOOPBWDTCTL 0x80 36 51 #define M1064_XCURCOL0RED 0x08 37 52 #define M1064_XCURCOL0GREEN 0x09 38 53 #define M1064_XCURCOL0BLUE 0x0A
+1
drivers/video/matrox/matroxfb_base.h
··· 424 424 } mmio; 425 425 426 426 unsigned int max_pixel_clock; 427 + unsigned int max_pixel_clock_panellink; 427 428 428 429 struct matrox_switch* hw_switch; 429 430
+1
drivers/video/matrox/matroxfb_misc.c
··· 658 658 MINFO->values.reg.mctlwtst_core = (MINFO->values.reg.mctlwtst & ~7) | 659 659 wtst_xlat[MINFO->values.reg.mctlwtst & 7]; 660 660 } 661 + MINFO->max_pixel_clock_panellink = bd->pins[47] * 4000; 661 662 return 0; 662 663 } 663 664