xf86-video-intel: Branch 'modesetting' - 3 commits - src/ch7xxx/ch7xxx.c src/ch7xxx/Makefile.am src/i2c_vid.h src/i830_dvo.c src/i830_xf86Crtc.c src/sil164/Makefile.am src/sil164/sil164.c

Eric Anholt anholt at kemper.freedesktop.org
Tue Dec 19 02:12:34 EET 2006


 src/ch7xxx/Makefile.am |    2 -
 src/ch7xxx/ch7xxx.c    |   38 +++++++++++++++------------
 src/i2c_vid.h          |   16 +++++------
 src/i830_dvo.c         |   24 ++++++++++-------
 src/i830_xf86Crtc.c    |   24 ++++++++++-------
 src/sil164/Makefile.am |    2 -
 src/sil164/sil164.c    |   68 ++++++++++++++++++++++++++++---------------------
 7 files changed, 100 insertions(+), 74 deletions(-)

New commits:
diff-tree eedef7adc53dd8337d27c02551c5778fb43bae05 (from 8983845f91cacf8110c70121e0f5f293fe443e6d)
Author: Eric Anholt <eric at anholt.net>
Date:   Mon Dec 18 15:57:44 2006 -0800

    Add a detect() function for DVO chips, and implement it on sil164.

diff --git a/src/ch7xxx/Makefile.am b/src/ch7xxx/Makefile.am
index 645ac69..d63c7fc 100644
--- a/src/ch7xxx/Makefile.am
+++ b/src/ch7xxx/Makefile.am
@@ -3,7 +3,7 @@
 # -avoid-version prevents gratuitous .0.0.0 version numbers on the end
 # _ladir passes a dummy rpath to libtool so the thing will actually link
 # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc.
-AM_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@
+AM_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ -I../
 
 ch7xxx_la_LTLIBRARIES = ch7xxx.la
 ch7xxx_la_LDFLAGS = -module -avoid-version
diff --git a/src/ch7xxx/ch7xxx.c b/src/ch7xxx/ch7xxx.c
index b1e8cbd..5bfb7c5 100644
--- a/src/ch7xxx/ch7xxx.c
+++ b/src/ch7xxx/ch7xxx.c
@@ -25,6 +25,11 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF 
 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 **************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <string.h>
 #include "xf86.h"
 #include "xf86_OSproc.h"
@@ -32,6 +37,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
 #include "compiler.h"
 #include "miscstruct.h"
 #include "xf86i2c.h"
+#include "i830_xf86Crtc.h"
 #define DPMS_SERVER
 #include <X11/extensions/dpms.h>
 
@@ -173,6 +179,12 @@ out:
     return NULL;
 }
 
