summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2005-12-02 11:07:52 +0000
committerLuc Verhaegen <libv@skynet.be>2005-12-02 11:07:52 +0000
commit520948f9e08eb6bf0431dfaddf1302e6280cc6f5 (patch)
treed3bbb3ea2c13f6ed3b42715b6965a40fb572ec02
parent9a092d7f50870192f919bc3e339c5fa07b8362b6 (diff)
[devel-panel_callbacks]
- Move to callbacks for the panel code. This allows for clean separation like for TV encoders (but the Crtc must still be aware of a panel being in use). - Rename all panel code to ViaPanel*. - Move ModeInfo->Clock to ModeInfo->PanelClock. - Move ModeInfo->ResolutionIndex to ModeInfo->PanelResolutionIndex.
-rw-r--r--src/via_driver.c6
-rw-r--r--src/via_mode.c280
-rw-r--r--src/via_mode.h18
-rw-r--r--src/via_panel.h4
4 files changed, 171 insertions, 137 deletions
diff --git a/src/via_driver.c b/src/via_driver.c
index 274c1a3..03866bc 100644
--- a/src/via_driver.c
+++ b/src/via_driver.c
@@ -1799,7 +1799,7 @@ VIARestore(ScrnInfoPtr pScrn)
hwp->writeCrtc(hwp, i + 0x50, Regs->CRTCRegs[i]);
if (ModeInfo->PanelActive)
- ViaLCDPower(pScrn, TRUE);
+ ModeInfo->PanelPower(pScrn, TRUE);
ViaDisablePrimaryFIFO(pScrn);
@@ -2460,7 +2460,7 @@ static void VIADPMS(ScrnInfoPtr pScrn, int mode, int flags)
switch (mode) {
case DPMSModeOn:
if (ModeInfo->PanelActive)
- ViaLCDPower(pScrn, TRUE);
+ ModeInfo->PanelPower(pScrn, TRUE);
if (ModeInfo->TVActive)
ViaTVPower(pScrn, TRUE);
@@ -2471,7 +2471,7 @@ static void VIADPMS(ScrnInfoPtr pScrn, int mode, int flags)
case DPMSModeSuspend:
case DPMSModeOff:
if (ModeInfo->PanelActive)
- ViaLCDPower(pScrn, FALSE);
+ ModeInfo->PanelPower(pScrn, FALSE);
if (ModeInfo->TVActive)
ViaTVPower(pScrn, FALSE);
diff --git a/src/via_mode.c b/src/via_mode.c
index 1869bd7..d5798e0 100644
--- a/src/via_mode.c
+++ b/src/via_mode.c
@@ -221,6 +221,8 @@ ViaTVModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode)
return MODE_OK;
}
+Bool ViaPanelInit(ScrnInfoPtr pScrn, I2CDevPtr pDev);
+
/*
*
*/
@@ -245,6 +247,9 @@ ViaOutputsDetect(ScrnInfoPtr pScrn)
ModeInfo->PanelPresent = TRUE;
}
+ if (ModeInfo->PanelPresent)
+ ViaPanelInit(pScrn, NULL);
+
/* Crt */
if (pVia->DDC1)
ModeInfo->CrtPresent = TRUE;
@@ -510,7 +515,7 @@ ViaModeDotClockTranslate(ScrnInfoPtr pScrn, DisplayModePtr mode)
* Try to interprete EDID ourselves.
*/
static Bool
-ViaGetPanelSizeFromEDID(ScrnInfoPtr pScrn, xf86MonPtr pMon, int *size)
+ViaPanelGetSizeFromEDID(ScrnInfoPtr pScrn, xf86MonPtr pMon, int *size)
{
int i, max = 0;
@@ -553,7 +558,7 @@ ViaGetPanelSizeFromEDID(ScrnInfoPtr pScrn, xf86MonPtr pMon, int *size)
*
*/
static Bool
-VIAGetPanelSizeFromDDCv1(ScrnInfoPtr pScrn, int *size)
+ViaPanelGetSizeFromDDCv1(ScrnInfoPtr pScrn, int *size)
{
VIAPtr pVia = VIAPTR(pScrn);
xf86MonPtr pMon;
@@ -574,8 +579,9 @@ VIAGetPanelSizeFromDDCv1(ScrnInfoPtr pScrn, int *size)
xf86SetDDCproperties(pScrn, pMon);
}
- if (!ViaGetPanelSizeFromEDID(pScrn, pMon, size)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to read PanelSize from EDID information\n");
+ if (!ViaPanelGetSizeFromEDID(pScrn, pMon, size)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to read PanelSize from "
+ "EDID information\n");
return FALSE;
}
@@ -587,7 +593,7 @@ VIAGetPanelSizeFromDDCv1(ScrnInfoPtr pScrn, int *size)
*
*/
static Bool
-VIAGetPanelSizeFromDDCv2(ScrnInfoPtr pScrn, int *size)
+ViaPanelGetSizeFromDDCv2(ScrnInfoPtr pScrn, int *size)
{
VIAPtr pVia = VIAPTR(pScrn);
CARD8 W_Buffer[1];
@@ -639,7 +645,7 @@ VIAGetPanelSizeFromDDCv2(ScrnInfoPtr pScrn, int *size)
*
*/
static void
-VIAGetPanelSize(ScrnInfoPtr pScrn)
+ViaPanelGetSize(ScrnInfoPtr pScrn)
{
vgaHWPtr hwp = VGAHWPTR(pScrn);
VIAPtr pVia = VIAPTR(pScrn);
@@ -651,9 +657,9 @@ VIAGetPanelSize(ScrnInfoPtr pScrn)
VIAFUNC(pScrn->scrnIndex);
- ret = VIAGetPanelSizeFromDDCv1(pScrn, &size);
+ ret = ViaPanelGetSizeFromDDCv1(pScrn, &size);
if (!ret)
- ret = VIAGetPanelSizeFromDDCv2(pScrn, &size);
+ ret = ViaPanelGetSizeFromDDCv2(pScrn, &size);
if (ret) {
switch (size) {
@@ -702,27 +708,26 @@ VIAGetPanelSize(ScrnInfoPtr pScrn)
*
*/
static Bool
-ViaGetResolutionIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
+ViaPanelGetResolutionIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
{
struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo;
int i;
-
VIAFUNC(pScrn->scrnIndex);
ViaDebug(pScrn->scrnIndex, "%s: Looking for %dx%d\n", __func__,
mode->CrtcHDisplay, mode->CrtcVDisplay);
- for (i = 0; ViaResolutionTable[i].Index != VIA_RES_INVALID; i++) {
- if ((ViaResolutionTable[i].X == mode->CrtcHDisplay) &&
- (ViaResolutionTable[i].Y == mode->CrtcVDisplay)){
- ModeInfo->ResolutionIndex = ViaResolutionTable[i].Index;
+ for (i = 0; ViaPanelResolutionTable[i].Index != VIA_RES_INVALID; i++) {
+ if ((ViaPanelResolutionTable[i].X == mode->CrtcHDisplay) &&
+ (ViaPanelResolutionTable[i].Y == mode->CrtcVDisplay)){
+ ModeInfo->PanelResolutionIndex = ViaPanelResolutionTable[i].Index;
ViaDebug(pScrn->scrnIndex, "%s: %d\n", __func__,
- ModeInfo->ResolutionIndex);
+ ModeInfo->PanelResolutionIndex);
return TRUE;
}
}
- ModeInfo->ResolutionIndex = VIA_RES_INVALID;
+ ModeInfo->PanelResolutionIndex = VIA_RES_INVALID;
return FALSE;
}
@@ -730,21 +735,23 @@ ViaGetResolutionIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
*
*/
static int
-ViaGetVesaMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
+ViaPanelGetVesaMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
{
int i;
+
+ VIAFUNC(pScrn->scrnIndex);
- for (i = 0; ViaVesaModes[i].Width; i++)
- if ((ViaVesaModes[i].Width == mode->CrtcHDisplay) &&
- (ViaVesaModes[i].Height == mode->CrtcVDisplay)) {
+ for (i = 0; ViaPanelVesaModes[i].Width; i++)
+ if ((ViaPanelVesaModes[i].Width == mode->CrtcHDisplay) &&
+ (ViaPanelVesaModes[i].Height == mode->CrtcVDisplay)) {
switch (pScrn->bitsPerPixel) {
case 8:
- return ViaVesaModes[i].mode_8b;
+ return ViaPanelVesaModes[i].mode_8b;
case 16:
- return ViaVesaModes[i].mode_16b;
+ return ViaPanelVesaModes[i].mode_16b;
case 24:
case 32:
- return ViaVesaModes[i].mode_32b;
+ return ViaPanelVesaModes[i].mode_32b;
default:
return 0xFFFF;
}
@@ -758,8 +765,8 @@ ViaGetVesaMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
* ModeInfo->PanelIndex is the index to lcdTable.
*
*/
-static Bool
-ViaPanelGetIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
+static ModeStatus
+ViaPanelModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode)
{
struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo;
int i;
@@ -769,56 +776,56 @@ ViaPanelGetIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
ModeInfo->PanelIndex = VIA_BIOS_NUM_PANEL;
if (ModeInfo->PanelSize == VIA_PANEL_INVALID) {
- VIAGetPanelSize(pScrn);
+ ViaPanelGetSize(pScrn);
if (ModeInfo->PanelSize == VIA_PANEL_INVALID) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaPanelGetIndex:"
- " PanelSize not set.\n");
- return FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: PanelSize not set.\n",
+ __func__);
+ return MODE_BAD;
}
}
if ((mode->PrivSize != sizeof(struct ViaModePriv)) ||
(mode->Private != (void *)&ViaPanelPrivate)){
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetIndex:"
- " Mode not supported by Panel.\n");
- return FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s: Not a mode defined by this "
+ "drivers panel code.\n", __func__);
+ return MODE_BAD;
}
- if (!ViaGetResolutionIndex(pScrn, mode)) {
+ if (!ViaPanelGetResolutionIndex(pScrn, mode)) {
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel does not support this"
" resolution: %s\n", mode->name);
- return FALSE;
+ return MODE_BAD;
}
- for (i = 0; ViaResolutionTable[i].Index != VIA_RES_INVALID; i++)
- if (ViaResolutionTable[i].PanelIndex == ModeInfo->PanelSize) {
- ModeInfo->panelX = ViaResolutionTable[i].X;
- ModeInfo->panelY = ViaResolutionTable[i].Y;
+ for (i = 0; ViaPanelResolutionTable[i].Index != VIA_RES_INVALID; i++)
+ if (ViaPanelResolutionTable[i].PanelIndex == ModeInfo->PanelSize) {
+ ModeInfo->panelX = ViaPanelResolutionTable[i].X;
+ ModeInfo->panelY = ViaPanelResolutionTable[i].Y;
break;
}
- if (ViaResolutionTable[i].Index == VIA_RES_INVALID) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetIndex: Unable"
- " to find matching PanelSize in ViaResolutionTable.\n");
- return FALSE;
+ if (ViaPanelResolutionTable[i].Index == VIA_RES_INVALID) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s: Unable to find matching "
+ "PanelSize in ViaPanelResolutionTable.\n", __func__);
+ return MODE_BAD;
}
if ((ModeInfo->panelX != mode->CrtcHDisplay) ||
(ModeInfo->panelY != mode->CrtcVDisplay)) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetIndex: Non-native"
- "resolutions are broken.\n");
- return FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s: Non-native resolutions are "
+ "broken.\n", __func__);
+ return MODE_BAD;
}
for (i = 0; i < VIA_BIOS_NUM_PANEL; i++)
if (lcdTable[i].fpSize == ModeInfo->PanelSize) {
int modeNum, tmp;
- modeNum = ViaGetVesaMode(pScrn, mode);
+ modeNum = ViaPanelGetVesaMode(pScrn, mode);
if (modeNum == 0xFFFF) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaPanelGetIndex: "
- "Unable to determine matching VESA modenumber.\n");
- return FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: Unable to determine "
+ "matching VESA modenumber.\n", __func__);
+ return MODE_BAD;
}
tmp = 0x01 << (modeNum & 0xF);
@@ -826,17 +833,17 @@ ViaPanelGetIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
ModeInfo->PanelIndex = i;
ViaDebug(pScrn->scrnIndex, "%s: index: %d (%dx%d)\n", __func__,
ModeInfo->PanelIndex, ModeInfo->panelX, ModeInfo->panelY);
- return TRUE;
+ return MODE_OK;
}
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetIndex: Unable"
- " to match given mode with this PanelSize.\n");
- return FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s: Unable to match given "
+ "mode with this PanelSize.\n", __func__);
+ return MODE_BAD;
}
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetIndex: Unable"
- " to match PanelSize with an lcdTable entry.\n");
- return FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s: Unable to match PanelSize with an"
+ " lcdTable entry.\n", __func__);
+ return MODE_BAD;
}
/*
@@ -1051,6 +1058,15 @@ ViaValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
if (ret != MODE_OK)
return ret;
+ if (ModeInfo->PanelActive) {
+ ret = ModeInfo->PanelModeValid(pScrn, mode);
+ if (ret != MODE_OK) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Mode \"%s\" not supported by"
+ " panel.\n", mode->name);
+ return ret;
+ }
+ }
+
if (ModeInfo->TVActive) {
ret = ViaTVModeValid(pScrn, mode);
if (ret != MODE_OK) {
@@ -1058,10 +1074,11 @@ ViaValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
" TV encoder.\n", mode->name);
return ret;
}
- } else if (ModeInfo->PanelActive && !ViaPanelGetIndex(pScrn, mode))
- return MODE_BAD;
- else if (!ViaModeDotClockTranslate(pScrn, mode))
- return MODE_NOCLOCK;
+ }
+
+ if (!ModeInfo->PanelActive && !ModeInfo->TVActive)
+ if (!ViaModeDotClockTranslate(pScrn, mode))
+ return MODE_NOCLOCK;
temp = mode->CrtcHDisplay * mode->CrtcVDisplay * mode->VRefresh *
(pScrn->bitsPerPixel >> 3);
@@ -1078,39 +1095,37 @@ ViaValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
* Broken, only does native mode decently. I (Luc) personally broke this.
*/
static void
-VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
+ViaPanelMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
{
vgaHWPtr hwp = VGAHWPTR(pScrn);
VIAPtr pVia = VIAPTR(pScrn);
struct ViaModeInfo *ModeInfo = pVia->ModeInfo;
VIALCDModeTableRec Table = lcdTable[ModeInfo->PanelIndex];
- CARD8 modeNum = 0;
- int resIdx;
- int port, offset, data;
- int i, j, misc;
+ CARD8 modeNum = 0;
+ CARD32 Clock;
+ int resIdx;
+ int i, j, misc;
+
VIAFUNC(pScrn->scrnIndex);
if (ModeInfo->PanelSize == VIA_PANEL12X10)
hwp->writeCrtc(hwp, 0x89, 0x07);
- /* LCD Expand Mode Y Scale Flag */
- ModeInfo->scaleY = FALSE;
-
/* Set LCD InitTb Regs */
if (ModeInfo->BusWidth == VIA_DI_12BIT) {
if (pVia->IsSecondary)
- ModeInfo->Clock = Table.InitTb.LCDClk_12Bit;
+ Clock = Table.InitTb.LCDClk_12Bit;
else {
- ModeInfo->Clock = Table.InitTb.VClk_12Bit;
+ Clock = Table.InitTb.VClk_12Bit;
/* for some reason still to be defined this is neccessary */
ViaSetSecondaryDotclock(pScrn, Table.InitTb.LCDClk_12Bit);
}
} else {
if (pVia->IsSecondary)
- ModeInfo->Clock = Table.InitTb.LCDClk;
+ Clock = Table.InitTb.LCDClk;
else {
- ModeInfo->Clock = Table.InitTb.VClk;
+ Clock = Table.InitTb.VClk;
ViaSetSecondaryDotclock(pScrn, Table.InitTb.LCDClk);
}
@@ -1118,12 +1133,9 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
ViaSetUseExternalClock(hwp);
- for (i = 0; i < Table.InitTb.numEntry; i++) {
- port = Table.InitTb.port[i];
- offset = Table.InitTb.offset[i];
- data = Table.InitTb.data[i];
- ViaVgahwWrite(hwp, 0x300+port, offset, 0x301+port, data);
- }
+ for (i = 0; i < Table.InitTb.numEntry; i++)
+ ViaVgahwWrite(hwp, 0x300 + Table.InitTb.port[i], Table.InitTb.offset[i],
+ 0x301 + Table.InitTb.port[i], Table.InitTb.data[i]);
if ((mode->CrtcHDisplay != ModeInfo->panelX) ||
(mode->CrtcVDisplay != ModeInfo->panelY)) {
@@ -1133,10 +1145,8 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
resIdx = VIA_RES_INVALID;
- /* Find MxxxCtr & MxxxExp Index and
- * HWCursor Y Scale (PanelSize Y / Res. Y) */
- ModeInfo->resY = mode->CrtcVDisplay;
- switch (ModeInfo->ResolutionIndex) {
+ /* Find MxxxCtr & MxxxExp Index */
+ switch (ModeInfo->PanelResolutionIndex) {
case VIA_RES_640X480:
resIdx = 0;
break;
@@ -1167,8 +1177,8 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
resIdx = 0;
if (resIdx == VIA_RES_INVALID) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "VIASetLCDMode: Failed "
- "to find a suitable Panel Size index.\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: Failed to find a "
+ "suitable Panel Size index.\n", __func__);
return;
}
@@ -1180,7 +1190,6 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
numPatch2 = Table.numMPatchDP2Ctr;
} else { /* expand! */
/* LCD Expand Mode Y Scale Flag */
- ModeInfo->scaleY = TRUE;
Main = &(Table.MExp[resIdx]);
Patch1 = Table.MPatchDP1Exp;
numPatch1 = Table.numMPatchDP1Exp;
@@ -1189,27 +1198,26 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
}
/* Set Main LCD Registers */
- for (i = 0; i < Main->numEntry; i++){
+ for (i = 0; i < Main->numEntry; i++)
ViaVgahwWrite(hwp, 0x300 + Main->port[i], Main->offset[i],
0x301 + Main->port[i], Main->data[i]);
- }
if (ModeInfo->BusWidth == VIA_DI_12BIT) {
if (pVia->IsSecondary)
- ModeInfo->Clock = Main->LCDClk_12Bit;
+ Clock = Main->LCDClk_12Bit;
else
- ModeInfo->Clock = Main->VClk_12Bit;
+ Clock = Main->VClk_12Bit;
} else {
if (pVia->IsSecondary)
- ModeInfo->Clock = Main->LCDClk;
+ Clock = Main->LCDClk;
else
- ModeInfo->Clock = Main->VClk;
+ Clock = Main->VClk;
}
- j = ViaGetVesaMode(pScrn, mode);
+ j = ViaPanelGetVesaMode(pScrn, mode);
if (j == 0xFFFF) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "VIASetLCDMode: "
- "Unable to determine matching VESA modenumber.\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: Unable to determine "
+ "matching VESA modenumber.\n", __func__);
return;
}
for (i = 0; i < modeFix.numEntry; i++) {
@@ -1222,24 +1230,20 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
/* Set LCD Mode patch registers. */
for (i = 0; i < numPatch2; i++, Patch2++) {
if (Patch2->Mode == modeNum) {
- if (!ModeInfo->Center && (mode->CrtcHDisplay == ModeInfo->panelX))
- ModeInfo->scaleY = FALSE;
-
- for (j = 0; j < Patch2->numEntry; j++){
+ for (j = 0; j < Patch2->numEntry; j++)
ViaVgahwWrite(hwp, 0x300 + Patch2->port[j], Patch2->offset[j],
0x301 + Patch2->port[j], Patch2->data[j]);
- }
if (ModeInfo->BusWidth == VIA_DI_12BIT) {
if (pVia->IsSecondary)
- ModeInfo->Clock = Patch2->LCDClk_12Bit;
+ Clock = Patch2->LCDClk_12Bit;
else
- ModeInfo->Clock = Patch2->VClk_12Bit;
+ Clock = Patch2->VClk_12Bit;
} else {
if (pVia->IsSecondary)
- ModeInfo->Clock = Patch2->LCDClk;
+ Clock = Patch2->LCDClk;
else
- ModeInfo->Clock = Patch2->VClk;
+ Clock = Patch2->VClk;
}
break;
}
@@ -1250,16 +1254,17 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
if (pVia->IsSecondary) {
for (i = 0; i < numPatch1; i++, Patch1++) {
if (Patch1->Mode == modeNum) {
- for (j = 0; j < Patch1->numEntry; j++) {
+ for (j = 0; j < Patch1->numEntry; j++)
ViaVgahwWrite(hwp, 0x300 + Patch1->port[j], Patch1->offset[j],
0x301 + Patch1->port[j], Patch1->data[j]);
- }
break;
}
}
}
}
+ ModeInfo->PanelClock = Clock;
+
/* LCD patch 3D5.02 */
misc = hwp->readCrtc(hwp, 0x01);
hwp->writeCrtc(hwp, 0x02, misc);
@@ -1299,6 +1304,8 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
}
hwp->writeCrtc(hwp, 0x6A, 0xC8);
}
+
+ ModeInfo->PanelPower(pScrn, TRUE);
}
/*
@@ -1565,7 +1572,6 @@ ViaModePrimary(ScrnInfoPtr pScrn, DisplayModePtr mode)
hwp->writeCrtc(hwp, 0x93, 0x00);
ViaModePrimaryVGA(pScrn, mode);
- ModeInfo->Clock = ViaModeDotClockTranslate(pScrn, mode);
/* Don't do this before the Sequencer is set: locks up VT7205 and VT3108 */
if (pVia->FirstInit)
@@ -1577,11 +1583,10 @@ ViaModePrimary(ScrnInfoPtr pScrn, DisplayModePtr mode)
if (!ModeInfo->CrtActive)
ViaCrtcMask(hwp, 0x36, 0x30, 0x30);
- if (ModeInfo->PanelActive && ViaPanelGetIndex(pScrn, mode)) {
- VIASetLCDMode(pScrn, mode);
- ViaLCDPower(pScrn, TRUE);
- } else if (ModeInfo->PanelPresent)
- ViaLCDPower(pScrn, FALSE);
+ if (ModeInfo->PanelActive)
+ 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
@@ -1629,7 +1634,11 @@ ViaModePrimary(ScrnInfoPtr pScrn, DisplayModePtr mode)
else
ViaSetPrimaryDotclock(pScrn, 0x871C);
} else {
- ViaSetPrimaryDotclock(pScrn, ModeInfo->Clock);
+ if (ModeInfo->PanelActive)
+ ViaSetPrimaryDotclock(pScrn, ModeInfo->PanelClock);
+ else
+ ViaSetPrimaryDotclock(pScrn, ViaModeDotClockTranslate(pScrn, mode));
+
ViaSetUseExternalClock(hwp);
ViaCrtcMask(hwp, 0x6B, 0x00, 0x01);
}
@@ -1801,16 +1810,17 @@ ViaModeSecondary(ScrnInfoPtr pScrn, DisplayModePtr mode)
if ((pVia->Chipset != VT3122) || (pVia->ChipRev != 0x02))
ViaCrtcMask(hwp, 0x6C, 0x00, 0x1E);
- if (ModeInfo->PanelActive && (ModeInfo->PanelIndex != VIA_BIOS_NUM_PANEL)) {
- ModeInfo->SetDVI = TRUE;
- VIASetLCDMode(pScrn, mode);
- ViaLCDPower(pScrn, TRUE);
- } else if (ModeInfo->PanelPresent)
- ViaLCDPower(pScrn, FALSE);
+ if (ModeInfo->PanelActive)
+ ModeInfo->PanelMode(pScrn, mode);
+ else if (ModeInfo->PanelPresent)
+ ModeInfo->PanelPower(pScrn, FALSE);
ViaSetSecondaryFIFO(pScrn, mode);
- ViaSetSecondaryDotclock(pScrn, ModeInfo->Clock);
+ if (ModeInfo->PanelActive)
+ ViaSetSecondaryDotclock(pScrn, ModeInfo->PanelClock);
+ else
+ ViaSetSecondaryDotclock(pScrn, ViaModeDotClockTranslate(pScrn, mode));
ViaSetUseExternalClock(hwp);
ViaCrtcMask(hwp, 0x17, 0x80, 0x80);
@@ -1822,7 +1832,7 @@ ViaModeSecondary(ScrnInfoPtr pScrn, DisplayModePtr mode)
*
*/
static void
-ViaLCDPowerSequence(vgaHWPtr hwp, VIALCDPowerSeqRec Sequence)
+ViaPanelPowerSequence(vgaHWPtr hwp, VIALCDPowerSeqRec Sequence)
{
int i;
@@ -1837,8 +1847,8 @@ ViaLCDPowerSequence(vgaHWPtr hwp, VIALCDPowerSeqRec Sequence)
/*
*
*/
-void
-ViaLCDPower(ScrnInfoPtr pScrn, Bool On)
+static void
+ViaPanelPower(ScrnInfoPtr pScrn, Bool On)
{
vgaHWPtr hwp = VGAHWPTR(pScrn);
VIAPtr pVia = VIAPTR(pScrn);
@@ -1867,8 +1877,30 @@ ViaLCDPower(ScrnInfoPtr pScrn, Bool On)
usleep(1);
if (On)
- ViaLCDPowerSequence(hwp, powerOn[i]);
+ ViaPanelPowerSequence(hwp, powerOn[i]);
else
- ViaLCDPowerSequence(hwp, powerOff[i]);
+ ViaPanelPowerSequence(hwp, powerOff[i]);
usleep(1);
}
+
+/*
+ * future: I2CDevPtr for LVDS encoders.
+ */
+Bool
+ViaPanelInit(ScrnInfoPtr pScrn, I2CDevPtr pDev)
+{
+ struct ViaModeInfo *ModeInfo = VIAPTR(pScrn)->ModeInfo;
+
+ VIAFUNC(pScrn->scrnIndex);
+
+ if (pDev)
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: Ignoring I2C Device"
+ " passed.\n", __func__);
+
+ ModeInfo->PanelModeValid = ViaPanelModeValid;
+ ModeInfo->PanelMode = ViaPanelMode;
+ ModeInfo->PanelPower = ViaPanelPower;
+ ModeInfo->PanelModes = ViaPanelModes;
+
+ return TRUE;
+}
diff --git a/src/via_mode.h b/src/via_mode.h
index c1681a6..f73c163 100644
--- a/src/via_mode.h
+++ b/src/via_mode.h
@@ -56,8 +56,6 @@ struct ViaModeInfo {
Bool CrtPresent;
Bool CrtActive;
- CARD16 ResolutionIndex;
- CARD32 Clock; /* register value for the dotclock */
CARD32 Bandwidth; /* available memory bandwidth */
/* Panel/LCD entries */
@@ -65,16 +63,20 @@ struct ViaModeInfo {
Bool PanelActive;
Bool ForcePanel;
int PanelIndex;
+ CARD16 PanelResolutionIndex;
int PanelSize;
Bool LCDDualEdge; /* mean add-on card is 2CH or Dual or DDR */
Bool Center;
CARD8 BusWidth; /* Digital Output Bus Width */
- Bool SetDVI;
- /* LCD Simultaneous Expand Mode HWCursor Y Scale */
- Bool scaleY;
int panelX;
int panelY;
- int resY;
+ CARD32 PanelClock;
+
+ DisplayModePtr PanelModes;
+
+ ModeStatus (*PanelModeValid) (ScrnInfoPtr pScrn, DisplayModePtr mode);
+ void (*PanelMode) (ScrnInfoPtr pScrn, DisplayModePtr mode);
+ void (*PanelPower) (ScrnInfoPtr pScrn, Bool On);
/* TV entries */
int TVOutput;
@@ -88,6 +90,8 @@ struct ViaModeInfo {
int TVEncoder;
CARD8 TVRegs[0xFF];
+ DisplayModePtr TVModes;
+
/* Actual TV Callbacks */
void (*TVSave) (ScrnInfoPtr pScrn);
void (*TVRestore) (ScrnInfoPtr pScrn);
@@ -95,7 +99,6 @@ struct ViaModeInfo {
ModeStatus (*TVModeValid) (ScrnInfoPtr pScrn, DisplayModePtr mode);
void (*TVMode) (ScrnInfoPtr pScrn, DisplayModePtr mode);
void (*TVPower) (ScrnInfoPtr pScrn, Bool On);
- DisplayModePtr TVModes;
void (*TVPrintRegs) (ScrnInfoPtr pScrn);
};
@@ -107,7 +110,6 @@ 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 ViaLCDPower(ScrnInfoPtr pScrn, Bool On);
void ViaTVPower(ScrnInfoPtr pScrn, Bool On);
void ViaTVSave(ScrnInfoPtr pScrn);
void ViaTVRestore(ScrnInfoPtr pScrn);
diff --git a/src/via_panel.h b/src/via_panel.h
index a3f6cda..4d49ed3 100644
--- a/src/via_panel.h
+++ b/src/via_panel.h
@@ -94,7 +94,7 @@ static struct {
int PanelIndex;
int X;
int Y;
-} ViaResolutionTable[] = {
+} ViaPanelResolutionTable[] = {
{VIA_RES_640X480, VIA_PANEL6X4, 640, 480},
{VIA_RES_800X600, VIA_PANEL8X6, 800, 600},
{VIA_RES_1024X768, VIA_PANEL10X7, 1024, 768},
@@ -121,7 +121,7 @@ static struct {
CARD8 mode_8b;
CARD8 mode_16b;
CARD8 mode_32b;
-} ViaVesaModes[] = {
+} ViaPanelVesaModes[] = {
{ 400, 300, 0x22, 0x23, 0x24 },
{ 512, 384, 0x25, 0x26, 0x27 },
{ 640, 400, 0x30, 0x2E, 0x2F },