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.
This commit is contained in:
Eric Anholt 2006-04-19 16:29:06 -07:00
parent 132dc0599c
commit 2909802de6
5 changed files with 31 additions and 43 deletions

View File

@ -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 {

View File

@ -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);
}

View File

@ -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);

View File

@ -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);

View File

@ -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;
}