extractedLnx/linux-2.4.25/drivers/video/sis/init301.c_SiS_EnableBridge.c
void
SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
{
USHORT temp=0,tempah;
#ifdef SIS315H
USHORT temp1,pushax=0;
BOOLEAN delaylong = FALSE;
#endif
if(SiS_Pr->SiS_VBType & VB_SISVB) {
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) { /* ====== For 301B et al ====== */
if(HwInfo->jChipType < SIS_315H) {
#ifdef SIS300 /* 300 series */
if(HwInfo->jChipType == SIS_300) {
if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
if(!(SiS_CR36BIOSWord23d(SiS_Pr, HwInfo))) {
SiS_PanelDelay(SiS_Pr, HwInfo, 0);
}
}
}
temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32) & 0xDF; /* lock mode */
if(SiS_BridgeInSlave(SiS_Pr)) {
tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
if(!(tempah & SetCRT2ToRAMDAC)) temp |= 0x20;
}
SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1F,0x20); /* enable VB processor */
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0);
SiS_DisplayOn(SiS_Pr);
if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwInfo))) {
SiS_PanelDelay(SiS_Pr, HwInfo, 1);
}
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
}
}
}
} else {
if((SiS_Pr->SiS_VBType & VB_NoLCD) &&
(SiS_CRT2IsLCD(SiS_Pr, HwInfo))) {
/* This is only for LCD output on 301B-DH via LVDS */
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xFB);
if(!(SiS_CR36BIOSWord23d(SiS_Pr,HwInfo))) {
SiS_PanelDelay(SiS_Pr, HwInfo, 0);
}
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* Enable CRT2 */
SiS_DisplayOn(SiS_Pr);
SiS_UnLockCRT2(SiS_Pr,HwInfo);
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x02,0xBF);
if(SiS_BridgeInSlave(SiS_Pr)) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x01,0x1F);
} else {
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0x1F,0x40);
}
if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwInfo))) {
SiS_PanelDelay(SiS_Pr, HwInfo, 1);
}
SiS_WaitVBRetrace(SiS_Pr,HwInfo);
SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x00);
}
}
} else {
temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32) & 0xDF; /* lock mode */
if(SiS_BridgeInSlave(SiS_Pr)) {
tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
if(!(tempah & SetCRT2ToRAMDAC)) temp |= 0x20;
}
SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1F,0x20); /* enable VB processor */
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0);
SiS_DisplayOn(SiS_Pr);
}
}
#endif /* SIS300 */
} else {
#ifdef SIS315H /* 315 series */
if(IS_SIS550650740660) { /* 550, 650, 740, 660 */
UCHAR r30=0, r31=0, r32=0, r33=0, cr36=0;
if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
if((SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) &&
(SiS_Pr->SiS_CustomT != CUT_CLEVO1400)) {
SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,0xef);
#ifdef SET_EMI
if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
SiS_SetReg(SiS_Pr->SiS_Part4Port,0x30,0x00);
}
#endif
}
if(!(SiS_IsNotM650orLater(SiS_Pr,HwInfo))) {
tempah = 0x10;
if((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
(SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x13) & 0x04) {
if((SiS_GetReg(SiS_Pr->SiS_Part2Port,0x00) & 0x0f) == 0x0c) {
tempah = 0x08;
} else {
tempah = 0x18;
}
}
SiS_SetReg(SiS_Pr->SiS_Part1Port,0x4c,tempah);
} else {
if(SiS_IsVAMode(SiS_Pr,HwInfo)) {
tempah = 0x08;
}
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,tempah);
}
}
if((SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) &&
(SiS_Pr->SiS_CustomT != CUT_CLEVO1400)) {
SiS_SetRegByte(SiS_Pr->SiS_P3c6,0x00);
SiS_DisplayOff(SiS_Pr);
pushax = SiS_GetReg(SiS_Pr->SiS_P3c4,0x06);
if(IS_SIS740) {
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3);
}
}
if( (SiS_IsVAMode(SiS_Pr,HwInfo)) ||
(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) ) {
if(!(SiS_GetReg(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) {
if((SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) &&
(SiS_Pr->SiS_CustomT != CUT_CLEVO1400)) {
SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 2);
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
SiS_GenericDelay(SiS_Pr, 0x4500);
}
SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 2);
} else {
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
SiS_PanelDelay(SiS_Pr, HwInfo, 0);
}
}
}
if((SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) &&
(SiS_Pr->SiS_CustomT != CUT_CLEVO1400)) {
if(!(SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) & 0x40)) {
SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 10);
delaylong = TRUE;
}
}
} else if(SiS_Pr->SiS_VBType & VB_NoLCD) {
if(!(SiS_IsNotM650orLater(SiS_Pr,HwInfo))) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,0x10);
}
} else if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
if(!(SiS_IsNotM650orLater(SiS_Pr,HwInfo))) {
tempah = 0x10;
if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x13) & 0x04) {
tempah = 0x18;
if((SiS_GetReg(SiS_Pr->SiS_Part2Port,0x00) & 0x0f) == 0x0c) {
tempah = 0x08;
}
}
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,tempah);
}
}
if(!(SiS_IsVAMode(SiS_Pr,HwInfo))) {
temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
if(SiS_BridgeInSlave(SiS_Pr)) {
tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
if(!(tempah & SetCRT2ToRAMDAC)) {
if((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
(SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
if(!(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x13) & 0x04)) temp |= 0x20;
} else temp |= 0x20;
}
}
SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* enable CRT2 */
if((SiS_Pr->SiS_VBType & VB_SIS301B302B) ||
(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
(SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2e);
if(!(temp & 0x80)) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x80);
}
} else {
SiS_PanelDelay(SiS_Pr, HwInfo, 2);
}
} else {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x20);
}
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1f,0x20);
if((SiS_Pr->SiS_VBType & VB_SIS301B302B) ||
(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
(SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2e);
if(!(temp & 0x80)) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x80);
}
}
tempah = 0xc0;
if(SiS_IsDualEdge(SiS_Pr, HwInfo)) {
tempah = 0x80;
if(!(SiS_IsVAMode(SiS_Pr, HwInfo))) {
tempah = 0x40;
}
}
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,tempah);
if((SiS_Pr->SiS_VBType & VB_SIS301B302B) ||
(((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
(SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) &&
(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))))) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
}
if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
if((SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) &&
(SiS_Pr->SiS_CustomT != CUT_CLEVO1400)) {
SiS_PanelDelay(SiS_Pr, HwInfo, 2);
}
#ifdef COMPAQ_HACK
if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
SiS_PanelDelay(SiS_Pr, HwInfo, 2);
}
#endif
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1f,0x10);
if(SiS_Pr->SiS_CustomT != CUT_CLEVO1400) {
#ifdef SET_EMI
if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
SiS_SetReg(SiS_Pr->SiS_Part4Port,0x30,0x00);
}
#endif
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x0c);
#ifdef SET_EMI
if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
cr36 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36);
/* (P4_30|0x40) */
/* Compal 1400x1050: 0x05, 0x60, 0x00 YES (1.10.7w; CR36=69) */
/* Compal 1400x1050: 0x0d, 0x70, 0x40 YES (1.10.7x; CR36=69) */
/* Acer 1280x1024: 0x12, 0xd0, 0x6b NO (1.10.9k; CR36=73) */
/* Compaq 1280x1024: 0x0d, 0x70, 0x6b YES (1.12.04b; CR36=03) */
/* Clevo 1024x768: 0x05, 0x60, 0x33 NO (1.10.8e; CR36=12, DL!) */
/* Clevo 1024x768: 0x0d, 0x70, 0x40 (if type == 3) YES (1.10.8y; CR36=?2) */
/* Clevo 1024x768: 0x05, 0x60, 0x33 (if type != 3) YES (1.10.8y; CR36=?2) */
/* Asus 1024x768: ? ? (1.10.8o; CR36=?2) */
/* Asus 1024x768: 0x08, 0x10, 0x3c (problematic) YES (1.10.8q; CR36=22) */
if(SiS_Pr->HaveEMI) {
r30 = SiS_Pr->EMI_30;
r31 = SiS_Pr->EMI_31;
r32 = SiS_Pr->EMI_32;
r33 = SiS_Pr->EMI_33;
} else {
r30 = 0;
}
/* EMI_30 is read at driver start; however, the BIOS sets this
* (if it is used) only if the LCD is in use. In case we caught
* the machine while on TV output, this bit is not set and we
* don't know if it should be set - hence our detection is wrong.
* Work-around this here:
*/
if((!SiS_Pr->HaveEMI) || (!SiS_Pr->HaveEMILCD)) {
if((cr36 & 0x0f) == 0x02) { /* 1024x768 */
r30 |= 0x40;
if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) {
r30 &= ~0x40;
}
} else if((cr36 & 0x0f) == 0x03) { /* 1280x1024 */
r30 |= 0x40;
if(SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) {
r30 &= ~0x40;
}
} else if((cr36 & 0x0f) == 0x09) { /* 1400x1050 */
r30 |= 0x40;
} else if((cr36 & 0x0f) == 0x0b) { /* 1600x1200 - unknown */
r30 |= 0x40;
}
}
if(!SiS_Pr->HaveEMI) {
if((cr36 & 0x0f) == 0x02) {
if((cr36 & 0xf0) == 0x30) {
r31 = 0x0d; r32 = 0x70; r33 = 0x40;
} else {
r31 = 0x05; r32 = 0x60; r33 = 0x33;
}
} else if((cr36 & 0x0f) == 0x03) {
if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
r31 = 0x0d; r32 = 0x70; r33 = 0x6b;
} else {
r31 = 0x12; r32 = 0xd0; r33 = 0x6b;
}
} else if((cr36 & 0x0f) == 0x09) {
if(SiS_Pr->SiS_CustomT == CUT_COMPAL1400_2) {
r31 = 0x0d; r32 = 0x70; r33 = 0x40; /* BIOS values */
} else {
r31 = 0x05; r32 = 0x60; r33 = 0x00;
}
} else {
r31 = 0x05; r32 = 0x60; r33 = 0x00;
}
}
/* BIOS values don't work so well sometimes */
if(!SiS_Pr->OverruleEMI) {
#ifdef COMPAL_HACK
if(SiS_Pr->SiS_CustomT == CUT_COMPAL1400_2) {
if((cr36 & 0x0f) == 0x09) {
r30 = 0x60; r31 = 0x05; r32 = 0x60; r33 = 0x00;
}
}
#endif
#ifdef COMPAQ_HACK
if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
if((cr36 & 0x0f) == 0x03) {
r30 = 0x20; r31 = 0x12; r32 = 0xd0; r33 = 0x6b; /* rev 1 */
}
}
#endif
#ifdef ASUS_HACK
if(SiS_Pr->SiS_CustomT == CUT_ASUSA2H_2) {
if((cr36 & 0x0f) == 0x02) {
/* r30 = 0x60; r31 = 0x05; r32 = 0x60; r33 = 0x33; */ /* rev 2 */
/* r30 = 0x20; r31 = 0x05; r32 = 0x60; r33 = 0x33; */ /* rev 3 */
/* r30 = 0x60; r31 = 0x0d; r32 = 0x70; r33 = 0x40; */ /* rev 4 */
/* r30 = 0x20; r31 = 0x0d; r32 = 0x70; r33 = 0x40; */ /* rev 5 */
}
}
#endif
}
if(!(SiS_Pr->OverruleEMI && (!r30) && (!r31) && (!r32) && (!r33))) {
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20);
}
SiS_SetReg(SiS_Pr->SiS_Part4Port,0x31,r31);
SiS_SetReg(SiS_Pr->SiS_Part4Port,0x32,r32);
SiS_SetReg(SiS_Pr->SiS_Part4Port,0x33,r33);
if(!(SiS_Pr->OverruleEMI && (!r30) && (!r31) && (!r32) && (!r33))) {
SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x10);
} else {
SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x00);
}
if( (SiS_IsVAMode(SiS_Pr,HwInfo)) ||
(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) ) {
if(r30 & 0x40) {
SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 5);
if(delaylong) {
SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 5);
delaylong = FALSE;
}
SiS_WaitVBRetrace(SiS_Pr,HwInfo);
if(SiS_Pr->SiS_CustomT == CUT_ASUSA2H_2) {
SiS_GenericDelay(SiS_Pr, 0x500);
}
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40);
}
}
}
#endif
}
if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
if( (SiS_IsVAMode(SiS_Pr,HwInfo)) ||
(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) ) {
SiS_DisplayOn(SiS_Pr);
SiS_PanelDelay(SiS_Pr, HwInfo, 1);
SiS_WaitVBRetrace(SiS_Pr, HwInfo);
SiS_PanelDelay(SiS_Pr, HwInfo, 3);
if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
}
}
} else if(SiS_Pr->SiS_CustomT == CUT_CLEVO1400) {
if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
if( (SiS_IsVAMode(SiS_Pr, HwInfo)) ||
(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) ) {
SiS_DisplayOn(SiS_Pr);
SiS_PanelDelay(SiS_Pr, HwInfo, 1);
SiS_WaitVBRetrace(SiS_Pr,HwInfo);
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
}
}
} else {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x80);
if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
if( (SiS_IsVAMode(SiS_Pr,HwInfo)) ||
((SiS_CRT2IsLCD(SiS_Pr, HwInfo))) ) {
SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 10);
if(delaylong) {
SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 10);
}
SiS_WaitVBRetrace(SiS_Pr,HwInfo);
if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
SiS_GenericDelay(SiS_Pr, 0x500);
}
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
}
}
SiS_SetReg(SiS_Pr->SiS_P3c4,0x06,pushax);
SiS_DisplayOn(SiS_Pr);
SiS_SetRegByte(SiS_Pr->SiS_P3c6,0xff);
if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
}
}
}
} else { /* 315, 330 */
if(!(SiS_IsVAMode(SiS_Pr,HwInfo))) {
temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
if(SiS_BridgeInSlave(SiS_Pr)) {
tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
if(!(tempah & SetCRT2ToRAMDAC)) temp |= 0x20;
}
SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* enable CRT2 */
temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2E);
if(!(temp & 0x80))
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
}
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1f,0x20);
if(SiS_Is301B(SiS_Pr)) {
temp=SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2E);
if(!(temp & 0x80))
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
tempah = 0xc0;
if(SiS_IsDualEdge(SiS_Pr,HwInfo)) {
tempah = 0x80;
if(!(SiS_IsVAMode(SiS_Pr,HwInfo))) {
tempah = 0x40;
}
}
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,tempah);
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
} else {
SiS_VBLongWait(SiS_Pr);
SiS_DisplayOn(SiS_Pr);
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7F);
SiS_VBLongWait(SiS_Pr);
}
} /* 315, 330 */
#endif /* SIS315H */
}
} else { /* ============ For 301 ================ */
if(HwInfo->jChipType < SIS_315H) {
if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xFB);
SiS_PanelDelay(SiS_Pr, HwInfo, 0);
}
}
temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32) & 0xDF; /* lock mode */
if(SiS_BridgeInSlave(SiS_Pr)) {
tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
if(!(tempah & SetCRT2ToRAMDAC)) temp |= 0x20;
}
SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* enable CRT2 */
if(HwInfo->jChipType >= SIS_315H) {
temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2E);
if(!(temp & 0x80)) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80); /* BVBDOENABLE=1 */
}
}
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1F,0x20); /* enable VB processor */
SiS_VBLongWait(SiS_Pr);
SiS_DisplayOn(SiS_Pr);
if(HwInfo->jChipType >= SIS_315H) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
}
SiS_VBLongWait(SiS_Pr);
if(HwInfo->jChipType < SIS_315H) {
if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
SiS_PanelDelay(SiS_Pr, HwInfo, 1);
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xF7);
}
}
}
} else { /* =================== For LVDS ================== */
if(HwInfo->jChipType < SIS_315H) {
#ifdef SIS300 /* 300 series */
if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
if(HwInfo->jChipType == SIS_730) {
SiS_PanelDelay(SiS_Pr, HwInfo, 1);
SiS_PanelDelay(SiS_Pr, HwInfo, 1);
SiS_PanelDelay(SiS_Pr, HwInfo, 1);
}
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xFB);
if(!(SiS_CR36BIOSWord23d(SiS_Pr,HwInfo))) {
SiS_PanelDelay(SiS_Pr, HwInfo, 0);
}
}
SiS_EnableCRT2(SiS_Pr);
SiS_DisplayOn(SiS_Pr);
SiS_UnLockCRT2(SiS_Pr,HwInfo);
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x02,0xBF);
if(SiS_BridgeInSlave(SiS_Pr)) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x01,0x1F);
} else {
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0x1F,0x40);
}
if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
if(!(SiS_CRT2IsLCD(SiS_Pr, HwInfo))) {
SiS_WaitVBRetrace(SiS_Pr, HwInfo);
SiS_SetCH700x(SiS_Pr,0x0B0E);
}
}
if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwInfo))) {
SiS_PanelDelay(SiS_Pr, HwInfo, 1);
SiS_PanelDelay(SiS_Pr, HwInfo, 1);
}
SiS_WaitVBRetrace(SiS_Pr, HwInfo);
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xF7);
}
}
}
#endif /* SIS300 */
} else {
#ifdef SIS315H /* 315 series */
if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xFB);
SiS_PanelDelay(SiS_Pr, HwInfo, 0);
}
}
SiS_EnableCRT2(SiS_Pr);
SiS_UnLockCRT2(SiS_Pr,HwInfo);
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
temp = SiS_GetCH701x(SiS_Pr,0x66);
temp &= 0x20;
SiS_Chrontel701xBLOff(SiS_Pr);
}
if(HwInfo->jChipType != SIS_550) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
}
if(HwInfo->jChipType == SIS_740) {
if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
if(SiS_IsLCDOrLCDA(SiS_Pr, HwInfo)) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
}
}
}
temp1 = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2E);
if(!(temp1 & 0x80)) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
}
if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
if(temp) {
SiS_Chrontel701xBLOn(SiS_Pr, HwInfo);
}
}
if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
if(HwInfo->jChipType == SIS_550) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x40);
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x10);
}
}
} else if(SiS_IsVAMode(SiS_Pr,HwInfo)) {
if(HwInfo->jChipType != SIS_740) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
}
}
if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
}
if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
if(SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwInfo)) {
SiS_Chrontel701xOn(SiS_Pr,HwInfo);
}
if( (SiS_IsVAMode(SiS_Pr,HwInfo)) ||
(SiS_IsLCDOrLCDA(SiS_Pr,HwInfo)) ) {
SiS_ChrontelDoSomething1(SiS_Pr,HwInfo);
}
}
if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
if( (SiS_IsVAMode(SiS_Pr,HwInfo)) ||
(SiS_IsLCDOrLCDA(SiS_Pr,HwInfo)) ) {
SiS_Chrontel701xBLOn(SiS_Pr, HwInfo);
SiS_ChrontelInitTVVSync(SiS_Pr,HwInfo);
}
}
} else if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
SiS_PanelDelay(SiS_Pr, HwInfo, 1);
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xF7);
}
}
}
#endif /* SIS315H */
} /* 310 series */
} /* LVDS */
}
Generated by GNU enscript 1.6.4.