summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2009-10-14 23:44:22 +0200
committerLuc Verhaegen <libv@skynet.be>2009-10-14 23:44:22 +0200
commitdcd5ff941fb32828cc499613fa504cdd2c473e70 (patch)
treeacace565cb3d9db1c9e254e7e67cfc372b916ad7
parenta848693f75cb5c5911446caf8a4e46a2449572aa (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.c65
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;