diff options
author | Luc Verhaegen <libv@skynet.be> | 2009-10-14 23:44:22 +0200 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2009-10-14 23:44:22 +0200 |
commit | dcd5ff941fb32828cc499613fa504cdd2c473e70 (patch) | |
tree | acace565cb3d9db1c9e254e7e67cfc372b916ad7 | |
parent | a848693f75cb5c5911446caf8a4e46a2449572aa (diff) |
Crtc: VT3230: Add initial modesetting support.
* Add FIFOSet functions.
* Change VT3157 PLL routines to calculate the limit for VT3230,
as this is the steepest and most left limit of VT3157, VT3230,
VT3343 and VT3371; but all are very close.
* Leave the rest of CRTC testing for this device as a TODO.
-rw-r--r-- | src/via_crtc.c | 65 |
1 files changed, 52 insertions, 13 deletions
diff --git a/src/via_crtc.c b/src/via_crtc.c index b27e137..78778a4 100644 --- a/src/via_crtc.c +++ b/src/via_crtc.c @@ -186,13 +186,11 @@ VT3118PLLGenerate(struct ViaCrtc *Crtc, int Clock) } /* - * VT3157 PLL is very close to VT3343, VT3343 is just slightly steeper, - * therefor the multiplier limit + 2. - * VT3371 is slightly less steep than vt3157, and would be better described - * as 6 * (div - 9), but close enough. + * VT3230 is the steepest, most left limit found for VT3157, VT3230, VT3343, + * and VT3371. So use the limit close to VT3230 to limit all these dotclocks. */ static CARD32 -VT3157PLLGenerate(struct ViaCrtc *Crtc, int Clock) +VT3230PLLGenerate(struct ViaCrtc *Crtc, int Clock) { CARD32 PLL = 0; CARD32 Divider, Shift, Multiplier; @@ -209,10 +207,10 @@ VT3157PLLGenerate(struct ViaCrtc *Crtc, int Clock) else Multiplier = ((Clock * Divider) << Shift) / 14318; - if (Multiplier > 257) + if ((Multiplier > 257) || (Multiplier < 2)) continue; - if (Multiplier < (6 * (Divider - 8) + 2)) + if (Multiplier < (13 * Divider / 2 - 56)) continue; NewDiff = abs(((14318000 * Multiplier) / (Divider << Shift)) - @@ -365,12 +363,12 @@ VT3118Crtc1PLLSet(struct ViaCrtc *Crtc, CARD32 Clock, int flags) * */ static void -VT3157Crtc1PLLSet(struct ViaCrtc *Crtc, CARD32 Clock, int flags) +VT3230Crtc1PLLSet(struct ViaCrtc *Crtc, CARD32 Clock, int flags) { CARD32 PLL = 0; if (!(flags & PLL_FLAG_EXTERNAL)) - PLL = VT3157PLLGenerate(Crtc, Clock); + PLL = VT3230PLLGenerate(Crtc, Clock); ViaDebug(Crtc->scrnIndex, "%s: %dkHz -> 0x%06X.\n", __func__, Clock, PLL); @@ -464,12 +462,12 @@ VT3118Crtc2PLLSet(struct ViaCrtc *Crtc, CARD32 Clock, int flags) * */ static void -VT3157Crtc2PLLSet(struct ViaCrtc *Crtc, CARD32 Clock, int flags) +VT3230Crtc2PLLSet(struct ViaCrtc *Crtc, CARD32 Clock, int flags) { CARD32 PLL = 0; if (!(flags & PLL_FLAG_EXTERNAL)) - PLL = VT3157PLLGenerate(Crtc, Clock); + PLL = VT3230PLLGenerate(Crtc, Clock); ViaDebug(Crtc->scrnIndex, "%s: %dkHz -> 0x%06X.\n", __func__, Clock, PLL); @@ -794,6 +792,21 @@ VT3157Crtc1FIFOSet(struct ViaCrtc *Crtc, DisplayModePtr Mode) * */ static void +VT3230Crtc1FIFOSet(struct ViaCrtc *Crtc, DisplayModePtr Mode) +{ + VIAFUNC(Crtc); + + VIACrtc1FetchCountSet(Crtc, Mode); + + /* Depth = 360 / 2 - 1; Threshold = 328 / 4; + HighThreshold = 296 / 4; Expire = 124 / 4 */ + VT3108Crtc1FIFOHelper(Crtc, 179, 82, 74, 31); +} + +/* + * + */ +static void VT3343Crtc1FIFOSet(struct ViaCrtc *Crtc, DisplayModePtr Mode) { VIAFUNC(Crtc); @@ -1017,6 +1030,21 @@ VT3157Crtc2FIFOSet(struct ViaCrtc *Crtc, DisplayModePtr Mode) * */ static void +VT3230Crtc2FIFOSet(struct ViaCrtc *Crtc, DisplayModePtr Mode) +{ + VIAFUNC(Crtc); + + VIACrtc2FetchCountSet(Crtc, Mode); + + /* Depth: 360 / 8 - 1; Threshold: 328 / 4; + HighThreshold: 296 / 4; Expire: 124 /4 */ + VT3108Crtc2FIFOHelper(Crtc, 44, 82, 74, 31); +} + +/* + * + */ +static void VT3343Crtc2FIFOSet(struct ViaCrtc *Crtc, DisplayModePtr Mode) { VIAFUNC(Crtc); @@ -1921,6 +1949,7 @@ ViaCrtcInit(ScrnInfoPtr pScrn) case VT3108: case VT3118: case VT3344: + case VT3230: case VT3157: case VT3343: case VT3371: @@ -1964,6 +1993,9 @@ ViaCrtcInit(ScrnInfoPtr pScrn) case VT3344: Crtc->FIFOSet = VT3344Crtc1FIFOSet; break; + case VT3230: + Crtc->FIFOSet = VT3230Crtc1FIFOSet; + break; case VT3157: Crtc->FIFOSet = VT3157Crtc1FIFOSet; break; @@ -1993,9 +2025,10 @@ ViaCrtcInit(ScrnInfoPtr pScrn) Crtc->PLLSet = VT3118Crtc1PLLSet; break; case VT3157: + case VT3230: case VT3343: case VT3371: - Crtc->PLLSet = VT3157Crtc1PLLSet; + Crtc->PLLSet = VT3230Crtc1PLLSet; break; default: /* should never happen, fix up the check at the top of this function */ @@ -2015,6 +2048,7 @@ ViaCrtcInit(ScrnInfoPtr pScrn) case VT3108: case VT3118: case VT3344: + case VT3230: case VT3157: case VT3343: case VT3371: @@ -2079,6 +2113,9 @@ ViaCrtcInit(ScrnInfoPtr pScrn) case VT3157: Crtc->FIFOSet = VT3157Crtc2FIFOSet; break; + case VT3230: + Crtc->FIFOSet = VT3230Crtc2FIFOSet; + break; case VT3343: Crtc->FIFOSet = VT3343Crtc2FIFOSet; break; @@ -2105,9 +2142,10 @@ ViaCrtcInit(ScrnInfoPtr pScrn) Crtc->PLLSet = VT3118Crtc2PLLSet; break; case VT3157: + case VT3230: case VT3343: case VT3371: - Crtc->PLLSet = VT3157Crtc2PLLSet; + Crtc->PLLSet = VT3230Crtc2PLLSet; break; default: /* should never happen, fix up the check at the top of this function */ @@ -2127,6 +2165,7 @@ ViaCrtcInit(ScrnInfoPtr pScrn) case VT3118: case VT3344: case VT3157: + case VT3230: case VT3343: case VT3371: Crtc->ScaleSet = VT3108Crtc2ScaleSet; |