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