patch-2.4.19 linux-2.4.19/drivers/video/sis/init301.c

Next file: linux-2.4.19/drivers/video/sis/init301.h
Previous file: linux-2.4.19/drivers/video/sis/init.h
Back to the patch index
Back to the overall index

diff -urN linux-2.4.18/drivers/video/sis/init301.c linux-2.4.19/drivers/video/sis/init301.c
@@ -1,5406 +1,5195 @@
 /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.c,v 1.3 2000/12/02 01:16:16 dawes Exp $ */
 
+/*
+ * Mode switching code (CRT2 section) for SiS 300/540/630/730/315/550/650/740
+ * (Universal module for Linux kernel framebuffer, XFree86 4.x)
+ *
+ * Comments and changes marked with "TW" by Thomas Winischhofer <thomer@winischhofer.net>
+ *
+ */
+
+/* DEBUG: GetVCLK2Ptr (Mitac bug) - reverted */
+
+/*
+#ifdef WINCE_HEADER
+#include "precomp.h"
+#endif
+*/
+/*#include "precomp.h"*/
+
 #include "init301.h"
-#ifdef CONFIG_FB_SIS_300
+#ifdef SIS300
 #include "oem300.h"
 #endif
-#ifdef CONFIG_FB_SIS_315
+#ifdef SIS315H
 #include "oem310.h"
 #endif
 
 BOOLEAN
-SiS_SetCRT2Group301 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
-		     PSIS_HW_DEVICE_INFO HwDeviceExtension)
+SiS_SetCRT2Group301(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo,
+                    PSIS_HW_DEVICE_INFO HwDeviceExtension)
 {
-	USHORT ModeIdIndex;
-	USHORT RefreshRateTableIndex;
-
-	SiS_SetFlag = SiS_SetFlag | ProgrammingCRT2;
-	SiS_SearchModeID (ROMAddr, ModeNo, &ModeIdIndex);
-	SiS_SelectCRT2Rate = 4;
-	RefreshRateTableIndex =
-	    SiS_GetRatePtrCRT2 (ROMAddr, ModeNo, ModeIdIndex);
-	SiS_SaveCRT2Info (ModeNo);
-	SiS_DisableBridge (HwDeviceExtension, BaseAddr);
-	SiS_UnLockCRT2 (HwDeviceExtension, BaseAddr);
-	SiS_SetCRT2ModeRegs (BaseAddr, ModeNo, HwDeviceExtension);
-	if (SiS_VBInfo & DisableCRT2Display) {
-		SiS_LockCRT2 (HwDeviceExtension, BaseAddr);
-		SiS_DisplayOn ();
-		return (FALSE);
-	}
-/* SetDefCRT2ExtRegs(BaseAddr);   */
-	SiS_GetCRT2Data (ROMAddr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
-	/*301b */
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-	    && (SiS_VBInfo & SetCRT2ToLCDA)) {
-		SiS_GetLVDSDesData (ROMAddr, ModeNo, ModeIdIndex,
-				    RefreshRateTableIndex);
-	}
-	/*end 301b */
-	if (SiS_IF_DEF_LVDS == 1) {
-		SiS_GetLVDSDesData (ROMAddr, ModeNo, ModeIdIndex,
-				    RefreshRateTableIndex);
-	}
-
-	SiS_SetGroup1 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
-		       HwDeviceExtension, RefreshRateTableIndex);
-	/*301b */
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-	    && (SiS_VBInfo & SetCRT2ToLCDA) && (SiS_IF_DEF_LVDS == 0)) {
-	} else if (SiS_IF_DEF_LVDS == 0 && (!(SiS_VBInfo & SetCRT2ToLCDA))) {
-		SiS_SetGroup2 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
-			       RefreshRateTableIndex, HwDeviceExtension);
-		SiS_SetGroup3 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
-			       HwDeviceExtension);
-		SiS_SetGroup4 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
-			       RefreshRateTableIndex, HwDeviceExtension);
-		SiS_SetGroup5 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex);
-	} else {
-		if (SiS_IF_DEF_CH7005 == 1) {
-			SiS_SetCHTVReg (ROMAddr, ModeNo, ModeIdIndex,
-					RefreshRateTableIndex);
-		}
-		SiS_ModCRT1CRTC (ROMAddr, ModeNo, ModeIdIndex,
-				 RefreshRateTableIndex);
-		SiS_SetCRT2ECLK (ROMAddr, ModeNo, ModeIdIndex,
-				 RefreshRateTableIndex, HwDeviceExtension);
-	}
-
-#ifdef CONFIG_FB_SIS_300
-	if ((HwDeviceExtension->jChipType == SIS_540) ||
-	    (HwDeviceExtension->jChipType == SIS_630) ||
-	    (HwDeviceExtension->jChipType == SIS_730) ||
-	    (HwDeviceExtension->jChipType == SIS_300))
-		SiS_OEM300Setting (HwDeviceExtension, BaseAddr, ROMAddr,
-				   ModeNo);
+   USHORT ModeIdIndex;
+   USHORT RefreshRateTableIndex;
 
+   SiS_SetFlag=SiS_SetFlag|ProgrammingCRT2;
+   SiS_SearchModeID(ROMAddr,ModeNo,&ModeIdIndex);
+   SiS_SelectCRT2Rate=4;
+   RefreshRateTableIndex = SiS_GetRatePtrCRT2(ROMAddr,ModeNo,ModeIdIndex);
+   SiS_SaveCRT2Info(ModeNo);
+   SiS_DisableBridge(HwDeviceExtension,BaseAddr);
+   SiS_UnLockCRT2(HwDeviceExtension, BaseAddr);
+   SiS_SetCRT2ModeRegs(BaseAddr,ModeNo,HwDeviceExtension);
+   if(SiS_VBInfo&DisableCRT2Display) {
+     SiS_LockCRT2(HwDeviceExtension, BaseAddr);
+     SiS_DisplayOn();
+     return(FALSE);
+   }
+   /* SetDefCRT2ExtRegs(BaseAddr);   */
+   SiS_GetCRT2Data(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex);
+   /*301b*/
+   if( ((SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS301LV))
+           && (SiS_VBInfo&SetCRT2ToLCDA)) ){
+	SiS_GetLVDSDesData(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex);
+   }
+   /*end 301b*/
+   if(SiS_IF_DEF_LVDS==1) {
+   	SiS_GetLVDSDesData(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex);
+   }
+
+   SiS_SetGroup1(BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+                 HwDeviceExtension,RefreshRateTableIndex);
+
+   /*301b*/
+   if( (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS301LV))
+   		&& (SiS_VBInfo&SetCRT2ToLCDA)
+		&& (SiS_IF_DEF_LVDS == 0) ) {
+     	if( (SiS_VBType&(VB_SIS301LV|VB_SIS302LV)) && (SiS_VBInfo&SetCRT2ToLCDA) ){
+             	SiS_SetReg1(SiS_Part4Port,0x24,0x0e);
+    	}
+   /* end 301b */
+   } else if((SiS_IF_DEF_LVDS==0) && (!(SiS_VBInfo&SetCRT2ToLCDA))) {
+      	SiS_SetGroup2(BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+	              RefreshRateTableIndex,HwDeviceExtension);
+      	SiS_SetGroup3(BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+	              HwDeviceExtension);
+      	SiS_SetGroup4(BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+	              RefreshRateTableIndex,HwDeviceExtension);
+      	SiS_SetGroup5(BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+   } else {
+     	if(SiS_IF_DEF_CH7005==1) {
+	    if(SiS_VBInfo&SetCRT2ToTV)
+	        /* TW: Set Chrontel registers only if CRT2 is TV */
+       		SiS_SetCHTVReg(ROMAddr,ModeNo,ModeIdIndex,
+		               RefreshRateTableIndex);
+     	}
+     	if(!(SiS_LCDResInfo==Panel640x480)){
+    	 	SiS_ModCRT1CRTC(ROMAddr,ModeNo,ModeIdIndex,
+		                RefreshRateTableIndex);
+         	if(!SiS_IF_DEF_FSTN)  /*fstn*/
+     	     		SiS_SetCRT2ECLK(ROMAddr,ModeNo,ModeIdIndex,
+			          RefreshRateTableIndex,HwDeviceExtension);
+     	}
+   }
+
+#ifdef SIS300
+   if ( (HwDeviceExtension->jChipType==SIS_540)||
+        (HwDeviceExtension->jChipType==SIS_630)||
+        (HwDeviceExtension->jChipType==SIS_730)||
+        (HwDeviceExtension->jChipType==SIS_300) )
+     	SiS_OEM300Setting(HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
 #endif
 
-#ifdef CONFIG_FB_SIS_315
-	if ((HwDeviceExtension->jChipType == SIS_315H) ||	/* 05/02/01 ynlai for sis550 */
-	    (HwDeviceExtension->jChipType == SIS_315PRO) ||
-	    (HwDeviceExtension->jChipType == SIS_550) ||	/* 05/02/01 ynlai for 550 */
-	    (HwDeviceExtension->jChipType == SIS_640) ||	/* 08/20/01 chiawen for 640/740 */
-	    (HwDeviceExtension->jChipType == SIS_740)) {	/* 09/03/01 chiawen for 640/740 */
-		SiS_OEM310Setting (HwDeviceExtension, BaseAddr, ROMAddr, ModeNo,
-				   ModeIdIndex);
-		SiS_CRT2AutoThreshold (BaseAddr);
-	}
+#ifdef SIS315H
+   if ( (HwDeviceExtension->jChipType==SIS_315H)||   /* 05/02/01 ynlai for sis550 */
+        (HwDeviceExtension->jChipType==SIS_315PRO)||
+        (HwDeviceExtension->jChipType==SIS_550) ||   /* 05/02/01 ynlai for 550 */
+        (HwDeviceExtension->jChipType==SIS_640) ||   /* 08/20/01 chiawen for 640/740 */
+        (HwDeviceExtension->jChipType==SIS_740) ||   /* 09/03/01 chiawen for 640/740 */
+        (HwDeviceExtension->jChipType==SIS_650))     /* 09/03/01 chiawen for 650 */
+   {
+        SiS_OEM310Setting(HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+        SiS_CRT2AutoThreshold(BaseAddr);
+   }
 #endif
 
-	SiS_EnableBridge (HwDeviceExtension, BaseAddr);
-	SiS_DisplayOn ();
-	SiS_LockCRT2 (HwDeviceExtension, BaseAddr);
-	return 1;
-}
-
-void
-SiS_SetGroup1 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
-	       USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,
-	       USHORT RefreshRateTableIndex)
-{
-	USHORT temp = 0, tempax = 0, tempbx = 0, tempcx = 0;
-	USHORT pushbx = 0, CRT1Index = 0;
-	USHORT modeflag, resinfo = 0;
-
-	if (ModeNo <= 0x13) {
-	} else {
-		CRT1Index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
-		CRT1Index = CRT1Index & 0x3F;
-		resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
-	}
-
-	/*301b */
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-	    && (SiS_VBInfo & SetCRT2ToLCDA)) {
-	} else {
-		SiS_SetCRT2Offset (SiS_Part1Port, ROMAddr, ModeNo, ModeIdIndex,
-				   RefreshRateTableIndex, HwDeviceExtension);
-		if (HwDeviceExtension->jChipType < SIS_315H)	/* 300 series */
-			SiS_SetCRT2FIFO (SiS_Part1Port, ROMAddr, ModeNo,
-					 HwDeviceExtension);
-		else		/* 310 series */
-			SiS_SetCRT2FIFO2 (SiS_Part1Port, ROMAddr, ModeNo,
-					  HwDeviceExtension);
-
-		SiS_SetCRT2Sync (BaseAddr, ROMAddr, ModeNo,
-				 RefreshRateTableIndex);
-	}
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
-	}
-	/*301b */
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-	    && (SiS_VBInfo & SetCRT2ToLCDA)) {
-		SiS_SetGroup1_LCDA (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
-				    HwDeviceExtension, RefreshRateTableIndex);
-	}
-	/*end 301b */
-	else if (HwDeviceExtension->jChipType < SIS_315H) {	/* 300 series */
-		temp = (SiS_VGAHT - 1) & 0x0FF;	/* BTVGA2HT 0x08,0x09 */
-		SiS_SetReg1 (SiS_Part1Port, 0x08, temp);
-		temp = (((SiS_VGAHT - 1) & 0xFF00) >> 8) << 4;
-		SiS_SetRegANDOR (SiS_Part1Port, 0x09, ~0x0F0, temp);
-
-		temp = (SiS_VGAHDE + 12) & 0x0FF;	/* BTVGA2HDEE 0x0A,0x0C */
-		SiS_SetReg1 (SiS_Part1Port, 0x0A, temp);
-
-		pushbx = SiS_VGAHDE + 12;	/* bx  BTVGA@HRS 0x0B,0x0C */
-		tempcx = (SiS_VGAHT - SiS_VGAHDE) >> 2;	/* cx */
-		tempbx = pushbx + tempcx;
-		tempcx = tempcx << 1;
-		tempcx = tempcx + tempbx;
-
-		if (SiS_IF_DEF_LVDS == 0) {
-			if (SiS_VBInfo & SetCRT2ToRAMDAC) {
-				tempbx = SiS_CRT1Table[CRT1Index].CR[4];
-				tempbx =
-				    tempbx |
-				    ((SiS_CRT1Table[CRT1Index].CR[14] & 0xC0) <<
-				     2);
-				tempbx = (tempbx - 1) << 3;
-				tempcx = SiS_CRT1Table[CRT1Index].CR[5];
-				tempcx = tempcx & 0x1F;
-				temp = SiS_CRT1Table[CRT1Index].CR[15];
-				temp = (temp & 0x04) << (6 - 2);
-				tempcx = ((tempcx | temp) - 1) << 3;
-			}
-		}
-		/*add for hardware request */
-		if ((SiS_VBInfo & SetCRT2ToTV) && (resinfo == 0x08)) {
-			if (SiS_VBInfo & SetPALTV) {
-				tempbx = 1040;
-				tempcx = 1042;
-			} else {
-				tempbx = 1040;
-				tempcx = 1042;
-			}
-		}
-
-		temp = tempbx & 0x00FF;
-		SiS_SetReg1 (SiS_Part1Port, 0x0B, temp);
-
-	} else {		/* 310 series */
-
-		if (modeflag & HalfDCLK) {	/* for low resolution mode */
-			temp = (SiS_VGAHT / 2 - 1) & 0x0FF;	/* BTVGA2HT 0x08,0x09 */
-			SiS_SetReg1 (SiS_Part1Port, 0x08, temp);
-			temp = (((SiS_VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
-			SiS_SetRegANDOR (SiS_Part1Port, 0x09, ~0x0F0, temp);
-			temp = (SiS_VGAHDE / 2 + 16) & 0x0FF;	/* BTVGA2HDEE 0x0A,0x0C */
-			SiS_SetReg1 (SiS_Part1Port, 0x0A, temp);
-
-			pushbx = SiS_VGAHDE / 2 + 16;
-			tempcx = ((SiS_VGAHT - SiS_VGAHDE) / 2) >> 2;	/* cx */
-			tempbx = pushbx + tempcx;	/* bx  BTVGA@HRS 0x0B,0x0C */
-			tempcx = tempcx + tempbx;
-
-			if (SiS_IF_DEF_LVDS == 0) {
-				if (SiS_VBInfo & SetCRT2ToRAMDAC) {
-					tempbx = SiS_CRT1Table[CRT1Index].CR[4];
-					tempbx =
-					    tempbx |
-					    ((SiS_CRT1Table
-					      [CRT1Index].CR[14] & 0xC0) << 2);
-					tempbx = (tempbx - 3) << 3;	/*(VGAHRS-3)*8 */
-					tempcx = SiS_CRT1Table[CRT1Index].CR[5];
-					tempcx = tempcx & 0x1F;
-					temp = SiS_CRT1Table[CRT1Index].CR[15];
-					temp = (temp & 0x04) << (5 - 2);	/*VGAHRE D[5] */
-					tempcx = ((tempcx | temp) - 3) << 3;	/* (VGAHRE-3)*8 */
-				}
-			}
-			tempbx += 4;
-			tempcx += 4;
-			if (tempcx > (SiS_VGAHT / 2))
-				tempcx = SiS_VGAHT / 2;
-			temp = tempbx & 0x00FF;
-			SiS_SetReg1 (SiS_Part1Port, 0x0B, temp);
-
-		} else {
-			temp = (SiS_VGAHT - 1) & 0x0FF;	/* BTVGA2HT 0x08,0x09 */
-			SiS_SetReg1 (SiS_Part1Port, 0x08, temp);
-			temp = (((SiS_VGAHT - 1) & 0xFF00) >> 8) << 4;
-			SiS_SetRegANDOR (SiS_Part1Port, 0x09, ~0x0F0, temp);
-			temp = (SiS_VGAHDE + 16) & 0x0FF;	/* BTVGA2HDEE 0x0A,0x0C */
-			SiS_SetReg1 (SiS_Part1Port, 0x0A, temp);
-
-			pushbx = SiS_VGAHDE + 16;
-			tempcx = (SiS_VGAHT - SiS_VGAHDE) >> 2;	/* cx */
-			tempbx = pushbx + tempcx;	/* bx  BTVGA@HRS 0x0B,0x0C */
-			tempcx = tempcx + tempbx;
-
-			if (SiS_IF_DEF_LVDS == 0) {
-				if (SiS_VBInfo & SetCRT2ToRAMDAC) {
-					tempbx = SiS_CRT1Table[CRT1Index].CR[4];
-					tempbx =
-					    tempbx |
-					    ((SiS_CRT1Table
-					      [CRT1Index].CR[14] & 0xC0) << 2);
-					tempbx = (tempbx - 3) << 3;	/*(VGAHRS-3)*8 */
-					tempcx = SiS_CRT1Table[CRT1Index].CR[5];
-					tempcx = tempcx & 0x1F;
-					temp = SiS_CRT1Table[CRT1Index].CR[15];
-					temp = (temp & 0x04) << (5 - 2);	/*VGAHRE D[5] */
-					tempcx = ((tempcx | temp) - 3) << 3;	/* (VGAHRE-3)*8 */
-					tempbx += 16;
-					tempcx += 16;
-
-				}
-			}
-			if (tempcx > SiS_VGAHT)
-				tempcx = SiS_VGAHT;
-			/*add for hardware request */
-			if ((SiS_VBInfo & SetCRT2ToTV) && (resinfo == 0x08)) {
-				if (SiS_VBInfo & SetPALTV) {
-					tempbx = 1040;
-					tempcx = 1042;
-				} else {
-					tempbx = 1040;
-					tempcx = 1042;
-				}
-			}
-			temp = tempbx & 0x00FF;
-			SiS_SetReg1 (SiS_Part1Port, 0x0B, temp);
-		}
-
-	}
-
-	tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
-	tempbx = pushbx;
-	tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
-	tempax = tempax | (tempbx & 0xFF00);
-	temp = (tempax & 0xFF00) >> 8;
-	SiS_SetReg1 (SiS_Part1Port, 0x0C, temp);
-	temp = tempcx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x0D, temp);
-	tempcx = (SiS_VGAVT - 1);
-	temp = tempcx & 0x00FF;
-	if (SiS_IF_DEF_CH7005 == 1) {
-		if (SiS_VBInfo & 0x0C) {
-			temp--;
-		}
-	}
-	SiS_SetReg1 (SiS_Part1Port, 0x0E, temp);
-	tempbx = SiS_VGAVDE - 1;
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x0F, temp);
-	temp = ((tempbx & 0xFF00) << 3) >> 8;
-	temp = temp | ((tempcx & 0xFF00) >> 8);
-	SiS_SetReg1 (SiS_Part1Port, 0x12, temp);
-
-	tempax = SiS_VGAVDE;
-	tempbx = SiS_VGAVDE;
-	tempcx = SiS_VGAVT;
-	tempbx = (SiS_VGAVT + SiS_VGAVDE) >> 1;	/*      BTVGA2VRS     0x10,0x11   */
-	tempcx = ((SiS_VGAVT - SiS_VGAVDE) >> 4) + tempbx + 1;	/*      BTVGA2VRE     0x11        */
-	if (SiS_IF_DEF_LVDS == 0) {
-		if (SiS_VBInfo & SetCRT2ToRAMDAC) {
-			tempbx = SiS_CRT1Table[CRT1Index].CR[8];
-			temp = SiS_CRT1Table[CRT1Index].CR[7];
-			if (temp & 0x04)
-				tempbx = tempbx | 0x0100;
-			if (temp & 0x080)
-				tempbx = tempbx | 0x0200;
-			temp = SiS_CRT1Table[CRT1Index].CR[13];
-			if (temp & 0x08)
-				tempbx = tempbx | 0x0400;
-			temp = SiS_CRT1Table[CRT1Index].CR[9];
-			tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
-		}
-	}
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x10, temp);
-	temp = ((tempbx & 0xFF00) >> 8) << 4;
-	temp = ((tempcx & 0x000F) | (temp));
-	SiS_SetReg1 (SiS_Part1Port, 0x11, temp);
-	if (SiS_IF_DEF_LVDS == 0) {
-		temp = 0x20;
-		if (SiS_LCDResInfo == Panel1280x1024)
-			temp = 0x20;
-		if (SiS_LCDResInfo == Panel1280x960)
-			temp = 0x24;
-		if (SiS_VBInfo & SetCRT2ToTV)
-			temp = 0x08;
-		if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
-			if (SiS_VBInfo & SetInSlaveMode)
-				temp = 0x2c;
-			else
-				temp = 0x20;
-		}
-	} else {
-		temp = 0x20;
-	}
-	if (HwDeviceExtension->jChipType < SIS_315H)	/* 300 series */
-		SiS_SetRegANDOR (SiS_Part1Port, 0x13, ~0x03C, temp);
-	else {			/* 310 series */
-
-		temp >>= 2;
-		temp = 0x11;	/*  ynlai 05/30/2001 for delay compenation  */
-		SiS_SetReg1 (SiS_Part1Port, 0x2D, temp);
-		/*SiS_SetRegANDOR(SiS_Part1Port,0x2D,~0x00F,temp); */
-		SiS_SetRegAND (SiS_Part1Port, 0x13, 0xEF);	/* BDirectLCD=0 for lcd ?? */
-		tempax = 0;
-
-		if (modeflag & DoubleScanMode)
-			tempax |= 0x80;
-		if (modeflag & HalfDCLK)
-			tempax |= 0x40;
-		SiS_SetRegANDOR (SiS_Part1Port, 0x2C, ~0x0C0, tempax);
-
-	}
-
-	if (SiS_IF_DEF_LVDS == 0) {	/*  301  */
-		SiS_SetGroup1_301 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
-				   HwDeviceExtension, RefreshRateTableIndex);
-	} else {		/*  LVDS  */
-		SiS_SetGroup1_LVDS (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
-				    HwDeviceExtension, RefreshRateTableIndex);
-	}
-}
-
-void
-SiS_SetGroup1_301 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
-		   USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,
-		   USHORT RefreshRateTableIndex)
-{
-	USHORT push1, push2;
-	USHORT tempax, tempbx, tempcx, temp;
-	USHORT resinfo, modeflag;
-	USHORT CRT1Index;
-
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ResInfo */
-		resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+Ext_ResInfo */
-		resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
-		CRT1Index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
-		CRT1Index = CRT1Index & 0x3F;
-	}
-
-	if (!(SiS_VBInfo & SetInSlaveMode)) {
-		return;
-	}
-	tempax = 0xFFFF;
-	if (!(SiS_VBInfo & SetCRT2ToTV)) {
-		tempax = SiS_GetVGAHT2 ();
-	}
-	if (modeflag & Charx8Dot)
-		tempcx = 0x08;
-	else
-		tempcx = 0x09;
-	if (tempax >= SiS_VGAHT) {
-		tempax = SiS_VGAHT;
-	}
-	if (modeflag & HalfDCLK) {
-		tempax = tempax >> 1;
-	}
-	tempax = (tempax / tempcx) - 5;
-	tempbx = tempax;
-	temp = 0xFF;		/* set MAX HT */
-	SiS_SetReg1 (SiS_Part1Port, 0x03, temp);
-
-	tempax = SiS_VGAHDE;	/* 0x04 Horizontal Display End */
-	if (modeflag & HalfDCLK)
-		tempax = tempax >> 1;
-	tempax = (tempax / tempcx) - 1;
-	tempbx = tempbx | ((tempax & 0x00FF) << 8);
-	temp = tempax & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x04, temp);
-
-	temp = (tempbx & 0xFF00) >> 8;
-	if (SiS_VBInfo & SetCRT2ToTV) {
-		temp = temp + 2;
-		if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
-			if (resinfo == 7)
-				temp = temp - 2;
-		}
-	}
-	SiS_SetReg1 (SiS_Part1Port, 0x05, temp);	/* 0x05 Horizontal Display Start */
-	SiS_SetReg1 (SiS_Part1Port, 0x06, 0x03);	/* 0x06 Horizontal Blank end     */
-	/* 0x07 horizontal Retrace Start */
-	if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
-		temp = (tempbx & 0x00FF) - 1;
-		if (!(modeflag & HalfDCLK)) {
-			temp = temp - 6;
-			if (SiS_SetFlag & TVSimuMode) {
-				temp = temp - 4;
-				if (ModeNo > 0x13)
-					temp = temp - 10;
-			}
-		}
-	} else {
-		tempcx = tempbx & 0x00FF;
-		tempbx = (tempbx & 0xFF00) >> 8;
-		tempcx = (tempcx + tempbx) >> 1;
-		temp = (tempcx & 0x00FF) + 2;
-		if (SiS_VBInfo & SetCRT2ToTV) {
-			temp = temp - 1;
-			if (!(modeflag & HalfDCLK)) {
-				if ((modeflag & Charx8Dot)) {
-					temp = temp + 4;
-					if (SiS_VGAHDE >= 800) {
-						temp = temp - 6;
-					}
-				}
-			}
-		} else {
-			if (!(modeflag & HalfDCLK)) {
-				temp = temp - 4;
-				if (SiS_LCDResInfo != Panel1280x960) {
-					if (SiS_VGAHDE >= 800) {
-						temp = temp - 7;
-						if (SiS_ModeType == ModeEGA) {
-							if (SiS_VGAVDE == 1024) {
-								temp =
-								    temp + 15;
-								if
-								    (SiS_LCDResInfo
-								     !=
-								     Panel1280x1024)
-								{
-									temp =
-									    temp
-									    + 7;
-								}
-							}
-						}
-						if (SiS_VGAHDE >= 1280) {
-							if (SiS_LCDResInfo !=
-							    Panel1280x960) {
-								if (SiS_LCDInfo
-								    &
-								    LCDNonExpanding)
-								{
-									temp =
-									    temp
-									    +
-									    28;
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-
-	SiS_SetReg1 (SiS_Part1Port, 0x07, temp);	/* 0x07 Horizontal Retrace Start */
-	SiS_SetReg1 (SiS_Part1Port, 0x08, 0);	/* 0x08 Horizontal Retrace End   */
-
-	if (SiS_VBInfo & SetCRT2ToTV) {
-		if (SiS_SetFlag & TVSimuMode) {
-			if ((ModeNo == 0x06) || (ModeNo == 0x10)
-			    || (ModeNo == 0x11) || (ModeNo == 0x13)
-			    || (ModeNo == 0x0F)) {
-				SiS_SetReg1 (SiS_Part1Port, 0x07, 0x5b);
-				SiS_SetReg1 (SiS_Part1Port, 0x08, 0x03);
-			}
-			if ((ModeNo == 0x00) || (ModeNo == 0x01)) {
-				if (SiS_VBInfo & SetNTSCTV) {
-					SiS_SetReg1 (SiS_Part1Port, 0x07, 0x2A);
-					SiS_SetReg1 (SiS_Part1Port, 0x08, 0x61);
-				} else {
-					SiS_SetReg1 (SiS_Part1Port, 0x07, 0x2A);
-					SiS_SetReg1 (SiS_Part1Port, 0x08, 0x41);
-					SiS_SetReg1 (SiS_Part1Port, 0x0C, 0xF0);
-				}
-			}
-			if ((ModeNo == 0x02) || (ModeNo == 0x03)
-			    || (ModeNo == 0x07)) {
-				if (SiS_VBInfo & SetNTSCTV) {
-					SiS_SetReg1 (SiS_Part1Port, 0x07, 0x54);
-					SiS_SetReg1 (SiS_Part1Port, 0x08, 0x00);
-				} else {
-					SiS_SetReg1 (SiS_Part1Port, 0x07, 0x55);
-					SiS_SetReg1 (SiS_Part1Port, 0x08, 0x00);
-					SiS_SetReg1 (SiS_Part1Port, 0x0C, 0xF0);
-				}
-			}
-			if ((ModeNo == 0x04) || (ModeNo == 0x05)
-			    || (ModeNo == 0x0D) || (ModeNo == 0x50)) {
-				if (SiS_VBInfo & SetNTSCTV) {
-					SiS_SetReg1 (SiS_Part1Port, 0x07, 0x30);
-					SiS_SetReg1 (SiS_Part1Port, 0x08, 0x03);
-				} else {
-					SiS_SetReg1 (SiS_Part1Port, 0x07, 0x2f);
-					SiS_SetReg1 (SiS_Part1Port, 0x08, 0x02);
-				}
-			}
-		}
-	}
-
-	SiS_SetReg1 (SiS_Part1Port, 0x18, 0x03);	/* 0x18 SR08                     */
-	SiS_SetRegANDOR (SiS_Part1Port, 0x19, 0xF0, 0x00);
-	SiS_SetReg1 (SiS_Part1Port, 0x09, 0xFF);	/* 0x09 Set Max VT               */
-
-	tempbx = SiS_VGAVT;
-	push1 = tempbx;
-	tempcx = 0x121;
-	tempbx = SiS_VGAVDE;	/* 0x0E Virtical Display End */
-	if (tempbx == 357)
-		tempbx = 350;
-	if (tempbx == 360)
-		tempbx = 350;
-	if (tempbx == 375)
-		tempbx = 350;
-	if (tempbx == 405)
-		tempbx = 400;
-	if (tempbx == 420)
-		tempbx = 400;
-	if (tempbx == 525)
-		tempbx = 480;
-	push2 = tempbx;
-	if (SiS_VBInfo & SetCRT2ToLCD) {
-		if (SiS_LCDResInfo == Panel1024x768) {
-			if (!(SiS_SetFlag & LCDVESATiming)) {
-				if (tempbx == 350)
-					tempbx = tempbx + 5;
-				if (tempbx == 480)
-					tempbx = tempbx + 5;
-			}
-		}
-	}
-	tempbx--;
-	temp = tempbx & 0x00FF;
-	tempbx--;
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x10, temp);	/* 0x10 vertical Blank Start */
-	tempbx = push2;
-	tempbx--;
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x0E, temp);
-	if (tempbx & 0x0100) {
-		tempcx = tempcx | 0x0002;
-	}
-	tempax = 0x000B;
-	if (modeflag & DoubleScanMode) {
-		tempax = tempax | 0x08000;
-	}
-	if (tempbx & 0x0200) {
-		tempcx = tempcx | 0x0040;
-	}
-
-	temp = (tempax & 0xFF00) >> 8;
-	SiS_SetReg1 (SiS_Part1Port, 0x0B, temp);
-	if (tempbx & 0x0400) {
-		tempcx = tempcx | 0x0600;
-	}
-	SiS_SetReg1 (SiS_Part1Port, 0x11, 0x00);	/* 0x11 Vertival Blank End */
-
-	tempax = push1;
-	tempax = tempax - tempbx;	/* 0x0C Vertical Retrace Start */
-	tempax = tempax >> 2;
-	push1 = tempax;		/* push ax */
-
-	if (resinfo != 0x09) {
-		tempax = tempax << 1;
-		tempbx = tempax + tempbx;
-	}
-	if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
-		tempbx = tempbx - 10;
-	} else {
-		if (SiS_SetFlag & TVSimuMode) {
-			if (SiS_VBInfo & SetPALTV) {
-				tempbx = tempbx + 40;
-			}
-		}
-	}
-	tempax = push1;
-	tempax = tempax >> 2;
-	tempax++;
-	tempax = tempax + tempbx;
-	push1 = tempax;		/* push ax  */
-	if ((SiS_VBInfo & SetPALTV)) {
-		if (tempbx <= 513) {
-			if (tempax >= 513) {
-				tempbx = 513;
-			}
-		}
-	}
-	temp = (tempbx & 0x00FF);
-	SiS_SetReg1 (SiS_Part1Port, 0x0C, temp);
-	tempbx--;
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x10, temp);
-	if (tempbx & 0x0100) {
-		tempcx = tempcx | 0x0008;
-	}
-	if (tempbx & 0x0200) {
-		SiS_SetRegANDOR (SiS_Part1Port, 0x0B, 0x0FF, 0x20);
-	}
-	tempbx++;
-	if (tempbx & 0x0100) {
-		tempcx = tempcx | 0x0004;
-	}
-	if (tempbx & 0x0200) {
-		tempcx = tempcx | 0x0080;
-	}
-	if (tempbx & 0x0400) {
-		tempcx = tempcx | 0x0C00;
-	}
-
-	tempbx = push1;		/* pop ax */
-	temp = tempbx & 0x00FF;
-	temp = temp & 0x0F;
-	SiS_SetReg1 (SiS_Part1Port, 0x0D, temp);	/* 0x0D vertical Retrace End */
-	if (tempbx & 0x0010) {
-		tempcx = tempcx | 0x2000;
-	}
-
-	temp = tempcx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x0A, temp);	/* 0x0A CR07 */
-	temp = (tempcx & 0x0FF00) >> 8;
-	SiS_SetReg1 (SiS_Part1Port, 0x17, temp);	/* 0x17 SR0A */
-	tempax = modeflag;
-	temp = (tempax & 0xFF00) >> 8;
-
-	temp = (temp >> 1) & 0x09;
-	SiS_SetReg1 (SiS_Part1Port, 0x16, temp);	/* 0x16 SR01 */
-	SiS_SetReg1 (SiS_Part1Port, 0x0F, 0);	/* 0x0F CR14 */
-	SiS_SetReg1 (SiS_Part1Port, 0x12, 0);	/* 0x12 CR17 */
-	if (SiS_LCDInfo & LCDRGB18Bit)
-		temp = 0x80;
-	else
-		temp = 0x00;
-	SiS_SetReg1 (SiS_Part1Port, 0x1A, temp);	/* 0x1A SR0E */
-	return;
-}
-
-void
-SiS_SetGroup1_LVDS (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
-		    USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,
-		    USHORT RefreshRateTableIndex)
-{
-	USHORT modeflag, resinfo;
-	USHORT push1, push2, tempax, tempbx, tempcx, temp, pushcx;
-	ULONG tempeax = 0, tempebx, tempecx, tempvcfact = 0;
-
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ResInfo */
-		resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+Ext_ResInfo */
-		resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
-	}
-
-	tempax = SiS_LCDHDES;
-	tempbx = SiS_HDE;
-	tempcx = SiS_HT;
-	tempcx = tempcx - tempbx;	/* HT-HDE  */
-	if (SiS_LCDInfo & LCDNonExpanding) {
-		if (SiS_LCDResInfo == Panel800x600)
-			tempbx = 800;
-		if (SiS_LCDResInfo == Panel1024x768)
-			tempbx = 1024;
-	}
-	push1 = tempax;
-	tempax = tempax + tempbx;	/* lcdhdee  */
-	tempbx = SiS_HT;
-	if (tempax >= tempbx) {
-		tempax = tempax - tempbx;
-	}
-	push2 = tempax;
-	/* push ax   lcdhdee  */
-	tempcx = tempcx >> 2;	/* temp  */
-	tempcx = tempcx + tempax;	/* lcdhrs  */
-	if (tempcx >= tempbx) {
-		tempcx = tempcx - tempbx;
-	}
-	/* v ah,cl  */
-	tempax = tempcx;
-	tempax = tempax >> 3;	/* BPLHRS */
-	temp = tempax & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x14, temp);	/* Part1_14h  */
-	temp = (tempax & 0x00FF) + 10;
-	temp = temp & 0x01F;
-	temp = temp | (((tempcx & 0x00ff) & 0x07) << 5);
-	SiS_SetReg1 (SiS_Part1Port, 0x15, temp);	/* Part1_15h  */
-	tempbx = push2;		/* lcdhdee  */
-	tempcx = push1;		/* lcdhdes  */
-	temp = (tempcx & 0x00FF);
-	temp = temp & 0x07;	/* BPLHDESKEW  */
-	SiS_SetReg1 (SiS_Part1Port, 0x1A, temp);	/* Part1_1Ah  */
-	tempcx = tempcx >> 3;	/* BPLHDES */
-	temp = (tempcx & 0x00FF);
-	SiS_SetReg1 (SiS_Part1Port, 0x16, temp);	/* Part1_16h  */
-	if (tempbx & 0x07)
-		tempbx = tempbx + 8;
-	tempbx = tempbx >> 3;	/* BPLHDEE  */
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x17, temp);	/* Part1_17h  */
-
-	tempcx = SiS_VGAVT;
-	tempbx = SiS_VGAVDE;
-	tempcx = tempcx - tempbx;	/* GAVT-VGAVDE  */
-	tempbx = SiS_LCDVDES;	/* VGAVDES  */
-	push1 = tempbx;		/* push bx temppush1 */
-	if (SiS_IF_DEF_TRUMPION == 0) {
-		if (SiS_IF_DEF_CH7005 == 1) {
-			if (SiS_VBInfo & SetCRT2ToTV) {
-				tempax = SiS_VGAVDE;
-			}
-		}
-		if (SiS_VBInfo & SetCRT2ToLCD) {
-			if (SiS_LCDResInfo == Panel800x600)
-				tempax = 600;
-			if (SiS_LCDResInfo == Panel1024x768)
-				tempax = 768;
-		}
-	} else
-		tempax = SiS_VGAVDE;
-	tempbx = tempbx + tempax;
-	tempax = SiS_VT;	/* VT  */
-	if (tempbx >= SiS_VT) {
-		tempbx = tempbx - tempax;
-	}
-	push2 = tempbx;		/* push bx  temppush2  */
-	tempcx = tempcx >> 1;
-	tempbx = tempbx + tempcx;
-	tempbx++;		/* BPLVRS  */
-	if (tempbx >= tempax) {
-		tempbx = tempbx - tempax;
-	}
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x18, temp);	/* Part1_18h  */
-	tempcx = tempcx >> 3;
-	tempcx = tempcx + tempbx;
-	tempcx++;		/* BPLVRE  */
-	temp = tempcx & 0x00FF;
-	temp = temp & 0x0F;
-	SiS_SetRegANDOR (SiS_Part1Port, 0x19, ~0x00F, temp);	/* Part1_19h  */
-	temp = (tempbx & 0xFF00) >> 8;
-	temp = temp & 0x07;
-	temp = temp << 3;	/* BPLDESKEW =0 */
-	tempbx = SiS_VGAVDE;
-	if (tempbx != SiS_VDE) {
-		temp = temp | 0x40;
-	}
-	if (SiS_SetFlag & EnableLVDSDDA) {
-		temp = temp | 0x40;
-	}
-	if (SiS_LCDInfo & LCDRGB18Bit) {
-		temp = temp | 0x80;
-	}
-	SiS_SetRegANDOR (SiS_Part1Port, 0x1A, 0x07, temp);	/* Part1_1Ah */
-
-	tempecx = SiS_VGAVT;
-	tempebx = SiS_VDE;
-	tempeax = SiS_VGAVDE;
-	tempecx = tempecx - tempeax;	/* VGAVT-VGAVDE  */
-	tempeax = tempeax << 6;
-	temp = (USHORT) (tempeax % tempebx);
-	tempeax = tempeax / tempebx;
-	if (temp != 0) {
-		tempeax++;
-	}
-	tempebx = tempeax;	/* BPLVCFACT  */
-	if (SiS_SetFlag & EnableLVDSDDA) {
-		tempebx = tempebx & 0x003F;
-	}
-	temp = (USHORT) (tempebx & 0x00FF);
-	SiS_SetReg1 (SiS_Part1Port, 0x1E, temp);	/* Part1_1Eh */
-
-	/*add for 301b different 301 */
-	if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
-		tempecx = SiS_VGAVT;
-		tempebx = SiS_VDE;
-		tempeax = SiS_VGAVDE;
-		tempecx = tempecx - tempeax;	/* VGAVT-VGAVDE  */
-		tempeax = tempeax << 18;
-		temp = (USHORT) (tempeax % tempebx);
-		tempeax = tempeax / tempebx;
-		if (temp != 0) {
-			tempeax++;
-		}
-		tempebx = tempeax;	/* BPLVCFACT  */
-		tempvcfact = tempeax;	/*301b */
-		temp = (USHORT) (tempebx & 0x00FF);
-		SiS_SetReg1 (SiS_Part1Port, 0x37, temp);
-		temp = (USHORT) ((tempebx & 0x00FF00) >> 8);
-		SiS_SetReg1 (SiS_Part1Port, 0x36, temp);
-		temp = (USHORT) ((tempebx & 0x00030000) >> 16);
-		if (SiS_VDE == SiS_VGAVDE) {
-			temp = temp | 0x04;
-		}
-
-		SiS_SetReg1 (SiS_Part1Port, 0x35, temp);
-	}
-	/*end for 301b */
-
-	tempbx = push2;		/* p bx temppush2 BPLVDEE  */
-	tempcx = push1;		/* pop cx temppush1 NPLVDES */
-	push1 = (USHORT) (tempeax & 0xFFFF);
-	if (!(SiS_VBInfo & SetInSlaveMode)) {
-		if (SiS_LCDResInfo == Panel800x600) {
-			if (resinfo == 7)
-				tempcx++;
-		} else {
-			if (SiS_LCDResInfo == Panel1024x768) {
-				if (resinfo == 8)
-					tempcx++;
-			}
-		}
-	}
+   SiS_EnableBridge(HwDeviceExtension,BaseAddr);
+   if(SiS_IF_DEF_CH7005==1) {
+	if(SiS_VBInfo&SetCRT2ToTV) {
+	     /* TW: Disable LCD panel when using TV */
+	     SiS_SetRegANDOR(SiS_P3c4,0x11,0xFF,0x0C);
+	} else {
+	     /* TW: Disable TV when using LCD */
+	     SiS_SetCHTVRegANDOR(0x010E,0xF8);
+	}
+   }
+   SiS_DisplayOn();
+   SiS_LockCRT2(HwDeviceExtension, BaseAddr);
+   return 1;
+}
+
+void
+SiS_SetGroup1(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+              PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex)
+{
+  USHORT  temp=0,tempax=0,tempbx=0,tempcx=0;
+  USHORT  pushbx=0,CRT1Index=0;
+  USHORT  modeflag,resinfo=0;
+
+  if(ModeNo<=0x13) {
+  	/* TW: Do nothing for std modes */
+  } else {
+    	CRT1Index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
+    	CRT1Index=CRT1Index&0x3F;
+    	resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+  }
+
+  /*301b*/ 
+  if( (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+         && (SiS_VBInfo&SetCRT2ToLCDA) ) {
+	   /* TW: Do nothing for these bridge types here */
+  } else {
+     SiS_SetCRT2Offset(SiS_Part1Port,ROMAddr,ModeNo,ModeIdIndex,
+      		       RefreshRateTableIndex,HwDeviceExtension);
+     if (HwDeviceExtension->jChipType < SIS_315H ) /* 300 series */
+    	   SiS_SetCRT2FIFO(SiS_Part1Port,ROMAddr,ModeNo,
+	                   HwDeviceExtension);
+     else 					   /* 310 series */
+           SiS_SetCRT2FIFO2(SiS_Part1Port,ROMAddr,ModeNo,
+	                   HwDeviceExtension);
+
+     SiS_SetCRT2Sync(BaseAddr,ROMAddr,ModeNo,
+                     RefreshRateTableIndex);
+  }
+
+  if (ModeNo<=0x13)
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+  else
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+
+  /*301b*/
+  if( (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+   					&& (SiS_VBInfo&SetCRT2ToLCDA) ) {
+     	SiS_SetGroup1_LCDA(BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+     	                   HwDeviceExtension,RefreshRateTableIndex);
+  /*end 301b*/
+  } else if (HwDeviceExtension->jChipType < SIS_315H ) {
+    /* ------------- 300 series --------------*/
+    temp=(SiS_VGAHT-1)&0x0FF;   					/* BTVGA2HT 0x08,0x09 */
+    SiS_SetReg1(SiS_Part1Port,0x08,temp);
+    temp=(((SiS_VGAHT-1)&0xFF00)>>8)<<4;
+    SiS_SetRegANDOR(SiS_Part1Port,0x09,~0x0F0,temp); 	/* <------------------- */
+
+    temp=(SiS_VGAHDE+12)&0x0FF;                               		/* BTVGA2HDEE 0x0A,0x0C */
+    SiS_SetReg1(SiS_Part1Port,0x0A,temp); 		/* <------------------- */
+        
+    pushbx=SiS_VGAHDE+12;                                     		/* bx  BTVGA@HRS 0x0B,0x0C */
+    tempcx=(SiS_VGAHT-SiS_VGAHDE)>>2;                           	/* cx */
+    tempbx=pushbx+tempcx;
+    tempcx=tempcx<<1;
+    tempcx=tempcx+tempbx;
+    
+    if(SiS_IF_DEF_LVDS==0) {
+      if(SiS_VBInfo&SetCRT2ToRAMDAC){
+        tempbx = SiS_CRT1Table[CRT1Index].CR[4];
+        tempbx = tempbx|((SiS_CRT1Table[CRT1Index].CR[14]&0xC0)<<2);
+        tempbx = (tempbx-1)<<3;
+        tempcx = SiS_CRT1Table[CRT1Index].CR[5];
+        tempcx = tempcx&0x1F;
+        temp = SiS_CRT1Table[CRT1Index].CR[15];
+        temp = (temp&0x04)<<(6-2);
+        tempcx=((tempcx|temp)-1)<<3;
+      }
+    }
+   /*add for hardware request*/
+    if((SiS_VBInfo&SetCRT2ToTV)&&(resinfo==0x08)){
+        if(SiS_VBInfo&SetPALTV){
+      		tempbx=1040;
+      		tempcx=1042;
+      	} else {
+      		tempbx=1040;
+      		tempcx=1042;
+      	}
+    }
+
+    temp=tempbx&0x00FF;
+    SiS_SetReg1(SiS_Part1Port,0x0B,temp); 		/* <------------------- */
+    
+  } else {
+     /* ---------------------- 310 series ------------------*/
+     if (modeflag&HalfDCLK) { /* for low resolution mode */
+         temp=(SiS_VGAHT/2-1)&0x0FF;                             /* BTVGA2HT 0x08,0x09 */
+         SiS_SetReg1(SiS_Part1Port,0x08,temp);
+         temp=(((SiS_VGAHT/2-1)&0xFF00)>>8)<<4;
+         SiS_SetRegANDOR(SiS_Part1Port,0x09,~0x0F0,temp);
+         temp=(SiS_VGAHDE/2+16)&0x0FF;                           /* BTVGA2HDEE 0x0A,0x0C */
+         SiS_SetReg1(SiS_Part1Port,0x0A,temp);
+
+         pushbx=SiS_VGAHDE/2+16;
+         tempcx=((SiS_VGAHT-SiS_VGAHDE)/2)>>2;                   /* cx */
+         tempbx=pushbx+tempcx;                                   /* bx  BTVGA@HRS 0x0B,0x0C */
+         tempcx=tempcx+tempbx;
+
+         if(SiS_IF_DEF_LVDS==0) {
+             if(SiS_VBInfo&SetCRT2ToRAMDAC){
+                tempbx = SiS_CRT1Table[CRT1Index].CR[4];
+                tempbx = tempbx|((SiS_CRT1Table[CRT1Index].CR[14]&0xC0)<<2);
+                tempbx = (tempbx-3)<<3;         		/*(VGAHRS-3)*8 */
+                tempcx = SiS_CRT1Table[CRT1Index].CR[5];
+                tempcx = tempcx&0x1F;
+                temp = SiS_CRT1Table[CRT1Index].CR[15];
+                temp = (temp&0x04)<<(5-2);      		/*VGAHRE D[5]*/
+                tempcx=((tempcx|temp)-3)<<3;    		/* (VGAHRE-3)*8 */
+             }
+         }
+         tempbx += 4;
+         tempcx += 4;
+         if (tempcx>(SiS_VGAHT/2))
+              tempcx = SiS_VGAHT/2;
+         temp=tempbx&0x00FF;
+         SiS_SetReg1(SiS_Part1Port,0x0B,temp);
+    } else {
+         temp=(SiS_VGAHT-1)&0x0FF;                             	/* BTVGA2HT 0x08,0x09 */
+         SiS_SetReg1(SiS_Part1Port,0x08,temp);
+         temp=(((SiS_VGAHT-1)&0xFF00)>>8)<<4;
+         SiS_SetRegANDOR(SiS_Part1Port,0x09,~0x0F0,temp);
+         temp=(SiS_VGAHDE+16)&0x0FF;                            /* BTVGA2HDEE 0x0A,0x0C */
+         SiS_SetReg1(SiS_Part1Port,0x0A,temp);
+
+         pushbx=SiS_VGAHDE+16;
+         tempcx=(SiS_VGAHT-SiS_VGAHDE)>>2;                      /* cx */
+         tempbx=pushbx+tempcx;                                  /* bx  BTVGA@HRS 0x0B,0x0C */
+         tempcx=tempcx+tempbx;
+      
+         if(SiS_IF_DEF_LVDS==0) {
+             if(SiS_VBInfo&SetCRT2ToRAMDAC){
+                tempbx = SiS_CRT1Table[CRT1Index].CR[4];
+                tempbx = tempbx|((SiS_CRT1Table[CRT1Index].CR[14]&0xC0)<<2);
+                tempbx = (tempbx-3)<<3;         		/*(VGAHRS-3)*8 */
+                tempcx = SiS_CRT1Table[CRT1Index].CR[5];
+                tempcx = tempcx&0x1F;
+                temp = SiS_CRT1Table[CRT1Index].CR[15];
+                temp = (temp&0x04)<<(5-2);      		/*VGAHRE D[5]*/
+                tempcx=((tempcx|temp)-3)<<3;    		/* (VGAHRE-3)*8 */
+                tempbx += 16;
+                tempcx += 16;
+             }
+         }
+         if (tempcx>SiS_VGAHT)
+        	tempcx = SiS_VGAHT;
+        /*add for hardware request*/
+         if((SiS_VBInfo&SetCRT2ToTV)&&(resinfo==0x08)){
+             if(SiS_VBInfo&SetPALTV){
+      		 tempbx=1040;
+      		 tempcx=1042;
+      	     } else {
+      		 tempbx=1040;
+      		 tempcx=1042;
+      	     }
+         }
+         temp=tempbx&0x00FF;
+         SiS_SetReg1(SiS_Part1Port,0x0B,temp);
+     }
+  }
 
-	temp = (tempbx & 0xFF00) >> 8;
-	temp = temp & 0x07;
-	temp = temp << 3;
-	temp = temp | (((tempcx & 0xFF00) >> 8) & 0x07);
-	SiS_SetReg1 (SiS_Part1Port, 0x1D, temp);	/* Part1_1Dh */
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x1C, temp);	/* Part1_1Ch  */
-	temp = tempcx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x1B, temp);	/* Part1_1Bh  */
-
-	tempecx = SiS_VGAHDE;
-	tempebx = SiS_HDE;
-	tempeax = tempecx;
-	tempeax = tempeax << 6;
-	tempeax = tempeax << 10;
-	tempeax = tempeax / tempebx;
-	if (tempebx == tempecx) {
-		tempeax = 65535;
-	}
-	tempecx = tempeax;
-	tempeax = SiS_VGAHDE;	/*change VGAHT->VGAHDE */
-	tempeax = tempeax << 6;
-	tempeax = tempeax << 10;
-	tempeax = tempeax / tempecx;
-	tempecx = tempecx << 16;
-	tempeax = tempeax - 1;
-	tempecx = tempecx | (tempeax & 0x00FFFF);
-	temp = (USHORT) (tempecx & 0x00FF);
-	SiS_SetReg1 (SiS_Part1Port, 0x1F, temp);	/* Part1_1Fh  */
-
-	tempeax = SiS_VGAVDE;
-	tempeax = tempeax << 18;	/*301b */
-	tempeax = tempeax / tempvcfact;
-	tempbx = (USHORT) (tempeax & 0x0FFFF);
-	if (SiS_LCDResInfo == Panel1024x768)
-		tempbx--;
-	if (SiS_SetFlag & EnableLVDSDDA) {
-		tempbx = 1;
-	}
-	temp = ((tempbx & 0xFF00) >> 8) << 3;
-	temp = temp | (USHORT) (((tempecx & 0x0000FF00) >> 8) & 0x07);
-	SiS_SetReg1 (SiS_Part1Port, 0x20, temp);	/* Part1_20h */
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x21, temp);	/* Part1_21h */
-	tempecx = tempecx >> 16;	/* BPLHCFACT  */
-	if (modeflag & HalfDCLK) {
-		tempecx = tempecx >> 1;
-	}
-	temp = (USHORT) ((tempecx & 0x0000FF00) >> 8);
-	SiS_SetReg1 (SiS_Part1Port, 0x22, temp);	/* Part1_22h */
-	temp = (USHORT) (tempecx & 0x000000FF);
-	SiS_SetReg1 (SiS_Part1Port, 0x23, temp);
-	/*add dstn new register */
-	if (SiS_IF_DEF_DSTN) {
-		SiS_SetReg1 (SiS_Part1Port, 0x1E, 0x01);
-		SiS_SetReg1 (SiS_Part1Port, 0x25, 0x00);
-		SiS_SetReg1 (SiS_Part1Port, 0x26, 0x00);
-		SiS_SetReg1 (SiS_Part1Port, 0x27, 0x00);
-		SiS_SetReg1 (SiS_Part1Port, 0x28, 0x87);
-		SiS_SetReg1 (SiS_Part1Port, 0x29, 0x5A);
-		SiS_SetReg1 (SiS_Part1Port, 0x2A, 0x4B);
-		SiS_SetRegANDOR (SiS_Part1Port, 0x44, ~0x007, 0x03);
-		tempbx = SiS_HDE;	/*Blps=lcdhdee(lcdhdes+HDE) +64 */
-		tempbx = tempbx + 64;
-		temp = tempbx & 0x00FF;
-		SiS_SetReg1 (SiS_Part1Port, 0x38, temp);
-		temp = ((tempbx & 0xFF00) >> 8) << 3;
-		SiS_SetRegANDOR (SiS_Part1Port, 0x35, ~0x078, temp);
-		tempbx = tempbx + 32;	/*Blpe=lBlps+32 */
-		temp = tempbx & 0x00FF;
-		SiS_SetReg1 (SiS_Part1Port, 0x39, temp);
-		SiS_SetReg1 (SiS_Part1Port, 0x3A, 0x00);	/*Bflml=0 */
-		SiS_SetRegANDOR (SiS_Part1Port, 0x3C, ~0x007, 0x00);
-		tempbx = SiS_VDE;
-		tempbx = tempbx / 2;
-		temp = tempbx & 0x00FF;
-		SiS_SetReg1 (SiS_Part1Port, 0x3B, temp);
-		temp = ((tempbx & 0xFF00) >> 8) << 3;
-		SiS_SetRegANDOR (SiS_Part1Port, 0x3C, ~0x038, temp);
-		tempeax = SiS_HDE;	/* BDxFIFOSTOP= (HDE*4)/128 */
-		tempeax = tempeax * 4;
-		tempebx = 128;
-		temp = (USHORT) (tempeax % tempebx);
-		tempeax = tempeax / tempebx;
-		if (temp != 0) {
-			tempeax++;
-		}
-		temp = (USHORT) (tempeax & 0x0000003F);
-		SiS_SetRegANDOR (SiS_Part1Port, 0x45, ~0x0FF, temp);
-		SiS_SetReg1 (SiS_Part1Port, 0x3F, 0x00);	/*BDxWadrst0 */
-		SiS_SetReg1 (SiS_Part1Port, 0x3E, 0x00);
-		SiS_SetReg1 (SiS_Part1Port, 0x3D, 0x10);
-		SiS_SetRegANDOR (SiS_Part1Port, 0x3C, ~0x040, 0x00);
-		tempax = SiS_HDE;
-		tempax = tempax >> 4;	/*BDxWadroff = HDE*4/8/8  */
-		pushcx = tempax;
-		temp = tempax & 0x00FF;
-		SiS_SetReg1 (SiS_Part1Port, 0x43, temp);
-		temp = ((tempax & 0xFF00) >> 8) << 3;
-		SiS_SetRegANDOR (SiS_Part1Port, 0x44, ~0x0F8, temp);
-		tempax = SiS_VDE;	/*BDxWadrst1 = BDxWadrst0+BDxWadroff*VDE */
-		tempeax = (tempax * pushcx);
-		tempebx = 0x00100000 + tempeax;
-		temp = (USHORT) tempebx & 0x000000FF;
-		SiS_SetReg1 (SiS_Part1Port, 0x42, temp);
-		temp = (USHORT) ((tempebx & 0x0000FF00) >> 8);
-		SiS_SetReg1 (SiS_Part1Port, 0x41, temp);
-		temp = (USHORT) ((tempebx & 0x00FF0000) >> 16);
-		SiS_SetReg1 (SiS_Part1Port, 0x40, temp);
-		temp = (USHORT) ((tempebx & 0x01000000) >> 24);
-		temp = temp << 7;
-		SiS_SetRegANDOR (SiS_Part1Port, 0x3C, ~0x080, temp);
-		SiS_SetReg1 (SiS_Part1Port, 0x2F, 0x03);
-		SiS_SetReg1 (SiS_Part1Port, 0x03, 0x50);
-		SiS_SetReg1 (SiS_Part1Port, 0x04, 0x00);
-		SiS_SetReg1 (SiS_Part1Port, 0x2F, 0x01);
-		SiS_SetReg1 (SiS_Part1Port, 0x13, 0x00);
-		SiS_SetReg1 (SiS_P3c4, 0x05, 0x86);
-		SiS_SetReg1 (SiS_P3c4, 0x1e, 0x62);
-		SiS_SetReg1 (SiS_Part1Port, 0x19, 0x38);
-		SiS_SetReg1 (SiS_Part1Port, 0x1e, 0x7d);
-	}
-	/*end add dstn */
+  /* TW: The following is done for all bridge/chip types/series */
 
-	return;
+#if 1
+  tempax = (tempax&0x00FF)|(tempbx&0xFF00); /* TW: tempax not used above!!!*/
+  tempbx=pushbx;
+  tempbx=(tempbx&0x00FF)|((tempbx&0xFF00)<<4);
+  tempax=tempax|(tempbx&0xFF00);
+  temp=(tempax&0xFF00)>>8;
+#endif
+#if 0
+  /* TW: new code: */
+  tempax=(tempbx&0xFF00)>>8;
+  tempbx=(((pushbx&0xFF00)>>8)<<4)&0xFF;
+  temp=tempax|tempbx;
+#endif
+  SiS_SetReg1(SiS_Part1Port,0x0C,temp); 		/* <------------------- */
+  temp=tempcx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x0D,temp); 		/* <------------------- */
+  tempcx=SiS_VGAVT-1;
+  temp=tempcx&0x00FF;
+  if(SiS_IF_DEF_CH7005==1) {
+    	if(SiS_VBInfo&SetCRT2ToTV) {
+      		temp--;
+    	}
+  }
+  SiS_SetReg1(SiS_Part1Port,0x0E,temp); 		/* <------------------- */
+  tempbx=SiS_VGAVDE-1;
+  temp=tempbx&0x00FF;
+  /* [Do the same if CH7005==1 as above?] */
+  SiS_SetReg1(SiS_Part1Port,0x0F,temp); 		/* <------------------- */
+  temp=((tempbx&0xFF00)<<3)>>8;
+  temp=temp|((tempcx&0xFF00)>>8);
+  SiS_SetReg1(SiS_Part1Port,0x12,temp); 		/* <------------------- */
+
+  tempax=SiS_VGAVDE;
+  tempbx=SiS_VGAVDE;
+  tempcx=SiS_VGAVT;
+  tempbx=(SiS_VGAVT+SiS_VGAVDE)>>1;                     	/*  BTVGA2VRS     0x10,0x11   */
+  tempcx=((SiS_VGAVT-SiS_VGAVDE)>>4)+tempbx+1;          	/*  BTVGA2VRE     0x11        */
+  if(SiS_IF_DEF_LVDS==0) {
+    	if(SiS_VBInfo & SetCRT2ToRAMDAC){
+      		tempbx = SiS_CRT1Table[CRT1Index].CR[8];
+      		temp = SiS_CRT1Table[CRT1Index].CR[7];
+      		if(temp&0x04) tempbx=tempbx|0x0100;
+      		if(temp&0x80) tempbx=tempbx|0x0200;
+      		temp = SiS_CRT1Table[CRT1Index].CR[13];
+      		if(temp&0x08) tempbx=tempbx|0x0400;
+      		temp = SiS_CRT1Table[CRT1Index].CR[9];
+      		tempcx=(tempcx&0xFF00)|(temp&0x00FF);
+    	}
+  }
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x10,temp); 		/* <------------------- */
+  temp=((tempbx&0xFF00)>>8)<<4;
+  temp=((tempcx&0x000F)|(temp));
+  SiS_SetReg1(SiS_Part1Port,0x11,temp); 		/* <------------------- */
+  if(SiS_IF_DEF_LVDS==0) {
+    	temp=0x20;
+    	if(SiS_LCDResInfo==Panel1280x1024) temp=0x20;
+    	if(SiS_LCDResInfo==Panel1280x960) temp=0x24;
+    	if(SiS_VBInfo&SetCRT2ToTV) temp=0x08;
+    	if(SiS_VBInfo&SetCRT2ToHiVisionTV) {
+      		if(SiS_VBInfo&SetInSlaveMode) temp=0x2c;
+      		else temp=0x20;
+    	}
+  } else {
+    	temp=0x20;
+  }
+
+  if (HwDeviceExtension->jChipType < SIS_315H ) {
+    /* ---------- 300 series -------------- */
+
+    SiS_SetRegANDOR(SiS_Part1Port,0x13,~0x03C,temp); 	/* <----------------- */
+	/* TW: This register will be adapted according to LCD
+	 *     panel type later in the OEM setup functions.
+	 *     (Various panel types require a different delay
+	 *     such as Clevo 2202; however, on most panels,
+	 *     0x20 does nicely.)
+	 */
+
+  } else {
+    /* ----------- 310 series ---------------*/
+    temp >>=2;    /* TW: This is typical SiS code: First calulate temp, then overwrite it... */
+    temp = 0x11;    						/*  ynlai 05/30/2001 for delay compenation  */
+    SiS_SetReg1(SiS_Part1Port,0x2D,temp);
+    /*SiS_SetRegANDOR(SiS_Part1Port,0x2D,~0x00F,temp);*/
+    SiS_SetRegAND(SiS_Part1Port,0x13,0xEF);  			/* BDirectLCD=0 for lcd ?? */
+    tempax=0;
+
+    if (modeflag&DoubleScanMode) tempax |= 0x80;
+    if (modeflag&HalfDCLK) tempax |= 0x40;
+    SiS_SetRegANDOR(SiS_Part1Port,0x2C,~0x0C0,tempax);
+  }
+
+  if(SiS_IF_DEF_LVDS==0) {
+    	SiS_SetGroup1_301(BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+	                  HwDeviceExtension,RefreshRateTableIndex);
+  } else {
+    	SiS_SetGroup1_LVDS(BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+	                   HwDeviceExtension,RefreshRateTableIndex);
+  }
+}
+
+void
+SiS_SetGroup1_301(USHORT  BaseAddr,ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                  PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex)
+{
+  USHORT  push1,push2;
+  USHORT  tempax,tempbx,tempcx,temp;
+  USHORT  resinfo,modeflag;
+  USHORT  CRT1Index;
+
+  if(ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+    	resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
+    	resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+    	CRT1Index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
+    	CRT1Index = CRT1Index &0x3F;
+  }
+
+  if(!(SiS_VBInfo&SetInSlaveMode))  return;
+
+  tempax=0xFFFF;
+  if(!(SiS_VBInfo&SetCRT2ToTV)) {
+    	tempax=SiS_GetVGAHT2();
+  }
+  if(modeflag&Charx8Dot) tempcx=0x08;
+  else tempcx=0x09;
+  if(tempax>=SiS_VGAHT) {
+    	tempax=SiS_VGAHT;
+  }
+  if(modeflag&HalfDCLK) {
+    	tempax=tempax>>1;
+  }
+  tempax=(tempax/tempcx)-5;
+  tempbx=tempax;
+  temp=0xFF;                                            	/* set MAX HT */
+  SiS_SetReg1(SiS_Part1Port,0x03,temp);
+
+  tempax=SiS_VGAHDE;                                           	/* 0x04 Horizontal Display End */
+  if(modeflag&HalfDCLK) tempax=tempax>>1;
+  tempax=(tempax/tempcx)-1;
+  tempbx=tempbx|((tempax&0x00FF)<<8);
+  temp=tempax&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x04,temp);
+
+  temp=(tempbx&0xFF00)>>8;
+  if(SiS_VBInfo&SetCRT2ToTV){
+    	temp=temp+2;
+    	if(SiS_VBInfo&SetCRT2ToHiVisionTV) {
+      		if(resinfo==7) temp=temp-2;
+    	}
+  }
+  SiS_SetReg1(SiS_Part1Port,0x05,temp);                         /* 0x05 Horizontal Display Start */
+  SiS_SetReg1(SiS_Part1Port,0x06,0x03);                       	/* 0x06 Horizontal Blank end     */
+                                                           	/* 0x07 horizontal Retrace Start */
+  if(SiS_VBInfo&SetCRT2ToHiVisionTV) {
+    temp=(tempbx&0x00FF)-1;
+    if(!(modeflag&HalfDCLK)) {
+      temp=temp-6;
+      if(SiS_SetFlag&TVSimuMode) {
+        temp=temp-4;
+        if(ModeNo>0x13) temp=temp-10;
+      }
+    }
+  } else {
+    tempcx=tempbx&0x00FF;
+    tempbx=(tempbx&0xFF00)>>8;
+    tempcx=(tempcx+tempbx)>>1;
+    temp=(tempcx&0x00FF)+2;
+    if(SiS_VBInfo&SetCRT2ToTV){
+       temp=temp-1;
+       if(!(modeflag&HalfDCLK)){
+          if((modeflag&Charx8Dot)){
+            temp=temp+4;
+            if(SiS_VGAHDE>=800){
+              temp=temp-6;
+            }
+          }
+        }
+    } else {
+       if(!(modeflag&HalfDCLK)){
+         temp=temp-4;
+         if(SiS_LCDResInfo!=Panel1280x960) {
+           if(SiS_VGAHDE>=800){
+             temp=temp-7;
+             if(SiS_ModeType==ModeEGA){
+               if(SiS_VGAVDE==1024){
+                 temp=temp+15;
+                 if(SiS_LCDResInfo!=Panel1280x1024){
+                    temp=temp+7;
+                 }
+               }
+             }
+             if(SiS_VGAHDE>=1280){
+               if(SiS_LCDResInfo!=Panel1280x960) {
+                 if(SiS_LCDInfo&LCDNonExpanding) {
+                   temp=temp+28;
+                 }
+               }
+             }
+           }
+         }
+       }
+    }
+  }
+ 
+  SiS_SetReg1(SiS_Part1Port,0x07,temp);                       	/* 0x07 Horizontal Retrace Start */
+  SiS_SetReg1(SiS_Part1Port,0x08,0);                            /* 0x08 Horizontal Retrace End   */
+  
+  if(SiS_VBInfo&SetCRT2ToTV) {
+        if(SiS_SetFlag&TVSimuMode) {
+            if((ModeNo==0x06)||(ModeNo==0x10)||(ModeNo==0x11)||(ModeNo==0x13)||(ModeNo==0x0F)){
+             	SiS_SetReg1(SiS_Part1Port,0x07,0x5b);
+             	SiS_SetReg1(SiS_Part1Port,0x08,0x03);
+            }
+            if((ModeNo==0x00)||(ModeNo==0x01)) {
+             	if(SiS_VBInfo&SetNTSCTV) {
+             		SiS_SetReg1(SiS_Part1Port,0x07,0x2A);
+             		SiS_SetReg1(SiS_Part1Port,0x08,0x61);
+              	} else {
+             		SiS_SetReg1(SiS_Part1Port,0x07,0x2A);
+             		SiS_SetReg1(SiS_Part1Port,0x08,0x41);
+             		SiS_SetReg1(SiS_Part1Port,0x0C,0xF0);
+            	}
+           }
+           if((ModeNo==0x02)||(ModeNo==0x03)||(ModeNo==0x07)){
+            	if(SiS_VBInfo&SetNTSCTV) {
+           		SiS_SetReg1(SiS_Part1Port,0x07,0x54);
+           		SiS_SetReg1(SiS_Part1Port,0x08,0x00);
+            	} else {
+           		SiS_SetReg1(SiS_Part1Port,0x07,0x55);
+           		SiS_SetReg1(SiS_Part1Port,0x08,0x00);
+           		SiS_SetReg1(SiS_Part1Port,0x0C,0xF0);
+           	}
+           }
+           if((ModeNo==0x04)||(ModeNo==0x05)||(ModeNo==0x0D)||(ModeNo==0x50)){
+            	if(SiS_VBInfo&SetNTSCTV) {
+            		SiS_SetReg1(SiS_Part1Port,0x07,0x30);
+            		SiS_SetReg1(SiS_Part1Port,0x08,0x03);
+            	} else {
+           		SiS_SetReg1(SiS_Part1Port,0x07,0x2f);
+           		SiS_SetReg1(SiS_Part1Port,0x08,0x02);
+                }
+           }
+       } 
+  }
+  
+  SiS_SetReg1(SiS_Part1Port,0x18,0x03);                         	/* 0x18 SR08    */
+  SiS_SetRegANDOR(SiS_Part1Port,0x19,0xF0,0x00);
+  SiS_SetReg1(SiS_Part1Port,0x09,0xFF);                         	/* 0x09 Set Max VT    */
+
+  tempbx=SiS_VGAVT;
+  push1=tempbx;
+  tempcx=0x121;
+  tempbx=SiS_VGAVDE;                                        		/* 0x0E Virtical Display End */
+  if(tempbx==357) tempbx=350;
+  if(tempbx==360) tempbx=350;
+  if(tempbx==375) tempbx=350;
+  if(tempbx==405) tempbx=400;
+  if(tempbx==420) tempbx=400;
+  if(tempbx==525) tempbx=480;
+  push2=tempbx;
+  if(SiS_VBInfo&SetCRT2ToLCD) {
+    	if(SiS_LCDResInfo==Panel1024x768) {
+      		if(!(SiS_SetFlag&LCDVESATiming)) {
+        		if(tempbx==350) tempbx=tempbx+5;
+        		if(tempbx==480) tempbx=tempbx+5;
+      		}
+    	}
+  }
+  tempbx--;
+  temp=tempbx&0x00FF;
+  tempbx--;
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x10,temp);                    		/* 0x10 vertical Blank Start */
+  tempbx=push2;
+  tempbx--;
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x0E,temp);
+  if(tempbx&0x0100){
+    	tempcx=tempcx|0x0002;
+  }
+  tempax=0x000B;
+  if(modeflag&DoubleScanMode){
+    	tempax=tempax|0x08000;
+  }
+  if(tempbx&0x0200){
+    	tempcx=tempcx|0x0040;
+  }
+
+  temp=(tempax&0xFF00)>>8;
+  SiS_SetReg1(SiS_Part1Port,0x0B,temp);
+  if(tempbx&0x0400){
+    	tempcx=tempcx|0x0600;
+  }
+  SiS_SetReg1(SiS_Part1Port,0x11,0x00);                         	/* 0x11 Vertival Blank End */
+
+  tempax=push1;
+  tempax=tempax-tempbx;                              			/* 0x0C Vertical Retrace Start */
+  tempax=tempax>>2;
+  push1=tempax;
+
+  if(resinfo!=0x09) {
+    	tempax=tempax<<1;
+    	tempbx=tempax+tempbx;
+  }
+  if(SiS_VBInfo&SetCRT2ToHiVisionTV) {
+    	tempbx=tempbx-10;
+  } else {
+    	if(SiS_SetFlag&TVSimuMode) {
+      		if(SiS_VBInfo&SetPALTV) {
+        		tempbx=tempbx+40;
+      		}
+    	}
+  }
+  tempax=push1;
+  tempax=tempax>>2;
+  tempax++;
+  tempax=tempax+tempbx;
+  push1=tempax;
+  if((SiS_VBInfo&SetPALTV)) {
+    	if(tempbx<=513)  {
+      		if(tempax>=513) {
+        		tempbx=513;
+      		}
+    	}
+  }
+  temp=(tempbx&0x00FF);
+  SiS_SetReg1(SiS_Part1Port,0x0C,temp);
+  tempbx--;
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x10,temp);
+  if(tempbx&0x0100){
+    	tempcx=tempcx|0x0008;
+  }
+  if(tempbx&0x0200){
+    	SiS_SetRegANDOR(SiS_Part1Port,0x0B,0x0FF,0x20);
+  }
+  tempbx++;
+  if(tempbx&0x0100){
+    	tempcx=tempcx|0x0004;
+  }
+  if(tempbx&0x0200){
+    	tempcx=tempcx|0x0080;
+  }
+  if(tempbx&0x0400){
+    	tempcx=tempcx|0x0C00;
+  }
+  tempbx=push1;
+  temp=tempbx&0x00FF;
+  temp=temp&0x0F;
+  SiS_SetReg1(SiS_Part1Port,0x0D,temp);                    		/* 0x0D vertical Retrace End */
+  if(tempbx&0x0010) {
+    	tempcx=tempcx|0x2000;
+  }
+
+  temp=tempcx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x0A,temp);                    		/* 0x0A CR07 */
+  temp=(tempcx&0x0FF00)>>8;
+  SiS_SetReg1(SiS_Part1Port,0x17,temp);                    		/* 0x17 SR0A */
+  tempax=modeflag;
+  temp=(tempax&0xFF00)>>8;
+
+  temp=(temp>>1)&0x09;
+  SiS_SetReg1(SiS_Part1Port,0x16,temp);                    		/* 0x16 SR01 */
+  SiS_SetReg1(SiS_Part1Port,0x0F,0);                         		/* 0x0F CR14 */
+  SiS_SetReg1(SiS_Part1Port,0x12,0);                         		/* 0x12 CR17 */
+  if(SiS_LCDInfo&LCDRGB18Bit) temp=0x80;
+  else temp=0x00;
+  SiS_SetReg1(SiS_Part1Port,0x1A,temp);                         	/* 0x1A SR0E */
+  return;
+}
+
+/* TW: This seems to be for some of 301B/302B/301LV/302LV as well
+ *     which confuses me. In init.c, there is code for these bridges
+ *     which is executed ONLY if IF_DEF_LVDS is 0. The following
+ *     is being called only if IF_DEF_LVDS is NOT 0, and it contains
+ *     code for 301B et al as well. Is IF_DEF_LVDS now 0 or 1 on
+ *     301B/302B/301LV/302LV?
+ */
+void SiS_SetGroup1_LVDS(USHORT  BaseAddr,ULONG ROMAddr,USHORT ModeNo,
+		        USHORT ModeIdIndex,
+                        PSIS_HW_DEVICE_INFO HwDeviceExtension,
+			USHORT RefreshRateTableIndex)
+{
+  USHORT modeflag,resinfo;
+  USHORT push1,push2,tempax,tempbx,tempcx,temp,pushcx;
+  ULONG tempeax=0,tempebx,tempecx,tempvcfact=0;
+
+  if(ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      	/* si+St_ResInfo */
+    	resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     	/* si+Ext_ResInfo */
+    	resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+  }
+
+  tempax=SiS_LCDHDES;
+  tempbx=SiS_HDE;
+  tempcx=SiS_HT;
+
+  tempcx=tempcx-tempbx;                                    		/* HT-HDE  */
+  if(SiS_LCDInfo&LCDNonExpanding) {
+    	if(SiS_LCDResInfo==Panel640x480)  tempbx=640;
+    	if(SiS_LCDResInfo==Panel800x600)  tempbx=800;
+    	if(SiS_LCDResInfo==Panel1024x768) tempbx=1024;
+  }
+  push1=tempax;
+  tempax=tempax+tempbx;                                    		/* lcdhdee  */
+  tempbx=SiS_HT;
+  if(tempax>=tempbx){
+    	tempax=tempax-tempbx;
+  }
+  push2=tempax;	                                                       	/* push ax   lcdhdee  */
+  tempcx=tempcx>>2;                                        		/* temp  */
+  tempcx=tempcx+tempax;                                    		/* lcdhrs  */
+  if(tempcx>=tempbx){
+    	tempcx=tempcx-tempbx;
+  }									/* v ah,cl  */
+  tempax=tempcx;
+  tempax=tempax>>3;                                        		/* BPLHRS */
+  temp=tempax&0x00FF;
+  if(SiS_LCDResInfo==Panel640x480){                         		/*adjust for panel 640x480*/
+      	temp=temp-4;
+  }
+  SiS_SetReg1(SiS_Part1Port,0x14,temp);		/* <------------------ */ 	/* Part1_14h  */
+  temp=(tempax&0x00FF)+10;
+  temp=temp&0x01F;
+  temp=temp|(((tempcx&0x00ff)&0x07)<<5);
+  /*fstn*/
+  if(SiS_IF_DEF_FSTN){
+      	temp=0x20;
+  }
+  SiS_SetReg1(SiS_Part1Port,0x15,temp);    	/* <------------------- */      /* Part1_15h  */
+  tempbx=push2;                                          			/* lcdhdee  */
+  tempcx=push1;                                         			/* lcdhdes  */
+  temp=(tempcx&0x00FF);
+  temp=temp&0x07;                                      				/* BPLHDESKEW  */
+  SiS_SetReg1(SiS_Part1Port,0x1A,temp);   	/* <------------------- */      /* Part1_1Ah  */
+  tempcx=tempcx>>3;                                        			/* BPLHDES */
+  temp=(tempcx&0x00FF);
+  if(ModeNo==0x5b){                            					/*fix fstn mode=5b*/
+      	temp--;
+  }
+  SiS_SetReg1(SiS_Part1Port,0x16,temp);    	/* <------------------- */      /* Part1_16h  */
+  if(tempbx&0x07) tempbx=tempbx+8;
+  tempbx=tempbx>>3;                                        			/* BPLHDEE  */
+  temp=tempbx&0x00FF;
+  if(ModeNo==0x5b){                            					/*fix fstn mode=5b*/
+      	temp--;
+  }
+  SiS_SetReg1(SiS_Part1Port,0x17,temp);   	/* <------------------- */      /* Part1_17h  */
+
+  tempcx=SiS_VGAVT;
+  tempbx=SiS_VGAVDE;
+  tempcx=tempcx-tempbx;                                    			/* GAVT-VGAVDE  */
+  tempbx=SiS_LCDVDES;			                    			/* VGAVDES  */
+
+  push1=tempbx;                                        				/* push bx temppush1 */
+  if(SiS_IF_DEF_TRUMPION==0){
+    	if(SiS_IF_DEF_CH7005==1) {
+      		if(SiS_VBInfo&SetCRT2ToTV) {
+        		tempax=SiS_VGAVDE;
+      		}
+    	}
+    	if(SiS_VBInfo&SetCRT2ToLCD) {
+      		if(SiS_LCDResInfo==Panel640x480)  tempax=480;
+      		if(SiS_LCDResInfo==Panel800x600)  tempax=600;
+      		if(SiS_LCDResInfo==Panel1024x768) tempax=768;
+      		if(SiS_LCDResInfo==Panel320x480)  tempax=480;
+    	}
+  } else tempax=SiS_VGAVDE;
+
+  tempbx=tempbx+tempax;
+  tempax=SiS_VT;                                               			/* VT  */
+  if(tempbx>=SiS_VT){
+    	tempbx=tempbx-tempax;
+  }
+  push2=tempbx;                                        				/* push bx  temppush2  */
+  tempcx=tempcx>>1;
+  tempbx=tempbx+tempcx;
+  tempbx++;                                                			/* BPLVRS  */
+  if(tempbx>=tempax){
+    	tempbx=tempbx-tempax;
+  }
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x18,temp);       	/* <------------------- */      /* Part1_18h  */
+  tempcx=tempcx>>3;
+  tempcx=tempcx+tempbx;
+  tempcx++;                                                			/* BPLVRE  */
+  temp=tempcx&0x00FF;
+  temp=temp&0x0F;
+  SiS_SetRegANDOR(SiS_Part1Port,0x19,~0x00F,temp);   /* <-------------- */      /* Part1_19h  */
+
+  temp=(tempbx&0xFF00)>>8;
+  temp=temp&0x07;
+  temp=temp<<3;                                 				/* BPLDESKEW =0 */
+  tempbx=SiS_VGAVDE;
+  if(tempbx!=SiS_VDE){
+    	temp=temp|0x40;
+  }
+  if(SiS_SetFlag&EnableLVDSDDA) {
+    	temp=temp|0x40;
+  }
+  if(SiS_LCDInfo&LCDRGB18Bit) {
+    	temp=temp|0x80;
+  }
+  SiS_SetRegANDOR(SiS_Part1Port,0x1A,0x07,temp);  /* <----------------- */    	/* Part1_1Ah */
+
+  tempecx=SiS_VGAVT;
+  tempebx=SiS_VDE;
+  tempeax=SiS_VGAVDE;
+  tempecx=tempecx-tempeax;                                 			/* VGAVT-VGAVDE  */
+  tempeax=tempeax<<6;
+  temp=(USHORT)(tempeax%tempebx);
+  tempeax=tempeax/tempebx;
+  if(temp!=0){
+    	tempeax++;
+  }
+  tempebx=tempeax;                                        			/* BPLVCFACT  */
+
+  /* TW: Modified according to info from SiS - might be wrong */
+  /* if (!(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))) { */
+  if ((HwDeviceExtension->jChipType == SIS_540)||
+      (HwDeviceExtension->jChipType == SIS_630)||
+      (HwDeviceExtension->jChipType == SIS_730)||
+      (HwDeviceExtension->jChipType == SIS_300)) {
+
+  	if(SiS_SetFlag&EnableLVDSDDA) {
+    		tempebx=tempebx&0x003F;
+  	}
+  	temp=(USHORT)(tempebx&0x00FF);
+  	SiS_SetReg1(SiS_Part1Port,0x1E,temp);                       		/* Part1_1Eh */
+
+  }
+  /*add for 301b different 301*/
+  else if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+    	tempecx=SiS_VGAVT;
+    	tempebx=SiS_VDE;
+    	tempeax=SiS_VGAVDE;
+    	tempecx=tempecx-tempeax;                                 		/* VGAVT-VGAVDE  */
+    	tempeax=tempeax<<18;
+    	temp=(USHORT)(tempeax%tempebx);
+    	tempeax=tempeax/tempebx;
+    	if(temp!=0) tempeax++;
+    	tempebx=tempeax;                                        		/* BPLVCFACT  */
+    	tempvcfact=tempeax;       /*301b*/
+    	temp=(USHORT)(tempebx&0x00FF);
+    	SiS_SetReg1(SiS_Part1Port,0x37,temp);
+    	temp=(USHORT)((tempebx&0x00FF00)>>8);
+    	SiS_SetReg1(SiS_Part1Port,0x36,temp);
+    	temp=(USHORT)((tempebx&0x00030000)>>16);
+    	if(SiS_VDE==SiS_VGAVDE)	temp=temp|0x04;
+    	SiS_SetReg1(SiS_Part1Port,0x35,temp);
+  }
+  /*end for 301b*/
+  
+  tempbx=push2;                                        				/* p bx temppush2 BPLVDEE  */
+  tempcx=push1;			/* pop cx temppush1 NPLVDES */
+  push1=(USHORT)(tempeax&0xFFFF);
+  if(!(SiS_VBInfo&SetInSlaveMode)) {
+   	if(!SiS_IF_DEF_DSTN){
+    		if(SiS_LCDResInfo==Panel800x600) {
+      			if(resinfo==7) tempcx++;
+    		} else {
+      			if(SiS_LCDResInfo==Panel1024x768) {
+        			if(resinfo==8) tempcx++;
+       			}
+     		}
+   	}
+  }
+  temp=(tempbx&0xFF00)>>8;
+  temp=temp&0x07;
+  temp=temp<<3;
+  temp=temp|(((tempcx&0xFF00)>>8)&0x07);
+  SiS_SetReg1(SiS_Part1Port,0x1D,temp);     	/* <------------------- */     	/* Part1_1Dh */
+  temp=tempbx&0x00FF;
+  /*fstn*/
+  if(SiS_IF_DEF_FSTN){
+      	temp=temp+1;
+  }
+  SiS_SetReg1(SiS_Part1Port,0x1C,temp);      	/* <------------------- */   	/* Part1_1Ch  */
+  temp=tempcx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x1B,temp);      	/* <------------------- */     	/* Part1_1Bh  */
+
+  tempecx=SiS_VGAHDE;
+  tempebx=SiS_HDE;
+  tempeax=tempecx;
+  tempeax=tempeax<<16;
+  tempeax=tempeax/tempebx;
+  if(tempebx==tempecx){
+    	tempeax=0xFFFF;
+  }
+  tempecx=tempeax;
+  tempeax=SiS_VGAHT; /* TW: Was SiS_VGAHDE;  - WRONG! - old (wrong) comment: "change VGAHT->VGAHDE"*/
+  tempeax=tempeax<<16;
+  tempeax=tempeax/tempecx;
+  tempecx=tempecx<<16;
+  tempeax=tempeax-1;
+  tempecx=tempecx|(tempeax&0x00FFFF);
+  temp=(USHORT)(tempecx&0x00FF);
+  SiS_SetReg1(SiS_Part1Port,0x1F,temp);  	/* <------------------- */    	/* Part1_1Fh  */
+
+  tempbx = SiS_VDE; /* TW: added this and if statement */
+  if (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+  	tempeax=SiS_VGAVDE;
+  	tempeax=tempeax<<18;          /*301b*/
+  	tempeax=tempeax/tempvcfact;
+  	tempbx=(USHORT) (tempeax&0x0FFFF);
+  }
+
+  if(SiS_LCDResInfo==Panel1024x768) tempbx--;
+
+  if(SiS_SetFlag&EnableLVDSDDA) tempbx=1;
+
+  temp=((tempbx&0xFF00)>>8)<<3;
+  temp=temp|(USHORT)(((tempecx&0x0000FF00)>>8)&0x07);
+  SiS_SetReg1(SiS_Part1Port,0x20,temp);  	/* <------------------- */    	/* Part1_20h */
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x21,temp);  	/* <------------------- */     	/* Part1_21h */
+  tempecx=tempecx>>16;                                     			/* BPLHCFACT  */
+  if(modeflag&HalfDCLK) {
+    	tempecx=tempecx>>1;
+  }
+  temp=(USHORT)((tempecx&0x0000FF00)>>8);
+  SiS_SetReg1(SiS_Part1Port,0x22,temp);     	/* <------------------- */      /* Part1_22h */
+  temp=(USHORT)(tempecx&0x000000FF);
+  SiS_SetReg1(SiS_Part1Port,0x23,temp); 	/* <------------------- */
+ /*add dstn new register*/
+  if(SiS_IF_DEF_DSTN){
+     	SiS_SetReg1(SiS_Part1Port,0x1E,0x01);
+     	SiS_SetReg1(SiS_Part1Port,0x25,0x00);
+     	SiS_SetReg1(SiS_Part1Port,0x26,0x00);
+     	SiS_SetReg1(SiS_Part1Port,0x27,0x00);
+     	SiS_SetReg1(SiS_Part1Port,0x28,0x87);
+     	SiS_SetReg1(SiS_Part1Port,0x29,0x5A);
+     	SiS_SetReg1(SiS_Part1Port,0x2A,0x4B);
+     	SiS_SetRegANDOR(SiS_Part1Port,0x44,~0x007,0x03);
+     	tempbx=SiS_HDE;                              				/*Blps=lcdhdee(lcdhdes+HDE) +64*/
+     	tempbx=tempbx+64;
+     	temp=tempbx&0x00FF;
+     	SiS_SetReg1(SiS_Part1Port,0x38,temp);
+     	temp=((tempbx&0xFF00)>>8)<<3;
+     	SiS_SetRegANDOR(SiS_Part1Port,0x35,~0x078,temp);
+     	tempbx=tempbx+32;		       					/*Blpe=lBlps+32*/
+     	temp=tempbx&0x00FF;
+     	/*fstn*/
+     	if(SiS_IF_DEF_FSTN){
+         	temp=0;
+     	}
+     	SiS_SetReg1(SiS_Part1Port,0x39,temp);
+     	SiS_SetReg1(SiS_Part1Port,0x3A,0x00);  /*Bflml=0*/
+     	SiS_SetRegANDOR(SiS_Part1Port,0x3C,~0x007,0x00);
+     	tempbx=SiS_VDE;
+     	tempbx=tempbx/2;
+     	temp=tempbx&0x00FF;
+     	SiS_SetReg1(SiS_Part1Port,0x3B,temp);
+     	temp=((tempbx&0xFF00)>>8)<<3;
+     	SiS_SetRegANDOR(SiS_Part1Port,0x3C,~0x038,temp);
+     	tempeax=SiS_HDE;                       					/* BDxFIFOSTOP= (HDE*4)/128 */
+     	tempeax=tempeax*4;
+     	tempebx=128;
+     	temp=(USHORT)(tempeax%tempebx);
+     	tempeax=tempeax/tempebx;
+     	if(temp!=0){
+      		tempeax++;
+     	}
+     	temp=(USHORT)(tempeax&0x0000003F);
+     	SiS_SetRegANDOR(SiS_Part1Port,0x45,~0x0FF,temp);
+     	SiS_SetReg1(SiS_Part1Port,0x3F,0x00);           			/*BDxWadrst0*/
+     	SiS_SetReg1(SiS_Part1Port,0x3E,0x00);
+     	SiS_SetReg1(SiS_Part1Port,0x3D,0x10);
+     	SiS_SetRegANDOR(SiS_Part1Port,0x3C,~0x040,0x00);
+     	tempax=SiS_HDE;
+     	tempax=tempax>>4;                                			/*BDxWadroff = HDE*4/8/8  */
+     	pushcx=tempax;
+     	temp=tempax&0x00FF;
+     	SiS_SetReg1(SiS_Part1Port,0x43,temp);
+     	temp=((tempax&0xFF00)>>8)<<3;
+     	SiS_SetRegANDOR(SiS_Part1Port,0x44,~0x0F8,temp);
+     	tempax=SiS_VDE;                        					/*BDxWadrst1 = BDxWadrst0+BDxWadroff*VDE*/
+     	tempeax=(tempax*pushcx);
+     	tempebx=0x00100000+tempeax;
+     	temp=(USHORT)tempebx&0x000000FF;
+     	SiS_SetReg1(SiS_Part1Port,0x42,temp);
+     	temp=(USHORT)((tempebx&0x0000FF00)>>8);
+     	SiS_SetReg1(SiS_Part1Port,0x41,temp);
+     	temp=(USHORT)((tempebx&0x00FF0000)>>16);
+     	SiS_SetReg1(SiS_Part1Port,0x40,temp);
+     	temp=(USHORT)((tempebx&0x01000000)>>24);
+     	temp=temp<<7;
+     	SiS_SetRegANDOR(SiS_Part1Port,0x3C,~0x080,temp);
+     	SiS_SetReg1(SiS_Part1Port,0x2F,0x03);
+     	SiS_SetReg1(SiS_Part1Port,0x03,0x50);
+     	SiS_SetReg1(SiS_Part1Port,0x04,0x00);
+     	SiS_SetReg1(SiS_Part1Port,0x2F,0x01);
+     	SiS_SetReg1(SiS_Part1Port,0x13,0x00);
+     	SiS_SetReg1(SiS_P3c4,0x05,0x86);
+     	SiS_SetReg1(SiS_P3c4,0x1e,0x62);
+     	/*fstn*/
+     	if(SiS_IF_DEF_FSTN){
+         	SiS_SetReg1(SiS_P3c4,0x2b,0x1b);
+         	SiS_SetReg1(SiS_P3c4,0x2c,0xe3);
+         	SiS_SetReg1(SiS_P3c4,0x1e,0x62);
+         	SiS_SetReg1(SiS_P3c4,0x2e,0x04);
+         	SiS_SetReg1(SiS_P3c4,0x2f,0x42);
+         	SiS_SetReg1(SiS_P3c4,0x32,0x01);
+         	SiS_SetReg1(SiS_Part1Port,0x2b,0x02);
+         	SiS_SetReg1(SiS_Part1Port,0x2c,0x00);
+         	SiS_SetReg1(SiS_Part1Port,0x2d,0x00);
+     	}
+     	/*end add fstn*/
+     	SiS_SetRegANDOR(SiS_Part1Port,0x19,0x00f,0x30);
+     	SiS_SetReg1(SiS_Part1Port,0x1e,0x7d);
+     	SiS_SetReg1(SiS_Part1Port,0x2e,0xe0);
+  }
+  /*end add dstn*/
+  return;
 }
 
 /*301b*/
 void
-SiS_SetGroup1_LCDA (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
-		    USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,
-		    USHORT RefreshRateTableIndex)
-{
-	USHORT modeflag, resinfo;
-	USHORT push1, push2, tempax, tempbx, tempcx, temp;
-	ULONG tempeax = 0, tempebx, tempecx, tempvcfact;	/*301b */
-	SiS_SetRegOR (SiS_Part1Port, 0x2D, 0x20);
-
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ResInfo */
-		resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+Ext_ResInfo */
-		resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
-	}
-
-	tempax = SiS_LCDHDES;
-	tempbx = SiS_HDE;
-	tempcx = SiS_HT;
-
-	if (SiS_LCDInfo & LCDNonExpanding) {
-		if (SiS_LCDResInfo == Panel1280x1024)
-			tempbx = 1280;
-		if (SiS_LCDResInfo == Panel1024x768)
-			tempbx = 1024;
-	}
-	tempcx = tempcx - tempbx;	/* HT-HDE  */
-	push1 = tempax;
-	tempax = tempax + tempbx;	/* lcdhdee  */
-	tempbx = SiS_HT;
-	if (tempax >= tempbx) {
-		tempax = tempax - tempbx;
-	}
-	push2 = tempax;
-	/* push ax   lcdhdee  */
-	tempcx = tempcx >> 2;	/* temp  */
-	tempcx = tempcx + tempax;	/* lcdhrs  */
-	if (tempcx >= tempbx) {
-		tempcx = tempcx - tempbx;
-	}
-	/* v ah,cl  */
-	tempax = tempcx;
-	tempax = tempax >> 3;	/* BPLHRS */
-	temp = tempax & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x14, temp);	/* Part1_14h  */
-	temp = (tempax & 0x00FF) + 10;
-	temp = temp & 0x01F;
-	temp = temp | (((tempcx & 0x00ff) & 0x07) << 5);
-	SiS_SetReg1 (SiS_Part1Port, 0x15, temp);	/* Part1_15h  */
-	tempbx = push2;		/* lcdhdee  */
-	tempcx = push1;		/* lcdhdes  */
-	temp = (tempcx & 0x00FF);
-	temp = temp & 0x07;	/* BPLHDESKEW  */
-	SiS_SetReg1 (SiS_Part1Port, 0x1A, temp);	/* Part1_1Ah  */
-	tempcx = tempcx >> 3;	/* BPLHDES */
-	temp = (tempcx & 0x00FF);
-	SiS_SetReg1 (SiS_Part1Port, 0x16, temp);	/* Part1_16h  */
-	if (tempbx & 0x07)
-		tempbx = tempbx + 8;
-	tempbx = tempbx >> 3;	/* BPLHDEE  */
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x17, temp);	/* Part1_17h  */
-
-	tempcx = SiS_VGAVT;
-	tempbx = SiS_VGAVDE;
-	tempcx = tempcx - tempbx;	/* GAVT-VGAVDE  */
-	tempbx = SiS_LCDVDES;	/* VGAVDES  */
-	push1 = tempbx;		/* push bx temppush1 */
-	if (SiS_IF_DEF_TRUMPION == 0) {
-		if (SiS_IF_DEF_CH7005 == 1) {
-			if (SiS_VBInfo & SetCRT2ToTV) {
-				tempax = SiS_VGAVDE;
-			}
-		}
-
-		if (SiS_LCDResInfo == Panel1024x768)
-			tempax = 768;
-		if (SiS_LCDResInfo == Panel1280x1024)
-			tempax = 1024;
-
-	} else
-		tempax = SiS_VGAVDE;
-	tempbx = tempbx + tempax;
-	tempax = SiS_VT;	/* VT  */
-	if (tempbx >= SiS_VT) {
-		tempbx = tempbx - tempax;
-	}
-	push2 = tempbx;		/* push bx  temppush2  */
-	tempcx = tempcx >> 1;
-	tempbx = tempbx + tempcx;
-	tempbx++;		/* BPLVRS  */
-	if (tempbx >= tempax) {
-		tempbx = tempbx - tempax;
-	}
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x18, temp);	/* Part1_18h  */
-	tempcx = tempcx >> 3;
-	tempcx = tempcx + tempbx;
-	tempcx++;		/* BPLVRE  */
-	temp = tempcx & 0x00FF;
-	temp = temp & 0x0F;
-	SiS_SetRegANDOR (SiS_Part1Port, 0x19, ~0x00F, temp);	/* Part1_19h  */
-	temp = (tempbx & 0xFF00) >> 8;
-	temp = temp & 0x07;
-	temp = temp << 3;	/* BPLDESKEW =0 */
-	tempbx = SiS_VGAVDE;
-	if (tempbx != SiS_VDE) {
-		temp = temp | 0x40;
-	}
-	if (SiS_SetFlag & EnableLVDSDDA) {
-		temp = temp | 0x40;
-	}
-	if (SiS_LCDInfo & LCDRGB18Bit) {
-		temp = temp | 0x80;
-	}
-	SiS_SetRegANDOR (SiS_Part1Port, 0x1A, 0x07, temp);	/* Part1_1Ah */
-
-	tempbx = push2;		/* p bx temppush2 BPLVDEE  */
-	tempcx = push1;		/* pop cx temppush1 NPLVDES */
-	push1 = (USHORT) (tempeax & 0xFFFF);
-
-	if (!(SiS_VBInfo & SetInSlaveMode)) {
-		if (SiS_LCDResInfo == Panel800x600) {
-			if (resinfo == 7)
-				tempcx++;
-		} else {
-			if (SiS_LCDResInfo == Panel1024x768) {
-				if (resinfo == 8)
-					tempcx++;
-			}
-		}
-	}
-
-	temp = (tempbx & 0xFF00) >> 8;
-	temp = temp & 0x07;
-	temp = temp << 3;
-	temp = temp | (((tempcx & 0xFF00) >> 8) & 0x07);
-	SiS_SetReg1 (SiS_Part1Port, 0x1D, temp);	/* Part1_1Dh */
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x1C, temp);	/* Part1_1Ch  */
-	temp = tempcx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x1B, temp);	/* Part1_1Bh  */
-
-	tempecx = SiS_VGAVT;
-	tempebx = SiS_VDE;
-	tempeax = SiS_VGAVDE;
-	tempecx = tempecx - tempeax;	/* VGAVT-VGAVDE  */
-	tempeax = tempeax << 18;
-	temp = (USHORT) (tempeax % tempebx);
-	tempeax = tempeax / tempebx;
-	if (temp != 0) {
-		tempeax++;
-	}
-	tempebx = tempeax;	/* BPLVCFACT  */
-	tempvcfact = tempeax;	/*301b */
-	temp = (USHORT) (tempebx & 0x00FF);
-	SiS_SetReg1 (SiS_Part1Port, 0x37, temp);
-	temp = (USHORT) ((tempebx & 0x00FF00) >> 8);
-	SiS_SetReg1 (SiS_Part1Port, 0x36, temp);
-	temp = (USHORT) ((tempebx & 0x00030000) >> 16);
-	if (SiS_VDE == SiS_VGAVDE) {
-		temp = temp | 0x04;
-	}
-
-	SiS_SetReg1 (SiS_Part1Port, 0x35, temp);
-
-	tempecx = SiS_VGAHDE;
-	tempebx = SiS_HDE;
-	tempeax = tempecx;
-	tempeax = tempeax << 6;
-	tempeax = tempeax << 10;
-	tempeax = tempeax / tempebx;
-	if (tempebx == tempecx) {
-		tempeax = 65535;
-	}
-	tempecx = tempeax;
-	tempeax = SiS_VGAHDE;	/*301b to change HT->HDE */
-	tempeax = tempeax << 6;
-	tempeax = tempeax << 10;
-	tempeax = tempeax / tempecx;
-	tempecx = tempecx << 16;
-	tempeax = tempeax - 1;
-	tempecx = tempecx | (tempeax & 0x00FFFF);
-	temp = (USHORT) (tempecx & 0x00FF);
-	SiS_SetReg1 (SiS_Part1Port, 0x1F, temp);	/* Part1_1Fh  */
-
-	tempeax = SiS_VGAVDE;
-	tempeax = tempeax << 18;	/*301b */
-	tempeax = tempeax / tempvcfact;
-	tempbx = (USHORT) (tempeax & 0x0FFFF);
-	if (SiS_LCDResInfo == Panel1024x768)
-		tempbx--;
-	if (SiS_SetFlag & EnableLVDSDDA) {
-		tempbx = 1;
-	}
-	temp = ((tempbx & 0xFF00) >> 8) << 3;
-	temp = temp | (USHORT) (((tempecx & 0x0000FF00) >> 8) & 0x07);
-	SiS_SetReg1 (SiS_Part1Port, 0x20, temp);	/* Part1_20h */
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part1Port, 0x21, temp);	/* Part1_21h */
-	tempecx = tempecx >> 16;	/* BPLHCFACT  */
-
-	temp = (USHORT) ((tempecx & 0x0000FF00) >> 8);
-	SiS_SetReg1 (SiS_Part1Port, 0x22, temp);	/* Part1_22h */
-	temp = (USHORT) (tempecx & 0x000000FF);
-	SiS_SetReg1 (SiS_Part1Port, 0x23, temp);
-	return;
+SiS_SetGroup1_LCDA(USHORT  BaseAddr,ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                   PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex)
+{
+  USHORT modeflag,resinfo;
+  USHORT push1,push2,tempax,tempbx,tempcx,temp;
+  ULONG tempeax=0,tempebx,tempecx,tempvcfact;/*301b*/
+
+  SiS_SetRegOR(SiS_Part1Port,0x2D,0x20);
+  
+  if(ModeNo<=0x13) {
+    modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+    resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+  } else {
+    modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
+    resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+  }
+
+  tempax=SiS_LCDHDES;
+  tempbx=SiS_HDE;
+  tempcx=SiS_HT;
+  
+  if(SiS_LCDInfo&LCDNonExpanding) {
+    	if(SiS_LCDResInfo==Panel1280x1024) tempbx=1280;
+    	if(SiS_LCDResInfo==Panel1024x768) tempbx=1024;
+  }
+  tempcx=tempcx-tempbx;                                    	/* HT-HDE  */
+  push1=tempax;
+  tempax=tempax+tempbx;                                    	/* lcdhdee  */
+  tempbx=SiS_HT;
+  if(tempax>=tempbx){
+   	tempax=tempax-tempbx;
+  }
+  push2=tempax;
+                                                           	/* push ax   lcdhdee  */
+  tempcx=tempcx>>2;                                        	/* temp  */
+  tempcx=tempcx+tempax;                                    	/* lcdhrs  */
+  if(tempcx>=tempbx){
+    	tempcx=tempcx-tempbx;
+  }
+                                                           	/* v ah,cl  */
+  tempax=tempcx;
+  tempax=tempax>>3;                                        	/* BPLHRS */
+  temp=tempax&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x14,temp);                         /* Part1_14h  */
+  temp=(tempax&0x00FF)+10;
+  temp=temp&0x01F;
+  temp=temp|(((tempcx&0x00ff)&0x07)<<5);
+  SiS_SetReg1(SiS_Part1Port,0x15,temp);                         /* Part1_15h  */
+  tempbx=push2;                                          	/* lcdhdee  */
+  tempcx=push1;                                          	/* lcdhdes  */
+  temp=(tempcx&0x00FF);
+  temp=temp&0x07;                                      		/* BPLHDESKEW  */
+  SiS_SetReg1(SiS_Part1Port,0x1A,temp);                         /* Part1_1Ah  */
+  tempcx=tempcx>>3;                                        	/* BPLHDES */
+  temp=(tempcx&0x00FF);
+  SiS_SetReg1(SiS_Part1Port,0x16,temp);                         /* Part1_16h  */
+  if(tempbx&0x07) tempbx=tempbx+8;
+  tempbx=tempbx>>3;                                        	/* BPLHDEE  */
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x17,temp);                        	/* Part1_17h  */
+
+  tempcx=SiS_VGAVT;
+  tempbx=SiS_VGAVDE;
+  tempcx=tempcx-tempbx;                                    	/* GAVT-VGAVDE  */
+  tempbx=SiS_LCDVDES;                                          	/* VGAVDES  */
+  push1=tempbx;                                        		/* push bx temppush1 */
+  if(SiS_IF_DEF_TRUMPION==0){
+    if(SiS_IF_DEF_CH7005==1) {
+      if(SiS_VBInfo&SetCRT2ToTV) {
+        tempax=SiS_VGAVDE;
+      }
+    }
+    if(SiS_LCDResInfo==Panel1024x768) tempax=768;
+    if(SiS_LCDResInfo==Panel1280x1024)  tempax=1024;
+  }
+  else tempax=SiS_VGAVDE;
+  tempbx=tempbx+tempax;
+  tempax=SiS_VT;                                               	/* VT  */
+  if(tempbx>=SiS_VT){
+    tempbx=tempbx-tempax;
+  }
+  push2=tempbx;                                        		/* push bx  temppush2  */
+  tempcx=tempcx>>1;
+  tempbx=tempbx+tempcx;
+  tempbx++;                                                	/* BPLVRS  */
+  if(tempbx>=tempax){
+    tempbx=tempbx-tempax;
+  }
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x18,temp);                         /* Part1_18h  */
+  tempcx=tempcx>>3;
+  tempcx=tempcx+tempbx;
+  tempcx++;                                                	/* BPLVRE  */
+  temp=tempcx&0x00FF;
+  temp=temp&0x0F;
+  SiS_SetRegANDOR(SiS_Part1Port,0x19,~0x00F,temp);               /* Part1_19h  */
+  temp=(tempbx&0xFF00)>>8;
+  temp=temp&0x07;
+  temp=temp<<3;                                 		/* BPLDESKEW =0 */
+  tempbx=SiS_VGAVDE;
+  if(tempbx!=SiS_VDE){
+    temp=temp|0x40;
+  }
+  if(SiS_SetFlag&EnableLVDSDDA) {
+    temp=temp|0x40;
+  }
+  if(SiS_LCDInfo&LCDRGB18Bit) {
+    temp=temp|0x80;
+  }
+  SiS_SetRegANDOR(SiS_Part1Port,0x1A,0x07,temp);             	/* Part1_1Ah */
+  
+  tempbx=push2;                                        		/* p bx temppush2 BPLVDEE  */
+  tempcx=push1;                                        		/* pop cx temppush1 NPLVDES */
+  push1=(USHORT)(tempeax&0xFFFF);
+    
+  if(!(SiS_VBInfo&SetInSlaveMode)) {
+    if(SiS_LCDResInfo==Panel800x600) {
+      if(resinfo==7) tempcx++;
+    } else {
+      if(SiS_LCDResInfo==Panel1024x768) {
+        if(resinfo==8) tempcx++;
+      }
+    }
+  }
+
+  temp=(tempbx&0xFF00)>>8;
+  temp=temp&0x07;
+  temp=temp<<3;
+  temp=temp|(((tempcx&0xFF00)>>8)&0x07);
+  SiS_SetReg1(SiS_Part1Port,0x1D,temp);                          /* Part1_1Dh */
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x1C,temp);                          /* Part1_1Ch  */
+  temp=tempcx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x1B,temp);                          /* Part1_1Bh  */ 
+
+  tempecx=SiS_VGAVT;
+  tempebx=SiS_VDE;
+  tempeax=SiS_VGAVDE;
+  tempecx=tempecx-tempeax;                                 	/* VGAVT-VGAVDE  */
+  tempeax=tempeax<<18;
+  temp=(USHORT)(tempeax%tempebx);
+  tempeax=tempeax/tempebx;
+  if(temp!=0){
+    tempeax++;
+  }
+  tempebx=tempeax;                                        	/* BPLVCFACT  */
+  tempvcfact=tempeax;       /*301b*/
+  temp=(USHORT)(tempebx&0x00FF);
+  SiS_SetReg1(SiS_Part1Port,0x37,temp);   
+  temp=(USHORT)((tempebx&0x00FF00)>>8);
+  SiS_SetReg1(SiS_Part1Port,0x36,temp);   
+  temp=(USHORT)((tempebx&0x00030000)>>16);
+  if(SiS_VDE==SiS_VGAVDE) {
+      temp=temp|0x04;
+  }
+  
+  SiS_SetReg1(SiS_Part1Port,0x35,temp);   
+  
+  tempecx=SiS_VGAHDE;
+  tempebx=SiS_HDE;
+  tempeax=tempecx;
+  tempeax=tempeax<<6;
+  tempeax=tempeax<<10;
+  tempeax=tempeax/tempebx;
+  if(tempebx==tempecx){
+    	tempeax=0xFFFF;
+  }
+  tempecx=tempeax;
+  tempeax=SiS_VGAHDE;  /*301b to change HT->HDE*/
+  tempeax=tempeax<<6;
+  tempeax=tempeax<<10;
+  tempeax=tempeax/tempecx;
+  tempecx=tempecx<<16;
+  tempeax=tempeax-1;
+  tempecx=tempecx|(tempeax&0x00FFFF);
+  temp=(USHORT)(tempecx&0x00FF);
+  SiS_SetReg1(SiS_Part1Port,0x1F,temp);                          /* Part1_1Fh  */
+
+  tempeax=SiS_VGAVDE;
+  tempeax=tempeax<<18;          /*301b*/
+  tempeax=tempeax/tempvcfact;
+  tempbx=(USHORT) (tempeax&0x0FFFF);
+  if(SiS_LCDResInfo==Panel1024x768) tempbx--;
+  if(SiS_SetFlag&EnableLVDSDDA){
+    	tempbx=1;
+  }
+  temp=((tempbx&0xFF00)>>8)<<3;
+  temp=temp|(USHORT)(((tempecx&0x0000FF00)>>8)&0x07);
+  SiS_SetReg1(SiS_Part1Port,0x20,temp);                         /* Part1_20h */
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part1Port,0x21,temp);                         /* Part1_21h */
+  tempecx=tempecx>>16;                                     	/* BPLHCFACT  */
+ 
+  temp=(USHORT)((tempecx&0x0000FF00)>>8);
+  SiS_SetReg1(SiS_Part1Port,0x22,temp);                         /* Part1_22h */
+  temp=(USHORT)(tempecx&0x000000FF);
+  SiS_SetReg1(SiS_Part1Port,0x23,temp);
+  
+  if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+  	SiS_SetReg1(SiS_Part1Port,0x1e,0x20);  /* for 650 & 550 lvds part */
+  }
+  return;
 }
-
 /*end 301b*/
-void
-SiS_SetTPData ()
+
+void SiS_SetTPData()
 {
-	return;
+  return;
 }
 
-void
-SiS_SetCRT2Offset (USHORT SiS_Part1Port, ULONG ROMAddr, USHORT ModeNo,
-		   USHORT ModeIdIndex, USHORT RefreshRateTableIndex,
-		   PSIS_HW_DEVICE_INFO HwDeviceExtension)
+void SiS_SetCRT2Offset(USHORT SiS_Part1Port,ULONG ROMAddr,USHORT ModeNo,
+                       USHORT ModeIdIndex ,USHORT RefreshRateTableIndex,
+		       PSIS_HW_DEVICE_INFO HwDeviceExtension)
 {
-	USHORT offset;
-	UCHAR temp;
+  USHORT offset;
+  UCHAR temp;
 
-	if (SiS_VBInfo & SetInSlaveMode) {
-		return;
-	}
-	offset =
-	    SiS_GetOffset (ROMAddr, ModeNo, ModeIdIndex, RefreshRateTableIndex,
-			   HwDeviceExtension);
-	temp = (UCHAR) (offset & 0xFF);
-	SiS_SetReg1 (SiS_Part1Port, 0x07, temp);
-	temp = (UCHAR) ((offset & 0xFF00) >> 8);
-	SiS_SetReg1 (SiS_Part1Port, 0x09, temp);
-	temp = (UCHAR) (((offset >> 3) & 0xFF) + 1);
-	SiS_SetReg1 (SiS_Part1Port, 0x03, temp);
+  if(SiS_VBInfo&SetInSlaveMode) return;
+
+  offset=SiS_GetOffset(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                       HwDeviceExtension);
+  temp=(UCHAR)(offset&0xFF);
+  SiS_SetReg1(SiS_Part1Port,0x07,temp);
+  temp=(UCHAR)((offset&0xFF00)>>8);
+  SiS_SetReg1(SiS_Part1Port,0x09,temp);
+  temp=(UCHAR)(((offset>>3)&0xFF)+1);
+  SiS_SetReg1(SiS_Part1Port,0x03,temp);
 }
 
 USHORT
-SiS_GetOffset (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-	       USHORT RefreshRateTableIndex,
-	       PSIS_HW_DEVICE_INFO HwDeviceExtension)
-{
-	USHORT temp, colordepth;
-	USHORT modeinfo, index, infoflag;
-	USHORT ColorDepth[] = { 0x01, 0x02, 0x04 };
-
-	modeinfo = SiS_EModeIDTable[ModeIdIndex].Ext_ModeInfo;
-	infoflag = SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
-	if (HwDeviceExtension->jChipType < SIS_315H) {	/* 300 series */
-		index = (modeinfo >> 4) & 0xFF;
-	} else {		/* 310 series */
-
-		index = (modeinfo >> 8) & 0xFF;
-	}
-	temp = SiS_ScreenOffset[index];
-	if (infoflag & InterlaceMode) {
-		temp = temp << 1;
-	}
-	colordepth = SiS_GetColorDepth (ROMAddr, ModeNo, ModeIdIndex);
-
-	if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
-		temp = ModeNo - 0x7C;
-		colordepth = ColorDepth[temp];
-		temp = 0x6B;
-		if (infoflag & InterlaceMode) {
-			temp = temp << 1;
-		}
-		return (temp * colordepth);
-	} else
-		return (temp * colordepth);
+SiS_GetOffset(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+              USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+  USHORT temp,colordepth;
+  USHORT modeinfo,index,infoflag;
+  USHORT ColorDepth[]={0x02,0x04,0x08};  /* TW: Was 1,2,4 */
+
+  modeinfo = SiS_EModeIDTable[ModeIdIndex].Ext_ModeInfo;
+  infoflag = SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
+  if (HwDeviceExtension->jChipType < SIS_315H ) {
+  	/* 300 series */
+    	index=(modeinfo>>4)&0xFF;
+  } else {
+  	/* 310 series */
+    	index=(modeinfo>>8)&0xFF;
+  }
+  temp=SiS_ScreenOffset[index];
+  if(infoflag&InterlaceMode){
+    	temp=temp<<1;
+  }
+  colordepth=SiS_GetColorDepth(ROMAddr,ModeNo,ModeIdIndex);
+
+  if((ModeNo>=0x7C)&&(ModeNo<=0x7E)) {
+  	/* TW: For 1280x960 */
+    	temp=ModeNo-0x7C;
+    	colordepth=ColorDepth[temp];
+    	temp=0x6B;
+    	if(infoflag&InterlaceMode){
+      		temp=temp<<1;
+    	}
+   	return(temp*colordepth);
+  }
+  else return(temp*colordepth);
 }
 
 USHORT
-SiS_GetColorDepth (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
+SiS_GetColorDepth(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
 {
-	USHORT ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
-	SHORT index;
-	USHORT modeflag;
+  USHORT ColorDepth[6]={1,2,4,4,6,8};
+  SHORT  index;
+  USHORT modeflag;
+
+  if(ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+  }
+  index=(modeflag&ModeInfoFlag)-ModeEGA;
+  if(index<0) index=0;
+  return(ColorDepth[index]);
+}
+
+void
+SiS_SetCRT2Sync(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo,
+                USHORT RefreshRateTableIndex)
+{
+  USHORT tempah=0,infoflag,flag;
+
+  flag=0;
+  infoflag = SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
+  if(SiS_IF_DEF_LVDS==1){
+    if(SiS_VBInfo&SetCRT2ToLCD){
+      tempah=SiS_LCDInfo;
+      if(tempah&LCDSync){
+        flag=1;
+      }
+    }
+  }
+  if(flag!=1) tempah=infoflag>>8;
+  tempah=tempah&0xC0;
+  tempah=tempah|0x20;
+  if(!(SiS_LCDInfo&LCDRGB18Bit)) tempah=tempah|0x10;
+  if(SiS_IF_DEF_CH7005==1) tempah=tempah|0xC0;
+  SiS_SetRegANDOR(SiS_Part1Port,0x19,0x3F,tempah);
+}
+
+void
+SiS_SetCRT2FIFO(USHORT  SiS_Part1Port,ULONG ROMAddr,USHORT ModeNo,
+                PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+  USHORT temp,index;
+  USHORT modeidindex,refreshratetableindex;
+  USHORT VCLK,MCLK,colorth=0,data2;
+  ULONG  data,eax;
+  UCHAR  LatencyFactor[] ={
+  	97, 88, 86, 79, 77, 00,       /*; 64  bit    BQ=2   */
+        00, 87, 85, 78, 76, 54,       /*; 64  bit    BQ=1   */
+        97, 88, 86, 79, 77, 00,       /*; 128 bit    BQ=2   */
+        00, 79, 77, 70, 68, 48,       /*; 128 bit    BQ=1   */
+        80, 72, 69, 63, 61, 00,       /*; 64  bit    BQ=2   */
+        00, 70, 68, 61, 59, 37,       /*; 64  bit    BQ=1   */
+        86, 77, 75, 68, 66, 00,       /*; 128 bit    BQ=2   */
+        00, 68, 66, 59, 57, 37};      /*; 128 bit    BQ=1   */
+
+  SiS_SearchModeID(ROMAddr,ModeNo,&modeidindex);
+  SiS_SetFlag=SiS_SetFlag&(~ProgrammingCRT2);
+  SiS_SelectCRT2Rate=0;
+  refreshratetableindex=SiS_GetRatePtrCRT2(ROMAddr,ModeNo,modeidindex);   /* 11.GetRatePtr */
+  if(ModeNo>=0x13) {
+    index=SiS_RefIndex[refreshratetableindex].Ext_CRTVCLK;
+    index=index&0x3F;
+    VCLK=SiS_VCLKData[index].CLOCK;           /* Get VCLK  */
+    index=SiS_GetReg1(SiS_P3c4,0x1A);
+    index=index&07;
+    MCLK=SiS_MCLKData[index].CLOCK;           /* Get MCLK  */
+    data2=SiS_ModeType-0x02;
+    switch (data2) {
+      case 0 : 	colorth=1; break;
+      case 1 : 	colorth=1; break;
+      case 2 : 	colorth=2; break;
+      case 3 : 	colorth=2; break;
+      case 4 : 	colorth=3; break;
+      case 5 : 	colorth=4; break;
+    }
+    /* data2=(data2*VCLK)/MCLK;   */  /*  bx */
+    data2=(colorth*VCLK)/MCLK;  /* TW */
+
+    temp = SiS_GetReg1(SiS_P3c4,0x14);
+    temp = ((temp&0x00FF)>>6)<<1;
+    if(temp==0) temp=1;
+    temp=temp<<2;
+
+    data2=temp-data2;
+
+/*  if(data2%(28*16)) {		 TW: WRONG
+      	data2=data2/(28*16);
+      	data2++;
+    } else {
+      	data2=data2/(28*16);
+    } */
+    if((28*16)%data2) {		/* TW */
+      	data2=(28*16)/data2;
+      	data2++;
+    } else {
+      	data2=(28*16)/data2;
+    }
+
+    index=0;
+    temp = SiS_GetReg1(SiS_P3c4,0x14);
+    if(temp&0x0080) index=index+12;
+
+    SiS_SetReg4(0xcf8,0x800000A0);
+    eax=SiS_GetReg3(0xcfc);
+    temp=(USHORT)(eax>>24);
+    if(!(temp&0x01)) index=index+24;
+
+    SiS_SetReg4(0xcf8,0x80000050);
+    eax=SiS_GetReg3(0xcfc);
+    temp=(USHORT)(eax>>24);
+    if(temp&0x01) index=index+6;
+
+    temp=(temp&0x0F)>>1;
+    index=index+temp;
+    data=LatencyFactor[index];
+    data=data+15;
+    temp = SiS_GetReg1(SiS_P3c4,0x14);
+    if(!(temp&0x80)) data=data+5;
+
+    data=data+data2;
+
+    SiS_SetFlag=SiS_SetFlag|ProgrammingCRT2;
+    data=data*VCLK*colorth;
+    if(data%(MCLK<<4)) {
+      	data=data/(MCLK<<4);
+      	data++;
+    } else {
+      	data=data/(MCLK<<4);
+    }
 
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
-	}
-	index = (modeflag & ModeInfoFlag) - ModeEGA;
-	if (index < 0)
-		index = 0;
-	return (ColorDepth[index]);
-}
+/* TW: The following made all the calculations above void... */
 
-void
-SiS_SetCRT2Sync (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
-		 USHORT RefreshRateTableIndex)
-{
-	USHORT tempah = 0, infoflag, flag;
-
-	flag = 0;
-	infoflag = SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
-	if (SiS_IF_DEF_LVDS == 1) {
-		if (SiS_VBInfo & SetCRT2ToLCD) {
-			tempah = SiS_LCDInfo;
-			if (tempah & LCDSync) {
-				flag = 1;
-			}
-		}
-	}
-	if (flag != 1)
-		tempah = infoflag >> 8;
-	tempah = tempah & 0xC0;
-	tempah = tempah | 0x20;
-	if (!(SiS_LCDInfo & LCDRGB18Bit))
-		tempah = tempah | 0x10;
-	if (SiS_IF_DEF_CH7005 == 1)
-		tempah = tempah | 0xC0;
-
-	SiS_SetRegANDOR (SiS_Part1Port, 0x19, 0x3F, tempah);
-}
-
-void
-SiS_SetCRT2FIFO (USHORT SiS_Part1Port, ULONG ROMAddr, USHORT ModeNo,
-		 PSIS_HW_DEVICE_INFO HwDeviceExtension)
-{
-	USHORT temp, index;
-	USHORT modeidindex, refreshratetableindex;
-	USHORT VCLK, MCLK, colorth = 0, data, data2;
-	ULONG eax;
-	UCHAR LatencyFactor[] = { 97, 88, 86, 79, 77, 00,	/*; 64  bit    BQ=2   */
-		00, 87, 85, 78, 76, 54,	/*; 64  bit    BQ=1   */
-		97, 88, 86, 79, 77, 00,	/*; 128 bit    BQ=2   */
-		00, 79, 77, 70, 68, 48,	/*; 128 bit    BQ=1   */
-		80, 72, 69, 63, 61, 00,	/*; 64  bit    BQ=2   */
-		00, 70, 68, 61, 59, 37,	/*; 64  bit    BQ=1   */
-		86, 77, 75, 68, 66, 00,	/*; 128 bit    BQ=2   */
-		00, 68, 66, 59, 57, 37
-	};			/*; 128 bit    BQ=1   */
-
-	SiS_SearchModeID (ROMAddr, ModeNo, &modeidindex);
-	SiS_SetFlag = SiS_SetFlag & (~ProgrammingCRT2);
-	SiS_SelectCRT2Rate = 0;
-	refreshratetableindex = SiS_GetRatePtrCRT2 (ROMAddr, ModeNo, modeidindex);	/* 11.GetRatePtr */
-	if (ModeNo >= 0x13) {
-		index = SiS_RefIndex[refreshratetableindex].Ext_CRTVCLK;
-		index = index & 0x3F;
-		VCLK = SiS_VCLKData[index].CLOCK;	/* Get VCLK  */
-		index = SiS_GetReg1 (SiS_P3c4, 0x1A);
-		index = index & 07;
-		MCLK = SiS_MCLKData[index].CLOCK;	/* Get MCLK  */
-		data2 = SiS_ModeType - 0x02;
-		switch (data2) {
-		case 0:
-			colorth = 1;
-			break;
-		case 1:
-			colorth = 1;
-			break;
-		case 2:
-			colorth = 2;
-			break;
-		case 3:
-			colorth = 2;
-			break;
-		case 4:
-			colorth = 3;
-			break;
-		case 5:
-			colorth = 4;
-			break;
-		}
-		data2 = (data2 * VCLK) / MCLK;	/*  bx */
-
-		temp = SiS_GetReg1 (SiS_P3c4, 0x14);
-		temp = ((temp & 0x00FF) >> 6) << 1;
-		if (temp == 0)
-			temp = 1;
-		temp = temp << 2;
-
-		data2 = temp - data2;
-		if (data2 % (28 * 16)) {
-			data2 = data2 / (28 * 16);
-			data2++;
-		} else {
-			data2 = data2 / (28 * 16);
-		}
-
-		index = 0;
-		temp = SiS_GetReg1 (SiS_P3c4, 0x14);
-		if (temp & 0x0080)
-			index = index + 12;
-		SiS_SetReg4 (0xcf8, 0x800000A0);
-		eax = SiS_GetReg3 (0xcfc);
-		temp = (USHORT) (eax >> 24);
-		if (!(temp & 0x01))
-			index = index + 24;
-
-		SiS_SetReg4 (0xcf8, 0x80000050);
-		eax = SiS_GetReg3 (0xcfc);
-		temp = (USHORT) (eax >> 24);
-		if (temp & 0x01)
-			index = index + 6;
-		temp = (temp & 0x0F) >> 1;
-		index = index + temp;
-		data = LatencyFactor[index];
-		data = data + 15;
-		temp = SiS_GetReg1 (SiS_P3c4, 0x14);
-		if (!(temp & 0x80))
-			data = data + 5;
-		data = data + data2;
-
-		SiS_SetFlag = SiS_SetFlag | ProgrammingCRT2;
-		data = data * VCLK * colorth;
-		if (data % (MCLK << 4)) {
-			data = data / (MCLK << 4);
-			data++;
-		} else {
-			data = data / (MCLK << 4);
-		}
-		temp = 0x16;
+#if 0
+    temp=0x16;
 /*  Revision ID  */
-		temp = 0x13;
+    temp=0x13;
 /*  Revision ID  */
-		SiS_SetRegANDOR (SiS_Part1Port, 0x01, ~0x01F, temp);
-		SiS_SetRegANDOR (SiS_Part1Port, 0x02, ~0x01F, temp);
-	}
-}
-
-void
-SiS_SetCRT2FIFO2 (USHORT SiS_Part1Port, ULONG ROMAddr, USHORT ModeNo,
-		  PSIS_HW_DEVICE_INFO HwDeviceExtension)
-{
-#ifdef CONFIG_FB_SIS_315
-	UCHAR CombCode[] = { 1, 1, 1, 4, 3, 1, 3, 4, 4, 1, 4, 4, 5, 1, 5, 4 };
-	UCHAR CRT2ThLow[] =
-	    { 39, 63, 55, 79, 78, 102, 90, 114, 55, 87, 84, 116, 103, 135, 119,
-		    151 };
-#endif
-	USHORT temp, temp1, temp2, temp3;
-	USHORT index;
-	USHORT CRT1ModeNo, CRT2ModeNo;
-	USHORT ModeIdIndex;
-	USHORT RefreshRateTableIndex;
-
-	SiS_SetReg1 (SiS_Part1Port, 0x1, 0x3B);
-/* CRT1ModeNo=(UCHAR)SiS_GetReg1(SiS_P3d4,0x34); *//* get CRT1 ModeNo */
-	CRT1ModeNo = SiS_CRT1Mode;
-	/* CRT1ModeNo =ModeNo; */
-	SiS_SearchModeID (ROMAddr, CRT1ModeNo, &ModeIdIndex);	/* Get ModeID Table */
-	SiS_SetFlag = SiS_SetFlag & (~ProgrammingCRT2);
-
-	RefreshRateTableIndex = SiS_GetRatePtrCRT2 (ROMAddr, CRT1ModeNo, ModeIdIndex);	/* Set REFIndex-> for crt1 refreshrate */
-	index =
-	    SiS_GetVCLK2Ptr (ROMAddr, CRT1ModeNo, ModeIdIndex,
-			     RefreshRateTableIndex, HwDeviceExtension);
-	temp1 = SiS_VCLKData[index].CLOCK;	/* Get VCLK  */
-
-	temp2 = SiS_GetColorDepth (ROMAddr, CRT1ModeNo, ModeIdIndex);
-#ifdef CONFIG_FB_SIS_315
-	index = SiS_Get310DRAMType (ROMAddr);
-#endif
-	temp3 = SiS_MCLKData[index].CLOCK;	/* Get MCLK  */
-
-	temp = SiS_GetReg1 (SiS_P3c4, 0x14);
-	if (temp & 0x02)
-		temp = 16;
-	else
-		temp = 8;
-
-	temp = temp - temp1 * temp2 / temp3;	/* 16-DRamBus - DCLK*BytePerPixel/MCLK */
-
-	if ((52 * 16 % temp) == 0)
-		temp = 52 * 16 / temp + 40;
-	else
-		temp = 52 * 16 / temp + 40 + 1;
-
-	/* get DRAM latency */
-	temp1 = (SiS_GetReg1 (SiS_P3c4, 0x17) >> 3) & 0x7;	/* SR17[5:3] DRAM Queue depth */
-	temp2 = (SiS_GetReg1 (SiS_P3c4, 0x17) >> 6) & 0x3;	/* SR17[7:6] DRAM Grant length */
-
-#ifdef CONFIG_FB_SIS_315
-	if (SiS_Get310DRAMType (ROMAddr) < 2) {
-		for (temp3 = 0; temp3 < 16; temp3 += 2) {
-			if ((CombCode[temp3] == temp1)
-			    && (CombCode[temp3 + 1] == temp2)) {
-				temp3 = CRT2ThLow[temp3 >> 1];
-			}
-		}
-	} else {
-		for (temp3 = 0; temp3 < 16; temp3 += 2) {
-			if ((CombCode[temp3] == temp1)
-			    && (CombCode[temp3 + 1] == temp2)) {
-				temp3 = CRT2ThLow[8 + (temp3 >> 1)];
-			}
-		}
-	}
+    SiS_SetRegANDOR(SiS_Part1Port,0x01,~0x01F,temp);
+    SiS_SetRegANDOR(SiS_Part1Port,0x02,~0x01F,temp);
 #endif
 
-	temp += temp3;		/* CRT1 Request Period */
-
-	CRT2ModeNo = ModeNo;	/* get CRT2 ModeNo */
-	SiS_SearchModeID (ROMAddr, CRT2ModeNo, &ModeIdIndex);	/* Get ModeID Table */
-	SiS_SetFlag = SiS_SetFlag | ProgrammingCRT2;
-	RefreshRateTableIndex = SiS_GetRatePtrCRT2 (ROMAddr, CRT1ModeNo, ModeIdIndex);	/* Set REFIndex-> for crt1 refreshrate */
-	index =
-	    SiS_GetVCLK2Ptr (ROMAddr, CRT2ModeNo, ModeIdIndex,
-			     RefreshRateTableIndex, HwDeviceExtension);
-	temp1 = SiS_VCLKData[index].CLOCK;	/* Get VCLK  */
-
-	temp2 = SiS_GetColorDepth (ROMAddr, CRT2ModeNo, ModeIdIndex);
-#ifdef CONFIG_FB_SIS_315
-	index = SiS_Get310DRAMType (ROMAddr);
-#endif
-	temp3 = SiS_MCLKData[index].CLOCK;	/* Get MCLK  */
-
-	if ((temp * temp1 * temp2) % (16 * temp3) == 0)
-		temp = temp * temp1 * temp2 / (16 * temp3);	/* CRT1 Request period * TCLK*BytePerPixel/(MCLK*16) */
-	else
-		temp = temp * temp1 * temp2 / (16 * temp3) + 1;	/* CRT1 Request period * TCLK*BytePerPixel/(MCLK*16) */
-
-	if (temp > 0x37)
-		temp = 0x37;
-
-	SiS_SetRegANDOR (SiS_Part1Port, 0x02, ~0x3F, temp);
+   /* TW: We do this instead: */
 
+   temp = SiS_GetReg1(SiS_Part1Port,0x01);
+   if( (HwDeviceExtension->jChipType == SIS_630 ) &&
+	    ((HwDeviceExtension->jChipRevision & 0xf0) == 0x30) ) /* 630s */
+   {
+	temp = (temp & (~0x1F)) | 0x1b;  	/* TW: VESA sets 1b, prev. 0x19 */
+   } else {
+	temp = (temp & (~0x1F)) | 0x16;
+   }
+   SiS_SetReg1(SiS_Part1Port,0x01,temp);  	/* FIFO HIGH? */
+
+   if(data <= 6) data = 6;
+   if(data > 0x14) data = 0x14;
+   if (SiS_IF_DEF_LVDS==1) {			/* TW: LVDS doesn't like 0x14 */
+	if(data > 0x13) data = 0x13;
+   }
+   SiS_SetRegANDOR(SiS_Part1Port,0x02,~0x01F,data);  /* FIFO LOW? */
+  /* TW end */
+  }
 }
 
 void
-SiS_GetLVDSDesData (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		    USHORT RefreshRateTableIndex)
-{
-
-	USHORT modeflag;
-	USHORT PanelIndex, ResIndex;
-	SiS_LVDSDesStruct *PanelDesPtr = NULL;
-	if ((SiS_IF_DEF_LVDS == 0)
-	    && ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) {	/*301b *//*for test */
-		SiS_GetLVDSDesPtrA (ROMAddr, ModeNo, ModeIdIndex,
-				    RefreshRateTableIndex, &PanelIndex,
-				    &ResIndex);
-		switch (PanelIndex) {
-		case 0:
-			PanelDesPtr = LVDS1024x768Des_1;
-			break;
-		case 1:
-			PanelDesPtr = LVDS1280x1024Des_1;
-			break;
-		case 2:
-			PanelDesPtr = LVDS1280x960Des_1;
-			break;
-		case 3:
-			PanelDesPtr = LVDS1024x768Des_2;
-			break;
-		case 4:
-			PanelDesPtr = LVDS1280x1024Des_2;
-			break;
-		case 5:
-			PanelDesPtr = LVDS1280x960Des_2;
-			break;
-		}
-	} else {
-		SiS_GetLVDSDesPtr (ROMAddr, ModeNo, ModeIdIndex,
-				   RefreshRateTableIndex, &PanelIndex,
-				   &ResIndex);
-		switch (PanelIndex) {
-		case 0:
-			PanelDesPtr = SiS_PanelType00_1;
-			break;
-		case 1:
-			PanelDesPtr = SiS_PanelType01_1;
-			break;
-		case 2:
-			PanelDesPtr = SiS_PanelType02_1;
-			break;
-		case 3:
-			PanelDesPtr = SiS_PanelType03_1;
-			break;
-		case 4:
-			PanelDesPtr = SiS_PanelType04_1;
-			break;
-		case 5:
-			PanelDesPtr = SiS_PanelType05_1;
-			break;
-		case 6:
-			PanelDesPtr = SiS_PanelType06_1;
-			break;
-		case 7:
-			PanelDesPtr = SiS_PanelType07_1;
-			break;
-		case 8:
-			PanelDesPtr = SiS_PanelType08_1;
-			break;
-		case 9:
-			PanelDesPtr = SiS_PanelType09_1;
-			break;
-		case 10:
-			PanelDesPtr = SiS_PanelType0a_1;
-			break;
-		case 11:
-			PanelDesPtr = SiS_PanelType0b_1;
-			break;
-		case 12:
-			PanelDesPtr = SiS_PanelType0c_1;
-			break;
-		case 13:
-			PanelDesPtr = SiS_PanelType0d_1;
-			break;
-		case 14:
-			PanelDesPtr = SiS_PanelType0e_1;
-			break;
-		case 15:
-			PanelDesPtr = SiS_PanelType0f_1;
-			break;
-		case 16:
-			PanelDesPtr = SiS_PanelType00_2;
-			break;
-		case 17:
-			PanelDesPtr = SiS_PanelType01_2;
-			break;
-		case 18:
-			PanelDesPtr = SiS_PanelType02_2;
-			break;
-		case 19:
-			PanelDesPtr = SiS_PanelType03_2;
-			break;
-		case 20:
-			PanelDesPtr = SiS_PanelType04_2;
-			break;
-		case 21:
-			PanelDesPtr = SiS_PanelType05_2;
-			break;
-		case 22:
-			PanelDesPtr = SiS_PanelType06_2;
-			break;
-		case 23:
-			PanelDesPtr = SiS_PanelType07_2;
-			break;
-		case 24:
-			PanelDesPtr = SiS_PanelType08_2;
-			break;
-		case 25:
-			PanelDesPtr = SiS_PanelType09_2;
-			break;
-		case 26:
-			PanelDesPtr = SiS_PanelType0a_2;
-			break;
-		case 27:
-			PanelDesPtr = SiS_PanelType0b_2;
-			break;
-		case 28:
-			PanelDesPtr = SiS_PanelType0c_2;
-			break;
-		case 29:
-			PanelDesPtr = SiS_PanelType0d_2;
-			break;
-		case 30:
-			PanelDesPtr = SiS_PanelType0e_2;
-			break;
-		case 31:
-			PanelDesPtr = SiS_PanelType0f_2;
-			break;
-		case 32:
-			PanelDesPtr = SiS_CHTVUNTSCDesData;
-			break;
-		case 33:
-			PanelDesPtr = SiS_CHTVONTSCDesData;
-			break;
-		case 34:
-			PanelDesPtr = SiS_CHTVUPALDesData;
-			break;
-		case 35:
-			PanelDesPtr = SiS_CHTVOPALDesData;
-			break;
-		}
-	}
-	SiS_LCDHDES = (PanelDesPtr + ResIndex)->LCDHDES;
-	SiS_LCDVDES = (PanelDesPtr + ResIndex)->LCDVDES;
-	if (SiS_LCDInfo & LCDNonExpanding) {
-		if (SiS_LCDResInfo >= Panel1024x768) {
-			if (ModeNo <= 0x13) {
-				modeflag =
-				    SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
-				if (!(modeflag & HalfDCLK)) {
-					SiS_LCDHDES = 320;
-				}
-			}
-		}
-	}
-	return;
+SiS_SetCRT2FIFO2(USHORT SiS_Part1Port,ULONG ROMAddr,USHORT ModeNo,
+                 PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+#ifdef SIS315H
+ UCHAR CombCode[]={1,1,1,4,3,1,3,4,4,1,4,4,5,1,5,4};
+ UCHAR CRT2ThLow[]={39,63,55,79,78,102,90,114,55,87,84,116,103,135,119,151};
+#endif
+  USHORT temp,temp1,temp2,temp3;
+  USHORT index;
+  USHORT CRT1ModeNo,CRT2ModeNo;
+  USHORT ModeIdIndex;
+  USHORT RefreshRateTableIndex;
+
+  SiS_SetReg1(SiS_Part1Port,0x1,0x3B);
+  /* CRT1ModeNo=(UCHAR)SiS_GetReg1(SiS_P3d4,0x34); *//* get CRT1 ModeNo */
+  CRT1ModeNo = SiS_CRT1Mode;
+  /* CRT1ModeNo =ModeNo; */
+  SiS_SearchModeID(ROMAddr,CRT1ModeNo,&ModeIdIndex);    /* Get ModeID Table */
+  SiS_SetFlag=SiS_SetFlag& (~ProgrammingCRT2);
+
+  RefreshRateTableIndex=SiS_GetRatePtrCRT2(ROMAddr,CRT1ModeNo,
+                            ModeIdIndex); /* Set REFIndex-> for crt1 refreshrate */
+  index = SiS_GetVCLK2Ptr(ROMAddr,CRT1ModeNo,ModeIdIndex,
+                          RefreshRateTableIndex,HwDeviceExtension);
+  temp1=SiS_VCLKData[index].CLOCK;           /* Get VCLK  */
+
+  temp2= SiS_GetColorDepth(ROMAddr,CRT1ModeNo,ModeIdIndex);
+#ifdef SIS315H
+  index = SiS_Get310DRAMType(ROMAddr);
+#endif
+  temp3=SiS_MCLKData[index].CLOCK;           /* Get MCLK  */
 
-}
+  temp=SiS_GetReg1(SiS_P3c4,0x14);
+  if (temp&0x02)
+   	temp=16;
+  else
+    	temp=8;
+
+  temp = temp - temp1*temp2/temp3; /* 16-DRamBus - DCLK*BytePerPixel/MCLK */
+
+  if ((52*16 % temp)==0)
+    	temp = 52*16/temp +40;
+  else
+    	temp = 52*16/temp +40 + 1;
+
+  /* get DRAM latency */
+  temp1=(SiS_GetReg1(SiS_P3c4,0x17)>>3)&0x7; /* SR17[5:3] DRAM Queue depth */
+  temp2=(SiS_GetReg1(SiS_P3c4,0x17)>>6)&0x3; /* SR17[7:6] DRAM Grant length */
+
+#ifdef SIS315H
+  if (SiS_Get310DRAMType(ROMAddr)<2)
+  {
+    for (temp3=0;temp3<16;temp3+=2)
+    {
+      if ((CombCode[temp3]==temp1) && (CombCode[temp3+1]==temp2))
+      {
+        temp3 = CRT2ThLow[temp3>>1];
+      }
+    }
+  }
+  else
+  {
+    for (temp3=0;temp3<16;temp3+=2)
+    {
+      if ((CombCode[temp3]==temp1) && (CombCode[temp3+1]==temp2))
+      {
+        temp3 = CRT2ThLow[8+(temp3>>1)];
+      }
+    }
+  }
+#endif
 
-void
-SiS_GetLVDSDesPtr (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		   USHORT RefreshRateTableIndex, USHORT * PanelIndex,
-		   USHORT * ResIndex)
-{
-	USHORT tempbx, tempal;
+  temp +=  temp3; /* CRT1 Request Period */
 
-	tempbx = 0;
-	if (SiS_IF_DEF_CH7005 == 1) {
-		if (!(SiS_VBInfo & SetCRT2ToLCD)) {
-			tempbx = 32;
-			if (SiS_VBInfo & SetPALTV)
-				tempbx = tempbx + 2;
-			if (SiS_VBInfo & SetCHTVOverScan)
-				tempbx = tempbx + 1;
-		}
-	}
-	if (SiS_VBInfo & SetCRT2ToLCD) {
-		tempbx = SiS_LCDTypeInfo;
-		if (SiS_LCDInfo & LCDNonExpanding) {
-			tempbx = tempbx + 16;
-		}
-	}
-	if (ModeNo <= 0x13) {
-		tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
-	} else {
-		tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
-	}
-	tempal = tempal & 0x1F;
-	*PanelIndex = tempbx;
-	*ResIndex = tempal;
-}
+  CRT2ModeNo = ModeNo; /* get CRT2 ModeNo */
+  SiS_SearchModeID(ROMAddr,CRT2ModeNo,&ModeIdIndex);    /* Get ModeID Table */
+  SiS_SetFlag=SiS_SetFlag|ProgrammingCRT2;
+  RefreshRateTableIndex=SiS_GetRatePtrCRT2(ROMAddr,CRT1ModeNo,
+                        ModeIdIndex);/* Set REFIndex-> for crt1 refreshrate */
+  index = SiS_GetVCLK2Ptr(ROMAddr,CRT2ModeNo,ModeIdIndex,
+                          RefreshRateTableIndex,HwDeviceExtension);
+  temp1=SiS_VCLKData[index].CLOCK;           /* Get VCLK  */
+
+  temp2= SiS_GetColorDepth(ROMAddr,CRT2ModeNo,ModeIdIndex);
+#ifdef SIS315H
+  index = SiS_Get310DRAMType(ROMAddr);
+#endif
+  temp3=SiS_MCLKData[index].CLOCK;           /* Get MCLK  */
+ 
+  if ((temp*temp1*temp2)%(16*temp3)==0)
+    temp = temp*temp1*temp2/(16*temp3);   /* CRT1 Request period * TCLK*BytePerPixel/(MCLK*16) */
+  else 
+    temp = temp*temp1*temp2/(16*temp3)+1; /* CRT1 Request period * TCLK*BytePerPixel/(MCLK*16) */
 
-/*301b*/
-void
-SiS_GetLVDSDesPtrA (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		    USHORT RefreshRateTableIndex, USHORT * PanelIndex,
-		    USHORT * ResIndex)
-{
-	USHORT tempbx, tempal;
-
-	tempbx = 0;
-	tempbx = SiS_LCDResInfo;
-	tempbx = tempbx - Panel1024x768;
-	if (SiS_LCDInfo & LCDNonExpanding) {
-		tempbx = tempbx + 3;
-	}
+  if (temp>0x37)
+    temp = 0x37;
 
-	if (ModeNo <= 0x13) {
-		tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
-	} else {
-		tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
-	}
-	tempal = tempal & 0x1F;
-	*PanelIndex = tempbx;
-	*ResIndex = tempal;
+  SiS_SetRegANDOR(SiS_Part1Port,0x02,~0x3F,temp);
 }
 
-/*end 301b*/
-
 void
-SiS_SetCRT2ModeRegs (USHORT BaseAddr, USHORT ModeNo,
-		     PSIS_HW_DEVICE_INFO HwDeviceExtension)
+SiS_GetLVDSDesData(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                   USHORT RefreshRateTableIndex)
 {
-	USHORT i, j;
-	USHORT tempcl, tempah;
-/*301b*/
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-	    && (SiS_VBInfo & SetCRT2ToLCDA)) {
-		SiS_SetRegANDOR (SiS_Part1Port, 0x00, ~0x050, 0x40);
-		SiS_SetRegAND (SiS_Part1Port, 0x2E, 0xF7);
-		SiS_SetRegANDOR (SiS_Part1Port, 0x13, 0xFB, 0x04);
-		SiS_SetRegANDOR (SiS_Part1Port, 0x2c, 0xCF, 0x30);
-		SiS_SetRegANDOR (SiS_Part4Port, 0x21, 0x3F, 0xC0);
-		SiS_SetRegANDOR (SiS_Part4Port, 0x23, 0x7F, 0x00);
-	}
-	/*end 301b */
-	else {
-		for (i = 0, j = 4; i < 3; i++, j++)
-			SiS_SetReg1 (SiS_Part1Port, j, 0);
-
-		tempcl = SiS_ModeType;
-		if (HwDeviceExtension->jChipType < SIS_315H) {	/* 300 series */
-			if (ModeNo > 0x13) {
-				tempcl = tempcl - ModeVGA;
-				if ((tempcl > 0) || (tempcl == 0)) {
-					tempah = ((0x010 >> tempcl) | 0x080);
-				}
-			} else {
-				tempah = 0x080;
-			}
-			if (SiS_VBInfo & SetInSlaveMode) {
-				tempah = (tempah ^ 0x0A0);
-			}
-		} else {	/* 310 series */
-
-			if (ModeNo > 0x13) {
-				tempcl = tempcl - ModeVGA;
-				if ((tempcl > 0) || (tempcl == 0)) {
-					tempah = (0x008 >> tempcl);
-					if (tempah == 0)
-						tempah = 1;
-					tempah |= 0x040;
-				}
-			} else {
-				tempah = 0x040;
-			}
-
-			if (SiS_VBInfo & SetInSlaveMode) {
-				tempah = (tempah ^ 0x050);
-			}
-
-		}
-
-		if (SiS_VBInfo & CRT2DisplayFlag) {
-			tempah = 0;
-		}
-		SiS_SetReg1 (SiS_Part1Port, 0x00, tempah);
-
-		if (SiS_IF_DEF_LVDS == 0) {	/* ifdef 301 */
-			tempah = 0x01;
-			if (!(SiS_VBInfo & SetInSlaveMode)) {
-				tempah = (tempah | 0x02);
-			}
-			if (!(SiS_VBInfo & SetCRT2ToRAMDAC)) {
-				tempah = (tempah ^ 0x05);
-				if (!(SiS_VBInfo & SetCRT2ToLCD)) {
-					tempah = (tempah ^ 0x01);
-				}
-			}
-
-			tempcl = tempah;	/* 05/03/01 ynlai for TV display bug */
-
-			if (HwDeviceExtension->jChipType < SIS_315H) {	/* 300 series */
-				tempah = (tempah << 5) & 0xFF;
-				if (SiS_VBInfo & CRT2DisplayFlag) {
-					tempah = 0;
-				}
-				SiS_SetReg1 (SiS_Part1Port, 0x01, tempah);
-
-				tempah = tempah >> 5;
-			} else {	/* 310 series */
-
-				if (SiS_VBInfo & CRT2DisplayFlag) {
-					tempah = 0;
-				}
-				tempah =
-				    (SiS_GetReg1 (SiS_Part1Port, 0x2E) & 0xF8) |
-				    tempah;
-				SiS_SetReg1 (SiS_Part1Port, 0x2E, tempah);
-				tempah = tempcl;
-			}
-
-			if ((SiS_ModeType == ModeVGA)
-			    && (!(SiS_VBInfo & SetInSlaveMode))) {
-				tempah = tempah | 0x010;
-			}
-
-			if (SiS_LCDResInfo == Panel1024x768)
-				tempah = tempah | 0x080;
-
-			if ((SiS_LCDResInfo == Panel1280x1024)
-			    || (SiS_LCDResInfo == Panel1280x960)) {
-				tempah = tempah | 0x080;
-			}
-			if (SiS_VBInfo & SetCRT2ToTV) {
-				if (SiS_VBInfo & SetInSlaveMode) {
-					if (
-					    ((SiS_VBType & VB_SIS301B)
-					     || (SiS_VBType & VB_SIS302B))) {	/*301b */
-						if (SiS_SetFlag & TVSimuMode)
-							tempah = tempah | 0x020;
-					} else
-						tempah = tempah | 0x020;
-				}
-			}
-			SiS_SetRegANDOR (SiS_Part4Port, 0x0D, ~0x0BF, tempah);
-			tempah = 0;
-			if (SiS_VBInfo & SetCRT2ToTV) {
-				if (SiS_VBInfo & SetInSlaveMode) {
-					if (
-					    ((SiS_VBType & VB_SIS301B)
-					     || (SiS_VBType & VB_SIS302B))) {	/*301b */
-						{
-							SiS_SetFlag =
-							    SiS_SetFlag |
-							    RPLLDIV2XO;
-							tempah = tempah | 0x40;
-						}
-					} else {
-						if (!(SiS_SetFlag & TVSimuMode)) {
-							if (!
-							    (SiS_VBInfo &
-							     SetCRT2ToHiVisionTV))
-							{
-								SiS_SetFlag =
-								    SiS_SetFlag
-								    |
-								    RPLLDIV2XO;
-								tempah =
-								    tempah |
-								    0x40;
-							}
-						}
-					}
-				} else {
-					SiS_SetFlag = SiS_SetFlag | RPLLDIV2XO;
-					tempah = tempah | 0x40;
-				}
-			}
-			if (SiS_LCDResInfo == Panel1280x1024)
-				tempah = tempah | 0x80;
-			if (SiS_LCDResInfo == Panel1280x960)
-				tempah = tempah | 0x80;
-			SiS_SetReg1 (SiS_Part4Port, 0x0C, tempah);
-		} else {
-			/*LVDS*/ tempah = 0;
-			if (!(SiS_VBInfo & SetInSlaveMode)) {
-				tempah = tempah | 0x02;
-			}
-			SiS_SetRegANDOR (SiS_Part1Port, 0x2e, 0xF0, tempah);
-		}
-	}
-/*301b*/
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-	    && (!(SiS_VBInfo & SetCRT2ToLCDA))) {
-		if (SiS_IsDualEdge (BaseAddr))
-			SiS_SetRegANDOR (SiS_Part1Port, 0x13, 0xFB, 0x00);
-		else
-			SiS_SetRegANDOR (SiS_Part1Port, 0x13, 0xFF, 0x00);
-		if (SiS_IsDualEdge (BaseAddr))
-			SiS_SetRegANDOR (SiS_Part1Port, 0x2c, 0xCF, 0x00);
-		else
-			SiS_SetRegANDOR (SiS_Part1Port, 0x2c, 0xFF, 0x00);
-		if (SiS_IsDualEdge (BaseAddr))
-			SiS_SetRegANDOR (SiS_Part4Port, 0x21, 0x3F, 0x00);
-		else
-			SiS_SetRegANDOR (SiS_Part4Port, 0x21, 0xFF, 0x00);
-
-		if (SiS_IsDualEdge (BaseAddr))
-			SiS_SetRegANDOR (SiS_Part4Port, 0x23, 0xFF, 0x80);
-		else
-			SiS_SetRegANDOR (SiS_Part4Port, 0x23, 0xFF, 0x00);
-	}
+  USHORT modeflag;
+  USHORT PanelIndex,ResIndex;
+  SiS_LVDSDesStruct  *PanelDesPtr=NULL;
 
-/*end 301b*/
-}
-void
-SiS_GetCRT2Data (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		 USHORT RefreshRateTableIndex)
-{
-	if (SiS_IF_DEF_LVDS == 0) {	/*301  */
-		if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
-			if (SiS_VBInfo & SetCRT2ToLCDA)
-				SiS_GetCRT2DataLVDS (ROMAddr, ModeNo,
-						     ModeIdIndex,
-						     RefreshRateTableIndex);
-			else
-				SiS_GetCRT2Data301 (ROMAddr, ModeNo,
-						    ModeIdIndex,
-						    RefreshRateTableIndex);
-		} else
-			SiS_GetCRT2Data301 (ROMAddr, ModeNo, ModeIdIndex,
-					    RefreshRateTableIndex);
-		return;
-	} else {		/*LVDS */
-		SiS_GetCRT2DataLVDS (ROMAddr, ModeNo, ModeIdIndex,
-				     RefreshRateTableIndex);
-		return;
-	}
+  if((SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+       && (SiS_IF_DEF_LVDS == 0) ) {  /*301b*//*for test*/
+     SiS_GetLVDSDesPtrA(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                        &PanelIndex,&ResIndex);
+     switch (PanelIndex)
+     {
+     	case  0: PanelDesPtr = LVDS1024x768Des_1;   break;
+     	case  1: PanelDesPtr = LVDS1280x1024Des_1;  break;
+     	case  2: PanelDesPtr = LVDS1280x960Des_1;   break;
+     	case  3: PanelDesPtr = LVDS1024x768Des_2;   break;
+     	case  4: PanelDesPtr = LVDS1280x1024Des_2;  break;
+     	case  5: PanelDesPtr = LVDS1280x960Des_2;   break;
+     }
+  } else {
+     SiS_GetLVDSDesPtr(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                       &PanelIndex,&ResIndex);
+#ifdef LINUX_KERNEL
+     if (PanelIndex < 32)	/* >=32 = TV */
+         printk(KERN_INFO "sisfb: LVDS-LCD panel type %d (Resindex %d)\n", PanelIndex, ResIndex);
+#endif
+     switch (PanelIndex)
+     {
+     	case  0: PanelDesPtr = SiS_PanelType00_1;   break;
+     	case  1: PanelDesPtr = SiS_PanelType01_1;   break;
+     	case  2: PanelDesPtr = SiS_PanelType02_1;   break;
+     	case  3: PanelDesPtr = SiS_PanelType03_1;   break;
+     	case  4: PanelDesPtr = SiS_PanelType04_1;   break;
+     	case  5: PanelDesPtr = SiS_PanelType05_1;   break;
+     	case  6: PanelDesPtr = SiS_PanelType06_1;   break;
+     	case  7: PanelDesPtr = SiS_PanelType07_1;   break;
+     	case  8: PanelDesPtr = SiS_PanelType08_1;   break;
+     	case  9: PanelDesPtr = SiS_PanelType09_1;   break;
+     	case 10: PanelDesPtr = SiS_PanelType0a_1;   break;
+     	case 11: PanelDesPtr = SiS_PanelType0b_1;   break;
+     	case 12: PanelDesPtr = SiS_PanelType0c_1;   break;	/* TW: Clevo 2202   */
+     	case 13: PanelDesPtr = SiS_PanelType0d_1;   break;
+     	case 14: PanelDesPtr = SiS_PanelType0e_1;   break;	/* TW: Uniwill N271S2 */
+     	case 15: PanelDesPtr = SiS_PanelType0f_1;   break;
+     	case 16: PanelDesPtr = SiS_PanelType00_2;   break;
+     	case 17: PanelDesPtr = SiS_PanelType01_2;   break;
+     	case 18: PanelDesPtr = SiS_PanelType02_2;   break;
+     	case 19: PanelDesPtr = SiS_PanelType03_2;   break;
+     	case 20: PanelDesPtr = SiS_PanelType04_2;   break;
+     	case 21: PanelDesPtr = SiS_PanelType05_2;   break;
+     	case 22: PanelDesPtr = SiS_PanelType06_2;   break;
+     	case 23: PanelDesPtr = SiS_PanelType07_2;   break;
+     	case 24: PanelDesPtr = SiS_PanelType08_2;   break;
+     	case 25: PanelDesPtr = SiS_PanelType09_2;   break;
+     	case 26: PanelDesPtr = SiS_PanelType0a_2;   break;
+     	case 27: PanelDesPtr = SiS_PanelType0b_2;   break;
+     	case 28: PanelDesPtr = SiS_PanelType0c_2;   break;
+     	case 29: PanelDesPtr = SiS_PanelType0d_2;   break;
+     	case 30: PanelDesPtr = SiS_PanelType0e_2;   break;
+     	case 31: PanelDesPtr = SiS_PanelType0f_2;   break;
+     	case 32: PanelDesPtr = SiS_CHTVUNTSCDesData;   break;
+     	case 33: PanelDesPtr = SiS_CHTVONTSCDesData;   break;
+     	case 34: PanelDesPtr = SiS_CHTVUPALDesData;    break;
+     	case 35: PanelDesPtr = SiS_CHTVOPALDesData;    break;
+     }
+  }
+  SiS_LCDHDES = (PanelDesPtr+ResIndex)->LCDHDES;
+  SiS_LCDVDES = (PanelDesPtr+ResIndex)->LCDVDES;
+
+  if(SiS_LCDInfo&LCDNonExpanding){
+    if(SiS_LCDResInfo>=Panel1024x768){
+      if(ModeNo<=0x13){
+        modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+        if(!(modeflag&HalfDCLK)) {
+          SiS_LCDHDES=320;
+        }
+      }
+    }
+  }
+  return;
 }
 
 void
-SiS_GetCRT2DataLVDS (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		     USHORT RefreshRateTableIndex)
-{
-	USHORT tempax, tempbx;
-	USHORT CRT2Index, ResIndex;
-	SiS_LVDSDataStruct *LVDSData = NULL;
-
-	SiS_GetCRT2ResInfo (ROMAddr, ModeNo, ModeIdIndex);
-	/*301b */
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-	    && (SiS_VBInfo & SetCRT2ToLCDA)) {
-		SiS_GetCRT2PtrA (ROMAddr, ModeNo, ModeIdIndex,
-				 RefreshRateTableIndex, &CRT2Index, &ResIndex);
-		switch (CRT2Index) {
-		case 0:
-			LVDSData = SiS_LVDS1024x768Data_1;
-			break;
-		case 1:
-			LVDSData = SiS_LVDS1280x1024Data_1;
-			break;
-		case 2:
-			LVDSData = SiS_LVDS1280x1024Data_1;
-			break;
-			/*  case  2:  LVDSData=SiS_LVDS1280x960Data_1;  break; */
-		case 3:
-			LVDSData = SiS_LVDS1024x768Data_2;
-			break;
-		case 4:
-			LVDSData = SiS_LVDS1280x1024Data_2;
-			break;
-		case 5:
-			LVDSData = SiS_LVDS1280x1024Data_2;
-			break;
-			/*  case  5:  LVDSData=SiS_LVDS1280x960Data_2;  break; */
-		}
-	}
+SiS_GetLVDSDesPtr(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                  USHORT RefreshRateTableIndex,USHORT *PanelIndex,
+		  USHORT *ResIndex)
+{
+  USHORT tempbx,tempal;
+
+  tempbx=0;
+  if(SiS_IF_DEF_CH7005==1) {
+    if(!(SiS_VBInfo&SetCRT2ToLCD)) {
+      tempbx=32;
+      if(SiS_VBInfo&SetPALTV) tempbx=tempbx+2;
+      if(SiS_VBInfo&SetCHTVOverScan) tempbx=tempbx+1;
+    }
+  } 
+  if(SiS_VBInfo&SetCRT2ToLCD) {
+    tempbx=SiS_LCDTypeInfo;
+    if(SiS_LCDInfo&LCDNonExpanding){
+      tempbx=tempbx+16;
+    }
+  }
+  if(ModeNo<=0x13){
+    	tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+  }else{
+    	tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+  }
+  tempal=tempal&0x1F;
+  *PanelIndex=tempbx;
+  *ResIndex=tempal;
+}
 
-	else {
-		SiS_GetCRT2Ptr (ROMAddr, ModeNo, ModeIdIndex,
-				RefreshRateTableIndex, &CRT2Index, &ResIndex);
-		switch (CRT2Index) {
-		case 0:
-			LVDSData = SiS_LVDS800x600Data_1;
-			break;
-		case 1:
-			LVDSData = SiS_LVDS1024x768Data_1;
-			break;
-		case 2:
-			LVDSData = SiS_LVDS1280x1024Data_1;
-			break;
-		case 3:
-			LVDSData = SiS_LVDS800x600Data_2;
-			break;
-		case 4:
-			LVDSData = SiS_LVDS1024x768Data_2;
-			break;
-		case 5:
-			LVDSData = SiS_LVDS1280x1024Data_2;
-			break;
-		case 6:
-			LVDSData = SiS_LVDS640x480Data_1;
-			break;
-		case 7:
-			LVDSData = SiS_CHTVUNTSCData;
-			break;
-		case 8:
-			LVDSData = SiS_CHTVONTSCData;
-			break;
-		case 9:
-			LVDSData = SiS_CHTVUPALData;
-			break;
-		case 10:
-			LVDSData = SiS_CHTVOPALData;
-			break;
-		}
-	}
-	SiS_VGAHT = (LVDSData + ResIndex)->VGAHT;
-	SiS_VGAVT = (LVDSData + ResIndex)->VGAVT;
-	SiS_HT = (LVDSData + ResIndex)->LCDHT;
-	SiS_VT = (LVDSData + ResIndex)->LCDVT;
 /*301b*/
-	if ((SiS_IF_DEF_LVDS == 0)
-	    && ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) {	/*for test */
-		if (!(SiS_LCDInfo & LCDNonExpanding)) {
-			if (SiS_LCDResInfo == Panel1024x768) {
-				tempax = 1024;
-				tempbx = 768;
-			} else {
-				tempax = 1280;
-				tempbx = 1024;
-			}
-			SiS_HDE = tempax;
-			SiS_VDE = tempbx;
-		}
-	} else {
-		if (SiS_IF_DEF_TRUMPION == 0) {
-			if (SiS_VBInfo & SetCRT2ToLCD) {
-				if (!(SiS_LCDInfo & LCDNonExpanding)) {
-					if (SiS_LCDResInfo == Panel800x600) {
-						tempax = 800;
-						tempbx = 600;
-					} else if (SiS_LCDResInfo ==
-						   Panel1024x768) {
-						tempax = 1024;
-						tempbx = 768;
-					} else {
-						tempax = 1280;
-						tempbx = 1024;
-					}
-					SiS_HDE = tempax;
-					SiS_VDE = tempbx;
-				}
-			}
-		}
-	}
-	return;
+void
+SiS_GetLVDSDesPtrA(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                   USHORT RefreshRateTableIndex,USHORT *PanelIndex,
+		   USHORT *ResIndex)
+{
+  USHORT tempbx=0,tempal;
+
+  tempbx=SiS_LCDResInfo-Panel1024x768;
+  if(SiS_LCDInfo&LCDNonExpanding){
+      tempbx=tempbx+3;
+  }
+
+  if(ModeNo<=0x13){
+    	tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+  } else {
+    	tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+  }
+  tempal=tempal&0x1F;
+  *PanelIndex=tempbx;
+  *ResIndex=tempal;
 }
+/*end 301b*/
 
 void
-SiS_GetCRT2Data301 (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		    USHORT RefreshRateTableIndex)
+SiS_SetCRT2ModeRegs(USHORT BaseAddr,USHORT ModeNo,
+                    PSIS_HW_DEVICE_INFO HwDeviceExtension)
 {
-	USHORT tempax, tempbx, modeflag;
-	USHORT resinfo;
-	USHORT CRT2Index, ResIndex;
-	SiS_LCDDataStruct *LCDPtr = NULL;
-	SiS_TVDataStruct *TVPtr = NULL;
-
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ResInfo */
-		resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+Ext_ResInfo */
-		resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
-	}
-	SiS_NewFlickerMode = 0;
-	SiS_RVBHRS = 50;
-	SiS_RY1COE = 0;
-	SiS_RY2COE = 0;
-	SiS_RY3COE = 0;
-	SiS_RY4COE = 0;
-
-	SiS_GetCRT2ResInfo (ROMAddr, ModeNo, ModeIdIndex);
-	if (SiS_VBInfo & SetCRT2ToRAMDAC) {
-		SiS_GetRAMDAC2DATA (ROMAddr, ModeNo, ModeIdIndex,
-				    RefreshRateTableIndex);
-		return;
-	}
+  USHORT i,j;
+  USHORT tempcl,tempah;
 
-	if (SiS_VBInfo & SetCRT2ToTV) {
-		SiS_GetCRT2Ptr (ROMAddr, ModeNo, ModeIdIndex,
-				RefreshRateTableIndex, &CRT2Index, &ResIndex);
-		switch (CRT2Index) {
-		case 2:
-			TVPtr = SiS_ExtHiTVData;
-			break;
-		case 3:
-			TVPtr = SiS_ExtPALData;
-			break;
-		case 4:
-			TVPtr = SiS_ExtNTSCData;
-			break;
-		case 7:
-			TVPtr = SiS_St1HiTVData;
-			break;
-		case 8:
-			TVPtr = SiS_StPALData;
-			break;
-		case 9:
-			TVPtr = SiS_StNTSCData;
-			break;
-		case 12:
-			TVPtr = SiS_St2HiTVData;
-			break;
-		}
-
-		SiS_RVBHCMAX = (TVPtr + ResIndex)->RVBHCMAX;
-		SiS_RVBHCFACT = (TVPtr + ResIndex)->RVBHCFACT;
-		SiS_VGAHT = (TVPtr + ResIndex)->VGAHT;
-		SiS_VGAVT = (TVPtr + ResIndex)->VGAVT;
-		SiS_HDE = (TVPtr + ResIndex)->TVHDE;
-		SiS_VDE = (TVPtr + ResIndex)->TVVDE;
-		SiS_RVBHRS = (TVPtr + ResIndex)->RVBHRS;
-		SiS_NewFlickerMode = (TVPtr + ResIndex)->FlickerMode;
-		if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
-			if (resinfo == 0x08)
-				SiS_NewFlickerMode = 0x40;
-			if (resinfo == 0x09)
-				SiS_NewFlickerMode = 0x40;
-			if (resinfo == 0x10)
-				SiS_NewFlickerMode = 0x40;
-		}
-		if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
-			if (SiS_VGAVDE == 350)
-				SiS_SetFlag = SiS_SetFlag | TVSimuMode;
-			tempax = ExtHiTVHT;
-			tempbx = ExtHiTVVT;
-			if (SiS_VBInfo & SetInSlaveMode) {
-				if (SiS_SetFlag & TVSimuMode) {
-					tempax = StHiTVHT;
-					tempbx = StHiTVVT;
-					if (!(modeflag & Charx8Dot)) {
-						tempax = StHiTextTVHT;
-						tempbx = StHiTextTVVT;
-					}
-				}
-			}
-		}
-		if (!(SiS_VBInfo & SetCRT2ToHiVisionTV)) {
-			SiS_RY1COE = (TVPtr + ResIndex)->RY1COE;
-			SiS_RY2COE = (TVPtr + ResIndex)->RY2COE;
-			if (modeflag & HalfDCLK) {
-				SiS_RY1COE = 0x00;
-				SiS_RY2COE = 0xf4;
-			}
-			SiS_RY3COE = (TVPtr + ResIndex)->RY3COE;
-			SiS_RY4COE = (TVPtr + ResIndex)->RY4COE;
-			if (modeflag & HalfDCLK) {
-				SiS_RY3COE = 0x10;
-				SiS_RY4COE = 0x38;
-			}
-			if (!(SiS_VBInfo & SetPALTV)) {
-				tempax = NTSCHT;
-				tempbx = NTSCVT;
-			} else {
-				tempax = PALHT;
-				tempbx = PALVT;
-			}
-		}
-		SiS_HT = tempax;
-		SiS_VT = tempbx;
-		return;
-	}
+  SiS_SetReg1(SiS_Part1Port,0x03,0x00);   /*fix write part1 index 0  BTDRAM bit Bug*/
 
-	if (SiS_VBInfo & SetCRT2ToLCD) {
-		SiS_GetCRT2Ptr (ROMAddr, ModeNo, ModeIdIndex,
-				RefreshRateTableIndex, &CRT2Index, &ResIndex);
-		switch (CRT2Index) {
-		case 0:
-			LCDPtr = SiS_ExtLCD1024x768Data;
-			break;
-		case 1:
-			LCDPtr = SiS_ExtLCD1280x1024Data;
-			break;
-		case 5:
-			LCDPtr = SiS_StLCD1024x768Data;
-			break;
-		case 6:
-			LCDPtr = SiS_StLCD1280x1024Data;
-			break;
-		case 10:
-			LCDPtr = SiS_St2LCD1024x768Data;
-			break;
-		case 11:
-			LCDPtr = SiS_St2LCD1280x1024Data;
-			break;
-		case 13:
-			LCDPtr = SiS_NoScaleData;
-			break;
-		case 14:
-			LCDPtr = SiS_LCD1280x960Data;
-			break;
-		}
-
-		SiS_RVBHCMAX = (LCDPtr + ResIndex)->RVBHCMAX;
-		SiS_RVBHCFACT = (LCDPtr + ResIndex)->RVBHCFACT;
-		SiS_VGAHT = (LCDPtr + ResIndex)->VGAHT;
-		SiS_VGAVT = (LCDPtr + ResIndex)->VGAVT;
-		SiS_HT = (LCDPtr + ResIndex)->LCDHT;
-		SiS_VT = (LCDPtr + ResIndex)->LCDVT;
-		tempax = 1024;
-		if (SiS_SetFlag & LCDVESATiming) {
-			if (SiS_VGAVDE == 350)
-				tempbx = 560;
-			else if (SiS_VGAVDE == 400)
-				tempbx = 640;
-			else
-				tempbx = 768;
-		} else {
-			if (SiS_VGAVDE == 357)
-				tempbx = 527;
-			else if (SiS_VGAVDE == 420)
-				tempbx = 620;
-			else if (SiS_VGAVDE == 525)
-				tempbx = 775;
-			else if (SiS_VGAVDE == 600)
-				tempbx = 775;
-			else if (SiS_VGAVDE == 350)
-				tempbx = 560;
-			else if (SiS_VGAVDE == 400)
-				tempbx = 640;
-			else
-				tempbx = 768;
-		}
-		if (SiS_LCDResInfo == Panel1280x1024) {
-			tempax = 1280;
-			if (SiS_VGAVDE == 360)
-				tempbx = 768;
-			else if (SiS_VGAVDE == 375)
-				tempbx = 800;
-			else if (SiS_VGAVDE == 405)
-				tempbx = 864;
-			else
-				tempbx = 1024;
-		}
-		if (SiS_LCDResInfo == Panel1280x960) {
-			tempax = 1280;
-			if (SiS_VGAVDE == 350)
-				tempbx = 700;
-			else if (SiS_VGAVDE == 400)
-				tempbx = 800;
-			else if (SiS_VGAVDE == 1024)
-				tempbx = 960;
-			else
-				tempbx = 960;
-		}
-		if (SiS_LCDInfo & LCDNonExpanding) {
-			tempax = SiS_VGAHDE;
-			tempbx = SiS_VGAVDE;
-		}
-		SiS_HDE = tempax;
-		SiS_VDE = tempbx;
-		return;
-	}
+  /*301b*/
+  if( (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+  				&& (SiS_VBInfo&SetCRT2ToLCDA) ) {
+
+	/* TW:   1. for 301B/302B/301LV/302LV (on some of which
+	 *          IF_DEF_LVDS seems to be 1 as well)
+	 */
+
+      SiS_SetRegANDOR(SiS_Part1Port,0x00,~0x050,0x40); /* FUNCTION CONTROL */
+      SiS_SetRegAND(SiS_Part1Port,0x2E,0xF7);
+      SiS_SetRegANDOR(SiS_Part1Port,0x13,0xFB,0x04);
+      SiS_SetRegANDOR(SiS_Part1Port,0x2c,0xCF,0x30);
+      SiS_SetRegANDOR(SiS_Part4Port,0x21,0x3F,0xC0);
+      SiS_SetRegANDOR(SiS_Part4Port,0x23,0x7F,0x00);
+  /*end 301b*/
+  } else {
+    for(i=0,j=4;i<3;i++,j++) SiS_SetReg1(SiS_Part1Port,j,0);
+
+    tempcl=SiS_ModeType;
+    if(HwDeviceExtension->jChipType < SIS_315H) {
+      /* ---- 300 series ---- */
+      if(ModeNo>0x13){
+        tempcl=tempcl-ModeVGA;
+        if((tempcl>0)||(tempcl==0)){
+           tempah=((0x010>>tempcl)|0x080);
+        }
+      } else {
+        tempah=0x080;
+      }
+      if(SiS_VBInfo&SetInSlaveMode){
+         tempah=(tempah^0x0A0);
+      }
+    } else {
+    /* ---- 310 series ---- */
+      if(ModeNo>0x13) {
+        tempcl=tempcl-ModeVGA;
+        if((tempcl>0)||(tempcl==0)){
+           tempah=(0x008>>tempcl);
+           if (tempah==0) tempah=1;
+              tempah |= 0x040;
+        }
+      } else {
+       tempah=0x040;
+      }
+  
+      if(SiS_VBInfo&SetInSlaveMode){
+          tempah=(tempah^0x050);
+      }
+    }
+
+    if(SiS_VBInfo&CRT2DisplayFlag){
+      	tempah=0;
+    }
+    SiS_SetReg1(SiS_Part1Port,0x00,tempah);  /* FUNCTION CONTROL */
+
+    if(SiS_IF_DEF_LVDS==0) {    /* ifdef 301*/
+
+	/* TW:   2. for 301 */
+
+    	tempah=0x01;
+    	if(!(SiS_VBInfo&SetInSlaveMode)) {
+      		tempah=(tempah|0x02);
+    	}
+    	if(!(SiS_VBInfo&SetCRT2ToRAMDAC)) {
+      		tempah=(tempah^0x05);
+      		if(!(SiS_VBInfo&SetCRT2ToLCD)) {
+        		tempah=(tempah^0x01);
+      		}
+    	}
+
+    	tempcl=tempah;     /* 05/03/01 ynlai for TV display bug */
+
+    	if(HwDeviceExtension->jChipType < SIS_315H) {
+      		/* 300 series */
+      		tempah=(tempah<<5)&0xFF;
+      		if(SiS_VBInfo&CRT2DisplayFlag){
+        		tempah=0;
+      		}
+      		SiS_SetReg1(SiS_Part1Port,0x01,tempah);
+
+      		tempah=tempah>>5;
+    	} else {
+      		/* 310 series */
+      		if(SiS_VBInfo&CRT2DisplayFlag){
+        		tempah=0;
+      		}
+      		tempah = (SiS_GetReg1(SiS_Part1Port,0x2E)&0xF8)|tempah;
+      		SiS_SetReg1(SiS_Part1Port,0x2E,tempah);
+      		tempah=tempcl;
+    	}
+
+    	if((SiS_ModeType==ModeVGA)&&(!(SiS_VBInfo&SetInSlaveMode))){
+      		tempah=tempah|0x010;
+    	}
+      
+     	if(SiS_LCDResInfo==Panel1024x768)
+         	tempah=tempah|0x080;
+  
+    	if((SiS_LCDResInfo==Panel1280x1024)||(SiS_LCDResInfo==Panel1280x960)){
+      		tempah=tempah|0x080;
+    	}
+    	if(SiS_VBInfo&SetCRT2ToTV){
+      		if(SiS_VBInfo&SetInSlaveMode){
+        		if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {   /*301b*/
+          			if(SiS_SetFlag&TVSimuMode)
+                			tempah=tempah|0x020;
+        		} else
+          			tempah=tempah|0x020;
+      		}
+    	}
+    	SiS_SetRegANDOR(SiS_Part4Port,0x0D,~0x0BF,tempah);
+    	tempah=0;
+    	if(SiS_VBInfo&SetCRT2ToTV) {
+      		if(SiS_VBInfo&SetInSlaveMode) {
+       			if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) { /*301b*/
+           		{
+            			SiS_SetFlag=SiS_SetFlag|RPLLDIV2XO;
+            			tempah=tempah|0x40;
+          		}
+       			} else {
+        			if(!(SiS_SetFlag&TVSimuMode)) {
+          				if(!(SiS_VBInfo&SetCRT2ToHiVisionTV)) {
+            					SiS_SetFlag=SiS_SetFlag|RPLLDIV2XO;
+            					tempah=tempah|0x40;
+          				}
+        			}
+      			}
+     		}
+      		else {
+        		SiS_SetFlag=SiS_SetFlag|RPLLDIV2XO;
+        		tempah=tempah|0x40;
+      		}
+    	}
+    	if(SiS_LCDResInfo==Panel1280x1024) tempah=tempah|0x80;
+    	if(SiS_LCDResInfo==Panel1280x960) tempah=tempah|0x80;
+    	SiS_SetReg1(SiS_Part4Port,0x0C,tempah);
+    } else {
+
+    	/* TW: 3. for LVDS, _not_ 301B/302B/301LV/302LV */
+
+    	tempah=0;
+
+    	if((!(SiS_VBInfo&SetInSlaveMode)) &&
+          	    (ModeNo!=0x2e)&&(ModeNo!=0x30)&&(ModeNo!=0x38)&&(ModeNo!=0x3A)) {
+      			tempah=tempah|0x02;
+    	}
+    	SiS_SetRegANDOR(SiS_Part1Port,0x2e,0xF0,tempah); /* <------------------- */
+    }
+  }
+
+  /*301b*/
+  if( (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+ 				&& (!(SiS_VBInfo&SetCRT2ToLCDA))){
+      if(SiS_IsDualEdge(BaseAddr))
+         SiS_SetRegANDOR(SiS_Part1Port,0x13,0xFB,0x00);
+      else
+         SiS_SetRegANDOR(SiS_Part1Port,0x13,0xFF,0x00);
+      if(SiS_IsDualEdge(BaseAddr))
+         SiS_SetRegANDOR(SiS_Part1Port,0x2c,0xCF,0x00);
+      else
+         SiS_SetRegANDOR(SiS_Part1Port,0x2c,0xFF,0x00);
+      if(SiS_IsDualEdge(BaseAddr))
+         SiS_SetRegANDOR(SiS_Part4Port,0x21,0x3F,0x00);
+      else
+         SiS_SetRegANDOR(SiS_Part4Port,0x21,0xFF,0x00);
+
+      if(SiS_IsDualEdge(BaseAddr))
+         SiS_SetRegANDOR(SiS_Part4Port,0x23,0xFF,0x80);
+       else
+         SiS_SetRegANDOR(SiS_Part4Port,0x23,0xFF,0x00);     
+  }
+  /*end 301b*/
+}
+
+void
+SiS_GetCRT2Data(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                USHORT RefreshRateTableIndex)
+{
+  if(SiS_IF_DEF_LVDS==0) { /* 301  */
+     if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+        if(SiS_VBInfo&SetCRT2ToLCDA)
+          SiS_GetCRT2DataLVDS(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex);
+        else
+          SiS_GetCRT2Data301(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex);
+     } else
+     	SiS_GetCRT2Data301(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex);
+     return;
+  } else {  /* LVDS */
+     SiS_GetCRT2DataLVDS(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex);
+     return;
+  }
+}
+
+void
+SiS_GetCRT2DataLVDS(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                    USHORT RefreshRateTableIndex)
+{
+   USHORT tempax,tempbx;
+   USHORT CRT2Index,ResIndex;
+   SiS_LVDSDataStruct *LVDSData=NULL;
+
+   SiS_GetCRT2ResInfo(ROMAddr,ModeNo,ModeIdIndex);
+   /*301b*/
+   if((SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+   	 && (SiS_VBInfo&SetCRT2ToLCDA)) {
+      SiS_GetCRT2PtrA(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                      &CRT2Index,&ResIndex);
+      switch (CRT2Index) {
+      	case  0:  LVDSData=SiS_LVDS1024x768Data_1;    break;
+      	case  1:  LVDSData=SiS_LVDS1280x1024Data_1;   break;
+      	case  2:  LVDSData=SiS_LVDS1280x1024Data_1;   break;
+    	/*  case  2:  LVDSData=SiS_LVDS1280x960Data_1;  break;*/
+      	case  3:  LVDSData=SiS_LVDS1024x768Data_2;    break;
+      	case  4:  LVDSData=SiS_LVDS1280x1024Data_2;   break;
+      	case  5:  LVDSData=SiS_LVDS1280x1024Data_2;   break;
+    	/*  case  5:  LVDSData=SiS_LVDS1280x960Data_2;  break; */
+       }    
+   } else {
+      SiS_GetCRT2Ptr(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,&CRT2Index,&ResIndex);
+      switch (CRT2Index) {
+      	case  0:  LVDSData=SiS_LVDS800x600Data_1;    break;
+      	case  1:  LVDSData=SiS_LVDS1024x768Data_1;   break;
+      	case  2:  LVDSData=SiS_LVDS1280x1024Data_1;  break;
+      	case  3:  LVDSData=SiS_LVDS800x600Data_2;    break;
+      	case  4:  LVDSData=SiS_LVDS1024x768Data_2;   break;
+      	case  5:  LVDSData=SiS_LVDS1280x1024Data_2;  break;
+      	case  6:  LVDSData=SiS_LVDS640x480Data_1;    break;
+      	case  7:  LVDSData=SiS_CHTVUNTSCData;        break;
+      	case  8:  LVDSData=SiS_CHTVONTSCData;        break;
+      	case  9:  LVDSData=SiS_CHTVUPALData;         break;
+      	case 10:  LVDSData=SiS_CHTVOPALData;         break;
+      	case 11:  LVDSData=SiS_LVDS320x480Data_1;    break;
+     }
+   }
+   SiS_VGAHT = (LVDSData+ResIndex)->VGAHT;
+   SiS_VGAVT = (LVDSData+ResIndex)->VGAVT;
+   SiS_HT = (LVDSData+ResIndex)->LCDHT;
+   SiS_VT = (LVDSData+ResIndex)->LCDVT;
+
+  /*301b*/ /* TW: I have NOT added LVDS check here */
+  if( (SiS_IF_DEF_LVDS==0) &&
+      (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))) {/*for test*/
+    if(!(SiS_LCDInfo&LCDNonExpanding)){
+         if(SiS_LCDResInfo==Panel1024x768){
+           tempax=1024;
+           tempbx=768;
+         } else {
+           tempax=1280;
+           tempbx=1024;
+         }
+         SiS_HDE=tempax;
+         SiS_VDE=tempbx;
+    }
+  } else {
+   if(SiS_IF_DEF_TRUMPION==0){
+     if(SiS_VBInfo&SetCRT2ToLCD){
+       if(!(SiS_LCDInfo&LCDNonExpanding)){
+         if(SiS_LCDResInfo==Panel640x480){
+           tempax=640;
+           tempbx=480;
+         } else if(SiS_LCDResInfo==Panel800x600){
+           tempax=800;
+           tempbx=600;
+         } else if(SiS_LCDResInfo==Panel1024x768){
+           tempax=1024;
+           tempbx=768;
+         } else {
+           tempax=1280;
+           tempbx=1024;
+         }
+         if(SiS_IF_DEF_FSTN){           /*fstn*/
+           tempax=320;
+           tempbx=480;
+         }
+         SiS_HDE=tempax;
+         SiS_VDE=tempbx;
+       }
+     }
+   }
+  } 
+  return;
+}
+
+void
+SiS_GetCRT2Data301(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                        USHORT RefreshRateTableIndex)
+{
+  USHORT tempax,tempbx,modeflag;
+  USHORT resinfo;
+  USHORT CRT2Index,ResIndex;
+  SiS_LCDDataStruct *LCDPtr=NULL;
+  SiS_TVDataStruct  *TVPtr=NULL;
+
+  if(ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+    	resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
+    	resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+  }
+  SiS_NewFlickerMode=0;
+  SiS_RVBHRS=50;
+  SiS_RY1COE=0;
+  SiS_RY2COE=0;
+  SiS_RY3COE=0;
+  SiS_RY4COE=0;
+
+  SiS_GetCRT2ResInfo(ROMAddr,ModeNo,ModeIdIndex);
+  if(SiS_VBInfo&SetCRT2ToRAMDAC){
+    	SiS_GetRAMDAC2DATA(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex);
+    	return;
+  }
+
+  if(SiS_VBInfo&SetCRT2ToTV){
+    SiS_GetCRT2Ptr(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                   &CRT2Index,&ResIndex);
+    switch (CRT2Index) {
+      case  2:  TVPtr=SiS_ExtHiTVData;   break;
+      case  3:  TVPtr=SiS_ExtPALData;    break;
+      case  4:  TVPtr=SiS_ExtNTSCData;   break;
+      case  7:  TVPtr=SiS_St1HiTVData;   break;
+      case  8:  TVPtr=SiS_StPALData;     break;
+      case  9:  TVPtr=SiS_StNTSCData;    break;
+      case 12:  TVPtr=SiS_St2HiTVData;   break;
+      default:  TVPtr=SiS_StPALData;     break;  /* TW: Just to avoid a crash */
+    }
+
+    SiS_RVBHCMAX = (TVPtr+ResIndex)->RVBHCMAX;
+    SiS_RVBHCFACT = (TVPtr+ResIndex)->RVBHCFACT;
+    SiS_VGAHT = (TVPtr+ResIndex)->VGAHT;
+    SiS_VGAVT = (TVPtr+ResIndex)->VGAVT;
+    SiS_HDE = (TVPtr+ResIndex)->TVHDE;
+    SiS_VDE = (TVPtr+ResIndex)->TVVDE;
+    SiS_RVBHRS = (TVPtr+ResIndex)->RVBHRS;
+    SiS_NewFlickerMode = (TVPtr+ResIndex)->FlickerMode;
+    if(SiS_VBInfo&SetCRT2ToHiVisionTV ) {
+      	if(resinfo==0x08) SiS_NewFlickerMode=0x40;
+      	if(resinfo==0x09) SiS_NewFlickerMode=0x40;
+	if(resinfo==0x10) SiS_NewFlickerMode=0x40;
+    }
+    if(SiS_VBInfo&SetCRT2ToHiVisionTV ) {
+      if(SiS_VGAVDE==350) SiS_SetFlag=SiS_SetFlag|TVSimuMode;
+      tempax=ExtHiTVHT;
+      tempbx=ExtHiTVVT;
+      if(SiS_VBInfo&SetInSlaveMode) {
+        if(SiS_SetFlag&TVSimuMode) {
+          tempax=StHiTVHT;
+          tempbx=StHiTVVT;
+          if(!(modeflag&Charx8Dot)){
+            tempax=StHiTextTVHT;
+            tempbx=StHiTextTVVT;
+          }
+        }
+      }
+    }
+    if(!(SiS_VBInfo&SetCRT2ToHiVisionTV)) {
+      SiS_RY1COE = (TVPtr+ResIndex)->RY1COE;
+      SiS_RY2COE = (TVPtr+ResIndex)->RY2COE;
+      if(modeflag&HalfDCLK) {
+        SiS_RY1COE = 0x00;
+        SiS_RY2COE = 0xf4;
+      }
+      SiS_RY3COE = (TVPtr+ResIndex)->RY3COE;
+      SiS_RY4COE = (TVPtr+ResIndex)->RY4COE;
+      if(modeflag&HalfDCLK) {
+        SiS_RY3COE = 0x10;
+        SiS_RY4COE = 0x38;
+      }
+      if(!(SiS_VBInfo&SetPALTV)){
+        tempax=NTSCHT;
+        tempbx=NTSCVT;
+      }
+      else{
+        tempax=PALHT;
+        tempbx=PALVT;
+      }
+    }
+    SiS_HT=tempax;
+    SiS_VT=tempbx;
+    return;
+  }
+
+  if(SiS_VBInfo&SetCRT2ToLCD){
+    SiS_GetCRT2Ptr(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                   &CRT2Index,&ResIndex);
+    switch (CRT2Index) {
+      case  0: LCDPtr = SiS_ExtLCD1024x768Data;        break;
+      case  1: LCDPtr = SiS_ExtLCD1280x1024Data;       break;
+      case  5: LCDPtr = SiS_StLCD1024x768Data;         break;
+      case  6: LCDPtr = SiS_StLCD1280x1024Data;        break;
+      case 10: LCDPtr = SiS_St2LCD1024x768Data;        break;
+      case 11: LCDPtr = SiS_St2LCD1280x1024Data;       break;
+      case 13: LCDPtr = SiS_NoScaleData;               break;
+      case 14: LCDPtr = SiS_LCD1280x960Data;           break;
+      default: LCDPtr = SiS_ExtLCD1024x768Data;	       break; /* TW: Just to avoid a crash */
+    }
+
+    SiS_RVBHCMAX = (LCDPtr+ResIndex)->RVBHCMAX;
+    SiS_RVBHCFACT = (LCDPtr+ResIndex)->RVBHCFACT;
+    SiS_VGAHT = (LCDPtr+ResIndex)->VGAHT;
+    SiS_VGAVT = (LCDPtr+ResIndex)->VGAVT;
+    SiS_HT = (LCDPtr+ResIndex)->LCDHT;
+    SiS_VT = (LCDPtr+ResIndex)->LCDVT;
+    tempax=1024;
+    if(SiS_SetFlag&LCDVESATiming) {
+      if(SiS_VGAVDE==350) tempbx=560;
+      else if(SiS_VGAVDE==400) tempbx=640;
+      else tempbx=768;
+    }
+    else {
+      if(SiS_VGAVDE==357) tempbx=527;
+      else if(SiS_VGAVDE==420) tempbx=620;
+      else if(SiS_VGAVDE==525) tempbx=775;
+      else if(SiS_VGAVDE==600) tempbx=775;
+      else if(SiS_VGAVDE==350) tempbx=560;
+      else if(SiS_VGAVDE==400) tempbx=640;
+      else tempbx=768;
+    }
+    if(SiS_LCDResInfo==Panel1280x1024){
+      tempax=1280;
+      if(SiS_VGAVDE==360) tempbx=768;
+      else if(SiS_VGAVDE==375) tempbx=800;
+           else if(SiS_VGAVDE==405) tempbx=864;
+                else tempbx=1024;
+    }
+    if(SiS_LCDResInfo==Panel1280x960){
+      tempax=1280;
+      if(SiS_VGAVDE==350) tempbx=700;
+      else if(SiS_VGAVDE==400) tempbx=800;
+           else if(SiS_VGAVDE==1024) tempbx=960;
+                else tempbx=960;
+    }
+    if(SiS_LCDInfo&LCDNonExpanding) {
+       tempax=SiS_VGAHDE;
+       tempbx=SiS_VGAVDE;
+    }
+    SiS_HDE=tempax;
+    SiS_VDE=tempbx;
+    return;
+  }
 }
 
 USHORT
-SiS_GetResInfo (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
-{
-	USHORT resindex;
-
-	if (ModeNo <= 0x13) {
-		resindex = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;	/* si+St_ResInfo */
-	} else {
-		resindex = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;	/* si+Ext_ResInfo */
-	}
-	return (resindex);
-}
-
-void
-SiS_GetCRT2ResInfo (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
+SiS_GetResInfo(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
 {
-	USHORT xres, yres, modeflag, resindex;
+  USHORT resindex;
 
-	resindex = SiS_GetResInfo (ROMAddr, ModeNo, ModeIdIndex);
-	if (ModeNo <= 0x13) {
-		xres = SiS_StResInfo[resindex].HTotal;
-		yres = SiS_StResInfo[resindex].VTotal;
-	} else {
-		xres = SiS_ModeResInfo[resindex].HTotal;	/* xres->ax */
-		yres = SiS_ModeResInfo[resindex].VTotal;	/* yres->bx */
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+St_ModeFlag */
-		if (modeflag & HalfDCLK) {
-			xres = xres * 2;
-		}
-		if (modeflag & DoubleScanMode) {
-			yres = yres * 2;
-		}
-	}
-	if (SiS_IF_DEF_LVDS == 0) {
-		if (SiS_LCDResInfo == Panel1280x1024) {
-			if (yres == 400)
-				yres = 405;
-			if (yres == 350)
-				yres = 360;
-			if (SiS_SetFlag & LCDVESATiming) {
-				if (yres == 360)
-					yres = 375;
-			}
-		}
-		if (SiS_LCDResInfo == Panel1024x768) {
-			if (!(SiS_SetFlag & LCDVESATiming)) {
-				if (!(SiS_LCDInfo & LCDNonExpanding)) {
-					if (yres == 350)
-						yres = 357;
-					if (yres == 400)
-						yres = 420;
-/*          if(!OldBios)             */
-					if (yres == 480)
-						yres = 525;
-				}
-			}
-		}
-	} else {
-		if (xres == 720)
-			xres = 640;
-	}
-	SiS_VGAHDE = xres;
-	SiS_HDE = xres;
-	SiS_VGAVDE = yres;
-	SiS_VDE = yres;
-}
-
-void
-SiS_GetCRT2Ptr (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		USHORT RefreshRateTableIndex, USHORT * CRT2Index,
-		USHORT * ResIndex)
-{
-	USHORT tempbx, tempal;
-	USHORT Flag;
-	if (SiS_IF_DEF_LVDS == 0) {
-		if (SiS_VBInfo & SetCRT2ToLCD) {	/* LCD */
-			tempbx = SiS_LCDResInfo;
-			tempbx = tempbx - Panel1024x768;
-			if (!(SiS_SetFlag & LCDVESATiming)) {
-				tempbx += 5;
-/*      GetRevisionID();  */
-				tempbx += 5;
-			}
-		} else {
-			if (SiS_VBInfo & SetCRT2ToHiVisionTV) {	/* TV */
-				if (SiS_VGAVDE > 480)
-					SiS_SetFlag =
-					    SiS_SetFlag & (!TVSimuMode);
-				tempbx = 2;
-				if (SiS_VBInfo & SetInSlaveMode) {
-					if (!(SiS_SetFlag & TVSimuMode))
-						tempbx = 10;
-				}
-			} else {
-				if (SiS_VBInfo & SetPALTV) {
-					tempbx = 3;
-				} else {
-					tempbx = 4;
-				}
-				if (SiS_SetFlag & TVSimuMode) {
-					tempbx = tempbx + 5;
-				}
-			}
-		}
-		if (ModeNo <= 0x13) {
-			tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
-		} else {
-			tempal =
-			    SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
-		}
-		tempal = tempal & 0x3F;
-		/*301b */
-		if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-		    && (SiS_VBInfo & SetCRT2ToTV)) {
-			/*look */
-			if (tempal == 0x06)
-				tempal = 0x07;
-
-		}
-		/*end 301b */
-		if ((0x31 <= ModeNo) && (ModeNo <= 0x35))
-			tempal = 6;
-		if (SiS_LCDInfo & LCDNonExpanding)
-			tempbx = 0x0D;
-		if (SiS_LCDResInfo == Panel1280x960)
-			tempbx = 0x0E;
-		*CRT2Index = tempbx;
-		*ResIndex = tempal;
-	} else {		/* LVDS */
-		Flag = 1;
-		tempbx = 0;
-		if (SiS_IF_DEF_CH7005 == 1) {
-			if (!(SiS_VBInfo & SetCRT2ToLCD)) {
-				Flag = 0;
-				tempbx = 7;
-				if (SiS_VBInfo & SetPALTV)
-					tempbx = tempbx + 2;
-				if (SiS_VBInfo & SetCHTVOverScan)
-					tempbx = tempbx + 1;
-			}
-		}
-		if (Flag == 1) {
-			tempbx = SiS_LCDResInfo - Panel800x600;
-			if (SiS_LCDInfo & LCDNonExpanding) {
-				tempbx = tempbx + 3;
-			}
-		}
-		if (ModeNo <= 0x13) {
-			tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
-		} else {
-			tempal =
-			    SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
-		}
-		tempal = tempal & 0x1F;
-		*CRT2Index = tempbx;
-		*ResIndex = tempal;
-	}
+  if(ModeNo<=0x13){
+    	resindex=SiS_SModeIDTable[ModeIdIndex].St_ResInfo;              /* si+St_ResInfo */
+  } else {
+    	resindex=SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;            	/* si+Ext_ResInfo */
+  }
+  return(resindex);
+}
+
+void
+SiS_GetCRT2ResInfo(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
+{
+  USHORT xres,yres,modeflag,resindex;
+
+  resindex=SiS_GetResInfo(ROMAddr,ModeNo,ModeIdIndex);
+  if(ModeNo<=0x13){
+    	xres=SiS_StResInfo[resindex].HTotal;
+    	yres=SiS_StResInfo[resindex].VTotal;
+  } else {
+    	xres=SiS_ModeResInfo[resindex].HTotal;                         		/* xres->ax */
+    	yres=SiS_ModeResInfo[resindex].VTotal;                         		/* yres->bx */
+    	modeflag=SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;      		/* si+St_ModeFlag */
+    	if(SiS_IF_DEF_FSTN){							/*fstn*/
+       		xres=xres*2;
+       		yres=yres*2;
+    	} else {
+      		if(modeflag&HalfDCLK) { xres=xres*2;}
+      		if(modeflag&DoubleScanMode) {yres=yres*2;}
+    	}
+  }
+  if(SiS_IF_DEF_LVDS==0) {
+    	if(SiS_LCDResInfo==Panel1280x1024) {
+      		if(yres==400) yres=405;
+      		if(yres==350) yres=360;
+      		if(SiS_SetFlag&LCDVESATiming) {
+        		if(yres==360) yres=375;
+      		}
+   	 }
+    	if(SiS_LCDResInfo==Panel1024x768){
+      		if(!(SiS_SetFlag&LCDVESATiming)) {
+        		if(!(SiS_LCDInfo&LCDNonExpanding)) {
+          			if(yres==350) yres=357;
+          			if(yres==400) yres=420;
+/*          			if(!OldBios)             */
+            			if(yres==480) yres=525;
+        		}
+      		}
+    	}
+  } else { /* LVDS - does not support 720x??? */
+    	if(xres==720) xres=640;
+  }
+  SiS_VGAHDE=xres;
+  SiS_HDE=xres;
+  SiS_VGAVDE=yres;
+  SiS_VDE=yres;
+}
+
+void
+SiS_GetCRT2Ptr(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+	       USHORT RefreshRateTableIndex,USHORT *CRT2Index,USHORT *ResIndex)
+{
+  USHORT tempbx,tempal=0;
+  USHORT Flag;
+  if(SiS_IF_DEF_LVDS==0) {
+    	if(SiS_VBInfo&SetCRT2ToLCD){              /* LCD */
+      		tempbx=SiS_LCDResInfo;
+      		tempbx=tempbx-Panel1024x768;
+      		if(!(SiS_SetFlag&LCDVESATiming)) {
+        		tempbx+=5;
+/*      		GetRevisionID();  */
+        		tempbx+=5;
+       		}
+     	} else {
+       		if(SiS_VBInfo&SetCRT2ToHiVisionTV){              /* TV */
+         		if(SiS_VGAVDE>480) SiS_SetFlag=SiS_SetFlag&(!TVSimuMode);
+         		tempbx=2;
+         		if(SiS_VBInfo&SetInSlaveMode) {
+            			if(!(SiS_SetFlag&TVSimuMode)) tempbx=10;
+         		}
+       		} else {
+         		if(SiS_VBInfo&SetPALTV){
+           			tempbx=3;
+         		} else {
+           			tempbx=4;
+         		}
+         		if(SiS_SetFlag&TVSimuMode){
+           			tempbx=tempbx+5;
+         		}
+       		}
+     	}
+
+     	if(ModeNo<=0x13){
+       		tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+     	} else {
+       		tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+     	}
+     	tempal=tempal&0x3F;
+     	/*301b*/
+      	if((SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+       					&& (SiS_VBInfo&SetCRT2ToTV)) {
+        	/*look*/
+      		if(tempal==0x06) tempal=0x07;
+        }
+   	/*end 301b*/
+     	if((0x31<=ModeNo)&&(ModeNo<=0x35)) tempal=6;
+     	if(SiS_LCDInfo&LCDNonExpanding) tempbx=0x0D;
+     	if(SiS_LCDResInfo==Panel1280x960) tempbx=0x0E;	/* TW !!!! */
+     	*CRT2Index=tempbx;
+     	*ResIndex=tempal;
+  } else {   /* LVDS */
+    	Flag=1;
+    	tempbx=0;
+    	if(SiS_IF_DEF_CH7005==1) {
+      		if(!(SiS_VBInfo&SetCRT2ToLCD)) {
+        		Flag=0;
+        		tempbx=7;
+        		if(SiS_VBInfo&SetPALTV) tempbx=tempbx+2;
+        		if(SiS_VBInfo&SetCHTVOverScan) tempbx=tempbx+1;
+      		}
+    	}
+    	if(Flag==1) {
+      		tempbx=SiS_LCDResInfo-Panel800x600;
+      		if(SiS_LCDInfo&LCDNonExpanding){
+        		tempbx=tempbx+3;
+      		}
+    	}
+     	if(SiS_LCDResInfo==Panel640x480){
+        	tempbx=6;
+      	}
+     	/*fstn*/
+     	if(SiS_IF_DEF_FSTN){
+       	 	if(SiS_LCDResInfo==Panel320x480){
+         		tempbx=11;                        /* not same with asmber code */
+         		tempal=6;	/* TW: That can't work - is being overwritten below... */
+        	}
+    	}
+
+	else 				/* TW: .... unless I place an "else" here */
+     
+    	if(ModeNo<=0x13){
+      		tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+    	} else {
+      		tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+    	}
+    	tempal=tempal&0x1F;
+    	*CRT2Index=tempbx;
+    	*ResIndex=tempal;
+  }
+}
+
+void
+SiS_GetCRT2PtrA(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+		USHORT RefreshRateTableIndex,USHORT *CRT2Index,
+		USHORT *ResIndex)
+{
+  USHORT tempbx,tempal;
+
+  tempbx=SiS_LCDResInfo-Panel1024x768;
+  if(SiS_LCDInfo&LCDNonExpanding){
+        tempbx=tempbx+3;
+  }
+  if(ModeNo<=0x13){
+      	tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+  } else {
+      	tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+  }
+  tempal=tempal&0x1F;
+  *CRT2Index=tempbx;
+  *ResIndex=tempal;
 }
-
-void
-SiS_GetCRT2PtrA (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		 USHORT RefreshRateTableIndex, USHORT * CRT2Index,
-		 USHORT * ResIndex)
-{
-	USHORT tempbx, tempal;
-
-	tempbx = SiS_LCDResInfo - Panel1024x768;
-	if (SiS_LCDInfo & LCDNonExpanding) {
-		tempbx = tempbx + 3;
-	}
-	if (ModeNo <= 0x13) {
-		tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
-	} else {
-		tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
-	}
-	tempal = tempal & 0x1F;
-	*CRT2Index = tempbx;
-	*ResIndex = tempal;
-}
-
 /*end 301b*/
 
 USHORT
-SiS_GetRatePtrCRT2 (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
+SiS_GetRatePtrCRT2(ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
 {
-	SHORT LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 };
-	SHORT LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01 };
-	USHORT RefreshRateTableIndex, i;
-	USHORT modeflag, index, temp;
-
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
-	}
-
-	if (SiS_IF_DEF_CH7005 == 1) {
-		if (SiS_VBInfo & SetCRT2ToTV) {
-			if (modeflag & HalfDCLK)
-				return (0);
-		}
-	}
-	if (ModeNo < 0x14)
-		return (0xFFFF);
-	index = SiS_GetReg1 (SiS_P3d4, 0x33);
-	index = index >> SiS_SelectCRT2Rate;
-	index = index & 0x0F;
-	if (SiS_LCDInfo & LCDNonExpanding)
-		index = 0;
-	if (index > 0)
-		index--;
-
-	if (SiS_SetFlag & ProgrammingCRT2) {
-		if (SiS_IF_DEF_CH7005 == 1) {
-			if (SiS_VBInfo & SetCRT2ToTV) {
-				index = 0;
-			}
-		}
-		if (SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
-			if (SiS_IF_DEF_LVDS == 0) {
-				if ((SiS_VBType & VB_SIS301B)
-				    || (SiS_VBType & VB_SIS302B)) temp =
-					    LCDARefreshIndex[SiS_LCDResInfo];	/*301b */
-				else
-					temp = LCDRefreshIndex[SiS_LCDResInfo];
-				if (index > temp) {
-					index = temp;
-				}
-			} else {
-				index = 0;
-			}
-		}
-	}
-
-	RefreshRateTableIndex = SiS_EModeIDTable[ModeIdIndex].REFindex;
-	ModeNo = SiS_RefIndex[RefreshRateTableIndex].ModeID;
-	i = 0;
-	do {
-		if (SiS_RefIndex[RefreshRateTableIndex + i].ModeID != ModeNo)
-			break;
-		temp = SiS_RefIndex[RefreshRateTableIndex + i].Ext_InfoFlag;
-		temp = temp & ModeInfoFlag;
-		if (temp < SiS_ModeType)
-			break;
-
-		i++;
-		index--;
-	} while (index != 0xFFFF);
-
-	if (!(SiS_VBInfo & SetCRT2ToRAMDAC)) {
-		if (SiS_VBInfo & SetInSlaveMode) {
-			temp =
-			    SiS_RefIndex[RefreshRateTableIndex + i -
-					 1].Ext_InfoFlag;
-			if (temp & InterlaceMode) {
-				i++;
-			}
-		}
+  /* TW: These tables are being indexed with SiS_LCDResInfo.
+   *     This is equal to the Panel???x??? constants in initdef.h
+   *     and is eg. 2 for 1024x768; these tables were each one
+   *     value too short!
+   */
+  SHORT  LCDRefreshIndex[]  = {0x00,0x00,0x03,0x01,0x01};
+  SHORT  LCDARefreshIndex[] = {0x00,0x00,0x03,0x01,0x01,0x01,0x01,0x01};
+  USHORT RefreshRateTableIndex,i,backup_i;
+  USHORT modeflag,index,temp;
+
+  if (ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+  }else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+  }
+
+  if(SiS_IF_DEF_CH7005==1) {
+    	if(SiS_VBInfo&SetCRT2ToTV) {
+      		if(modeflag&HalfDCLK) return(0);
+    	}
+  }
+
+  if(ModeNo<0x14) return(0xFFFF);
+
+ /* TW: CR33 holds refresh rate index for CRT1 (0-3) and CRT2 (4-7).
+  *     On LVDS machines, CRT2 index is always 0 and will be
+  *     set to 0 by the following code; this causes the function
+  *     to take the first non-interlaced mode in SiS300_Ext2Struct
+  *     (which is the second 1024x768 mode in case the resolution
+  *     is 1024x768; the first mode in the list is interlaced and
+  *     therefore skipped).
+  */
+
+  index=SiS_GetReg1(SiS_P3d4,0x33);
+  index=index>>SiS_SelectCRT2Rate;
+  index=index&0x0F;
+  if(SiS_LCDInfo&LCDNonExpanding) index=0;
+  if(index>0) index--;
+
+  if(SiS_SetFlag & ProgrammingCRT2) {
+    	if(SiS_IF_DEF_CH7005==1) {
+      		if(SiS_VBInfo&SetCRT2ToTV) {
+        		index=0;
+      		}
+    	}
+    	if(SiS_VBInfo&(SetCRT2ToLCD|SetCRT2ToLCDA)) {
+      		if(SiS_IF_DEF_LVDS==0) {
+        		if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+           			temp=LCDARefreshIndex[SiS_LCDResInfo];     /* 301b */
+        		else
+           			temp=LCDRefreshIndex[SiS_LCDResInfo];	   /* 301  */
+        		if(index>temp){
+          			index=temp;
+        		}
+      		} else {  						   /* LVDS */
+        		index=0;
+      		}
+    	}
+  }
+
+  RefreshRateTableIndex = SiS_EModeIDTable[ModeIdIndex].REFindex;
+  ModeNo = SiS_RefIndex[RefreshRateTableIndex].ModeID;
+
+  i=0;
+  do {
+    	if (SiS_RefIndex[RefreshRateTableIndex+i].ModeID!=ModeNo) break;
+    	temp = SiS_RefIndex[RefreshRateTableIndex+i].Ext_InfoFlag;
+    	temp=temp&ModeInfoFlag;
+    	if(temp<SiS_ModeType) break;
+    	i++;
+    	index--;
+  } while(index!=0xFFFF);
+
+  if(!(SiS_VBInfo&SetCRT2ToRAMDAC)) {
+    	if(SiS_VBInfo&SetInSlaveMode) {
+      		temp=SiS_RefIndex[RefreshRateTableIndex+i-1].Ext_InfoFlag;
+      			if(temp&InterlaceMode) {
+        			i++;
+      			}
+    	}
+  }
+  i--;
+
+  if((SiS_SetFlag & ProgrammingCRT2) && (!(SiS_VBInfo & DisableCRT2Display))) {
+    	backup_i = i;
+    	if (!(SiS_AdjustCRT2Rate(ROMAddr,ModeNo,ModeIdIndex,
+	                             RefreshRateTableIndex,&i))) {
+		/* TW: This is for avoiding random data to be used; i is
+		 *     in an undefined state if no matching CRT2 mode is
+		 *     found.
+		 */
+		i = backup_i;
+#ifdef LINUX_KERNEL
+		printk("sisfb: WARNING: No matching CRT2 mode found\n");
+#endif
 	}
+  }
 
-	i--;
-	if ((SiS_SetFlag & ProgrammingCRT2)) {
-		temp =
-		    SiS_AjustCRT2Rate (ROMAddr, ModeNo, ModeIdIndex,
-				       RefreshRateTableIndex, &i);
-	}
-	return (RefreshRateTableIndex + i);	/*return(0x01|(temp1<<1));   */
+  return(RefreshRateTableIndex+i);                			/*return(0x01|(temp1<<1));   */
 }
 
 BOOLEAN
-SiS_AjustCRT2Rate (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		   USHORT RefreshRateTableIndex, USHORT * i)
+SiS_AdjustCRT2Rate(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                   USHORT RefreshRateTableIndex,USHORT *i)
 {
-	USHORT tempax, tempbx, resinfo;
-	USHORT modeflag, infoflag;
-
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ModeFlag */
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
-	}
-
-	resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
-	tempbx = SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID;
-	tempax = 0;
-	if (SiS_IF_DEF_LVDS == 0) {
-		if (SiS_VBInfo & SetCRT2ToRAMDAC) {
-			tempax = tempax | SupportRAMDAC2;
-		}
-		if (SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {	/*301b */
-			tempax = tempax | SupportLCD;
-			if (SiS_LCDResInfo != Panel1280x1024) {
-				if (SiS_LCDResInfo != Panel1280x960) {
-					if (SiS_LCDInfo & LCDNonExpanding) {
-						if (resinfo >= 9) {
-							tempax = 0;
-							return (0);
-						}
-					}
-				}
-			}
-		}
-		if (SiS_VBInfo & SetCRT2ToHiVisionTV) {	/* for HiTV */
-			tempax = tempax | SupportHiVisionTV;
-			if (SiS_VBInfo & SetInSlaveMode) {
-				if (resinfo == 4)
-					return (0);
-				if (resinfo == 3) {
-					if (SiS_SetFlag & TVSimuMode)
-						return (0);
-				}
-				if (resinfo > 7)
-					return (0);
-			}
-		} else {
-			if (SiS_VBInfo &
-			    (SetCRT2ToAVIDEO | SetCRT2ToSVIDEO |
-			     SetCRT2ToSCART)) {
-				tempax = tempax | SupportTV;
-				/*301b */
-				if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {	/*301b */
-
-					tempax = tempax | SupportTV1024;
-
-				}
-				/*end 301b */
-
-				if (!(SiS_VBInfo & SetPALTV)) {
-					if (modeflag & NoSupportSimuTV) {
-						if (SiS_VBInfo & SetInSlaveMode) {
-							if (!
-							    (SiS_VBInfo &
-							     SetNotSimuMode)) {
-								return 0;
-							}
-						}
-					}
-				}
-			}
-		}
-	} else {		/* for LVDS */
-		if (SiS_IF_DEF_CH7005 == 1) {
-			if (SiS_VBInfo & SetCRT2ToTV) {
-				tempax = tempax | SupportCHTV;
-			}
-		}
-		if (SiS_VBInfo & SetCRT2ToLCD) {
-			tempax = tempax | SupportLCD;
-			if (resinfo > 0x08)
-				return (0);	/*1024x768  */
-			if (SiS_LCDResInfo < Panel1024x768) {
-				if (resinfo > 0x07)
-					return (0);	/*800x600  */
-				if (resinfo == 0x04)
-					return (0);	/*512x384  */
-			}
-		}
-	}
-
-	for (; SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID == tempbx;
-	     (*i)--) {
-		infoflag =
-		    SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
-		if (infoflag & tempax) {
-			return (1);
-		}
-		if ((*i) == 0)
-			break;
-	}
+  USHORT tempax,tempbx,resinfo;
+  USHORT modeflag,infoflag;
 
-	for ((*i) = 0;; (*i)++) {
-		infoflag =
-		    SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
-		if (SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID != tempbx) {
-			return (0);
-		}
-		if (infoflag & tempax) {
-			return (1);
-		}
-	}
-	return (1);
-}
-
-void
-SiS_SaveCRT2Info (USHORT ModeNo)
-{
-	USHORT temp1, temp2;
-
-	SiS_SetReg1 (SiS_P3d4, 0x34, ModeNo);	/* reserve CR34 for CRT1 Mode No */
-	temp1 = (SiS_VBInfo & SetInSlaveMode) >> 8;
-	temp2 = ~(SetInSlaveMode >> 8);
-	SiS_SetRegANDOR (SiS_P3d4, 0x31, temp2, temp1);
-}
-
-void
-SiS_GetVBInfo301 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
-		  USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension)
-{
-	USHORT tempax, tempbx, temp;
-	USHORT modeflag;
-	UCHAR OutputSelect = *pSiS_OutputSelect;
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
-	}
-	SiS_SetFlag = 0;
-
-	SiS_ModeType = modeflag & ModeInfoFlag;
-	tempbx = 0;
-	if (SiS_BridgeIsOn (BaseAddr)) {
-		temp = SiS_GetReg1 (SiS_P3d4, 0x30);
-		tempbx = tempbx | temp;
-		temp = SiS_GetReg1 (SiS_P3d4, 0x31);
-		tempax = temp << 8;
-		tempbx = tempbx | tempax;
-		temp = SetCHTVOverScan | SetInSlaveMode | DisableCRT2Display;	/* ynlai */
-		temp = 0xFFFF ^ temp;
-		tempbx = tempbx & temp;
-#ifdef CONFIG_FB_SIS_315
-		/*301b */
-		if ((SiS_VBType & VB_SIS302B)) {
-			temp = SiS_GetReg1 (SiS_P3d4, 0x38);
-			if (temp == 0x03)
-				tempbx = tempbx | (SetCRT2ToLCDA);
-		}
-		/*end301b */
-#endif
-		if (SiS_IF_DEF_LVDS == 0) {
-			if (SiS_IF_DEF_HiVision)
-				temp = 0x80FC;
-			else
-				temp = 0x807C;
-		} else {
-			if (SiS_IF_DEF_CH7005 == 1) {
-				temp = SetCRT2ToTV | SetCRT2ToLCD;
-			} else {
-				temp = SetCRT2ToLCD;
-			}
-		}
-		if (!(tempbx & temp)) {
-			tempax = tempax | DisableCRT2Display;
-			tempbx = 0;
-		}
-
-		if (SiS_IF_DEF_LVDS == 0) {
-			if (tempbx & SetCRT2ToLCDA) {	/*301b */
-				tempbx =
-				    tempbx & (0xFF00 | SwitchToCRT2 |
-					      SetSimuScanMode);
-			} else if (tempbx & SetCRT2ToRAMDAC) {
-				tempbx =
-				    tempbx & (0xFF00 | SetCRT2ToRAMDAC |
-					      SwitchToCRT2 | SetSimuScanMode);
-			} else if ((tempbx & SetCRT2ToLCD) && (!(SiS_VBType & VB_NoLCD))) {	/*301dlvds */
-				tempbx =
-				    tempbx & (0xFF00 | SetCRT2ToLCD |
-					      SwitchToCRT2 | SetSimuScanMode);
-			} else if (tempbx & SetCRT2ToSCART) {
-				tempbx =
-				    tempbx & (0xFF00 | SetCRT2ToSCART |
-					      SwitchToCRT2 | SetSimuScanMode);
-				tempbx = tempbx | SetPALTV;
-			} else if (tempbx & SetCRT2ToHiVisionTV) {
-				tempbx =
-				    tempbx & (0xFF00 | SetCRT2ToHiVisionTV |
-					      SwitchToCRT2 | SetSimuScanMode);
-				/* ynlai begin */
-				tempbx = tempbx | SetPALTV;
-				/* ynlai end */
-			}
-		} else {
-			if (SiS_IF_DEF_CH7005 == 1) {
-				if (tempbx & SetCRT2ToTV)
-					tempbx =
-					    tempbx & (0xFF00 | SetCRT2ToTV |
-						      SwitchToCRT2 |
-						      SetSimuScanMode);
-			}
-			if (tempbx & SetCRT2ToLCD)
-				tempbx =
-				    tempbx & (0xFF00 | SetCRT2ToLCD |
-					      SwitchToCRT2 | SetSimuScanMode);
-		}
-		if (tempax & DisableCRT2Display) {
-			if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode))) {
-				tempbx = SetSimuScanMode | DisableCRT2Display;
-			}
-		}
-		if (!(tempbx & DriverMode)) {
-			tempbx = tempbx | SetSimuScanMode;
-		}
-		if (!(tempbx & SetSimuScanMode)) {
-			if (tempbx & SwitchToCRT2) {
-				if (!(modeflag & CRT2Mode)) {
-					tempbx = tempbx | SetSimuScanMode;
-				}
-			} else {
-				if (!
-				    (SiS_BridgeIsEnable
-				     (BaseAddr, HwDeviceExtension))) {
-					if (!(tempbx & DriverMode)) {
-						if (SiS_BridgeInSlave ()) {
-							tempbx =
-							    tempbx |
-							    SetInSlaveMode;
-						}
-					}
-				}
-			}
-		}
-		if (!(tempbx & DisableCRT2Display)) {
-			if (tempbx & DriverMode) {
-				if (tempbx & SetSimuScanMode) {
-					if (!(modeflag & CRT2Mode)) {
-						tempbx =
-						    tempbx | SetInSlaveMode;
-						if (SiS_IF_DEF_LVDS == 0) {
-							if (tempbx &
-							    SetCRT2ToTV) {
-								if (!
-								    (tempbx &
-								     SetNotSimuMode))
-								   SiS_SetFlag =
-									    SiS_SetFlag
-									    |
-									    TVSimuMode;
-							}
-						}
-					}
-				}
-			} else {
-				tempbx = tempbx | SetInSlaveMode;
-				if (SiS_IF_DEF_LVDS == 0) {
-					if (tempbx & SetCRT2ToTV) {
-						if (!(tempbx & SetNotSimuMode))
-							SiS_SetFlag =
-							    SiS_SetFlag |
-							    TVSimuMode;
-					}
-				}
-			}
-		}
-		if (SiS_IF_DEF_CH7005 == 1) {
-			temp = SiS_GetReg1 (SiS_P3d4, 0x35);
-			if (temp & TVOverScan)
-				tempbx = tempbx | SetCHTVOverScan;
-		}
-	}
-#ifdef CONFIG_FB_SIS_300
-	/*add PALMN */
-	if (SiS_IF_DEF_LVDS == 0) {
-		if ((HwDeviceExtension->jChipType == SIS_630) ||
-		    (HwDeviceExtension->jChipType == SIS_730)) {
-			if (!(OutputSelect & EnablePALMN))
-				SiS_SetRegAND (SiS_P3d4, 0x35, 0x3F);
-			if (tempbx & SetCRT2ToTV) {
-				if (tempbx & SetPALTV) {
-					temp = SiS_GetReg1 (SiS_P3d4, 0x35);
-					temp = temp & 0xC0;
-					if (temp == 0x40)
-						tempbx = tempbx & (~SetPALTV);
-				}
-			}
-		}
-	}
-	/*end add */
+  if (ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;    	/* si+St_ModeFlag */
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+  }
+
+  resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+  tempbx = SiS_RefIndex[RefreshRateTableIndex+(*i)].ModeID;
+  tempax=0;
+  if(SiS_IF_DEF_LVDS==0) {
+  	/* TW: For 301 (and which ones of 301B, 302B, 301LV, 302LV ?) */
+    	if(SiS_VBInfo&SetCRT2ToRAMDAC) {
+      		tempax=tempax|SupportRAMDAC2;
+    	}
+    	if(SiS_VBInfo&(SetCRT2ToLCD|SetCRT2ToLCDA)) {        /* 301b */
+      		tempax=tempax|SupportLCD;
+      		if(SiS_LCDResInfo!=Panel1280x1024) {
+        		if(SiS_LCDResInfo!=Panel1280x960) {
+           			if(SiS_LCDInfo&LCDNonExpanding) {
+             				if(resinfo>=9) {
+               					tempax=0;
+               					return(0);
+             				}
+           			}
+        		}
+      		}
+    	}
+    	if(SiS_VBInfo&SetCRT2ToHiVisionTV) {    /* for HiTV */
+      		tempax=tempax|SupportHiVisionTV;
+      		if(SiS_VBInfo&SetInSlaveMode){
+        		if(resinfo==4) return(0);
+        		if(resinfo==3) {
+          			if(SiS_SetFlag&TVSimuMode) return(0);
+        		}
+        		if(resinfo>7) return(0);
+      		}
+    	} else {
+      		if(SiS_VBInfo&(SetCRT2ToAVIDEO|SetCRT2ToSVIDEO|SetCRT2ToSCART)) {
+        		tempax=tempax|SupportTV;
+       			/*301b*/
+         		if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+             			tempax=tempax|SupportTV1024;
+         		}
+        		/*end 301b*/
+       
+        		if(!(SiS_VBInfo&SetPALTV)) {
+          			if(modeflag&NoSupportSimuTV) {
+            				if(SiS_VBInfo&SetInSlaveMode) {
+              					if(!(SiS_VBInfo&SetNotSimuMode)) {
+                					return 0;
+              					}
+            				}
+          			}
+        		}
+      		}
+    	}
+  } else {
+  	/* TW: for LVDS (and which ones of the SiS bridges?) */
+    	if(SiS_IF_DEF_CH7005==1) {
+      		if(SiS_VBInfo&SetCRT2ToTV) {
+        		tempax=tempax|SupportCHTV;
+      		}
+    	}
+    	if(SiS_VBInfo&SetCRT2ToLCD) {
+      		tempax=tempax|SupportLCD;
+      		if(resinfo>0x08) return(0);       	  /* 1024x768  */
+      		if(SiS_LCDResInfo<Panel1024x768) {
+        		if(resinfo>0x07) return(0);       /*  800x600  */
+        		if(resinfo==0x04) return(0);      /*  512x384  */
+      		}
+    	}
+  }
+  /* TW: Look backwards in table for matching CRT2 mode */
+  for(;SiS_RefIndex[RefreshRateTableIndex+(*i)].ModeID==tempbx;(*i)--) {
+     	infoflag = SiS_RefIndex[RefreshRateTableIndex+(*i)].Ext_InfoFlag;
+     	if(infoflag&tempax) {
+       		return(1);
+     	}
+     	if ((*i)==0) break;
+  }
+  /* TW: Look through the whole mode-section of the table from the beginning
+   *     for a matching CRT2 mode if no mode was found yet.
+   */
+  for((*i)=0;;(*i)++) {
+     	infoflag = SiS_RefIndex[RefreshRateTableIndex+(*i)].Ext_InfoFlag;
+     	if(SiS_RefIndex[RefreshRateTableIndex+(*i)].ModeID!=tempbx) {
+       		return(0);
+     	}
+     	if(infoflag&tempax) {
+       		return(1);
+     	}
+  }
+  return(1);
+}
+
+void
+SiS_SaveCRT2Info(USHORT ModeNo)
+{
+  USHORT temp1,temp2;
+
+  SiS_SetReg1(SiS_P3d4,0x34,ModeNo);  /* reserve CR34 for CRT1 Mode No */
+  temp1=(SiS_VBInfo&SetInSlaveMode)>>8;
+  temp2=~(SetInSlaveMode>>8);
+  SiS_SetRegANDOR(SiS_P3d4,0x31,temp2,temp1);
+}
+
+void
+SiS_GetVBInfo301(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo,
+                 USHORT ModeIdIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+  USHORT tempax,tempbx,temp;
+  USHORT modeflag;
+  UCHAR  OutputSelect=*pSiS_OutputSelect;
+
+  if (ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+  } else {
+   	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+  }
+  SiS_SetFlag=0;
+
+  SiS_ModeType=modeflag&ModeInfoFlag;
+  
+  tempbx=0;
+  if(SiS_BridgeIsOn(BaseAddr)) {
+    	temp=SiS_GetReg1(SiS_P3d4,0x30);
+    	if((SiS_IF_DEF_LVDS==0) && (SiS_VBType&(VB_SIS301LV|VB_SIS302LV))) {
+       		temp=temp&0xbf;                                        	/*301lvds disable CRT2*/
+    	}
+    	if(SiS_IF_DEF_FSTN){                             		/*fstn must set CR30=0x21 */
+       		temp=0x21;
+       		SiS_SetReg1(SiS_P3d4,0x30,temp);
+    	}
+    	tempbx=tempbx|temp;
+    	temp=SiS_GetReg1(SiS_P3d4,0x31);
+    	tempax=temp<<8;
+    	tempbx=tempbx|tempax;
+    	temp=SetCHTVOverScan|SetInSlaveMode|DisableCRT2Display;  	/* ynlai */
+   	temp=0xFFFF^temp;
+    	tempbx=tempbx&temp;
+#ifdef SIS315H
+     	/*301b*/
+    	if((SiS_IF_DEF_LVDS==0) && (SiS_VBType&(VB_SIS302B|VB_SIS302LV))){
+       		temp=SiS_GetReg1(SiS_P3d4,0x38);
+       		if(temp==0x03)
+          		tempbx=tempbx|(SetCRT2ToLCDA);
+    	}
+    	/*end301b*/
 #endif
-#ifdef CONFIG_FB_SIS_315
-	/*add PALMN */
-	if (SiS_IF_DEF_LVDS == 0) {
-		if (!(OutputSelect & EnablePALMN))
-			SiS_SetRegAND (SiS_P3d4, 0x38, 0x3F);
-		if (tempbx & SetCRT2ToTV) {
-			if (tempbx & SetPALTV) {
-				temp = SiS_GetReg1 (SiS_P3d4, 0x38);
-				temp = temp & 0xC0;
-				if (temp == 0x40)
-					tempbx = tempbx & (~SetPALTV);
-			}
-		}
-	}
-	/*end add */
+    	if(SiS_IF_DEF_LVDS==0) {
+      		if(SiS_IF_DEF_HiVision) temp=0x80FC;
+      		else temp=0x807C;
+    	} else {
+      		if(SiS_IF_DEF_CH7005==1) {
+        		temp = SetCRT2ToTV|SetCRT2ToLCD;
+      		} else {
+        		temp = SetCRT2ToLCD;
+      		}
+    	}
+    	if(!(tempbx&temp)) {
+      		tempax=tempax|DisableCRT2Display;
+      		tempbx=0;
+    	}
+   
+   	if(SiS_IF_DEF_LVDS==0) {
+      		if(tempbx&SetCRT2ToLCDA) {                                    /*301b*/
+        		tempbx=tempbx&(0xFF00|SwitchToCRT2|SetSimuScanMode);
+      		} else if(tempbx&SetCRT2ToRAMDAC) {
+        		tempbx=tempbx&(0xFF00|SetCRT2ToRAMDAC|SwitchToCRT2|SetSimuScanMode);
+      		} else if((tempbx&SetCRT2ToLCD)&&(!(SiS_VBType&VB_NoLCD)) ){              /*301dlvds*/
+        		tempbx=tempbx&(0xFF00|SetCRT2ToLCD|SwitchToCRT2|SetSimuScanMode);
+      		} else if(tempbx&SetCRT2ToSCART){
+        		tempbx=tempbx&(0xFF00|SetCRT2ToSCART|SwitchToCRT2|SetSimuScanMode);
+        		tempbx=tempbx|SetPALTV;
+      		} else if(tempbx&SetCRT2ToHiVisionTV){
+        		tempbx=tempbx&(0xFF00|SetCRT2ToHiVisionTV|SwitchToCRT2|SetSimuScanMode);
+  			/* ynlai begin */
+        		tempbx=tempbx|SetPALTV;
+  			/* ynlai end */
+      		}
+   	} else { /* LVDS */
+      		if(SiS_IF_DEF_CH7005==1) {
+        		if(tempbx&SetCRT2ToTV)
+          			tempbx=tempbx&(0xFF00|SetCRT2ToTV|SwitchToCRT2|SetSimuScanMode);
+      		}
+      		if(tempbx&SetCRT2ToLCD)
+        		tempbx=tempbx&(0xFF00|SetCRT2ToLCD|SwitchToCRT2|SetSimuScanMode);
+	}
+    	if(tempax&DisableCRT2Display) {
+      		if(!(tempbx&(SwitchToCRT2|SetSimuScanMode))) {
+        		tempbx=SetSimuScanMode|DisableCRT2Display;
+      		}
+    	}
+    	if(!(tempbx&DriverMode)){
+      		tempbx=tempbx|SetSimuScanMode;
+    	}
+	/* TW: LVDS bridge can only be slave in 8bpp modes */
+	if ((SiS_IF_DEF_LVDS==1) &&
+		(ModeNo == 0x2e || ModeNo == 0x30 ||
+			ModeNo == 0x38 || ModeNo == 0x3a)) {
+		tempbx=tempbx|SetSimuScanMode|SetInSlaveMode;
+	}
+	/* TW end */
+    	if(!(tempbx&SetSimuScanMode)){
+      		if(tempbx&SwitchToCRT2) {
+        		if(!(modeflag&CRT2Mode)) {
+            			tempbx=tempbx|SetSimuScanMode;
+        		}
+
+      		} else {
+        		if(!(SiS_BridgeIsEnable(BaseAddr,HwDeviceExtension))) {
+          			if(!(tempbx&DriverMode)) {
+            				if(SiS_BridgeInSlave()) {
+              					tempbx=tempbx|SetInSlaveMode;
+            				}
+          			}
+        		}
+      		}
+    	}
+    	if(!(tempbx&DisableCRT2Display)) {
+     		 if(tempbx&DriverMode) {
+        		if(tempbx&SetSimuScanMode) {
+          			if(!(modeflag&CRT2Mode)) {
+            				tempbx=tempbx|SetInSlaveMode;
+            				if(SiS_IF_DEF_LVDS==0) {
+              					if(tempbx&SetCRT2ToTV) {
+                					if(!(tempbx&SetNotSimuMode))
+								SiS_SetFlag=SiS_SetFlag|TVSimuMode;
+              					}
+            				}
+          			}
+        		}
+      		} else {
+        		tempbx=tempbx|SetInSlaveMode;
+        		if(SiS_IF_DEF_LVDS==0) {
+          			if(tempbx&SetCRT2ToTV) {
+            				if(!(tempbx&SetNotSimuMode))
+						SiS_SetFlag=SiS_SetFlag|TVSimuMode;
+          			}
+        		}
+      		}
+    	}
+    	if(SiS_IF_DEF_CH7005==1) {
+      		temp=SiS_GetReg1(SiS_P3d4,0x35);
+      		if(temp&TVOverScan) tempbx=tempbx|SetCHTVOverScan;
+    	}
+  }
+  /*add PALMN*/
+  if(SiS_IF_DEF_LVDS==0) {
+#ifdef SIS300
+     	if((HwDeviceExtension->jChipType==SIS_630)||
+           (HwDeviceExtension->jChipType==SIS_730)) {
+           	if(!(OutputSelect&EnablePALMN))
+             		SiS_SetRegAND(SiS_P3d4,0x35,0x3F);
+           	if(tempbx&SetCRT2ToTV) {
+              		if(tempbx&SetPALTV) {
+                  		temp=SiS_GetReg1(SiS_P3d4,0x35);
+                  		temp=temp&0xC0;
+                  		if(temp==0x40)
+                    			tempbx=tempbx&(~SetPALTV);
+             		}
+          	}
+      	}
+#endif
+#ifdef SIS315H
+     	if((HwDeviceExtension->jChipType == SIS_315H)||
+           (HwDeviceExtension->jChipType == SIS_315PRO)||
+           (HwDeviceExtension->jChipType == SIS_550)||   /* 05/02/01 ynlai for 550 */
+           (HwDeviceExtension->jChipType == SIS_640)||   /* 08/20/01 chiawen for 640/740 */
+           (HwDeviceExtension->jChipType == SIS_740)||   /* 09/03/01 chiawen for 640/740 */
+           (HwDeviceExtension->jChipType == SIS_650)) {
+		if(!(OutputSelect&EnablePALMN))
+        		SiS_SetRegAND(SiS_P3d4,0x38,0x3F);
+   		if(tempbx&SetCRT2ToTV) {
+    			if(tempbx&SetPALTV) {
+               			temp=SiS_GetReg1(SiS_P3d4,0x38);
+               			temp=temp&0xC0;
+               			if(temp==0x40)
+               				tempbx=tempbx&(~SetPALTV);
+              		}
+        	}
+  	}
+#endif
+ /*end add*/
+  }
+  SiS_VBInfo=tempbx;
+#ifdef LINUX_KERNEL
+  printk(KERN_INFO "sisfb: (VBInfo = %x)\n", SiS_VBInfo);
+#endif
+#ifdef LINUX_XF86
+  xf86DrvMsg(0, X_INFO, "(init301.c: VBInfo = %x)\n", SiS_VBInfo);
 #endif
-	SiS_VBInfo = tempbx;
-}
-
-void
-SiS_GetRAMDAC2DATA (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		    USHORT RefreshRateTableIndex)
-{
-	USHORT tempax, tempbx, temp;
-	USHORT temp1, temp2, modeflag = 0, tempcx;
-
-	USHORT StandTableIndex, CRT1Index;
-	USHORT ResInfo, DisplayType;
-	SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr = NULL;
-
-	SiS_RVBHCMAX = 1;
-	SiS_RVBHCFACT = 1;
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
-		StandTableIndex = SiS_GetModePtr (ROMAddr, ModeNo, ModeIdIndex);
-		tempax = SiS_StandTable[StandTableIndex].CRTC[0];
-		tempbx = SiS_StandTable[StandTableIndex].CRTC[6];
-		temp1 = SiS_StandTable[StandTableIndex].CRTC[7];
-	} else {
-		if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-		    && (SiS_VBInfo & SetCRT2ToLCDA)) {
-			/*add crt1ptr */
-			temp =
-			    SiS_GetLVDSCRT1Ptr (ROMAddr, ModeNo, ModeIdIndex,
-						RefreshRateTableIndex, &ResInfo,
-						&DisplayType);
-			if (temp == 0) {
-				return;
-			}
-			switch (DisplayType) {
-			case 0:
-				LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1;
-				break;
-			case 1:
-				LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1;
-				break;
-			case 2:
-				LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1;
-				break;
-			case 3:
-				LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1_H;
-				break;
-			case 4:
-				LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1_H;
-				break;
-			case 5:
-				LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1_H;
-				break;
-			case 6:
-				LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2;
-				break;
-			case 7:
-				LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2;
-				break;
-			case 8:
-				LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2;
-				break;
-			case 9:
-				LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2_H;
-				break;
-			case 10:
-				LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2_H;
-				break;
-			case 11:
-				LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2_H;
-				break;
-			case 12:
-				LVDSCRT1Ptr = SiS_CHTVCRT1UNTSC;
-				break;
-			case 13:
-				LVDSCRT1Ptr = SiS_CHTVCRT1ONTSC;
-				break;
-			case 14:
-				LVDSCRT1Ptr = SiS_CHTVCRT1UPAL;
-				break;
-			case 15:
-				LVDSCRT1Ptr = SiS_CHTVCRT1OPAL;
-				break;
-			}
-			temp1 = (LVDSCRT1Ptr + ResInfo)->CR[0];
-			temp2 = (LVDSCRT1Ptr + ResInfo)->CR[14];
-			tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
-			tempbx = (LVDSCRT1Ptr + ResInfo)->CR[6];
-			tempcx = (LVDSCRT1Ptr + ResInfo)->CR[13] << 8;
-			tempcx = tempcx & 0x0100;
-			tempcx = tempcx << 2;
-			tempbx = tempbx | tempcx;
-			temp1 = (LVDSCRT1Ptr + ResInfo)->CR[7];
-		} /*add 301b */
-		else {
-			modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
-			CRT1Index =
-			    SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
-			CRT1Index = CRT1Index & 0x3F;
-			temp1 = (USHORT) SiS_CRT1Table[CRT1Index].CR[0];
-			temp2 = (USHORT) SiS_CRT1Table[CRT1Index].CR[14];
-			tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
-			tempbx = (USHORT) SiS_CRT1Table[CRT1Index].CR[6];
-			tempcx = (USHORT) SiS_CRT1Table[CRT1Index].CR[13] << 8;
-			tempcx = tempcx & 0x0100;
-			tempcx = tempcx << 2;
-			tempbx = tempbx | tempcx;
-			temp1 = (USHORT) SiS_CRT1Table[CRT1Index].CR[7];
-		}
-	}
-	if (temp1 & 0x01)
-		tempbx = tempbx | 0x0100;
-	if (temp1 & 0x20)
-		tempbx = tempbx | 0x0200;
-	tempax = tempax + 5;
-	if (modeflag & Charx8Dot)
-		tempax = tempax * 8;
-	else
-		tempax = tempax * 9;
-
-	SiS_VGAHT = tempax;
-	SiS_HT = tempax;
-	tempbx++;
-	SiS_VGAVT = tempbx;
-	SiS_VT = tempbx;
-}
-
-void
-SiS_UnLockCRT2 (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
-{
-	if (HwDeviceExtension->jChipType >= SIS_315H) {
-		SiS_SetRegANDOR (SiS_Part1Port, 0x2f, 0xFF, 0x01);
-	} else {
-		SiS_SetRegANDOR (SiS_Part1Port, 0x24, 0xFF, 0x01);
-	}
-}
-
-void
-SiS_LockCRT2 (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
-{
-	if (HwDeviceExtension->jChipType >= SIS_315H) {
-		SiS_SetRegANDOR (SiS_Part1Port, 0x2F, 0xFE, 0x00);
-	} else {
-		SiS_SetRegANDOR (SiS_Part1Port, 0x24, 0xFE, 0x00);
-	}
-}
-
-void
-SiS_EnableCRT2 ()
-{
-	SiS_SetRegANDOR (SiS_P3c4, 0x1E, 0xFF, 0x20);
 }
 
 void
-SiS_DisableBridge (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+SiS_GetRAMDAC2DATA(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                   USHORT RefreshRateTableIndex)
 {
-
-	USHORT temp1, tempah, temp;
-	SiS_SetRegANDOR (SiS_P3c4, 0x11, 0xF7, 0x08);
-/*SetPanelDelay(1);  */
-	temp1 = 0x01;
-	if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {	/*301b */
-		if ((SiS_IsVAMode (BaseAddr)))
-			temp1 = 0x00;	/*no disable vb */
-	}
-
-	if (SiS_IF_DEF_LVDS == 0) {
-		if (!temp1) {	/*301b */
-			SiS_SetRegANDOR (SiS_Part2Port, 0x00, 0x0DF, 0x00);	/* disable VB */
-			SiS_DisplayOff ();
-			if (HwDeviceExtension->jChipType >= SIS_315H) {	/* 310 series */
-				SiS_SetRegOR (SiS_Part1Port, 0x00, 0x80);	/* alan,BScreenOff */
-			}
-			SiS_SetRegANDOR (SiS_P3c4, 0x32, 0xDF, 0x00);
-
-			temp = SiS_GetReg1 (SiS_Part1Port, 0);
-			SiS_SetRegOR (SiS_Part1Port, 0x00, 0x10);	/* alan,BScreenOff */
+  USHORT tempax,tempbx,temp;
+  USHORT temp1,temp2,modeflag=0,tempcx;
+  USHORT StandTableIndex,CRT1Index;
+  USHORT ResInfo,DisplayType;
+  SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr=NULL;
+
+  SiS_RVBHCMAX=1;
+  SiS_RVBHCFACT=1;
+  if(ModeNo<=0x13){
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+    	StandTableIndex = SiS_GetModePtr(ROMAddr,ModeNo,ModeIdIndex);
+    	tempax = SiS_StandTable[StandTableIndex].CRTC[0];
+    	tempbx = SiS_StandTable[StandTableIndex].CRTC[6];
+    	temp1=SiS_StandTable[StandTableIndex].CRTC[7];
+  } else {
+    if( (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+        			&& (SiS_VBInfo&SetCRT2ToLCDA) ) {
+    	/*add crt1ptr*/
+    	temp=SiS_GetLVDSCRT1Ptr(ROMAddr,ModeNo,ModeIdIndex,
+			RefreshRateTableIndex,&ResInfo,&DisplayType);
+    	if(temp==0){
+    		return;
+    	}
+    	switch(DisplayType) {
+    		case 0 : LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1;		break;
+    		case 1 : LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1;          break;
+    		case 2 : LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1;         break;
+    		case 3 : LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1_H;         break;
+    		case 4 : LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1_H;        break;
+    		case 5 : LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1_H;       break;
+    		case 6 : LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2;           break;
+    		case 7 : LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2;          break;
+    		case 8 : LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2;         break;
+    		case 9 : LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2_H;         break;
+    		case 10: LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2_H;        break;
+    		case 11: LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2_H;       break;
+    		case 12: LVDSCRT1Ptr = SiS_CHTVCRT1UNTSC;               break;
+    		case 13: LVDSCRT1Ptr = SiS_CHTVCRT1ONTSC;               break;
+    		case 14: LVDSCRT1Ptr = SiS_CHTVCRT1UPAL;                break;
+    		case 15: LVDSCRT1Ptr = SiS_CHTVCRT1OPAL;                break;
+    		case 16: LVDSCRT1Ptr = SiS_LVDSCRT1320x480_1;           break;
+    	}
+    	temp1=(LVDSCRT1Ptr+ResInfo)->CR[0];
+    	temp2=(LVDSCRT1Ptr+ResInfo)->CR[14];
+    	tempax=(temp1&0xFF)|((temp2&0x03)<<8);
+    	tempbx=(LVDSCRT1Ptr+ResInfo)->CR[6];
+    	tempcx=(LVDSCRT1Ptr+ResInfo)->CR[13]<<8;
+    	tempcx = tempcx&0x0100;
+    	tempcx = tempcx << 2;
+    	tempbx = tempbx | tempcx;
+    	temp1=(LVDSCRT1Ptr+ResInfo)->CR[7];
+    	/*add 301b*/
+    } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+    	CRT1Index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
+    	CRT1Index=CRT1Index&0x3F;
+    	temp1 = (USHORT)SiS_CRT1Table[CRT1Index].CR[0];
+    	temp2 = (USHORT)SiS_CRT1Table[CRT1Index].CR[14];
+    	tempax=(temp1&0xFF)|((temp2&0x03)<<8);
+    	tempbx = (USHORT)SiS_CRT1Table[CRT1Index].CR[6];
+    	tempcx = (USHORT)SiS_CRT1Table[CRT1Index].CR[13]<<8;
+    	tempcx = tempcx&0x0100;
+    	tempcx = tempcx << 2;
+    	tempbx = tempbx | tempcx;
+    	temp1 = (USHORT)SiS_CRT1Table[CRT1Index].CR[7];
+   }
+  }
+  if(temp1&0x01) tempbx=tempbx|0x0100;
+  if(temp1&0x20) tempbx=tempbx|0x0200;
+  tempax=tempax+5;
+  if(modeflag&Charx8Dot) tempax=tempax*8;
+  else tempax=tempax*9;
+
+  SiS_VGAHT=tempax;
+  SiS_HT=tempax;
+  tempbx++;
+  SiS_VGAVT=tempbx;
+  SiS_VT=tempbx;
+}
+
+void
+SiS_UnLockCRT2(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
+{
+  if(HwDeviceExtension->jChipType >= SIS_315H) {
+    	SiS_SetRegANDOR(SiS_Part1Port,0x2f,0xFF,0x01);
+  } else {
+    	SiS_SetRegANDOR(SiS_Part1Port,0x24,0xFF,0x01);
+  }
+}
+
+void
+SiS_LockCRT2(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
+{
+  if(HwDeviceExtension->jChipType >= SIS_315H) {
+    	SiS_SetRegANDOR(SiS_Part1Port,0x2F,0xFE,0x00);
+  } else {
+     	SiS_SetRegANDOR(SiS_Part1Port,0x24,0xFE,0x00);
+  }
+}
+
+void
+SiS_EnableCRT2()
+{
+  SiS_SetRegANDOR(SiS_P3c4,0x1E,0xFF,0x20);
+}
+
+void
+SiS_DisableBridge(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT  BaseAddr)
+{
+  USHORT temp1,tempah,temp;
+
+  SiS_SetRegANDOR(SiS_P3c4,0x11,0xF7,0x08);
+
+  /*SetPanelDelay(1); */
+  temp1=0x01;
+  if( (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)))  {  /*301b*/
+    	if((SiS_IsVAMode(BaseAddr)))
+       		temp1=0x00;			/*no disable vb*/
+  }
+
+  if(SiS_IF_DEF_LVDS==0) {
+   if(!(temp1)){              /*301b*/
+    SiS_SetRegANDOR(SiS_Part2Port,0x00,0x0DF,0x00);   /* disable VB */
+    SiS_DisplayOff();
+    if(HwDeviceExtension->jChipType >= SIS_315H) { /* 310 series */
+      SiS_SetRegOR(SiS_Part1Port,0x00,0x80);  /* FUNCTION CTRL | alan,BScreenOff */
+    }
+    SiS_SetRegANDOR(SiS_P3c4,0x32,0xDF,0x00);
+    
+    temp = SiS_GetReg1(SiS_Part1Port,0); 
+    SiS_SetRegOR(SiS_Part1Port,0x00,0x10);  /* FUNCTION CTRL | alan,BScreenOff */
 /*
-     if(HwDeviceExtension->jChipType >= SIS_315H) 
+     if(HwDeviceExtension->jChipType >= SIS_315H)
      {
-      SiS_SetRegAND(SiS_Part1Port,0x2E,0x7F);  
+      	SiS_SetRegAND(SiS_Part1Port,0x2E,0x7F);
      }
-     */
-			SiS_SetRegANDOR (SiS_P3c4, 0x1E, 0xDF, 0x00);
-			SiS_SetReg1 (SiS_Part1Port, 0, temp);
-		} else {
-			if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {	/*301b */
-				if (!(SiS_Is301B (BaseAddr))) {
-					SiS_SetRegAND (SiS_P3c4, 0x32, 0xDF);
-					if ((!(SiS_IsDualEdge (BaseAddr)))
-					    && (!(SiS_IsVAMode (BaseAddr))))
-						tempah = 0x7F;
-					else if ((!(SiS_IsDualEdge (BaseAddr)))
-						 && (SiS_IsVAMode (BaseAddr)))
-						tempah = 0xBF;
-					else
-						tempah = 0x3F;
-					SiS_SetRegAND (SiS_Part4Port, 0x1F,
-						       tempah);
-				}
-			}
-		}
-	} else {
-		if (SiS_IF_DEF_CH7005) {
-			SiS_SetCH7005 (0x090E);
-		}
-		SiS_DisplayOff ();
-		SiS_SetRegANDOR (SiS_P3c4, 0x32, 0xDF, 0x00);
-		SiS_SetRegANDOR (SiS_P3c4, 0x1E, 0xDF, 0x00);
-		SiS_UnLockCRT2 (HwDeviceExtension, BaseAddr);
-		SiS_SetRegANDOR (SiS_Part1Port, 0x01, 0xFF, 0x80);
-		SiS_SetRegANDOR (SiS_Part1Port, 0x02, 0xFF, 0x40);
-	}
-/*SetPanelDelay(0);  */
-	SiS_SetRegANDOR (SiS_P3c4, 0x11, 0xFB, 0x04);
-}
-
-void
-SiS_EnableBridge (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
-{
-	USHORT temp, tempah;
-
-	SiS_SetRegANDOR (SiS_P3c4, 0x11, 0xFB, 0x00);
-/*SetPanelDelay(0);        */
-	if (SiS_IF_DEF_LVDS == 0) {
-		if ((!(SiS_IsVAMode (BaseAddr)))
-		    && ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) {
-			SiS_SetRegANDOR (SiS_Part2Port, 0x00, 0x1F, 0x20);
-		} else {
-			temp = SiS_GetReg1 (SiS_P3c4, 0x32);
-			temp = temp & 0xDF;
-			if (SiS_BridgeInSlave ()) {
-				tempah = SiS_GetReg1 (SiS_P3d4, 0x30);
-				if (!(tempah & SetCRT2ToRAMDAC)) {
-					temp = temp | 0x20;
-				}
-			}
-			SiS_SetReg1 (SiS_P3c4, 0x32, temp);
-			SiS_SetRegANDOR (SiS_P3c4, 0x1E, 0xFF, 0x20);
-			if (HwDeviceExtension->jChipType >= SIS_315H) {	/* 310 series */
-				temp = SiS_GetReg1 (SiS_Part1Port, 0x2E);
-				if (!(temp & 0x80))
-					SiS_SetRegOR (SiS_Part1Port, 0x2E, 0x80);	/* by alan,BVBDOENABLE=1 */
-
-			}
-			SiS_SetRegANDOR (SiS_Part2Port, 0x00, 0x1F, 0x20);
-
-			if (HwDeviceExtension->jChipType >= SIS_315H) {	/* 310 series */
-				temp = SiS_GetReg1 (SiS_Part1Port, 0x2E);
-				if (!(temp & 0x80))
-					SiS_SetRegOR (SiS_Part1Port, 0x2E, 0x80);	/* by alan,BVBDOENABLE=1 */
-			}
-
-			SiS_SetRegANDOR (SiS_Part2Port, 0x00, 0x1F, 0x20);
-			SiS_VBLongWait ();
-			SiS_DisplayOn ();
-			SiS_VBLongWait ();
-		}
-		/*add301b */
-		if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
-			if (!(SiS_Is301B (BaseAddr))) {
-				temp = SiS_GetReg1 (SiS_Part1Port, 0x2E);
-				if (!(temp & 0x80))
-					SiS_SetRegOR (SiS_Part1Port, 0x2E,
-						      0x80);
-				if ((!(SiS_IsDualEdge (BaseAddr)))
-				    && (!(SiS_IsVAMode (BaseAddr))))
-					tempah = 0x80;
-				else if ((!(SiS_IsDualEdge (BaseAddr)))
-					 && (SiS_IsVAMode (BaseAddr)))
-					tempah = 0x40;
-				else
-					tempah = 0xC0;
-				SiS_SetRegOR (SiS_Part4Port, 0x1F, tempah);
-			}
-		}
-		/*end 301b */
-	} else {
-		/*LVDS*/ SiS_EnableCRT2 ();
-		SiS_DisplayOn ();
-		SiS_UnLockCRT2 (HwDeviceExtension, BaseAddr);
-		SiS_SetRegANDOR (SiS_Part1Port, 0x02, 0xBF, 0x00);
-		if (SiS_BridgeInSlave ()) {
-			SiS_SetRegANDOR (SiS_Part1Port, 0x01, 0x1F, 0x00);
-		} else {
-			SiS_SetRegANDOR (SiS_Part1Port, 0x01, 0x1F, 0x40);
-		}
-		if (SiS_IF_DEF_CH7005) {
-			SiS_SetCH7005 (0x0B0E);
-		}
-	}
-/*SetPanelDelay(1);  */
-	SiS_SetRegANDOR (SiS_P3c4, 0x11, 0xF7, 0x00);
-}
-
-void
-SiS_SetPanelDelay (USHORT DelayTime)
-{
-	USHORT PanelID;
-
-	PanelID = SiS_GetReg1 (SiS_P3d4, 0x36);
-	PanelID = PanelID >> 4;
-
-	if (DelayTime == 0)
-		SiS_LCD_Wait_Time (SiS_PanelDelayTbl[PanelID].timer[0]);
-	else
-		SiS_LCD_Wait_Time (SiS_PanelDelayTbl[PanelID].timer[1]);
-}
-
-void
-SiS_LCD_Wait_Time (UCHAR DelayTime)
-{
-	USHORT i, j;
-	ULONG temp, flag;
-
-	flag = 0;
-	for (i = 0; i < DelayTime; i++) {
-		for (j = 0; j < 66; j++) {
-			temp = SiS_GetReg3 (0x61);
-			temp = temp & 0x10;
-			if (temp == flag)
-				continue;
-			flag = temp;
-		}
-	}
+*/
+     SiS_SetRegANDOR(SiS_P3c4,0x1E,0xDF,0x00);
+     SiS_SetReg1(SiS_Part1Port,0,temp);
+    }
+    else {
+    if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))  /*301b*/
+      {
+        if(!(SiS_Is301B(BaseAddr))) {
+          SiS_SetRegAND(SiS_P3c4,0x32,0xDF);
+          if((!(SiS_IsDualEdge(BaseAddr)))&&(!(SiS_IsVAMode(BaseAddr))))
+            tempah=0x7F;
+          else if((!(SiS_IsDualEdge(BaseAddr)))&&(SiS_IsVAMode(BaseAddr)))
+            tempah=0xBF;
+          else
+            tempah=0x3F;
+          SiS_SetRegAND(SiS_Part4Port,0x1F,tempah);
+        }
+      }
+    }
+  }
+  else { /* LVDS */
+    if(SiS_IF_DEF_CH7005==1) {
+      SiS_Backup7005 = SiS_GetCH7005(0x0e);
+      SiS_SetCH7005(0x090E);
+    }
+    SiS_DisplayOff();
+    SiS_SetRegANDOR(SiS_P3c4,0x32,0xDF,0x00);
+    SiS_SetRegANDOR(SiS_P3c4,0x1E,0xDF,0x00);
+    SiS_UnLockCRT2(HwDeviceExtension,BaseAddr);
+    SiS_SetRegANDOR(SiS_Part1Port,0x01,0xFF,0x80);
+    SiS_SetRegANDOR(SiS_Part1Port,0x02,0xFF,0x40);
+  }
+  /*SetPanelDelay(0);  */
+  SiS_SetRegANDOR(SiS_P3c4,0x11,0xFB,0x04);
+}
+
+void
+SiS_EnableBridge(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT  BaseAddr)
+{
+  USHORT temp,tempah;
+
+  SiS_SetRegANDOR(SiS_P3c4,0x11,0xFB,0x00);
+
+  /*SetPanelDelay(0);        */
+  if(SiS_IF_DEF_LVDS==0) {
+    if( (!(SiS_IsVAMode(BaseAddr))) &&
+        (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))) {
+    		SiS_SetRegANDOR(SiS_Part2Port,0x00,0x1F,0x20);
+    } else {
+      temp=SiS_GetReg1(SiS_P3c4,0x32);
+      temp=temp&0xDF;
+      if(SiS_BridgeInSlave()) {
+        tempah=SiS_GetReg1(SiS_P3d4,0x30);
+        if(!(tempah&SetCRT2ToRAMDAC)) {
+         temp=temp|0x20;
+        }
+      }
+      SiS_SetReg1(SiS_P3c4,0x32,temp);
+      SiS_SetRegANDOR(SiS_P3c4,0x1E,0xFF,0x20);
+
+      if(HwDeviceExtension->jChipType >= SIS_315H) { /* 310 series */
+        temp=SiS_GetReg1(SiS_Part1Port,0x2E);
+        if (!(temp&0x80))
+          SiS_SetRegOR(SiS_Part1Port,0x2E,0x80);          /* by alan,BVBDOENABLE=1 */
+      }
+
+      SiS_SetRegANDOR(SiS_Part2Port,0x00,0x1F,0x20);
+
+      if(HwDeviceExtension->jChipType >= SIS_315H) { /* 310 series */
+      	temp=SiS_GetReg1(SiS_Part1Port,0x2E);
+     	if (!(temp&0x80))
+            SiS_SetRegOR(SiS_Part1Port,0x2E,0x80);          /* by alan,BVBDOENABLE=1 */
+      }
+   
+      SiS_SetRegANDOR(SiS_Part2Port,0x00,0x1F,0x20);
+      SiS_VBLongWait();
+      SiS_DisplayOn();
+      SiS_VBLongWait();
+    }  
+  /*add301b*/
+    if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+      if(!(SiS_Is301B(BaseAddr))){  
+        temp=SiS_GetReg1(SiS_Part1Port,0x2E);
+        if(!(temp&0x80))
+           SiS_SetRegOR(SiS_Part1Port,0x2E,0x80);
+        if((!(SiS_IsDualEdge(BaseAddr)))&&(!(SiS_IsVAMode(BaseAddr))))
+           tempah=0x80;
+        else if((!(SiS_IsDualEdge(BaseAddr)))&&(SiS_IsVAMode(BaseAddr)))
+           tempah=0x40;
+        else
+           tempah=0xC0;
+        SiS_SetRegOR(SiS_Part4Port,0x1F,tempah);
+      }
+     }  
+  /*end 301b*/
+  } else {                /*LVDS*/
+    SiS_EnableCRT2();
+    SiS_DisplayOn();
+    SiS_UnLockCRT2(HwDeviceExtension, BaseAddr);
+    SiS_SetRegANDOR(SiS_Part1Port,0x02,0xBF,0x00);
+    if(SiS_BridgeInSlave()) {
+      	SiS_SetRegANDOR(SiS_Part1Port,0x01,0x1F,0x00);
+    } else {
+      	SiS_SetRegANDOR(SiS_Part1Port,0x01,0x1F,0x40);
+    }
+    if(SiS_IF_DEF_CH7005) {
+        if (SiS_Backup7005 != 0xff) {
+		SiS_SetCH7005(((SiS_Backup7005<<8)|0x0E));
+		SiS_Backup7005 = 0xff;
+	} else SiS_SetCH7005(0x0B0E);
+    }
+  }
+  /*SetPanelDelay(1);  */
+  SiS_SetRegANDOR(SiS_P3c4,0x11,0xF7,0x00);
+}
+
+void
+SiS_SetPanelDelay(USHORT DelayTime)
+{
+  USHORT PanelID;
+
+  PanelID=SiS_GetReg1(SiS_P3d4,0x36);
+  PanelID=PanelID>>4;
+
+  if(DelayTime==0) SiS_LCD_Wait_Time(SiS_PanelDelayTbl[PanelID].timer[0]);
+  else SiS_LCD_Wait_Time(SiS_PanelDelayTbl[PanelID].timer[1]);
+}
+
+void
+SiS_LCD_Wait_Time(UCHAR DelayTime)
+{
+  USHORT i,j;
+  ULONG  temp,flag;
+
+  flag=0;
+  for(i=0;i<DelayTime;i++) {
+    for(j=0;j<66;j++) {
+      temp=SiS_GetReg3(0x61);
+      temp=temp&0x10;
+      if(temp==flag) continue;
+      flag=temp;
+    }
+  }
 }
 
 /*301b*/
-
-BOOLEAN
-SiS_Is301B (USHORT BaseAddr)
-{
-	USHORT flag;
-	flag = SiS_GetReg1 (SiS_Part4Port, 0x01);
-	if (flag > (0x0B0))
-		return (0);	/*301b */
-	else
-		return (1);
-}
-
-BOOLEAN
-SiS_IsDualEdge (USHORT BaseAddr)
-{
-#ifdef CONFIG_FB_SIS_315
-	USHORT flag;
-	flag = SiS_GetReg1 (SiS_P3d4, 0x38);
-	if (flag & EnableDualEdge)
-		return (0);
-	else
-		return (1);
-#endif
-	return (1);
-}
-
-BOOLEAN
-SiS_IsVAMode (USHORT BaseAddr)
-{
-	USHORT flag;
-	flag = SiS_GetReg1 (SiS_P3d4, 0x38);
-#ifdef CONFIG_FB_SIS_315
-	if ((flag & EnableDualEdge) && (flag & SetToLCDA))
-		return (0);
-	else
-		return (1);
-#endif
-	return (1);
-}
-
-BOOLEAN
-SiS_IsDisableCRT2 (USHORT BaseAddr)
-{
-	USHORT flag;
-	flag = SiS_GetReg1 (SiS_P3d4, 0x30);
-	if (flag & 0x20)
-		return (0);	/*301b */
-	else
-		return (1);
-}
-
-/*end 301b*/
-
 BOOLEAN
-SiS_BridgeIsOn (USHORT BaseAddr)
+SiS_Is301B(USHORT BaseAddr)
 {
-	USHORT flag;
+  USHORT flag;
 
-	if (SiS_IF_DEF_LVDS == 1) {
-		return (1);
-	} else {
-		flag = SiS_GetReg1 (SiS_Part4Port, 0x00);
-		if ((flag == 1) || (flag == 2))
-			return (1);	/*301b */
-		else
-			return (0);
-	}
-}
-
-BOOLEAN
-SiS_BridgeIsEnable (USHORT BaseAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
-{
-	USHORT flag;
-
-	if (SiS_BridgeIsOn (BaseAddr) == 0) {
-		flag = SiS_GetReg1 (SiS_Part1Port, 0x0);
-		if (HwDeviceExtension->jChipType < SIS_315H) {	/* 300 series */
-			if (flag & 0x0a0) {
-				return 1;
-			} else {
-				return 0;
-			}
-		} else {	/* 310 series */
-
-			if (flag & 0x050) {
-				return 1;
-			} else {
-				return 0;
-			}
-
-		}
-	}
-	return 0;
-}
-
-BOOLEAN
-SiS_BridgeInSlave ()
-{
-	USHORT flag1;
-
-	flag1 = SiS_GetReg1 (SiS_P3d4, 0x31);
-	if (flag1 & (SetInSlaveMode >> 8)) {
-		return 1;
-	} else {
-		return 0;
-	}
-}
+    flag=SiS_GetReg1(SiS_Part4Port,0x01);
+    if(flag>(0x0B0)) return(0); /*301b*/
+    else return(1);
+ }
 
 BOOLEAN
-SiS_GetLCDResInfo301 (ULONG ROMAddr, USHORT SiS_P3d4, USHORT ModeNo,
-		      USHORT ModeIdIndex)
+SiS_IsDualEdge(USHORT BaseAddr)
 {
-	USHORT temp, modeflag, resinfo = 0;
-
-	SiS_LCDResInfo = 0;
-	SiS_LCDTypeInfo = 0;
-	SiS_LCDInfo = 0;
-
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ModeFlag  */
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
-		resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;	/*si+Ext_ResInfo */
-	}
+#ifdef SIS315H
+    USHORT flag;
 
-	if (!(SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))) {
-		return 0;
-	}
-	if (!(SiS_VBInfo & (SetSimuScanMode | SwitchToCRT2))) {
-		return 0;
-	}
-	temp = SiS_GetReg1 (SiS_P3d4, 0x36);
-	SiS_LCDTypeInfo = temp >> 4;
-	SiS_LCDResInfo = temp & 0x0F;
-	if (SiS_IF_DEF_LVDS == 0) {
-		if (SiS_LCDResInfo < Panel1024x768)
-			SiS_LCDResInfo = Panel1024x768;
-	} else {
-		if (SiS_LCDResInfo < Panel800x600)
-			SiS_LCDResInfo = Panel800x600;
-	}
-	if (SiS_LCDResInfo > Panel640x480)
-		SiS_LCDResInfo = Panel1024x768;
-
-	temp = SiS_GetReg1 (SiS_P3d4, 0x37);
-	SiS_LCDInfo = temp;
-
-	if (SiS_IF_DEF_LVDS == 1) {
-		if (modeflag & HalfDCLK) {
-			if (SiS_IF_DEF_TRUMPION == 0) {
-				if (!(SiS_LCDInfo & LCDNonExpanding)) {
-					if (ModeNo > 0x13) {
-						if (SiS_LCDResInfo ==
-						    Panel1024x768) {
-							if (resinfo == 4) {	/* 512x384  */
-								SiS_SetFlag =
-								    SiS_SetFlag
-								    |
-								    EnableLVDSDDA;
-							}
-						} else {
-							if (SiS_LCDResInfo ==
-							    Panel800x600) {
-								if (resinfo == 3) {	/*400x300  */
-									SiS_SetFlag
-									    =
-									    SiS_SetFlag
-									    |
-									    EnableLVDSDDA;
-								}
-							}
-						}
-					}
-				} else {
-					SiS_SetFlag =
-					    SiS_SetFlag | EnableLVDSDDA;
-				}
-			} else {
-				SiS_SetFlag = SiS_SetFlag | EnableLVDSDDA;
-			}
-		}
-	}
-
-	if (SiS_VBInfo & SetInSlaveMode) {
-		if (SiS_VBInfo & SetNotSimuMode) {
-			SiS_SetFlag = SiS_SetFlag | LCDVESATiming;
-		}
-	} else {
-		SiS_SetFlag = SiS_SetFlag | LCDVESATiming;
-	}
-	return 1;
-}
-
-void
-SiS_PresetScratchregister (USHORT SiS_P3d4,
-			   PSIS_HW_DEVICE_INFO HwDeviceExtension)
-{
-	/*SiS_SetReg1(SiS_P3d4,0x30,0x21);  */
-	/*SiS_SetReg1(SiS_P3d4,0x31,0x41);  */
-	/*SiS_SetReg1(SiS_P3d4,0x32,0x28);  */
-	/*SiS_SetReg1(SiS_P3d4,0x33,0x22);  */
-	/*SiS_SetReg1(SiS_P3d4,0x35,0x43);  */
-	/*SiS_SetReg1(SiS_P3d4,0x36,0x01);  */
-	/*SiS_SetReg1(SiS_P3d4,0x37,0x00);  */
-}
-
-void
-SiS_LongWait ()
-{
-	USHORT i;
-
-	i = SiS_GetReg1 (SiS_P3c4, 0x1F);
-	if (!(i & 0xC0)) {
-
-		for (i = 0; i < 0xFFFF; i++) {
-			if (!(SiS_GetReg2 (SiS_P3da) & 0x08))
-				break;
-		}
-		for (i = 0; i < 0xFFFF; i++) {
-			if ((SiS_GetReg2 (SiS_P3da) & 0x08))
-				break;
-		}
-	}
-}
-
-void
-SiS_VBLongWait ()
-{
-	USHORT tempal, temp, i, j;
-
-	if (!(SiS_VBInfo & SetCRT2ToTV)) {
-		temp = 0;
-		for (i = 0; i < 3; i++) {
-			for (j = 0; j < 100; j++) {
-				tempal = SiS_GetReg2 (SiS_P3da);
-				if (temp & 0x01) {	/* VBWaitMode2  */
-					if ((tempal & 0x08)) {
-						continue;
-					}
-					if (!(tempal & 0x08)) {
-						break;
-					}
-				} else {	/* VBWaitMode1  */
-					if (!(tempal & 0x08)) {
-						continue;
-					}
-					if ((tempal & 0x08)) {
-						break;
-					}
-				}
-			}
-			temp = temp ^ 0x01;
-		}
-	} else {
-		SiS_LongWait ();
-	}
-	return;
+     flag=SiS_GetReg1(SiS_P3d4,0x38);
+      if(flag&EnableDualEdge)
+        return (0);
+      else
+#endif
+      	return(1);
 }
 
 BOOLEAN
-SiS_WaitVBRetrace (USHORT BaseAddr)
-{
-	USHORT temp;
-
-	return 0;
-
-	temp = SiS_GetReg1 (SiS_Part1Port, 0x00);
-	if (!(temp & 0x80)) {
-		return 0;
-	}
-
-	for (temp = 0; temp == 0;) {
-		temp = SiS_GetReg1 (SiS_Part1Port, 0x25);
-		temp = temp & 0x01;
-	}
-	for (; temp > 0;) {
-		temp = SiS_GetReg1 (SiS_Part1Port, 0x25);
-		temp = temp & 0x01;
-	}
-	return 1;
-}
-
-void
-SiS_SetRegANDOR (USHORT Port, USHORT Index, USHORT DataAND, USHORT DataOR)
-{
-	USHORT temp;
-
-	temp = SiS_GetReg1 (Port, Index);	/* SiS_Part1Port index 02 */
-	temp = (temp & (DataAND)) | DataOR;
-	SiS_SetReg1 (Port, Index, temp);
-}
-
-void
-SiS_SetRegAND (USHORT Port, USHORT Index, USHORT DataAND)
-{
-	USHORT temp;
-
-	temp = SiS_GetReg1 (Port, Index);	/* SiS_Part1Port index 02 */
-	temp = temp & DataAND;
-	SiS_SetReg1 (Port, Index, temp);
-}
-
-void
-SiS_SetRegOR (USHORT Port, USHORT Index, USHORT DataOR)
-{
-	USHORT temp;
-
-	temp = SiS_GetReg1 (Port, Index);	/* SiS_Part1Port index 02 */
-	temp = temp | DataOR;
-	SiS_SetReg1 (Port, Index, temp);
-}
-
-void
-SiS_SetGroup2 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
-	       USHORT ModeIdIndex, USHORT RefreshRateTableIndex,
-	       PSIS_HW_DEVICE_INFO HwDeviceExtension)
-{
-	USHORT i, j, tempax, tempbx, tempcx, temp, temp3;
-	USHORT push1, push2, temp1;
-	UCHAR *PhasePoint;
-	UCHAR *TimingPoint;
-	USHORT modeflag, resinfo, crt2crtc, resindex, xres;
-	ULONG longtemp, tempeax, tempebx, temp2, tempecx;
-	USHORT SiS_RY1COE = 0, SiS_RY2COE = 0, SiS_RY3COE = 0, SiS_RY4COE =
-	    0, SiS_RY5COE = 0, SiS_RY6COE = 0, SiS_RY7COE = 0;
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ResInfo */
-		resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
-		crt2crtc = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+Ext_ResInfo */
-		resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
-		crt2crtc = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
-	}
-
-	tempcx = SiS_VBInfo;
-	tempax = (tempcx & 0x00FF) << 8;
-	tempbx = (tempcx & 0x00FF) | ((tempcx & 0x00FF) << 8);
-	tempbx = tempbx & 0x0410;
-	temp = (tempax & 0x0800) >> 8;
-	temp = temp >> 1;
-	temp = temp | (((tempbx & 0xFF00) >> 8) << 1);
-	temp = temp | ((tempbx & 0x00FF) >> 3);
-	temp = temp ^ 0x0C;
-
-	PhasePoint = SiS_PALPhase;
-	if (SiS_VBInfo & SetCRT2ToHiVisionTV) {	/* PALPhase */
-		temp = temp ^ 0x01;
-		if (SiS_VBInfo & SetInSlaveMode) {
-			TimingPoint = SiS_HiTVSt2Timing;
-			if (SiS_SetFlag & TVSimuMode) {
-				if (modeflag & Charx8Dot)
-					TimingPoint = SiS_HiTVSt1Timing;
-				else
-					TimingPoint = SiS_HiTVTextTiming;
-			}
-		} else
-			TimingPoint = SiS_HiTVExtTiming;
-	} else {
-		if (SiS_VBInfo & SetPALTV) {
-			if ((SiS_VBType & VB_SIS301B)
-			    || (SiS_VBType & VB_SIS302B)) PhasePoint = SiS_PALPhase2;	/* PALPhase */
-			else
-				PhasePoint = SiS_PALPhase;
-
-			TimingPoint = SiS_PALTiming;
-		} else {
-			temp = temp | 0x10;
-			if ((SiS_VBType & VB_SIS301B)
-			    || (SiS_VBType & VB_SIS302B)) PhasePoint = SiS_NTSCPhase2;	/* PALPhase */
-			else
-				PhasePoint = SiS_NTSCPhase;
-
-			TimingPoint = SiS_NTSCTiming;
-		}
-	}
-	SiS_SetReg1 (SiS_Part2Port, 0x0, temp);
-
-#ifdef CONFIG_FB_SIS_300
-	/*add PALMN */
-	if ((HwDeviceExtension->jChipType == SIS_630) ||
-	    (HwDeviceExtension->jChipType == SIS_730)) {
-		if (SiS_VBInfo & SetCRT2ToTV) {
-			temp = SiS_GetReg1 (SiS_P3d4, 0x31);
-			temp = temp & 0x01;
-			if (temp) {
-				temp1 = SiS_GetReg1 (SiS_P3d4, 0x35);
-				temp1 = temp1 & 0x40;
-				if (temp1)
-					PhasePoint = SiS_PALMPhase;
-				temp1 = SiS_GetReg1 (SiS_P3d4, 0x35);
-				temp1 = temp1 & 0x80;
-				if (temp1)
-					PhasePoint = SiS_PALNPhase;
-			}
-		}
-	}
-/*end add*/
-#endif
-#ifdef CONFIG_FB_SIS_315
-	/*add PALMN */
-	if (SiS_VBInfo & SetCRT2ToTV) {
-		temp = SiS_GetReg1 (SiS_P3d4, 0x31);
-		temp = temp & 0x01;
-		if (temp) {
-			temp1 = SiS_GetReg1 (SiS_P3d4, 0x38);
-			temp1 = temp1 & 0x40;
-			if (temp1)
-				PhasePoint = SiS_PALMPhase;
-			temp1 = SiS_GetReg1 (SiS_P3d4, 0x38);
-			temp1 = temp1 & 0x80;
-			if (temp1)
-				PhasePoint = SiS_PALNPhase;
-		}
-	}
-	/*end add */
-#endif
-	for (i = 0x31, j = 0; i <= 0x34; i++, j++) {
-		SiS_SetReg1 (SiS_Part2Port, i, PhasePoint[j]);
-	}
-	for (i = 0x01, j = 0; i <= 0x2D; i++, j++) {
-		SiS_SetReg1 (SiS_Part2Port, i, TimingPoint[j]);
-	}
-	for (i = 0x39; i <= 0x45; i++, j++) {
-		SiS_SetReg1 (SiS_Part2Port, i, TimingPoint[j]);	/* di->temp2[j] */
-	}
-	if (SiS_VBInfo & SetCRT2ToTV) {
-		SiS_SetRegANDOR (SiS_Part2Port, 0x3A, 0x1F, 0x00);
-	}
-	temp = SiS_NewFlickerMode;
-	SiS_SetRegANDOR (SiS_Part2Port, 0x0A, 0xFF, temp);
-
-	SiS_SetReg1 (SiS_Part2Port, 0x35, 0x00);	/*301b */
-	SiS_SetReg1 (SiS_Part2Port, 0x36, 0x00);
-	SiS_SetReg1 (SiS_Part2Port, 0x37, 0x00);
-	SiS_SetReg1 (SiS_Part2Port, 0x38, SiS_RY1COE);
-	SiS_SetReg1 (SiS_Part2Port, 0x48, SiS_RY2COE);
-	SiS_SetReg1 (SiS_Part2Port, 0x49, SiS_RY3COE);
-	SiS_SetReg1 (SiS_Part2Port, 0x4a, SiS_RY4COE);
-/*add to change 630+301b filter*/
-
-	resindex = SiS_GetResInfo (ROMAddr, ModeNo, ModeIdIndex);
-	if (ModeNo <= 0x13) {
-		xres = SiS_StResInfo[resindex].HTotal;
-	} else {
-		xres = SiS_ModeResInfo[resindex].HTotal;	/* xres->ax */
-	}
-	if (xres == 640) {
-		SiS_RY1COE = 0xFF;
-		SiS_RY2COE = 0x03;
-		SiS_RY3COE = 0x02;
-		SiS_RY4COE = 0xF6;
-		SiS_RY5COE = 0xFC;
-		SiS_RY6COE = 0x27;
-		SiS_RY7COE = 0x46;
-	}
-	if (xres == 800) {
-		SiS_RY1COE = 0x01;
-		SiS_RY2COE = 0x01;
-		SiS_RY3COE = 0xFC;
-		SiS_RY4COE = 0xF8;
-		SiS_RY5COE = 0x08;
-		SiS_RY6COE = 0x26;
-		SiS_RY7COE = 0x38;
-	}
-	if (xres == 1024) {
-		SiS_RY1COE = 0xFF;
-		SiS_RY2COE = 0xFF;
-		SiS_RY3COE = 0xFC;
-		SiS_RY4COE = 0x00;
-		SiS_RY5COE = 0x0F;
-		SiS_RY6COE = 0x22;
-		SiS_RY7COE = 0x28;
-	}
-	if (xres == 720) {
-		SiS_RY1COE = 0x01;
-		SiS_RY2COE = 0x02;
-		SiS_RY3COE = 0xFE;
-		SiS_RY4COE = 0xF7;
-		SiS_RY5COE = 0x03;
-		SiS_RY6COE = 0x27;
-		SiS_RY7COE = 0x3c;
-	}
-	SiS_SetReg1 (SiS_Part2Port, 0x35, SiS_RY1COE);	/*301b */
-	SiS_SetReg1 (SiS_Part2Port, 0x36, SiS_RY2COE);
-	SiS_SetReg1 (SiS_Part2Port, 0x37, SiS_RY3COE);
-	SiS_SetReg1 (SiS_Part2Port, 0x38, SiS_RY4COE);
-	SiS_SetReg1 (SiS_Part2Port, 0x48, SiS_RY5COE);
-	SiS_SetReg1 (SiS_Part2Port, 0x49, SiS_RY6COE);
-	SiS_SetReg1 (SiS_Part2Port, 0x4a, SiS_RY7COE);
-
-/*end add*/
-
-	if (SiS_VBInfo & SetCRT2ToHiVisionTV)
-		tempax = 950;
-	else {
-		if (SiS_VBInfo & SetPALTV)
-			tempax = 520;
-		else
-			tempax = 440;
-	}
-	if (SiS_VDE <= tempax) {
-		tempax = tempax - SiS_VDE;
-		tempax = tempax >> 2;
-		tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
-		push1 = tempax;
-		temp = (tempax & 0xFF00) >> 8;
-		temp = temp + (USHORT) TimingPoint[0];
-		SiS_SetReg1 (SiS_Part2Port, 0x01, temp);
-		tempax = push1;
-		temp = (tempax & 0xFF00) >> 8;
-		temp = temp + TimingPoint[1];
-		SiS_SetReg1 (SiS_Part2Port, 0x02, temp);
-	}
-	/*301b */
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-	    && (SiS_VBInfo & SetCRT2ToTV) && (SiS_VGAHDE == 1024)) {
-		if (SiS_VBInfo & SetPALTV) {
-			SiS_SetReg1 (SiS_Part2Port, 0x01, 0x19);
-			SiS_SetReg1 (SiS_Part2Port, 0x02, 0x52);
-		} else {
-			SiS_SetReg1 (SiS_Part2Port, 0x01, 0x0B);
-			SiS_SetReg1 (SiS_Part2Port, 0x02, 0x11);
-		}
-	}
-
-	tempcx = SiS_HT - 1;
-	/*301b */
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) {
-		tempcx = tempcx - 1;
-	}
-	temp = tempcx & 0x00FF;
-	SiS_SetReg1 (SiS_Part2Port, 0x1B, temp);
-	temp = (tempcx & 0xFF00) >> 8;
-	SiS_SetRegANDOR (SiS_Part2Port, 0x1D, ~0x0F, temp);
-
-	tempcx = SiS_HT >> 1;
-	push1 = tempcx;		/* push cx */
-	tempcx = tempcx + 7;
-	if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
-		tempcx = tempcx - 4;
-	}
-	temp = (tempcx & 0x00FF);
-	temp = temp << 4;
-	SiS_SetRegANDOR (SiS_Part2Port, 0x22, 0x0F, temp);
-
-	tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
-	tempbx = tempbx + tempcx;
-	push2 = tempbx;
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part2Port, 0x24, temp);
-	temp = (tempbx & 0xFF00) >> 8;
-	temp = temp << 4;
-	SiS_SetRegANDOR (SiS_Part2Port, 0x25, 0x0F, temp);
-
-	tempbx = push2;
-	tempbx = tempbx + 8;
-	if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
-		tempbx = tempbx - 4;
-		tempcx = tempbx;
-	}
-	temp = (tempbx & 0x00FF) << 4;
-	SiS_SetRegANDOR (SiS_Part2Port, 0x29, 0x0F, temp);
-
-	j = j + 2;
-	tempcx = tempcx + (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
-	temp = tempcx & 0x00FF;
-	SiS_SetReg1 (SiS_Part2Port, 0x27, temp);
-	temp = ((tempcx & 0xFF00) >> 8) << 4;
-	SiS_SetRegANDOR (SiS_Part2Port, 0x28, 0x0F, temp);
-
-	tempcx = tempcx + 8;
-	if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
-		tempcx = tempcx - 4;
-	}
-	temp = tempcx & 0xFF;
-	temp = temp << 4;
-	SiS_SetRegANDOR (SiS_Part2Port, 0x2A, 0x0F, temp);
-
-	tempcx = push1;		/* pop cx */
-	j = j + 2;
-	temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
-	tempcx = tempcx - temp;
-	temp = tempcx & 0x00FF;
-	temp = temp << 4;
-	SiS_SetRegANDOR (SiS_Part2Port, 0x2D, 0x0F, temp);
-
-	tempcx = tempcx - 11;
-	if (!(SiS_VBInfo & SetCRT2ToTV)) {
-		tempax = SiS_GetVGAHT2 ();
-		tempcx = tempax - 1;
-	}
-	temp = tempcx & 0x00FF;
-	SiS_SetReg1 (SiS_Part2Port, 0x2E, temp);
-
-	tempbx = SiS_VDE;
-	if (SiS_VGAVDE == 360)
-		tempbx = 746;
-	if (SiS_VGAVDE == 375)
-		tempbx = 746;
-	if (SiS_VGAVDE == 405)
-		tempbx = 853;
-	if (SiS_VBInfo & SetCRT2ToTV) {
-		tempbx = tempbx >> 1;
-	}
-	tempbx = tempbx - 2;
-	temp = tempbx & 0x00FF;
-	if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
-		if (SiS_VBInfo & SetInSlaveMode) {
-			if (ModeNo == 0x2f)
-				temp = temp + 1;
-		}
-	}
-	SiS_SetReg1 (SiS_Part2Port, 0x2F, temp);
-
-	temp = (tempcx & 0xFF00) >> 8;
-	temp = temp | (((tempbx & 0xFF00) >> 8) << 6);
-	if (!(SiS_VBInfo & SetCRT2ToHiVisionTV)) {
-		temp = temp | 0x10;
-		if (!(SiS_VBInfo & SetCRT2ToSVIDEO)) {
-			temp = temp | 0x20;
-		}
-	}
-	SiS_SetReg1 (SiS_Part2Port, 0x30, temp);
-	/*301b */
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) {	/*tv gatingno */
-		tempbx = SiS_VDE;
-		if (SiS_VBInfo & SetCRT2ToTV) {
-			tempbx = tempbx >> 1;
-		}
-		temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
-		SiS_SetReg1 (SiS_Part2Port, 0x46, temp);
-		temp = (tempbx - 3) & 0x00FF;
-		SiS_SetReg1 (SiS_Part2Port, 0x47, temp);
-	}
-/*end 301b*/
-
-	tempbx = tempbx & 0x00FF;
-	if (!(modeflag & HalfDCLK)) {
-		tempcx = SiS_VGAHDE;
-		if (tempcx >= SiS_HDE) {
-			tempbx = tempbx | 0x2000;
-			tempax = tempax & 0x00FF;
-		}
-	}
-	tempcx = 0x0101;
-
-	if (SiS_VBInfo & (SetCRT2ToHiVisionTV | SetCRT2ToTV)) {	/*301b */
-		if (SiS_VGAHDE >= 1024) {
-			tempcx = 0x1920;
-			if (SiS_VGAHDE >= 1280) {
-				tempcx = 0x1420;
-				tempbx = tempbx & 0xDFFF;
-			}
-		}
-	}
-	if (!(tempbx & 0x2000)) {
-		if (modeflag & HalfDCLK) {
-			tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
-		}
-		push1 = tempbx;
-		tempeax = SiS_VGAHDE;
-		tempebx = (tempcx & 0xFF00) >> 8;
-		longtemp = tempeax * tempebx;
-		tempecx = tempcx & 0x00FF;
-		longtemp = longtemp / tempecx;
-		/*301b */
-		tempecx = 8 * 1024;
-		if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) {
-			tempecx = tempecx * 8;
-		}
-		longtemp = longtemp * tempecx;
-		tempecx = SiS_HDE;
-		temp2 = longtemp % tempecx;
-		tempeax = longtemp / tempecx;
-		if (temp2 != 0) {
-			tempeax = tempeax + 1;
-		}
-		tempax = (USHORT) tempeax;
-		/*301b */
-		if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) {
-			tempcx = ((tempax & 0xFF00) >> 5) >> 8;
-		}
-		/*end 301b */
-		tempbx = push1;
-		tempbx =
-		    (USHORT) (((tempeax & 0x0000FF00) & 0x1F00) |
-			      (tempbx & 0x00FF));
-		tempax =
-		    (USHORT) (((tempeax & 0x000000FF) << 8) |
-			      (tempax & 0x00FF));
-		temp = (tempax & 0xFF00) >> 8;
-	} else {
-		temp = (tempax & 0x00FF) >> 8;
-	}
-	SiS_SetReg1 (SiS_Part2Port, 0x44, temp);
-	temp = (tempbx & 0xFF00) >> 8;
-	SiS_SetRegANDOR (SiS_Part2Port, 0x45, ~0x03F, temp);
-	/*301b */
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) {
-		if ((tempcx & 0x00FF) == 0x01)
-			tempcx = 0x00;
-		SiS_SetRegANDOR (SiS_Part2Port, 0x46, ~0x007, tempcx);
-		SiS_SetRegOR (SiS_Part2Port, 0x46, 0x18);
-		if (SiS_VBInfo & SetPALTV) {
-			tempbx = 0x0364;
-			tempcx = 0x009c;
-		} else {
-			tempbx = 0x0346;
-			tempcx = 0x0078;
-		}
-		temp = (tempbx & 0x00FF);
-		SiS_SetReg1 (SiS_Part2Port, 0x4B, temp);
-		temp = (tempcx & 0x00FF);
-		SiS_SetReg1 (SiS_Part2Port, 0x4C, temp);
-		tempbx = (tempbx & 0x0300);
-		temp = (tempcx & 0xFF00) >> 8;
-		temp = (temp & 0x0003) << 2;
-		temp = temp | (tempbx >> 8);
-		SiS_SetReg1 (SiS_Part2Port, 0x4D, temp);
-		temp = SiS_GetReg1 (SiS_Part2Port, 0x43);
-		SiS_SetReg1 (SiS_Part2Port, 0x43, temp - 3);
-	}
-/*end 301b*/
-
-#ifdef CONFIG_FB_SIS_300
-/*add PALMN*/
-	if ((HwDeviceExtension->jChipType == SIS_630) ||
-	    (HwDeviceExtension->jChipType == SIS_730)) {
-		if (SiS_VBInfo & SetCRT2ToTV) {
-			temp = SiS_GetReg1 (SiS_P3d4, 0x31);
-			temp = temp & 0x01;
-			if (temp) {
-				temp1 = SiS_GetReg1 (SiS_P3d4, 0x35);
-				temp1 = temp1 & 0x40;
-				if (temp1) {
-					SiS_SetRegANDOR (SiS_Part2Port, 0x00,
-							 0xEF, 0x00);
-					temp3 =
-					    SiS_GetReg1 (SiS_Part2Port, 0x01);
-					temp3 = temp3 - 1;
-					SiS_SetReg1 (SiS_Part2Port, 0x01,
-						     temp3);
-				}
-			}
-		}
-	}
-	/*end add */
-#endif
-
-#ifdef CONFIG_FB_SIS_315
-/*add PALMN*/
-	if (SiS_VBInfo & SetCRT2ToTV) {
-		temp = SiS_GetReg1 (SiS_P3d4, 0x31);
-		temp = temp & 0x01;
-		if (temp) {
-			temp1 = SiS_GetReg1 (SiS_P3d4, 0x38);
-			temp1 = temp1 & 0x40;
-			if (temp1) {
-				SiS_SetRegANDOR (SiS_Part2Port, 0x00, 0xEF,
-						 0x00);
-				temp3 = SiS_GetReg1 (SiS_Part2Port, 0x01);
-				temp3 = temp3 - 1;
-				SiS_SetReg1 (SiS_Part2Port, 0x01, temp3);
-			}
-		}
-	}
-	/*end add */
-#endif
-
-	if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
-		if (!(SiS_VBInfo & SetInSlaveMode)) {
-			SiS_SetReg1 (SiS_Part2Port, 0x0B, 0x00);
-		}
-	}
-	if (SiS_VBInfo & SetCRT2ToTV) {
-		return;
-	}
-
-	tempbx = SiS_HDE - 1;	/* RHACTE=HDE-1 */
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part2Port, 0x2C, temp);
-	temp = (tempbx & 0xFF00) >> 8;
-	temp = temp << 4;
-	SiS_SetRegANDOR (SiS_Part2Port, 0x2B, 0x0F, temp);
-	temp = 0x01;
-	if (SiS_LCDResInfo == Panel1280x1024) {
-		if (SiS_ModeType == ModeEGA) {
-			if (SiS_VGAHDE >= 1024) {
-				temp = 0x02;
-				if (SiS_SetFlag & LCDVESATiming)
-					temp = 0x01;
-			}
-		}
-	}
-	SiS_SetReg1 (SiS_Part2Port, 0x0B, temp);
-
-	tempbx = SiS_VDE;	/* RTVACTEO=(VDE-1)&0xFF */
-	push1 = tempbx;
-	tempbx--;
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part2Port, 0x03, temp);
-	temp = ((tempbx & 0xFF00) >> 8) & 0x07;
-	SiS_SetRegANDOR (SiS_Part2Port, 0x0C, ~0x07, temp);
-
-	tempcx = SiS_VT - 1;
-	push2 = tempcx + 1;
-	temp = tempcx & 0x00FF;	/* RVTVT=VT-1 */
-	SiS_SetReg1 (SiS_Part2Port, 0x19, temp);
-	temp = (tempcx & 0xFF00) >> 8;
-	temp = temp << 5;
-	if (SiS_LCDInfo & LCDRGB18Bit) {
-		temp = temp | 0x10;
-	}
-	if (SiS_VBInfo & SetCRT2ToLCD) {
-		tempbx = (tempbx & 0xFF00) | (SiS_LCDInfo & 0x0FF);
-		if (tempbx & LCDSync) {
-			tempbx = tempbx & LCDSyncBit;
-			tempbx =
-			    (tempbx & 0xFF00) | ((tempbx & 0x00FF) >>
-						 LCDSyncShift);
-			temp = temp | (tempbx & 0x00FF);
-		}
-	}
-	SiS_SetReg1 (SiS_Part2Port, 0x1A, temp);
-
-	tempcx++;
-	tempbx = 768;
-	if (SiS_LCDResInfo != Panel1024x768) {
-		tempbx = 1024;
-		if (SiS_LCDResInfo != Panel1280x1024) {
-			tempbx = 1200;	/*301b */
-			if (SiS_LCDResInfo != Panel1600x1200) {
-				if (tempbx != SiS_VDE) {
-					tempbx = 960;
-				}
-			}
-		}
-	}
-	if (SiS_LCDInfo & LCDNonExpanding) {
-		tempbx = SiS_VDE;
-		tempbx--;
-		tempcx--;
-	}
-	tempax = 1;
-	if (!(SiS_LCDInfo & LCDNonExpanding)) {
-		if (tempbx != SiS_VDE) {
-			tempax = tempbx;
-			if (tempax < SiS_VDE) {
-				tempax = 0;
-				tempcx = 0;
-			} else {
-				tempax = tempax - SiS_VDE;
-			}
-			tempax = tempax >> 1;
-		}
-		tempcx = tempcx - tempax;	/* lcdvdes */
-		tempbx = tempbx - tempax;	/* lcdvdee */
-	} else {
-		tempax = tempax >> 1;
-		tempcx = tempcx - tempax;	/* lcdvdes */
-		tempbx = tempbx - tempax;	/* lcdvdee */
-	}
-
-	temp = tempcx & 0x00FF;	/* RVEQ1EQ=lcdvdes */
-	SiS_SetReg1 (SiS_Part2Port, 0x05, temp);
-	temp = tempbx & 0x00FF;	/* RVEQ2EQ=lcdvdee */
-	SiS_SetReg1 (SiS_Part2Port, 0x06, temp);
-
-	temp = (tempbx & 0xFF00) >> 8;
-	temp = temp << 3;
-	temp = temp | ((tempcx & 0xFF00) >> 8);
-	SiS_SetReg1 (SiS_Part2Port, 0x02, temp);
-
-	tempbx = push2;
-	tempax = push1;
-	tempcx = tempbx;
-	tempcx = tempcx - tempax;
-	tempcx = tempcx >> 4;
-	tempbx = tempbx + tempax;
-	tempbx = tempbx >> 1;
-	if (SiS_LCDInfo & LCDNonExpanding) {
-		tempbx = tempbx - 10;
-	}
-	temp = tempbx & 0x00FF;	/* RTVACTEE=lcdvrs */
-	SiS_SetReg1 (SiS_Part2Port, 0x04, temp);
-
-	temp = (tempbx & 0xFF00) >> 8;
-	temp = temp << 4;
-	tempbx = tempbx + tempcx + 1;
-	temp = temp | (tempbx & 0x000F);
-	SiS_SetReg1 (SiS_Part2Port, 0x01, temp);
-
-	if (SiS_LCDResInfo == Panel1024x768) {
-		if (!(SiS_SetFlag & LCDVESATiming)) {
-			if (!(SiS_LCDInfo & LCDNonExpanding)) {
-				if (ModeNo == 0x13) {
-					SiS_SetReg1 (SiS_Part2Port, 0x04, 0xB9);
-					SiS_SetReg1 (SiS_Part2Port, 0x05, 0xCC);
-					SiS_SetReg1 (SiS_Part2Port, 0x06, 0xA6);
-				} else {
-					temp = crt2crtc & 0x3F;
-					if (temp == 4) {
-						SiS_SetReg1 (SiS_Part2Port,
-							     0x01, 0x2B);
-						SiS_SetReg1 (SiS_Part2Port,
-							     0x02, 0x13);
-						SiS_SetReg1 (SiS_Part2Port,
-							     0x04, 0xE5);
-						SiS_SetReg1 (SiS_Part2Port,
-							     0x05, 0x08);
-						SiS_SetReg1 (SiS_Part2Port,
-							     0x06, 0xE2);
-					}
-				}
-			}
-		}
-	}
-
-	SiS_SetRegANDOR (SiS_Part2Port, 0x09, 0xF0, 0x00);
-	SiS_SetRegANDOR (SiS_Part2Port, 0x0A, 0xF0, 0x00);
+SiS_IsVAMode(USHORT BaseAddr)
+{
+  USHORT flag;
+         flag=SiS_GetReg1(SiS_P3d4,0x38);
+#ifdef SIS315H
+      if((flag&EnableDualEdge)&&(flag&SetToLCDA))
+        return (0);
+      else
+#endif
+      	return(1);
+ }
 
-	tempcx = (SiS_HT - SiS_HDE) >> 2;	/* (HT-HDE)>>2     */
-	tempbx = (SiS_HDE + 7);	/* lcdhdee         */
-	/*301b */
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) {
-		tempbx = tempbx + 2;
-	}
-	push1 = tempbx;
-	temp = tempbx & 0x00FF;	/* RHEQPLE=lcdhdee */
-	SiS_SetReg1 (SiS_Part2Port, 0x23, temp);
-	temp = (tempbx & 0xFF00) >> 8;
-	SiS_SetRegANDOR (SiS_Part2Port, 0x25, ~0x0F, temp);
-	/*301b */
-	temp = 7;
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) {
-		temp = temp + 2;
-	}
-	SiS_SetReg1 (SiS_Part2Port, 0x1F, temp);	/* RHBLKE=lcdhdes */
-	SiS_SetRegANDOR (SiS_Part2Port, 0x20, 0x0F, 0x00);
+BOOLEAN
+SiS_IsDisableCRT2(USHORT BaseAddr)
+{
+  USHORT flag;
 
-	tempbx = tempbx + tempcx;
-	push2 = tempbx;
-	temp = tempbx & 0xFF;	/* RHBURSTS=lcdhrs */
-	if (SiS_LCDResInfo == Panel1280x1024) {
-		if (!(SiS_LCDInfo & LCDNonExpanding)) {
-			if (SiS_HDE == 1280) {
-				temp = 0x47;
-			}
-		}
-	}
-	SiS_SetReg1 (SiS_Part2Port, 0x1C, temp);
-	temp = (tempbx & 0xFF00) >> 8;
-	temp = temp << 4;
-	SiS_SetRegANDOR (SiS_Part2Port, 0x1D, ~0x0F0, temp);
-
-	tempbx = push2;
-	tempcx = tempcx << 1;
-	tempbx = tempbx + tempcx;
-	temp = tempbx & 0x00FF;	/* RHSYEXP2S=lcdhre */
-	SiS_SetReg1 (SiS_Part2Port, 0x21, temp);
-
-	SiS_SetRegANDOR (SiS_Part2Port, 0x17, 0xFB, 0x00);
-	SiS_SetRegANDOR (SiS_Part2Port, 0x18, 0xDF, 0x00);
-
-	if (!(SiS_SetFlag & LCDVESATiming)) {
-		if (SiS_VGAVDE == 525) {
-			if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) {	/*301b */
-				temp = 0xC6;
-			} else
-				temp = 0xC4;
-			SiS_SetReg1 (SiS_Part2Port, 0x2f, temp);
-			SiS_SetReg1 (SiS_Part2Port, 0x30, 0xB3);
-		}
-		if (SiS_VGAVDE == 420) {
-			if (
-			    ((SiS_VBType & VB_SIS301B)
-			     || (SiS_VBType & VB_SIS302B))) {
-				temp = 0x4F;
-			} else
-				temp = 0x4E;
-			SiS_SetReg1 (SiS_Part2Port, 0x2f, temp);
-		}
-	}
+  flag=SiS_GetReg1(SiS_P3d4,0x30);
+  if(flag&0x20) return(0); /*301b*/
+  else return(1);
 }
+/*end 301b*/
 
-USHORT
-SiS_GetVGAHT2 ()
+BOOLEAN
+SiS_BridgeIsOn(USHORT BaseAddr)
 {
-	ULONG tempax, tempbx;
+  USHORT flag;
 
-	tempbx = ((SiS_VGAVT - SiS_VGAVDE) * SiS_RVBHCMAX) & 0xFFFF;
-	tempax = (SiS_VT - SiS_VDE) * SiS_RVBHCFACT;
-	tempax = (tempax * SiS_HT) / tempbx;
-	return ((USHORT) tempax);
+  if(SiS_IF_DEF_LVDS==1){
+    return(1);
+  }
+  else {
+    flag=SiS_GetReg1(SiS_Part4Port,0x00);
+      if((flag==1)||(flag==2)) return(1); /*301b*/
+    else return(0);
+  }
 }
 
-void
-SiS_SetGroup3 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
-	       USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension)
-{
-	USHORT i;
-	UCHAR *tempdi;
-	USHORT modeflag, temp, temp1;
 
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ResInfo */
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+Ext_ResInfo */
-	}
+BOOLEAN
+SiS_BridgeIsEnable(USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+  USHORT flag;
 
-	SiS_SetReg1 (SiS_Part3Port, 0x00, 0x00);
-	if (SiS_VBInfo & SetPALTV) {
-		SiS_SetReg1 (SiS_Part3Port, 0x13, 0xFA);
-		SiS_SetReg1 (SiS_Part3Port, 0x14, 0xC8);
-	} else {
-		SiS_SetReg1 (SiS_Part3Port, 0x13, 0xF6);
-		SiS_SetReg1 (SiS_Part3Port, 0x14, 0xBF);
-	}
-#ifdef CONFIG_FB_SIS_300
-	/*add PALMN */
-	if ((HwDeviceExtension->jChipType == SIS_630) ||
-	    (HwDeviceExtension->jChipType == SIS_730)) {
-		if (SiS_VBInfo & SetCRT2ToTV) {
-			temp = SiS_GetReg1 (SiS_P3d4, 0x31);
-			temp = temp & 0x01;
-			if (temp) {
-				temp1 = SiS_GetReg1 (SiS_P3d4, 0x35);
-				temp1 = temp1 & 0x40;
-				if (temp1) {
-					SiS_SetReg1 (SiS_Part3Port, 0x13, 0xFA);
-					SiS_SetReg1 (SiS_Part3Port, 0x14, 0xC8);
-					SiS_SetReg1 (SiS_Part3Port, 0x3D, 0xA8);
-				}
-			}
-		}
-	}
-	/*end add */
-#endif
-#ifdef CONFIG_FB_SIS_315
-/*add PALMN*/
-	if (SiS_VBInfo & SetCRT2ToTV) {
-		temp = SiS_GetReg1 (SiS_P3d4, 0x31);
-		temp = temp & 0x01;
-		if (temp) {
-			temp1 = SiS_GetReg1 (SiS_P3d4, 0x38);
-			temp1 = temp1 & 0x40;
-			if (temp1) {
-				SiS_SetReg1 (SiS_Part3Port, 0x13, 0xFA);
-				SiS_SetReg1 (SiS_Part3Port, 0x14, 0xC8);
-				SiS_SetReg1 (SiS_Part3Port, 0x3D, 0xA8);
-			}
-		}
-	}
-	/*end add */
-#endif
-	if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
-		tempdi = SiS_HiTVGroup3Data;
-		if (SiS_SetFlag & TVSimuMode) {
-			tempdi = SiS_HiTVGroup3Simu;
-			if (!(modeflag & Charx8Dot)) {
-				tempdi = SiS_HiTVGroup3Text;
-			}
-		}
-		for (i = 0; i <= 0x3E; i++) {
-			SiS_SetReg1 (SiS_Part3Port, i, tempdi[i]);
-		}
-	}
-	return;
+  if(SiS_BridgeIsOn(BaseAddr)==0) 
+  {
+    flag=SiS_GetReg1(SiS_Part1Port,0x0);
+    if(HwDeviceExtension->jChipType < SIS_315H) {
+      /* 300 series */
+      if(flag&0x0a0) return 1;
+      else	     return 0;
+    } else {
+      /* 310 series */
+      if(flag&0x050) return 1;
+      else           return 0;
+    }
+  }
+  return 0;
 }
 
-void
-SiS_SetGroup4 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
-	       USHORT ModeIdIndex, USHORT RefreshRateTableIndex,
-	       PSIS_HW_DEVICE_INFO HwDeviceExtension)
+BOOLEAN
+SiS_BridgeInSlave()
 {
-	USHORT tempax, tempcx, tempbx, modeflag, temp, temp2, push1;
-	ULONG tempebx, tempeax, templong;
-
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ResInfo */
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+Ext_ResInfo */
-	}
-	temp = SiS_RVBHCFACT;
-	SiS_SetReg1 (SiS_Part4Port, 0x13, temp);
+  USHORT flag1;
 
-	tempbx = SiS_RVBHCMAX;
-	temp = tempbx & 0x00FF;
-	SiS_SetReg1 (SiS_Part4Port, 0x14, temp);
-	temp2 = ((tempbx & 0xFF00) >> 8) << 7;
-
-	tempcx = SiS_VGAHT - 1;
-	temp = tempcx & 0x00FF;
-	SiS_SetReg1 (SiS_Part4Port, 0x16, temp);
-	temp = ((tempcx & 0xFF00) >> 8) << 3;
-	temp2 = temp | temp2;
-
-	tempcx = SiS_VGAVT - 1;
-	if (!(SiS_VBInfo & SetCRT2ToTV)) {
-		tempcx = tempcx - 5;
-	}
-	temp = tempcx & 0x00FF;
-	SiS_SetReg1 (SiS_Part4Port, 0x17, temp);
-	temp = temp2 | ((tempcx & 0xFF00) >> 8);
-	SiS_SetReg1 (SiS_Part4Port, 0x15, temp);
-
-	tempcx = SiS_VBInfo;
-	tempbx = SiS_VGAHDE;
-	if (modeflag & HalfDCLK) {
-		tempbx = tempbx >> 1;
-	}
-	if (tempcx & SetCRT2ToHiVisionTV) {
-		temp = 0xA0;
-		if (tempbx != 1024) {
-			temp = 0xC0;
-			if (tempbx != 1280)
-				temp = 0;
-		}
-	} else if ((tempcx & SetCRT2ToTV) && (SiS_VGAHDE == 1024)) {	/*301b */
-		temp = 0xA0;
-	} else {
-		temp = 0x80;
-		if (SiS_VBInfo & SetCRT2ToLCD) {
-			temp = 0;
-			if (tempbx > 800)
-				temp = 0x60;
-		}
-	}
-	if (SiS_LCDResInfo != Panel1280x1024)
-		temp = temp | 0x0A;
-	SiS_SetRegANDOR (SiS_Part4Port, 0x0E, ~0xEF, temp);
-
-	tempebx = SiS_VDE;
-	if (tempcx & SetCRT2ToHiVisionTV) {
-		/* if(!(tempax&0xE000)) tempbx=tempbx>>1; */
-		if (!(temp & 0xE000))
-			tempbx = tempbx >> 1;	/* alan ???? */
+  flag1=SiS_GetReg1(SiS_P3d4,0x31);
+  if(flag1&(SetInSlaveMode>>8)) return 1;
+  else  return 0;
+}
 
-	}
+BOOLEAN
+SiS_GetLCDResInfo301(ULONG ROMAddr,USHORT SiS_P3d4,
+                     USHORT ModeNo,USHORT ModeIdIndex)
+{
+  USHORT temp,modeflag,resinfo=0;
 
-	tempcx = SiS_RVBHRS;
-	temp = tempcx & 0x00FF;
-	SiS_SetReg1 (SiS_Part4Port, 0x18, temp);
-
-	tempebx = tempebx;
-	tempeax = SiS_VGAVDE;
-	tempcx = tempcx | 0x04000;
-/*tempeax=tempeax-tempebx;  */
-	if (tempeax <= tempebx) {
-		tempcx = ((tempcx & 0xFF00) ^ 0x4000) | (tempcx & 0x00ff);
-		tempeax = SiS_VGAVDE;
-	}
+  SiS_LCDResInfo=0;
+  SiS_LCDTypeInfo=0;
+  SiS_LCDInfo=0;
+
+  if (ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;  	/* si+St_ModeFlag  */
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+    	resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO; 	/*si+Ext_ResInfo*/
+  }
+
+  if(!(SiS_VBInfo&(SetCRT2ToLCD|SetCRT2ToLCDA))){
+    	return 0;
+  }
+  if(!(SiS_VBInfo&(SetSimuScanMode|SwitchToCRT2))) {
+    	return 0;
+  }
+  temp=SiS_GetReg1(SiS_P3d4,0x36);
+  /*fstn*/
+  if(SiS_IF_DEF_FSTN){
+   	temp=0x27;
+   	SiS_SetReg1(SiS_P3d4,0x36,temp);
+  } 
+  SiS_LCDTypeInfo=temp>>4;
+  SiS_LCDResInfo=temp&0x0F;
+  if(SiS_IF_DEF_LVDS==0) {
+    	if(SiS_LCDResInfo<Panel1024x768) SiS_LCDResInfo=Panel1024x768;
+  } else {
+    	if(SiS_LCDResInfo<Panel800x600) SiS_LCDResInfo=Panel800x600;
+  }
+#if 0
+  /* TW: No 1600x1200 panels? Don't think so... */
+  if(SiS_LCDResInfo>Panel640x480) SiS_LCDResInfo=Panel1024x768;
+#endif
+  if(SiS_LCDResInfo>Panel1600x1200) SiS_LCDResInfo=Panel1024x768;
+  /*fstn*/
+  if(SiS_IF_DEF_FSTN){
+       	SiS_LCDResInfo=Panel320x480;
+  }
+  temp=SiS_GetReg1(SiS_P3d4,0x37);
+  if(SiS_IF_DEF_FSTN){
+      	temp=0x04;
+      	SiS_SetReg1(SiS_P3d4,0x37,temp);
+  }
+  SiS_LCDInfo=temp;
+
+#ifdef LINUX_KERNEL
+  printk(KERN_INFO "sisfb: (LCDInfo = 0x%x LCDResInfo = 0x%x LCDTypeInfo = 0x%x)\n",
+                   SiS_LCDInfo, SiS_LCDResInfo, SiS_LCDTypeInfo);
+#endif
+#ifdef LINUX_XF86
+  xf86DrvMsg(0, X_INFO, "(init301.c: LCDInfo = 0x%x LCDResInfo = 0x%x LCDTypeInfo = 0x%x)\n",
+			SiS_LCDInfo, SiS_LCDResInfo, SiS_LCDTypeInfo);
+#endif
 
-	else {
-		tempeax = tempeax - tempebx;
-	}
+  if(SiS_IF_DEF_LVDS==1){
+     if(modeflag&HalfDCLK){
+        if(SiS_IF_DEF_TRUMPION==0){
+            if(!(SiS_LCDInfo&LCDNonExpanding)){
+               if(ModeNo>0x13) {
+                  if(SiS_LCDResInfo==Panel1024x768){
+                      if(resinfo==4){                                /* 512x384  */
+                           SiS_SetFlag=SiS_SetFlag|EnableLVDSDDA;
+                      }
+                  } else {
+                      if(SiS_LCDResInfo==Panel800x600){
+                           if(resinfo==3){                             /*400x300  */
+                                SiS_SetFlag=SiS_SetFlag|EnableLVDSDDA;
+                           }
+                      }
+                  }
+               }
+           } else { /* NonExpanding */
+              SiS_SetFlag=SiS_SetFlag|EnableLVDSDDA;
+           }
+        } else { /* TRUMPION */
+          SiS_SetFlag=SiS_SetFlag|EnableLVDSDDA;
+        }
+     }
+  }
 
-	push1 = tempcx;
-	templong = (tempeax * 256 * 1024) % tempebx;
-	tempeax = (tempeax * 256 * 1024) / tempebx;
-	tempebx = tempeax;
-	if (templong != 0) {
-		tempebx++;
-	}
-	tempcx = push1;
-	temp = (USHORT) (tempebx & 0x000000FF);
-	SiS_SetReg1 (SiS_Part4Port, 0x1B, temp);
-	temp = (USHORT) ((tempebx & 0x0000FF00) >> 8);
-	SiS_SetReg1 (SiS_Part4Port, 0x1A, temp);
-	tempbx = (USHORT) (tempebx >> 16);
-	temp = tempbx & 0x00FF;
-	temp = temp << 4;
-	temp = temp | ((tempcx & 0xFF00) >> 8);
-	SiS_SetReg1 (SiS_Part4Port, 0x19, temp);
-	/*301b */
-
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) {
-		temp = 0x0028;
-		SiS_SetReg1 (SiS_Part4Port, 0x1C, temp);
-		tempax = SiS_VGAHDE;
-		if (modeflag & HalfDCLK) {
-			tempax = tempax >> 1;
-		}
-		if (SiS_VBInfo & (SetCRT2ToLCD)) {
-			if (tempax > 800)
-				tempax = tempax - 800;
-		}
-		tempax = tempax - 1;
-
-		if (SiS_VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
-			if (SiS_VGAHDE > 800) {
-				if (SiS_VGAHDE == 1024)
-					tempax = (tempax * 25 / 32) - 1;
-				else
-					tempax = (tempax * 20 / 32) - 1;
-			}
-		}
-		temp = (tempax & 0xFF00) >> 8;
-		temp = ((temp & 0x0003) << 4);
-		SiS_SetReg1 (SiS_Part4Port, 0x1E, temp);
-		temp = (tempax & 0x00FF);
-		SiS_SetReg1 (SiS_Part4Port, 0x1D, temp);
-
-		if (SiS_VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
-			if (SiS_VGAHDE > 800) {
-				SiS_SetRegOR (SiS_Part4Port, 0x1E, 0x08);
-			}
-		}
-		temp = 0x0036;
-		if (SiS_VBInfo & SetCRT2ToTV) {
-			temp = temp | 0x0001;
-		}
-		SiS_SetRegANDOR (SiS_Part4Port, 0x1F, 0x00C0, temp);
-		tempbx = (SiS_HT / 2) - 2;
-		temp = ((tempbx & 0x0700) >> 8) << 3;
-		SiS_SetRegANDOR (SiS_Part4Port, 0x21, 0x00C0, temp);
-		temp = tempbx & 0x00FF;
-		SiS_SetReg1 (SiS_Part4Port, 0x22, temp);
-	}
-/*end 301b*/
-	SiS_SetCRT2VCLK (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
-			 RefreshRateTableIndex, HwDeviceExtension);
+  if(SiS_VBInfo&SetInSlaveMode){
+    	if(SiS_VBInfo&SetNotSimuMode){
+      		SiS_SetFlag=SiS_SetFlag|LCDVESATiming;
+    	}
+  } else {
+    	SiS_SetFlag=SiS_SetFlag|LCDVESATiming;
+  }
+  return 1;
+}
+
+void
+SiS_PresetScratchregister(USHORT SiS_P3d4,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+  /*SiS_SetReg1(SiS_P3d4,0x30,0x21);  */
+  /*SiS_SetReg1(SiS_P3d4,0x31,0x41);  */
+  /*SiS_SetReg1(SiS_P3d4,0x32,0x28);  */
+  /*SiS_SetReg1(SiS_P3d4,0x33,0x22);  */
+  /*SiS_SetReg1(SiS_P3d4,0x35,0x43);  */
+  /*SiS_SetReg1(SiS_P3d4,0x36,0x01);  */
+  /*SiS_SetReg1(SiS_P3d4,0x37,0x00);  */
+}
+
+void
+SiS_LongWait()
+{
+  USHORT i;
+
+  i=SiS_GetReg1(SiS_P3c4,0x1F);
+  if(!(i&0xC0)) {
+
+    for(i=0; i<0xFFFF; i++) {
+       if(!(SiS_GetReg2(SiS_P3da) & 0x08))
+         break;
+    }
+    for(i=0; i<0xFFFF; i++) {
+       if((SiS_GetReg2(SiS_P3da) & 0x08))
+         break;
+    }
+  }
+}
+
+void
+SiS_VBLongWait()
+{
+  USHORT tempal,temp,i,j;
+
+  if(!(SiS_VBInfo&SetCRT2ToTV)) {
+    temp=0;
+    for(i=0;i<3;i++) {
+      for(j=0;j<100;j++) {
+        tempal=SiS_GetReg2(SiS_P3da);
+        if(temp&0x01) {        /* VBWaitMode2  */
+          if((tempal&0x08)) {
+            continue;
+          }
+          if(!(tempal&0x08)) {
+            break;
+          }
+        } else {                 /* VBWaitMode1  */
+          if(!(tempal&0x08)) {
+            continue;
+          }
+          if((tempal&0x08)) {
+            break;
+          }
+        }
+      }
+      temp=temp^0x01;
+    }
+  } else {
+    SiS_LongWait();
+  }
+  return;
 }
 
-void
-SiS_SetCRT2VCLK (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
-		 USHORT ModeIdIndex, USHORT RefreshRateTableIndex,
-		 PSIS_HW_DEVICE_INFO HwDeviceExtension)
-{
-	USHORT vclkindex;
-	USHORT tempah, temp1;
-
-	vclkindex =
-	    SiS_GetVCLK2Ptr (ROMAddr, ModeNo, ModeIdIndex,
-			     RefreshRateTableIndex, HwDeviceExtension);
-	/*301b */
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) {
-		tempah = SiS_VBVCLKData[vclkindex].Part4_A;
-		SiS_SetReg1 (SiS_Part4Port, 0x0A, tempah);
-		tempah = SiS_VBVCLKData[vclkindex].Part4_B;
-		SiS_SetReg1 (SiS_Part4Port, 0x0B, tempah);
-	} else {
-		SiS_SetReg1 (SiS_Part4Port, 0x0A, 0x01);
-		tempah = SiS_VBVCLKData[vclkindex].Part4_B;
-		SiS_SetReg1 (SiS_Part4Port, 0x0B, tempah);
-		tempah = SiS_VBVCLKData[vclkindex].Part4_A;
-		SiS_SetReg1 (SiS_Part4Port, 0x0A, tempah);
+BOOLEAN
+SiS_WaitVBRetrace(USHORT  BaseAddr)
+{
+  USHORT temp;
 
-	}
-	SiS_SetReg1 (SiS_Part4Port, 0x12, 0x00);
-	tempah = 0x08;
-	if (SiS_VBInfo & SetCRT2ToRAMDAC) {
-		tempah = tempah | 0x020;
-	}
-	temp1 = SiS_GetReg1 (SiS_Part4Port, 0x12);
-	tempah = tempah | temp1;
-	SiS_SetReg1 (SiS_Part4Port, 0x12, tempah);
-}
+return 0;
 
-USHORT
-SiS_GetVCLK2Ptr (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		 USHORT RefreshRateTableIndex,
-		 PSIS_HW_DEVICE_INFO HwDeviceExtension)
-{
-	USHORT tempbx;
-#ifdef CONFIG_FB_SIS_300
-	USHORT LCDXlat1VCLK[4] = { VCLK65, VCLK65, VCLK65, VCLK65 };
-	USHORT LCDXlat2VCLK[4] = { VCLK108_2, VCLK108_2, VCLK108_2, VCLK108_2 };
-	USHORT LVDSXlat2VCLK[4] = { VCLK65, VCLK65, VCLK65, VCLK65 };
-	USHORT LVDSXlat3VCLK[4] = { VCLK65, VCLK65, VCLK65, VCLK65 };
-#else				/* SIS315H */
-	USHORT LCDXlat1VCLK[4] =
-	    { VCLK65 + 2, VCLK65 + 2, VCLK65 + 2, VCLK65 + 2 };
-	USHORT LCDXlat2VCLK[4] =
-	    { VCLK108_2 + 5, VCLK108_2 + 5, VCLK108_2 + 5, VCLK108_2 + 5 };
-	USHORT LVDSXlat2VCLK[4] =
-	    { VCLK65 + 2, VCLK65 + 2, VCLK65 + 2, VCLK65 + 2 };
-	USHORT LVDSXlat3VCLK[4] =
-	    { VCLK65 + 2, VCLK65 + 2, VCLK65 + 2, VCLK65 + 2 };
-#endif
-	USHORT LVDSXlat1VCLK[4] = { VCLK40, VCLK40, VCLK40, VCLK40 };
-	USHORT CRT2Index, VCLKIndex;
-	USHORT modeflag, resinfo;
-	UCHAR *CHTVVCLKPtr = NULL;
-
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ResInfo */
-		resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
-		CRT2Index = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+Ext_ResInfo */
-		resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
-		CRT2Index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
-	}
+  temp=SiS_GetReg1(SiS_Part1Port,0x00); /* FUNCTION CTRL */
+  if(!(temp&0x80)){
+    return 0;
+  }
 
-	if (SiS_IF_DEF_LVDS == 0) {
-		CRT2Index = CRT2Index >> 6;	/*  for LCD */
-		if ((SiS_VBInfo & SetCRT2ToLCD) || (SiS_VBInfo & SetCRT2ToLCDA)) {	/*301b */
-			if (SiS_LCDResInfo != Panel1024x768) {
-				VCLKIndex = LCDXlat2VCLK[CRT2Index];
-			} else {
-				VCLKIndex = LCDXlat1VCLK[CRT2Index];
-			}
-		} else {	/* for TV */
-			if (SiS_VBInfo & SetCRT2ToTV) {
-				if (SiS_IF_DEF_HiVision == 1) {
-					if (SiS_SetFlag & RPLLDIV2XO) {
-						VCLKIndex = HiTVVCLKDIV2;
-						if (HwDeviceExtension->
-						    jChipType >= SIS_315H) {	/* 310 series */
-/*            VCLKIndex += 11;    for chip310  0x2E */
-							VCLKIndex += 25;	/* for chip315  */
-						}
-					} else {
-						VCLKIndex = HiTVVCLK;
-						if (HwDeviceExtension->
-						    jChipType >= SIS_315H) {	/* 310 series */
-/*            VCLKIndex += 11;    for chip310  0x2E */
-							VCLKIndex += 25;	/* for chip315  */
-						}
-					}
-					if (SiS_SetFlag & TVSimuMode) {
-						if (modeflag & Charx8Dot) {
-							VCLKIndex =
-							    HiTVSimuVCLK;
-							if (HwDeviceExtension->
-							    jChipType >= SIS_315H) {	/* 310 series */
-/*            VCLKIndex += 11;    for chip310  0x2E */
-								VCLKIndex += 25;	/* for chip315  */
-							}
-						} else {
-							VCLKIndex =
-							    HiTVTextVCLK;
-							if (HwDeviceExtension->
-							    jChipType >= SIS_315H) {	/* 310 series */
-/*            VCLKIndex += 11;    for chip310  0x2E */
-								VCLKIndex += 25;	/* for chip315  */
-							}
-						}
-					}
-				} else {
-					if (SiS_VBInfo & SetCRT2ToTV) {
-						if (SiS_SetFlag & RPLLDIV2XO) {
-							VCLKIndex = TVVCLKDIV2;
-							if (HwDeviceExtension->
-							    jChipType >= SIS_315H) {	/* 310 series */
-/*            VCLKIndex += 11;    for chip310  0x2E */
-								VCLKIndex += 25;	/* for chip315  */
-							}
-						} else {
-							VCLKIndex = TVVCLK;
-							if (HwDeviceExtension->
-							    jChipType >= SIS_315H) {	/* 310 series */
-/*            VCLKIndex += 11;    for chip310  0x2E */
-								VCLKIndex += 25;	/* for chip315  */
-							}
-						}
-					}
-				}
-			} else {	/* for CRT2 */
-				VCLKIndex =
-				    (UCHAR) SiS_GetReg2 ((USHORT) (SiS_P3ca + 0x02));	/*  Port 3cch */
-				VCLKIndex = ((VCLKIndex >> 2) & 0x03);
-				if (ModeNo > 0x13) {
-					VCLKIndex =
-					    SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;	/* di+Ext_CRTVCLK */
-					VCLKIndex = VCLKIndex & 0x3f;
-				}
-			}
-		}
-	} else {		/*   LVDS  */
-		if (ModeNo <= 0x13)
-			VCLKIndex = CRT2Index;
-		else
-			VCLKIndex = CRT2Index;
-		if (SiS_IF_DEF_CH7005 == 1) {
-			if (!(SiS_VBInfo & SetCRT2ToLCD)) {
-				VCLKIndex = VCLKIndex & 0x1f;
-				tempbx = 0;
-				if (SiS_VBInfo & SetPALTV)
-					tempbx = tempbx + 2;
-				if (SiS_VBInfo & SetCHTVOverScan)
-					tempbx = tempbx + 1;
-				switch (tempbx) {
-				case 0:
-					CHTVVCLKPtr = SiS_CHTVVCLKUNTSC;
-					break;
-				case 1:
-					CHTVVCLKPtr = SiS_CHTVVCLKONTSC;
-					break;
-				case 2:
-					CHTVVCLKPtr = SiS_CHTVVCLKUPAL;
-					break;
-				case 3:
-					CHTVVCLKPtr = SiS_CHTVVCLKOPAL;
-					break;
-				}
-				VCLKIndex = CHTVVCLKPtr[VCLKIndex];
-			}
-		} else {
-			VCLKIndex = VCLKIndex >> 6;
-			if (SiS_LCDResInfo == Panel800x600)
-				VCLKIndex = LVDSXlat1VCLK[VCLKIndex];
-			else if (SiS_LCDResInfo == Panel1024x768)
-				VCLKIndex = LVDSXlat2VCLK[VCLKIndex];
-			else
-				VCLKIndex = LVDSXlat3VCLK[VCLKIndex];
-		}
-	}
-/*VCLKIndex=VCLKIndex&0x3F;   */
-	if (HwDeviceExtension->jChipType < SIS_315H) {	/* for300 serial */
-		VCLKIndex = VCLKIndex & 0x3F;
-	}
-	return (VCLKIndex);
+  for(temp=0;temp==0;){
+     temp=SiS_GetReg1(SiS_Part1Port,0x25);
+     temp=temp&0x01;
+  }
+  for(;temp>0;){
+     temp=SiS_GetReg1(SiS_Part1Port,0x25);
+     temp=temp&0x01;
+  }
+  return 1;
 }
 
 void
-SiS_SetGroup5 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
-	       USHORT ModeIdIndex)
+SiS_SetRegANDOR(USHORT Port,USHORT Index,USHORT DataAND,USHORT DataOR)
 {
-	USHORT Pindex, Pdata;
+  USHORT temp;
 
-	Pindex = SiS_Part5Port;
-	Pdata = SiS_Part5Port + 1;
-	if (SiS_ModeType == ModeVGA) {
-		if (!
-		    (SiS_VBInfo &
-		     (SetInSlaveMode | LoadDACFlag | CRT2DisplayFlag))) {
-			SiS_EnableCRT2 ();
-/*    LoadDAC2(ROMAddr,SiS_Part5Port,ModeNo,ModeIdIndex);  */
-		}
-	}
-	return;
+  temp=SiS_GetReg1(Port,Index);     /* SiS_Part1Port index 02 */
+  temp=(temp&(DataAND))|DataOR;
+  SiS_SetReg1(Port,Index,temp);
 }
 
 void
-SiS_LoadDAC2 (ULONG ROMAddr, USHORT SiS_Part5Port, USHORT ModeNo,
-	      USHORT ModeIdIndex)
+SiS_SetRegAND(USHORT Port,USHORT Index,USHORT DataAND)
 {
-	USHORT data, data2;
-	USHORT time, i, j, k;
-	USHORT m, n, o;
-	USHORT si, di, bx, dl;
-	USHORT al, ah, dh;
-	USHORT *table = 0;
-	USHORT Pindex, Pdata, modeflag;
-
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ResInfo */
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+Ext_ResInfo */
-	}
-
-	Pindex = SiS_Part5Port;
-	Pdata = SiS_Part5Port + 1;
-	data = modeflag & DACInfoFlag;
-	time = 64;
-	if (data == 0x00)
-		table = SiS_MDA_DAC;
-	if (data == 0x08)
-		table = SiS_CGA_DAC;
-	if (data == 0x10)
-		table = SiS_EGA_DAC;
-	if (data == 0x18) {
-		time = 256;
-		table = SiS_VGA_DAC;
-	}
-	if (time == 256)
-		j = 16;
-	else
-		j = time;
-
-	SiS_SetReg3 (Pindex, 0x00);
-
-	for (i = 0; i < j; i++) {
-		data = table[i];
-		for (k = 0; k < 3; k++) {
-			data2 = 0;
-			if (data & 0x01)
-				data2 = 0x2A;
-			if (data & 0x02)
-				data2 = data2 + 0x15;
-			SiS_SetReg3 (Pdata, data2);
-			data = data >> 2;
-		}
-	}
+  USHORT temp;
 
-	if (time == 256) {
-		for (i = 16; i < 32; i++) {
-			data = table[i];
-			for (k = 0; k < 3; k++)
-				SiS_SetReg3 (Pdata, data);
-		}
-		si = 32;
-		for (m = 0; m < 9; m++) {
-			di = si;
-			bx = si + 0x04;
-			dl = 0;
-			for (n = 0; n < 3; n++) {
-				for (o = 0; o < 5; o++) {
-					dh = table[si];
-					ah = table[di];
-					al = table[bx];
-					si++;
-					SiS_WriteDAC2 (Pdata, dl, ah, al, dh);
-				}	/* for 5 */
-				si = si - 2;
-				for (o = 0; o < 3; o++) {
-					dh = table[bx];
-					ah = table[di];
-					al = table[si];
-					si--;
-					SiS_WriteDAC2 (Pdata, dl, ah, al, dh);
-				}	/* for 3 */
-				dl++;
-			}	/* for 3 */
-			si = si + 5;
-		}		/* for 9 */
-	}
+  temp=SiS_GetReg1(Port,Index);     /* SiS_Part1Port index 02 */
+  temp=temp&DataAND;
+  SiS_SetReg1(Port,Index,temp);
 }
 
-void
-SiS_WriteDAC2 (USHORT Pdata, USHORT dl, USHORT ah, USHORT al, USHORT dh)
+void SiS_SetRegOR(USHORT Port,USHORT Index,USHORT DataOR)
 {
-	USHORT temp;
-	USHORT bh, bl;
+  USHORT temp;
 
-	bh = ah;
-	bl = al;
-	if (dl != 0) {
-		temp = bh;
-		bh = dh;
-		dh = temp;
-		if (dl == 1) {
-			temp = bl;
-			bl = dh;
-			dh = temp;
-		} else {
-			temp = bl;
-			bl = bh;
-			bh = temp;
-		}
-	}
-	SiS_SetReg3 (Pdata, (USHORT) dh);
-	SiS_SetReg3 (Pdata, (USHORT) bh);
-	SiS_SetReg3 (Pdata, (USHORT) bl);
+  temp=SiS_GetReg1(Port,Index);     /* SiS_Part1Port index 02 */
+  temp=temp|DataOR;
+  SiS_SetReg1(Port,Index,temp);
 }
 
 void
-SiS_SetCHTVReg (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		USHORT RefreshRateTableIndex)
+SiS_SetGroup2(USHORT BaseAddr,ULONG ROMAddr, USHORT ModeNo,
+                   USHORT ModeIdIndex,USHORT RefreshRateTableIndex,
+		   PSIS_HW_DEVICE_INFO HwDeviceExtension)
 {
-	USHORT temp, tempbx, tempcl;
-/*  USHORT CRT2CRTC; */
-	USHORT TVType, resindex;
-	SiS_CHTVRegDataStruct *CHTVRegData = NULL;
+  USHORT i,j,tempax,tempbx,tempcx,temp,temp3;
+  USHORT push1,push2,temp1;
+  UCHAR *PhasePoint;
+  UCHAR *TimingPoint;
+  USHORT  modeflag,resinfo,crt2crtc,resindex,xres;
+  ULONG longtemp,tempeax,tempebx,temp2,tempecx;
+  USHORT  SiS_RY1COE=0,SiS_RY2COE=0,SiS_RY3COE=0,SiS_RY4COE=0;
+  USHORT  SiS_RY5COE=0,SiS_RY6COE=0,SiS_RY7COE=0;
+
+  if(ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+    	resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+    	crt2crtc = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
+    	resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+    	crt2crtc = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+  }
+
+  tempcx=SiS_VBInfo;
+  tempax=(tempcx&0x00FF)<<8;
+  tempbx=(tempcx&0x00FF)|((tempcx&0x00FF)<<8);
+  tempbx=tempbx&0x0410;
+  temp=(tempax&0x0800)>>8;
+  temp=temp>>1;
+  temp=temp|(((tempbx&0xFF00)>>8)<<1);
+  temp=temp|((tempbx&0x00FF)>>3);
+  temp=temp^0x0C;
+
+  PhasePoint = SiS_PALPhase;
+  if(SiS_VBInfo&SetCRT2ToHiVisionTV) {        /* PALPhase */
+    temp=temp^0x01;
+    if(SiS_VBInfo&SetInSlaveMode) {
+      TimingPoint = SiS_HiTVSt2Timing;
+      if(SiS_SetFlag&TVSimuMode) {
+        if(modeflag&Charx8Dot) TimingPoint = SiS_HiTVSt1Timing;
+        else TimingPoint = SiS_HiTVTextTiming;
+      }
+    } else TimingPoint = SiS_HiTVExtTiming;
+  } else {
+    if(SiS_VBInfo&SetPALTV){
+      if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+         PhasePoint = SiS_PALPhase2;              /* PALPhase */
+      else 
+         PhasePoint = SiS_PALPhase;  
+     
+         TimingPoint = SiS_PALTiming;
+    } else {
+        temp=temp|0x10;
+        if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+        	PhasePoint = SiS_NTSCPhase2;             /* PALPhase */
+        else
+        	PhasePoint = SiS_NTSCPhase;
+      
+        TimingPoint = SiS_NTSCTiming;
+    }
+  }
+  SiS_SetReg1(SiS_Part2Port,0x00,temp);
+
+#ifdef SIS300
+  /*add PALMN*/
+  if((HwDeviceExtension->jChipType==SIS_630)||
+     (HwDeviceExtension->jChipType==SIS_730)) {
+     	if(SiS_VBInfo&SetCRT2ToTV) {
+             temp=SiS_GetReg1(SiS_P3d4,0x31);   
+             temp=temp&0x01; 
+             if(temp) {
+                  temp1=SiS_GetReg1(SiS_P3d4,0x35);        
+                  temp1=temp1&0x40; 
+                  if(temp1)
+                     	PhasePoint = SiS_PALMPhase;
+                  temp1=SiS_GetReg1(SiS_P3d4,0x35);        
+                  temp1=temp1&0x80;
+                  if(temp1)
+                     	PhasePoint = SiS_PALNPhase;
+             }
+        }
+  }
+  /*end add*/
+#endif
 
-	if (ModeNo <= 0x13) {
-		tempcl = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
-	} else {
-		tempcl = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
-	}
-	TVType = 0;
-	if (SiS_VBInfo & SetPALTV)
-		TVType = TVType + 2;
-	if (SiS_VBInfo & SetCHTVOverScan)
-		TVType = TVType + 1;
-	switch (TVType) {
-	case 0:
-		CHTVRegData = SiS_CHTVReg_UNTSC;
-		break;
-	case 1:
-		CHTVRegData = SiS_CHTVReg_ONTSC;
-		break;
-	case 2:
-		CHTVRegData = SiS_CHTVReg_UPAL;
-		break;
-	case 3:
-		CHTVRegData = SiS_CHTVReg_OPAL;
-		break;
-	}
-	resindex = tempcl & 0x3F;
+#ifdef SIS315H
+  /*add PALMN*/
+  if ( (HwDeviceExtension->jChipType==SIS_315H)||
+       (HwDeviceExtension->jChipType==SIS_315PRO)||
+       (HwDeviceExtension->jChipType==SIS_550) ||
+       (HwDeviceExtension->jChipType==SIS_640) ||
+       (HwDeviceExtension->jChipType==SIS_740) ||
+       (HwDeviceExtension->jChipType==SIS_650)) {
+           if(SiS_VBInfo&SetCRT2ToTV) {
+              temp=SiS_GetReg1(SiS_P3d4,0x31);
+              temp=temp&0x01;
+              if(temp) {
+                  temp1=SiS_GetReg1(SiS_P3d4,0x38);
+                  temp1=temp1&0x40;
+                  if(temp1)
+                     PhasePoint = SiS_PALMPhase;
+                  temp1=SiS_GetReg1(SiS_P3d4,0x38);
+                  temp1=temp1&0x80;
+                  if(temp1)
+                     PhasePoint = SiS_PALNPhase;
+              }
+           }
+  }
+  /*end add*/
+#endif
 
-	if (SiS_VBInfo & SetPALTV) {
-		SiS_SetCH7005 (0x4304);
-		SiS_SetCH7005 (0x6909);
-	} else {
-		SiS_SetCH7005 (0x0304);
-		SiS_SetCH7005 (0x7109);
-	}
+  for(i=0x31,j=0;i<=0x34;i++,j++){
+     SiS_SetReg1(SiS_Part2Port,i,PhasePoint[j]);
+  }
+  for(i=0x01,j=0;i<=0x2D;i++,j++){
+     SiS_SetReg1(SiS_Part2Port,i,TimingPoint[j]);
+  }
+  for(i=0x39;i<=0x45;i++,j++){
+     SiS_SetReg1(SiS_Part2Port,i,TimingPoint[j]);      /* di->temp2[j] */
+  }
+  if(SiS_VBInfo&SetCRT2ToTV) {
+    SiS_SetRegANDOR(SiS_Part2Port,0x3A,0x1F,0x00);
+  }
+  temp=SiS_NewFlickerMode;
+  SiS_SetRegANDOR(SiS_Part2Port,0x0A,0xFF,temp);
+
+  SiS_SetReg1(SiS_Part2Port,0x35,0x00); /*301b*/
+  SiS_SetReg1(SiS_Part2Port,0x36,0x00);
+  SiS_SetReg1(SiS_Part2Port,0x37,0x00);
+  SiS_SetReg1(SiS_Part2Port,0x38,SiS_RY1COE);
+  SiS_SetReg1(SiS_Part2Port,0x48,SiS_RY2COE);
+  SiS_SetReg1(SiS_Part2Port,0x49,SiS_RY3COE);
+  SiS_SetReg1(SiS_Part2Port,0x4a,SiS_RY4COE);
+
+  /*add to change 630+301b filter*/
+  resindex=SiS_GetResInfo(ROMAddr,ModeNo,ModeIdIndex);
+  if(ModeNo<=0x13) {
+      xres=SiS_StResInfo[resindex].HTotal;
+  } else {
+      xres=SiS_ModeResInfo[resindex].HTotal;                         /* xres->ax */
+  }
+  if(xres==640){SiS_RY1COE=0xFF;SiS_RY2COE=0x03;SiS_RY3COE=0x02;SiS_RY4COE=0xF6;
+                         SiS_RY5COE=0xFC;SiS_RY6COE=0x27;SiS_RY7COE=0x46;}
+  if(xres==800){SiS_RY1COE=0x01;SiS_RY2COE=0x01;SiS_RY3COE=0xFC;SiS_RY4COE=0xF8;
+                         SiS_RY5COE=0x08;SiS_RY6COE=0x26;SiS_RY7COE=0x38;}                        
+  if(xres==1024){SiS_RY1COE=0xFF;SiS_RY2COE=0xFF;SiS_RY3COE=0xFC;SiS_RY4COE=0x00;
+                         SiS_RY5COE=0x0F;SiS_RY6COE=0x22;SiS_RY7COE=0x28;}
+  if(xres==720){SiS_RY1COE=0x01;SiS_RY2COE=0x02;SiS_RY3COE=0xFE;SiS_RY4COE=0xF7;
+                         SiS_RY5COE=0x03;SiS_RY6COE=0x27;SiS_RY7COE=0x3c;}
+  SiS_SetReg1(SiS_Part2Port,0x35,SiS_RY1COE); /*301b*/
+  SiS_SetReg1(SiS_Part2Port,0x36,SiS_RY2COE);
+  SiS_SetReg1(SiS_Part2Port,0x37,SiS_RY3COE);
+  SiS_SetReg1(SiS_Part2Port,0x38,SiS_RY4COE);
+  SiS_SetReg1(SiS_Part2Port,0x48,SiS_RY5COE);
+  SiS_SetReg1(SiS_Part2Port,0x49,SiS_RY6COE);
+  SiS_SetReg1(SiS_Part2Port,0x4a,SiS_RY7COE);
+  /*end add*/
+
+  if(SiS_VBInfo&SetCRT2ToHiVisionTV) tempax=950;
+  else {
+    if(SiS_VBInfo&SetPALTV) tempax=520;
+    else tempax=440;
+  }
+  if(SiS_VDE<=tempax) {
+    tempax=tempax-SiS_VDE;
+    tempax=tempax>>2;
+    tempax=(tempax&0x00FF)|((tempax&0x00FF)<<8);
+    push1=tempax;
+    temp=(tempax&0xFF00)>>8;
+    temp=temp+(USHORT)TimingPoint[0];
+    SiS_SetReg1(SiS_Part2Port,0x01,temp);
+    tempax=push1;
+    temp=(tempax&0xFF00)>>8;
+    temp=temp+TimingPoint[1];
+    SiS_SetReg1(SiS_Part2Port,0x02,temp);
+  }
+  /*301b*/
+  if( (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+        && (SiS_VBInfo&SetCRT2ToTV) && (SiS_VGAHDE==1024) ) {
+      if(SiS_VBInfo&SetPALTV) {
+       SiS_SetReg1(SiS_Part2Port,0x01,0x19);
+       SiS_SetReg1(SiS_Part2Port,0x02,0x52);
+      } else {
+       SiS_SetReg1(SiS_Part2Port,0x01,0x0B);
+       SiS_SetReg1(SiS_Part2Port,0x02,0x11);
+      } 
+    }
+    
+  tempcx=SiS_HT-1;
+  /*301b*/
+  if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+     tempcx=tempcx-1;   
+  }
+  temp=tempcx&0x00FF;
+  SiS_SetReg1(SiS_Part2Port,0x1B,temp);
+  temp=(tempcx&0xFF00)>>8;
+  SiS_SetRegANDOR(SiS_Part2Port,0x1D,~0x0F,temp);
+
+  tempcx=SiS_HT>>1;
+  push1=tempcx;                           /* push cx */
+  tempcx=tempcx+7;
+  if(SiS_VBInfo&SetCRT2ToHiVisionTV) {
+    tempcx=tempcx-4;
+  }
+  temp=(tempcx&0x00FF);
+  temp=temp<<4;
+  SiS_SetRegANDOR(SiS_Part2Port,0x22,0x0F,temp);
+
+  tempbx=TimingPoint[j]|((TimingPoint[j+1])<<8);
+  tempbx=tempbx+tempcx;
+  push2=tempbx;
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part2Port,0x24,temp);
+  temp=(tempbx&0xFF00)>>8;
+  temp=temp<<4;
+  SiS_SetRegANDOR(SiS_Part2Port,0x25,0x0F,temp);
+
+  tempbx=push2;
+  tempbx=tempbx+8;
+  if(SiS_VBInfo&SetCRT2ToHiVisionTV) {
+    tempbx=tempbx-4;
+    tempcx=tempbx;
+  }
+  temp=(tempbx&0x00FF)<<4;
+  SiS_SetRegANDOR(SiS_Part2Port,0x29,0x0F,temp);
+
+  j=j+2;
+  tempcx=tempcx+(TimingPoint[j]|((TimingPoint[j+1])<<8));
+  temp=tempcx&0x00FF;
+  SiS_SetReg1(SiS_Part2Port,0x27,temp);
+  temp=((tempcx&0xFF00)>>8)<<4;
+  SiS_SetRegANDOR(SiS_Part2Port,0x28,0x0F,temp);
+
+  tempcx=tempcx+8;
+  if(SiS_VBInfo&SetCRT2ToHiVisionTV) {
+    tempcx=tempcx-4;
+  }
+  temp=tempcx&0xFF;
+  temp=temp<<4;
+  SiS_SetRegANDOR(SiS_Part2Port,0x2A,0x0F,temp);
+
+  tempcx=push1;                                       /* pop cx */
+  j=j+2;
+  temp=TimingPoint[j]|((TimingPoint[j+1])<<8);
+  tempcx=tempcx-temp;
+  temp=tempcx&0x00FF;
+  temp=temp<<4;
+  SiS_SetRegANDOR(SiS_Part2Port,0x2D,0x0F,temp);
+
+  tempcx=tempcx-11;
+  if(!(SiS_VBInfo&SetCRT2ToTV)){
+    tempax=SiS_GetVGAHT2();
+    tempcx=tempax-1;
+  }
+  temp=tempcx&0x00FF;
+  SiS_SetReg1(SiS_Part2Port,0x2E,temp);	/* TW: BIOS 0x48, here 0x3f @@@ */
+
+  tempbx=SiS_VDE;
+  if(SiS_VGAVDE==360) tempbx=746;
+  if(SiS_VGAVDE==375) tempbx=746;
+  if(SiS_VGAVDE==405) tempbx=853;
+  if(SiS_VBInfo&SetCRT2ToTV) {
+    tempbx=tempbx>>1;
+  }
+  tempbx=tempbx-2;
+  temp=tempbx&0x00FF;
+  if(SiS_VBInfo&SetCRT2ToHiVisionTV) {
+    if(SiS_VBInfo&SetInSlaveMode) {
+      if(ModeNo==0x2f) temp=temp+1;
+    }
+  }
+  SiS_SetReg1(SiS_Part2Port,0x2F,temp);
+
+  temp=(tempcx&0xFF00)>>8;
+  temp=temp|(((tempbx&0xFF00)>>8)<<6);
+  if(!(SiS_VBInfo&SetCRT2ToHiVisionTV)) {
+    temp=temp|0x10;
+    if(!(SiS_VBInfo&SetCRT2ToSVIDEO)){
+      temp=temp|0x20;
+    }
+  }
+  SiS_SetReg1(SiS_Part2Port,0x30,temp);  /* TW: BIOS sets 0xb8, here (or somewhere else) 0xb5 */
+
+  /*301b*/
+  if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {      /*tv gatingno*/
+    tempbx=SiS_VDE;
+    if(SiS_VBInfo&SetCRT2ToTV) {
+       tempbx=tempbx>>1;
+    }
+    temp=(((tempbx-3)&0x0300)>>8)<<5;
+    SiS_SetReg1(SiS_Part2Port,0x46,temp);
+    temp=(tempbx-3)&0x00FF;
+    SiS_SetReg1(SiS_Part2Port,0x47,temp);
+  }
+  /*end 301b*/
+
+  tempbx=tempbx&0x00FF;
+  if(!(modeflag&HalfDCLK)){
+    tempcx=SiS_VGAHDE;
+    if(tempcx>=SiS_HDE){
+      tempbx=tempbx|0x2000;
+      tempax=tempax&0x00FF;
+    }
+  }
+  tempcx=0x0101;
+
+  if(SiS_VBInfo&(SetCRT2ToHiVisionTV|SetCRT2ToTV)) { /*301b*/
+    if(SiS_VGAHDE>=1024) {
+      tempcx=0x1920;
+      if(SiS_VGAHDE>=1280) {
+        tempcx=0x1420;
+        tempbx=tempbx&0xDFFF;
+      }
+    }
+  }
+  if(!(tempbx&0x2000)){
+    if(modeflag&HalfDCLK){
+      tempcx=(tempcx&0xFF00)|((tempcx&0x00FF)<<1);
+    }
+    push1=tempbx;
+    tempeax=SiS_VGAHDE;
+    tempebx=(tempcx&0xFF00)>>8;
+    longtemp=tempeax*tempebx;
+    tempecx=tempcx&0x00FF;
+    longtemp=longtemp/tempecx;
+    /*301b*/
+    tempecx=8*1024;
+    if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+     	tempecx=tempecx*8;
+    }
+    longtemp=longtemp*tempecx;
+    tempecx=SiS_HDE;
+    temp2=longtemp%tempecx;
+    tempeax=longtemp/tempecx;
+    if(temp2!=0){
+      tempeax=tempeax+1;
+    }
+    tempax=(USHORT)tempeax;
+    /*301b*/
+    if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+     	tempcx=((tempax&0xFF00)>>5)>>8;
+    }
+    /*end 301b*/
+    tempbx=push1;
+    tempbx=(USHORT) ( ((tempeax&0x0000FF00)&0x1F00)|(tempbx&0x00FF) );
+    tempax=(USHORT) ( ((tempeax&0x000000FF)<<8)|(tempax&0x00FF) );
+    temp=(tempax&0xFF00)>>8;
+  } else {
+    temp=(tempax&0x00FF)>>8;
+  }
+  SiS_SetReg1(SiS_Part2Port,0x44,temp);
+  temp=(tempbx&0xFF00)>>8;
+  SiS_SetRegANDOR(SiS_Part2Port,0x45,~0x03F,temp);
+  /*301b*/
+  if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+       if((tempcx&0x00FF)==0x01)
+    		tempcx=0x00;
+       SiS_SetRegANDOR(SiS_Part2Port,0x46,~0x007,tempcx);
+       SiS_SetRegOR(SiS_Part2Port,0x46,0x18);
+               if(SiS_VBInfo&SetPALTV) {
+                   tempbx=0x0364;
+                   tempcx=0x009c;
+               } else {
+                   tempbx=0x0346;
+                   tempcx=0x0078;
+               }
+       temp=(tempbx&0x00FF) ;
+       SiS_SetReg1(SiS_Part2Port,0x4B,temp);
+       temp=(tempcx&0x00FF) ;
+       SiS_SetReg1(SiS_Part2Port,0x4C,temp);
+       tempbx=(tempbx&0x0300);
+       temp=(tempcx&0xFF00)>>8 ;
+       temp=(temp&0x0003)<<2;
+       temp=temp|(tempbx>>8);
+       SiS_SetReg1(SiS_Part2Port,0x4D,temp);
+
+       temp=SiS_GetReg1(SiS_Part2Port,0x43); /*301b change */
+       SiS_SetReg1(SiS_Part2Port,0x43,(USHORT)(temp-3));
+  }
+  /*end 301b*/
+
+#ifdef SIS300
+  /*add PALMN*/
+  if((HwDeviceExtension->jChipType==SIS_630)||
+     (HwDeviceExtension->jChipType==SIS_730)) {
+          if(SiS_VBInfo&SetCRT2ToTV) {
+             temp=SiS_GetReg1(SiS_P3d4,0x31);
+             temp=temp&0x01;
+             if(temp) {
+                  temp1=SiS_GetReg1(SiS_P3d4,0x35);
+                  temp1=temp1&0x40;
+                  if(temp1){
+                           SiS_SetRegANDOR(SiS_Part2Port,0x00,0xEF,0x00);
+                           temp3=SiS_GetReg1(SiS_Part2Port,0x01);
+                           temp3=temp3-1;
+                           SiS_SetReg1(SiS_Part2Port,0x01,temp3);
+                  }
+             }
+          }
+  }
+  /*end add*/
+#endif
 
-	temp = CHTVRegData[resindex].Reg[0];
-	tempbx = ((temp & 0x00FF) << 8) | 0x00;
-	SiS_SetCH7005 (tempbx);
-	temp = CHTVRegData[resindex].Reg[1];
-	tempbx = ((temp & 0x00FF) << 8) | 0x07;
-	SiS_SetCH7005 (tempbx);
-	temp = CHTVRegData[resindex].Reg[2];
-	tempbx = ((temp & 0x00FF) << 8) | 0x08;
-	SiS_SetCH7005 (tempbx);
-	temp = CHTVRegData[resindex].Reg[3];
-	tempbx = ((temp & 0x00FF) << 8) | 0x0A;
-	SiS_SetCH7005 (tempbx);
-	temp = CHTVRegData[resindex].Reg[4];
-	tempbx = ((temp & 0x00FF) << 8) | 0x0B;
-	SiS_SetCH7005 (tempbx);
-
-	SiS_SetCH7005 (0x2801);
-	SiS_SetCH7005 (0x3103);
-	SiS_SetCH7005 (0x003D);
-	SiS_SetCHTVRegANDOR (0x0010, 0x1F);
-	SiS_SetCHTVRegANDOR (0x0211, 0xF8);
-	SiS_SetCHTVRegANDOR (0x001C, 0xEF);
-
-	if (!(SiS_VBInfo & SetPALTV)) {
-		/* tempcl=CRT2CRTC; */
-		tempcl = tempcl & 0x3F;
-		if (SiS_VBInfo & SetCHTVOverScan) {
-			if (tempcl == 0x04) {	/* 640x480   underscan */
-				SiS_SetCHTVRegANDOR (0x0020, 0xEF);
-				SiS_SetCHTVRegANDOR (0x0121, 0xFE);
-			} else {
-				if (tempcl == 0x05) {	/* 800x600  underscan */
-					SiS_SetCHTVRegANDOR (0x0118, 0xF0);
-					SiS_SetCHTVRegANDOR (0x0C19, 0xF0);
-					SiS_SetCHTVRegANDOR (0x001A, 0xF0);
-					SiS_SetCHTVRegANDOR (0x001B, 0xF0);
-					SiS_SetCHTVRegANDOR (0x001C, 0xF0);
-					SiS_SetCHTVRegANDOR (0x001D, 0xF0);
-					SiS_SetCHTVRegANDOR (0x001E, 0xF0);
-					SiS_SetCHTVRegANDOR (0x001F, 0xF0);
-					SiS_SetCHTVRegANDOR (0x0120, 0xEF);
-					SiS_SetCHTVRegANDOR (0x0021, 0xFE);
-				}
-			}
-		} else {
-			if (tempcl == 0x04) {	/* 640x480   overscan  */
-				SiS_SetCHTVRegANDOR (0x0020, 0xEF);
-				SiS_SetCHTVRegANDOR (0x0121, 0xFE);
-			} else {
-				if (tempcl == 0x05) {	/* 800x600   overscan */
-					SiS_SetCHTVRegANDOR (0x0118, 0xF0);
-					SiS_SetCHTVRegANDOR (0x0F19, 0xF0);
-					SiS_SetCHTVRegANDOR (0x011A, 0xF0);
-					SiS_SetCHTVRegANDOR (0x0C1B, 0xF0);
-					SiS_SetCHTVRegANDOR (0x071C, 0xF0);
-					SiS_SetCHTVRegANDOR (0x011D, 0xF0);
-					SiS_SetCHTVRegANDOR (0x0C1E, 0xF0);
-					SiS_SetCHTVRegANDOR (0x071F, 0xF0);
-					SiS_SetCHTVRegANDOR (0x0120, 0xEF);
-					SiS_SetCHTVRegANDOR (0x0021, 0xFE);
-				}
-			}
-		}
-	}
+#ifdef SIS315H
+  /*add PALMN*/
+  if ( (HwDeviceExtension->jChipType==SIS_315H)||
+       (HwDeviceExtension->jChipType==SIS_315PRO)||
+       (HwDeviceExtension->jChipType==SIS_550) ||
+       (HwDeviceExtension->jChipType==SIS_640) ||
+       (HwDeviceExtension->jChipType==SIS_740) ||
+       (HwDeviceExtension->jChipType==SIS_650)) {
+        	if(SiS_VBInfo&SetCRT2ToTV) {
+             		temp=SiS_GetReg1(SiS_P3d4,0x31);
+            		temp=temp&0x01;
+              		if(temp) {
+                  		temp1=SiS_GetReg1(SiS_P3d4,0x38);
+                 		temp1=temp1&0x40;
+                   		if(temp1){
+                           		SiS_SetRegANDOR(SiS_Part2Port,0x00,0xEF,0x00);
+                           		temp3=SiS_GetReg1(SiS_Part2Port,0x01);
+                           		temp3=temp3-1;
+                           		SiS_SetReg1(SiS_Part2Port,0x01,temp3);
+                		}
+             		}
+          	}
+  }
+  /*end add*/
+#endif
+
+  if(SiS_VBInfo&SetCRT2ToHiVisionTV) {
+    if(!(SiS_VBInfo&SetInSlaveMode)) {
+      SiS_SetReg1(SiS_Part2Port,0x0B,0x00);
+    }
+  }
+  if(SiS_VBInfo&SetCRT2ToTV){
+    return;
+  }
+
+  /* TW: From here: LCD Part2 group */
+
+  tempbx=SiS_HDE-1;         /* RHACTE=HDE-1 */
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part2Port,0x2C,temp);
+  temp=(tempbx&0xFF00)>>8;
+  temp=temp<<4;
+  SiS_SetRegANDOR(SiS_Part2Port,0x2B,0x0F,temp);
+  temp=0x01;
+  if(SiS_LCDResInfo==Panel1280x1024) {
+    if(SiS_ModeType==ModeEGA) {
+      if(SiS_VGAHDE>=1024) {
+        temp=0x02;
+        if (SiS_SetFlag&LCDVESATiming)
+          temp=0x01;
+      }
+    }
+  }
+  SiS_SetReg1(SiS_Part2Port,0x0B,temp);
+
+  tempbx=SiS_VDE;         /* RTVACTEO=(VDE-1)&0xFF */
+  push1=tempbx;
+  tempbx--;
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part2Port,0x03,temp);
+  temp=((tempbx&0xFF00)>>8)&0x07;
+  SiS_SetRegANDOR(SiS_Part2Port,0x0C,~0x07,temp);
+
+  tempcx=SiS_VT-1;
+  push2=tempcx+1;
+  temp=tempcx&0x00FF;   /* RVTVT=VT-1 */
+  SiS_SetReg1(SiS_Part2Port,0x19,temp);
+  temp=(tempcx&0xFF00)>>8;
+  temp=temp<<5;
+  if(SiS_LCDInfo&LCDRGB18Bit){
+    temp=temp|0x10;
+  }
+  if(SiS_VBInfo&SetCRT2ToLCD) {
+    tempbx=(tempbx&0xFF00)|(SiS_LCDInfo&0x0FF);
+    if(tempbx&LCDSync) {
+      tempbx=tempbx&LCDSyncBit;
+      tempbx=(tempbx&0xFF00)|((tempbx&0x00FF)>>LCDSyncShift);
+      temp=temp|(tempbx&0x00FF);
+    }
+  }
+  SiS_SetReg1(SiS_Part2Port,0x1A,temp);
+
+  tempcx++;
+  tempbx=768;
+  if(SiS_LCDResInfo!=Panel1024x768) {
+    tempbx=1024;
+    if(SiS_LCDResInfo!=Panel1280x1024) {
+         tempbx=1200;     /*301b */
+         if(SiS_LCDResInfo!=Panel1600x1200) {
+            if(tempbx!=SiS_VDE) {
+               tempbx=960;
+            }
+         }
+    }
+  }
+  if(SiS_LCDInfo&LCDNonExpanding) {
+    tempbx=SiS_VDE;
+    tempbx--;
+    tempcx--;
+  }
+  tempax=1;
+  if(!(SiS_LCDInfo&LCDNonExpanding)) {
+    if(tempbx!=SiS_VDE){
+      tempax=tempbx;
+      if(tempax<SiS_VDE) {
+        tempax=0;
+        tempcx=0;
+      } else {
+        tempax=tempax-SiS_VDE;
+      }
+      tempax=tempax>>1;
+    }
+    tempcx=tempcx-tempax; /* lcdvdes */
+    tempbx=tempbx-tempax; /* lcdvdee */
+  } else {
+    tempax=tempax>>1;
+    tempcx=tempcx-tempax; /* lcdvdes */
+    tempbx=tempbx-tempax; /* lcdvdee */
+  }
+
+  temp=tempcx&0x00FF;   /* RVEQ1EQ=lcdvdes */
+  SiS_SetReg1(SiS_Part2Port,0x05,temp);
+  temp=tempbx&0x00FF;   /* RVEQ2EQ=lcdvdee */
+  SiS_SetReg1(SiS_Part2Port,0x06,temp);
+
+  /* TW new @@@ */
+  if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+        /* TW: BIOS sets Part2 0x02 to 0x18. The old caluculation (in else statement)
+	 *     resulted in 0x13. Do it this way for 301B?
+	 */
+        temp=(((tempcx&0xFF00)>>8)<<3);   /* 0x325 & ff00 = 300 >> 8 = 3 << 3 = 0x18 */
+	SiS_SetReg1(SiS_Part2Port,0x02,temp);
+  } else {
+  /* TW end */
+  	temp=(tempbx&0xFF00)>>8;
+  	temp=temp<<3;
+  	temp=temp|((tempcx&0xFF00)>>8);
+  	SiS_SetReg1(SiS_Part2Port,0x02,temp);
+  }
+
+  tempbx=push2;  	/* SiS_VT = 0x326  - - - (TW DEBUG REMARKS)*/
+  tempax=push1;  	/* SiS_VDE = 0x300 */
+  tempcx=tempbx;
+  tempcx=tempcx-tempax; /* -> 0x26 */
+  tempcx=tempcx>>4;     /* -> 0x02 */
+  tempbx=tempbx+tempax; /* -> 0x626 */
+  tempbx=tempbx>>1;     /* -> 0x313 */
+  if(SiS_LCDInfo&LCDNonExpanding) {
+     tempbx=tempbx-10;
+  }
+  /* TW new @@@ */
+  if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+  	/* TW: BIOS sets Part2 0x04 to 0x02. The old caluculation (in else statement)
+	 *     resulted in 0x13. Do it this way for 301B?
+	 */
+        temp=tempcx&0x00FF;
+	SiS_SetReg1(SiS_Part2Port,0x04,temp);
+  } else {
+  /* TW end */
+    	temp=tempbx&0x00FF;   		/* RTVACTEE=lcdvrs */
+  	SiS_SetReg1(SiS_Part2Port,0x04,temp);   /* TW: BIOS: 0x02, here 0x13 */
+  }
+
+ temp=(tempbx&0xFF00)>>8;
+ temp=temp<<4;
+ tempbx=tempbx+tempcx+1;
+ temp=temp|(tempbx&0x000F);
+ SiS_SetReg1(SiS_Part2Port,0x01,temp);
+
+ if(SiS_LCDResInfo==Panel1024x768) {
+   if(!(SiS_SetFlag&LCDVESATiming)) {
+     if(!(SiS_LCDInfo&LCDNonExpanding)) {
+       if(ModeNo==0x13) {
+         SiS_SetReg1(SiS_Part2Port,0x04,0xB9);
+         SiS_SetReg1(SiS_Part2Port,0x05,0xCC);
+         SiS_SetReg1(SiS_Part2Port,0x06,0xA6);
+       } else {
+         temp=crt2crtc&0x3F;
+         if(temp==4) {
+           SiS_SetReg1(SiS_Part2Port,0x01,0x2B);
+           SiS_SetReg1(SiS_Part2Port,0x02,0x13);
+           SiS_SetReg1(SiS_Part2Port,0x04,0xE5);
+           SiS_SetReg1(SiS_Part2Port,0x05,0x08);
+           SiS_SetReg1(SiS_Part2Port,0x06,0xE2);
+         }
+       }
+     }
+   }
+ }
+
+ SiS_SetRegANDOR(SiS_Part2Port,0x09,0xF0,0x00);
+ SiS_SetRegANDOR(SiS_Part2Port,0x0A,0xF0,0x00);
+
+ tempcx=(SiS_HT-SiS_HDE)>>2;    		/* (HT-HDE)>>2     */
+ tempbx=(SiS_HDE+7);            		/* lcdhdee         */
+ /*301b*/
+ if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+    tempbx=tempbx+2;
+ }
+ push1=tempbx;
+ temp=tempbx&0x00FF;    			/* RHEQPLE=lcdhdee */
+ SiS_SetReg1(SiS_Part2Port,0x23,temp);
+ temp=(tempbx&0xFF00)>>8;
+ SiS_SetRegANDOR(SiS_Part2Port,0x25,~0x0F,temp);
+ /*301b*/
+ temp=7;
+ if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+    temp=temp+2;
+ }
+ SiS_SetReg1(SiS_Part2Port,0x1F,temp);  	/* RHBLKE=lcdhdes */
+ SiS_SetRegANDOR(SiS_Part2Port,0x20,0x0F,0x00);
+
+ tempbx=tempbx+tempcx;
+ push2=tempbx;
+ temp=tempbx&0xFF;            			/* RHBURSTS=lcdhrs */
+ if(SiS_LCDResInfo==Panel1280x1024) {
+   if(!(SiS_LCDInfo&LCDNonExpanding)) {
+     if(SiS_HDE==1280) {
+       temp=0x47;
+     }
+   }
+ }
+ SiS_SetReg1(SiS_Part2Port,0x1C,temp);
+ temp=(tempbx&0xFF00)>>8;
+ temp=temp<<4;
+ SiS_SetRegANDOR(SiS_Part2Port,0x1D,~0x0F0,temp);
+
+ tempbx=push2;
+ tempcx=tempcx<<1;
+ tempbx=tempbx+tempcx;
+ temp=tempbx&0x00FF;            		/* RHSYEXP2S=lcdhre */
+ SiS_SetReg1(SiS_Part2Port,0x21,temp);
+
+ SiS_SetRegANDOR(SiS_Part2Port,0x17,0xFB,0x00);
+ SiS_SetRegANDOR(SiS_Part2Port,0x18,0xDF,0x00);
+
+ if(!(SiS_SetFlag&LCDVESATiming)) {
+   if(SiS_VGAVDE==525) {
+     if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))   /*301b*/
+    	temp=0xC6;
+     else
+       	temp=0xC4;
+     SiS_SetReg1(SiS_Part2Port,0x2f,temp);
+     SiS_SetReg1(SiS_Part2Port,0x30,0xB3);
+   }
+   if(SiS_VGAVDE==420) {
+     if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+    	temp=0x4F;
+     else
+       	temp=0x4E;
+     SiS_SetReg1(SiS_Part2Port,0x2f,temp);
+   }
+ }
 }
 
-void
-SiS_SetCHTVRegANDOR (USHORT tempax, USHORT tempbh)
+USHORT
+SiS_GetVGAHT2()
 {
-	USHORT tempal, tempah, tempbl;
+  ULONG tempax,tempbx;
 
-	tempal = tempax & 0x00FF;
-	tempah = (tempax >> 8) & 0x00FF;
-	tempbl = SiS_GetCH7005 (tempal);
-	tempbl = (((tempbl & tempbh) | tempah) << 8 | tempal);
-	SiS_SetCH7005 (tempbl);
+  tempbx=((SiS_VGAVT-SiS_VGAVDE)*SiS_RVBHCMAX)&0xFFFF;
+  tempax=(SiS_VT-SiS_VDE)*SiS_RVBHCFACT;
+  tempax=(tempax*SiS_HT)/tempbx;
+  return((USHORT) tempax);
 }
 
 void
-SiS_SetCH7005 (USHORT tempbx)
-{
-	USHORT tempah, temp;
-
-	SiS_DDC_Port = 0x3c4;
-	SiS_DDC_Index = 0x11;
-	SiS_DDC_DataShift = 0x00;
-	SiS_DDC_DeviceAddr = 0xEA;
-
-	temp = 1;
-	for (; temp != 0;) {
-		SiS_SetSwitchDDC2 ();
-		SiS_SetStart ();
-		tempah = SiS_DDC_DeviceAddr;
-		temp = SiS_WriteDDC2Data (tempah);
-		if (temp)
-			continue;
-		tempah = tempbx & 0x00FF;
-		temp = SiS_WriteDDC2Data (tempah);
-		if (temp)
-			continue;
-		tempah = (tempbx & 0xFF00) >> 8;
-		temp = SiS_WriteDDC2Data (tempah);
-		if (temp)
-			continue;
-		SiS_SetStop ();
-	}
+SiS_SetGroup3(USHORT  BaseAddr,ULONG ROMAddr,USHORT ModeNo,
+              USHORT ModeIdIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+  USHORT i;
+  UCHAR *tempdi;
+  USHORT  modeflag,temp,temp1;
+
+  if(ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
+  }
+
+  SiS_SetReg1(SiS_Part3Port,0x00,0x00);
+  if(SiS_VBInfo&SetPALTV) {
+    SiS_SetReg1(SiS_Part3Port,0x13,0xFA);
+    SiS_SetReg1(SiS_Part3Port,0x14,0xC8);
+  } else {
+    SiS_SetReg1(SiS_Part3Port,0x13,0xF6);
+    SiS_SetReg1(SiS_Part3Port,0x14,0xBF);
+  }
+#ifdef SIS300
+  /*add PALMN*/
+  if((HwDeviceExtension->jChipType==SIS_630)||
+     (HwDeviceExtension->jChipType==SIS_730)) {
+           if(SiS_VBInfo&SetCRT2ToTV) {
+              temp=SiS_GetReg1(SiS_P3d4,0x31);
+              temp=temp&0x01;
+              if(temp) {
+                  temp1=SiS_GetReg1(SiS_P3d4,0x35);
+                  temp1=temp1&0x40;
+                   if(temp1){
+                          SiS_SetReg1(SiS_Part3Port,0x13,0xFA);
+                          SiS_SetReg1(SiS_Part3Port,0x14,0xC8);
+                          SiS_SetReg1(SiS_Part3Port,0x3D,0xA8);
+                }
+             }
+          } 
+      }	
+    /*end add*/
+#endif
+#ifdef SIS315H
+/*add PALMN*/
+  if ( (HwDeviceExtension->jChipType==SIS_315H)||
+       (HwDeviceExtension->jChipType==SIS_315PRO)||
+       (HwDeviceExtension->jChipType==SIS_550) ||
+       (HwDeviceExtension->jChipType==SIS_640) ||
+       (HwDeviceExtension->jChipType==SIS_740) ||
+       (HwDeviceExtension->jChipType==SIS_650)) {
+         if(SiS_VBInfo&SetCRT2ToTV) {
+             temp=SiS_GetReg1(SiS_P3d4,0x31);   
+             temp=temp&0x01; 
+              if(temp) {
+                  temp1=SiS_GetReg1(SiS_P3d4,0x38);        
+                  temp1=temp1&0x40; 
+                   if(temp1){
+                          SiS_SetReg1(SiS_Part3Port,0x13,0xFA); 
+                          SiS_SetReg1(SiS_Part3Port,0x14,0xC8); 
+                          SiS_SetReg1(SiS_Part3Port,0x3D,0xA8);
+                   }
+              }
+         }
+  }
+ /*end add*/
+#endif
+  if(SiS_VBInfo&SetCRT2ToHiVisionTV) {
+    tempdi=SiS_HiTVGroup3Data;
+    if(SiS_SetFlag&TVSimuMode) {
+      tempdi=SiS_HiTVGroup3Simu;
+      if(!(modeflag&Charx8Dot)) {
+        tempdi=SiS_HiTVGroup3Text;
+      }
+    }
+    for(i=0;i<=0x3E;i++){
+       SiS_SetReg1(SiS_Part3Port,i,tempdi[i]);
+    }
+  }
+  return;
+}
+
+void
+SiS_SetGroup4(USHORT  BaseAddr,ULONG ROMAddr,USHORT ModeNo,
+              USHORT ModeIdIndex,USHORT RefreshRateTableIndex,
+	      PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+  USHORT tempax,tempcx,tempbx,modeflag,temp,temp2,push1;
+  ULONG tempebx,tempeax,templong;
+
+  if(ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
+  }
+  temp=SiS_RVBHCFACT;
+  SiS_SetReg1(SiS_Part4Port,0x13,temp);
+
+  tempbx=SiS_RVBHCMAX;
+  temp=tempbx&0x00FF;
+  SiS_SetReg1(SiS_Part4Port,0x14,temp);
+  temp2=((tempbx&0xFF00)>>8)<<7;
+  
+  tempcx=SiS_VGAHT-1;
+  temp=tempcx&0x00FF;
+  SiS_SetReg1(SiS_Part4Port,0x16,temp);
+  temp=((tempcx&0xFF00)>>8)<<3;
+  temp2=temp|temp2;
+
+  tempcx=SiS_VGAVT-1;
+  if(!(SiS_VBInfo&SetCRT2ToTV)){
+    tempcx=tempcx-5;
+  }
+  temp=tempcx&0x00FF;
+  SiS_SetReg1(SiS_Part4Port,0x17,temp);
+  temp=temp2|((tempcx&0xFF00)>>8);
+  SiS_SetReg1(SiS_Part4Port,0x15,temp);
+
+  tempcx=SiS_VBInfo;
+  tempbx=SiS_VGAHDE;
+  if(modeflag&HalfDCLK){
+    tempbx=tempbx>>1;
+  }
+  if(tempcx&SetCRT2ToHiVisionTV) {
+       temp=0xA0;
+       if(tempbx!=1024) {
+           temp=0xC0;
+           if(tempbx!=1280) temp=0;
+       }
+  } else if((tempcx&SetCRT2ToTV)&&(SiS_VGAHDE==1024)) {       /*301b*/
+       temp=0xA0;
+  } else {
+       temp=0x80;
+       if(SiS_VBInfo&SetCRT2ToLCD){
+          temp=0;
+          if(tempbx>800) temp=0x60;
+       }
+  }
+  if(SiS_LCDResInfo!=Panel1280x1024) temp=temp|0x0A;
+  SiS_SetRegANDOR(SiS_Part4Port,0x0E,~0xEF,temp);
+
+  tempebx=SiS_VDE;
+  if(tempcx&SetCRT2ToHiVisionTV) {
+    /* if(!(tempax&0xE000)) tempbx=tempbx>>1; */
+    if(!(temp&0xE000)) tempbx=tempbx>>1;               /* alan ???? */
+
+  }
+
+  tempcx=SiS_RVBHRS;
+  temp=tempcx&0x00FF;
+  SiS_SetReg1(SiS_Part4Port,0x18,temp);
+
+  tempebx=tempebx;
+  tempeax=SiS_VGAVDE;
+  tempcx=tempcx|0x04000;
+/*tempeax=tempeax-tempebx;  */
+  if(tempeax<=tempebx){
+    tempcx=((tempcx&0xFF00)^0x4000)|(tempcx&0x00ff);
+    tempeax=SiS_VGAVDE;
+  }
+
+  else {
+    tempeax=tempeax-tempebx;
+  }
+
+  push1=tempcx;
+  templong=(tempeax*256*1024)%tempebx;
+  tempeax=(tempeax*256*1024)/tempebx;
+  tempebx=tempeax;
+  if(templong!=0){
+    tempebx++;
+  }
+  tempcx=push1;
+  temp=(USHORT)(tempebx&0x000000FF);
+  SiS_SetReg1(SiS_Part4Port,0x1B,temp);
+  temp=(USHORT)((tempebx&0x0000FF00)>>8);
+  SiS_SetReg1(SiS_Part4Port,0x1A,temp);
+  tempbx=(USHORT) (tempebx>>16);
+  temp=tempbx&0x00FF;
+  temp=temp<<4;
+  temp=temp|((tempcx&0xFF00)>>8);
+  SiS_SetReg1(SiS_Part4Port,0x19,temp);
+
+  /*301b*/
+  if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+         temp=0x0028;
+         SiS_SetReg1(SiS_Part4Port,0x1C,temp);
+         tempax=SiS_VGAHDE;
+          if(modeflag&HalfDCLK){
+           tempax=tempax>>1;
+           }
+          if(SiS_VBInfo&(SetCRT2ToLCD)) {
+             if(tempax>800)
+                tempax=tempax-800;
+          }
+          tempax=tempax-1;                
+                 
+         if(SiS_VBInfo&(SetCRT2ToTV|SetCRT2ToHiVisionTV)) {
+          if(SiS_VGAHDE>800)
+            {
+              if(SiS_VGAHDE==1024)
+                tempax=(tempax*25/32)-1;
+              else
+                  tempax=(tempax*20/32)-1;          
+            }
+         }
+         temp=(tempax&0xFF00)>>8;
+         temp=((temp&0x0003)<<4);
+         SiS_SetReg1(SiS_Part4Port,0x1E,temp);
+         temp=(tempax&0x00FF);
+         SiS_SetReg1(SiS_Part4Port,0x1D,temp);
+   
+         if(SiS_VBInfo&(SetCRT2ToTV|SetCRT2ToHiVisionTV)) {
+            if(SiS_VGAHDE>800){
+               SiS_SetRegOR(SiS_Part4Port,0x1E,0x08);
+            }
+         }
+         temp=0x0036;
+         if(SiS_VBInfo&SetCRT2ToTV) {
+             temp=temp|0x0001;
+         }
+         SiS_SetRegANDOR(SiS_Part4Port,0x1F,0x00C0,temp);
+         tempbx=(SiS_HT/2)-2;
+         temp=((tempbx&0x0700)>>8)<<3;
+         SiS_SetRegANDOR(SiS_Part4Port,0x21,0x00C0,temp);
+         temp=tempbx&0x00FF;
+         SiS_SetReg1(SiS_Part4Port,0x22,temp);
+         if( (SiS_VBType&(VB_SIS301LV|VB_SIS302LV)) && (SiS_VBInfo&SetCRT2ToLCD) ) {
+             SiS_SetReg1(SiS_Part4Port,0x24,0x0e);
+	 }
+  }
+  /*end 301b*/
+
+  SiS_SetCRT2VCLK(BaseAddr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,HwDeviceExtension);
+}
+
+void
+SiS_SetCRT2VCLK(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                 USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+  USHORT vclkindex;
+  USHORT tempah,temp1;
+
+  vclkindex = SiS_GetVCLK2Ptr(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,HwDeviceExtension);
+  /*301b*/
+  if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+   	tempah = SiS_VBVCLKData[vclkindex].Part4_A;
+   	SiS_SetReg1(SiS_Part4Port,0x0A,tempah);
+   	tempah = SiS_VBVCLKData[vclkindex].Part4_B;
+   	SiS_SetReg1(SiS_Part4Port,0x0B,tempah);
+  } else {
+   	SiS_SetReg1(SiS_Part4Port,0x0A,0x01);
+   	tempah = SiS_VBVCLKData[vclkindex].Part4_B;
+   	SiS_SetReg1(SiS_Part4Port,0x0B,tempah);
+   	tempah = SiS_VBVCLKData[vclkindex].Part4_A;
+   	SiS_SetReg1(SiS_Part4Port,0x0A,tempah);
+  }
+  SiS_SetReg1(SiS_Part4Port,0x12,0x00);
+  tempah=0x08;
+  if(SiS_VBInfo&SetCRT2ToRAMDAC){
+    	tempah=tempah|0x020;
+  }
+  temp1=SiS_GetReg1(SiS_Part4Port,0x12);
+  tempah=tempah|temp1;
+  SiS_SetReg1(SiS_Part4Port,0x12,tempah);
 }
 
 USHORT
-SiS_GetCH7005 (USHORT tempbx)
+SiS_GetVCLK2Ptr(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+        USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
 {
-	USHORT tempah, temp;
+  USHORT tempbx;
+#ifdef SIS300
+  USHORT LCDXlat1VCLK300[4] = {VCLK65,VCLK65,VCLK65,VCLK65};
+  USHORT LCDXlat2VCLK300[4] = {VCLK108_2,VCLK108_2,VCLK108_2,VCLK108_2};
+  USHORT LVDSXlat2VCLK300[4]= {VCLK65,VCLK65,VCLK65,VCLK65};
+  USHORT LVDSXlat3VCLK300[4]= {VCLK65,VCLK65,VCLK65,VCLK65};
+#endif
+#ifdef SIS315H
+  USHORT LCDXlat1VCLK310[4] = {VCLK65+2,VCLK65+2,VCLK65+2,VCLK65+2};
+  USHORT LCDXlat2VCLK310[4] = {VCLK108_2+5,VCLK108_2+5,VCLK108_2+5,VCLK108_2+5};
+  USHORT LVDSXlat2VCLK310[4]= {VCLK65+2,VCLK65+2,VCLK65+2,VCLK65+2};
+  USHORT LVDSXlat3VCLK310[4]= {VCLK65+2,VCLK65+2,VCLK65+2,VCLK65+2};
+#endif
+  USHORT LVDSXlat1VCLK[4]   = {VCLK40,VCLK40,VCLK40,VCLK40};
+  USHORT CRT2Index,VCLKIndex;
+  USHORT modeflag,resinfo;
+  UCHAR *CHTVVCLKPtr=NULL;
+  USHORT *LCDXlatVCLK1=NULL;
+  USHORT *LCDXlatVCLK2=NULL;
+  USHORT *LVDSXlatVCLK2=NULL;
+  USHORT *LVDSXlatVCLK3=NULL;
+
+#ifdef SIS315H
+  if ( (HwDeviceExtension->jChipType==SIS_315H)||   
+       (HwDeviceExtension->jChipType==SIS_315PRO)||
+       (HwDeviceExtension->jChipType==SIS_550) ||
+       (HwDeviceExtension->jChipType==SIS_640) ||
+       (HwDeviceExtension->jChipType==SIS_740) ||
+       (HwDeviceExtension->jChipType==SIS_650)) {
+		LCDXlatVCLK1 = LCDXlat1VCLK310;
+		LCDXlatVCLK2 = LCDXlat2VCLK310;
+		LVDSXlatVCLK2 = LVDSXlat2VCLK310;
+		LVDSXlatVCLK3 = LVDSXlat3VCLK310;
+  } else {
+#endif
+#ifdef SIS300
+		LCDXlatVCLK1 = LCDXlat1VCLK300;
+		LCDXlatVCLK2 = LCDXlat2VCLK300;
+		LVDSXlatVCLK2 = LVDSXlat2VCLK300;
+		LVDSXlatVCLK3 = LVDSXlat3VCLK300;
+#endif
+#ifdef SIS315H
+  }
+#endif
 
-	SiS_DDC_Port = 0x3c4;
-	SiS_DDC_Index = 0x11;
-	SiS_DDC_DataShift = 0x00;
-	SiS_DDC_DeviceAddr = 0xEA;
-	SiS_DDC_ReadAddr = tempbx;
-
-	for (;;) {
-		SiS_SetSwitchDDC2 ();
-		SiS_SetStart ();
-		tempah = SiS_DDC_DeviceAddr;
-		temp = SiS_WriteDDC2Data (tempah);
-		if (temp)
-			continue;
-		tempah = SiS_DDC_ReadAddr;
-		temp = SiS_WriteDDC2Data (tempah);
-		if (temp)
-			continue;
-
-		SiS_SetStart ();
-		tempah = SiS_DDC_DeviceAddr;
-		tempah = tempah | 0x01;
-		temp = SiS_WriteDDC2Data (tempah);
-		if (temp)
-			continue;
-		tempah = SiS_ReadDDC2Data (tempah);
-		SiS_SetStop ();
-		return (tempah);
-	}
-}
+  if(ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+    	resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+    	CRT2Index = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
+    	resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+    	CRT2Index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+  }
+
+  if(SiS_IF_DEF_LVDS==0) {
+     CRT2Index = CRT2Index>>6;        /*  for LCD */
+     if((SiS_VBInfo&SetCRT2ToLCD)||(SiS_VBInfo&SetCRT2ToLCDA)){   /*301b*/
+      	if(SiS_LCDResInfo!=Panel1024x768){
+        	VCLKIndex = LCDXlatVCLK2[CRT2Index];
+      	} else {
+        	VCLKIndex = LCDXlatVCLK1[CRT2Index];
+      	}
+     } else {        /* for TV */
+      	if(SiS_VBInfo&SetCRT2ToTV) {
+        	if(SiS_IF_DEF_HiVision==1) {
+          		if(SiS_SetFlag&RPLLDIV2XO) {
+            			VCLKIndex=HiTVVCLKDIV2;
+            			if(HwDeviceExtension->jChipType >= SIS_315H) { /* 310 series */
+					/* VCLKIndex += 11;    for chip310  0x2E */
+              				VCLKIndex += 25;    /* for chip315  */
+            			}
+     			} else {
+            			VCLKIndex=HiTVVCLK;
+            			if(HwDeviceExtension->jChipType >= SIS_315H) { /* 310 series */
+					/*  VCLKIndex += 11;    for chip310  0x2E */
+              				VCLKIndex += 25;    /* for chip315  */
+            			}
+          		}
+          		if(SiS_SetFlag&TVSimuMode) {
+            			if(modeflag&Charx8Dot) {
+              				VCLKIndex=HiTVSimuVCLK;
+              					if(HwDeviceExtension->jChipType >= SIS_315H) { /* 310 series */
+							/*  VCLKIndex += 11;    for chip310  0x2E */
+              						VCLKIndex += 25;    /* for chip315  */
+              					}
+            			} else {
+              				VCLKIndex=HiTVTextVCLK;
+              				if(HwDeviceExtension->jChipType >= SIS_315H) { /* 310 series */
+						/*  VCLKIndex += 11;    for chip310  0x2E */
+              					VCLKIndex += 25;    /* for chip315  */
+              				}
+            			}
+          		}
+        	} else {
+          		if(SiS_VBInfo&SetCRT2ToTV) {
+            			if(SiS_SetFlag&RPLLDIV2XO) {
+              				VCLKIndex=TVVCLKDIV2;
+              					if(HwDeviceExtension->jChipType >= SIS_315H) { /* 310 series */
+							/* VCLKIndex += 11;    for chip310  0x2E */
+              						VCLKIndex += 25;    /* for chip315  */
+              					}
+            			} else {
+              				VCLKIndex=TVVCLK;
+              				if(HwDeviceExtension->jChipType >= SIS_315H) { /* 310 series */
+						/* VCLKIndex += 11;    for chip310  0x2E */
+              					VCLKIndex += 25;    /* for chip315  */
+              				}
+            			}
+          		}
+        	}
+      } else {    /* for CRT2 */
+        	VCLKIndex = (UCHAR)SiS_GetReg2((USHORT)(SiS_P3ca+0x02));      /*  Port 3cch */
+        	VCLKIndex =((VCLKIndex>>2)&0x03);
+        	if(ModeNo>0x13) {
+          		VCLKIndex =
+			    SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;    /* di+Ext_CRTVCLK */
+          		VCLKIndex = VCLKIndex&0x3f;
+        	}
+      }
+    }
+  } else {       /*   LVDS  */
+    	if(ModeNo<=0x13) VCLKIndex = CRT2Index;
+    	else VCLKIndex = CRT2Index;
+#ifdef LINUX_XF86
+	xf86DrvMsg(0, X_INFO, "CRT2Index = %d\n", CRT2Index);
+#endif
+	/* TW: This does not make sense: If CH7005 is there but CRT2 is set to
+	 *     LCD, VCLKindex is returned untouched...
+	 *     (Inserted SlaveMode check for 8bpp modes later)
+	 */
+
+#if 1
+    	if((SiS_IF_DEF_CH7005==1) && (!(SiS_VBInfo&SetInSlaveMode))) {
+      		if(!(SiS_VBInfo&SetCRT2ToLCD)) {
+#else
 
-void
-SiS_SetSwitchDDC2 (void)
-{
-	USHORT i;
+/* 	TW: If we do it this way instead, some machines (MITAC) have problems 		*/
+	if((SiS_IF_DEF_CH7005==1) && (SiS_VBInfo&SetCRT2ToTV)) {
+#endif
 
-	SiS_SetSCLKHigh ();
-	for (i = 0; i < 1000; i++) {
-		SiS_GetReg1 (SiS_DDC_Port, 0x05);
-	}
-	SiS_SetSCLKLow ();
-	for (i = 0; i < 1000; i++) {
-		SiS_GetReg1 (SiS_DDC_Port, 0x05);
-	}
+        		VCLKIndex = VCLKIndex&0x1f;
+        		tempbx=0;
+        		if(SiS_VBInfo&SetPALTV) tempbx=tempbx+2;
+        		if(SiS_VBInfo&SetCHTVOverScan) tempbx=tempbx+1;
+       			switch(tempbx) {
+          			case 0: CHTVVCLKPtr=SiS_CHTVVCLKUNTSC;
+					break;
+          			case 1: CHTVVCLKPtr=SiS_CHTVVCLKONTSC;
+					break;
+          			case 2: CHTVVCLKPtr=SiS_CHTVVCLKUPAL;
+					break;
+          			case 3: CHTVVCLKPtr=SiS_CHTVVCLKOPAL;
+					break;
+        		}
+        		VCLKIndex=CHTVVCLKPtr[VCLKIndex];
+      		}  
+    	} else {
+     		VCLKIndex = VCLKIndex>>6;
+     		if((SiS_LCDResInfo==Panel800x600)||(SiS_LCDResInfo==Panel320x480))
+     			VCLKIndex = LVDSXlat1VCLK[VCLKIndex]; /*fstn*/
+     		else if(SiS_LCDResInfo==Panel1024x768)
+     			VCLKIndex = LVDSXlatVCLK2[VCLKIndex];
+     		else 	VCLKIndex = LVDSXlatVCLK3[VCLKIndex];
+    	}
+  }
+  if(HwDeviceExtension->jChipType < SIS_315H) { /* for300 serial*/
+    	VCLKIndex=VCLKIndex&0x3F;
+  }
+  return (VCLKIndex);
 }
 
 void
-SiS_SetStart (void)
-{
-
-	SiS_SetSCLKLow ();
-	SiS_SetRegANDOR (SiS_DDC_Port, SiS_DDC_Index, 0xFD, 0x02);	/*  SetSDA(0x01); */
-	SiS_SetSCLKHigh ();
-	SiS_SetRegANDOR (SiS_DDC_Port, SiS_DDC_Index, 0xFD, 0x00);	/* SetSDA(0x00); */
-	SiS_SetSCLKHigh ();
+SiS_SetGroup5(USHORT  BaseAddr,ULONG ROMAddr,USHORT ModeNo,
+              USHORT ModeIdIndex)
+{
+  USHORT Pindex,Pdata;
+
+  Pindex=SiS_Part5Port;
+  Pdata=SiS_Part5Port+1;
+  if(SiS_ModeType==ModeVGA){
+    if(!(SiS_VBInfo&(SetInSlaveMode|LoadDACFlag|CRT2DisplayFlag))){
+      SiS_EnableCRT2();
+/*    LoadDAC2(ROMAddr,SiS_Part5Port,ModeNo,ModeIdIndex);  */
+    }
+  }
+  return;
+}
+
+void
+SiS_LoadDAC2(ULONG ROMAddr,USHORT SiS_Part5Port,
+             USHORT ModeNo,USHORT ModeIdIndex)
+{
+   USHORT data,data2;
+   USHORT time,i,j,k;
+   USHORT m,n,o;
+   USHORT si,di,bx,dl;
+   USHORT al,ah,dh;
+   USHORT *table=0;
+   USHORT Pindex,Pdata,modeflag;
+
+  if(ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
+  }
+
+   Pindex=SiS_Part5Port;
+   Pdata=SiS_Part5Port+1;
+   data=modeflag&DACInfoFlag;
+   time=64;
+   if(data==0x00) table=SiS_MDA_DAC;
+   if(data==0x08) table=SiS_CGA_DAC;
+   if(data==0x10) table=SiS_EGA_DAC;
+   if(data==0x18) {
+     time=256;
+     table=SiS_VGA_DAC;
+   }
+   if(time==256) j=16;
+   else j=time;
+
+   SiS_SetReg3(Pindex,0x00);
+
+   for(i=0;i<j;i++) {
+      data=table[i];
+      for(k=0;k<3;k++) {
+        data2=0;
+        if(data&0x01) data2=0x2A;
+        if(data&0x02) data2=data2+0x15;
+        SiS_SetReg3(Pdata,data2);
+        data=data>>2;
+      }
+   }
+
+   if(time==256) {
+      for(i=16;i<32;i++) {
+         data=table[i];
+         for(k=0;k<3;k++) SiS_SetReg3(Pdata,data);
+      }
+      si=32;
+      for(m=0;m<9;m++) {
+         di=si;
+         bx=si+0x04;
+         dl=0;
+         for(n=0;n<3;n++) {
+            for(o=0;o<5;o++) {
+              dh=table[si];
+              ah=table[di];
+              al=table[bx];
+              si++;
+              SiS_WriteDAC2(Pdata,dl,ah,al,dh);
+            }         /* for 5 */
+            si=si-2;
+            for(o=0;o<3;o++) {
+              dh=table[bx];
+              ah=table[di];
+              al=table[si];
+              si--;
+              SiS_WriteDAC2(Pdata,dl,ah,al,dh);
+            }         /* for 3 */
+            dl++;
+         }            /* for 3 */
+         si=si+5;
+      }               /* for 9 */
+   }
+}
+
+void
+SiS_WriteDAC2(USHORT Pdata,USHORT dl, USHORT ah, USHORT al, USHORT dh)
+{
+  USHORT temp;
+  USHORT bh,bl;
+
+  bh=ah;
+  bl=al;
+  if(dl!=0) {
+    temp=bh;
+    bh=dh;
+    dh=temp;
+    if(dl==1) {
+       temp=bl;
+       bl=dh;
+       dh=temp;
+    }
+    else {
+       temp=bl;
+       bl=bh;
+       bh=temp;
+    }
+  }
+  SiS_SetReg3(Pdata,(USHORT)dh);
+  SiS_SetReg3(Pdata,(USHORT)bh);
+  SiS_SetReg3(Pdata,(USHORT)bl);
 }
 
+/* TW: Start of Chrontel 7005 functions ---------------------------- */
+
 void
-SiS_SetStop (void)
+SiS_SetCHTVReg(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+               USHORT RefreshRateTableIndex)
 {
-	SiS_SetSCLKLow ();
-	SiS_SetRegANDOR (SiS_DDC_Port, SiS_DDC_Index, 0xFD, 0x00);	/*  SetSDA(0x00); */
-	SiS_SetSCLKHigh ();
-	SiS_SetRegANDOR (SiS_DDC_Port, SiS_DDC_Index, 0xFD, 0x02);	/* SetSDA(0x01); */
-	SiS_SetSCLKHigh ();
+  USHORT temp,tempbx,tempcl;
+/*  USHORT CRT2CRTC; */
+  USHORT TVType,resindex;
+  SiS_CHTVRegDataStruct *CHTVRegData=NULL;
+
+  if(ModeNo<=0x13){
+    	tempcl = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+  }else{
+    	tempcl = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+  }
+  TVType = 0;
+  if(SiS_VBInfo&SetPALTV) TVType=TVType+2;
+  if(SiS_VBInfo&SetCHTVOverScan) TVType=TVType+1;
+  switch(TVType) {
+    	case 0: CHTVRegData = SiS_CHTVReg_UNTSC; break;
+    	case 1: CHTVRegData = SiS_CHTVReg_ONTSC; break;
+    	case 2: CHTVRegData = SiS_CHTVReg_UPAL;  break;
+    	case 3: CHTVRegData = SiS_CHTVReg_OPAL;  break;
+  }
+  resindex=tempcl&0x3F;
+
+  /* TW: We don't support modes >800x600 */
+  if (resindex > 5) return;
+
+  if(SiS_VBInfo&SetPALTV) {
+    	SiS_SetCH7005(0x4304);  /* TW: 0x40=76uA (PAL); 0x03=15bit non-multi RGB*/
+    	SiS_SetCH7005(0x6909);	/* TW: Black level for PAL (105)*/
+  } else {
+    	SiS_SetCH7005(0x0304);  /* TW: upper nibble=71uA (NTSC), 0x03=15bit non-multi RGB*/
+    	SiS_SetCH7005(0x7109);	/* TW: Black level for NTSC (113)*/
+  }
+
+  temp = CHTVRegData[resindex].Reg[0];
+  tempbx=((temp&0x00FF)<<8)|0x00;	/* TW: Mode register */
+  SiS_SetCH7005(tempbx);
+  temp = CHTVRegData[resindex].Reg[1];
+  tempbx=((temp&0x00FF)<<8)|0x07;	/* TW: Start active video register */
+  SiS_SetCH7005(tempbx);
+  temp = CHTVRegData[resindex].Reg[2];
+  tempbx=((temp&0x00FF)<<8)|0x08;	/* TW: Position overflow register */
+  SiS_SetCH7005(tempbx);
+  temp = CHTVRegData[resindex].Reg[3];
+  tempbx=((temp&0x00FF)<<8)|0x0A;	/* TW: Horiz Position register */
+  SiS_SetCH7005(tempbx);
+  temp = CHTVRegData[resindex].Reg[4];
+  tempbx=((temp&0x00FF)<<8)|0x0B;	/* TW: Vertical Position register */
+  SiS_SetCH7005(tempbx);
+
+  /* TW: Set minimum flicker filter for Luma channel (SR1-0=00),
+             minimum text enhancement (S3-2=10),
+	     maximum flicker filter for Chroma channel (S5-4=10)
+	     =00101000=0x28 (When reading, S1-0->S3-2, and S3-2->S1-0!)
+   */
+  SiS_SetCH7005(0x2801);
+
+  /* TW: Set video bandwidth
+         High bandwith Luma composite video filter(S0=1)
+         low bandwith Luma S-video filter (S2-1=00)
+	 disable peak filter in S-video channel (S3=0)
+	 high bandwidth Chroma Filter (S5-4=11)
+	 =00110001=0x31
+  */
+  SiS_SetCH7005(0xb103);       /* old: 3103 */
+
+  /* TW: Register 0x3D does not exist in non-macrovision register map
+         (Maybe this is a macrovision register?)
+   */
+  /* SiS_SetCH7005(0x003D); */
+
+  /* TW: Register 0x10 only contains 1 writable bit (S0) for sensing,
+         all other bits a read-only. Macrovision?
+   */
+  SiS_SetCHTVRegANDOR(0x0010,0x1F);
+
+  /* TW: Register 0x11 only contains 3 writable bits (S0-S2) for
+         contrast enhancement (set to 010 -> gain 2 Yout = 9/8*(Yin-57) )
+   */
+  SiS_SetCHTVRegANDOR(0x0211,0xF8);
+
+  /* TW: Clear DSEN
+   */
+  SiS_SetCHTVRegANDOR(0x001C,0xEF);
+
+  if(!(SiS_VBInfo&SetPALTV)) {		/* ---- NTSC ---- */
+    tempcl=tempcl&0x3F;
+    if(SiS_VBInfo&SetCHTVOverScan) {
+      if(tempcl==0x04) {   			/* 640x480 overscan: Mode 16 */
+      	SiS_SetCHTVRegANDOR(0x0020,0xEF);   	/* loop filter off */
+        SiS_SetCHTVRegANDOR(0x0121,0xFE);       /* ACIV on, no need to set FSCI */
+      } else {
+        if(tempcl==0x05) {    			/* 800x600 overscan: Mode 23 */
+          SiS_SetCHTVRegANDOR(0x0118,0xF0);	/* 0x18-0x1f: FSCI 469,762,048 */
+          SiS_SetCHTVRegANDOR(0x0C19,0xF0);
+          SiS_SetCHTVRegANDOR(0x001A,0xF0);
+          SiS_SetCHTVRegANDOR(0x001B,0xF0);
+          SiS_SetCHTVRegANDOR(0x001C,0xF0);
+          SiS_SetCHTVRegANDOR(0x001D,0xF0);
+          SiS_SetCHTVRegANDOR(0x001E,0xF0);
+          SiS_SetCHTVRegANDOR(0x001F,0xF0);
+          SiS_SetCHTVRegANDOR(0x1020,0xEF);     /* Loop filter on for mode 23 */
+          SiS_SetCHTVRegANDOR(0x0021,0xFE);     /* ACIV off, need to set FSCI */
+        }
+      }
+    } else {
+      if(tempcl==0x04) {     			/* ----- 640x480 underscan; Mode 17 */
+        SiS_SetCHTVRegANDOR(0x0020,0xEF); 	/* loop filter off */
+        SiS_SetCHTVRegANDOR(0x0121,0xFE);
+      } else {
+        if(tempcl==0x05) {   			/* ----- 800x600 underscan: Mode 24 */
+          SiS_SetCHTVRegANDOR(0x0118,0xF0);     /* (FSCI was 0x1f1c71c7 - this is for mode 22) */
+          SiS_SetCHTVRegANDOR(0x0919,0xF0);	/* FSCI for mode 24 is 428,554,851 */
+          SiS_SetCHTVRegANDOR(0x081A,0xF0);
+          SiS_SetCHTVRegANDOR(0x0b1B,0xF0);
+          SiS_SetCHTVRegANDOR(0x031C,0xF0);
+          SiS_SetCHTVRegANDOR(0x0a1D,0xF0);
+          SiS_SetCHTVRegANDOR(0x061E,0xF0);
+          SiS_SetCHTVRegANDOR(0x031F,0xF0);
+          SiS_SetCHTVRegANDOR(0x0020,0xEF);     /* loop filter off for mode 24 */
+          SiS_SetCHTVRegANDOR(0x0021,0xFE);	/* ACIV off, need to set FSCI */
+        }
+      }
+    }
+  } else {				/* ---- PAL ---- */
+        /* TW: We don't play around with FSCI in PAL mode */
+      if (tempcl==0x04) {
+        SiS_SetCHTVRegANDOR(0x0020,0xEF); 	/* loop filter off */
+        SiS_SetCHTVRegANDOR(0x0121,0xFE);       /* ACIV on */
+      } else {
+        SiS_SetCHTVRegANDOR(0x0020,0xEF); 	/* loop filter off */
+        SiS_SetCHTVRegANDOR(0x0121,0xFE);       /* ACIV on */
+      }
+  }
+}
+
+void
+SiS_SetCHTVRegANDOR(USHORT tempax,USHORT tempbh)
+{
+  USHORT tempal,tempah,tempbl;
+
+  tempal=tempax&0x00FF;
+  tempah=(tempax>>8)&0x00FF;
+  tempbl=SiS_GetCH7005(tempal);
+  tempbl=(((tempbl&tempbh)|tempah)<<8|tempal);  
+  SiS_SetCH7005(tempbl);
+}
+
+/* TW: Write to Chrontel 7005 */
+/* Parameter is [Data (S15-S8) | Register no (S7-S0)] */
+void
+SiS_SetCH7005(USHORT tempbx)
+{
+  USHORT tempah,temp,i;
+
+  /* TW: This has to be relative to BaseAddr */
+  /* SiS_DDC_Port=0x3c4; */
+  SiS_DDC_Index=0x11;			/* TW: Bit 0 = SC;  Bit 1 = SD */
+  SiS_DDC_DataShift=0x00;
+  SiS_DDC_DeviceAddr=0xEA;  		/* TW: DAB (Device Address Byte) */
+
+  for(i=0;i<50;i++) {	/* TW: Do only 50 attempts to write */
+    SiS_SetSwitchDDC2();
+    SiS_SetStart();			/* TW: Set start condition */
+    tempah=SiS_DDC_DeviceAddr;
+    temp=SiS_WriteDDC2Data(tempah);	/* TW: Write DAB (S0=0=write) */
+    if(temp) continue;			/* TW:    (ERROR: no ack) */
+    tempah=tempbx&0x00FF;
+    temp=SiS_WriteDDC2Data(tempah);	/* TW: Write RAB */
+    if(temp) continue;			/* TW:    (ERROR: no ack) */
+    tempah=(tempbx&0xFF00)>>8;
+    temp=SiS_WriteDDC2Data(tempah);	/* TW: Write data */
+    if(temp) continue;			/* TW:    (ERROR: no ack) */
+    SiS_SetStop();			/* TW: Set stop condition */
+    return;
+  }
 }
 
 USHORT
-SiS_WriteDDC2Data (USHORT tempax)
+SiS_GetCH7005(USHORT tempbx)
 {
-	USHORT i, flag, temp;
+  USHORT tempah,temp,i;
 
-	flag = 0x80;
-	for (i = 0; i < 8; i++) {
-		SiS_SetSCLKLow ();
-		if (tempax & flag) {
-			SiS_SetRegANDOR (SiS_DDC_Port, SiS_DDC_Index, 0xFD,
-					 0x02);
-		} else {
-			SiS_SetRegANDOR (SiS_DDC_Port, SiS_DDC_Index, 0xFD,
-					 0x00);
-		}
-		SiS_SetSCLKHigh ();
-		flag = flag >> 1;
-	}
-	temp = SiS_CheckACK ();
-	return (temp);
+  /* TW: This has to be relative to BaseAddr, set by RegInit */
+  /* SiS_DDC_Port=0x3c4; */
+  SiS_DDC_Index=0x11;			/* TW: Bit 0 = SC;  Bit 1 = SD */
+  SiS_DDC_DataShift=0x00;
+  SiS_DDC_DeviceAddr=0xEA;		/* TW: DAB */
+  SiS_DDC_ReadAddr=tempbx;
+
+  for(i=0;i<50;i++) {	/* TW: Do only 50 attempts to write */
+    SiS_SetSwitchDDC2();
+    SiS_SetStart();			/* TW: Set start condition */
+    tempah=SiS_DDC_DeviceAddr;
+    temp=SiS_WriteDDC2Data(tempah);	/* TW: Write DAB (S0=0=write) */
+    if(temp) continue;			/* TW:        (ERROR: no ack) */
+    tempah=SiS_DDC_ReadAddr;		/* TW: Write RAB */
+    temp=SiS_WriteDDC2Data(tempah);
+    if(temp) continue;			/* TW:        (ERROR: no ack) */
+    SiS_SetStart();			/* TW: Re-start */
+    tempah=SiS_DDC_DeviceAddr;
+    tempah=tempah|0x01;
+    temp=SiS_WriteDDC2Data(tempah);	/* TW: DAB (S0=1=read) */
+    if(temp) continue;			/* TW:        (ERROR: no ack) */
+    tempah=SiS_ReadDDC2Data(tempah);	/* TW: Read byte */
+    SiS_SetStop();			/* TW: Stop condition */
+    return(tempah);
+  }
+  return(tempah);
+}
+
+void
+SiS_SetSwitchDDC2(void)
+{
+  USHORT i;
+
+  SiS_SetSCLKHigh();
+  for(i=0;i<1000;i++) {
+    SiS_GetReg1(SiS_DDC_Port,0x05);
+  }
+  SiS_SetSCLKLow();
+  for(i=0;i<1000;i++) {
+    SiS_GetReg1(SiS_DDC_Port,0x05);
+  }
+}
+
+/* TW: Set Chrontel 7005 start condition */
+/* TW: This is done by a SD high-to-low transition while SC is high */
+void
+SiS_SetStart(void)
+{
+  SiS_SetSCLKLow();					  /* TW: (SC->low)  */
+  SiS_SetRegANDOR(SiS_DDC_Port,SiS_DDC_Index,0xFD,0x02);  /* TW: SD->high */
+  SiS_SetSCLKHigh();					  /* TW: SC->high */
+  SiS_SetRegANDOR(SiS_DDC_Port,SiS_DDC_Index,0xFD,0x00);  /* TW: SD->low = start condition */
+  SiS_SetSCLKHigh();					  /* TW: (SC->low) */
+}
+
+/* TW: Set Chrontel 7005 stop condition */
+/* TW: This is done by a SD low-to-high transition while SC is high */
+void
+SiS_SetStop(void)
+{
+  SiS_SetSCLKLow();					  /* TW: (SC->low) */
+  SiS_SetRegANDOR(SiS_DDC_Port,SiS_DDC_Index,0xFD,0x00);  /* TW: SD->low   */
+  SiS_SetSCLKHigh();					  /* TW: SC->high  */
+  SiS_SetRegANDOR(SiS_DDC_Port,SiS_DDC_Index,0xFD,0x02);  /* TW: SD->high = stop condition */   
+  SiS_SetSCLKHigh();					  /* TW: (SC->high) */
 }
 
+/* TW: Write 8 bits of data */
 USHORT
-SiS_ReadDDC2Data (USHORT tempax)
+SiS_WriteDDC2Data(USHORT tempax)
 {
-	USHORT i, temp, getdata;
+  USHORT i,flag,temp;
 
-	getdata = 0;
-	for (i = 0; i < 8; i++) {
-		getdata = getdata << 1;
-		SiS_SetSCLKLow ();
-		SiS_SetRegANDOR (SiS_DDC_Port, SiS_DDC_Index, 0xFD, 0x02);
-		SiS_SetSCLKHigh ();
-		temp = SiS_GetReg1 (SiS_DDC_Port, SiS_DDC_Index);
-		if (temp & 0x02)
-			getdata = getdata | 0x01;
-	}
-	return (getdata);
+  flag=0x80;
+  for(i=0;i<8;i++) {
+    SiS_SetSCLKLow();					     /* TW: SC->low */
+    if(tempax&flag) {
+      SiS_SetRegANDOR(SiS_DDC_Port,SiS_DDC_Index,0xFD,0x02); /* TW: Write bit (1) to SD */
+    } else {
+      SiS_SetRegANDOR(SiS_DDC_Port,SiS_DDC_Index,0xFD,0x00); /* TW: Write bit (0) to SD */
+    }
+    SiS_SetSCLKHigh();					     /* TW: SC->high */
+    flag=flag>>1;
+  }
+  temp=SiS_CheckACK();					     /* TW: Check acknowledge */
+  return(temp);
 }
 
-void
-SiS_SetSCLKLow (void)
+USHORT
+SiS_ReadDDC2Data(USHORT tempax)
 {
-	USHORT temp;
+  USHORT i,temp,getdata;
 
-	SiS_SetRegANDOR (SiS_DDC_Port, SiS_DDC_Index, 0xFE, 0x00);	/* SetSCLKLow()  */
-	do {
-		temp = SiS_GetReg1 (SiS_DDC_Port, SiS_DDC_Index);
-	} while (temp & 0x01);
-	SiS_DDC2Delay ();
+  getdata=0;
+  for(i=0;i<8;i++) {
+    getdata=getdata<<1;
+    SiS_SetSCLKLow();
+    SiS_SetRegANDOR(SiS_DDC_Port,SiS_DDC_Index,0xFD,0x02);
+    SiS_SetSCLKHigh();
+    temp=SiS_GetReg1(SiS_DDC_Port,SiS_DDC_Index);
+    if(temp&0x02) getdata=getdata|0x01;
+  }
+  return(getdata);
 }
 
 void
-SiS_SetSCLKHigh (void)
+SiS_SetSCLKLow(void)
 {
-	USHORT temp;
+    USHORT temp;
 
-	SiS_SetRegANDOR (SiS_DDC_Port, SiS_DDC_Index, 0xFE, 0x01);	/* SetSCLKHigh()  */
-	do {
-		temp = SiS_GetReg1 (SiS_DDC_Port, SiS_DDC_Index);
-	} while (!(temp & 0x01));
-	SiS_DDC2Delay ();
+    SiS_SetRegANDOR(SiS_DDC_Port,SiS_DDC_Index,0xFE,0x00);      /* SetSCLKLow()  */
+    do {
+      temp=SiS_GetReg1(SiS_DDC_Port,SiS_DDC_Index);
+    } while(temp&0x01);
+    SiS_DDC2Delay();
 }
 
 void
-SiS_DDC2Delay (void)
+SiS_SetSCLKHigh(void)
 {
-	USHORT i;
+  USHORT temp;
 
-	for (i = 0; i < DDC2DelayTime; i++) {
-		SiS_GetReg1 (SiS_P3c4, 0x05);
-	}
+  SiS_SetRegANDOR(SiS_DDC_Port,SiS_DDC_Index,0xFE,0x01);      /* SetSCLKHigh()  */
+  do {
+    temp=SiS_GetReg1(SiS_DDC_Port,SiS_DDC_Index);
+  } while(!(temp&0x01));
+  SiS_DDC2Delay();
 }
 
-USHORT
-SiS_CheckACK (void)
+void
+SiS_DDC2Delay(void)
 {
-	USHORT tempah;
+  USHORT i;
 
-	SiS_SetSCLKLow ();
-	SiS_SetRegANDOR (SiS_DDC_Port, SiS_DDC_Index, 0xFD, 0x02);
-	SiS_SetSCLKHigh ();
-	tempah = SiS_GetReg1 (SiS_DDC_Port, SiS_DDC_Index);
-	SiS_SetSCLKLow ();
-	if (tempah & 0x02)
-		return (1);
-	else
-		return (0);
+   for(i=0;i<DDC2DelayTime;i++) {
+    SiS_GetReg1(SiS_P3c4,0x05);
+  }
 }
 
-void
-SiS_ModCRT1CRTC (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		 USHORT RefreshRateTableIndex)
+/* TW: Check acknowledge */
+/* Returns 0 if ack ok, non-0 if ack not ok */
+USHORT
+SiS_CheckACK(void)
 {
-	USHORT temp, tempah, i, modeflag, j;
-	USHORT ResInfo, DisplayType;
-	SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr = NULL;
-
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ResInfo */
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+Ext_ResInfo */
-	}
-
-	temp =
-	    SiS_GetLVDSCRT1Ptr (ROMAddr, ModeNo, ModeIdIndex,
-				RefreshRateTableIndex, &ResInfo, &DisplayType);
-	if (temp == 0) {
-		return;
-	}
-
-	switch (DisplayType) {
-	case 0:
-		LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1;
-		break;
-	case 1:
-		LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1;
-		break;
-	case 2:
-		LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1;
-		break;
-	case 3:
-		LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1_H;
-		break;
-	case 4:
-		LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1_H;
-		break;
-	case 5:
-		LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1_H;
-		break;
-	case 6:
-		LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2;
-		break;
-	case 7:
-		LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2;
-		break;
-	case 8:
-		LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2;
-		break;
-	case 9:
-		LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2_H;
-		break;
-	case 10:
-		LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2_H;
-		break;
-	case 11:
-		LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2_H;
-		break;
-	case 12:
-		LVDSCRT1Ptr = SiS_CHTVCRT1UNTSC;
-		break;
-	case 13:
-		LVDSCRT1Ptr = SiS_CHTVCRT1ONTSC;
-		break;
-	case 14:
-		LVDSCRT1Ptr = SiS_CHTVCRT1UPAL;
-		break;
-	case 15:
-		LVDSCRT1Ptr = SiS_CHTVCRT1OPAL;
-		break;
-	}
-
-	tempah = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x11);	/*unlock cr0-7  */
-	tempah = tempah & 0x7F;
-	SiS_SetReg1 (SiS_P3d4, 0x11, tempah);
-	tempah = (LVDSCRT1Ptr + ResInfo)->CR[0];
-	SiS_SetReg1 (SiS_P3d4, 0x0, tempah);
-	for (i = 0x02, j = 1; i <= 0x05; i++, j++) {
-		tempah = (LVDSCRT1Ptr + ResInfo)->CR[j];
-		SiS_SetReg1 (SiS_P3d4, i, tempah);
-	}
-	for (i = 0x06, j = 5; i <= 0x07; i++, j++) {
-		tempah = (LVDSCRT1Ptr + ResInfo)->CR[j];
-		SiS_SetReg1 (SiS_P3d4, i, tempah);
-	}
-	for (i = 0x10, j = 7; i <= 0x11; i++, j++) {
-		tempah = (LVDSCRT1Ptr + ResInfo)->CR[j];
-		SiS_SetReg1 (SiS_P3d4, i, tempah);
-	}
-	for (i = 0x15, j = 9; i <= 0x16; i++, j++) {
-		tempah = (LVDSCRT1Ptr + ResInfo)->CR[j];
-		SiS_SetReg1 (SiS_P3d4, i, tempah);
-	}
-
-	for (i = 0x0A, j = 11; i <= 0x0C; i++, j++) {
-		tempah = (LVDSCRT1Ptr + ResInfo)->CR[j];
-		SiS_SetReg1 (SiS_P3c4, i, tempah);
-	}
+  USHORT tempah;
 
-	tempah = (LVDSCRT1Ptr + ResInfo)->CR[14];
-	tempah = tempah & 0x0E0;
-	SiS_SetReg1 (SiS_P3c4, 0x0E, tempah);
-
-	tempah = (LVDSCRT1Ptr + ResInfo)->CR[14];
-	tempah = tempah & 0x01;
-	tempah = tempah << 5;
-	if (modeflag & DoubleScanMode) {
-		tempah = tempah | 0x080;
-	}
-	SiS_SetRegANDOR (SiS_P3d4, 0x09, ~0x020, tempah);
-	return;
+  SiS_SetSCLKLow();					  /* TW: (SC->low) */
+  SiS_SetRegANDOR(SiS_DDC_Port,SiS_DDC_Index,0xFD,0x02);  /* TW: (SD->high) */
+  SiS_SetSCLKHigh();					  /* TW: SC->high = clock impulse for ack */
+  tempah=SiS_GetReg1(SiS_DDC_Port,SiS_DDC_Index);	  /* TW: Read SD */
+  SiS_SetSCLKLow();					  /* TW: SC->low = end of clock impulse */
+  if(tempah&0x02) return(1);				  /* TW: Ack OK if bit = 0 */
+  else return(0);
+}
+
+/* TW: End of Chrontel 7005 functions ---------------------------- */
+
+void
+SiS_ModCRT1CRTC(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                USHORT RefreshRateTableIndex)
+{
+  USHORT temp,tempah,i,modeflag,j;
+  USHORT ResInfo,DisplayType;
+  SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr=NULL;
+
+  if(ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
+  }
+
+  temp= SiS_GetLVDSCRT1Ptr(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                       &ResInfo,&DisplayType);
+  if(temp==0){
+    return;
+  }
+
+  switch(DisplayType) {
+    case 0 : LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1;           break;
+    case 1 : LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1;          break;
+    case 2 : LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1;         break;
+    case 3 : LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1_H;         break;
+    case 4 : LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1_H;        break;
+    case 5 : LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1_H;       break;
+    case 6 : LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2;           break;
+    case 7 : LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2;          break;
+    case 8 : LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2;         break;
+    case 9 : LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2_H;         break;
+    case 10: LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2_H;        break;
+    case 11: LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2_H;       break;
+    case 12: LVDSCRT1Ptr = SiS_CHTVCRT1UNTSC;               break;
+    case 13: LVDSCRT1Ptr = SiS_CHTVCRT1ONTSC;               break;
+    case 14: LVDSCRT1Ptr = SiS_CHTVCRT1UPAL;                break;
+    case 15: LVDSCRT1Ptr = SiS_CHTVCRT1OPAL;                break;
+    case 16: LVDSCRT1Ptr = SiS_LVDSCRT1320x480_1;           break;
+  }
+
+  tempah=(UCHAR)SiS_GetReg1(SiS_P3d4,0x11);                        /*unlock cr0-7  */
+  tempah=tempah&0x7F;
+  SiS_SetReg1(SiS_P3d4,0x11,tempah);
+  tempah = (LVDSCRT1Ptr+ResInfo)->CR[0];
+  SiS_SetReg1(SiS_P3d4,0x0,tempah);
+  for(i=0x02,j=1;i<=0x05;i++,j++){
+    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
+    SiS_SetReg1(SiS_P3d4,i,tempah);
+  }
+  for(i=0x06,j=5;i<=0x07;i++,j++){
+    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
+    SiS_SetReg1(SiS_P3d4,i,tempah);
+  }
+  for(i=0x10,j=7;i<=0x11;i++,j++){
+    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
+    SiS_SetReg1(SiS_P3d4,i,tempah);
+  }
+  for(i=0x15,j=9;i<=0x16;i++,j++){
+    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
+    SiS_SetReg1(SiS_P3d4,i,tempah);
+  }
+  for(i=0x0A,j=11;i<=0x0C;i++,j++){
+    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
+    SiS_SetReg1(SiS_P3c4,i,tempah);
+  }
+
+  tempah = (LVDSCRT1Ptr+ResInfo)->CR[14];
+  tempah=tempah&0x0E0;
+  SiS_SetReg1(SiS_P3c4,0x0E,tempah);
+
+  tempah = (LVDSCRT1Ptr+ResInfo)->CR[14];
+  tempah=tempah&0x01;
+  tempah=tempah<<5;
+  if(modeflag&DoubleScanMode){
+    	tempah=tempah|0x080;
+  }
+  SiS_SetRegANDOR(SiS_P3d4,0x09,~0x020,tempah);
+  return;
 }
 
 /*301b*/
 void
-SiS_CHACRT1CRTC (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		 USHORT RefreshRateTableIndex)
+SiS_CHACRT1CRTC(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                USHORT RefreshRateTableIndex)
 {
-	USHORT temp, tempah, i, modeflag, j;
-	USHORT ResInfo, DisplayType;
-	SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr = NULL;
-
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ResInfo */
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+Ext_ResInfo */
-	}
-
-	temp =
-	    SiS_GetLVDSCRT1Ptr (ROMAddr, ModeNo, ModeIdIndex,
-				RefreshRateTableIndex, &ResInfo, &DisplayType);
-	if (temp == 0) {
-		return;
-	}
-
-	switch (DisplayType) {
-	case 0:
-		LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1;
-		break;
-	case 1:
-		LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1;
-		break;
-	case 2:
-		LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1;
-		break;
-	case 3:
-		LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1_H;
-		break;
-	case 4:
-		LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1_H;
-		break;
-	case 5:
-		LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1_H;
-		break;
-	case 6:
-		LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2;
-		break;
-	case 7:
-		LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2;
-		break;
-	case 8:
-		LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2;
-		break;
-	case 9:
-		LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2_H;
-		break;
-	case 10:
-		LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2_H;
-		break;
-	case 11:
-		LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2_H;
-		break;
-	case 12:
-		LVDSCRT1Ptr = SiS_CHTVCRT1UNTSC;
-		break;
-	case 13:
-		LVDSCRT1Ptr = SiS_CHTVCRT1ONTSC;
-		break;
-	case 14:
-		LVDSCRT1Ptr = SiS_CHTVCRT1UPAL;
-		break;
-	case 15:
-		LVDSCRT1Ptr = SiS_CHTVCRT1OPAL;
-		break;
-	}
-
-	tempah = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x11);	/*unlock cr0-7  */
-	tempah = tempah & 0x7F;
-	SiS_SetReg1 (SiS_P3d4, 0x11, tempah);
-	tempah = (LVDSCRT1Ptr + ResInfo)->CR[0];
-	SiS_SetReg1 (SiS_P3d4, 0x0, tempah);
-	for (i = 0x02, j = 1; i <= 0x05; i++, j++) {
-		tempah = (LVDSCRT1Ptr + ResInfo)->CR[j];
-		SiS_SetReg1 (SiS_P3d4, i, tempah);
-	}
-	for (i = 0x06, j = 5; i <= 0x07; i++, j++) {
-		tempah = (LVDSCRT1Ptr + ResInfo)->CR[j];
-		SiS_SetReg1 (SiS_P3d4, i, tempah);
-	}
-	for (i = 0x10, j = 7; i <= 0x11; i++, j++) {
-		tempah = (LVDSCRT1Ptr + ResInfo)->CR[j];
-		SiS_SetReg1 (SiS_P3d4, i, tempah);
-	}
-	for (i = 0x15, j = 9; i <= 0x16; i++, j++) {
-		tempah = (LVDSCRT1Ptr + ResInfo)->CR[j];
-		SiS_SetReg1 (SiS_P3d4, i, tempah);
-	}
-
-	for (i = 0x0A, j = 11; i <= 0x0C; i++, j++) {
-		tempah = (LVDSCRT1Ptr + ResInfo)->CR[j];
-		SiS_SetReg1 (SiS_P3c4, i, tempah);
-	}
-
-	tempah = (LVDSCRT1Ptr + ResInfo)->CR[14];
-	tempah = tempah & 0x0E0;
-	SiS_SetReg1 (SiS_P3c4, 0x0E, tempah);
-
-	tempah = (LVDSCRT1Ptr + ResInfo)->CR[14];
-	tempah = tempah & 0x01;
-	tempah = tempah << 5;
-	if (modeflag & DoubleScanMode) {
-		tempah = tempah | 0x080;
-	}
-	SiS_SetRegANDOR (SiS_P3d4, 0x09, ~0x020, tempah);
-	return;
+  USHORT temp,tempah,i,modeflag,j;
+  USHORT ResInfo,DisplayType;
+  SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr=NULL;
+
+  if(ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
+  }
+
+  temp= SiS_GetLVDSCRT1Ptr(ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                       &ResInfo,&DisplayType);
+  if(temp==0){
+    return;
+  }
+
+  switch(DisplayType) {
+    case 0 : LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1;           break;
+    case 1 : LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1;          break;
+    case 2 : LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1;         break;
+    case 3 : LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1_H;         break;
+    case 4 : LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1_H;        break;
+    case 5 : LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1_H;       break;
+    case 6 : LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2;           break;
+    case 7 : LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2;          break;
+    case 8 : LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2;         break;
+    case 9 : LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2_H;         break;
+    case 10: LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2_H;        break;
+    case 11: LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2_H;       break;
+    case 12: LVDSCRT1Ptr = SiS_CHTVCRT1UNTSC;               break;
+    case 13: LVDSCRT1Ptr = SiS_CHTVCRT1ONTSC;               break;
+    case 14: LVDSCRT1Ptr = SiS_CHTVCRT1UPAL;                break;
+    case 15: LVDSCRT1Ptr = SiS_CHTVCRT1OPAL;                break;
+  }
+
+  tempah=(UCHAR)SiS_GetReg1(SiS_P3d4,0x11);                        /*unlock cr0-7  */
+  tempah=tempah&0x7F;
+  SiS_SetReg1(SiS_P3d4,0x11,tempah);
+  tempah = (LVDSCRT1Ptr+ResInfo)->CR[0];
+  SiS_SetReg1(SiS_P3d4,0x0,tempah);
+  for(i=0x02,j=1;i<=0x05;i++,j++){
+    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
+    SiS_SetReg1(SiS_P3d4,i,tempah);
+  }
+  for(i=0x06,j=5;i<=0x07;i++,j++){
+    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
+    SiS_SetReg1(SiS_P3d4,i,tempah);
+  }
+  for(i=0x10,j=7;i<=0x11;i++,j++){
+    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
+    SiS_SetReg1(SiS_P3d4,i,tempah);
+  }
+  for(i=0x15,j=9;i<=0x16;i++,j++){
+    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
+    SiS_SetReg1(SiS_P3d4,i,tempah);
+  }
+
+  for(i=0x0A,j=11;i<=0x0C;i++,j++){
+    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
+    SiS_SetReg1(SiS_P3c4,i,tempah);
+  }
+
+  tempah = (LVDSCRT1Ptr+ResInfo)->CR[14];
+  tempah=tempah&0x0E0;
+  SiS_SetReg1(SiS_P3c4,0x0E,tempah);
+
+  tempah = (LVDSCRT1Ptr+ResInfo)->CR[14];
+  tempah=tempah&0x01;
+  tempah=tempah<<5;
+  if(modeflag&DoubleScanMode){
+    	tempah=tempah|0x080;
+  }
+  SiS_SetRegANDOR(SiS_P3d4,0x09,~0x020,tempah);
+  return;
 }
-
 /*add for LCDA*/
 
 BOOLEAN
-SiS_GetLCDACRT1Ptr (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		    USHORT RefreshRateTableIndex, USHORT * ResInfo,
-		    USHORT * DisplayType)
-{
-	USHORT tempbx = 0, modeflag = 0;
-	USHORT CRT2CRTC = 0;
-	/*301b */
-	if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-	    && (SiS_VBInfo & SetCRT2ToLCDA)) {
-		tempbx = SiS_LCDResInfo;
-		tempbx -= Panel800x600;
-		if (SiS_LCDInfo & LCDNonExpanding)
-			tempbx += 6;
-		if (modeflag & HalfDCLK)
-			tempbx += +3;
-		if (ModeNo <= 0x13) {
-			modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ResInfo */
-			CRT2CRTC = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
-		} else {
-			modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+Ext_ResInfo */
-			CRT2CRTC =
-			    SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
-		}
-	}
-	*ResInfo = CRT2CRTC & 0x3F;
-	*DisplayType = tempbx;
-	return 1;
+SiS_GetLCDACRT1Ptr(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+		   USHORT RefreshRateTableIndex,USHORT *ResInfo,
+		   USHORT *DisplayType)
+ {
+  USHORT tempbx=0,modeflag=0;
+  USHORT CRT2CRTC=0;
+ /*301b*/
+  if( (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+                    &&(SiS_VBInfo&SetCRT2ToLCDA) ) {
+    	tempbx = SiS_LCDResInfo;
+    	tempbx -= Panel800x600;
+    	if(SiS_LCDInfo&LCDNonExpanding) tempbx +=6;
+#if 0   /* TW: That can't work - test modeflag BEFORE reading it? */
+    	if(modeflag&HalfDCLK) tempbx +=+3;
+#endif
+    	if(ModeNo<=0x13) {
+    		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+    		CRT2CRTC = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+  	} else {
+    		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
+    		CRT2CRTC = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+  	}
+	/* TW: This belongs here I assume */
+	if(modeflag&HalfDCLK) tempbx +=+3;
+  }
+  *ResInfo = CRT2CRTC&0x3F;
+  *DisplayType = tempbx;
+  return 1;
 }
-
 /*end for 301b*/
 
 BOOLEAN
-SiS_GetLVDSCRT1Ptr (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		    USHORT RefreshRateTableIndex, USHORT * ResInfo,
-		    USHORT * DisplayType)
-{
-	USHORT tempbx, modeflag = 0;
-	USHORT Flag, CRT2CRTC;
-
-	if (ModeNo <= 0x13) {
-		modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;	/* si+St_ResInfo */
-		CRT2CRTC = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
-	} else {
-		modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;	/* si+Ext_ResInfo */
-		CRT2CRTC = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
-	}
-	if (!(SiS_VBInfo & SetInSlaveMode)) {
-		return 0;
-	}
-	Flag = 1;
-	tempbx = 0;
-	if (SiS_IF_DEF_CH7005 == 1) {
-		if (!(SiS_VBInfo & SetCRT2ToLCD)) {
-			Flag = 0;
-			tempbx = 12;
-			if (SiS_VBInfo & SetPALTV)
-				tempbx += 2;
-			if (SiS_VBInfo & SetCHTVOverScan)
-				tempbx += 1;
-		}
-	}
-	if (Flag) {
-		tempbx = SiS_LCDResInfo;
-		tempbx -= Panel800x600;
-		if (SiS_LCDInfo & LCDNonExpanding)
-			tempbx += 6;
-		if (modeflag & HalfDCLK)
-			tempbx += +3;
-	}
-
-	*ResInfo = CRT2CRTC & 0x3F;
-	*DisplayType = tempbx;
-	return 1;
+SiS_GetLVDSCRT1Ptr(ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+		USHORT RefreshRateTableIndex,USHORT *ResInfo,USHORT *DisplayType)
+ {
+  USHORT tempbx,modeflag=0;
+  USHORT Flag,CRT2CRTC;
+ 
+  if(ModeNo<=0x13) {
+    	modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+    	CRT2CRTC = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+  } else {
+    	modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
+    	CRT2CRTC = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+  }
+  if(!(SiS_VBInfo&SetInSlaveMode)){
+     return 0;
+  }
+  Flag=1;
+  tempbx=0;
+  if(SiS_IF_DEF_CH7005==1) {
+    if(!(SiS_VBInfo&SetCRT2ToLCD)) {
+      Flag=0;
+      tempbx =12;
+      if(SiS_VBInfo&SetPALTV) tempbx +=2;
+      if(SiS_VBInfo&SetCHTVOverScan) tempbx +=1;
+    }
+  }
+  if(Flag) {
+    tempbx =SiS_LCDResInfo;
+    tempbx -=Panel800x600;
+    if(SiS_LCDInfo&LCDNonExpanding) tempbx +=6;
+    if(modeflag&HalfDCLK) tempbx +=+3;
+  }
+  /*fstn*/
+   if(SiS_IF_DEF_FSTN){
+     if(SiS_LCDResInfo==Panel320x480){
+       tempbx=0x10;         /*not same with asmber code */
+     }
+   }
+  *ResInfo = CRT2CRTC&0x3F;
+  *DisplayType = tempbx;
+  return 1;
 }
 
 void
-SiS_SetCRT2ECLK (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
-		 USHORT RefreshRateTableIndex,
-		 PSIS_HW_DEVICE_INFO HwDeviceExtension)
-{
-	USHORT tempah, tempal;
-	USHORT P3cc = SiS_P3c9 + 3;
-	USHORT vclkindex = 0;
-
-	if (SiS_IF_DEF_TRUMPION == 0) {	/*no trumpion  */
-		tempal = SiS_GetReg2 (P3cc);
-		tempal = tempal & 0x0C;
-		vclkindex =
-		    SiS_GetVCLK2Ptr (ROMAddr, ModeNo, ModeIdIndex,
-				     RefreshRateTableIndex, HwDeviceExtension);
-	} else {		/*trumpion  */
-		SiS_SetFlag = SiS_SetFlag & (~ProgrammingCRT2);
-/*  tempal=*((UCHAR *)(ROMAddr+SiS_RefIndex+0x03));     &di+Ext_CRTVCLK  */
-		tempal = tempal & 0x03F;
-		if (tempal == 0x02) {	/*31.5MHz  */
-/*      SiS_RefIndex=SiS_RefIndex-Ext2StructSize;   */
-		}
-/*    SiS_RefIndex=GetVCLKPtr(ROMAddr,ModeNo);  */
-		SiS_SetFlag = SiS_SetFlag | ProgrammingCRT2;
-	}
-	tempal = 0x02B;
-	if (!(SiS_VBInfo & SetInSlaveMode)) {
-		tempal = tempal + 3;
-	}
-	SiS_SetReg1 (SiS_P3c4, 0x05, 0x86);
-	tempah = SiS_VCLKData[vclkindex].SR2B;
-	SiS_SetReg1 (SiS_P3c4, tempal, tempah);
-	tempal++;
-	tempah = SiS_VCLKData[vclkindex].SR2C;
-	SiS_SetReg1 (SiS_P3c4, tempal, tempah);
-	tempal++;
-	SiS_SetReg1 (SiS_P3c4, tempal, 0x80);
-	return;
+SiS_SetCRT2ECLK(ULONG ROMAddr, USHORT ModeNo,USHORT ModeIdIndex,
+           USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+  USHORT tempah,tempal;
+  USHORT P3cc=SiS_P3c9+3;
+  USHORT vclkindex=0;
+
+  if(SiS_IF_DEF_TRUMPION==0){  /*no trumpion  */
+    	tempal=SiS_GetReg2(P3cc);
+    	tempal=tempal&0x0C;
+    	vclkindex=SiS_GetVCLK2Ptr(ROMAddr,ModeNo,ModeIdIndex,
+                               RefreshRateTableIndex,HwDeviceExtension);
+  } else {  			/*trumpion  */
+    	SiS_SetFlag=SiS_SetFlag&(~ProgrammingCRT2);
+/*  	tempal=*((UCHAR *)(ROMAddr+SiS_RefIndex+0x03));     &di+Ext_CRTVCLK  */
+    	tempal=tempal&0x03F;
+    	if(tempal==0x02){ /*31.5MHz  */
+/*      	SiS_RefIndex=SiS_RefIndex-Ext2StructSize;   */
+    	}
+/*    	SiS_RefIndex=GetVCLKPtr(ROMAddr,ModeNo);  */
+    	SiS_SetFlag=SiS_SetFlag|ProgrammingCRT2;
+  }
+  tempal=0x02B;
+  if(!(SiS_VBInfo&SetInSlaveMode)){
+    	tempal=tempal+3;
+  }
+  SiS_SetReg1(SiS_P3c4,0x05,0x86);
+  tempah = SiS_VCLKData[vclkindex].SR2B;
+  SiS_SetReg1(SiS_P3c4,tempal,tempah);
+  tempal++;
+  tempah = SiS_VCLKData[vclkindex].SR2C;
+  SiS_SetReg1(SiS_P3c4,tempal,tempah);
+  tempal++;
+  SiS_SetReg1(SiS_P3c4,tempal,0x80);
+  return;
 }
 
 void
-SiS_SetDefCRT2ExtRegs (USHORT BaseAddr)
-{
-	USHORT temp;
-
-	if (SiS_IF_DEF_LVDS == 0) {
-		SiS_SetReg1 (SiS_Part1Port, 0x02, 0x40);
-		SiS_SetReg1 (SiS_Part4Port, 0x10, 0x80);
-		temp = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x16);
-		temp = temp & 0xC3;
-		SiS_SetReg1 (SiS_P3d4, 0x35, temp);
-	} else {
-		SiS_SetReg1 (SiS_P3d4, 0x32, 0x02);
-		SiS_SetReg1 (SiS_Part1Port, 0x02, 0x00);
-	}
+SiS_SetDefCRT2ExtRegs(USHORT BaseAddr)
+{
+  USHORT  temp;
+
+  if(SiS_IF_DEF_LVDS==0) {
+    SiS_SetReg1(SiS_Part1Port,0x02,0x40);
+    SiS_SetReg1(SiS_Part4Port,0x10,0x80);
+    temp=(UCHAR)SiS_GetReg1(SiS_P3c4,0x16);
+    temp=temp&0xC3;
+    SiS_SetReg1(SiS_P3d4,0x35,temp);
+  }
+  else {
+    SiS_SetReg1(SiS_P3d4,0x32,0x02);
+    SiS_SetReg1(SiS_Part1Port,0x02,0x00);
+  }
 }
 
-#ifdef CONFIG_FB_SIS_315
+#ifdef SIS315H
 /*
     for SIS310 O.E.M.
 */
@@ -5421,19 +5210,21 @@
 USHORT
 GetLCDPtrIndex (void)
 {
-	USHORT index;
+   USHORT index;
 
-	index = (SiS_LCDResInfo & 0x0F) - 1;
-	index *= 3;
-	if (SiS_LCDInfo & LCDNonExpanding)
-		index += 2;
-	else {
-		if (!(SiS_LCDInfo & LCDVESATiming))
-			index++;
-	}
+   index = (SiS_LCDResInfo & 0x0F)-1;
+   index *= 3;
+   if (SiS_LCDInfo&LCDNonExpanding)
+      index += 2;
+   else
+   {
+     if (!(SiS_LCDInfo&LCDVESATiming))
+       index++;
+   }
+
+  return index;
+ }
 
-	return index;
-}
 
 /*
 ---------------------------------------------------------
@@ -5447,555 +5238,573 @@
 ---------------------------------------------------------
 */
 USHORT
-GetTVPtrIndex (void)
+GetTVPtrIndex(void)
 {
-	USHORT index;
+  USHORT index;
 
-	index = 0;
-	if (SiS_VBInfo & SetPALTV)
-		index++;
-	if (SiS_VBInfo & SetCRT2ToHiVisionTV)	/* Hivision TV use PAL */
-		index++;
-	index *= 2;
-
-	if ((SiS_VBInfo & SetInSlaveMode) && (SiS_SetFlag & TVSimuMode))
-		index++;
-
-	return index;
+  index = 0;
+  if (SiS_VBInfo&SetPALTV)
+    index++;
+  if (SiS_VBInfo&SetCRT2ToHiVisionTV)  /* Hivision TV use PAL */
+    index++;
+  index *= 2;
+
+  if ((SiS_VBInfo&SetInSlaveMode)&&(SiS_SetFlag&TVSimuMode))
+    index++;
+
+  return index;
 }
 
 void
-SetDelayComp (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
-	      ULONG ROMAddr, USHORT ModeNo)
-{
-	USHORT Part1Port;
-	USHORT delay, index;
-
-	if (SiS_VBInfo & SetCRT2ToRAMDAC) {
-		delay = SiS310_CRT2DelayCompensation1;
-		if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-			delay = SiS310_CRT2DelayCompensation2;
-	} else if (SiS_VBInfo & SetCRT2ToLCD) {
-		index = GetLCDPtrIndex ();
-		delay = SiS310_LCDDelayCompensation1[index];
-		if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-			delay = SiS310_LCDDelayCompensation2[index];
-	} else {
-		index = GetTVPtrIndex ();
-		delay = SiS310_TVDelayCompensation1[index];
-		if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
-			delay = SiS310_TVDelayCompensation2[index];
-	}
-
-	Part1Port = BaseAddr + SIS_CRT2_PORT_04;
-	SiS_SetRegANDOR (Part1Port, 0x2D, ~0x0F, delay);	/* index 2D D[3:0] */
-
+SetDelayComp(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+             ULONG ROMAddr,USHORT ModeNo)
+{
+  USHORT Part1Port;
+  USHORT delay,index;
+
+  if (SiS_VBInfo&SetCRT2ToRAMDAC)
+  {
+     delay = SiS310_CRT2DelayCompensation1;
+     if (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+       delay = SiS310_CRT2DelayCompensation2;
+  }
+  else
+    if (SiS_VBInfo&SetCRT2ToLCD)
+    {
+       index = GetLCDPtrIndex();
+       delay = SiS310_LCDDelayCompensation1[index];
+       if (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+         delay = SiS310_LCDDelayCompensation2[index];
+    }
+    else
+    {
+       index = GetTVPtrIndex();
+       delay = SiS310_TVDelayCompensation1[index];
+       if (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+         delay = SiS310_TVDelayCompensation2[index];
+    }
+  Part1Port=BaseAddr+SIS_CRT2_PORT_04;
+  SiS_SetRegANDOR(Part1Port,0x2D,~0x0F,delay);  /* index 2D D[3:0] */
 }
 
 /*
 */
 void
-SetAntiFlicker (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
-		ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
-{
-	USHORT Part2Port;
-	USHORT index, temp;
-
-	Part2Port = BaseAddr + SIS_CRT2_PORT_10;
-	temp = GetTVPtrIndex ();
-	temp = (temp >> 1);	/* 0: NTSC, 1 :PAL, 2:HiTV */
-	if (ModeNo <= 0x13) {
-		index = SiS_SModeIDTable[ModeIdIndex].VB_StTVFlickerIndex;
-	} else {
-		index = SiS_EModeIDTable[ModeIdIndex].VB_ExtTVFlickerIndex;
-	}
-	temp = SiS310_TVAntiFlick1[temp][index];
-	temp <<= 4;
-
-	SiS_SetRegANDOR (Part2Port, 0x0A, ~0x70, temp);	/* index 0A D[6:4] */
-
-}
-
-void
-SetEdgeEnhance (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
-		ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
-{
-	USHORT Part2Port;
-	USHORT index, temp;
-
-	Part2Port = BaseAddr + SIS_CRT2_PORT_10;
-	temp = GetTVPtrIndex ();
-	temp = (temp >> 1);	/* 0: NTSC, 1 :PAL, 2:HiTV */
-	if (ModeNo <= 0x13) {
-		index = SiS_SModeIDTable[ModeIdIndex].VB_StTVEdgeIndex;	/* si+VB_StTVEdgeIndex */
-	} else {
-		index = SiS_EModeIDTable[ModeIdIndex].VB_ExtTVEdgeIndex;	/* si+VB_ExtTVEdgeIndex */
-	}
-	temp = SiS310_TVEdge1[temp][index];
-	temp <<= 5;
-
-	SiS_SetRegANDOR (Part2Port, 0x3A, ~0xE0, temp);	/* index 0A D[7:5] */
-
-}
-
-void
-SetYFilter (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
-	    ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
+SetAntiFlicker(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+               ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
 {
-	USHORT Part2Port, temp1, temp2;
-	USHORT index, temp, i, index1;
-	UCHAR OutputSelect = *pSiS_OutputSelect;
-	Part2Port = BaseAddr + SIS_CRT2_PORT_10;
-	temp = GetTVPtrIndex ();
-	temp >>= 1;		/* 0: NTSC, 1 :PAL, 2:HiTV */
-
-	if (ModeNo <= 0x13) {
-		index = SiS_SModeIDTable[ModeIdIndex].VB_StTVYFilterIndex;
-	} else {
-		index = SiS_EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
-	}
-
-	if (SiS_VBInfo & SetCRT2ToHiVisionTV)	/* Hivision TV use PAL */
-		temp = 0;
+  USHORT Part2Port;
+  USHORT index,temp;
 
-	/*301b */
-	if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
-		for (i = 0x35; i <= 0x38; i++) {
-			SiS_SetReg1 (Part2Port, i,
-				     SiS310_TVYFilter2[temp][index][i - 0x35]);
-		}
-		for (i = 0x48; i <= 0x4A; i++) {
-			SiS_SetReg1 (Part2Port, i,
-				     SiS310_TVYFilter2[temp][index][(i - 0x48) +
-								    0x04]);
-		}
-	}
-	/*end 301b */
-	else {
-		for (i = 0x35; i <= 0x38; i++) {
-			SiS_SetReg1 (Part2Port, i,
-				     SiS310_TVYFilter1[temp][index][i - 0x35]);
-		}
-	}
+  Part2Port=BaseAddr+SIS_CRT2_PORT_10;
+  temp = GetTVPtrIndex();
+  temp = (temp>>1);  /* 0: NTSC, 1 :PAL, 2:HiTV */
+  if (ModeNo<=0x13)
+  {
+    index = SiS_SModeIDTable[ModeIdIndex].VB_StTVFlickerIndex;
+  }
+  else
+  {
+    index = SiS_EModeIDTable[ModeIdIndex].VB_ExtTVFlickerIndex;
+  }
+  temp = SiS310_TVAntiFlick1[temp][index];
+  temp  <<= 4;
+
+  SiS_SetRegANDOR(Part2Port,0x0A,~0x70,temp);  /* index 0A D[6:4] */
+
+}
+
+void
+SetEdgeEnhance (PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+                ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
+{
+  USHORT Part2Port;
+  USHORT index,temp;
+
+  Part2Port=BaseAddr+SIS_CRT2_PORT_10;
+  temp = GetTVPtrIndex();
+  temp = (temp>>1);   /* 0: NTSC, 1 :PAL, 2:HiTV */
+  if (ModeNo<=0x13)
+  {
+    index = SiS_SModeIDTable[ModeIdIndex].VB_StTVEdgeIndex;   /* si+VB_StTVEdgeIndex */
+  }
+  else
+  {
+    index = SiS_EModeIDTable[ModeIdIndex].VB_ExtTVEdgeIndex;  /* si+VB_ExtTVEdgeIndex */
+  }
+  temp = SiS310_TVEdge1[temp][index];
+  temp  <<= 5;
+
+  SiS_SetRegANDOR(Part2Port,0x3A,~0xE0,temp);  /* index 0A D[7:5] */
+
+}
+
+void
+SetYFilter(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+           ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
+{
+  USHORT Part2Port,temp1,temp2;
+  USHORT index,temp,i,index1;
+  UCHAR  OutputSelect=*pSiS_OutputSelect;
+  Part2Port=BaseAddr+SIS_CRT2_PORT_10;
+  temp = GetTVPtrIndex();
+  temp >>= 1;  /* 0: NTSC, 1 :PAL, 2:HiTV */
+
+  if (ModeNo<=0x13)
+  {
+    index =  SiS_SModeIDTable[ModeIdIndex].VB_StTVYFilterIndex;
+  }
+  else
+  {
+    index =  SiS_EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
+  }
+
+  if (SiS_VBInfo&SetCRT2ToHiVisionTV)  /* Hivision TV use PAL */
+   temp = 0;
+
+  /*301b*/
+  if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+    for(i=0x35;i<=0x38;i++)
+   {
+     SiS_SetReg1(Part2Port,i,SiS310_TVYFilter2[temp][index][i-0x35]);
+   }
+   for(i=0x48;i<=0x4A;i++)
+   {
+     SiS_SetReg1(Part2Port,i,SiS310_TVYFilter2[temp][index][(i-0x48)+0x04]);
+   }
+  }
+      /*end 301b*/
+  else{
+   for(i=0x35;i<=0x38;i++)
+   {
+     SiS_SetReg1(Part2Port,i,SiS310_TVYFilter1[temp][index][i-0x35]);
+   }
+  }
 /*add PALMN*/
-	if (OutputSelect & EnablePALMN) {
-		index1 = SiS_GetReg1 (SiS_P3d4, 0x31);
-		temp1 = index1 & 0x01;
-		index1 = SiS_GetReg1 (SiS_P3d4, 0x38);
-		temp2 = index1 & 0xC0;
-		if (temp1) {
-			if (temp2 == 0x40) {
-				if ((SiS_VBType & VB_SIS301B)
-				    || (SiS_VBType & VB_SIS302B)) {
-					for (i = 0x35; i <= 0x38; i++) {
-						SiS_SetReg1 (Part2Port, i,
-							     SiS310_PALMFilter2
-							     [index][i - 0x35]);
-					}
-					for (i = 0x48; i <= 0x4A; i++) {
-						SiS_SetReg1 (Part2Port, i,
-							     SiS310_PALMFilter2
-							     [index][(i - 0x48)
-								     + 0x04]);
-					}
-				} else {
-					for (i = 0x35; i <= 0x38; i++)
-						SiS_SetReg1 (Part2Port, i,
-							     SiS310_PALMFilter
-							     [index][i - 0x35]);
-				}
-			}
-			if (temp2 == 0x80) {
-				if ((SiS_VBType & VB_SIS301B)
-				    || (SiS_VBType & VB_SIS302B)) {
-					for (i = 0x35; i <= 0x38; i++) {
-						SiS_SetReg1 (Part2Port, i,
-							     SiS310_PALNFilter2
-							     [index][i - 0x35]);
-					}
-					for (i = 0x48; i <= 0x4A; i++) {
-						SiS_SetReg1 (Part2Port, i,
-							     SiS310_PALNFilter2
-							     [index][(i - 0x48)
-								     + 0x04]);
-					}
-				} else {
-					for (i = 0x35; i <= 0x38; i++)
-						SiS_SetReg1 (Part2Port, i,
-							     SiS310_PALNFilter
-							     [index][i - 0x35]);
-				}
-			}
-		}
-	}
-	/*end PALMN */
-}
-
-void
-SetPhaseIncr (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
-	      ULONG ROMAddr, USHORT ModeNo)
-{
-	USHORT Part2Port;
-	USHORT index, temp, temp1, i;
-
-	Part2Port = BaseAddr + SIS_CRT2_PORT_10;
-	temp = GetTVPtrIndex ();
-	/* 0: NTSC Graphics, 1: NTSC Text, 2 :PAL Graphics, 3 :PAL Text, 4:HiTV Graphics 5:HiTV Text */
-	index = temp % 2;
-	temp >>= 1;		/* 0: NTSC, 1 :PAL, 2:HiTV */
-	temp1 = SiS_GetReg1 (SiS_P3d4, 0x38);	/*if PALMN Not Set */
-	temp1 = temp1 & 0xC0;
-	if (!temp1) {
-		for (i = 0x31; i <= 0x34; i++) {
-			if ((SiS_VBType & VB_SIS301B)
-			    || (SiS_VBType & VB_SIS302B))
-				    SiS_SetReg1 (Part2Port, i,
-						 SiS310_TVPhaseIncr2[temp]
-						 [index][i - 0x31]);
-			else
-				SiS_SetReg1 (Part2Port, i,
-					     SiS310_TVPhaseIncr1[temp][index][i
-									      -
-									      0x31]);
-		}
-	}
-}
-void
-SiS_OEM310Setting (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
-		   ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
-{
-	SetDelayComp (HwDeviceExtension, BaseAddr, ROMAddr, ModeNo);
-	if (SiS_VBInfo & SetCRT2ToTV) {
-		SetAntiFlicker (HwDeviceExtension, BaseAddr, ROMAddr, ModeNo,
-				ModeIdIndex);
-		SetPhaseIncr (HwDeviceExtension, BaseAddr, ROMAddr, ModeNo);
-		SetYFilter (HwDeviceExtension, BaseAddr, ROMAddr, ModeNo,
-			    ModeIdIndex);
-		SetEdgeEnhance (HwDeviceExtension, BaseAddr, ROMAddr, ModeNo,
-				ModeIdIndex);
-	}
+    if(OutputSelect&EnablePALMN) {                  
+      index1=SiS_GetReg1(SiS_P3d4,0x31);
+      temp1=index1&0x01;
+      index1=SiS_GetReg1(SiS_P3d4,0x38);
+      temp2=index1&0xC0;
+      if(temp1){
+         if(temp2==0x40){
+              if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+                 for(i=0x35;i<=0x38;i++){
+                      SiS_SetReg1(Part2Port,i,SiS310_PALMFilter2[index][i-0x35]);
+                     }
+                 for(i=0x48;i<=0x4A;i++) {
+                       SiS_SetReg1(Part2Port,i,SiS310_PALMFilter2[index][(i-0x48)+0x04]);
+                     }
+                }
+              else{ 
+                 for(i=0x35;i<=0x38;i++)
+                 SiS_SetReg1(Part2Port,i,SiS310_PALMFilter[index][i-0x35]);
+                 } 
+             }
+         if(temp2==0x80){ 
+              if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+                 for(i=0x35;i<=0x38;i++){
+                      SiS_SetReg1(Part2Port,i,SiS310_PALNFilter2[index][i-0x35]);
+                     }
+                 for(i=0x48;i<=0x4A;i++) {
+                       SiS_SetReg1(Part2Port,i,SiS310_PALNFilter2[index][(i-0x48)+0x04]);
+                     }
+             }
+              else{
+                 for(i=0x35;i<=0x38;i++)
+                 SiS_SetReg1(Part2Port,i,SiS310_PALNFilter[index][i-0x35]);
+                }
+          }
+      }
+    }
+    /*end PALMN*/
+}
+
+void
+SetPhaseIncr(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+             ULONG ROMAddr,USHORT ModeNo)
+{
+  USHORT Part2Port;
+  USHORT index,temp,temp1,i;
+
+  Part2Port=BaseAddr+SIS_CRT2_PORT_10;
+  temp = GetTVPtrIndex();
+  /* 0: NTSC Graphics, 1: NTSC Text, 2 :PAL Graphics, 3 :PAL Text, 4:HiTV Graphics 5:HiTV Text */
+  index = temp % 2;
+  temp >>= 1;   /* 0: NTSC, 1 :PAL, 2:HiTV */
+  temp1=SiS_GetReg1(SiS_P3d4,0x38);        /*if PALMN Not Set*/
+  temp1=temp1&0xC0; 
+  if(!temp1){
+  	for(i=0x31;i<=0x34;i++)
+  	{
+    		if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+     			SiS_SetReg1(Part2Port,i,SiS310_TVPhaseIncr2[temp][index][i-0x31]);
+    		else
+     			SiS_SetReg1(Part2Port,i,SiS310_TVPhaseIncr1[temp][index][i-0x31]);
+  	}
+  }
+}
+
+void
+SiS_OEM310Setting(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+                  ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
+{
+   SetDelayComp(HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
+   if (SiS_VBInfo&SetCRT2ToTV) {
+       SetAntiFlicker(HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+       SetPhaseIncr(HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
+       SetYFilter(HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+       SetEdgeEnhance(HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+   }
 }
 
 #endif
 
-#ifdef CONFIG_FB_SIS_300
+#ifdef SIS300
 /*
     for SIS300 O.E.M.
 */
 
 USHORT
-GetRevisionID (PSIS_HW_DEVICE_INFO HwDeviceExtension)
+GetRevisionID(PSIS_HW_DEVICE_INFO HwDeviceExtension)
 {
-#ifdef CONFIG_FB_SIS_300
-	ULONG temp1, base;
-	USHORT temp2 = 0;
-	/* add to set SR14 */
-	if ((HwDeviceExtension->jChipType == SIS_540) ||
-	    (HwDeviceExtension->jChipType == SIS_630) ||
-	    (HwDeviceExtension->jChipType == SIS_730)) {
-		base = 0x80000008;
-		OutPortLong (base, 0xcf8);
-		temp1 = InPortLong (0xcfc);
-		temp1 = temp1 & 0x000000FF;
-		temp2 = (USHORT) (temp1);
-		return temp2;
-	}
-#endif
+   ULONG temp1,base;
+   USHORT temp2=0; 
+   
+   if((HwDeviceExtension->jChipType==SIS_540)||
+      (HwDeviceExtension->jChipType==SIS_630)||
+      (HwDeviceExtension->jChipType==SIS_730)) {
+     	base=0x80000008;
+     	OutPortLong(base,0xcf8);
+     	temp1=InPortLong(0xcfc);
+     	temp1=temp1&0x000000FF;
+     	temp2=(USHORT)(temp1);
+    	return temp2;
+   }
+   return 0;
 }
 
 USHORT
-GetOEMLCDPtr (PSIS_HW_DEVICE_INFO HwDeviceExtension)
+GetOEMTVPtr(void)
 {
-	USHORT temp, tempbx = 0, tempax;
+  USHORT index;
 
-	if (SiS_IF_DEF_LVDS == 0) {
-		if (SiS_VBInfo & SetCRT2ToLCD) {	/* LCD */
-			tempax = SiS_LCDResInfo;
-			tempbx = SiS_LCDResInfo;
-			tempbx = tempbx - Panel1024x768;
-			if (!(SiS_SetFlag & LCDVESATiming)) {
-				tempbx += 4;
-				temp = GetRevisionID (HwDeviceExtension);
-				if ((HwDeviceExtension->jChipType == SIS_540)
-				    && (temp < 1))
-					tempbx += 4;
-				if ((HwDeviceExtension->jChipType == SIS_630)
-				    && (temp < 3))
-					tempbx += 4;
-			}
-			if ((tempax == Panel1024x768)
-			    && (SiS_LCDInfo == LCDNonExpanding)) {
-				tempbx = tempbx + 3;
-			}
-			/*add OEMLCDPanelIDSupport */
-			tempbx = SiS_LCDTypeInfo;
-			tempbx = tempbx << 1;
-			if (!(SiS_SetFlag & LCDVESATiming))
-				tempbx = tempbx + 1;
-		}
-	}
-	tempbx *= 2;
-	return tempbx;
+  index = 0;
+  if (!(SiS_VBInfo&SetInSlaveMode))
+      	index=index+4;
+  
+  if (SiS_VBInfo&SetCRT2ToSCART){
+      	index=index+2;
+  } else {
+     	if (SiS_VBInfo&SetCRT2ToHiVisionTV)
+       		index=index+3;
+     	else {
+          	if(SiS_VBInfo&SetPALTV)
+          		index=index+1;
+        }
+  }
+  return index;
+}
+
+/* TW: This is not for LVDS/Chrontel */
+void
+SetOEMTVDelay(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+              ULONG ROMAddr,USHORT ModeNo)
+{
+  USHORT Part1Port;
+  USHORT index,temp,ModeIdIndex;
+
+  Part1Port=BaseAddr+SIS_CRT2_PORT_04;
+  ModeIdIndex=SiS_SearchVBModeID(ROMAddr,ModeNo);
+  temp = GetOEMTVPtr();
+  index = SiS_VBModeIDTable[ModeIdIndex].VB_TVDelayIndex;
+  temp = SiS300_OEMTVDelay[temp][index];
+  temp=temp&0x3c;
+  SiS_SetRegANDOR(Part1Port,0x13,~0x3C,temp);  /* index 0A D[6:4] */
 }
 
 USHORT
-GetOEMTVPtr (void)
+GetOEMLCDPtr(PSIS_HW_DEVICE_INFO HwDeviceExtension)
 {
-	USHORT index;
+  /* USHORT temp,tempax; */
+  USHORT tempbx=0;
 
-	index = 0;
-	if (!(SiS_VBInfo & SetInSlaveMode))
-		index = index + 4;
+  if(SiS_IF_DEF_LVDS==0) {
+#if 0
+  	tempax=tempbx=SiS_LCDResInfo;
+      	tempbx=tempbx-Panel1024x768;
+     	if(!(SiS_SetFlag&LCDVESATiming)) {
+        	tempbx+=4;
+        	temp=GetRevisionID(HwDeviceExtension);
+        	if((HwDeviceExtension->jChipType == SIS_540)&&(temp<1))
+        		tempbx+=4;
+        	if((HwDeviceExtension->jChipType == SIS_630)&&(temp<3))
+        		tempbx+=4;
+       	}
+     	if((tempax==Panel1024x768)&&(SiS_LCDInfo&LCDNonExpanding)){
+        	tempbx=tempbx+3;
+       	}
+#endif
 
-	if (SiS_VBInfo & SetCRT2ToSCART) {
-		index = index + 2;
-	} else {
-		if (SiS_VBInfo & SetCRT2ToHiVisionTV)
-			index = index + 3;
-		else {
-			if (SiS_VBInfo & SetPALTV)
-				index = index + 1;
-		}
-	}
-	return index;
+	/* TW: This is total bullshit. First, we calculate tempbx, now
+	 *     we overwrite it?! (Therefore commented code above)
+	 */
+
+     	/*add OEMLCDPanelIDSupport*/
+        tempbx=SiS_LCDTypeInfo;
+
+#if 0   /* TW: Commented for DEBUG: */
+        tempbx=tempbx<<1;
+        if(!(SiS_SetFlag&LCDVESATiming))
+        	tempbx=tempbx+1;
+	tempbx*=2;
+	/* TW: The above code results in eg. 0xc * 2 * 2 = 48, but Delay2 table has
+	 *     only 32 entries. Thus, this can't work */
+#endif
+        /* TW: Don't think that 301(B) bridges need different LCD delay... */
+  	tempbx = SiS_LCDTypeInfo;
+	if(SiS_LCDInfo&LCDNonExpanding){
+      		tempbx=tempbx+16;
+	}
+  } else {  /* TW: Added LVDS code */
+  	tempbx = SiS_LCDTypeInfo;
+	if(SiS_LCDInfo&LCDNonExpanding){
+      		tempbx=tempbx+16;
+	}
+  }
+  return tempbx;
+}
+
+#if 0
+/* TW: Original code - can't work (eg. exceeds arrays by re-using temp,
+       writes to Part2(!)Port unlike TVDelay, etc...) */
+void
+SetOEMLCDDelay(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+               ULONG ROMAddr,USHORT ModeNo)
+{
+  USHORT Part2Port;
+  USHORT index,temp,ModeIdIndex;
+  Part2Port=BaseAddr+SIS_CRT2_PORT_10;
+  ModeIdIndex=SiS_SearchVBModeID(ROMAddr,ModeNo);
+  temp = GetOEMLCDPtr(HwDeviceExtension);
+  index = SiS_VBModeIDTable[ModeIdIndex].VB_LCDDelayIndex;
+  temp = SiS300_OEMLCDDelay1[temp][index];
+   /*add OEMLCDPanelIDSupport*/
+  temp = SiS300_OEMLCDDelay2[temp][index];
+  temp=temp&0x3c;
+  SiS_SetRegANDOR(Part2Port,0x13,~0x3C,temp);  /* index 0A D[6:4] */
 }
+#endif
 
-void
-SetOEMTVDelay (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
-	       ULONG ROMAddr, USHORT ModeNo)
-{
-	USHORT Part1Port;
-	USHORT index, temp, ModeIdIndex;
-	Part1Port = BaseAddr + SIS_CRT2_PORT_04;
-	ModeIdIndex = SiS_SearchVBModeID (ROMAddr, ModeNo);
-	temp = GetOEMTVPtr ();
-	index = SiS_VBModeIDTable[ModeIdIndex].VB_TVDelayIndex;
-	temp = SiS300_OEMTVDelay[temp][index];
-	temp = temp & 0x3c;
-	SiS_SetRegANDOR (Part1Port, 0x13, ~0x3C, temp);	/* index 0A D[6:4] */
-}
+/* TW: Although I assume that the code above does not work correctly,
+ *     I won't change it for non-LVDS machines until someone tells me so.
+ */
+void
+SetOEMLCDDelay(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+               ULONG ROMAddr,USHORT ModeNo)
+{
+  USHORT Part1Port, Part2Port;
+  USHORT index,temp,ModeIdIndex;
+
+  Part1Port=BaseAddr+SIS_CRT2_PORT_04;
+  Part2Port=BaseAddr+SIS_CRT2_PORT_10;
+
+  ModeIdIndex=SiS_SearchVBModeID(ROMAddr,ModeNo);
+  temp = GetOEMLCDPtr(HwDeviceExtension);
+  index = SiS_VBModeIDTable[ModeIdIndex].VB_LCDDelayIndex; /* TW: Always zero... */
+  if (SiS_IF_DEF_LVDS == 1) {
+  	/* TW: Added for LVDS: Assuming Part_1!!!_Port to be the correct one */
+    	temp = SiS300_OEMLCDDelay3[temp][index];
+	temp=temp&0x3c;
+  	SiS_SetRegANDOR(Part1Port,0x13,~0x3C,temp);  /* index 0A D[6:4] */
+  } else {
+        /* temp = SiS300_OEMLCDDelay1[temp][index];  */
+	/*  TW: This must be wrong: temp is eg. 48 and
+		thus exceeds array size of Delay2 table! */
 
-void
-SetOEMLCDDelay (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
-		ULONG ROMAddr, USHORT ModeNo)
-{
-	USHORT Part2Port;
-	USHORT index, temp, ModeIdIndex;
-	Part2Port = BaseAddr + SIS_CRT2_PORT_10;
-	ModeIdIndex = SiS_SearchVBModeID (ROMAddr, ModeNo);
-	temp = GetOEMLCDPtr (HwDeviceExtension);
-	index = SiS_VBModeIDTable[ModeIdIndex].VB_LCDDelayIndex;
-	temp = SiS300_OEMLCDDelay1[temp][index];
-	/*add OEMLCDPanelIDSupport */
+        /*add OEMLCDPanelIDSupport*/
+
+#if 0  /* TW: Commented for DEBUG */
 	temp = SiS300_OEMLCDDelay2[temp][index];
-	temp = temp & 0x3c;
-	SiS_SetRegANDOR (Part2Port, 0x13, ~0x3C, temp);	/* index 0A D[6:4] */
+	temp=temp&0x3c;
+  	SiS_SetRegANDOR(Part2Port,0x13,~0x3C,temp);  /* index 0A D[6:4] */
+#endif
+
+        /* TW: 301B reported not working. Maybe because of the above bullshit? */
+	/*     Do it like for LVDS now. 0x13 seems to be the LCD delay anyway */
+        temp = SiS300_OEMLCDDelay3[temp][index];
+	temp=temp&0x3c;
+  	SiS_SetRegANDOR(Part1Port,0x13,~0x3C,temp);  /* index 0A D[6:4] */
+  }
 }
 
 /*
 */
 void
-SetOEMAntiFlicker (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
-		   ULONG ROMAddr, USHORT ModeNo)
-{
-	USHORT Part2Port;
-	USHORT index, temp;
-	USHORT ModeIdIndex;
-	Part2Port = BaseAddr + SIS_CRT2_PORT_10;
-	ModeIdIndex = SiS_SearchVBModeID (ROMAddr, ModeNo);
-	temp = GetOEMTVPtr ();
-	index = SiS_VBModeIDTable[ModeIdIndex].VB_TVFlickerIndex;
-	temp = SiS300_OEMTVFlicker[temp][index];
-	temp = temp & 0x70;
-	SiS_SetRegANDOR (Part2Port, 0x0A, ~0x70, temp);	/* index 0A D[6:4] */
-
-}
-
-void
-SetOEMPhaseIncr (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
-		 ULONG ROMAddr, USHORT ModeNo)
-{
-	USHORT Part2Port;
-	USHORT index, i, ModeIdIndex;
-
-	Part2Port = BaseAddr + SIS_CRT2_PORT_10;
-	// temp = GetTVPtrIndex();
-	/* 0: NTSC Graphics, 1: NTSC Text, 2 :PAL Graphics, 3 :PAL Text, 4:HiTV Graphics 5:HiTV Text */
-	// index = temp % 2;
-	// temp >>= 1;   /* 0: NTSC, 1 :PAL, 2:HiTV */
-	ModeIdIndex = SiS_SearchVBModeID (ROMAddr, ModeNo);
-	index = SiS_VBModeIDTable[ModeIdIndex].VB_TVPhaseIndex;
-	if (SiS_VBInfo & SetInSlaveMode) {
-		if (SiS_VBInfo & SetPALTV) {
-			for (i = 0x31; i <= 0x34; i++)
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_StPALPhase[index][i -
-								      0x31]);
-		} else {
-			for (i = 0x31; i <= 0x34; i++)
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_StNTSCPhase[index][i -
-								       0x31]);
-		}
-		if (SiS_VBInfo & SetCRT2ToSCART) {
-			for (i = 0x31; i <= 0x34; i++)
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_StSCARTPhase[index][i -
-									0x31]);
-		}
-	} else {
-		if (SiS_VBInfo & SetPALTV) {
-			for (i = 0x31; i <= 0x34; i++)
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_ExtPALPhase[index][i -
-								       0x31]);
-		} else {
-			for (i = 0x31; i <= 0x34; i++)
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_ExtNTSCPhase[index][i -
-									0x31]);
-		}
-		if (SiS_VBInfo & SetCRT2ToSCART) {
-			for (i = 0x31; i <= 0x34; i++)
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_ExtSCARTPhase[index][i -
-									 0x31]);
-		}
-	}
-}
-
-void
-SetOEMYFilter (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
-	       ULONG ROMAddr, USHORT ModeNo)
+SetOEMAntiFlicker(PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                  USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo)
 {
-	USHORT Part2Port;
-	USHORT index, temp1, temp2, i, ModeIdIndex, index1;
-	Part2Port = BaseAddr + SIS_CRT2_PORT_10;
-	/*301b */
-	ModeIdIndex = SiS_SearchVBModeID (ROMAddr, ModeNo);
-	index = SiS_VBModeIDTable[ModeIdIndex].VB_TVYFilterIndex;
-	if (SiS_VBInfo & SetInSlaveMode) {
-		if (SiS_VBInfo & SetPALTV) {
-			for (i = 0x35; i <= 0x38; i++)
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_StPALFilter[index][i -
-								       0x35]);
-		} else {
-			for (i = 0x35; i <= 0x38; i++)
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_StNTSCFilter[index][i -
-									0x35]);
-		}
-	} else {
-		if (SiS_VBInfo & SetPALTV) {
-			for (i = 0x35; i <= 0x38; i++)
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_ExtPALFilter[index][i -
-									0x35]);
-		} else {
-			for (i = 0x35; i <= 0x38; i++)
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_ExtNTSCFilter[index][i -
-									 0x35]);
-		}
-	}
-
-	if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
-		if (SiS_VBInfo & SetPALTV) {
-			for (i = 0x35; i <= 0x38; i++) {
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_PALFilter2[index][i -
-								      0x35]);
-			}
-			for (i = 0x48; i <= 0x4A; i++) {
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_PALFilter2[index][(i - 0x48)
-								      + 0x04]);
-			}
-		} else {
-			for (i = 0x35; i <= 0x38; i++) {
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_NTSCFilter2[index][i -
-								       0x35]);
-			}
-			for (i = 0x48; i <= 0x4A; i++) {
-				SiS_SetReg1 (Part2Port, i,
-					     SiS300_NTSCFilter2[index][
-								       (i -
-									0x48) +
-								       0x04]);
-			}
-		}
-	}
+  USHORT Part2Port;
+  USHORT index,temp;
+  USHORT ModeIdIndex;
+
+  Part2Port=BaseAddr+SIS_CRT2_PORT_10;
+  ModeIdIndex=SiS_SearchVBModeID(ROMAddr,ModeNo);
+  temp = GetOEMTVPtr();
+  index = SiS_VBModeIDTable[ModeIdIndex].VB_TVFlickerIndex;
+  temp = SiS300_OEMTVFlicker[temp][index];
+  temp=temp&0x70;
+  SiS_SetRegANDOR(Part2Port,0x0A,~0x70,temp);  /* index 0A D[6:4] */
+}
+
+void
+SetOEMPhaseIncr(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+                ULONG ROMAddr,USHORT ModeNo)
+{
+  USHORT Part2Port;
+  USHORT index,i,ModeIdIndex;
+
+  Part2Port=BaseAddr+SIS_CRT2_PORT_10;
+  /* temp = GetTVPtrIndex();*/
+  /* 0: NTSC Graphics, 1: NTSC Text, 2 :PAL Graphics, 3 :PAL Text, 4:HiTV Graphics 5:HiTV Text */
+  /* index = temp % 2;*/
+  /* temp >>= 1;   0: NTSC, 1 :PAL, 2:HiTV */
+  ModeIdIndex=SiS_SearchVBModeID(ROMAddr,ModeNo);
+  index = SiS_VBModeIDTable[ModeIdIndex].VB_TVPhaseIndex;
+  if (SiS_VBInfo&SetInSlaveMode){
+      if(SiS_VBInfo&SetPALTV){  
+         for(i=0x31;i<=0x34;i++)
+        	SiS_SetReg1(Part2Port,i,SiS300_StPALPhase[index][i-0x31]);
+      } else {
+          for(i=0x31;i<=0x34;i++)
+        	SiS_SetReg1(Part2Port,i,SiS300_StNTSCPhase[index][i-0x31]);
+      }
+      if(SiS_VBInfo&SetCRT2ToSCART){
+          for(i=0x31;i<=0x34;i++)
+        	SiS_SetReg1(Part2Port,i,SiS300_StSCARTPhase[index][i-0x31]);
+      }
+  } else {
+       if(SiS_VBInfo&SetPALTV){  
+          for(i=0x31;i<=0x34;i++)
+        	SiS_SetReg1(Part2Port,i,SiS300_ExtPALPhase[index][i-0x31]);
+       } else {
+          for(i=0x31;i<=0x34;i++)
+        	SiS_SetReg1(Part2Port,i,SiS300_ExtNTSCPhase[index][i-0x31]);
+       }
+       if(SiS_VBInfo&SetCRT2ToSCART){
+          for(i=0x31;i<=0x34;i++)
+        	SiS_SetReg1(Part2Port,i,SiS300_ExtSCARTPhase[index][i-0x31]);
+       }
+  }
+}
+
+void
+SetOEMYFilter(PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+              ULONG ROMAddr,USHORT ModeNo)
+{
+  USHORT Part2Port;
+  USHORT index,temp1,temp2,i,ModeIdIndex,index1;
+  Part2Port=BaseAddr+SIS_CRT2_PORT_10;
+    /*301b*/
+  ModeIdIndex=SiS_SearchVBModeID(ROMAddr,ModeNo);
+  index = SiS_VBModeIDTable[ModeIdIndex].VB_TVYFilterIndex;
+  if (SiS_VBInfo&SetInSlaveMode){
+      if(SiS_VBInfo&SetPALTV){  
+        	for(i=0x35;i<=0x38;i++)
+        		SiS_SetReg1(Part2Port,i,SiS300_StPALFilter[index][i-0x35]);
+      } else {
+         	 for(i=0x35;i<=0x38;i++)
+        		SiS_SetReg1(Part2Port,i,SiS300_StNTSCFilter[index][i-0x35]);
+      }
+  } else{
+      if(SiS_VBInfo&SetPALTV) {
+         for(i=0x35;i<=0x38;i++)
+        	SiS_SetReg1(Part2Port,i,SiS300_ExtPALFilter[index][i-0x35]);
+      } else{
+          for(i=0x35;i<=0x38;i++)
+        	SiS_SetReg1(Part2Port,i,SiS300_ExtNTSCFilter[index][i-0x35]);
+      }
+  }
+
+  if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+    if(SiS_VBInfo&SetPALTV){  
+    	for(i=0x35;i<=0x38;i++)
+    	{
+     		SiS_SetReg1(Part2Port,i,SiS300_PALFilter2[index][i-0x35]);
+    	}
+   	for(i=0x48;i<=0x4A;i++)
+    	{
+     		SiS_SetReg1(Part2Port,i,SiS300_PALFilter2[index][(i-0x48)+0x04]);
+    	}
+    } else {
+  	for(i=0x35;i<=0x38;i++)
+    	{
+     		SiS_SetReg1(Part2Port,i,SiS300_NTSCFilter2[index][i-0x35]);
+     	}
+   	for(i=0x48;i<=0x4A;i++)
+    	{
+     		SiS_SetReg1(Part2Port,i,SiS300_NTSCFilter2[index][(i-0x48)+0x04]);
+    	}
+    }
+  }
 
 /*add PALMN*/
-	if ((HwDeviceExtension->jChipType == SIS_630) ||
-	    (HwDeviceExtension->jChipType == SIS_730)) {
-		index1 = SiS_GetReg1 (SiS_P3d4, 0x31);
-		temp1 = index1 & 0x01;
-		index1 = SiS_GetReg1 (SiS_P3d4, 0x35);
-		temp2 = index1 & 0xC0;
-		if (temp1) {
-			if (temp2 == 0x40) {
-				if ((SiS_VBType & VB_SIS301B)
-				    || (SiS_VBType & VB_SIS302B)) {
-					for (i = 0x35; i <= 0x38; i++) {
-						SiS_SetReg1 (Part2Port, i,
-							     SiS300_PALMFilter2
-							     [index][i - 0x35]);
-					}
-					for (i = 0x48; i <= 0x4A; i++) {
-						SiS_SetReg1 (Part2Port, i,
-							     SiS300_PALMFilter2
-							     [index][(i - 0x48)
-								     + 0x04]);
-					}
-				} else {
-					for (i = 0x35; i <= 0x38; i++)
-						SiS_SetReg1 (Part2Port, i,
-							     SiS300_PALMFilter
-							     [index][i - 0x35]);
-				}
-			}
-			if (temp2 == 0x80) {
-				if ((SiS_VBType & VB_SIS301B)
-				    || (SiS_VBType & VB_SIS302B)) {
-					for (i = 0x35; i <= 0x38; i++) {
-						SiS_SetReg1 (Part2Port, i,
-							     SiS300_PALNFilter2
-							     [index][i - 0x35]);
-					}
-					for (i = 0x48; i <= 0x4A; i++) {
-						SiS_SetReg1 (Part2Port, i,
-							     SiS300_PALNFilter2
-							     [index][(i - 0x48)
-								     + 0x04]);
-					}
-				} else {
-					for (i = 0x35; i <= 0x38; i++)
-						SiS_SetReg1 (Part2Port, i,
-							     SiS300_PALNFilter
-							     [index][i - 0x35]);
-				}
-			}
-		}
-	}
-	/*end PALMN */
+  if((HwDeviceExtension->jChipType==SIS_630)||
+     (HwDeviceExtension->jChipType==SIS_730)) {
+      index1=SiS_GetReg1(SiS_P3d4,0x31);
+      temp1=index1&0x01;
+      index1=SiS_GetReg1(SiS_P3d4,0x35);
+      temp2=index1&0xC0;
+      if(temp1){
+         if(temp2==0x40){
+              if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+                 for(i=0x35;i<=0x38;i++){
+                      SiS_SetReg1(Part2Port,i,SiS300_PALMFilter2[index][i-0x35]);
+                 }
+                 for(i=0x48;i<=0x4A;i++) {
+                       SiS_SetReg1(Part2Port,i,SiS300_PALMFilter2[index][(i-0x48)+0x04]);
+                 }
+              } else {
+                 for(i=0x35;i<=0x38;i++)
+                 	SiS_SetReg1(Part2Port,i,SiS300_PALMFilter[index][i-0x35]);
+              }
+         }
+         if(temp2==0x80){ 
+              if(SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)) {
+                 for(i=0x35;i<=0x38;i++){
+                      SiS_SetReg1(Part2Port,i,SiS300_PALNFilter2[index][i-0x35]);
+                 }
+                 for(i=0x48;i<=0x4A;i++) {
+                       SiS_SetReg1(Part2Port,i,SiS300_PALNFilter2[index][(i-0x48)+0x04]);
+                 }
+             } else {
+                 for(i=0x35;i<=0x38;i++)
+                 	SiS_SetReg1(Part2Port,i,SiS300_PALNFilter[index][i-0x35]);
+             }
+          }
+      }
+   }
+  /*end PALMN*/
 }
 
 void
-SiS_OEM300Setting (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
-		   ULONG ROMAddr, USHORT ModeNo)
-{
-	if (SiS_VBInfo & SetCRT2ToLCD) {
-		SetOEMLCDDelay (HwDeviceExtension, BaseAddr, ROMAddr, ModeNo);
-	}
-	if (SiS_VBInfo & SetCRT2ToTV) {
-		SetOEMTVDelay (HwDeviceExtension, BaseAddr, ROMAddr, ModeNo);
-		SetOEMAntiFlicker (HwDeviceExtension, BaseAddr, ROMAddr,
-				   ModeNo);
-		/* SetOEMPhaseIncr(HwDeviceExtension,BaseAddr,ROMAddr,ModeNo); */
-		SetOEMYFilter (HwDeviceExtension, BaseAddr, ROMAddr, ModeNo);
-	}
+SiS_OEM300Setting(PSIS_HW_DEVICE_INFO HwDeviceExtension,
+		  USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo)
+{
+  if (SiS_VBInfo & SetCRT2ToLCD) {
+       SetOEMLCDDelay(HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
+  }
+  if (SiS_VBInfo & SetCRT2ToTV) {
+       /* TW: (Added LVDS check) - done this way now because LVDS
+        * seems to be 1 for some of the SiS bridges as well
+	*/
+       if( (SiS_VBType&(VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV))
+       						|| (SiS_IF_DEF_LVDS==0))  {
+	        SetOEMTVDelay(HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
+       		SetOEMAntiFlicker(HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
+    		/* SetOEMPhaseIncr(HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);*/
+       		SetOEMYFilter(HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
+       }
+    }
 }
 #endif

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)