xf86-video-intel: Branch 'modesetting' - src/i830_display.c src/i830_display.h src/i830_driver.c src/i830.h src/i830_sdvo.c

Eric Anholt anholt at kemper.freedesktop.org
Thu Apr 20 02:29:32 EEST 2006


 src/i830.h         |    2 +-
 src/i830_display.c |    4 ++--
 src/i830_display.h |    4 ++--
 src/i830_driver.c  |   15 +++------------
 src/i830_sdvo.c    |   49 +++++++++++++++++++++++--------------------------
 5 files changed, 31 insertions(+), 43 deletions(-)

New commits:
diff-tree 2909802de63756972b38651a496b4ff1b36ac8a2 (from 132dc0599cf44389c4cc03919f1da8d3a0762b44)
Author: Eric Anholt <anholt at FreeBSD.org>
Date:   Wed Apr 19 16:29:06 2006 -0700

    Clean up SDVO initialization, include config.h, and make it check the right
    slave address on the first device as well.  This gets me to the point of
    bringing up some modes on my device.

diff --git a/src/i830.h b/src/i830.h
index fa1f017..08eae70 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -189,9 +189,9 @@ struct _I830DVODriver {
 };
 
 typedef struct _I830SDVODriver {
-   int found;
    I2CDevRec d;
    unsigned char sdvo_regs[20];
+   CARD32 output_device;		/* SDVOB or SDVOC */
 } I830SDVORec, *I830SDVOPtr;
 
 struct _I830OutputRec {
diff --git a/src/i830_display.c b/src/i830_display.c
index 6fef425..f8bd0d8 100644
--- a/src/i830_display.c
+++ b/src/i830_display.c
@@ -592,7 +592,7 @@ i830SetMode(ScrnInfoPtr pScrn, DisplayMo
     }
 
     for (i = 0; i < pI830->num_outputs; i++) {
-	if (pI830->output[i].sdvo_drv && pI830->output[i].sdvo_drv->found)
+	if (pI830->output[i].sdvo_drv)
 	    I830SDVOPreSetMode(pI830->output[i].sdvo_drv, pMode);
     }
 
@@ -607,7 +607,7 @@ i830SetMode(ScrnInfoPtr pScrn, DisplayMo
 	    goto done;
     }
     for (i = 0; i < pI830->num_outputs; i++) {
-	if (pI830->output[i].sdvo_drv && pI830->output[i].sdvo_drv->found)
+	if (pI830->output[i].sdvo_drv)
 	    I830SDVOPostSetMode(pI830->output[i].sdvo_drv, pMode);
     }
 
diff --git a/src/i830_display.h b/src/i830_display.h
index 9f07ba1..aecf8dc 100644
--- a/src/i830_display.h
+++ b/src/i830_display.h
@@ -32,7 +32,7 @@ void i830SetLVDSPanelPower(ScrnInfoPtr p
 void i830PipeSetBase(ScrnInfoPtr pScrn, int pipe, int x, int y);
 
 /* i830_sdvo.c */
-I830SDVOPtr I830SDVOInit(I2CBusPtr b);
-Bool I830I2CDetectSDVOController(ScrnInfoPtr pScrn, int output_index);
+I830SDVOPtr I830SDVOInit(ScrnInfoPtr pScrn, int output_index,
+			 CARD32 output_device);
 Bool I830SDVOPreSetMode(I830SDVOPtr s, DisplayModePtr mode);
 Bool I830SDVOPostSetMode(I830SDVOPtr s, DisplayModePtr mode);
diff --git a/src/i830_driver.c b/src/i830_driver.c
index 591605a..61cc231 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -1339,7 +1339,6 @@ I830SetupOutputBusses(ScrnInfoPtr pScrn)
 {
    I830Ptr pI830 = I830PTR(pScrn);
    int i = 0;
-   Bool ret;
 
    /* everyone has at least a single analog output */
    pI830->output[i].type = I830_OUTPUT_ANALOG;
@@ -1376,21 +1375,13 @@ I830SetupOutputBusses(ScrnInfoPtr pScrn)
       /* Set up SDVOB */
       pI830->output[i].type = I830_OUTPUT_SDVO;
       I830I2CInit(pScrn, &pI830->output[i].pI2CBus, GPIOE, "SDVOCTRL_E");
-
-      pI830->output[i].sdvo_drv = I830SDVOInit(pI830->output[i].pI2CBus);
-      ret = I830I2CDetectSDVOController(pScrn, i);
-      if (ret == TRUE)
-	 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Found sDVOB\n");
+      I830SDVOInit(pScrn, i, SDVOB);
       i++;
 
       /* Set up SDVOC */
       pI830->output[i].type = I830_OUTPUT_SDVO;
       I830I2CInit(pScrn, &pI830->output[i].pI2CBus, GPIOE, "SDVOCTRL_E");
-
-      pI830->output[i].sdvo_drv = I830SDVOInit(pI830->output[i].pI2CBus);
-      ret = I830I2CDetectSDVOController(pScrn, i);
-      if (ret == TRUE)
-	 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Found sDVOC\n");
+      I830SDVOInit(pScrn, i, SDVOC);
       i++;
       break;
    }
@@ -1471,7 +1462,7 @@ void I830DetectMonitors(ScrnInfoPtr pScr
 #endif
       break;
       case I830_OUTPUT_SDVO:
-	 if (pI830->output[i].sdvo_drv->found) {
+	 if (pI830->output[i].sdvo_drv != NULL) {
 #if 0
 	    I830SDVOSetupDDC(pI830->output[i].sdvo_drv);
 
diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c
index b656bc6..bbf2b93 100644
--- a/src/i830_sdvo.c
+++ b/src/i830_sdvo.c
@@ -23,6 +23,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 **************************************************************************/
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
 #include "xf86.h"
 #include "xf86_ansic.h"
 #include "xf86_OSproc.h"
@@ -530,49 +533,43 @@ I830SDVOPostSetMode(I830SDVOPtr s, Displ
 }
 
 I830SDVOPtr
-I830SDVOInit(I2CBusPtr b)
+I830SDVOInit(ScrnInfoPtr pScrn, int output_index, CARD32 output_device)
 {
+    I830Ptr pI830 = I830PTR(pScrn);
     I830SDVOPtr sdvo;
+    int i;
+    unsigned char ch[0x40];
 
     sdvo = xcalloc(1, sizeof(I830SDVORec));
     if (sdvo == NULL)
 	return NULL;
 
     sdvo->d.DevName = "SDVO Controller";
-    sdvo->d.SlaveAddr = 0x39 << 1;
-    sdvo->d.pI2CBus = b;
-    sdvo->d.StartTimeout = b->StartTimeout;
-    sdvo->d.BitTimeout = b->BitTimeout;
-    sdvo->d.AcknTimeout = b->AcknTimeout;
-    sdvo->d.ByteTimeout = b->ByteTimeout;
+    if (output_device == SDVOB)
+	sdvo->d.SlaveAddr = 0x70;
+    else
+	sdvo->d.SlaveAddr = 0x72;
+    sdvo->d.pI2CBus = pI830->output[output_index].pI2CBus;
     sdvo->d.DriverPrivate.ptr = sdvo;
+    sdvo->output_device = output_device;
 
     if (!xf86I2CDevInit(&sdvo->d)) {
-	xf86DrvMsg(b->scrnIndex, X_ERROR,
-		   "Failed to initialize SDVO I2C device\n");
+	xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+		   "Failed to initialize SDVO I2C device %s\n",
+		   output_device == SDVOB ? "SDVOB" : "SDVOC");
 	xfree(sdvo);
 	return NULL;
     }
-    return sdvo;
-}
-
-Bool
-I830I2CDetectSDVOController(ScrnInfoPtr pScrn, int output_index)
-{
-    I830Ptr pI830 = I830PTR(pScrn);
-    unsigned char ch[64];
-    int i;
-    I830SDVOPtr sdvo = pI830->output[output_index].sdvo_drv;
-
-    if (sdvo == NULL)
-	return FALSE;
 
+    /* Read the regs to test if we can talk to the device */
     for (i = 0; i < 0x40; i++) {
-	if (!sReadByte(sdvo, i, &ch[i]))
-	    return FALSE;
+	if (!sReadByte(sdvo, i, &ch[i])) {
+	    xfree(sdvo);
+	    return NULL;
+	}
     }
 
-    pI830->output[output_index].sdvo_drv->found = 1;
+    pI830->output[output_index].sdvo_drv = sdvo;
 
-    return TRUE;
+    return sdvo;
 }



More information about the xorg-commit mailing list