[Openchrome-devel] xf86-video-openchrome: 5 commits - configure.ac src/via_driver.h src/via_fp.c src/via_outputs.c src/via_ums.h

Kevin Brace kevinbrace at kemper.freedesktop.org
Tue May 23 22:17:14 UTC 2017


 configure.ac      |    2 
 src/via_driver.h  |    3 
 src/via_fp.c      |  290 +++++++++++++++++++++++++++++++++++++++++++++---------
 src/via_outputs.c |   10 +
 src/via_ums.h     |   19 ++-
 5 files changed, 265 insertions(+), 59 deletions(-)

New commits:
commit 8b00ce1fccc5ab74dcf35a9806ed2f6bb8abb4c4
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Tue May 23 15:16:05 2017 -0700

    Version bumped to 0.6.119
    
    Did a major rewrite of FP related probing and initialization code.
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/configure.ac b/configure.ac
index d3e9b62..a2cb667 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@
 # Initialize Autoconf
 AC_PREREQ(2.57)
 AC_INIT([xf86-video-openchrome],
-        [0.6.118],
+        [0.6.119],
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/openchrome],
         [xf86-video-openchrome])
 
commit 44b46d0536213abca0f37ad9e4d0a35e8d143075
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Tue May 23 15:13:46 2017 -0700

    Replacing via_lvds_init with viaFPProbe
    
    viaFPProbe and viaFPInit functions replace via_lvds_init function
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/src/via_fp.c b/src/via_fp.c
index 84d1e94..8e9c0ef 100644
--- a/src/via_fp.c
+++ b/src/via_fp.c
@@ -1560,79 +1560,174 @@ static const xf86OutputFuncsRec via_fp_funcs = {
     .destroy            = via_lvds_destroy
 };
 
-
 void
-via_lvds_init(ScrnInfoPtr pScrn)
+viaFPProbe(ScrnInfoPtr pScrn)
 {
-    VIAFPPtr pVIAFP = (VIAFPPtr) xnfcalloc(sizeof(VIAFPRec), 1);
-    OptionInfoPtr  Options = xnfalloc(sizeof(ViaPanelOptions));
-    MessageType from = X_DEFAULT;
+    vgaHWPtr hwp = VGAHWPTR(pScrn);
     VIAPtr pVia = VIAPTR(pScrn);
     VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
-    xf86OutputPtr output = NULL;
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
-    CARD8 cr3b = 0x00;
-    CARD8 cr3b_mask = 0x00;
-    char outputNameBuffer[32];
+    CARD8 sr12, sr13, sr5a;
+    CARD8 cr3b;
 
-    if (!pVIAFP)
-        return;
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entered viaFPProbe.\n"));
 
-    /* Apparently this is the way VIA Technologies passes */
-    /* the presence of a flat panel to the device driver */
-    /* via BIOS setup. */
-    if (pVia->Chipset == VIA_CLE266) {
-        cr3b_mask = 0x08;
-    } else {
-        cr3b_mask = 0x02;
-    }            
+    sr12 = hwp->readSeq(hwp, 0x12);
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "SR12: 0x%02X\n", sr12));
+    sr13 = hwp->readSeq(hwp, 0x13);
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "SR13: 0x%02X\n", sr13));
+    cr3b = hwp->readCrtc(hwp, 0x3B);
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "CR3B: 0x%02X\n", sr13));
 
-    cr3b = hwp->readCrtc(hwp, 0x3B) & cr3b_mask;
+    /* Detect the presence of FPs. */
+    switch (pVia->Chipset) {
+    case VIA_CLE266:
+        if ((sr12 & BIT(4)) || (cr3b & BIT(3))) {
+            pVIADisplay->intFP1Presence = TRUE;
+            pVIADisplay->intFP1DIPort = VIA_DI_PORT_DIP0;
+            pVIADisplay->intFP2Presence = FALSE;
+            pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+        } else {
+            pVIADisplay->intFP1Presence = FALSE;
+            pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+            pVIADisplay->intFP2Presence = FALSE;
+            pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+        }
 
-    if (!cr3b) {
-        return;
-    }
+        break;
+    case VIA_KM400:
+    case VIA_P4M800PRO:
+    case VIA_PM800:
+    case VIA_K8M800:
+        /* 3C5.13[3] - DVP0D8 pin strapping
+         *             0: AGP pins are used for AGP
+         *             1: AGP pins are used by FPDP
+         *             (Flat Panel Display Port) */
+        if ((sr13 & BIT(3)) && (cr3b & BIT(1))) {
+            pVIADisplay->intFP1Presence = TRUE;
+            pVIADisplay->intFP1DIPort = VIA_DI_PORT_FPDPHIGH
+                                            | VIA_DI_PORT_FPDPLOW;
+            pVIADisplay->intFP2Presence = FALSE;
+            pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
 
-    memcpy(Options, ViaPanelOptions, sizeof(ViaPanelOptions));
-    xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, Options);
+        } else {
+            pVIADisplay->intFP1Presence = FALSE;
+            pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+            pVIADisplay->intFP2Presence = FALSE;
+            pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+        }
 
