diff options
author | Luc Verhaegen <libv@skynet.be> | 2005-12-02 11:07:52 +0000 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2005-12-02 11:07:52 +0000 |
commit | 520948f9e08eb6bf0431dfaddf1302e6280cc6f5 (patch) | |
tree | d3bbb3ea2c13f6ed3b42715b6965a40fb572ec02 | |
parent | 9a092d7f50870192f919bc3e339c5fa07b8362b6 (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.c | 6 | ||||
-rw-r--r-- | src/via_mode.c | 280 | ||||
-rw-r--r-- | src/via_mode.h | 18 | ||||
-rw-r--r-- | src/via_panel.h | 4 |
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 }, |