diff options
author | Luc Verhaegen <libv@skynet.be> | 2005-12-11 13:52:59 +0000 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2005-12-11 13:52:59 +0000 |
commit | d6ea81daf1cd5c7c507897a7454cf5810ea52cb3 (patch) | |
tree | 61ee09be42cf72f86e4f4d838c306ff68e33e76f | |
parent | 7790406ed9157820370c2570f2afb6f28a17bb80 (diff) |
[devel-ViaOutput]
- Move TV encoders over to struct ViaOutput, making TV encoders 95%
independent from the rest of the driver.
- Create the doubly linked list from pVia.
- Add functions and further code to handle this linked list.
-rw-r--r-- | src/via_ch7xxx.c | 384 | ||||
-rw-r--r-- | src/via_driver.c | 47 | ||||
-rw-r--r-- | src/via_driver.h | 4 | ||||
-rw-r--r-- | src/via_mode.c | 528 | ||||
-rw-r--r-- | src/via_mode.h | 91 | ||||
-rw-r--r-- | src/via_vt162x.c | 487 |
6 files changed, 955 insertions, 586 deletions
diff --git a/src/via_ch7xxx.c b/src/via_ch7xxx.c index ab82801..e610f34 100644 --- a/src/via_ch7xxx.c +++ b/src/via_ch7xxx.c @@ -39,13 +39,68 @@ enum CH7xxxDevices { CH7011 }; + +/* + * Output->Private + */ +struct CH7xxxOutputPrivate { + int Device; + +#define CH7XXX_REGSSIZE 0x4A + CARD8 *Regs; /* I2C Registers */ + int RegsSize; /* Number of registers */ + + /* Options */ + int Output; + int Standard; +}; + +/* + * + */ +static void +CH7xxxPrivateDestroy(struct ViaOutput *Output) +{ + struct CH7xxxOutputPrivate *Private = Output->Private; + + VIAFUNC(Output->scrnIndex); + + xfree(Private->Regs); + xfree(Private); + + Output->PrivateDestroy = NULL; +} + +/* + * + */ +static struct CH7xxxOutputPrivate * +CH7xxxPrivateCreate(struct ViaOutput *Output) +{ + struct CH7xxxOutputPrivate *Private; + + VIAFUNC(Output->scrnIndex); + + Output->PrivSize = sizeof(struct CH7xxxOutputPrivate); + Output->Private = xnfcalloc(1, Output->PrivSize); + Private = Output->Private; + + Private->RegsSize = CH7XXX_REGSSIZE; + Private->Regs = xnfcalloc(CH7XXX_REGSSIZE, sizeof(CARD32)); + + Output->PrivateDestroy = CH7xxxPrivateDestroy; + + return Output->Private; +} + + /* * * Option handling. * */ -/* For ModeInfo->TVOutput */ +/* For Private->Output */ #define TVOUTPUT_NONE 0x00 #define TVOUTPUT_COMPOSITE 0x01 #define TVOUTPUT_SVIDEO 0x02 @@ -69,9 +124,8 @@ static OptionInfoRec CH7xxxOptions[] = * */ static OptionInfoPtr -CH7xxxGetOptions(ScrnInfoPtr pScrn) +CH7xxxGetOptions(ScrnInfoPtr pScrn, struct CH7xxxOutputPrivate *Private) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; OptionInfoPtr Options; char *s = NULL; @@ -81,34 +135,34 @@ CH7xxxGetOptions(ScrnInfoPtr pScrn) xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, Options); /* TV output combination */ - ModeInfo->TVOutput = TVOUTPUT_NONE; + Private->Output = TVOUTPUT_NONE; if ((s = xf86GetOptValString(Options, OPTION_TVOUTPUT))) { if (!xf86NameCmp(s, "S-Video")) { - ModeInfo->TVOutput = TVOUTPUT_SVIDEO; + Private->Output = TVOUTPUT_SVIDEO; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is S-Video\n"); } else if(!xf86NameCmp(s, "Composite")) { - ModeInfo->TVOutput = TVOUTPUT_COMPOSITE; + Private->Output = TVOUTPUT_COMPOSITE; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is Composite\n"); } else if(!xf86NameCmp(s, "SC")) { - ModeInfo->TVOutput = TVOUTPUT_SC; + Private->Output = TVOUTPUT_SC; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is SC\n"); } else if(!xf86NameCmp(s, "RGB")) { - ModeInfo->TVOutput = TVOUTPUT_RGB; + Private->Output = TVOUTPUT_RGB; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is RGB\n"); } else if(!xf86NameCmp(s, "YCbCr")) { - ModeInfo->TVOutput = TVOUTPUT_YCBCR; + Private->Output = TVOUTPUT_YCBCR; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is YCbCr\n"); } } /* TV standard */ - ModeInfo->TVStandard = TVSTANDARD_NONE; + Private->Standard = VIAPTR(pScrn)->ModeInfo->TVStandard; if ((s = xf86GetOptValString(Options, OPTION_TVSTANDARD))) { if (!xf86NameCmp(s, "NTSC")) { - ModeInfo->TVStandard = TVSTANDARD_NTSC; + Private->Standard = TVSTANDARD_NTSC; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Standard is NTSC\n"); } else if(!xf86NameCmp(s, "PAL")) { - ModeInfo->TVStandard = TVSTANDARD_PAL; + Private->Standard = TVSTANDARD_PAL; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Standard is PAL\n"); } } @@ -120,52 +174,51 @@ CH7xxxGetOptions(ScrnInfoPtr pScrn) * */ static void -CH7xxxPrintRegs(ScrnInfoPtr pScrn, const char *function) +CH7xxxPrintRegs(struct ViaOutput *Output, const char *function) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; CARD8 i, buf; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s: Printing registers for %s\n", - function, ModeInfo->TVI2CDev->DevName); + ViaDebug(Output->scrnIndex, "%s: Printing registers for %s\n", + function, Output->I2CDev->DevName); for (i = 0; i < 0x4C; i++) { - xf86I2CReadByte(ModeInfo->TVI2CDev, i, &buf); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s %02X: 0x%02X\n", - ModeInfo->TVI2CDev->DevName, i, buf); + xf86I2CReadByte(Output->I2CDev, i, &buf); + ViaDebug(Output->scrnIndex, "%s %02X: 0x%02X\n", + Output->I2CDev->DevName, i, buf); } - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "End of %s registers.\n", - ModeInfo->TVI2CDev->DevName); + ViaDebug(Output->scrnIndex, "End of %s registers.\n", + Output->I2CDev->DevName); } /* * */ static void -CH7011Save(ScrnInfoPtr pScrn) +CH7011Save(struct ViaOutput *Output) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct CH7xxxOutputPrivate *Private = Output->Private; int i; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); for (i = 0; i < 0x11; i++) - xf86I2CReadByte(ModeInfo->TVI2CDev, i, &(ModeInfo->TVRegs[i])); + xf86I2CReadByte(Output->I2CDev, i, &(Private->Regs[i])); for (i = 0x1C; i < 0x22; i++) - xf86I2CReadByte(ModeInfo->TVI2CDev, i, &(ModeInfo->TVRegs[i])); + xf86I2CReadByte(Output->I2CDev, i, &(Private->Regs[i])); i = 0x48; - xf86I2CReadByte(ModeInfo->TVI2CDev, i, &(ModeInfo->TVRegs[i])); + xf86I2CReadByte(Output->I2CDev, i, &(Private->Regs[i])); i = 0x49; - xf86I2CReadByte(ModeInfo->TVI2CDev, i, &(ModeInfo->TVRegs[i])); - /* ModeInfo->TVRegs[0x10] = 0x00; */ + xf86I2CReadByte(Output->I2CDev, i, &(Private->Regs[i])); + /* Private->Regs[0x10] = 0x00; */ /* Fix common restoration issue: When !CIVEN then force CIVC1 = 0 */ - if ((ModeInfo->TVRegs[0x10] & 0x11) == 0x10) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Caught bad restoration " + if ((Private->Regs[0x10] & 0x11) == 0x10) { + xf86DrvMsg(Output->scrnIndex, X_WARNING, "%s: Caught bad restoration " "(CIVC).\n", __func__); - ModeInfo->TVRegs[0x10] &= 0xEF; + Private->Regs[0x10] &= 0xEF; } } @@ -174,32 +227,32 @@ CH7011Save(ScrnInfoPtr pScrn) * */ static void -CH7011Restore(ScrnInfoPtr pScrn) +CH7011Restore(struct ViaOutput *Output) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct CH7xxxOutputPrivate *Private = Output->Private; CARD8 save; int i; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); for (i = 0; i < 0x11; i++) - xf86I2CWriteByte(ModeInfo->TVI2CDev, i, ModeInfo->TVRegs[i]); + xf86I2CWriteByte(Output->I2CDev, i, Private->Regs[i]); for (i = 0x1C; i < 0x22; i++) - xf86I2CWriteByte(ModeInfo->TVI2CDev, i, ModeInfo->TVRegs[i]); + xf86I2CWriteByte(Output->I2CDev, i, Private->Regs[i]); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x48, ModeInfo->TVRegs[0x48]); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x49, ModeInfo->TVRegs[0x49]); + xf86I2CWriteByte(Output->I2CDev, 0x48, Private->Regs[0x48]); + xf86I2CWriteByte(Output->I2CDev, 0x49, Private->Regs[0x49]); usleep(1); /* Fix common restoration issue: When !CIVEN then force CIVC1 = 0 */ - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x10, &save); + xf86I2CReadByte(Output->I2CDev, 0x10, &save); /* if ((save & 0x11) == 0x10) { */ - if (save != ModeInfo->TVRegs[0x10]) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Caught bad restoration " + if (save != Private->Regs[0x10]) { + xf86DrvMsg(Output->scrnIndex, X_WARNING, "%s: Caught bad restoration " "(CIVC).\n", __func__); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x10, save & 0xEF); + xf86I2CWriteByte(Output->I2CDev, 0x10, save & 0xEF); } } @@ -207,40 +260,39 @@ CH7011Restore(ScrnInfoPtr pScrn) * */ static CARD8 -CH7xxxTVDACSense(ScrnInfoPtr pScrn) +CH7xxxTVDACSense(struct ViaOutput *Output) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; CARD8 dacsave, save, sense; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); /* Enable all DACs */ - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x49, &dacsave); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x49, 0x20); + xf86I2CReadByte(Output->I2CDev, 0x49, &dacsave); + xf86I2CWriteByte(Output->I2CDev, 0x49, 0x20); /* Disable bypass mode: DACBP = 0 */ - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x21, &save); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x21, save & 0xFE); + xf86I2CReadByte(Output->I2CDev, 0x21, &save); + xf86I2CWriteByte(Output->I2CDev, 0x21, save & 0xFE); /* SENSE = 1 */ - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x20, &save); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x20, save | 0x01); + xf86I2CReadByte(Output->I2CDev, 0x20, &save); + xf86I2CWriteByte(Output->I2CDev, 0x20, save | 0x01); - ModeInfo->TVI2CDev->pI2CBus->I2CUDelay(ModeInfo->TVI2CDev->pI2CBus, 10); + Output->I2CDev->pI2CBus->I2CUDelay(Output->I2CDev->pI2CBus, 10); /* Restore SENSE */ - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x20, &save); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x20, save & 0xFE); + xf86I2CReadByte(Output->I2CDev, 0x20, &save); + xf86I2CWriteByte(Output->I2CDev, 0x20, save & 0xFE); /* Read DAC0-3 */ - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x20, &sense); + xf86I2CReadByte(Output->I2CDev, 0x20, &sense); sense >>= 1; sense &= 0x0F; - ViaDebug(pScrn->scrnIndex, "%s: Sense: 0x%01X\n", __func__, sense); + ViaDebug(Output->scrnIndex, "%s: Sense: 0x%01X\n", __func__, sense); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x49, dacsave); + xf86I2CWriteByte(Output->I2CDev, 0x49, dacsave); return sense; } @@ -249,40 +301,44 @@ CH7xxxTVDACSense(ScrnInfoPtr pScrn) * */ static Bool -CH7011DACSense(ScrnInfoPtr pScrn) +CH7011DACSense(struct ViaOutput *Output) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct CH7xxxOutputPrivate *Private = Output->Private; CARD8 sense; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); + + /* Config already set this */ + if (Private->Output != TVOUTPUT_NONE) + return TRUE; - sense = CH7xxxTVDACSense(pScrn); + sense = CH7xxxTVDACSense(Output); switch (sense) { case 0x08: - ModeInfo->TVOutput = TVOUTPUT_COMPOSITE; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "%s: Composite connected.\n", - ModeInfo->TVI2CDev->DevName); + Private->Output = TVOUTPUT_COMPOSITE; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "%s: Composite connected.\n", + Output->I2CDev->DevName); return TRUE; case 0x06: - ModeInfo->TVOutput = TVOUTPUT_SVIDEO; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "%s: S-Video connected.\n", - ModeInfo->TVI2CDev->DevName); + Private->Output = TVOUTPUT_SVIDEO; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "%s: S-Video connected.\n", + Output->I2CDev->DevName); return TRUE; case 0x0E: - ModeInfo->TVOutput = TVOUTPUT_SC; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "%s: Composite+S-Video connected.\n", - ModeInfo->TVI2CDev->DevName); + Private->Output = TVOUTPUT_SC; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "%s: Composite+S-Video connected.\n", + Output->I2CDev->DevName); return TRUE; case 0x00: - ModeInfo->TVOutput = TVOUTPUT_NONE; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "%s: Nothing connected.\n", - ModeInfo->TVI2CDev->DevName); + Private->Output = TVOUTPUT_NONE; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "%s: Nothing connected.\n", + Output->I2CDev->DevName); return FALSE; default: - ModeInfo->TVOutput = TVOUTPUT_NONE; - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Unknown cable combination: 0x0%2X.\n", - ModeInfo->TVI2CDev->DevName, sense); + Private->Output = TVOUTPUT_NONE; + xf86DrvMsg(Output->scrnIndex, X_WARNING, "%s: Unknown cable combination: 0x0%2X.\n", + Output->I2CDev->DevName, sense); return FALSE; } } @@ -291,28 +347,28 @@ CH7011DACSense(ScrnInfoPtr pScrn) * */ static ModeStatus -CH7011TVModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) +CH7011TVModeValid(struct ViaOutput *Output, DisplayModePtr mode) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct CH7xxxOutputPrivate *Private = Output->Private; struct CH7011TableRec *Table = NULL; char ID[12] = CH7011ID; int i; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); if (mode->PrivSize == sizeof(struct CH7011TableRec)) Table = (struct CH7011TableRec *) mode->Private; if (!Table || strncmp(ID, Table->ID, 12)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Not a mode defined by the TV Encoder.\n"); + xf86DrvMsg(Output->scrnIndex, X_INFO, "Not a mode defined by the TV Encoder.\n"); return MODE_BAD; } - if (ModeInfo->TVStandard != Table->Standard) { - if (ModeInfo->TVStandard == TVSTANDARD_NTSC) - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is NTSC. This is a PAL mode.\n"); + if (Private->Standard != Table->Standard) { + if (Private->Standard == TVSTANDARD_NTSC) + xf86DrvMsg(Output->scrnIndex, X_INFO, "TV standard is NTSC. This is a PAL mode.\n"); else - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is PAL. This is a NTSC mode.\n"); + xf86DrvMsg(Output->scrnIndex, X_INFO, "TV standard is PAL. This is a NTSC mode.\n"); return MODE_BAD; } @@ -321,12 +377,12 @@ CH7011TVModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) if (CH7011Clocks[i].Clock == mode->Clock) return MODE_OK; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s: Unable to find matching dotclock.\n", __func__); + xf86DrvMsg(Output->scrnIndex, X_INFO, "%s: Unable to find matching dotclock.\n", __func__); return MODE_BAD; } static void -CH7011TVClock(I2CDevPtr TVI2CDev, int clock) +CH7011TVClock(I2CDevPtr I2CDev, int clock) { int i; @@ -336,12 +392,12 @@ CH7011TVClock(I2CDevPtr TVI2CDev, int clock) break; if (CH7011Clocks[i].Clock) { - xf86I2CWriteByte(TVI2CDev, 0x09, 0x80 | ((CH7011Clocks[i].PLLN >> 5) & 0x18) | + xf86I2CWriteByte(I2CDev, 0x09, 0x80 | ((CH7011Clocks[i].PLLN >> 5) & 0x18) | ((CH7011Clocks[i].PLLM >> 6) & 0x04) | (CH7011Clocks[i].PLLCap ? 0x01 : 0x00)); - xf86I2CWriteByte(TVI2CDev, 0x0A, CH7011Clocks[i].PLLM & 0xFF); - xf86I2CWriteByte(TVI2CDev, 0x0B, CH7011Clocks[i].PLLN & 0xFF); + xf86I2CWriteByte(I2CDev, 0x0A, CH7011Clocks[i].PLLM & 0xFF); + xf86I2CWriteByte(I2CDev, 0x0B, CH7011Clocks[i].PLLN & 0xFF); } } @@ -349,123 +405,121 @@ CH7011TVClock(I2CDevPtr TVI2CDev, int clock) * ModeValid should ensure that only modes with proper privates are passed here. */ static void -CH7011TVMode(ScrnInfoPtr pScrn, DisplayModePtr mode) +CH7011TVMode(struct ViaOutput *Output, DisplayModePtr mode) { - VIAPtr pVia = VIAPTR(pScrn); - struct ViaModeInfo *ModeInfo = pVia->ModeInfo; struct CH7011TableRec *Table = NULL; CARD8 tmp; int i; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); Table = (struct CH7011TableRec *) mode->Private; /* Disable TV avoid set mode garbage */ - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x49, 0x3E); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x1E, 0xD0); + xf86I2CWriteByte(Output->I2CDev, 0x49, 0x3E); + xf86I2CWriteByte(Output->I2CDev, 0x1E, 0xD0); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x00, Table->Mode); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x01, 0x3F); + xf86I2CWriteByte(Output->I2CDev, 0x00, Table->Mode); + xf86I2CWriteByte(Output->I2CDev, 0x01, 0x3F); /* low pass filter */ if (Table->Standard == TVSTANDARD_NTSC) - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x02, 0x7E); /* default */ + xf86I2CWriteByte(Output->I2CDev, 0x02, 0x7E); /* default */ else - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x02, 0xE0); /* default */ + xf86I2CWriteByte(Output->I2CDev, 0x02, 0xE0); /* default */ /* Text Enhancement */ - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x03, &tmp); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x03, tmp | 0x07); /* max */ + xf86I2CReadByte(Output->I2CDev, 0x03, &tmp); + xf86I2CWriteByte(Output->I2CDev, 0x03, tmp | 0x07); /* max */ /* Start Active Video */ i = mode->CrtcHTotal - mode->CrtcHSyncEnd + 1; - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x03, &tmp); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x03, (tmp & 0xDF) | ((i >> 3) & 0x20)); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x04, i & 0xFF); + xf86I2CReadByte(Output->I2CDev, 0x03, &tmp); + xf86I2CWriteByte(Output->I2CDev, 0x03, (tmp & 0xDF) | ((i >> 3) & 0x20)); + xf86I2CWriteByte(Output->I2CDev, 0x04, i & 0xFF); /* Horizontal Position */ - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x03, &tmp); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x03, (tmp & 0xEF) | ((Table->HPosition >> 4) & 0x10)); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x05, Table->HPosition & 0xFF); + xf86I2CReadByte(Output->I2CDev, 0x03, &tmp); + xf86I2CWriteByte(Output->I2CDev, 0x03, (tmp & 0xEF) | ((Table->HPosition >> 4) & 0x10)); + xf86I2CWriteByte(Output->I2CDev, 0x05, Table->HPosition & 0xFF); /* Vertical Position */ - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x03, &tmp); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x03, (tmp & 0xF7) | ((Table->VPosition >> 5) & 0x08)); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x06, Table->VPosition & 0xFF); + xf86I2CReadByte(Output->I2CDev, 0x03, &tmp); + xf86I2CWriteByte(Output->I2CDev, 0x03, (tmp & 0xF7) | ((Table->VPosition >> 5) & 0x08)); + xf86I2CWriteByte(Output->I2CDev, 0x06, Table->VPosition & 0xFF); /* Black level */ if (Table->Standard == TVSTANDARD_NTSC) - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x07, 0x83); /* default */ + xf86I2CWriteByte(Output->I2CDev, 0x07, 0x83); /* default */ else - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x07, 0x6E); /* default */ + xf86I2CWriteByte(Output->I2CDev, 0x07, 0x6E); /* default */ /* contrast */ - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x08, 0x03); /* default to 3 */ + xf86I2CWriteByte(Output->I2CDev, 0x08, 0x03); /* default to 3 */ - CH7011TVClock(ModeInfo->TVI2CDev, mode->Clock); + CH7011TVClock(Output->I2CDev, mode->Clock); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x0C, (Table->FSCI >> 24) & 0xFF); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x0D, (Table->FSCI >> 16) & 0xFF); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x0E, (Table->FSCI >> 8) & 0xFF); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x0F, Table->FSCI & 0xFF); + xf86I2CWriteByte(Output->I2CDev, 0x0C, (Table->FSCI >> 24) & 0xFF); + xf86I2CWriteByte(Output->I2CDev, 0x0D, (Table->FSCI >> 16) & 0xFF); + xf86I2CWriteByte(Output->I2CDev, 0x0E, (Table->FSCI >> 8) & 0xFF); + xf86I2CWriteByte(Output->I2CDev, 0x0F, Table->FSCI & 0xFF); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x10, 0x00); + xf86I2CWriteByte(Output->I2CDev, 0x10, 0x00); /* stop dark band in lower half (undocumented register) */ - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x15, &tmp); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x15, tmp & 0xF8); - - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x1C, 0x48); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x1D, 0x40); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x1E, 0xF2); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x1F, 0x80); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x20, 0x40); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x21, 0x00); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x22, 0x00); - - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x48, 0x10); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x48, 0x18); + xf86I2CReadByte(Output->I2CDev, 0x15, &tmp); + xf86I2CWriteByte(Output->I2CDev, 0x15, tmp & 0xF8); + + xf86I2CWriteByte(Output->I2CDev, 0x1C, 0x48); + xf86I2CWriteByte(Output->I2CDev, 0x1D, 0x40); + xf86I2CWriteByte(Output->I2CDev, 0x1E, 0xF2); + xf86I2CWriteByte(Output->I2CDev, 0x1F, 0x80); + xf86I2CWriteByte(Output->I2CDev, 0x20, 0x40); + xf86I2CWriteByte(Output->I2CDev, 0x21, 0x00); + xf86I2CWriteByte(Output->I2CDev, 0x22, 0x00); + + xf86I2CWriteByte(Output->I2CDev, 0x48, 0x10); + xf86I2CWriteByte(Output->I2CDev, 0x48, 0x18); /* Turn TV CH7011 DAC On */ - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x49, 0x20); + xf86I2CWriteByte(Output->I2CDev, 0x49, 0x20); } /* * */ static void -CH7xxxTVPower(ScrnInfoPtr pScrn, Bool On) +CH7xxxTVPower(struct ViaOutput *Output, Bool On) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; CARD8 save; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); if (On) { /* Plainly enables all DACs - should be more specific. */ - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x49, 0x20); + xf86I2CWriteByte(Output->I2CDev, 0x49, 0x20); /* POUTE */ - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x1E, &save); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x1E, save | 0x02); + xf86I2CReadByte(Output->I2CDev, 0x1E, &save); + xf86I2CWriteByte(Output->I2CDev, 0x1E, save | 0x02); } else { - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x49, 0x3E); + xf86I2CWriteByte(Output->I2CDev, 0x49, 0x3E); /* !POUTE */ - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x1E, &save); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x1E, save & ~0x02); + xf86I2CReadByte(Output->I2CDev, 0x1E, &save); + xf86I2CWriteByte(Output->I2CDev, 0x1E, save & ~0x02); } } /* * */ -Bool +struct ViaOutput * ViaCH7xxxInit(ScrnInfoPtr pScrn, I2CDevPtr pDev) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct ViaOutput *Output; + struct CH7xxxOutputPrivate *Private; CARD8 buf; VIAFUNC(pScrn->scrnIndex); @@ -482,23 +536,37 @@ ViaCH7xxxInit(ScrnInfoPtr pScrn, I2CDevPtr pDev) "Detected Chrontel CH7011 TV Encoder\n"); pDev->DevName = "CH7011"; - ModeInfo->TVOptions = CH7xxxGetOptions(pScrn); + Output = xnfcalloc(1, sizeof(struct ViaOutput)); - ModeInfo->TVI2CDev = pDev; - ModeInfo->TVEncoder = CH7011; - ModeInfo->TVSave = CH7011Save; - ModeInfo->TVRestore = CH7011Restore; - ModeInfo->TVDACSense = CH7011DACSense; - ModeInfo->TVModeValid = CH7011TVModeValid; - ModeInfo->TVMode = CH7011TVMode; - ModeInfo->TVPower = CH7xxxTVPower; - ModeInfo->TVModes = CH7011TVModes; - ModeInfo->TVPrintRegs = CH7xxxPrintRegs; + Output->Next = NULL; + Output->Prev = NULL; - return TRUE; + Output->scrnIndex = pScrn->scrnIndex; + Output->Name = "CH7011"; + Output->I2CDev = pDev; + Output->Type = OUTPUT_TV; + + Private = CH7xxxPrivateCreate(Output); + + Output->Options = CH7xxxGetOptions(pScrn, Private); + + Private->Device = CH7011; + + Output->ClockMaster = TRUE; + Output->Modes = CH7011TVModes; + + Output->Save = CH7011Save; + Output->Restore = CH7011Restore; + Output->Sense = CH7011DACSense; + Output->ModeValid = CH7011TVModeValid; + Output->Mode = CH7011TVMode; + Output->Power = CH7xxxTVPower; + Output->PrintRegs = CH7xxxPrintRegs; + + return Output; default: xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown TV Encoder found at %s %X.\n", pDev->pI2CBus->BusName, pDev->SlaveAddr); - return FALSE; + return NULL; } } diff --git a/src/via_driver.c b/src/via_driver.c index 7701c62..7e5d11a 100644 --- a/src/via_driver.c +++ b/src/via_driver.c @@ -378,7 +378,8 @@ static pointer VIASetup(pointer module, pointer opts, int *errmaj, int *errmin) #endif /* XFree86LOADER */ -static Bool VIAGetRec(ScrnInfoPtr pScrn) +static Bool +VIAGetRec(ScrnInfoPtr pScrn) { VIAPtr pVia; @@ -393,18 +394,19 @@ static Bool VIAGetRec(ScrnInfoPtr pScrn) pVia->ModeInfo = xnfcalloc(sizeof(struct ViaModeInfo), 1); pVia->ModeInfo->scrnIndex = pScrn->scrnIndex; - pVia->ModeInfo->TVI2CDev = NULL; pVia->ModeInfo->PanelOptions = NULL; - pVia->ModeInfo->TVOptions = NULL; + + pVia->Outputs = NULL; pVia->CursorImage = NULL; return TRUE; -} /* VIAGetRec */ +} -static void VIAFreeRec(ScrnInfoPtr pScrn) +static void +VIAFreeRec(ScrnInfoPtr pScrn) { VIAPtr pVia; @@ -415,31 +417,27 @@ static void VIAFreeRec(ScrnInfoPtr pScrn) pVia = VIAPTR(pScrn); - if (pVia->ModeInfo->TVI2CDev) - xf86DestroyI2CDevRec(pVia->ModeInfo->TVI2CDev, TRUE); + ViaOutputsDestroy(pScrn); if (pVia->ModeInfo->PanelOptions) xfree(pVia->ModeInfo->PanelOptions); - if (pVia->ModeInfo->TVOptions) - xfree(pVia->ModeInfo->TVOptions); - xfree(pVia->ModeInfo); VIAUnmapMem(pScrn); xfree(pScrn->driverPrivate); pScrn->driverPrivate = NULL; -} /* VIAFreeRec */ - +} -static const OptionInfoRec * VIAAvailableOptions(int chipid, int busid) +static const OptionInfoRec * +VIAAvailableOptions(int chipid, int busid) { return VIAOptions; -} /* VIAAvailableOptions */ +} /* @@ -1508,10 +1506,9 @@ static void VIALeaveVT(int scrnIndex, int flags) static void VIASave(ScrnInfoPtr pScrn) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - VIAPtr pVia = VIAPTR(pScrn); - struct ViaModeInfo *ModeInfo = pVia->ModeInfo; - VIARegPtr Regs = &pVia->SavedReg; + vgaHWPtr hwp = VGAHWPTR(pScrn); + VIAPtr pVia = VIAPTR(pScrn); + VIARegPtr Regs = &pVia->SavedReg; int i; VIAFUNC(pScrn->scrnIndex); @@ -1579,8 +1576,7 @@ VIASave(ScrnInfoPtr pScrn) Regs->CR35 = hwp->readCrtc(hwp, 0x35); Regs->CR36 = hwp->readCrtc(hwp, 0x36); - if (ModeInfo->TVI2CDev) - ViaTVSave(pScrn); + ViaOutputsSave(pScrn); /* Save LCD control regs */ for (i = 0; i < 68; i++) @@ -1612,8 +1608,7 @@ VIARestore(ScrnInfoPtr pScrn) hwp->writeCrtc(hwp, 0x6B, 0x00); hwp->writeCrtc(hwp, 0x6C, 0x00); - if (ModeInfo->TVI2CDev) - ViaTVRestore(pScrn); + ViaOutputsRestore(pScrn); /* restore the standard vga regs */ if (xf86IsPrimaryPci(pVia->PciInfo)) @@ -2062,7 +2057,7 @@ VIAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) ViaVgaPrintRegs(pScrn, __func__); if (pVia->PrintTVRegs) - ViaTVPrintRegs(pScrn, __func__); + ViaOutputsPrintRegs(pScrn, __func__); ViaDebug(scrnIndex, "- Done\n"); return TRUE; @@ -2326,8 +2321,7 @@ static void VIADPMS(ScrnInfoPtr pScrn, int mode, int flags) if (ModeInfo->PanelActive) ModeInfo->PanelPower(pScrn, TRUE); - if (ModeInfo->TVActive) - ViaTVPower(pScrn, TRUE); + ViaOutputsPower(pScrn, TRUE); hwp->writeCrtc(hwp, 0x36, val); break; @@ -2337,8 +2331,7 @@ static void VIADPMS(ScrnInfoPtr pScrn, int mode, int flags) if (ModeInfo->PanelActive) ModeInfo->PanelPower(pScrn, FALSE); - if (ModeInfo->TVActive) - ViaTVPower(pScrn, FALSE); + ViaOutputsPower(pScrn, FALSE); val |= 0x30; hwp->writeCrtc(hwp, 0x36, val); diff --git a/src/via_driver.h b/src/via_driver.h index a6013ec..c0b175a 100644 --- a/src/via_driver.h +++ b/src/via_driver.h @@ -196,8 +196,8 @@ typedef struct _VIA { int justSetup; ViaTwodContext td; ViaCBuffer cBuf; - - /* BIOS Info Ptr */ + + struct ViaOutput *Outputs; struct ViaModeInfo *ModeInfo; struct ViaCardId *Id; diff --git a/src/via_mode.c b/src/via_mode.c index d24d990..e223360 100644 --- a/src/via_mode.c +++ b/src/via_mode.c @@ -75,6 +75,63 @@ ViaVgaPrintRegs(ScrnInfoPtr pScrn, const char *function) /* * + */ +static struct ViaOutput * +ViaOutputDestroy(struct ViaOutput *Output) +{ + struct ViaOutput *Next; + + Next = Output->Next; + + if (Output->PrivateDestroy) + Output->PrivateDestroy(Output); + + if (Output->I2CDev) + xf86DestroyI2CDevRec(Output->I2CDev, TRUE); + xfree(Output->Options); + + xfree(Output); + + return Next; +} + +/* + * + */ +void +ViaOutputsDestroy(ScrnInfoPtr pScrn) +{ + struct ViaOutput *Output = VIAPTR(pScrn)->Outputs; + + while (Output) + Output = ViaOutputDestroy(Output); +} + +#ifdef UNUSED +/* + * + */ +static void +ViaOutputRemove(ScrnInfoPtr pScrn, struct ViaOutput *Output) +{ + if (!Output) + return; + + /* remove from list */ + if (Output->Prev) + Output->Prev->Next = Output->Next; + else + VIAPTR(pScrn)->Outputs = Output->Next; + + if (Output->Next) + Output->Next->Prev = Output->Prev; + + ViaOutputDestroy(Output); +} +#endif + +/* + * * TV specific code. * */ @@ -82,7 +139,7 @@ ViaVgaPrintRegs(ScrnInfoPtr pScrn, const char *function) static struct { CARD8 Address; char * Name; - Bool (*Init) (ScrnInfoPtr pScrn, I2CDevPtr pDev); + struct ViaOutput * (*Init) (ScrnInfoPtr pScrn, I2CDevPtr pDev); } ViaI2CDevices[] = { {0x40, "VT162x", ViaVT162xInit}, {0x42, "VT162x", ViaVT162xInit}, @@ -94,9 +151,10 @@ static struct { /* * */ -static Bool -ViaTVScanBus(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus) +static void +ViaScanBus(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus) { + struct ViaOutput *Output, *Last = NULL; int i; VIAFUNC(pScrn->scrnIndex); @@ -111,140 +169,251 @@ ViaTVScanBus(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus) if (!xf86I2CDevInit(pDev)) { xf86DestroyI2CDevRec(pDev, TRUE); - return FALSE; + continue; } - if (ViaI2CDevices[i].Init(pScrn, pDev)) - return TRUE; - else + Output = ViaI2CDevices[i].Init(pScrn, pDev); + + /* did we actually find anything? */ + if (!Output) { xf86DestroyI2CDevRec(pDev,TRUE); - } + continue; + } - return FALSE; + /* Is this Output sound? */ + if (!Output->Name || !Output->ModeValid || !Output->Mode || + !Output->Power) { + + if (!Output->Name) + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: Nameless output device.\n", __func__); + + if (!Output->ModeValid) + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: %s: ModeValid " + "callback missing\n", __func__, Output->Name); + + if (!Output->Mode) + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: %s: Mode " + "callback missing\n", __func__, Output->Name); + + if (!Output->Power) + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: %s: Power " + "callback missing\n", __func__, Output->Name); + + /* this could be a whole list */ + while (Output) + Output = ViaOutputDestroy(Output); + + continue; + } + + /* add Output to list */ + Last = VIAPTR(pScrn)->Outputs; + if (Last) { + while (Last->Next) + Last = Last->Next; + + Last->Next = Output; + Output->Prev = Last; + } else { + VIAPTR(pScrn)->Outputs = Output; + Output->Prev = NULL; + } + } } /* * */ static Bool -ViaTVInit(ScrnInfoPtr pScrn) +ViaOutputsInit(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); - struct ViaModeInfo *ModeInfo = pVia->ModeInfo; + struct ViaOutput *Output; VIAFUNC(pScrn->scrnIndex); - /* preset some ModeInfo TV related values -- move up */ - ModeInfo->TVI2CDev = NULL; - ModeInfo->TVEncoder = -1; - ModeInfo->TVSave = NULL; - ModeInfo->TVRestore = NULL; - ModeInfo->TVDACSense = NULL; - ModeInfo->TVModeValid = NULL; - ModeInfo->TVMode = NULL; - ModeInfo->TVPower = NULL; - ModeInfo->TVModes = NULL; - ModeInfo->TVPrintRegs = NULL; - - if ((pVia->pI2CBus2 && ViaTVScanBus(pScrn, pVia->pI2CBus2)) || - (pVia->pI2CBus3 && ViaTVScanBus(pScrn, pVia->pI2CBus3))) { - - if (!ModeInfo->TVSave || !ModeInfo->TVRestore || - !ModeInfo->TVDACSense || !ModeInfo->TVModeValid || - !ModeInfo->TVMode || !ModeInfo->TVPower || - !ModeInfo->TVModes || !ModeInfo->TVPrintRegs) { - - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: TVEncoder was not " - "properly initialised.", __func__); - - xf86DestroyI2CDevRec(ModeInfo->TVI2CDev, TRUE); - ModeInfo->TVI2CDev = NULL; - ModeInfo->TVOutput = 0; - ModeInfo->TVSave = NULL; - ModeInfo->TVRestore = NULL; - ModeInfo->TVDACSense = NULL; - ModeInfo->TVModeValid = NULL; - ModeInfo->TVMode = NULL; - ModeInfo->TVPower = NULL; - ModeInfo->TVModes = NULL; - ModeInfo->TVPrintRegs = NULL; - - return FALSE; - } + if (pVia->pI2CBus2) + ViaScanBus(pScrn, pVia->pI2CBus2); - /* Save now */ - ModeInfo->TVSave(pScrn); + if (pVia->pI2CBus3) + ViaScanBus(pScrn, pVia->pI2CBus3); + + if (!pVia->Outputs) + return FALSE; - if (VIAPTR(pScrn)->PrintTVRegs) - ModeInfo->TVPrintRegs(pScrn, __func__); + Output = pVia->Outputs; + + while (Output) { + /* Save now */ + if (Output->Save) + Output->Save(Output); + + /* Dump registers as early as possible */ + if (pVia->PrintTVRegs && Output->PrintRegs) + Output->PrintRegs(Output, __func__); - return TRUE; + Output = Output->Next; } - return FALSE; + return TRUE; } +/* + * Save all output devices. + */ void -ViaTVSave(ScrnInfoPtr pScrn) +ViaOutputsSave(ScrnInfoPtr pScrn) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct ViaOutput *Output = VIAPTR(pScrn)->Outputs; + + while (Output) { + if (Output->Save) + Output->Save(Output); - if (ModeInfo->TVSave) - ModeInfo->TVSave(pScrn); + Output = Output->Next; + } } +/* + * Restore all output devices. + */ void -ViaTVRestore(ScrnInfoPtr pScrn) +ViaOutputsRestore(ScrnInfoPtr pScrn) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct ViaOutput *Output = VIAPTR(pScrn)->Outputs; + + while (Output) { + if (Output->Restore) + Output->Restore(Output); - if (ModeInfo->TVRestore) - ModeInfo->TVRestore(pScrn); + Output = Output->Next; + } } +/* + * Check which output devices are active. + */ static Bool -ViaTVDACSense(ScrnInfoPtr pScrn) +ViaOutputsSense(ScrnInfoPtr pScrn) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct ViaOutput *Output = VIAPTR(pScrn)->Outputs; + Bool Active = FALSE; + + while (Output) { + if (Output->Sense) { + Output->Active = Output->Sense(Output); + if (Output->Active) + Active = TRUE; + } else { + Output->Active = TRUE; + Active = TRUE; + } - if (ModeInfo->TVDACSense) - return ModeInfo->TVDACSense(pScrn); - return FALSE; + Output = Output->Next; + } + + return Active; } +/* + * Power according to On all active devices, power off when inactive. + */ void -ViaTVPower(ScrnInfoPtr pScrn, Bool On) +ViaOutputsPower(ScrnInfoPtr pScrn, Bool On) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct ViaOutput *Output = VIAPTR(pScrn)->Outputs; ViaDebug(pScrn->scrnIndex, "%s: %s.\n", __func__, On ? "On" : "Off"); - if (ModeInfo->TVPower) - ModeInfo->TVPower(pScrn, On); + while (Output) { + if (Output->Power) { + if (Output->Active) + Output->Power(Output, On); + else + Output->Power(Output, FALSE); + } + + Output = Output->Next; + } } +/* + * + */ void -ViaTVPrintRegs(ScrnInfoPtr pScrn, const char *function) +ViaOutputsPrintRegs(ScrnInfoPtr pScrn, const char *function) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct ViaOutput *Output = VIAPTR(pScrn)->Outputs; + + while (Output) { + if (Output->PrintRegs) + Output->PrintRegs(Output, function); + + Output = Output->Next; + } +} - if (ModeInfo->TVPrintRegs) - ModeInfo->TVPrintRegs(pScrn, function); +/* + * Is the CRTC in control of the dotclock, or is the output device? + */ +static void +ViaOutputsFindDotclockMaster(ScrnInfoPtr pScrn) +{ + struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct ViaOutput *Output = VIAPTR(pScrn)->Outputs; + + ModeInfo->ClockSlave = FALSE; + + while (Output) { + if (Output->Active && Output->ClockMaster) { + if (ModeInfo->ClockSlave) + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: multiple Outputs " + "want to be the dotclock master.\n", __func__); + ModeInfo->ClockSlave = TRUE; + } + Output = Output->Next; + } } /* * */ static ModeStatus -ViaTVModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) +ViaOutputsModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct ViaOutput *Output = VIAPTR(pScrn)->Outputs; + + while (Output) { + if (Output->Active && Output->ModeValid) { + ModeStatus Status; + Status = Output->ModeValid(Output, mode); + + if (Status != MODE_OK) + return Status; + } + + Output = Output->Next; + } - if (ModeInfo->TVModeValid) - return ModeInfo->TVModeValid(pScrn, mode); return MODE_OK; } +/* + * Print a list of active output devices. + */ +static void +ViaOutputsActivePrint(ScrnInfoPtr pScrn) +{ + struct ViaOutput *Output = VIAPTR(pScrn)->Outputs; + + while (Output) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Output %s: %s.\n", + Output->Name, Output->Active ? "Active" : "Disabled"); + + Output = Output->Next; + } +} /* * @@ -268,12 +437,7 @@ ViaOutputsDetect(ScrnInfoPtr pScrn) else if (!ModeInfo->PanelPresent) ModeInfo->CrtPresent = TRUE; - /* TV encoder */ - if (ViaTVInit(pScrn)) { - if (!ModeInfo->TVOutput) /* Config might've set this already */ - ViaTVDACSense(pScrn); - } else - ModeInfo->TVOutput = 0; + ViaOutputsInit(pScrn); } /* @@ -299,14 +463,13 @@ ViaOutputsSelect(ScrnInfoPtr pScrn) ModeInfo->PanelActive = FALSE; ModeInfo->CrtActive = FALSE; - ModeInfo->TVActive = FALSE; if (!pVia->ActiveDevice) { /* always enable the panel when present */ if (ModeInfo->PanelPresent) ModeInfo->PanelActive = TRUE; - else if (ModeInfo->TVOutput) /* cable is attached! */ - ModeInfo->TVActive = TRUE; + + ViaOutputsSense(pScrn); /* CRT can be used with everything when present */ if (ModeInfo->CrtPresent) @@ -319,33 +482,54 @@ ViaOutputsSelect(ScrnInfoPtr pScrn) xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unable to activate" " panel: no panel is present.\n"); } - + if (pVia->ActiveDevice & VIA_DEVICE_TV) { - if (!ModeInfo->TVI2CDev) - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unable to activate" - " TV encoder: no TV encoder present.\n"); - else if (!ModeInfo->TVOutput) - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unable to activate" - " TV encoder: no cable attached.\n"); - else if (ModeInfo->PanelActive) + if (ModeInfo->PanelActive) xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unable to activate" " TV encoder and panel simultaneously. Not using" " TV encoder.\n"); - else - ModeInfo->TVActive = TRUE; - } + else { /* way too simplistic */ + struct ViaOutput *Output = pVia->Outputs; + Bool Found = FALSE; + + while (Output) { + if (Output->Type & OUTPUT_TV) { + if (Output->Sense) { + if (Output->Sense(Output)) + Output->Active = TRUE; + else { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Unable to activate TV encoder: " + "no cable attached.\n"); + + Output->Active = FALSE; + } + } else + Output->Active = TRUE; + Found = TRUE; + } + + Output = Output->Next; + } + + if (!Found) + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unable to activate" + " TV encoder: no TV encoder present.\n"); + } + } - if ((pVia->ActiveDevice & VIA_DEVICE_CRT) || - (!ModeInfo->PanelActive && !ModeInfo->TVActive)) { + if ((pVia->ActiveDevice & VIA_DEVICE_CRT)) ModeInfo->CrtPresent = TRUE; - ModeInfo->CrtActive = TRUE; - } + ModeInfo->CrtActive = TRUE; } - ViaDebug(pScrn->scrnIndex, "%s:%s%s%s\n", __func__, + ViaDebug(pScrn->scrnIndex, "%s:%s%s\n", __func__, ModeInfo->CrtActive ? " CRT," : "", - ModeInfo->PanelActive ? " Panel," : "", - ModeInfo->TVActive ? " TV," : ""); + ModeInfo->PanelActive ? " Panel," : ""); + + ViaOutputsActivePrint(pScrn); + + ViaOutputsFindDotclockMaster(pScrn); return TRUE; /* Primary only always has at least CRT */ } @@ -497,6 +681,20 @@ ViaModeDotClockTranslate(ScrnInfoPtr pScrn, DisplayModePtr mode) return 0x0000; } +/* + * Set the primary CRTC dotclock to act as a slave. + */ +static void +ViaDotclockPrimarySlave(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + + if ((pVia->Chipset == VT3122) && VT3122_REV_IS_AX(pVia->ChipRev)) + ViaSetPrimaryDotclock(pScrn, 0x471C); /* VT3122Ax use 2x XCLK */ + else + ViaSetPrimaryDotclock(pScrn, 0x871C); + ViaSetUseExternalClock(pScrn); +} /* * Stolen from xf86Config.c's addDefaultModes @@ -531,13 +729,19 @@ void ViaModesAttach(ScrnInfoPtr pScrn, MonPtr monitorp) { struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct ViaOutput *Output = VIAPTR(pScrn)->Outputs; VIAFUNC(pScrn->scrnIndex); if (ModeInfo->PanelActive && ModeInfo->PanelModes) ViaModesAttachHelper(pScrn, monitorp, ModeInfo->PanelModes); - if (ModeInfo->TVActive && ModeInfo->TVModes) - ViaModesAttachHelper(pScrn, monitorp, ModeInfo->TVModes); + + while (Output) { + if (Output->Active && Output->Modes) + ViaModesAttachHelper(pScrn, monitorp, Output->Modes); + + Output = Output->Next; + } } /* @@ -719,16 +923,14 @@ ViaValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) } } - if (ModeInfo->TVActive) { - ret = ViaTVModeValid(pScrn, mode); - if (ret != MODE_OK) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Mode \"%s\" not supported by" - " TV encoder.\n", mode->name); - return ret; - } + ret = ViaOutputsModeValid(pScrn, mode); + if (ret != MODE_OK) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Mode \"%s\" not supported by" + " output devices.\n", mode->name); + return ret; } - if (!ModeInfo->PanelActive && !ModeInfo->TVActive) + if (!ModeInfo->PanelActive && !ModeInfo->ClockSlave) if (!ViaModeDotClockTranslate(pScrn, mode)) return MODE_NOCLOCK; @@ -995,6 +1197,7 @@ ViaModePrimary(ScrnInfoPtr pScrn, DisplayModePtr mode) vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); struct ViaModeInfo *ModeInfo = pVia->ModeInfo; + struct ViaOutput *Output = pVia->Outputs; VIAFUNC(pScrn->scrnIndex); @@ -1016,6 +1219,8 @@ ViaModePrimary(ScrnInfoPtr pScrn, DisplayModePtr mode) /* Enable MMIO & PCI burst (1 wait state) */ ViaSeqMask(hwp, 0x1A, 0x06, 0x06); + ViaSetPrimaryFIFO(pScrn, mode); + if (!ModeInfo->CrtActive) ViaCrtcMask(hwp, 0x36, 0x30, 0x30); @@ -1023,53 +1228,51 @@ ViaModePrimary(ScrnInfoPtr pScrn, DisplayModePtr mode) ModeInfo->PanelMode(pScrn, mode); else if (ModeInfo->PanelPresent) ModeInfo->PanelPower(pScrn, FALSE); - - if (ModeInfo->TVActive) { - /* Quick 'n dirty workaround for non-primary case until TVCrtcMode - is removed -- copy from clock handling code below */ - if ((pVia->Chipset == VT3122) && VT3122_REV_IS_AX(pVia->ChipRev)) - ViaSetPrimaryDotclock(pScrn, 0x471C); /* VT3122Ax use 2x XCLK */ - else - ViaSetPrimaryDotclock(pScrn, 0x871C); - ViaSetUseExternalClock(pScrn); - - if (ModeInfo->TVMode) - ModeInfo->TVMode(pScrn, mode); - } else - ViaTVPower(pScrn, FALSE); - ViaSetPrimaryFIFO(pScrn, mode); - - /* - * !!! Only doing DI0/DVP0 currently !!! - */ - if (ModeInfo->TVActive) { - if (pVia->IsSecondary) { - ViaCrtcMask(hwp, 0x6A, 0x80, 0x80); - ViaCrtcMask(hwp, 0x6C, 0x80, 0x80); - - if ((pVia->Chipset == VT3122) && VT3122_REV_IS_AX(pVia->ChipRev)) { - ViaCrtcMask(hwp, 0x6B, 0x20, 0x20); - ViaCrtcMask(hwp, 0x6C, 0x10, 0x10); + while (Output) { + if (Output->Active) { + if (Output->Mode) { + /* Quick 'n dirty workaround for non-primary case */ + ViaDotclockPrimarySlave(pScrn); + + Output->Mode(Output, mode); + + /* + * !!! Only doing DI0/DVP0 currently !!! + */ + + if (pVia->IsSecondary) { + ViaCrtcMask(hwp, 0x6A, 0x80, 0x80); + ViaCrtcMask(hwp, 0x6C, 0x80, 0x80); + + if ((pVia->Chipset == VT3122) && VT3122_REV_IS_AX(pVia->ChipRev)) { + ViaCrtcMask(hwp, 0x6B, 0x20, 0x20); + ViaCrtcMask(hwp, 0x6C, 0x10, 0x10); + } + + /* Disable LCD Scaling */ + if (!pVia->SAMM || pVia->FirstInit) + hwp->writeCrtc(hwp, 0x79, 0x00); + } else { + if ((pVia->Chipset == VT3122) && VT3122_REV_IS_AX(pVia->ChipRev)) + ViaCrtcMask(hwp, 0x6B, 0x80, 0x80); + } + ViaCrtcMask(hwp, 0x6A, 0x40, 0x40); + ViaCrtcMask(hwp, 0x6B, 0x01, 0x01); + ViaCrtcMask(hwp, 0x6C, 0x01, 0x01); + ViaSeqMask(hwp, 0x1E, 0xC0, 0xC0); /* Enable DI0/DVP0 */ + + ViaDotclockPrimarySlave(pScrn); } - - /* Disable LCD Scaling */ - if (!pVia->SAMM || pVia->FirstInit) - hwp->writeCrtc(hwp, 0x79, 0x00); } else { - if ((pVia->Chipset == VT3122) && VT3122_REV_IS_AX(pVia->ChipRev)) - ViaCrtcMask(hwp, 0x6B, 0x80, 0x80); + if (Output->Power) + Output->Power(Output, FALSE); } - ViaCrtcMask(hwp, 0x6A, 0x40, 0x40); - ViaCrtcMask(hwp, 0x6B, 0x01, 0x01); - ViaCrtcMask(hwp, 0x6C, 0x01, 0x01); - ViaSeqMask(hwp, 0x1E, 0xC0, 0xC0); /* Enable DI0/DVP0 */ - if ((pVia->Chipset == VT3122) && VT3122_REV_IS_AX(pVia->ChipRev)) - ViaSetPrimaryDotclock(pScrn, 0x471C); /* VT3122Ax use 2x XCLK */ - else - ViaSetPrimaryDotclock(pScrn, 0x871C); - } else { + Output = Output->Next; + } + + if (!ModeInfo->ClockSlave) { if (ModeInfo->PanelActive) ViaSetPrimaryDotclock(pScrn, ModeInfo->PanelClock); else @@ -1231,6 +1434,7 @@ ViaModeSecondary(ScrnInfoPtr pScrn, DisplayModePtr mode) vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); struct ViaModeInfo *ModeInfo = pVia->ModeInfo; + struct ViaOutput *Output = pVia->Outputs; VIAFUNC(pScrn->scrnIndex); @@ -1239,8 +1443,12 @@ ViaModeSecondary(ScrnInfoPtr pScrn, DisplayModePtr mode) ViaModeSecondaryVGA(pScrn, mode); - if (ModeInfo->TVActive && ModeInfo->TVMode) - ModeInfo->TVMode(pScrn, mode); + while (Output) { + if (Output->Active && Output->Mode) + Output->Mode(Output, mode); + + Output = Output->Next; + } /* VT3122A2 apparently doesn't like this */ if ((pVia->Chipset != VT3122) || (pVia->ChipRev != 0x02)) diff --git a/src/via_mode.h b/src/via_mode.h index a537198..ee8a65c 100644 --- a/src/via_mode.h +++ b/src/via_mode.h @@ -40,6 +40,9 @@ struct ViaModeInfo { CARD32 Bandwidth; /* available memory bandwidth */ + Bool ClockSlave; /* is the unichrome the master or the slave? */ + CARD32 TVStandard; /* should be moved to pVia->Scratch */ + /* Panel/LCD entries */ Bool PanelPresent; Bool PanelActive; @@ -63,53 +66,77 @@ struct ViaModeInfo { ModeStatus (*PanelModeValid) (ScrnInfoPtr pScrn, DisplayModePtr mode); void (*PanelMode) (ScrnInfoPtr pScrn, DisplayModePtr mode); void (*PanelPower) (ScrnInfoPtr pScrn, Bool On); +}; - /* TV entries */ - Bool TVActive; - - /* private options */ - int TVOutput; - int TVStandard; - Bool TVDotCrawl; - int TVDeflicker; +/* For Output->Type */ +#define OUTPUT_NONE 0x00 +#define OUTPUT_TV 0x01 +#define OUTPUT_PANEL 0x02 /* TTL */ +#define OUTPUT_LVDS 0x04 /* usually also a panel */ +#define OUTPUT_TMDS 0x08 /* DVI */ - /* private use */ - int TVEncoder; - CARD8 TVRegs[0xFF]; - - I2CDevPtr TVI2CDev; - DisplayModePtr TVModes; - OptionInfoPtr TVOptions; /* alloced */ - - /* Actual TV Callbacks */ - void (*TVSave) (ScrnInfoPtr pScrn); - void (*TVRestore) (ScrnInfoPtr pScrn); - Bool (*TVDACSense) (ScrnInfoPtr pScrn); - ModeStatus (*TVModeValid) (ScrnInfoPtr pScrn, DisplayModePtr mode); - void (*TVMode) (ScrnInfoPtr pScrn, DisplayModePtr mode); - void (*TVPower) (ScrnInfoPtr pScrn, Bool On); - void (*TVPrintRegs) (ScrnInfoPtr pScrn, const char *function); +/* + * This is what i've been working up to all along. + */ +struct ViaOutput { + struct ViaOutput * Prev; + struct ViaOutput * Next; + + int scrnIndex; + + char *Name; + + /* driver side */ + int Owner; /* Which head owns this? - Driver only. */ + int Position; /* What bus is this connected to? - Driver only. */ + Bool Active; + Bool ClockMaster; + + /* Shared - 0 when unused */ + CARD32 Type; + + /* Shared - Null when unused */ + I2CDevPtr I2CDev; + DisplayModePtr Modes; + OptionInfoPtr Options; + + void (*Save) (struct ViaOutput *Output); + void (*Restore) (struct ViaOutput *Output); + Bool (*Sense) (struct ViaOutput *Output); + ModeStatus (*ModeValid) (struct ViaOutput *Output, DisplayModePtr mode); /* Required */ + void (*Mode) (struct ViaOutput *Output, DisplayModePtr mode); /* Required */ + void (*Power) (struct ViaOutput *Output, Bool On); /* Required */ + void (*PrintRegs) (struct ViaOutput *Output, const char *function); + + /* Privates. */ + int PrivFlag; + void *Private; + int PrivSize; + void (*PrivateDestroy) (struct ViaOutput *Output); }; /* Function prototypes */ /* via_mode.c */ +void ViaVgaPrintRegs(ScrnInfoPtr pScrn, const char *function); + +void ViaOutputsDestroy(ScrnInfoPtr pScrn); +void ViaOutputsSave(ScrnInfoPtr pScrn); +void ViaOutputsRestore(ScrnInfoPtr pScrn); +void ViaOutputsPower(ScrnInfoPtr pScrn, Bool On); +void ViaOutputsPrintRegs(ScrnInfoPtr pScrn, const char *function); void ViaOutputsDetect(ScrnInfoPtr pScrn); Bool ViaOutputsSelect(ScrnInfoPtr pScrn); + + void ViaModesAttach(ScrnInfoPtr pScrn, MonPtr monitorp); ModeStatus ViaValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags); void ViaModePrimary(ScrnInfoPtr pScrn, DisplayModePtr mode); void ViaModeSecondary(ScrnInfoPtr pScrn, DisplayModePtr mode); -void ViaTVPower(ScrnInfoPtr pScrn, Bool On); -void ViaTVSave(ScrnInfoPtr pScrn); -void ViaTVRestore(ScrnInfoPtr pScrn); - -void ViaVgaPrintRegs(ScrnInfoPtr pScrn, const char *function); -void ViaTVPrintRegs(ScrnInfoPtr pScrn, const char *function); /* outputs: via_panel.c, via_vt162x.c and via_ch7xxx.c */ Bool ViaPanelInit(ScrnInfoPtr pScrn, I2CDevPtr pDev); -Bool ViaVT162xInit(ScrnInfoPtr pScrn, I2CDevPtr pDev); -Bool ViaCH7xxxInit(ScrnInfoPtr pScrn, I2CDevPtr pDev); +struct ViaOutput *ViaVT162xInit(ScrnInfoPtr pScrn, I2CDevPtr pDev); +struct ViaOutput *ViaCH7xxxInit(ScrnInfoPtr pScrn, I2CDevPtr pDev); /* I still haven't been able to clean up the panel code. */ void ViaSetUseExternalClock(ScrnInfoPtr pScrn); diff --git a/src/via_vt162x.c b/src/via_vt162x.c index 4f7206f..7ec00e7 100644 --- a/src/via_vt162x.c +++ b/src/via_vt162x.c @@ -44,6 +44,59 @@ enum VT162xDevices { }; /* + * Output->Private + */ +struct VT162xOutputPrivate { + int Device; + +#define VT162X_REGSSIZE 0x68 + CARD8 *Regs; /* I2C Registers */ + int RegsSize; /* Number of registers */ + + /* Options */ + int Output; + int Standard; + Bool DotCrawl; + int Deflicker; +}; + +/* + * + */ +static void +VT162xPrivateDestroy(struct ViaOutput *Output) +{ + struct VT162xOutputPrivate *Private = Output->Private; + + xfree(Private->Regs); + xfree(Private); + + Output->PrivateDestroy = NULL; +} + +/* + * + */ +static struct VT162xOutputPrivate * +VT162xPrivateCreate(struct ViaOutput *Output) +{ + struct VT162xOutputPrivate *Private; + + VIAFUNC(Output->scrnIndex); + + Output->PrivSize = sizeof(struct VT162xOutputPrivate); + Output->Private = xnfcalloc(1, Output->PrivSize); + Private = Output->Private; + + Private->RegsSize = VT162X_REGSSIZE; + Private->Regs = xnfcalloc(VT162X_REGSSIZE, sizeof(CARD32)); + + Output->PrivateDestroy = VT162xPrivateDestroy; + + return Output->Private; +} + +/* * * Option handling. * @@ -77,9 +130,8 @@ static OptionInfoRec VT162xOptions[] = * */ static OptionInfoPtr -VT162xGetOptions(ScrnInfoPtr pScrn) +VT162xGetOptions(ScrnInfoPtr pScrn, struct VT162xOutputPrivate *Private) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; OptionInfoPtr Options; char *s = NULL; @@ -89,47 +141,47 @@ VT162xGetOptions(ScrnInfoPtr pScrn) xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, Options); /* TV Deflicker */ - ModeInfo->TVDeflicker = 0; - if (xf86GetOptValInteger(Options, OPTION_TVDEFLICKER, &ModeInfo->TVDeflicker)) + Private->Deflicker = 0; + if (xf86GetOptValInteger(Options, OPTION_TVDEFLICKER, &Private->Deflicker)) xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option: TVDeflicker %d\n", - ModeInfo->TVDeflicker ); + Private->Deflicker ); /* TV DotCrawl Enable Option */ if (xf86ReturnOptValBool(Options, OPTION_TVDOTCRAWL, FALSE)) { - ModeInfo->TVDotCrawl = TRUE; + Private->DotCrawl = TRUE; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "DotCrawl is Enabled\n"); } else - ModeInfo->TVDotCrawl = FALSE; + Private->DotCrawl = FALSE; /* TV output combination */ - ModeInfo->TVOutput = TVOUTPUT_NONE; + Private->Output = TVOUTPUT_NONE; if ((s = xf86GetOptValString(Options, OPTION_TVOUTPUT))) { if (!xf86NameCmp(s, "S-Video")) { - ModeInfo->TVOutput = TVOUTPUT_SVIDEO; + Private->Output = TVOUTPUT_SVIDEO; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is S-Video\n"); } else if(!xf86NameCmp(s, "Composite")) { - ModeInfo->TVOutput = TVOUTPUT_COMPOSITE; + Private->Output = TVOUTPUT_COMPOSITE; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is Composite\n"); } else if(!xf86NameCmp(s, "SC")) { - ModeInfo->TVOutput = TVOUTPUT_SC; + Private->Output = TVOUTPUT_SC; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is SC\n"); } else if(!xf86NameCmp(s, "RGB")) { - ModeInfo->TVOutput = TVOUTPUT_RGB; + Private->Output = TVOUTPUT_RGB; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is RGB\n"); } else if(!xf86NameCmp(s, "YCbCr")) { - ModeInfo->TVOutput = TVOUTPUT_YCBCR; + Private->Output = TVOUTPUT_YCBCR; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is YCbCr\n"); } } /* TV standard */ - ModeInfo->TVStandard = TVSTANDARD_NONE; + Private->Standard = VIAPTR(pScrn)->ModeInfo->TVStandard; if ((s = xf86GetOptValString(Options, OPTION_TVSTANDARD))) { if (!xf86NameCmp(s, "NTSC")) { - ModeInfo->TVStandard = TVSTANDARD_NTSC; + Private->Standard = TVSTANDARD_NTSC; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Standard is NTSC\n"); } else if(!xf86NameCmp(s, "PAL")) { - ModeInfo->TVStandard = TVSTANDARD_PAL; + Private->Standard = TVSTANDARD_PAL; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Standard is PAL\n"); } } @@ -141,50 +193,48 @@ VT162xGetOptions(ScrnInfoPtr pScrn) * */ static void -VT162xPrintRegs(ScrnInfoPtr pScrn, const char *function) +VT162xPrintRegs(struct ViaOutput *Output, const char *function) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; CARD8 i, buf; - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s: Printing registers for %s\n", - function, ModeInfo->TVI2CDev->DevName); + ViaDebug(Output->scrnIndex, "%s: Printing registers for %s\n", + function, Output->I2CDev->DevName); for (i = 0; i < 0x68; i++) { - xf86I2CReadByte(ModeInfo->TVI2CDev, i, &buf); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV%02X: 0x%02X\n", i, buf); + xf86I2CReadByte(Output->I2CDev, i, &buf); + ViaDebug(Output->scrnIndex, "TV%02X: 0x%02X\n", i, buf); } - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "End of TV registers.\n"); + ViaDebug(Output->scrnIndex, "End of TV registers.\n"); } /* * */ static void -VT162xSave(ScrnInfoPtr pScrn) +VT162xSave(struct ViaOutput *Output) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct VT162xOutputPrivate *Private = Output->Private; CARD8 buf = 0x00; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); - xf86I2CWriteRead(ModeInfo->TVI2CDev, &buf,1, ModeInfo->TVRegs, 0x68); + xf86I2CWriteRead(Output->I2CDev, &buf,1, Private->Regs, Private->RegsSize); } /* * */ static void -VT162xRestore(ScrnInfoPtr pScrn) +VT162xRestore(struct ViaOutput *Output) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct VT162xOutputPrivate *Private = Output->Private; int i; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); - for (i = 0; i < 0x68; i++) - xf86I2CWriteByte(ModeInfo->TVI2CDev, i, ModeInfo->TVRegs[i]); + for (i = 0; i < Private->RegsSize; i++) + xf86I2CWriteByte(Output->I2CDev, i, Private->Regs[i]); } /* @@ -210,34 +260,38 @@ VT162xDACSenseI2C(I2CDevPtr pDev) * VT1621 only knows composite and s-video */ static Bool -VT1621DACSense(ScrnInfoPtr pScrn) +VT1621DACSense(struct ViaOutput *Output) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct VT162xOutputPrivate *Private = Output->Private; CARD8 sense; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); - sense = VT162xDACSenseI2C(ModeInfo->TVI2CDev); + /* Config already set this */ + if (Private->Output != TVOUTPUT_NONE) + return TRUE; + + sense = VT162xDACSenseI2C(Output->I2CDev); switch (sense) { case 0x00: - ModeInfo->TVOutput = TVOUTPUT_SC; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1621: S-Video & Composite connected.\n"); + Private->Output = TVOUTPUT_SC; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "VT1621: S-Video & Composite connected.\n"); return TRUE; case 0x01: - ModeInfo->TVOutput = TVOUTPUT_COMPOSITE; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1621: Composite connected.\n"); + Private->Output = TVOUTPUT_COMPOSITE; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "VT1621: Composite connected.\n"); return TRUE; case 0x02: - ModeInfo->TVOutput = TVOUTPUT_SVIDEO; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1621: S-Video connected.\n"); + Private->Output = TVOUTPUT_SVIDEO; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "VT1621: S-Video connected.\n"); return TRUE; case 0x03: - ModeInfo->TVOutput = TVOUTPUT_NONE; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1621: Nothing connected.\n"); + Private->Output = TVOUTPUT_NONE; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "VT1621: Nothing connected.\n"); return FALSE; default: - ModeInfo->TVOutput = TVOUTPUT_NONE; - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT1621: Unknown cable combination: 0x0%2X.\n", + Private->Output = TVOUTPUT_NONE; + xf86DrvMsg(Output->scrnIndex, X_WARNING, "VT1621: Unknown cable combination: 0x0%2X.\n", sense); return FALSE; } @@ -248,42 +302,46 @@ VT1621DACSense(ScrnInfoPtr pScrn) * VT1622, VT1622A and VT1623 know composite, s-video, RGB and YCBCR */ static Bool -VT1622DACSense(ScrnInfoPtr pScrn) +VT1622DACSense(struct ViaOutput *Output) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct VT162xOutputPrivate *Private = Output->Private; CARD8 sense; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); - sense = VT162xDACSenseI2C(ModeInfo->TVI2CDev); + /* Config already set this */ + if (Private->Output != TVOUTPUT_NONE) + return TRUE; + + sense = VT162xDACSenseI2C(Output->I2CDev); switch (sense) { case 0x00: /* DAC A,B,C,D */ - ModeInfo->TVOutput = TVOUTPUT_RGB; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: RGB connected.\n"); + Private->Output = TVOUTPUT_RGB; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "VT162x: RGB connected.\n"); return TRUE; case 0x01: /* DAC A,B,C */ - ModeInfo->TVOutput = TVOUTPUT_SC; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: S-Video & Composite connected.\n"); + Private->Output = TVOUTPUT_SC; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "VT162x: S-Video & Composite connected.\n"); return TRUE; case 0x07: /* DAC A */ - ModeInfo->TVOutput = TVOUTPUT_COMPOSITE; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: Composite connected.\n"); + Private->Output = TVOUTPUT_COMPOSITE; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "VT162x: Composite connected.\n"); return TRUE; case 0x08: /* DAC B,C,D */ - ModeInfo->TVOutput = TVOUTPUT_YCBCR; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: YcBcR connected.\n"); + Private->Output = TVOUTPUT_YCBCR; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "VT162x: YcBcR connected.\n"); return TRUE; case 0x09: /* DAC B,C */ - ModeInfo->TVOutput = TVOUTPUT_SVIDEO; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: S-Video connected.\n"); + Private->Output = TVOUTPUT_SVIDEO; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "VT162x: S-Video connected.\n"); return TRUE; case 0x0F: - ModeInfo->TVOutput = TVOUTPUT_NONE; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: Nothing connected.\n"); + Private->Output = TVOUTPUT_NONE; + xf86DrvMsg(Output->scrnIndex, X_PROBED, "VT162x: Nothing connected.\n"); return FALSE; default: - ModeInfo->TVOutput = TVOUTPUT_NONE; - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT162x: Unknown cable combination: 0x0%2X.\n", + Private->Output = TVOUTPUT_NONE; + xf86DrvMsg(Output->scrnIndex, X_WARNING, "VT162x: Unknown cable combination: 0x0%2X.\n", sense); return FALSE; } @@ -293,21 +351,21 @@ VT1622DACSense(ScrnInfoPtr pScrn) * */ static CARD8 -VT1621ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) +VT1621ModeIndex(struct ViaOutput *Output, DisplayModePtr mode) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct VT162xOutputPrivate *Private = Output->Private; int i; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); for (i = 0; VT1621Table[i].Width; i++) { if ((VT1621Table[i].Width == mode->CrtcHDisplay) && (VT1621Table[i].Height == mode->CrtcVDisplay) && - (VT1621Table[i].Standard == ModeInfo->TVStandard) && + (VT1621Table[i].Standard == Private->Standard) && !(strcmp(VT1621Table[i].name, mode->name))) return i; } - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT1622ModeIndex:" + xf86DrvMsg(Output->scrnIndex, X_WARNING, "VT1622ModeIndex:" " Mode \"%s\" not found in Table\n", mode->name); return 0xFF; } @@ -316,30 +374,30 @@ VT1621ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) * */ static ModeStatus -VT1621ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) +VT1621ModeValid(struct ViaOutput *Output, DisplayModePtr mode) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct VT162xOutputPrivate *Private = Output->Private; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); if ((mode->PrivSize != sizeof(struct VT162xModePrivate)) || ((mode->Private != (void *) &VT162xModePrivateNTSC) && (mode->Private != (void *) &VT162xModePrivatePAL))) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Not a mode defined by the TV Encoder.\n"); + xf86DrvMsg(Output->scrnIndex, X_INFO, "Not a mode defined by the TV Encoder.\n"); return MODE_BAD; } - if ((ModeInfo->TVStandard == TVSTANDARD_NTSC) && + if ((Private->Standard == TVSTANDARD_NTSC) && (mode->Private != (void *) &VT162xModePrivateNTSC)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is NTSC. This is a PAL mode.\n"); + xf86DrvMsg(Output->scrnIndex, X_INFO, "TV standard is NTSC. This is a PAL mode.\n"); return MODE_BAD; - } else if ((ModeInfo->TVStandard == TVSTANDARD_PAL) && + } else if ((Private->Standard == TVSTANDARD_PAL) && (mode->Private != (void *) &VT162xModePrivatePAL)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is PAL. This is a NTSC mode.\n"); + xf86DrvMsg(Output->scrnIndex, X_INFO, "TV standard is PAL. This is a NTSC mode.\n"); return MODE_BAD; } - if (VT1621ModeIndex(pScrn, mode) != 0xFF) + if (VT1621ModeIndex(Output, mode) != 0xFF) return MODE_OK; return MODE_BAD; } @@ -348,15 +406,15 @@ VT1621ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) * */ static CARD8 -VT1622ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) +VT1622ModeIndex(struct ViaOutput *Output, DisplayModePtr mode) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct VT162xOutputPrivate *Private = Output->Private; struct VT162XTableRec *Table; int i; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); - if (ModeInfo->TVEncoder == VT1622) + if (Private->Device == VT1622) Table = VT1622Table; else Table = VT1623Table; @@ -364,11 +422,11 @@ VT1622ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) for (i = 0; Table[i].Width; i++) { if ((Table[i].Width == mode->CrtcHDisplay) && (Table[i].Height == mode->CrtcVDisplay) && - (Table[i].Standard == ModeInfo->TVStandard) && + (Table[i].Standard == Private->Standard) && !strcmp(Table[i].name, mode->name)) return i; } - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT1622ModeIndex:" + xf86DrvMsg(Output->scrnIndex, X_WARNING, "VT1622ModeIndex:" " Mode \"%s\" not found in Table\n", mode->name); return 0xFF; } @@ -377,30 +435,30 @@ VT1622ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) * */ static ModeStatus -VT1622ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) +VT1622ModeValid(struct ViaOutput *Output, DisplayModePtr mode) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct VT162xOutputPrivate *Private = Output->Private; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); if ((mode->PrivSize != sizeof(struct VT162xModePrivate)) || ((mode->Private != (void *) &VT162xModePrivateNTSC) && (mode->Private != (void *) &VT162xModePrivatePAL))) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Not a mode defined by the TV Encoder.\n"); + xf86DrvMsg(Output->scrnIndex, X_INFO, "Not a mode defined by the TV Encoder.\n"); return MODE_BAD; } - if ((ModeInfo->TVStandard == TVSTANDARD_NTSC) && + if ((Private->Standard == TVSTANDARD_NTSC) && (mode->Private != (void *) &VT162xModePrivateNTSC)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is NTSC. This is a PAL mode.\n"); + xf86DrvMsg(Output->scrnIndex, X_INFO, "TV standard is NTSC. This is a PAL mode.\n"); return MODE_BAD; - } else if ((ModeInfo->TVStandard == TVSTANDARD_PAL) && + } else if ((Private->Standard == TVSTANDARD_PAL) && (mode->Private != (void *) &VT162xModePrivatePAL)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is PAL. This is a NTSC mode.\n"); + xf86DrvMsg(Output->scrnIndex, X_INFO, "TV standard is PAL. This is a NTSC mode.\n"); return MODE_BAD; } - if (VT1622ModeIndex(pScrn, mode) != 0xFF) + if (VT1622ModeIndex(Output, mode) != 0xFF) return MODE_OK; return MODE_BAD; } @@ -421,51 +479,51 @@ VT162xSetSubCarrier(I2CDevPtr pDev, CARD32 SubCarrier) * */ static void -VT1621Mode(ScrnInfoPtr pScrn, DisplayModePtr mode) +VT1621Mode(struct ViaOutput *Output, DisplayModePtr mode) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; - struct VT1621TableRec Table = VT1621Table[VT1621ModeIndex(pScrn, mode)]; + struct VT162xOutputPrivate *Private = Output->Private; + struct VT1621TableRec Table = VT1621Table[VT1621ModeIndex(Output, mode)]; CARD8 i; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); for (i = 0; i < 0x16; i++) - xf86I2CWriteByte(ModeInfo->TVI2CDev, i, Table.TV[i]); + xf86I2CWriteByte(Output->I2CDev, i, Table.TV[i]); - VT162xSetSubCarrier(ModeInfo->TVI2CDev, Table.SubCarrier); + VT162xSetSubCarrier(Output->I2CDev, Table.SubCarrier); /* skip reserved (1A) and version id (1B). */ - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x1C, Table.TV[0x1C]); + xf86I2CWriteByte(Output->I2CDev, 0x1C, Table.TV[0x1C]); /* skip software reset (1D) */ for (i = 0x1E; i < 0x24; i++) - xf86I2CWriteByte(ModeInfo->TVI2CDev, i, Table.TV[i]); + xf86I2CWriteByte(Output->I2CDev, i, Table.TV[i]); /* write some zeroes? */ - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x24, 0x00); + xf86I2CWriteByte(Output->I2CDev, 0x24, 0x00); for (i = 0; i < 0x08; i++) - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x4A + i, 0x00); + xf86I2CWriteByte(Output->I2CDev, 0x4A + i, 0x00); - if (ModeInfo->TVOutput == TVOUTPUT_COMPOSITE) + if (Private->Output == TVOUTPUT_COMPOSITE) for (i = 0; i < 0x10; i++) - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x52 + i, Table.TVC[i]); + xf86I2CWriteByte(Output->I2CDev, 0x52 + i, Table.TVC[i]); else for (i = 0; i < 0x10; i++) - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x52 + i, Table.TVS[i]); + xf86I2CWriteByte(Output->I2CDev, 0x52 + i, Table.TVS[i]); /* Turn on all Composite and S-Video output */ - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x0E, 0x00); + xf86I2CWriteByte(Output->I2CDev, 0x0E, 0x00); - if (ModeInfo->TVDotCrawl) { + if (Private->DotCrawl) { if (Table.DotCrawlSubCarrier) { - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x11, &i); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x11, i | 0x08); + xf86I2CReadByte(Output->I2CDev, 0x11, &i); + xf86I2CWriteByte(Output->I2CDev, 0x11, i | 0x08); - VT162xSetSubCarrier(ModeInfo->TVI2CDev, Table.DotCrawlSubCarrier); + VT162xSetSubCarrier(Output->I2CDev, Table.DotCrawlSubCarrier); } else - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "This mode does not currently " + xf86DrvMsg(Output->scrnIndex, X_INFO, "This mode does not currently " "support DotCrawl suppression.\n"); } } @@ -474,123 +532,120 @@ VT1621Mode(ScrnInfoPtr pScrn, DisplayModePtr mode) * also suited for VT1622A, VT1623 */ static void -VT1622Mode(ScrnInfoPtr pScrn, DisplayModePtr mode) +VT1622Mode(struct ViaOutput *Output, DisplayModePtr mode) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct VT162xOutputPrivate *Private = Output->Private; struct VT162XTableRec Table; CARD8 save, i; - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); - if (ModeInfo->TVEncoder == VT1622) - Table = VT1622Table[VT1622ModeIndex(pScrn, mode)]; + if (Private->Device == VT1622) + Table = VT1622Table[VT1622ModeIndex(Output, mode)]; else /* VT1622A/VT1623 */ - Table = VT1623Table[VT1622ModeIndex(pScrn, mode)]; + Table = VT1623Table[VT1622ModeIndex(Output, mode)]; /* TV Reset */ - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x1D, 0x00); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x1D, 0x80); + xf86I2CWriteByte(Output->I2CDev, 0x1D, 0x00); + xf86I2CWriteByte(Output->I2CDev, 0x1D, 0x80); for (i = 0; i < 0x16; i++) - xf86I2CWriteByte(ModeInfo->TVI2CDev, i, Table.TV1[i]); + xf86I2CWriteByte(Output->I2CDev, i, Table.TV1[i]); - VT162xSetSubCarrier(ModeInfo->TVI2CDev, Table.SubCarrier); + VT162xSetSubCarrier(Output->I2CDev, Table.SubCarrier); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x1A, Table.TV1[0x1A]); + xf86I2CWriteByte(Output->I2CDev, 0x1A, Table.TV1[0x1A]); /* skip version id */ - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x1C, Table.TV1[0x1C]); + xf86I2CWriteByte(Output->I2CDev, 0x1C, Table.TV1[0x1C]); /* skip software reset */ for (i = 0x1E; i < 0x30; i++) - xf86I2CWriteByte(ModeInfo->TVI2CDev, i, Table.TV1[i]); + xf86I2CWriteByte(Output->I2CDev, i, Table.TV1[i]); for (i = 0; i < 0x1B; i++) - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x4A + i, Table.TV2[i]); + xf86I2CWriteByte(Output->I2CDev, 0x4A + i, Table.TV2[i]); /* Turn on all Composite and S-Video output */ - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x0E, 0x00); + xf86I2CWriteByte(Output->I2CDev, 0x0E, 0x00); - if (ModeInfo->TVDotCrawl) { + if (Private->DotCrawl) { if (Table.DotCrawlSubCarrier) { - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x11, &save); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x11, save | 0x08); + xf86I2CReadByte(Output->I2CDev, 0x11, &save); + xf86I2CWriteByte(Output->I2CDev, 0x11, save | 0x08); - VT162xSetSubCarrier(ModeInfo->TVI2CDev, Table.DotCrawlSubCarrier); + VT162xSetSubCarrier(Output->I2CDev, Table.DotCrawlSubCarrier); } else - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "This mode does not currently " + xf86DrvMsg(Output->scrnIndex, X_INFO, "This mode does not currently " "support DotCrawl suppression.\n"); } - if (ModeInfo->TVOutput == TVOUTPUT_RGB) { - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x02, 0x2A); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x65, Table.RGB[0]); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x66, Table.RGB[1]); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x67, Table.RGB[2]); + if (Private->Output == TVOUTPUT_RGB) { + xf86I2CWriteByte(Output->I2CDev, 0x02, 0x2A); + xf86I2CWriteByte(Output->I2CDev, 0x65, Table.RGB[0]); + xf86I2CWriteByte(Output->I2CDev, 0x66, Table.RGB[1]); + xf86I2CWriteByte(Output->I2CDev, 0x67, Table.RGB[2]); if (Table.RGB[3]) - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x27, Table.RGB[3]); + xf86I2CWriteByte(Output->I2CDev, 0x27, Table.RGB[3]); if (Table.RGB[4]) - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x2B, Table.RGB[4]); + xf86I2CWriteByte(Output->I2CDev, 0x2B, Table.RGB[4]); if (Table.RGB[5]) - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x2C, Table.RGB[5]); - } else if (ModeInfo->TVOutput == TVOUTPUT_YCBCR) { - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x02, 0x03); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x65, Table.YCbCr[0]); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x66, Table.YCbCr[1]); - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x67, Table.YCbCr[2]); + xf86I2CWriteByte(Output->I2CDev, 0x2C, Table.RGB[5]); + } else if (Private->Output == TVOUTPUT_YCBCR) { + xf86I2CWriteByte(Output->I2CDev, 0x02, 0x03); + xf86I2CWriteByte(Output->I2CDev, 0x65, Table.YCbCr[0]); + xf86I2CWriteByte(Output->I2CDev, 0x66, Table.YCbCr[1]); + xf86I2CWriteByte(Output->I2CDev, 0x67, Table.YCbCr[2]); } /* Configure flicker filter */ - xf86I2CReadByte(ModeInfo->TVI2CDev, 0x03, &save); + xf86I2CReadByte(Output->I2CDev, 0x03, &save); save &= 0xFC; - if (ModeInfo->TVDeflicker == 1) + if (Private->Deflicker == 1) save |= 0x01; - else if (ModeInfo->TVDeflicker == 2) + else if (Private->Deflicker == 2) save |= 0x02; - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x03, save); + xf86I2CWriteByte(Output->I2CDev, 0x03, save); } /* * */ static void -VT1621Power(ScrnInfoPtr pScrn, Bool On) +VT1621Power(struct ViaOutput *Output, Bool On) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; - - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); if (On) - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x0E, 0x00); + xf86I2CWriteByte(Output->I2CDev, 0x0E, 0x00); else - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x0E, 0x03); + xf86I2CWriteByte(Output->I2CDev, 0x0E, 0x03); } /* * */ static void -VT1622Power(ScrnInfoPtr pScrn, Bool On) +VT1622Power(struct ViaOutput *Output, Bool On) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; - - VIAFUNC(pScrn->scrnIndex); + VIAFUNC(Output->scrnIndex); if (On) - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x0E, 0x00); + xf86I2CWriteByte(Output->I2CDev, 0x0E, 0x00); else - xf86I2CWriteByte(ModeInfo->TVI2CDev, 0x0E, 0x0F); + xf86I2CWriteByte(Output->I2CDev, 0x0E, 0x0F); } /* * */ -Bool +struct ViaOutput * ViaVT162xInit(ScrnInfoPtr pScrn, I2CDevPtr pDev) { - struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo; + struct ViaOutput *Output; + struct VT162xOutputPrivate *Private; CARD8 buf; VIAFUNC(pScrn->scrnIndex); @@ -598,67 +653,79 @@ ViaVT162xInit(ScrnInfoPtr pScrn, I2CDevPtr pDev) if (!xf86I2CReadByte(pDev, 0x1B, &buf)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to read from %s Slave %d.\n", pDev->pI2CBus->BusName, pDev->SlaveAddr); - return FALSE; + return NULL; } + Output = xnfcalloc(1, sizeof(struct ViaOutput)); + + Output->Prev = NULL; + Output->Next = NULL; + Output->scrnIndex = pScrn->scrnIndex; + Output->I2CDev = pDev; + Output->Type = OUTPUT_TV; + + Private = VT162xPrivateCreate(Output); + + Output->Options = VT162xGetOptions(pScrn, Private); + switch (buf) { case 0x02: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected VIA Technologies VT1621 TV Encoder\n"); pDev->DevName = "VT1621"; - - ModeInfo->TVOptions = VT162xGetOptions(pScrn); - - ModeInfo->TVI2CDev = pDev; - ModeInfo->TVEncoder = VT1621; - ModeInfo->TVSave = VT162xSave; - ModeInfo->TVRestore = VT162xRestore; - ModeInfo->TVDACSense = VT1621DACSense; - ModeInfo->TVModeValid = VT1621ModeValid; - ModeInfo->TVMode = VT1621Mode; - ModeInfo->TVPower = VT1621Power; - ModeInfo->TVModes = VT1621Modes; - ModeInfo->TVPrintRegs = VT162xPrintRegs; - - return TRUE; + Output->Name = "VT1621"; + Private->Device = VT1621; + + Output->ClockMaster = TRUE; + Output->Modes = VT1621Modes; + + Output->Save = VT162xSave; + Output->Restore = VT162xRestore; + Output->Sense = VT1621DACSense; + Output->ModeValid = VT1621ModeValid; + Output->Mode = VT1621Mode; + Output->Power = VT1621Power; + Output->PrintRegs = VT162xPrintRegs; + + return Output; case 0x03: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected VIA Technologies VT1622 TV Encoder\n"); pDev->DevName = "VT1622"; + Output->Name = "VT1622"; + Private->Device = VT1622; - ModeInfo->TVOptions = VT162xGetOptions(pScrn); + Output->ClockMaster = TRUE; + Output->Modes = VT1622Modes; - ModeInfo->TVI2CDev = pDev; - ModeInfo->TVEncoder = VT1622; - ModeInfo->TVSave = VT162xSave; - ModeInfo->TVRestore = VT162xRestore; - ModeInfo->TVDACSense = VT1622DACSense; - ModeInfo->TVModeValid = VT1622ModeValid; - ModeInfo->TVMode = VT1622Mode; - ModeInfo->TVPower = VT1622Power; - ModeInfo->TVModes = VT1622Modes; - ModeInfo->TVPrintRegs = VT162xPrintRegs; + Output->Save = VT162xSave; + Output->Restore = VT162xRestore; + Output->Sense = VT1622DACSense; + Output->ModeValid = VT1622ModeValid; + Output->Mode = VT1622Mode; + Output->Power = VT1622Power; + Output->PrintRegs = VT162xPrintRegs; - return TRUE; + return Output; case 0x10: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected VIA Technologies VT1622A/VT1623 TV Encoder\n"); pDev->DevName = "VT1623"; + Output->Name = "VT1623"; + Private->Device = VT1623; - ModeInfo->TVOptions = VT162xGetOptions(pScrn); + Output->ClockMaster = TRUE; + Output->Modes = VT1623Modes; - ModeInfo->TVI2CDev = pDev; - ModeInfo->TVEncoder = VT1623; - ModeInfo->TVSave = VT162xSave; - ModeInfo->TVRestore = VT162xRestore; - ModeInfo->TVDACSense = VT1622DACSense; - ModeInfo->TVModeValid = VT1622ModeValid; - ModeInfo->TVMode = VT1622Mode; - ModeInfo->TVPower = VT1622Power; - ModeInfo->TVModes = VT1623Modes; - ModeInfo->TVPrintRegs = VT162xPrintRegs; + Output->Save = VT162xSave; + Output->Restore = VT162xRestore; + Output->Sense = VT1622DACSense; + Output->ModeValid = VT1622ModeValid; + Output->Mode = VT1622Mode; + Output->Power = VT1622Power; + Output->PrintRegs = VT162xPrintRegs; - return TRUE; + return Output; case 0x50: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected VIA Technologies VT1625 TV Encoder\n"); @@ -667,14 +734,20 @@ ViaVT162xInit(ScrnInfoPtr pScrn, I2CDevPtr pDev) ... - return TRUE; + return Output; #else xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT1625 is not supported yet.\n"); - return FALSE; + break; #endif default: xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown TV Encoder found at %s %X.\n", pDev->pI2CBus->BusName, pDev->SlaveAddr); - return FALSE; + break; } + + Output->PrivateDestroy(Output); + + xfree(Output->Options); + xfree(Output); + return NULL; } |