diff --git a/src/i830.h b/src/i830.h index fa1f017a..08eae708 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 6fef4257..f8bd0d88 100644 --- a/src/i830_display.c +++ b/src/i830_display.c @@ -592,7 +592,7 @@ i830SetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode) } 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, DisplayModePtr pMode) 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 9f07ba16..aecf8dcd 100644 --- a/src/i830_display.h +++ b/src/i830_display.h @@ -32,7 +32,7 @@ void i830SetLVDSPanelPower(ScrnInfoPtr pScrn, Bool on); 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 591605af..61cc231c 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 pScrn) #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 b656bc67..bbf2b936 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, DisplayModePtr mode) } 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; }