-    pVIAFP->NativeModeIndex = VIA_PANEL_INVALID;
+        break;
+    case VIA_P4M890:
+    case VIA_K8M890:
+    case VIA_P4M900:
+        if (cr3b & BIT(1)) {
+
+            /* 3C5.12[4] - DVP0D4 pin strapping
+             *             0: 12-bit FPDP (Flat Panel Display Port)
+             *             1: 24-bit FPDP (Flat Panel Display Port) */
+            if (sr12 & BIT(4)) {
+                pVIADisplay->intFP1Presence = TRUE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_FPDPLOW
+                                            | VIA_DI_PORT_FPDPHIGH;
+                pVIADisplay->intFP2Presence = FALSE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+            } else {
+                pVIADisplay->intFP1Presence = TRUE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_FPDPLOW;
+                pVIADisplay->intFP2Presence = FALSE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+            }
+        }
 
-    /* LCD Center/Expend Option */
-    pVIAFP->Center = FALSE;
-    from = xf86GetOptValBool(Options, OPTION_CENTER, &pVIAFP->Center)
-            ? X_CONFIG : X_DEFAULT;
-    xf86DrvMsg(pScrn->scrnIndex, from, "LVDS-0 : DVI Center is %s.\n",
-               pVIAFP->Center ? "enabled" : "disabled");
+        break;
+    case VIA_CX700:
+    case VIA_VX800:
+    case VIA_VX855:
+    case VIA_VX900:
+        sr5a = hwp->readSeq(hwp, 0x5A);
 
-    /* The code to dynamically designate a particular FP (i.e., FP-1,
-     * FP-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */
-    sprintf(outputNameBuffer, "FP-%d", (pVIADisplay->numberFP + 1));
-    output = xf86OutputCreate(pScrn, &via_fp_funcs, outputNameBuffer);
+        /* Setting SR5A[0] to 1.
+         * This allows the reading out the alternative
+         * pin strapping information from SR12 and SR13. */
+        ViaSeqMask(hwp, 0x5A, BIT(0), BIT(0));
 
-    if (output)  {
-        output->driver_private = pVIAFP;
+        sr13 = hwp->readSeq(hwp, 0x13);
+        DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                            "SR13: 0x%02X\n", sr13));
+
+        if (cr3b & BIT(1)) {
+            if (pVia->isVIANanoBook) {
+                pVIADisplay->intFP1Presence = FALSE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+                pVIADisplay->intFP2Presence = TRUE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_LVDS2;
+
+            /* 3C5.13[7:6] - Integrated LVDS / DVI Mode Select
+             *               (DVP1D15-14 pin strapping)
+             *               00: LVDS1 + LVDS2
+             *               01: DVI + LVDS2
+             *               10: Dual LVDS Channel (High Resolution Panel)
+             *               11: One DVI only (decrease the clock jitter) */
+            } else if ((!(sr13 & BIT(7))) && (!(sr13 & BIT(6)))) {
+                pVIADisplay->intFP1Presence = TRUE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_LVDS1;
+                pVIADisplay->intFP2Presence = TRUE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_LVDS2;
+            } else if ((!(sr13 & BIT(7))) && (sr13 & BIT(6))) {
+                pVIADisplay->intFP1Presence = FALSE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+                pVIADisplay->intFP2Presence = TRUE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_LVDS2;
+            } else if ((sr13 & BIT(7)) && (!(sr13 & BIT(6)))) {
+                pVIADisplay->intFP1Presence = TRUE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_LVDS1
+                                                | VIA_DI_PORT_LVDS2;
+                pVIADisplay->intFP2Presence = FALSE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+            } else {
+                pVIADisplay->intFP1Presence = FALSE;
+                pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+                pVIADisplay->intFP2Presence = FALSE;
+                pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+            }
+        } else {
+            pVIADisplay->intFP1Presence = FALSE;
+            pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+            pVIADisplay->intFP2Presence = FALSE;
+            pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+        }
 
