summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2005-12-11 13:52:59 +0000
committerLuc Verhaegen <libv@skynet.be>2005-12-11 13:52:59 +0000
commitd6ea81daf1cd5c7c507897a7454cf5810ea52cb3 (patch)
tree61ee09be42cf72f86e4f4d838c306ff68e33e76f
parent7790406ed9157820370c2570f2afb6f28a17bb80 (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.c384
-rw-r--r--src/via_driver.c47
-rw-r--r--src/via_driver.h4
-rw-r--r--src/via_mode.c528
-rw-r--r--src/via_mode.h91
-rw-r--r--src/via_vt162x.c487
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;
}