+static xf86OutputStatus
+ch7xxx_detect(I2CDevPtr d)
+{
+    return XF86OutputStatusUnknown;
+}
+
 static ModeStatus
 ch7xxx_mode_valid(I2CDevPtr d, DisplayModePtr mode)
 {
@@ -275,6 +287,7 @@ ch7xxx_restore(I2CDevPtr d)
 
 I830I2CVidOutputRec CH7xxxVidOutput = {
     .init = ch7xxx_init,
+    .detect = ch7xxx_detect,
     .mode_valid = ch7xxx_mode_valid,
     .mode_set = ch7xxx_mode_set,
     .dpms = ch7xxx_dpms,
diff --git a/src/i2c_vid.h b/src/i2c_vid.h
index 877122f..3be394d 100644
--- a/src/i2c_vid.h
+++ b/src/i2c_vid.h
@@ -4,6 +4,7 @@
 
 typedef struct _I830I2CVidOutputRec {
     void *(*init)(I2CBusPtr b, I2CSlaveAddr addr);
+    xf86OutputStatus (*detect)(I2CDevPtr d);
     ModeStatus (*mode_valid)(I2CDevPtr d, DisplayModePtr mode);
     void (*mode_set)(I2CDevPtr d, DisplayModePtr mode);
     void (*dpms)(I2CDevPtr d, int mode);
diff --git a/src/i830_dvo.c b/src/i830_dvo.c
index c3ad4c0..97453de 100644
--- a/src/i830_dvo.c
+++ b/src/i830_dvo.c
@@ -177,7 +177,10 @@ i830_dvo_mode_set(xf86OutputPtr output, 
 static xf86OutputStatus
 i830_dvo_detect(xf86OutputPtr output)
 {
-    return XF86OutputStatusUnknown;
+    I830OutputPrivatePtr    intel_output = output->driver_private;
+    void *dev_priv = intel_output->i2c_drv->dev_priv;
+
+    return intel_output->i2c_drv->vid_rec->detect(dev_priv);
 }
 
 static Bool
diff --git a/src/sil164/Makefile.am b/src/sil164/Makefile.am
index bb84d03..d4c0cbd 100644
--- a/src/sil164/Makefile.am
+++ b/src/sil164/Makefile.am
@@ -3,7 +3,7 @@
 # -avoid-version prevents gratuitous .0.0.0 version numbers on the end
 # _ladir passes a dummy rpath to libtool so the thing will actually link
 # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc.
-AM_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@
+AM_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ -I../
 
 sil164_la_LTLIBRARIES = sil164.la
 sil164_la_LDFLAGS = -module -avoid-version
diff --git a/src/sil164/sil164.c b/src/sil164/sil164.c
index 497336c..453ed04 100644
--- a/src/sil164/sil164.c
+++ b/src/sil164/sil164.c
@@ -26,12 +26,18 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF 
 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 **************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include "xf86.h"
 #include "xf86_OSproc.h"
 #include "xf86Resources.h"
 #include "compiler.h"
 #include "miscstruct.h"
 #include "xf86i2c.h"
+#include "i830_xf86Crtc.h"
 #define DPMS_SERVER
 #include <X11/extensions/dpms.h>
 
@@ -117,6 +123,20 @@ out:
     return NULL;
 }
 
+static xf86OutputStatus
+sil164_detect(I2CDevPtr d)
+{
+    SIL164Ptr sil = SILPTR(d);
+    CARD8 reg9;
+
+    sil164ReadByte(sil, SIL164_REG9, &reg9);
+
+    if (reg9 & SIL164_9_HTPLG)
+	return XF86OutputStatusConnected;
+    else
+	return XF86OutputStatusDisconnected;
+}
+
 static ModeStatus
 sil164_mode_valid(I2CDevPtr d, DisplayModePtr mode)
 {
@@ -215,6 +235,7 @@ sil164_restore(I2CDevPtr d)
 
 I830I2CVidOutputRec SIL164VidOutput = {
     .init = sil164_init,
+    .detect = sil164_detect,
     .mode_valid = sil164_mode_valid,
     .mode_set = sil164_mode_set,
     .dpms = sil164_dpms,
diff-tree 8983845f91cacf8110c70121e0f5f293fe443e6d (from fa4642048b183134544fc5ee47558446d27f6194)
Author: Eric Anholt <eric at anholt.net>
Date:   Mon Dec 18 15:57:08 2006 -0800

    Fix crash in xf86SetScrnInfoModes when pScrn->modes ends up empty.

diff --git a/src/i830_xf86Crtc.c b/src/i830_xf86Crtc.c
index 51e6f1c..bb6c869 100644
--- a/src/i830_xf86Crtc.c
+++ b/src/i830_xf86Crtc.c
@@ -555,16 +555,20 @@ xf86SetScrnInfoModes (ScrnInfoPtr pScrn)
     for (mode = pScrn->modes; mode; mode = mode->next)
 	if (xf86ModesEqual (mode, &crtc->desiredMode))
 	    break;
-    
-    /* For some reason, pScrn->modes is circular, unlike the other mode lists.
-     * How great is that?
-     */
-    for (last = pScrn->modes; last && last->next; last = last->next);
-    last->next = pScrn->modes;
-    pScrn->modes->prev = last;
-    if (mode)
-	while (pScrn->modes != mode)
-	    pScrn->modes = pScrn->modes->next;
+
+    if (pScrn->modes != NULL) {
+	/* For some reason, pScrn->modes is circular, unlike the other mode
+	 * lists.  How great is that?
+	 */
+	for (last = pScrn->modes; last && last->next; last = last->next)
+	    ;
+	last->next = pScrn->modes;
+	pScrn->modes->prev = last;
+	if (mode) {
+	    while (pScrn->modes != mode)
+		pScrn->modes = pScrn->modes->next;
+	}
+    }
     pScrn->currentMode = pScrn->modes;
 }
 
diff-tree fa4642048b183134544fc5ee47558446d27f6194 (from dcb069a1da6b3300b0772843dd9b67efdf319637)
Author: Eric Anholt <eric at anholt.net>
Date:   Mon Dec 18 15:32:35 2006 -0800

    Clean up i2c_vid interface, including de-StudlyCapsing and removing dead code.
    
    The old Init() function is removed and the previous Detect() function is now
    init().  This leaves us room in the namespace for a detect() like other
    outputs have ("is the monitor connected?").  Also, Power() became dpms(),
    taking a DPMSMode*.  In general, the mode setting path now matches the intel
    internal path, except for the lack of mode_fixup().

diff --git a/src/ch7xxx/ch7xxx.c b/src/ch7xxx/ch7xxx.c
index 61ab20d..b1e8cbd 100644
--- a/src/ch7xxx/ch7xxx.c
+++ b/src/ch7xxx/ch7xxx.c
@@ -32,6 +32,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
 #include "compiler.h"
 #include "miscstruct.h"
 #include "xf86i2c.h"
+#define DPMS_SERVER
+#include <X11/extensions/dpms.h>
 
 #include "../i2c_vid.h"
 #include "ch7xxx.h"
@@ -112,7 +114,7 @@ ch7xxx_write(struct ch7xxx_priv *dev_pri
 }
 
 static void *
-ch7xxx_probe(I2CBusPtr b, I2CSlaveAddr addr)
+ch7xxx_init(I2CBusPtr b, I2CSlaveAddr addr)
 {
     /* this will detect the CH7xxx chip on the specified i2c bus */
     struct ch7xxx_priv *dev_priv;
@@ -171,14 +173,6 @@ out:
     return NULL;
 }
 
-
-static Bool
-ch7xxx_init(I2CDevPtr d)
-{
-    /* not much to do */
-    return TRUE;
-}
-
 static ModeStatus
 ch7xxx_mode_valid(I2CDevPtr d, DisplayModePtr mode)
 {
@@ -228,11 +222,11 @@ ch7xxx_mode_set(I2CDevPtr d, DisplayMode
 
 /* set the CH7xxx power state */
 static void
-ch7xxx_power(I2CDevPtr d, Bool on)
+ch7xxx_dpms(I2CDevPtr d, int mode)
 {
     struct ch7xxx_priv *dev_priv = d->DriverPrivate.ptr;
 
-    if (on)
+    if (mode == DPMSModeOn)
 	ch7xxx_write(dev_priv, CH7xxx_PM, CH7xxx_PM_DVIL | CH7xxx_PM_DVIP);
     else
 	ch7xxx_write(dev_priv, CH7xxx_PM, CH7xxx_PM_FPD);
@@ -280,12 +274,11 @@ ch7xxx_restore(I2CDevPtr d)
 }
 
 I830I2CVidOutputRec CH7xxxVidOutput = {
-    ch7xxx_probe,
-    ch7xxx_init,
-    ch7xxx_mode_valid,
-    ch7xxx_mode_set,
-    ch7xxx_power,
-    ch7xxx_dump_regs,
-    ch7xxx_save,
-    ch7xxx_restore,
+    .init = ch7xxx_init,
+    .mode_valid = ch7xxx_mode_valid,
+    .mode_set = ch7xxx_mode_set,
+    .dpms = ch7xxx_dpms,
+    .dump_regs = ch7xxx_dump_regs,
+    .save = ch7xxx_save,
+    .restore = ch7xxx_restore,
 };
diff --git a/src/i2c_vid.h b/src/i2c_vid.h
index 5a743d2..877122f 100644
--- a/src/i2c_vid.h
+++ b/src/i2c_vid.h
@@ -3,14 +3,13 @@
 #define I2C_VID_H
 
 typedef struct _I830I2CVidOutputRec {
-  void *(*Detect)(I2CBusPtr b, I2CSlaveAddr addr);
-  Bool (*Init)(I2CDevPtr d);
-  ModeStatus (*ModeValid)(I2CDevPtr d, DisplayModePtr mode);
-  void (*Mode)(I2CDevPtr d, DisplayModePtr mode);
-  void (*Power)(I2CDevPtr d, Bool On);
-  void (*PrintRegs)(I2CDevPtr d);
-  void (*SaveRegs)(I2CDevPtr d);
-  void (*RestoreRegs)(I2CDevPtr d);
+    void *(*init)(I2CBusPtr b, I2CSlaveAddr addr);
+    ModeStatus (*mode_valid)(I2CDevPtr d, DisplayModePtr mode);
+    void (*mode_set)(I2CDevPtr d, DisplayModePtr mode);
+    void (*dpms)(I2CDevPtr d, int mode);
+    void (*dump_regs)(I2CDevPtr d);
+    void (*save)(I2CDevPtr d);
+    void (*restore)(I2CDevPtr d);
 } I830I2CVidOutputRec, *I830I2CVidOutputPtr;
 
 #endif
diff --git a/src/i830_dvo.c b/src/i830_dvo.c
index 804f0fc..c3ad4c0 100644
--- a/src/i830_dvo.c
+++ b/src/i830_dvo.c
@@ -62,12 +62,13 @@ i830_dvo_dpms(xf86OutputPtr output, int 
     ScrnInfoPtr		    pScrn = output->scrn;
     I830Ptr		    pI830 = I830PTR(pScrn);
     I830OutputPrivatePtr    intel_output = output->driver_private;
+    void *		    dev_priv = intel_output->i2c_drv->dev_priv;
 
     if (mode == DPMSModeOn) {
 	OUTREG(DVOC, INREG(DVOC) | DVO_ENABLE);
-	(*intel_output->i2c_drv->vid_rec->Power)(intel_output->i2c_drv->dev_priv, TRUE);
+	(*intel_output->i2c_drv->vid_rec->dpms)(dev_priv, mode);
     } else {
-	(*intel_output->i2c_drv->vid_rec->Power)(intel_output->i2c_drv->dev_priv, FALSE);
+	(*intel_output->i2c_drv->vid_rec->dpms)(dev_priv, mode);
 	OUTREG(DVOC, INREG(DVOC) & ~DVO_ENABLE);
     }
 }
@@ -78,6 +79,7 @@ i830_dvo_save(xf86OutputPtr output)
     ScrnInfoPtr		    pScrn = output->scrn;
     I830Ptr		    pI830 = I830PTR(pScrn);
     I830OutputPrivatePtr    intel_output = output->driver_private;
+    void *		    dev_priv = intel_output->i2c_drv->dev_priv;
 
     /* Each output should probably just save the registers it touches, but for
      * now, use more overkill.
@@ -86,7 +88,7 @@ i830_dvo_save(xf86OutputPtr output)
     pI830->saveDVOB = INREG(DVOB);
     pI830->saveDVOC = INREG(DVOC);
 
-    (*intel_output->i2c_drv->vid_rec->SaveRegs)(intel_output->i2c_drv->dev_priv);
+    (*intel_output->i2c_drv->vid_rec->save)(dev_priv);
 }
 
 static void
@@ -95,12 +97,13 @@ i830_dvo_restore(xf86OutputPtr output)
     ScrnInfoPtr		    pScrn = output->scrn;
     I830Ptr		    pI830 = I830PTR(pScrn);
     I830OutputPrivatePtr    intel_output = output->driver_private;
+    void *		    dev_priv = intel_output->i2c_drv->dev_priv;
 
     OUTREG(DVOA, pI830->saveDVOA);
     OUTREG(DVOB, pI830->saveDVOB);
     OUTREG(DVOC, pI830->saveDVOC);
 
-    (*intel_output->i2c_drv->vid_rec->RestoreRegs)(intel_output->i2c_drv->dev_priv);
+    (*intel_output->i2c_drv->vid_rec->restore)(dev_priv);
 }
 
 static int
@@ -114,7 +117,7 @@ i830_dvo_mode_valid(xf86OutputPtr output
 
     /* XXX: Validate clock range */
 
-    return intel_output->i2c_drv->vid_rec->ModeValid(dev_priv, pMode);
+    return intel_output->i2c_drv->vid_rec->mode_valid(dev_priv, pMode);
 }
 
 static Bool
@@ -139,8 +142,8 @@ i830_dvo_mode_set(xf86OutputPtr output, 
     CARD32		    dvo;
     int			    dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B;
 
-    intel_output->i2c_drv->vid_rec->Mode(intel_output->i2c_drv->dev_priv,
-					 mode);
+    intel_output->i2c_drv->vid_rec->mode_set(intel_output->i2c_drv->dev_priv,
+					     mode);
 
     /* Save the data order, since I don't know what it should be set to. */
     dvo = INREG(DVOC) & (DVO_PRESERVE_MASK | DVO_DATA_ORDER_GBRG);
@@ -196,7 +199,7 @@ I830I2CDetectDVOControllers(ScrnInfoPtr 
 	ret_ptr = NULL;
 	drv->vid_rec = LoaderSymbol(drv->fntablename);
 	if (drv->vid_rec != NULL)
-	    ret_ptr = drv->vid_rec->Detect(pI2CBus, drv->address);
+	    ret_ptr = drv->vid_rec->init(pI2CBus, drv->address);
 
 	if (ret_ptr != NULL) {
 	    drv->dev_priv = ret_ptr;
diff --git a/src/sil164/sil164.c b/src/sil164/sil164.c
index 0a68d69..497336c 100644
--- a/src/sil164/sil164.c
+++ b/src/sil164/sil164.c
@@ -32,16 +32,13 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
 #include "compiler.h"
 #include "miscstruct.h"
 #include "xf86i2c.h"
+#define DPMS_SERVER
+#include <X11/extensions/dpms.h>
 
 #include "../i2c_vid.h"
 #include "sil164.h"
 #include "sil164_reg.h"
 
-static void
-sil164PrintRegs(I2CDevPtr d);
-static void
-sil164Power(I2CDevPtr d, Bool On);
-
 static Bool
 sil164ReadByte(SIL164Ptr sil, int addr, CARD8 *ch)
 {
@@ -68,7 +65,7 @@ sil164WriteByte(SIL164Ptr sil, int addr,
 
 /* Silicon Image 164 driver for chip on i2c bus */
 static void *
-sil164Detect(I2CBusPtr b, I2CSlaveAddr addr)
+sil164_init(I2CBusPtr b, I2CSlaveAddr addr)
 {
     /* this will detect the SIL164 chip on the specified i2c bus */
     SIL164Ptr sil;
@@ -120,26 +117,19 @@ out:
     return NULL;
 }
 
-
-static Bool
-sil164Init(I2CDevPtr d)
-{
-    /* not much to do */
-    return TRUE;
-}
-
 static ModeStatus
-sil164ModeValid(I2CDevPtr d, DisplayModePtr mode)
+sil164_mode_valid(I2CDevPtr d, DisplayModePtr mode)
 {
     return MODE_OK;
 }
 
 static void
-sil164Mode(I2CDevPtr d, DisplayModePtr mode)
+sil164_mode_set(I2CDevPtr d, DisplayModePtr mode)
 {
-    sil164Power(d, TRUE);
-    sil164PrintRegs(d);
-
+    /* As long as the basics are set up, since we don't have clock dependencies
+     * in the mode setup, we can just leave the registers alone and everything
+     * will work fine.
+     */
     /* recommended programming sequence from doc */
     /*sil164WriteByte(sil, 0x08, 0x30);
       sil164WriteByte(sil, 0x09, 0x00);
@@ -152,7 +142,7 @@ sil164Mode(I2CDevPtr d, DisplayModePtr m
 
 /* set the SIL164 power state */
 static void
-sil164Power(I2CDevPtr d, Bool On)
+sil164_dpms(I2CDevPtr d, int mode)
 {
     SIL164Ptr sil = SILPTR(d);
     int ret;
@@ -162,7 +152,7 @@ sil164Power(I2CDevPtr d, Bool On)
     if (ret == FALSE)
 	return;
 
-    if (On)
+    if (mode == DPMSModeOn)
 	ch |= SIL164_8_PD;
     else
 	ch &= ~SIL164_8_PD;
@@ -173,7 +163,7 @@ sil164Power(I2CDevPtr d, Bool On)
 }
 
 static void
-sil164PrintRegs(I2CDevPtr d)
+sil164_dump_regs(I2CDevPtr d)
 {
     SIL164Ptr sil = SILPTR(d);
     CARD8 val;
@@ -193,7 +183,7 @@ sil164PrintRegs(I2CDevPtr d)
 }
 
 static void
-sil164SaveRegs(I2CDevPtr d)
+sil164_save(I2CDevPtr d)
 {
     SIL164Ptr sil = SILPTR(d);
 
@@ -210,7 +200,7 @@ sil164SaveRegs(I2CDevPtr d)
 }
 
 static void
-sil164RestoreRegs(I2CDevPtr d)
+sil164_restore(I2CDevPtr d)
 {
     SIL164Ptr sil = SILPTR(d);
 
@@ -224,12 +214,11 @@ sil164RestoreRegs(I2CDevPtr d)
 
 
 I830I2CVidOutputRec SIL164VidOutput = {
-    sil164Detect,
-    sil164Init,
-    sil164ModeValid,
-    sil164Mode,
-    sil164Power,
-    sil164PrintRegs,
-    sil164SaveRegs,
-    sil164RestoreRegs,
+    .init = sil164_init,
+    .mode_valid = sil164_mode_valid,
+    .mode_set = sil164_mode_set,
+    .dpms = sil164_dpms,
+    .dump_regs = sil164_dump_regs,
+    .save = sil164_save,
+    .restore = sil164_restore,
 };



More information about the xorg-commit mailing list