1 /* $XFree86$ */
2 /* $XdotOrg$ */
3 /*
4  * Data and prototypes for init301.c
5  *
6  * Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria
7  *
8  * If distributed as part of the Linux kernel, the following license terms
9  * apply:
10  *
11  * * This program is free software; you can redistribute it and/or modify
12  * * it under the terms of the GNU General Public License as published by
13  * * the Free Software Foundation; either version 2 of the named License,
14  * * or any later version.
15  * *
16  * * This program is distributed in the hope that it will be useful,
17  * * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * * GNU General Public License for more details.
20  * *
21  * * You should have received a copy of the GNU General Public License
22  * * along with this program; if not, write to the Free Software
23  * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
24  *
25  * Otherwise, the following license terms apply:
26  *
27  * * Redistribution and use in source and binary forms, with or without
28  * * modification, are permitted provided that the following conditions
29  * * are met:
30  * * 1) Redistributions of source code must retain the above copyright
31  * *    notice, this list of conditions and the following disclaimer.
32  * * 2) Redistributions in binary form must reproduce the above copyright
33  * *    notice, this list of conditions and the following disclaimer in the
34  * *    documentation and/or other materials provided with the distribution.
35  * * 3) The name of the author may not be used to endorse or promote products
36  * *    derived from this software without specific prior written permission.
37  * *
38  * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
39  * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
40  * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
41  * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
42  * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
43  * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
44  * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
45  * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
46  * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
47  * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
48  *
49  * Author: 	Thomas Winischhofer <thomas@winischhofer.net>
50  *
51  */
52 
53 #ifndef  _INIT301_H_
54 #define  _INIT301_H_
55 
56 #include "initdef.h"
57 
58 #include "vgatypes.h"
59 #include "vstruct.h"
60 #ifdef SIS_CP
61 #undef SIS_CP
62 #endif
63 #include <linux/types.h>
64 #include <asm/io.h>
65 #include <linux/fb.h>
66 #include "sis.h"
67 #include <video/sisfb.h>
68 
69 static const unsigned char SiS_YPbPrTable[3][64] = {
70   {
71     0x17,0x1d,0x03,0x09,0x05,0x06,0x0c,0x0c,
72     0x94,0x49,0x01,0x0a,0x06,0x0d,0x04,0x0a,
73     0x06,0x14,0x0d,0x04,0x0a,0x00,0x85,0x1b,
74     0x0c,0x50,0x00,0x97,0x00,0xda,0x4a,0x17,
75     0x7d,0x05,0x4b,0x00,0x00,0xe2,0x00,0x02,
76     0x03,0x0a,0x65,0x9d /*0x8d*/,0x08,0x92,0x8f,0x40,
77     0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x53 /*0x50*/,
78     0x00,0x40,0x44,0x00,0xdb,0x02,0x3b,0x00
79   },
80   {
81     0x33,0x06,0x06,0x09,0x0b,0x0c,0x0c,0x0c,
82     0x98,0x0a,0x01,0x0d,0x06,0x0d,0x04,0x0a,
83     0x06,0x14,0x0d,0x04,0x0a,0x00,0x85,0x3f,
84     0x0c,0x50,0xb2,0x9f,0x16,0x59,0x4f,0x13,
85     0xad,0x11,0xad,0x1d,0x40,0x8a,0x3d,0xb8,
86     0x51,0x5e,0x60,0x49,0x7d,0x92,0x0f,0x40,
87     0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x4e,
88     0x43,0x41,0x11,0x00,0xfc,0xff,0x32,0x00
89   },
90   {
91 #if 0 /* OK, but sticks to left edge */
92     0x13,0x1d,0xe8,0x09,0x09,0xed,0x0c,0x0c,
93     0x98,0x0a,0x01,0x0c,0x06,0x0d,0x04,0x0a,
94     0x06,0x14,0x0d,0x04,0x0a,0x00,0x85,0x3f,
95     0xed,0x50,0x70,0x9f,0x16,0x59,0x21 /*0x2b*/,0x13,
96     0x27,0x0b,0x27,0xfc,0x30,0x27,0x1c,0xb0,
97     0x4b,0x4b,0x65 /*0x6f*/,0x2f,0x63,0x92,0x0f,0x40,
98     0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x27,
99     0x00,0x40,0x11,0x00,0xfc,0xff,0x32,0x00
100 #endif
101 #if 1 /* Perfect */
102     0x23,0x2d,0xe8,0x09,0x09,0xed,0x0c,0x0c,
103     0x98,0x0a,0x01,0x0c,0x06,0x0d,0x04,0x0a,
104     0x06,0x14,0x0d,0x04,0x0a,0x00,0x85,0x3f,
105     0xed,0x50,0x70,0x9f,0x16,0x59,0x60,0x13,
106     0x27,0x0b,0x27,0xfc,0x30,0x27,0x1c,0xb0,
107     0x4b,0x4b,0x6f,0x2f,0x63,0x92,0x0f,0x40,
108     0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x73,
109     0x00,0x40,0x11,0x00,0xfc,0xff,0x32,0x00
110 #endif
111   }
112 };
113 
114 static const unsigned char SiS_TVPhase[] =
115 {
116 	0x21,0xED,0xBA,0x08,	/* 0x00 SiS_NTSCPhase */
117 	0x2A,0x05,0xE3,0x00,	/* 0x01 SiS_PALPhase */
118 	0x21,0xE4,0x2E,0x9B,	/* 0x02 SiS_PALMPhase */
119 	0x21,0xF4,0x3E,0xBA,	/* 0x03 SiS_PALNPhase */
120 	0x1E,0x8B,0xA2,0xA7,
121 	0x1E,0x83,0x0A,0xE0,	/* 0x05 SiS_SpecialPhaseM */
122 	0x00,0x00,0x00,0x00,
123 	0x00,0x00,0x00,0x00,
124 	0x21,0xF0,0x7B,0xD6,	/* 0x08 SiS_NTSCPhase2 */
125 	0x2A,0x09,0x86,0xE9,	/* 0x09 SiS_PALPhase2 */
126 	0x21,0xE6,0xEF,0xA4,	/* 0x0a SiS_PALMPhase2 */
127 	0x21,0xF6,0x94,0x46,	/* 0x0b SiS_PALNPhase2 */
128 	0x1E,0x8B,0xA2,0xA7,
129 	0x1E,0x83,0x0A,0xE0,	/* 0x0d SiS_SpecialPhaseM */
130 	0x00,0x00,0x00,0x00,
131 	0x00,0x00,0x00,0x00,
132 	0x1e,0x8c,0x5c,0x7a,	/* 0x10 SiS_SpecialPhase */
133 	0x25,0xd4,0xfd,0x5e	/* 0x11 SiS_SpecialPhaseJ */
134 };
135 
136 static const unsigned char SiS_HiTVGroup3_1[] = {
137     0x00, 0x14, 0x15, 0x25, 0x55, 0x15, 0x0b, 0x13,
138     0xb1, 0x41, 0x62, 0x62, 0xff, 0xf4, 0x45, 0xa6,
139     0x25, 0x2f, 0x67, 0xf6, 0xbf, 0xff, 0x8e, 0x20,
140     0xac, 0xda, 0x60, 0xfe, 0x6a, 0x9a, 0x06, 0x10,
141     0xd1, 0x04, 0x18, 0x0a, 0xff, 0x80, 0x00, 0x80,
142     0x3b, 0x77, 0x00, 0xef, 0xe0, 0x10, 0xb0, 0xe0,
143     0x10, 0x4f, 0x0f, 0x0f, 0x05, 0x0f, 0x08, 0x6e,
144     0x1a, 0x1f, 0x25, 0x2a, 0x4c, 0xaa, 0x01
145 };
146 
147 static const unsigned char SiS_HiTVGroup3_2[] = {
148     0x00, 0x14, 0x15, 0x25, 0x55, 0x15, 0x0b, 0x7a,
149     0x54, 0x41, 0xe7, 0xe7, 0xff, 0xf4, 0x45, 0xa6,
150     0x25, 0x2f, 0x67, 0xf6, 0xbf, 0xff, 0x8e, 0x20,
151     0xac, 0x6a, 0x60, 0x2b, 0x52, 0xcd, 0x61, 0x10,
152     0x51, 0x04, 0x18, 0x0a, 0x1f, 0x80, 0x00, 0x80,
153     0xff, 0xa4, 0x04, 0x2b, 0x94, 0x21, 0x72, 0x94,
154     0x26, 0x05, 0x01, 0x0f, 0xed, 0x0f, 0x0a, 0x64,
155     0x18, 0x1d, 0x23, 0x28, 0x4c, 0xaa, 0x01
156 };
157 
158 /* 301C / 302ELV extended Part2 TV registers (4 tap scaler) */
159 
160 static const unsigned char SiS_Part2CLVX_1[] = {
161     0x00,0x00,
162     0x00,0x20,0x00,0x00,0x7F,0x20,0x02,0x7F,0x7D,0x20,0x04,0x7F,0x7D,0x1F,0x06,0x7E,
163     0x7C,0x1D,0x09,0x7E,0x7C,0x1B,0x0B,0x7E,0x7C,0x19,0x0E,0x7D,0x7C,0x17,0x11,0x7C,
164     0x7C,0x14,0x14,0x7C,0x7C,0x11,0x17,0x7C,0x7D,0x0E,0x19,0x7C,0x7E,0x0B,0x1B,0x7C,
165     0x7E,0x09,0x1D,0x7C,0x7F,0x06,0x1F,0x7C,0x7F,0x04,0x20,0x7D,0x00,0x02,0x20,0x7E
166 };
167 
168 static const unsigned char SiS_Part2CLVX_2[] = {
169     0x00,0x00,
170     0x00,0x20,0x00,0x00,0x7F,0x20,0x02,0x7F,0x7D,0x20,0x04,0x7F,0x7D,0x1F,0x06,0x7E,
171     0x7C,0x1D,0x09,0x7E,0x7C,0x1B,0x0B,0x7E,0x7C,0x19,0x0E,0x7D,0x7C,0x17,0x11,0x7C,
172     0x7C,0x14,0x14,0x7C,0x7C,0x11,0x17,0x7C,0x7D,0x0E,0x19,0x7C,0x7E,0x0B,0x1B,0x7C,
173     0x7E,0x09,0x1D,0x7C,0x7F,0x06,0x1F,0x7C,0x7F,0x04,0x20,0x7D,0x00,0x02,0x20,0x7E
174 };
175 
176 static const unsigned char SiS_Part2CLVX_3[] = {  /* NTSC, 525i, 525p */
177     0xE0,0x01,
178     0x04,0x1A,0x04,0x7E,0x03,0x1A,0x06,0x7D,0x01,0x1A,0x08,0x7D,0x00,0x19,0x0A,0x7D,
179     0x7F,0x19,0x0C,0x7C,0x7E,0x18,0x0E,0x7C,0x7E,0x17,0x10,0x7B,0x7D,0x15,0x12,0x7C,
180     0x7D,0x13,0x13,0x7D,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0E,0x18,0x7E,
181     0x7D,0x0C,0x19,0x7E,0x7D,0x0A,0x19,0x00,0x7D,0x08,0x1A,0x01,0x7E,0x06,0x1A,0x02,
182     0x58,0x02,
183     0x07,0x14,0x07,0x7E,0x06,0x14,0x09,0x7D,0x05,0x14,0x0A,0x7D,0x04,0x13,0x0B,0x7E,
184     0x03,0x13,0x0C,0x7E,0x02,0x12,0x0D,0x7F,0x01,0x12,0x0E,0x7F,0x01,0x11,0x0F,0x7F,
185     0x00,0x10,0x10,0x00,0x7F,0x0F,0x11,0x01,0x7F,0x0E,0x12,0x01,0x7E,0x0D,0x12,0x03,
186     0x7E,0x0C,0x13,0x03,0x7E,0x0B,0x13,0x04,0x7E,0x0A,0x14,0x04,0x7D,0x09,0x14,0x06,
187     0x00,0x03,
188     0x09,0x0F,0x09,0x7F,0x08,0x0F,0x09,0x00,0x07,0x0F,0x0A,0x00,0x06,0x0F,0x0A,0x01,
189     0x06,0x0E,0x0B,0x01,0x05,0x0E,0x0B,0x02,0x04,0x0E,0x0C,0x02,0x04,0x0D,0x0C,0x03,
190     0x03,0x0D,0x0D,0x03,0x02,0x0C,0x0D,0x05,0x02,0x0C,0x0E,0x04,0x01,0x0B,0x0E,0x06,
191     0x01,0x0B,0x0E,0x06,0x00,0x0A,0x0F,0x07,0x00,0x0A,0x0F,0x07,0x00,0x09,0x0F,0x08,
192     0xFF,0xFF
193 };
194 
195 static const unsigned char SiS_Part2CLVX_4[] = {   /* PAL */
196     0x58,0x02,
197     0x05,0x19,0x05,0x7D,0x03,0x19,0x06,0x7E,0x02,0x19,0x08,0x7D,0x01,0x18,0x0A,0x7D,
198     0x00,0x18,0x0C,0x7C,0x7F,0x17,0x0E,0x7C,0x7E,0x16,0x0F,0x7D,0x7E,0x14,0x11,0x7D,
199     0x7D,0x13,0x13,0x7D,0x7D,0x11,0x14,0x7E,0x7D,0x0F,0x16,0x7E,0x7D,0x0E,0x17,0x7E,
200     0x7D,0x0C,0x18,0x7F,0x7D,0x0A,0x18,0x01,0x7D,0x08,0x19,0x02,0x7D,0x06,0x19,0x04,
201     0x00,0x03,
202     0x08,0x12,0x08,0x7E,0x07,0x12,0x09,0x7E,0x06,0x12,0x0A,0x7E,0x05,0x11,0x0B,0x7F,
203     0x04,0x11,0x0C,0x7F,0x03,0x11,0x0C,0x00,0x03,0x10,0x0D,0x00,0x02,0x0F,0x0E,0x01,
204     0x01,0x0F,0x0F,0x01,0x01,0x0E,0x0F,0x02,0x00,0x0D,0x10,0x03,0x7F,0x0C,0x11,0x04,
205     0x7F,0x0C,0x11,0x04,0x7F,0x0B,0x11,0x05,0x7E,0x0A,0x12,0x06,0x7E,0x09,0x12,0x07,
206     0x40,0x02,
207     0x04,0x1A,0x04,0x7E,0x02,0x1B,0x05,0x7E,0x01,0x1A,0x07,0x7E,0x00,0x1A,0x09,0x7D,
208     0x7F,0x19,0x0B,0x7D,0x7E,0x18,0x0D,0x7D,0x7D,0x17,0x10,0x7C,0x7D,0x15,0x12,0x7C,
209     0x7C,0x14,0x14,0x7C,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0D,0x18,0x7F,
210     0x7D,0x0B,0x19,0x7F,0x7D,0x09,0x1A,0x00,0x7D,0x07,0x1A,0x02,0x7E,0x05,0x1B,0x02,
211     0xFF,0xFF
212 };
213 
214 static const unsigned char SiS_Part2CLVX_5[] = {   /* 750p */
215     0x00,0x03,
216     0x05,0x19,0x05,0x7D,0x03,0x19,0x06,0x7E,0x02,0x19,0x08,0x7D,0x01,0x18,0x0A,0x7D,
217     0x00,0x18,0x0C,0x7C,0x7F,0x17,0x0E,0x7C,0x7E,0x16,0x0F,0x7D,0x7E,0x14,0x11,0x7D,
218     0x7D,0x13,0x13,0x7D,0x7D,0x11,0x14,0x7E,0x7D,0x0F,0x16,0x7E,0x7D,0x0E,0x17,0x7E,
219     0x7D,0x0C,0x18,0x7F,0x7D,0x0A,0x18,0x01,0x7D,0x08,0x19,0x02,0x7D,0x06,0x19,0x04,
220     0xFF,0xFF
221 };
222 
223 static const unsigned char SiS_Part2CLVX_6[] = {   /* 1080i */
224     0x00,0x04,
225     0x04,0x1A,0x04,0x7E,0x02,0x1B,0x05,0x7E,0x01,0x1A,0x07,0x7E,0x00,0x1A,0x09,0x7D,
226     0x7F,0x19,0x0B,0x7D,0x7E,0x18,0x0D,0x7D,0x7D,0x17,0x10,0x7C,0x7D,0x15,0x12,0x7C,
227     0x7C,0x14,0x14,0x7C,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0D,0x18,0x7F,
228     0x7D,0x0B,0x19,0x7F,0x7D,0x09,0x1A,0x00,0x7D,0x07,0x1A,0x02,0x7E,0x05,0x1B,0x02,
229     0xFF,0xFF,
230 };
231 
232 #ifdef CONFIG_FB_SIS_315
233 /* 661 et al LCD data structure (2.03.00) */
234 static const unsigned char SiS_LCDStruct661[] = {
235     /* 1024x768 */
236 /*  type|CR37|   HDE   |   VDE   |    HT   |    VT   |   hss    | hse   */
237     0x02,0xC0,0x00,0x04,0x00,0x03,0x40,0x05,0x26,0x03,0x10,0x00,0x88,
238     0x00,0x02,0x00,0x06,0x00,0x41,0x5A,0x64,0x00,0x00,0x00,0x00,0x04,
239     /*  | vss     |    vse  |clck|  clock  |CRT2DataP|CRT2DataP|idx     */
240     /*					      VESA    non-VESA  noscale */
241     /* 1280x1024 */
242     0x03,0xC0,0x00,0x05,0x00,0x04,0x98,0x06,0x2A,0x04,0x30,0x00,0x70,
243     0x00,0x01,0x00,0x03,0x00,0x6C,0xF8,0x2F,0x00,0x00,0x00,0x00,0x08,
244     /* 1400x1050 */
245     0x09,0x20,0x78,0x05,0x1A,0x04,0x98,0x06,0x2A,0x04,0x18,0x00,0x38,
246     0x00,0x01,0x00,0x03,0x00,0x6C,0xF8,0x2F,0x00,0x00,0x00,0x00,0x09,
247     /* 1600x1200 */
248     0x0B,0xE0,0x40,0x06,0xB0,0x04,0x70,0x08,0xE2,0x04,0x40,0x00,0xC0,
249     0x00,0x01,0x00,0x03,0x00,0xA2,0x70,0x24,0x00,0x00,0x00,0x00,0x0A,
250     /* 1280x768 (_2) */
251     0x0A,0xE0,0x00,0x05,0x00,0x03,0x7C,0x06,0x26,0x03,0x30,0x00,0x70,
252     0x00,0x03,0x00,0x06,0x00,0x4D,0xC8,0x48,0x00,0x00,0x00,0x00,0x06,
253     /* 1280x720 */
254     0x0E,0xE0,0x00,0x05,0xD0,0x02,0x80,0x05,0x26,0x03,0x10,0x00,0x20,
255     0x00,0x01,0x00,0x06,0x00,0x45,0x9C,0x62,0x00,0x00,0x00,0x00,0x05,
256     /* 1280x800 (_2) */
257     0x0C,0xE0,0x00,0x05,0x20,0x03,0x10,0x06,0x2C,0x03,0x30,0x00,0x70,
258     0x00,0x04,0x00,0x03,0x00,0x49,0xCE,0x1E,0x00,0x00,0x00,0x00,0x09,
259     /* 1680x1050 */
260     0x0D,0xE0,0x90,0x06,0x1A,0x04,0x6C,0x07,0x2A,0x04,0x1A,0x00,0x4C,
261     0x00,0x03,0x00,0x06,0x00,0x79,0xBE,0x44,0x00,0x00,0x00,0x00,0x06,
262     /* 1280x800_3 */
263     0x0C,0xE0,0x00,0x05,0x20,0x03,0xAA,0x05,0x2E,0x03,0x30,0x00,0x50,
264     0x00,0x04,0x00,0x03,0x00,0x47,0xA9,0x10,0x00,0x00,0x00,0x00,0x07,
265     /* 800x600 */
266     0x01,0xC0,0x20,0x03,0x58,0x02,0x20,0x04,0x74,0x02,0x2A,0x00,0x80,
267     0x00,0x06,0x00,0x04,0x00,0x28,0x63,0x4B,0x00,0x00,0x00,0x00,0x00,
268     /* 1280x854 */
269     0x08,0xE0,0x00,0x05,0x56,0x03,0x80,0x06,0x5d,0x03,0x10,0x00,0x70,
270     0x00,0x01,0x00,0x03,0x00,0x54,0x75,0x13,0x00,0x00,0x00,0x00,0x08
271 };
272 #endif
273 
274 #ifdef CONFIG_FB_SIS_300
275 static unsigned char SiS300_TrumpionData[14][80] = {
276   { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0x7F,0x00,0x80,0x02,
277     0x20,0x03,0x0B,0x00,0x90,0x01,0xC1,0x01,0x60,0x0C,0x30,0x10,0x00,0x00,0x04,0x23,
278     0x00,0x00,0x03,0x28,0x03,0x10,0x05,0x08,0x40,0x10,0x00,0x10,0x04,0x23,0x00,0x23,
279     0x03,0x11,0x60,0xBC,0x01,0xFF,0x03,0xFF,0x19,0x01,0x00,0x05,0x09,0x04,0x04,0x05,
280     0x04,0x0C,0x09,0x05,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x5A,0x01,0xBE,0x01,0x00 },
281   { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0x27,0x00,0x80,0x02,
282     0x20,0x03,0x07,0x00,0x5E,0x01,0x0D,0x02,0x60,0x0C,0x30,0x11,0x00,0x00,0x04,0x23,
283     0x00,0x00,0x03,0x80,0x03,0x28,0x06,0x08,0x40,0x11,0x00,0x11,0x04,0x23,0x00,0x23,
284     0x03,0x11,0x60,0x90,0x01,0xFF,0x0F,0xF4,0x19,0x01,0x00,0x05,0x01,0x00,0x04,0x05,
285     0x04,0x0C,0x02,0x01,0x02,0xB0,0x00,0x00,0x02,0xBA,0xEC,0x57,0x01,0xBE,0x01,0x00 },
286   { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0x8A,0x00,0xD8,0x02,
287     0x84,0x03,0x16,0x00,0x90,0x01,0xC1,0x01,0x60,0x0C,0x30,0x1C,0x00,0x20,0x04,0x23,
288     0x00,0x01,0x03,0x53,0x03,0x28,0x06,0x08,0x40,0x1C,0x00,0x16,0x04,0x23,0x00,0x23,
289     0x03,0x11,0x60,0xD9,0x01,0xFF,0x0F,0xF4,0x18,0x07,0x05,0x05,0x13,0x04,0x04,0x05,
290     0x01,0x0B,0x13,0x0A,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x59,0x01,0xBE,0x01,0x00 },
291   { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0x72,0x00,0xD8,0x02,
292     0x84,0x03,0x16,0x00,0x90,0x01,0xC1,0x01,0x60,0x0C,0x30,0x1C,0x00,0x20,0x04,0x23,
293     0x00,0x01,0x03,0x53,0x03,0x28,0x06,0x08,0x40,0x1C,0x00,0x16,0x04,0x23,0x00,0x23,
294     0x03,0x11,0x60,0xDA,0x01,0xFF,0x0F,0xF4,0x18,0x07,0x05,0x05,0x13,0x04,0x04,0x05,
295     0x01,0x0B,0x13,0x0A,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x55,0x01,0xBE,0x01,0x00 },
296   { 0x02,0x0A,0x02,0x00,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0x7F,0x00,0x80,0x02,
297     0x20,0x03,0x16,0x00,0xE0,0x01,0x0D,0x02,0x60,0x0C,0x30,0x98,0x00,0x00,0x04,0x23,
298     0x00,0x01,0x03,0x45,0x03,0x48,0x06,0x08,0x40,0x98,0x00,0x98,0x04,0x23,0x00,0x23,
299     0x03,0x11,0x60,0xF4,0x01,0xFF,0x0F,0xF4,0x18,0x01,0x00,0x05,0x01,0x00,0x05,0x05,
300     0x04,0x0C,0x08,0x05,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x5B,0x01,0xBE,0x01,0x00 },
301   { 0x02,0x0A,0x02,0x01,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0xBF,0x00,0x20,0x03,
302     0x20,0x04,0x0D,0x00,0x58,0x02,0x71,0x02,0x80,0x0C,0x30,0x9A,0x00,0xFA,0x03,0x1D,
303     0x00,0x01,0x03,0x22,0x03,0x28,0x06,0x08,0x40,0x98,0x00,0x98,0x04,0x1D,0x00,0x1D,
304     0x03,0x11,0x60,0x39,0x03,0x40,0x05,0xF4,0x18,0x07,0x02,0x06,0x04,0x01,0x06,0x0B,
305     0x02,0x0A,0x20,0x19,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x5B,0x01,0xBE,0x01,0x00 },
306   { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0xEF,0x00,0x00,0x04,
307     0x40,0x05,0x13,0x00,0x00,0x03,0x26,0x03,0x88,0x0C,0x30,0x90,0x00,0x00,0x04,0x23,
308     0x00,0x01,0x03,0x24,0x03,0x28,0x06,0x08,0x40,0x90,0x00,0x90,0x04,0x23,0x00,0x23,
309     0x03,0x11,0x60,0x40,0x05,0xFF,0x0F,0xF4,0x18,0x01,0x00,0x08,0x01,0x00,0x08,0x01,
310     0x00,0x08,0x01,0x01,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x5B,0x01,0xBE,0x01,0x00 },
311   /* variant 2 */
312   { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x11,0x00,0x0D,0x10,0x7F,0x00,0x80,0x02,
313     0x20,0x03,0x15,0x00,0x90,0x01,0xC1,0x01,0x60,0x0C,0x30,0x18,0x00,0x00,0x04,0x23,
314     0x00,0x01,0x03,0x44,0x03,0x28,0x06,0x08,0x40,0x18,0x00,0x18,0x04,0x23,0x00,0x23,
315     0x03,0x11,0x60,0xA6,0x01,0xFF,0x03,0xFF,0x19,0x01,0x00,0x05,0x13,0x04,0x04,0x05,
316     0x04,0x0C,0x13,0x0A,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x55,0x01,0xBE,0x01,0x00 },
317   { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x11,0x00,0x0D,0x10,0x7F,0x00,0x80,0x02,
318     0x20,0x03,0x15,0x00,0x90,0x01,0xC1,0x01,0x60,0x0C,0x30,0x18,0x00,0x00,0x04,0x23,
319     0x00,0x01,0x03,0x44,0x03,0x28,0x06,0x08,0x40,0x18,0x00,0x18,0x04,0x23,0x00,0x23,
320     0x03,0x11,0x60,0xA6,0x01,0xFF,0x03,0xFF,0x19,0x01,0x00,0x05,0x13,0x04,0x04,0x05,
321     0x04,0x0C,0x13,0x0A,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x55,0x01,0xBE,0x01,0x00 },
322   { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x11,0x00,0x0D,0x10,0x8A,0x00,0xD8,0x02,
323     0x84,0x03,0x16,0x00,0x90,0x01,0xC1,0x01,0x60,0x0C,0x30,0x1C,0x00,0x20,0x04,0x23,
324     0x00,0x01,0x03,0x53,0x03,0x28,0x06,0x08,0x40,0x1C,0x00,0x16,0x04,0x23,0x00,0x23,
325     0x03,0x11,0x60,0xDA,0x01,0xFF,0x0F,0xF4,0x18,0x07,0x05,0x05,0x13,0x04,0x04,0x05,
326     0x01,0x0B,0x13,0x0A,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x55,0x01,0xBE,0x01,0x00 },
327   { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x11,0x00,0x0D,0x10,0x72,0x00,0xD8,0x02,
328     0x84,0x03,0x16,0x00,0x90,0x01,0xC1,0x01,0x60,0x0C,0x30,0x1C,0x00,0x20,0x04,0x23,
329     0x00,0x01,0x03,0x53,0x03,0x28,0x06,0x08,0x40,0x1C,0x00,0x16,0x04,0x23,0x00,0x23,
330     0x03,0x11,0x60,0xDA,0x01,0xFF,0x0F,0xF4,0x18,0x07,0x05,0x05,0x13,0x04,0x04,0x05,
331     0x01,0x0B,0x13,0x0A,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x55,0x01,0xBE,0x01,0x00 },
332   { 0x02,0x0A,0x02,0x00,0x04,0x01,0x00,0x03,0x11,0x00,0x0D,0x10,0x7F,0x00,0x80,0x02,
333     0x20,0x03,0x16,0x00,0xE0,0x01,0x0D,0x02,0x60,0x0C,0x30,0x98,0x00,0x00,0x04,0x23,
334     0x00,0x01,0x03,0x45,0x03,0x48,0x06,0x08,0x40,0x98,0x00,0x98,0x04,0x23,0x00,0x23,
335     0x03,0x11,0x60,0xF4,0x01,0xFF,0x0F,0xF4,0x18,0x01,0x00,0x05,0x01,0x00,0x05,0x05,
336     0x04,0x0C,0x08,0x05,0x02,0xB0,0x00,0x00,0x02,0xBA,0xEA,0x58,0x01,0xBE,0x01,0x00 },
337   { 0x02,0x0A,0x02,0x01,0x04,0x01,0x00,0x03,0x11,0x00,0x0D,0x10,0xBF,0x00,0x20,0x03,
338     0x20,0x04,0x0D,0x00,0x58,0x02,0x71,0x02,0x80,0x0C,0x30,0x9A,0x00,0xFA,0x03,0x1D,
339     0x00,0x01,0x03,0x22,0x03,0x28,0x06,0x08,0x40,0x98,0x00,0x98,0x04,0x1D,0x00,0x1D,
340     0x03,0x11,0x60,0x39,0x03,0x40,0x05,0xF4,0x18,0x07,0x02,0x06,0x04,0x01,0x06,0x0B,
341     0x02,0x0A,0x20,0x19,0x02,0xB0,0x00,0x00,0x02,0xBA,0xEA,0x58,0x01,0xBE,0x01,0x00 },
342   { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x11,0x00,0x0D,0x10,0xEF,0x00,0x00,0x04,
343     0x40,0x05,0x13,0x00,0x00,0x03,0x26,0x03,0x88,0x0C,0x30,0x90,0x00,0x00,0x04,0x23,
344     0x00,0x01,0x03,0x24,0x03,0x28,0x06,0x08,0x40,0x90,0x00,0x90,0x04,0x23,0x00,0x23,
345     0x03,0x11,0x60,0x40,0x05,0xFF,0x0F,0xF4,0x18,0x01,0x00,0x08,0x01,0x00,0x08,0x01,
346     0x00,0x08,0x01,0x01,0x02,0xB0,0x00,0x00,0x02,0xBA,0xEA,0x58,0x01,0xBE,0x01,0x00 }
347 };
348 #endif
349 
350 void		SiS_UnLockCRT2(struct SiS_Private *SiS_Pr);
351 void		SiS_EnableCRT2(struct SiS_Private *SiS_Pr);
352 unsigned short	SiS_GetRatePtr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex);
353 void		SiS_WaitRetrace1(struct SiS_Private *SiS_Pr);
354 bool		SiS_IsDualEdge(struct SiS_Private *SiS_Pr);
355 bool		SiS_IsVAMode(struct SiS_Private *SiS_Pr);
356 void		SiS_GetVBInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
357 			unsigned short ModeIdIndex, int checkcrt2mode);
358 void		SiS_SetYPbPr(struct SiS_Private *SiS_Pr);
359 void    	SiS_SetTVMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
360 			unsigned short ModeIdIndex);
361 void		SiS_GetLCDResInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
362 		unsigned short ModeIdIndex);
363 unsigned short	SiS_GetVCLK2Ptr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
364 			unsigned short RefreshRateTableIndex);
365 unsigned short	SiS_GetResInfo(struct SiS_Private *SiS_Pr,unsigned short ModeNo,unsigned short ModeIdIndex);
366 void		SiS_DisableBridge(struct SiS_Private *SiS_Pr);
367 bool		SiS_SetCRT2Group(struct SiS_Private *SiS_Pr, unsigned short ModeNo);
368 void		SiS_SiS30xBLOn(struct SiS_Private *SiS_Pr);
369 void		SiS_SiS30xBLOff(struct SiS_Private *SiS_Pr);
370 
371 void		SiS_SetCH700x(struct SiS_Private *SiS_Pr, unsigned short reg, unsigned char val);
372 unsigned short	SiS_GetCH700x(struct SiS_Private *SiS_Pr, unsigned short tempax);
373 void		SiS_SetCH701x(struct SiS_Private *SiS_Pr, unsigned short reg, unsigned char val);
374 unsigned short	SiS_GetCH701x(struct SiS_Private *SiS_Pr, unsigned short tempax);
375 void		SiS_SetCH70xxANDOR(struct SiS_Private *SiS_Pr, unsigned short reg,
376 			unsigned char orval,unsigned short andval);
377 #ifdef CONFIG_FB_SIS_315
378 static void	SiS_Chrontel701xOn(struct SiS_Private *SiS_Pr);
379 static void	SiS_Chrontel701xOff(struct SiS_Private *SiS_Pr);
380 static void	SiS_ChrontelInitTVVSync(struct SiS_Private *SiS_Pr);
381 static void	SiS_ChrontelDoSomething1(struct SiS_Private *SiS_Pr);
382 void		SiS_Chrontel701xBLOn(struct SiS_Private *SiS_Pr);
383 void		SiS_Chrontel701xBLOff(struct SiS_Private *SiS_Pr);
384 #endif /* 315 */
385 
386 #ifdef CONFIG_FB_SIS_300
387 static  bool	SiS_SetTrumpionBlock(struct SiS_Private *SiS_Pr, unsigned char *dataptr);
388 void		SiS_SetChrontelGPIO(struct SiS_Private *SiS_Pr, unsigned short myvbinfo);
389 #endif
390 
391 void		SiS_DDC2Delay(struct SiS_Private *SiS_Pr, unsigned int delaytime);
392 unsigned short	SiS_ReadDDC1Bit(struct SiS_Private *SiS_Pr);
393 unsigned short	SiS_HandleDDC(struct SiS_Private *SiS_Pr, unsigned int VBFlags, int VGAEngine,
394 			unsigned short adaptnum, unsigned short DDCdatatype,
395 			unsigned char *buffer, unsigned int VBFlags2);
396 
397 static unsigned short	SiS_InitDDCRegs(struct SiS_Private *SiS_Pr, unsigned int VBFlags,
398 				int VGAEngine, unsigned short adaptnum, unsigned short DDCdatatype,
399 				bool checkcr32, unsigned int VBFlags2);
400 static unsigned short	SiS_ProbeDDC(struct SiS_Private *SiS_Pr);
401 static unsigned short	SiS_ReadDDC(struct SiS_Private *SiS_Pr, unsigned short DDCdatatype,
402 				unsigned char *buffer);
403 static void		SiS_SetSwitchDDC2(struct SiS_Private *SiS_Pr);
404 static unsigned short	SiS_SetStart(struct SiS_Private *SiS_Pr);
405 static unsigned short	SiS_SetStop(struct SiS_Private *SiS_Pr);
406 static unsigned short	SiS_SetSCLKLow(struct SiS_Private *SiS_Pr);
407 static unsigned short	SiS_SetSCLKHigh(struct SiS_Private *SiS_Pr);
408 static unsigned short	SiS_ReadDDC2Data(struct SiS_Private *SiS_Pr);
409 static unsigned short	SiS_WriteDDC2Data(struct SiS_Private *SiS_Pr, unsigned short tempax);
410 static unsigned short	SiS_CheckACK(struct SiS_Private *SiS_Pr);
411 static unsigned short	SiS_WriteDABDDC(struct SiS_Private *SiS_Pr);
412 static unsigned short	SiS_PrepareReadDDC(struct SiS_Private *SiS_Pr);
413 static unsigned short	SiS_PrepareDDC(struct SiS_Private *SiS_Pr);
414 static void		SiS_SendACK(struct SiS_Private *SiS_Pr, unsigned short yesno);
415 static unsigned short	SiS_DoProbeDDC(struct SiS_Private *SiS_Pr);
416 
417 #ifdef CONFIG_FB_SIS_300
418 static void		SiS_OEM300Setting(struct SiS_Private *SiS_Pr,
419 				unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefTabindex);
420 static void		SetOEMLCDData2(struct SiS_Private *SiS_Pr,
421 				unsigned short ModeNo, unsigned short ModeIdIndex,unsigned short RefTableIndex);
422 #endif
423 #ifdef CONFIG_FB_SIS_315
424 static void		SiS_OEM310Setting(struct SiS_Private *SiS_Pr,
425 				unsigned short ModeNo,unsigned short ModeIdIndex, unsigned short RRTI);
426 static void		SiS_OEM661Setting(struct SiS_Private *SiS_Pr,
427 				unsigned short ModeNo,unsigned short ModeIdIndex, unsigned short RRTI);
428 static void		SiS_FinalizeLCD(struct SiS_Private *, unsigned short, unsigned short);
429 #endif
430 
431 extern void		SiS_DisplayOff(struct SiS_Private *SiS_Pr);
432 extern void		SiS_DisplayOn(struct SiS_Private *SiS_Pr);
433 extern bool		SiS_SearchModeID(struct SiS_Private *, unsigned short *, unsigned short *);
434 extern unsigned short	SiS_GetModeFlag(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
435 				unsigned short ModeIdIndex);
436 extern unsigned short	SiS_GetModePtr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex);
437 extern unsigned short	SiS_GetColorDepth(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex);
438 extern unsigned short	SiS_GetOffset(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
439 				unsigned short RefreshRateTableIndex);
440 extern void		SiS_LoadDAC(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
441 				unsigned short ModeIdIndex);
442 extern void		SiS_CalcLCDACRT1Timing(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
443 				unsigned short ModeIdIndex);
444 extern void		SiS_CalcCRRegisters(struct SiS_Private *SiS_Pr, int depth);
445 extern unsigned short	SiS_GetRefCRTVCLK(struct SiS_Private *SiS_Pr, unsigned short Index, int UseWide);
446 extern unsigned short	SiS_GetRefCRT1CRTC(struct SiS_Private *SiS_Pr, unsigned short Index, int UseWide);
447 #ifdef CONFIG_FB_SIS_300
448 extern void		SiS_GetFIFOThresholdIndex300(struct SiS_Private *SiS_Pr, unsigned short *tempbx,
449 				unsigned short *tempcl);
450 extern unsigned short	SiS_GetFIFOThresholdB300(unsigned short tempbx, unsigned short tempcl);
451 extern unsigned short	SiS_GetLatencyFactor630(struct SiS_Private *SiS_Pr, unsigned short index);
452 extern unsigned int	sisfb_read_nbridge_pci_dword(struct SiS_Private *SiS_Pr, int reg);
453 extern unsigned int	sisfb_read_lpc_pci_dword(struct SiS_Private *SiS_Pr, int reg);
454 #endif
455 
456 #endif
457