11bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*
21bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * sisusb - usb kernel driver for SiS315(E) based USB2VGA dongles
31bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer *
41bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * Display mode initializing code
51bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer *
61bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria
71bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer *
81bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * If distributed as part of the Linux kernel, this code is licensed under the
91bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * terms of the GPL v2.
101bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer *
111bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * Otherwise, the following license terms apply:
121bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer *
131bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * Redistribution and use in source and binary forms, with or without
141bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * modification, are permitted provided that the following conditions
151bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * are met:
161bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * 1) Redistributions of source code must retain the above copyright
171bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * *    notice, this list of conditions and the following disclaimer.
181bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * 2) Redistributions in binary form must reproduce the above copyright
191bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * *    notice, this list of conditions and the following disclaimer in the
201bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * *    documentation and/or other materials provided with the distribution.
211bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * 3) The name of the author may not be used to endorse or promote products
221bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * *    derived from this software without specific prior written permission.
231bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * *
241bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
251bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
261bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
271bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
281bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
291bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
301bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
311bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
321bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
331bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
341bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer *
35ed86d97068c7d53561d3e9b59db6c6b11f6091c7Felipe Balbi * Author:	Thomas Winischhofer <thomas@winischhofer.net>
361bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer *
371bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer */
381bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
391bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer#include <linux/module.h>
401bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer#include <linux/kernel.h>
411bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer#include <linux/errno.h>
421bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer#include <linux/poll.h>
431bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer#include <linux/init.h>
441bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer#include <linux/spinlock.h>
451bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
461bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer#include "sisusb.h"
471bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
481bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer#ifdef INCL_SISUSB_CON
491bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
501bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer#include "sisusb_init.h"
511bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
521bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
531bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*         POINTER INITIALIZATION            */
541bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
551bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5622b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiSUSB_InitPtr(struct SiS_Private *SiS_Pr)
571bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
5822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	SiS_Pr->SiS_ModeResInfo = SiSUSB_ModeResInfo;
5922b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	SiS_Pr->SiS_StandTable = SiSUSB_StandTable;
601bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6122b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	SiS_Pr->SiS_SModeIDTable = SiSUSB_SModeIDTable;
6222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	SiS_Pr->SiS_EModeIDTable = SiSUSB_EModeIDTable;
6322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	SiS_Pr->SiS_RefIndex = SiSUSB_RefIndex;
6422b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	SiS_Pr->SiS_CRT1Table = SiSUSB_CRT1Table;
651bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6622b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	SiS_Pr->SiS_VCLKData = SiSUSB_VCLKData;
671bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
681bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
691bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
701bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*          HELPER: SetReg, GetReg           */
711bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
721bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
731bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
741bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetReg(struct SiS_Private *SiS_Pr, unsigned long port,
7522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	   unsigned short index, unsigned short data)
761bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
771bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	sisusb_setidxreg(SiS_Pr->sisusb, port, index, data);
781bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
791bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
801bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
811bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetRegByte(struct SiS_Private *SiS_Pr, unsigned long port,
8222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	       unsigned short data)
831bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
841bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	sisusb_setreg(SiS_Pr->sisusb, port, data);
851bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
861bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
871bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic unsigned char
8822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe BalbiSiS_GetReg(struct SiS_Private *SiS_Pr, unsigned long port, unsigned short index)
891bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
901bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	u8 data;
911bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
921bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	sisusb_getidxreg(SiS_Pr->sisusb, port, index, &data);
931bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
941bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	return data;
951bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
961bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
971bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic unsigned char
981bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_GetRegByte(struct SiS_Private *SiS_Pr, unsigned long port)
991bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
1001bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	u8 data;
1011bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
1021bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	sisusb_getreg(SiS_Pr->sisusb, port, &data);
1031bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
1041bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	return data;
1051bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
1061bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
1071bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
1081bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetRegANDOR(struct SiS_Private *SiS_Pr, unsigned long port,
10922b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		unsigned short index, unsigned short DataAND,
11022b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		unsigned short DataOR)
1111bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
1121bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	sisusb_setidxregandor(SiS_Pr->sisusb, port, index, DataAND, DataOR);
1131bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
1141bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
1151bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
1161bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetRegAND(struct SiS_Private *SiS_Pr, unsigned long port,
11722b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	      unsigned short index, unsigned short DataAND)
1181bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
1191bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	sisusb_setidxregand(SiS_Pr->sisusb, port, index, DataAND);
1201bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
1211bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
1221bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
12322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe BalbiSiS_SetRegOR(struct SiS_Private *SiS_Pr, unsigned long port,
12422b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	     unsigned short index, unsigned short DataOR)
1251bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
1261bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	sisusb_setidxregor(SiS_Pr->sisusb, port, index, DataOR);
1271bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
1281bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
1291bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
1301bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*      HELPER: DisplayOn, DisplayOff        */
1311bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
1321bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
13322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiS_DisplayOn(struct SiS_Private *SiS_Pr)
1341bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
1351bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegAND(SiS_Pr, SiS_Pr->SiS_P3c4, 0x01, 0xDF);
1361bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
1371bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
1381bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
1391bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*        HELPER: Init Port Addresses        */
1401bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
1411bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
14222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiSUSBRegInit(struct SiS_Private *SiS_Pr, unsigned long BaseAddr)
1431bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
1441bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3c4 = BaseAddr + 0x14;
1451bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3d4 = BaseAddr + 0x24;
1461bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3c0 = BaseAddr + 0x10;
1471bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3ce = BaseAddr + 0x1e;
1481bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3c2 = BaseAddr + 0x12;
1491bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3ca = BaseAddr + 0x1a;
1501bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3c6 = BaseAddr + 0x16;
1511bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3c7 = BaseAddr + 0x17;
1521bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3c8 = BaseAddr + 0x18;
1531bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3c9 = BaseAddr + 0x19;
1541bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3cb = BaseAddr + 0x1b;
1551bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3cc = BaseAddr + 0x1c;
1561bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3cd = BaseAddr + 0x1d;
1571bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_P3da = BaseAddr + 0x2a;
1581bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_Part1Port = BaseAddr + SIS_CRT2_PORT_04;
1591bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
1601bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
1611bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
1621bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*             HELPER: GetSysFlags           */
1631bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
1641bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
16522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiS_GetSysFlags(struct SiS_Private *SiS_Pr)
1661bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
1671bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_MyCR63 = 0x63;
1681bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
1691bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
1701bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
1711bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*         HELPER: Init PCI & Engines        */
1721bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
1731bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
17422b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiSInitPCIetc(struct SiS_Private *SiS_Pr)
1751bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
1761bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x20, 0xa1);
1771bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	/*  - Enable 2D (0x40)
1781bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	 *  - Enable 3D (0x02)
1791bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	 *  - Enable 3D vertex command fetch (0x10)
1801bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	 *  - Enable 3D command parser (0x08)
1811bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	 *  - Enable 3D G/L transformation engine (0x80)
1821bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	 */
1831bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegOR(SiS_Pr, SiS_Pr->SiS_P3c4, 0x1E, 0xDA);
1841bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
1851bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
1861bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
1871bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*        HELPER: SET SEGMENT REGISTERS      */
1881bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
1891bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
19022b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiS_SetSegRegLower(struct SiS_Private *SiS_Pr, unsigned short value)
1911bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
1921bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short temp;
1931bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
1941bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	value &= 0x00ff;
1951bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp = SiS_GetRegByte(SiS_Pr, SiS_Pr->SiS_P3cb) & 0xf0;
1961bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp |= (value >> 4);
1971bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, SiS_Pr->SiS_P3cb, temp);
1981bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp = SiS_GetRegByte(SiS_Pr, SiS_Pr->SiS_P3cd) & 0xf0;
1991bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp |= (value & 0x0f);
2001bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, SiS_Pr->SiS_P3cd, temp);
2011bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
2021bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
20322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiS_SetSegRegUpper(struct SiS_Private *SiS_Pr, unsigned short value)
2041bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
2051bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short temp;
2061bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
2071bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	value &= 0x00ff;
2081bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp = SiS_GetRegByte(SiS_Pr, SiS_Pr->SiS_P3cb) & 0x0f;
2091bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp |= (value & 0xf0);
2101bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, SiS_Pr->SiS_P3cb, temp);
2111bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp = SiS_GetRegByte(SiS_Pr, SiS_Pr->SiS_P3cd) & 0x0f;
2121bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp |= (value << 4);
2131bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, SiS_Pr->SiS_P3cd, temp);
2141bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
2151bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
21622b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiS_SetSegmentReg(struct SiS_Private *SiS_Pr, unsigned short value)
2171bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
2181bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetSegRegLower(SiS_Pr, value);
2191bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetSegRegUpper(SiS_Pr, value);
2201bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
2211bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
22222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiS_ResetSegmentReg(struct SiS_Private *SiS_Pr)
2231bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
2241bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetSegmentReg(SiS_Pr, 0);
2251bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
2261bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
2271bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
2281bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetSegmentRegOver(struct SiS_Private *SiS_Pr, unsigned short value)
2291bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
2301bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short temp = value >> 8;
2311bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
2321bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp &= 0x07;
2331bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp |= (temp << 4);
2341bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x1d, temp);
2351bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetSegmentReg(SiS_Pr, value);
2361bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
2371bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
23822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiS_ResetSegmentRegOver(struct SiS_Private *SiS_Pr)
2391bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
2401bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetSegmentRegOver(SiS_Pr, 0);
2411bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
2421bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
24322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiS_ResetSegmentRegisters(struct SiS_Private *SiS_Pr)
2441bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
2451bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_ResetSegmentReg(SiS_Pr);
2461bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_ResetSegmentRegOver(SiS_Pr);
2471bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
2481bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
2491bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
2501bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*           HELPER: SearchModeID            */
2511bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
2521bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
2531bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic int
2541bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SearchModeID(struct SiS_Private *SiS_Pr, unsigned short *ModeNo,
25522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		 unsigned short *ModeIdIndex)
2561bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
2571bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if ((*ModeNo) <= 0x13) {
2581bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
2591bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		if ((*ModeNo) != 0x03)
2601bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			return 0;
2611bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
2621bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		(*ModeIdIndex) = 0;
2631bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
2641bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	} else {
2651bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
26622b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
2671bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
26822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			if (SiS_Pr->SiS_EModeIDTable[*ModeIdIndex].Ext_ModeID ==
26922b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			    (*ModeNo))
2701bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer				break;
2711bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
27222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			if (SiS_Pr->SiS_EModeIDTable[*ModeIdIndex].Ext_ModeID ==
27322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			    0xFF)
2741bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer				return 0;
2751bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		}
2761bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
2771bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
2781bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
2791bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	return 1;
2801bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
2811bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
2821bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
2831bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*            HELPER: ENABLE CRT1            */
2841bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
2851bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
28622b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiS_HandleCRT1(struct SiS_Private *SiS_Pr)
2871bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
2881bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	/* Enable CRT1 gating */
2891bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegAND(SiS_Pr, SiS_Pr->SiS_P3d4, SiS_Pr->SiS_MyCR63, 0xbf);
2901bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
2911bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
2921bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
2931bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*           HELPER: GetColorDepth           */
2941bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
2951bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
2961bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic unsigned short
2971bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_GetColorDepth(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
29822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		  unsigned short ModeIdIndex)
2991bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
30022b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	static const unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
3011bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short modeflag;
3021bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	short index;
3031bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3041bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (ModeNo <= 0x13) {
3051bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
3061bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	} else {
3071bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3081bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
3091bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3101bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	index = (modeflag & ModeTypeMask) - ModeEGA;
31122b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	if (index < 0)
31222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		index = 0;
3131bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	return ColorDepth[index];
3141bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
3151bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3161bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
3171bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*             HELPER: GetOffset             */
3181bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
3191bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3201bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic unsigned short
3211bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_GetOffset(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
32222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	      unsigned short ModeIdIndex, unsigned short rrti)
3231bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
3241bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short xres, temp, colordepth, infoflag;
3251bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3261bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	infoflag = SiS_Pr->SiS_RefIndex[rrti].Ext_InfoFlag;
3271bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	xres = SiS_Pr->SiS_RefIndex[rrti].XRes;
3281bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3291bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	colordepth = SiS_GetColorDepth(SiS_Pr, ModeNo, ModeIdIndex);
3301bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3311bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp = xres / 16;
3321bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3331bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (infoflag & InterlaceMode)
3341bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		temp <<= 1;
3351bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3361bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp *= colordepth;
3371bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3381bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (xres % 16)
3391bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		temp += (colordepth >> 1);
3401bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3411bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	return temp;
3421bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
3431bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3441bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
3451bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*                   SEQ                     */
3461bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
3471bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3481bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
3491bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetSeqRegs(struct SiS_Private *SiS_Pr, unsigned short StandTableIndex)
3501bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
3511bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned char SRdata;
3521bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	int i;
3531bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3541bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x00, 0x03);
3551bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3561bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SRdata = SiS_Pr->SiS_StandTable[StandTableIndex].SR[0] | 0x20;
3571bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x01, SRdata);
3581bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
35922b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	for (i = 2; i <= 4; i++) {
36022b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		SRdata = SiS_Pr->SiS_StandTable[StandTableIndex].SR[i - 1];
3611bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, i, SRdata);
3621bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
3631bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
3641bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3651bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
3661bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*                  MISC                     */
3671bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
3681bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3691bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
3701bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetMiscRegs(struct SiS_Private *SiS_Pr, unsigned short StandTableIndex)
3711bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
3721bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned char Miscdata = SiS_Pr->SiS_StandTable[StandTableIndex].MISC;
3731bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3741bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, SiS_Pr->SiS_P3c2, Miscdata);
3751bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
3761bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3771bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
3781bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*                  CRTC                     */
3791bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
3801bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3811bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
3821bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetCRTCRegs(struct SiS_Private *SiS_Pr, unsigned short StandTableIndex)
3831bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
3841bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned char CRTCdata;
3851bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short i;
3861bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3871bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegAND(SiS_Pr, SiS_Pr->SiS_P3d4, 0x11, 0x7f);
3881bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
38922b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	for (i = 0; i <= 0x18; i++) {
3901bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		CRTCdata = SiS_Pr->SiS_StandTable[StandTableIndex].CRTC[i];
3911bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3d4, i, CRTCdata);
3921bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
3931bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
3941bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3951bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
3961bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*                   ATT                     */
3971bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
3981bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
3991bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
4001bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetATTRegs(struct SiS_Private *SiS_Pr, unsigned short StandTableIndex)
4011bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
4021bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned char ARdata;
4031bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short i;
4041bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
40522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	for (i = 0; i <= 0x13; i++) {
4061bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		ARdata = SiS_Pr->SiS_StandTable[StandTableIndex].ATTR[i];
4071bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_GetRegByte(SiS_Pr, SiS_Pr->SiS_P3da);
4081bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetRegByte(SiS_Pr, SiS_Pr->SiS_P3c0, i);
4091bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetRegByte(SiS_Pr, SiS_Pr->SiS_P3c0, ARdata);
4101bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
4111bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_GetRegByte(SiS_Pr, SiS_Pr->SiS_P3da);
4121bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, SiS_Pr->SiS_P3c0, 0x14);
4131bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, SiS_Pr->SiS_P3c0, 0x00);
4141bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4151bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_GetRegByte(SiS_Pr, SiS_Pr->SiS_P3da);
4161bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, SiS_Pr->SiS_P3c0, 0x20);
4171bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_GetRegByte(SiS_Pr, SiS_Pr->SiS_P3da);
4181bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
4191bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4201bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
4211bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*                   GRC                     */
4221bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
4231bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4241bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
4251bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetGRCRegs(struct SiS_Private *SiS_Pr, unsigned short StandTableIndex)
4261bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
4271bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned char GRdata;
4281bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short i;
4291bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
43022b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	for (i = 0; i <= 0x08; i++) {
4311bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		GRdata = SiS_Pr->SiS_StandTable[StandTableIndex].GRC[i];
4321bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3ce, i, GRdata);
4331bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
4341bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4351bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (SiS_Pr->SiS_ModeType > ModeVGA) {
4361bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		/* 256 color disable */
4371bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetRegAND(SiS_Pr, SiS_Pr->SiS_P3ce, 0x05, 0xBF);
4381bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
4391bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
4401bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4411bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
4421bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*          CLEAR EXTENDED REGISTERS         */
4431bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
4441bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
44522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiS_ClearExt1Regs(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
4461bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
4471bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	int i;
4481bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
44922b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	for (i = 0x0A; i <= 0x0E; i++) {
4501bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, i, 0x00);
4511bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
4521bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4531bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegAND(SiS_Pr, SiS_Pr->SiS_P3c4, 0x37, 0xFE);
4541bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
4551bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4561bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
4571bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*              Get rate index               */
4581bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
4591bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4601bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic unsigned short
4611bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_GetRatePtr(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
46222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	       unsigned short ModeIdIndex)
4631bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
4641bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short rrti, i, index, temp;
4651bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4661bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (ModeNo <= 0x13)
4671bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		return 0xFFFF;
4681bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
46922b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	index = SiS_GetReg(SiS_Pr, SiS_Pr->SiS_P3d4, 0x33) & 0x0F;
47022b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	if (index > 0)
47122b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		index--;
4721bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4731bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	rrti = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
4741bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	ModeNo = SiS_Pr->SiS_RefIndex[rrti].ModeID;
4751bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4761bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	i = 0;
4771bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	do {
4781bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		if (SiS_Pr->SiS_RefIndex[rrti + i].ModeID != ModeNo)
4791bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			break;
4801bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
48122b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		temp =
48222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		    SiS_Pr->SiS_RefIndex[rrti + i].Ext_InfoFlag & ModeTypeMask;
4831bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		if (temp < SiS_Pr->SiS_ModeType)
4841bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			break;
4851bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4861bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		i++;
4871bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		index--;
48822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	} while (index != 0xFFFF);
4891bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4901bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	i--;
4911bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4921bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	return (rrti + i);
4931bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
4941bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
4951bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
4961bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*                  SYNC                     */
4971bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
4981bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
49922b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbistatic void SiS_SetCRT1Sync(struct SiS_Private *SiS_Pr, unsigned short rrti)
5001bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
5011bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short sync = SiS_Pr->SiS_RefIndex[rrti].Ext_InfoFlag >> 8;
5021bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	sync &= 0xC0;
5031bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	sync |= 0x2f;
5041bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, SiS_Pr->SiS_P3c2, sync);
5051bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
5061bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5071bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
5081bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*                  CRTC/2                   */
5091bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
5101bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5111bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
5121bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetCRT1CRTC(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
51322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		unsigned short ModeIdIndex, unsigned short rrti)
5141bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
51522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	unsigned char index;
5161bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short temp, i, j, modeflag;
5171bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
51822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	SiS_SetRegAND(SiS_Pr, SiS_Pr->SiS_P3d4, 0x11, 0x7f);
5191bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5201bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
5211bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5221bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	index = SiS_Pr->SiS_RefIndex[rrti].Ext_CRT1CRTC;
5231bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
52422b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	for (i = 0, j = 0; i <= 7; i++, j++) {
5251bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3d4, j,
52622b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			   SiS_Pr->SiS_CRT1Table[index].CR[i]);
5271bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
52822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	for (j = 0x10; i <= 10; i++, j++) {
5291bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3d4, j,
53022b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			   SiS_Pr->SiS_CRT1Table[index].CR[i]);
5311bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
53222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	for (j = 0x15; i <= 12; i++, j++) {
5331bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3d4, j,
53422b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			   SiS_Pr->SiS_CRT1Table[index].CR[i]);
5351bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
53622b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	for (j = 0x0A; i <= 15; i++, j++) {
5371bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, j,
53822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			   SiS_Pr->SiS_CRT1Table[index].CR[i]);
5391bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
5401bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5411bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp = SiS_Pr->SiS_CRT1Table[index].CR[16] & 0xE0;
54222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x0E, temp);
5431bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5441bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp = ((SiS_Pr->SiS_CRT1Table[index].CR[16]) & 0x01) << 5;
54522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	if (modeflag & DoubleScanMode)
54622b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		temp |= 0x80;
5471bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegANDOR(SiS_Pr, SiS_Pr->SiS_P3d4, 0x09, 0x5F, temp);
5481bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5491bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (SiS_Pr->SiS_ModeType > ModeVGA)
5501bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3d4, 0x14, 0x4F);
5511bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
5521bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5531bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
5541bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*               OFFSET & PITCH              */
5551bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
5561bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*  (partly overruled by SetPitch() in XF86) */
5571bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
5581bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5591bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
5601bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetCRT1Offset(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
56122b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		  unsigned short ModeIdIndex, unsigned short rrti)
5621bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
5631bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short du = SiS_GetOffset(SiS_Pr, ModeNo, ModeIdIndex, rrti);
56422b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	unsigned short infoflag = SiS_Pr->SiS_RefIndex[rrti].Ext_InfoFlag;
5651bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short temp;
5661bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5671bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp = (du >> 8) & 0x0f;
5681bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegANDOR(SiS_Pr, SiS_Pr->SiS_P3c4, 0x0E, 0xF0, temp);
5691bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5701bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3d4, 0x13, (du & 0xFF));
5711bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
57222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	if (infoflag & InterlaceMode)
57322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		du >>= 1;
5741bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5751bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	du <<= 5;
5761bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp = (du >> 8) & 0xff;
57722b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	if (du & 0xff)
57822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		temp++;
5791bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	temp++;
5801bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x10, temp);
5811bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
5821bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5831bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
5841bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*                  VCLK                     */
5851bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
5861bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
5871bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
5881bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetCRT1VCLK(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
58922b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		unsigned short rrti)
5901bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
5911bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short index = SiS_Pr->SiS_RefIndex[rrti].Ext_CRTVCLK;
5921bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short clka = SiS_Pr->SiS_VCLKData[index].SR2B;
5931bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short clkb = SiS_Pr->SiS_VCLKData[index].SR2C;
5941bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
59522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	SiS_SetRegAND(SiS_Pr, SiS_Pr->SiS_P3c4, 0x31, 0xCF);
5961bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
59722b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x2B, clka);
59822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x2C, clkb);
59922b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x2D, 0x01);
6001bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
6011bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6021bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
6031bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*                  FIFO                     */
6041bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
6051bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6061bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
6071bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetCRT1FIFO_310(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
60822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		    unsigned short mi)
6091bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
6101bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short modeflag = SiS_Pr->SiS_EModeIDTable[mi].Ext_ModeFlag;
6111bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6121bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	/* disable auto-threshold */
6131bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegAND(SiS_Pr, SiS_Pr->SiS_P3c4, 0x3D, 0xFE);
6141bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6151bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x08, 0xAE);
6161bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegAND(SiS_Pr, SiS_Pr->SiS_P3c4, 0x09, 0xF0);
6171bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6181bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (ModeNo <= 0x13)
6191bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		return;
6201bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6211bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if ((!(modeflag & DoubleScanMode)) || (!(modeflag & HalfDCLK))) {
6221bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x08, 0x34);
6231bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetRegOR(SiS_Pr, SiS_Pr->SiS_P3c4, 0x3D, 0x01);
6241bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
6251bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
6261bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6271bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
6281bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*              MODE REGISTERS               */
6291bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
6301bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6311bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
6321bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetVCLKState(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
63322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		 unsigned short rrti)
6341bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
6351bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short data = 0, VCLK = 0, index = 0;
6361bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6371bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (ModeNo > 0x13) {
6381bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		index = SiS_Pr->SiS_RefIndex[rrti].Ext_CRTVCLK;
6391bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK;
6401bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
6411bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
64222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	if (VCLK >= 166)
64322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		data |= 0x0c;
6441bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegANDOR(SiS_Pr, SiS_Pr->SiS_P3c4, 0x32, 0xf3, data);
6451bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6461bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (VCLK >= 166)
6471bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetRegAND(SiS_Pr, SiS_Pr->SiS_P3c4, 0x1f, 0xe7);
6481bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6491bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	/* DAC speed */
6501bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	data = 0x03;
6511bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (VCLK >= 260)
6521bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		data = 0x00;
6531bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	else if (VCLK >= 160)
6541bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		data = 0x01;
6551bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	else if (VCLK >= 135)
6561bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		data = 0x02;
6571bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6581bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegANDOR(SiS_Pr, SiS_Pr->SiS_P3c4, 0x07, 0xF8, data);
6591bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
6601bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6611bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
6621bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetCRT1ModeRegs(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
66322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		    unsigned short ModeIdIndex, unsigned short rrti)
6641bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
6651bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short data, infoflag = 0, modeflag;
6661bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6671bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (ModeNo <= 0x13)
6681bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
6691bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	else {
6701bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
6711bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		infoflag = SiS_Pr->SiS_RefIndex[rrti].Ext_InfoFlag;
6721bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
6731bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6741bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	/* Disable DPMS */
6751bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegAND(SiS_Pr, SiS_Pr->SiS_P3c4, 0x1F, 0x3F);
6761bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6771bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	data = 0;
6781bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (ModeNo > 0x13) {
6791bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		if (SiS_Pr->SiS_ModeType > ModeEGA) {
6801bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			data |= 0x02;
6811bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			data |= ((SiS_Pr->SiS_ModeType - ModeVGA) << 2);
6821bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		}
68322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		if (infoflag & InterlaceMode)
68422b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			data |= 0x20;
6851bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
6861bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegANDOR(SiS_Pr, SiS_Pr->SiS_P3c4, 0x06, 0xC0, data);
6871bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
6881bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	data = 0;
6891bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (infoflag & InterlaceMode) {
6901bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		/* data = (Hsync / 8) - ((Htotal / 8) / 2) + 3 */
69122b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		unsigned short hrs =
69222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		    (SiS_GetReg(SiS_Pr, SiS_Pr->SiS_P3d4, 0x04) |
69322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		     ((SiS_GetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x0b) & 0xc0) << 2))
69422b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		    - 3;
69522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		unsigned short hto =
69622b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		    (SiS_GetReg(SiS_Pr, SiS_Pr->SiS_P3d4, 0x00) |
69722b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		     ((SiS_GetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x0b) & 0x03) << 8))
69822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		    + 5;
6991bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		data = hrs - (hto >> 1) + 3;
7001bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
7011bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3d4, 0x19, (data & 0xFF));
7021bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegANDOR(SiS_Pr, SiS_Pr->SiS_P3d4, 0x1a, 0xFC, (data >> 8));
7031bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7041bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (modeflag & HalfDCLK)
7051bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetRegOR(SiS_Pr, SiS_Pr->SiS_P3c4, 0x01, 0x08);
7061bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7071bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	data = 0;
7081bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (modeflag & LineCompareOff)
7091bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		data = 0x08;
7101bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegANDOR(SiS_Pr, SiS_Pr->SiS_P3c4, 0x0F, 0xB7, data);
7111bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7121bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if ((SiS_Pr->SiS_ModeType == ModeEGA) && (ModeNo > 0x13))
7131bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetRegOR(SiS_Pr, SiS_Pr->SiS_P3c4, 0x0F, 0x40);
7141bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7151bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegAND(SiS_Pr, SiS_Pr->SiS_P3c4, 0x31, 0xfb);
7161bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7171bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	data = 0x60;
7181bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (SiS_Pr->SiS_ModeType != ModeText) {
7191bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		data ^= 0x60;
7201bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		if (SiS_Pr->SiS_ModeType != ModeEGA)
7211bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			data ^= 0xA0;
7221bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
7231bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegANDOR(SiS_Pr, SiS_Pr->SiS_P3c4, 0x21, 0x1F, data);
7241bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7251bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetVCLKState(SiS_Pr, ModeNo, rrti);
7261bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7271bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (SiS_GetReg(SiS_Pr, SiS_Pr->SiS_P3d4, 0x31) & 0x40)
7281bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3d4, 0x52, 0x2c);
7291bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	else
7301bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3d4, 0x52, 0x6c);
7311bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
7321bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7331bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
7341bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*                 LOAD DAC                  */
7351bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
7361bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7371bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
7381bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_WriteDAC(struct SiS_Private *SiS_Pr, unsigned long DACData,
73922b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	     unsigned short shiftflag, unsigned short dl, unsigned short ah,
74022b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	     unsigned short al, unsigned short dh)
7411bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
7421bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short d1, d2, d3;
7431bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7441bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	switch (dl) {
74522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	case 0:
74622b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		d1 = dh;
74722b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		d2 = ah;
74822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		d3 = al;
74922b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		break;
75022b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	case 1:
75122b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		d1 = ah;
75222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		d2 = al;
75322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		d3 = dh;
75422b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		break;
75522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	default:
75622b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		d1 = al;
75722b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		d2 = dh;
75822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		d3 = ah;
7591bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
7601bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, DACData, (d1 << shiftflag));
7611bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, DACData, (d2 << shiftflag));
7621bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, DACData, (d3 << shiftflag));
7631bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
7641bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7651bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
76622b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe BalbiSiS_LoadDAC(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
76722b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	    unsigned short mi)
7681bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
7691bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short data, data2, time, i, j, k, m, n, o;
7701bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short si, di, bx, sf;
7711bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned long DACAddr, DACData;
7721bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	const unsigned char *table = NULL;
7731bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7741bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (ModeNo < 0x13)
7751bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		data = SiS_Pr->SiS_SModeIDTable[mi].St_ModeFlag;
7761bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	else
7771bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		data = SiS_Pr->SiS_EModeIDTable[mi].Ext_ModeFlag;
7781bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7791bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	data &= DACInfoFlag;
7801bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7811bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	j = time = 64;
7821bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (data == 0x00)
7831bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		table = SiS_MDA_DAC;
7841bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	else if (data == 0x08)
7851bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		table = SiS_CGA_DAC;
7861bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	else if (data == 0x10)
7871bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		table = SiS_EGA_DAC;
7881bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	else {
7891bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		j = 16;
7901bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		time = 256;
7911bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		table = SiS_VGA_DAC;
7921bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
7931bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7941bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	DACAddr = SiS_Pr->SiS_P3c8;
7951bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	DACData = SiS_Pr->SiS_P3c9;
7961bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	sf = 0;
7971bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, SiS_Pr->SiS_P3c6, 0xFF);
7981bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
7991bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, DACAddr, 0x00);
8001bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
80122b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	for (i = 0; i < j; i++) {
8021bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		data = table[i];
80322b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		for (k = 0; k < 3; k++) {
8041bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			data2 = 0;
80522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			if (data & 0x01)
80622b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi				data2 += 0x2A;
80722b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			if (data & 0x02)
80822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi				data2 += 0x15;
8091bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			SiS_SetRegByte(SiS_Pr, DACData, (data2 << sf));
8101bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			data >>= 2;
8111bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		}
8121bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
8131bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8141bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (time == 256) {
81522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		for (i = 16; i < 32; i++) {
8161bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			data = table[i] << sf;
81722b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			for (k = 0; k < 3; k++)
8181bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer				SiS_SetRegByte(SiS_Pr, DACData, data);
8191bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		}
8201bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		si = 32;
82122b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		for (m = 0; m < 9; m++) {
8221bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			di = si;
8231bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			bx = si + 4;
82422b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			for (n = 0; n < 3; n++) {
82522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi				for (o = 0; o < 5; o++) {
8261bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer					SiS_WriteDAC(SiS_Pr, DACData, sf, n,
82722b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi						     table[di], table[bx],
82822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi						     table[si]);
8291bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer					si++;
8301bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer				}
8311bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer				si -= 2;
83222b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi				for (o = 0; o < 3; o++) {
8331bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer					SiS_WriteDAC(SiS_Pr, DACData, sf, n,
83422b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi						     table[di], table[si],
83522b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi						     table[bx]);
8361bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer					si--;
8371bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer				}
8381bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			}
83922b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi			si += 5;
8401bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		}
8411bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
8421bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
8431bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8441bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
8451bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*         SET CRT1 REGISTER GROUP           */
8461bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
8471bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8481bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhoferstatic void
8491bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas WinischhoferSiS_SetCRT1Group(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
85022b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi		 unsigned short ModeIdIndex)
8511bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
8521bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short StandTableIndex, rrti;
8531bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8541bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_CRT1Mode = ModeNo;
8551bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8561bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (ModeNo <= 0x13)
8571bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		StandTableIndex = 0;
8581bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	else
8591bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		StandTableIndex = 1;
8601bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8611bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_ResetSegmentRegisters(SiS_Pr);
8621bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetSeqRegs(SiS_Pr, StandTableIndex);
8631bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetMiscRegs(SiS_Pr, StandTableIndex);
8641bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetCRTCRegs(SiS_Pr, StandTableIndex);
8651bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetATTRegs(SiS_Pr, StandTableIndex);
8661bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetGRCRegs(SiS_Pr, StandTableIndex);
8671bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_ClearExt1Regs(SiS_Pr, ModeNo);
8681bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8691bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	rrti = SiS_GetRatePtr(SiS_Pr, ModeNo, ModeIdIndex);
8701bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8711bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (rrti != 0xFFFF) {
8721bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetCRT1Sync(SiS_Pr, rrti);
8731bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetCRT1CRTC(SiS_Pr, ModeNo, ModeIdIndex, rrti);
8741bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetCRT1Offset(SiS_Pr, ModeNo, ModeIdIndex, rrti);
8751bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		SiS_SetCRT1VCLK(SiS_Pr, ModeNo, rrti);
8761bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
8771bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8781bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetCRT1FIFO_310(SiS_Pr, ModeNo, ModeIdIndex);
8791bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8801bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetCRT1ModeRegs(SiS_Pr, ModeNo, ModeIdIndex, rrti);
8811bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8821bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_LoadDAC(SiS_Pr, ModeNo, ModeIdIndex);
8831bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8841bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_DisplayOn(SiS_Pr);
8851bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
8861bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8871bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
8881bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*                 SiSSetMode()              */
8891bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer/*********************************************/
8901bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
89122b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbiint SiSUSBSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
8921bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
8931bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short ModeIdIndex;
89422b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	unsigned long BaseAddr = SiS_Pr->IOAddress;
8951bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
8961bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiSUSB_InitPtr(SiS_Pr);
8971bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiSUSBRegInit(SiS_Pr, BaseAddr);
8981bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_GetSysFlags(SiS_Pr);
8991bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9001bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex)))
9011bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		return 0;
9021bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9031bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3c4, 0x05, 0x86);
9041bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9051bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiSInitPCIetc(SiS_Pr);
9061bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9071bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	ModeNo &= 0x7f;
9081bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9091bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_ModeType =
91022b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbi	    SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag & ModeTypeMask;
9111bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9121bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_Pr->SiS_SetFlag = LowModeTests;
9131bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9141bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	/* Set mode on CRT1 */
9151bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetCRT1Group(SiS_Pr, ModeNo, ModeIdIndex);
9161bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9171bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_HandleCRT1(SiS_Pr);
9181bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9191bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_DisplayOn(SiS_Pr);
9201bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetRegByte(SiS_Pr, SiS_Pr->SiS_P3c6, 0xFF);
9211bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9221bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	/* Store mode number */
9231bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiS_SetReg(SiS_Pr, SiS_Pr->SiS_P3d4, 0x34, ModeNo);
9241bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9251bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	return 1;
9261bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
9271bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
92822b2c526e70741ce8a244cab339fe0f56ace8cb6Felipe Balbiint SiSUSBSetVESAMode(struct SiS_Private *SiS_Pr, unsigned short VModeNo)
9291bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer{
9301bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	unsigned short ModeNo = 0;
9311bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	int i;
9321bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9331bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	SiSUSB_InitPtr(SiS_Pr);
9341bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9351bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (VModeNo == 0x03) {
9361bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9371bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		ModeNo = 0x03;
9381bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9391bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	} else {
9401bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9411bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		i = 0;
9421bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		do {
9431bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9441bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			if (SiS_Pr->SiS_EModeIDTable[i].Ext_VESAID == VModeNo) {
9451bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer				ModeNo = SiS_Pr->SiS_EModeIDTable[i].Ext_ModeID;
9461bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer				break;
9471bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer			}
9481bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9491bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		} while (SiS_Pr->SiS_EModeIDTable[i++].Ext_ModeID != 0xff);
9501bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9511bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	}
9521bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9531bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	if (!ModeNo)
9541bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer		return 0;
9551bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9561bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer	return SiSUSBSetMode(SiS_Pr, ModeNo);
9571bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer}
9581bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer
9591bbb4f2035d94d86e52e9b5341c142dcb39bb879Thomas Winischhofer#endif /* INCL_SISUSB_CON */
960