-        /* While there are two (2) display controllers registered with the
-         * X.Org Server, it is often desirable to fix FP (Flat Panel) to
-         * IGA2 since only IGA2 contains panel resolution scaling
-         * functionality. IGA1 does not have this. */
-        output->possible_crtcs = 1 << 1;
+        hwp->writeSeq(hwp, 0x5A, sr5a);
+        break;
+    default:
+        pVIADisplay->intFP1Presence = FALSE;
+        pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE;
+        pVIADisplay->intFP2Presence = FALSE;
+        pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE;
+        break;
+    }
 
-        output->possible_clones = 0;
-        output->interlaceAllowed = FALSE;
-        output->doubleScanAllowed = FALSE;
+    pVIADisplay->intFP1I2CBus = VIA_I2C_NONE;
+    pVIADisplay->intFP2I2CBus = VIA_I2C_NONE;
 
-        /* Increment the number of FP connectors. */
-        pVIADisplay->numberFP++;
+    if ((pVIADisplay->intFP1Presence)
+        && (!(pVIADisplay->mappedI2CBus & VIA_I2C_BUS2))) {
+        pVIADisplay->intFP1I2CBus = VIA_I2C_BUS2;
+        pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2;
+    }
 
-        if (pVia->IsOLPCXO15) {
-            output->mm_height = 152;
-            output->mm_width = 114;
-        }
-    } else {
-        free(pVIAFP);
+    if ((pVIADisplay->intFP2Presence)
+        && (!(pVIADisplay->mappedI2CBus & VIA_I2C_BUS2))) {
+        pVIADisplay->intFP2I2CBus = VIA_I2C_BUS2;
+        pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2;
     }
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaFPProbe.\n"));
 }
 
 void
diff --git a/src/via_outputs.c b/src/via_outputs.c
index 7bff710..258ad6e 100644
--- a/src/via_outputs.c
+++ b/src/via_outputs.c
@@ -669,6 +669,8 @@ viaInitDisplay(ScrnInfoPtr pScrn)
 
     viaTMDSProbe(pScrn);
 
+    viaFPProbe(pScrn);
+
     viaAnalogProbe(pScrn);
 
 
@@ -678,15 +680,15 @@ viaInitDisplay(ScrnInfoPtr pScrn)
     /* DVI */
     via_dvi_init(pScrn);
 
-    /* LVDS */
-    via_lvds_init(pScrn);
-
     /* DVI */
     viaTMDSInit(pScrn);
 
     /* VGA */
     viaAnalogInit(pScrn);
 
+    /* FP (Flat Panel) */
+    viaFPInit(pScrn);
+
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
                         "Exiting viaInitDisplay.\n"));
 }
diff --git a/src/via_ums.h b/src/via_ums.h
index 483239e..9b19fcb 100644
--- a/src/via_ums.h
+++ b/src/via_ums.h
@@ -613,9 +613,10 @@ void ViaShadowCRTCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode);
 void viaAnalogProbe(ScrnInfoPtr pScrn);
 void viaAnalogInit(ScrnInfoPtr pScrn);
 
-/* via_lvds.c */
+/* via_fp.c */
 void viaLVDS1SetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState);
-void via_lvds_init(ScrnInfoPtr pScrn);
+void viaFPProbe(ScrnInfoPtr pScrn);
+void viaFPInit(ScrnInfoPtr pScrn);
 
 /* via_tmds.c */
 void viaExtTMDSSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource);
commit 2117faaf0e39d3f63684afeb1226a0bc2f670d14
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Tue May 23 14:45:30 2017 -0700

    Added viaFPInit
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/src/via_fp.c b/src/via_fp.c
index cef86e7..84d1e94 100644
--- a/src/via_fp.c
+++ b/src/via_fp.c
@@ -1634,3 +1634,101 @@ via_lvds_init(ScrnInfoPtr pScrn)
         free(pVIAFP);
     }
 }
+
+void
+viaFPInit(ScrnInfoPtr pScrn)
+{
+    xf86OutputPtr output;
+    VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
+    VIAFPPtr pVIAFP;
+    char outputNameBuffer[32];
+
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Entering viaFPInit.\n"));
+
+    if (pVIADisplay->intFP1Presence) {
+        pVIAFP = (VIAFPPtr) xnfcalloc(1, sizeof(VIAFPRec));
+        if (!pVIAFP) {
+            DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                                "Failed to allocate private storage for "
+                                "FP.\n"));
+            goto exit;
+        }
+
+        /* The code to dynamically designate a particular FP (i.e., FP-1,
+         * FP-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */
+        sprintf(outputNameBuffer, "FP-%d", (pVIADisplay->numberFP + 1));
+        output = xf86OutputCreate(pScrn, &via_fp_funcs, outputNameBuffer);
+        if (!output) {
+            free(pVIAFP);
+            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                        "Failed to allocate X Server display output record for "
+                        "FP.\n");
+            goto exit;
+        }
+
+        /* Increment the number of FP connectors. */
+        pVIADisplay->numberFP++;
+
+        pVIAFP->diPort = pVIADisplay->intFP1DIPort;
+
+        /* Hint about which I2C bus to access for obtaining EDID. */
+        pVIAFP->i2cBus = pVIADisplay->intFP1I2CBus;
+
+        output->driver_private = pVIAFP;
+
+        output->possible_crtcs = BIT(1) | BIT(0);
+
+        output->possible_clones = 0;
+        output->interlaceAllowed = FALSE;
+        output->doubleScanAllowed = FALSE;
+
+        if (pVia->IsOLPCXO15) {
+            output->mm_height = 152;
+            output->mm_width = 114;
+        }
+    }
+
+    if (pVIADisplay->intFP2Presence) {
+        pVIAFP = (VIAFPPtr) xnfcalloc(1, sizeof(VIAFPRec));
+        if (!pVIAFP) {
+            DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                                "Failed to allocate private storage for "
+                                "FP.\n"));
+            goto exit;
+        }
+
+        /* The code to dynamically designate a particular FP (i.e., FP-1,
+         * FP-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */
+        sprintf(outputNameBuffer, "FP-%d", (pVIADisplay->numberFP + 1));
+        output = xf86OutputCreate(pScrn, &via_fp_funcs, outputNameBuffer);
+        if (!output) {
+            free(pVIAFP);
+            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                        "Failed to allocate X Server display output record for "
+                        "FP.\n");
+            goto exit;
+        }
+
+        /* Increment the number of FP connectors. */
+        pVIADisplay->numberFP++;
+
+        pVIAFP->diPort = pVIADisplay->intFP2DIPort;
+
+        /* Hint about which I2C bus to access for obtaining EDID. */
+        pVIAFP->i2cBus = pVIADisplay->intFP2I2CBus;
+
+        output->driver_private = pVIAFP;
+
+        output->possible_crtcs = BIT(1) | BIT(0);
+
+        output->possible_clones = 0;
+        output->interlaceAllowed = FALSE;
+        output->doubleScanAllowed = FALSE;
+    }
+
+exit:
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                        "Exiting viaFPInit.\n"));
+}
diff --git a/src/via_ums.h b/src/via_ums.h
index 7874bea..483239e 100644
--- a/src/via_ums.h
+++ b/src/via_ums.h
@@ -152,6 +152,14 @@ typedef struct _VIADISPLAY {
     CARD8       intTMDSDIPort;
     CARD8       intTMDSI2CBus;
 
+    Bool        intFP1Presence;
+    CARD8       intFP1DIPort;
+    CARD8       intFP1I2CBus;
+
+    Bool        intFP2Presence;
+    CARD8       intFP2DIPort;
+    CARD8       intFP2I2CBus;
+
     /* Keeping track of the number of analog VGA connectors. */
     unsigned int        numberVGA;
 
@@ -226,7 +234,8 @@ typedef struct _VIAFP {
     Bool        scaleY;
     int         resY;
 
-    I2CBusPtr pVIAFPI2CBus;
+    CARD8       diPort;
+    CARD8       i2cBus;
 } VIAFPRec, *VIAFPPtr;
 
 typedef struct _VIATMDS {
commit b9b7204120452891ee6258f2336a324c9559f5ef
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Tue May 23 14:28:35 2017 -0700

    Changed via_lvds_funcs to via_fp_funcs
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/src/via_fp.c b/src/via_fp.c
index fd7a1ba..cef86e7 100644
--- a/src/via_fp.c
+++ b/src/via_fp.c
@@ -1539,7 +1539,7 @@ via_lvds_destroy(xf86OutputPtr output)
     output->driver_private = NULL;
 }
 
-static const xf86OutputFuncsRec via_lvds_funcs = {
+static const xf86OutputFuncsRec via_fp_funcs = {
     .create_resources   = via_lvds_create_resources,
     .dpms               = via_fp_dpms,
     .save               = via_lvds_save,
@@ -1608,7 +1608,7 @@ via_lvds_init(ScrnInfoPtr pScrn)
     /* The code to dynamically designate a particular FP (i.e., FP-1,
      * FP-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */
     sprintf(outputNameBuffer, "FP-%d", (pVIADisplay->numberFP + 1));
-    output = xf86OutputCreate(pScrn, &via_lvds_funcs, outputNameBuffer);
+    output = xf86OutputCreate(pScrn, &via_fp_funcs, outputNameBuffer);
 
     if (output)  {
         output->driver_private = pVIAFP;
commit 50c1396d8df98beda139601f624132635e6cb0e1
Author: Kevin Brace <kevinbrace at gmx.com>
Date:   Tue May 23 14:19:22 2017 -0700

    Moving numberFP variable to a different record
    
    Signed-off-by: Kevin Brace <kevinbrace at gmx.com>

diff --git a/src/via_driver.h b/src/via_driver.h
index 18ceb58..c750248 100644
--- a/src/via_driver.h
+++ b/src/via_driver.h
@@ -361,9 +361,6 @@ typedef struct _VIA {
 
     video_via_regs*     VideoRegs;
 
-    /* Keeping track of the number of FP (Flat Panel) connectors. */
-    unsigned int        numberFP;
-
     /* Shadow copy of CR3B through CR3F. */
     CARD8       originalCR3B, originalCR3C, originalCR3D,
                 originalCR3E, originalCR3F;
diff --git a/src/via_fp.c b/src/via_fp.c
index 31e1528..fd7a1ba 100644
--- a/src/via_fp.c
+++ b/src/via_fp.c
@@ -1568,6 +1568,7 @@ via_lvds_init(ScrnInfoPtr pScrn)
     OptionInfoPtr  Options = xnfalloc(sizeof(ViaPanelOptions));
     MessageType from = X_DEFAULT;
     VIAPtr pVia = VIAPTR(pScrn);
+    VIADisplayPtr pVIADisplay = pVia->pVIADisplay;
     xf86OutputPtr output = NULL;
     vgaHWPtr hwp = VGAHWPTR(pScrn);
     CARD8 cr3b = 0x00;
@@ -1606,7 +1607,7 @@ via_lvds_init(ScrnInfoPtr pScrn)
 
     /* The code to dynamically designate a particular FP (i.e., FP-1,
      * FP-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */
-    sprintf(outputNameBuffer, "FP-%d", (pVia->numberFP + 1));
+    sprintf(outputNameBuffer, "FP-%d", (pVIADisplay->numberFP + 1));
     output = xf86OutputCreate(pScrn, &via_lvds_funcs, outputNameBuffer);
 
     if (output)  {
@@ -1623,7 +1624,7 @@ via_lvds_init(ScrnInfoPtr pScrn)
         output->doubleScanAllowed = FALSE;
 
         /* Increment the number of FP connectors. */
-        pVia->numberFP++;
+        pVIADisplay->numberFP++;
 
         if (pVia->IsOLPCXO15) {
             output->mm_height = 152;
diff --git a/src/via_outputs.c b/src/via_outputs.c
index 2c5628f..7bff710 100644
--- a/src/via_outputs.c
+++ b/src/via_outputs.c
@@ -661,7 +661,7 @@ viaInitDisplay(ScrnInfoPtr pScrn)
     pVIADisplay->numberDVI = 0;
 
     /* Initialize the number of FP connectors. */
-    pVia->numberFP = 0;
+    pVIADisplay->numberFP = 0;
 
     /* Read off the VIA Technologies IGP pin strapping for
        display detection purposes. */
diff --git a/src/via_ums.h b/src/via_ums.h
index b32dde1..7874bea 100644
--- a/src/via_ums.h
+++ b/src/via_ums.h
@@ -158,6 +158,9 @@ typedef struct _VIADISPLAY {
     /* Keeping track of the number of DVI connectors. */
     unsigned int        numberDVI;
 
+    /* Keeping track of the number of FP (Flat Panel) connectors. */
+    unsigned int        numberFP;
+
    CARD8       mappedI2CBus;
 
     xf86OutputPtr tv;


More information about the Openchrome-devel mailing list