1/* $XFree86$ */
2/* $XdotOrg$ */
3/*
4 * OEM Data for 315/330/340 series
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
53static const unsigned char SiS310_LCDDelayCompensation_301[] =	    		/* 301 */
54{
55	0x00,0x00,0x00,    /*   800x600 */
56	0x0b,0x0b,0x0b,    /*  1024x768 */
57	0x08,0x08,0x08,    /* 1280x1024 */
58	0x00,0x00,0x00,    /*   640x480 (unknown) */
59	0x00,0x00,0x00,    /*  1024x600 (unknown) */
60	0x00,0x00,0x00,    /*  1152x864 (unknown) */
61	0x08,0x08,0x08,    /*  1280x960 (guessed) */
62	0x00,0x00,0x00,    /*  1152x768 (unknown) */
63	0x08,0x08,0x08,    /* 1400x1050 */
64	0x08,0x08,0x08,    /*  1280x768  (guessed) */
65	0x00,0x00,0x00,    /* 1600x1200 */
66	0x00,0x00,0x00,    /*   320x480 (unknown) */
67	0x00,0x00,0x00,
68	0x00,0x00,0x00,
69	0x00,0x00,0x00
70};
71
72/* This is contained in 650+301B BIOSes, but it is wrong - so we don't use it */
73static const unsigned char SiS310_LCDDelayCompensation_650301LV[] =	   	/* 650 + 30xLV */
74{
75	0x01,0x01,0x01,    /*   800x600 */
76	0x01,0x01,0x01,    /*  1024x768 */
77	0x01,0x01,0x01,    /* 1280x1024 */
78	0x01,0x01,0x01,    /*   640x480 (unknown) */
79	0x01,0x01,0x01,    /*  1024x600 (unknown) */
80	0x01,0x01,0x01,    /*  1152x864 (unknown) */
81	0x01,0x01,0x01,    /*  1280x960 (guessed) */
82	0x01,0x01,0x01,    /*  1152x768 (unknown) */
83	0x01,0x01,0x01,    /* 1400x1050 */
84	0x01,0x01,0x01,    /*  1280x768  (guessed) */
85	0x01,0x01,0x01,    /* 1600x1200 */
86	0x02,0x02,0x02,
87	0x02,0x02,0x02,
88	0x02,0x02,0x02,
89	0x02,0x02,0x02
90};
91
92static const unsigned char SiS310_LCDDelayCompensation_651301LV[] =	  	/* M650/651 301LV */
93{
94	0x33,0x33,0x33,    /*   800x600 (guessed) - new: PanelType, not PanelRes ! */
95	0x33,0x33,0x33,    /*  1024x768 */
96	0x33,0x33,0x33,    /* 1280x1024 */
97	0x33,0x33,0x33,    /*   640x480 (unknown) */
98	0x33,0x33,0x33,    /*  1024x600 (unknown) */
99	0x33,0x33,0x33,    /*  1152x864 (unknown) */
100	0x33,0x33,0x33,    /*  1280x960 (guessed) */
101	0x33,0x33,0x33,    /*  1152x768 (unknown) */
102	0x33,0x33,0x33,    /* 1400x1050 */
103	0x33,0x33,0x33,    /*  1280x768  (guessed) */
104	0x33,0x33,0x33,    /* 1600x1200 */
105	0x33,0x33,0x33,
106	0x33,0x33,0x33,
107	0x33,0x33,0x33,
108	0x33,0x33,0x33
109};
110
111static const unsigned char SiS310_LCDDelayCompensation_651302LV[] =	   	/* M650/651 302LV */
112{
113	0x33,0x33,0x33,    /*   800x600 (guessed) */
114	0x33,0x33,0x33,    /*  1024x768 */
115	0x33,0x33,0x33,    /* 1280x1024 */
116	0x33,0x33,0x33,    /*   640x480 (unknown) */
117	0x33,0x33,0x33,    /*  1024x600 (unknown) */
118	0x33,0x33,0x33,    /*  1152x864 (unknown) */
119	0x33,0x33,0x33,    /*  1280x960 (guessed) */
120	0x33,0x33,0x33,    /*  1152x768 (unknown) */
121	0x33,0x33,0x33,    /* 1400x1050 */
122	0x33,0x33,0x33,    /*  1280x768  (guessed) */
123	0x33,0x33,0x33,    /* 1600x1200 */
124	0x33,0x33,0x33,
125	0x33,0x33,0x33,
126	0x33,0x33,0x33,
127	0x33,0x33,0x33
128};
129
130static const unsigned char SiS310_LCDDelayCompensation_3xx301B[] =	   	/* 30xB */
131{
132	0x01,0x01,0x01,    /*   800x600 */
133	0x0C,0x0C,0x0C,    /*  1024x768 */
134	0x0C,0x0C,0x0C,    /* 1280x1024 */
135	0x08,0x08,0x08,    /*   640x480 */
136	0x0C,0x0C,0x0C,    /*  1024x600 (guessed) */
137	0x0C,0x0C,0x0C,    /*  1152x864 (guessed) */
138	0x0C,0x0C,0x0C,    /*  1280x960 (guessed) */
139	0x0C,0x0C,0x0C,    /*  1152x768 (guessed) */
140	0x0C,0x0C,0x0C,    /* 1400x1050 (guessed) */
141	0x0C,0x0C,0x0C,    /*  1280x768 (guessed) */
142	0x0C,0x0C,0x0C,    /* 1600x1200 (guessed) */
143	0x02,0x02,0x02,
144	0x02,0x02,0x02,
145	0x02,0x02,0x02,
146	0x02,0x02,0x02
147};
148
149static const unsigned char SiS310_LCDDelayCompensation_3xx301LV[] =	   	/* 315+30xLV */
150{
151	0x01,0x01,0x01,    /*   800x600 */
152	0x04,0x04,0x04,    /*  1024x768 (A531/BIOS 1.14.05f: 4 - works with 6 */
153	0x0C,0x0C,0x0C,    /* 1280x1024 */
154	0x08,0x08,0x08,    /*   640x480 */
155	0x0C,0x0C,0x0C,    /*  1024x600 (guessed) */
156	0x0C,0x0C,0x0C,    /*  1152x864 (guessed) */
157	0x0C,0x0C,0x0C,    /*  1280x960 (guessed) */
158	0x0C,0x0C,0x0C,    /*  1152x768 (guessed) */
159	0x0C,0x0C,0x0C,    /* 1400x1050 (guessed) */
160	0x0C,0x0C,0x0C,    /*  1280x768 (guessed) */
161	0x0C,0x0C,0x0C,    /* 1600x1200 (guessed) */
162	0x02,0x02,0x02,
163	0x02,0x02,0x02,
164	0x02,0x02,0x02,
165	0x02,0x02,0x02
166};
167
168static const unsigned char SiS310_TVDelayCompensation_301[] = 		/* 301 */
169{
170	0x02,0x02,    /* NTSC Enhanced, Standard */
171	0x02,0x02,    /* PAL */
172	0x08,0x0b     /* HiVision */
173};
174
175static const unsigned char SiS310_TVDelayCompensation_301B[] =		/* 30xB, 30xLV */
176{
177	0x03,0x03,
178	0x03,0x03,
179	0x03,0x03
180};
181
182static const unsigned char SiS310_TVDelayCompensation_740301B[] =	/* 740 + 30xB (30xLV?) */
183{
184	0x05,0x05,
185	0x05,0x05,
186	0x05,0x05
187};
188
189static const unsigned char SiS310_TVDelayCompensation_651301LV[] =	/* M650, 651, 301LV */
190{
191	0x33,0x33,
192	0x33,0x33,
193	0x33,0x33
194};
195
196static const unsigned char SiS310_TVDelayCompensation_651302LV[] =	/* M650, 651, 302LV */
197{
198	0x33,0x33,
199	0x33,0x33,
200	0x33,0x33
201};
202
203#if 0 /* Not used */
204static const unsigned char SiS_TVDelay661_301[] =			/* 661, 301 */
205{
206	0x44,0x44,
207	0x44,0x44,
208	0x00,0x00,
209	0x44,0x44,
210	0x44,0x44,
211	0x44,0x44
212};
213
214static const unsigned char SiS_TVDelay661_301B[] =			/* 661, 301B et al */
215{
216	0x44,0x44,
217	0x44,0x44,
218	0x00,0x00,
219	0x44,0x44,
220	0x44,0x44,
221	0x44,0x44
222};
223#endif
224
225static const unsigned char SiS310_TVDelayCompensation_LVDS[] =		/* LVDS */
226{
227	0x0a,0x0a,
228	0x0a,0x0a,
229	0x0a,0x0a
230};
231
232static const unsigned char SiS310_TVAntiFlick1[6][2] =
233{
234	{0x4,0x0},
235	{0x4,0x8},
236	{0x0,0x0},
237	{0x0,0x0},
238	{0x0,0x0},
239	{0x0,0x0}
240};
241
242static const unsigned char SiS310_TVEdge1[6][2] =
243{
244	{0x0,0x4},
245	{0x0,0x4},
246	{0x0,0x0},
247	{0x0,0x0},
248	{0x0,0x0},
249	{0x0,0x0}
250};
251
252static const unsigned char SiS310_TVYFilter1[5][8][4] =
253{
254   {
255	{0x00,0xf4,0x10,0x38},	/* NTSC */
256	{0x00,0xf4,0x10,0x38},
257	{0xeb,0x04,0x25,0x18},
258	{0xf1,0x04,0x1f,0x18},
259	{0x00,0xf4,0x10,0x38},
260	{0xeb,0x04,0x25,0x18},
261	{0xee,0x0c,0x22,0x08},
262	{0xeb,0x15,0x25,0xf6}
263   },
264   {
265	{0x00,0xf4,0x10,0x38},	/* PAL */
266	{0x00,0xf4,0x10,0x38},
267	{0xf1,0xf7,0x1f,0x32},
268	{0xf3,0x00,0x1d,0x20},
269	{0x00,0xf4,0x10,0x38},
270	{0xf1,0xf7,0x1f,0x32},
271	{0xf3,0x00,0x1d,0x20},
272	{0xfc,0xfb,0x14,0x2a}
273   },
274   {
275	{0x00,0x00,0x00,0x00},	/* HiVision */
276	{0x00,0xf4,0x10,0x38},
277	{0x00,0xf4,0x10,0x38},
278	{0xeb,0x04,0x25,0x18},
279	{0xf7,0x06,0x19,0x14},
280	{0x00,0xf4,0x10,0x38},
281	{0xeb,0x04,0x25,0x18},
282	{0xee,0x0c,0x22,0x08}
283   },
284   {
285	{0x00,0xf4,0x10,0x38},	/* PAL-M */
286	{0x00,0xf4,0x10,0x38},
287	{0xeb,0x04,0x10,0x18},
288	{0xf7,0x06,0x19,0x14},
289	{0x00,0xf4,0x10,0x38},
290	{0xeb,0x04,0x25,0x18},
291	{0xeb,0x04,0x25,0x18},
292	{0xeb,0x15,0x25,0xf6}
293   },
294   {
295	{0x00,0xf4,0x10,0x38},	/* PAL-N */
296	{0x00,0xf4,0x10,0x38},
297	{0xeb,0x04,0x10,0x18},
298	{0xf7,0x06,0x19,0x14},
299	{0x00,0xf4,0x10,0x38},
300	{0xeb,0x04,0x25,0x18},
301	{0xeb,0x04,0x25,0x18},
302	{0xeb,0x15,0x25,0xf6}
303   }
304};
305
306static const unsigned char SiS310_TVYFilter2[5][9][7] =
307{
308   {
309	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},	/* NTSC */
310	{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
311	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
312	{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
313	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
314	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
315	{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
316	{0x01,0x01,0xFC,0xF8,0x08,0x26,0x38},
317	{0xFF,0xFF,0xFC,0x00,0x0F,0x22,0x28}
318   },
319   {
320	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},   /* PAL */
321	{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
322	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
323	{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
324	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
325	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
326	{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
327	{0x01,0x01,0xFC,0xF8,0x08,0x26,0x38},
328	{0xFF,0xFF,0xFC,0x00,0x0F,0x22,0x28}
329   },
330   {
331	{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22},	/* HiVision */
332	{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22},
333	{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22},
334	{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22},
335	{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22},
336	{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22},
337	{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22},
338	{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22},
339	{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22}
340   },
341   {
342	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46}, 	/* PAL-M */
343	{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
344	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
345	{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
346	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
347	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
348	{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
349	{0x01,0x01,0xFC,0xF8,0x08,0x26,0x38},
350	{0xFF,0xFF,0xFC,0x00,0x0F,0x22,0x28}
351   },
352   {
353	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},	/* PAL-N */
354	{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
355	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
356	{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
357	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
358	{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
359	{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
360	{0x01,0x01,0xFC,0xF8,0x08,0x26,0x38},
361	{0xFF,0xFF,0xFC,0x00,0x0F,0x22,0x28}
362   }
363};
364
365static const unsigned char SiS310_TVPhaseIncr1[3][2][4] =
366{
367   {
368	{0x21,0xed,0xba,0x08},
369	{0x21,0xed,0xba,0x08}
370   },
371   {
372	{0x2a,0x05,0xe3,0x00},
373	{0x2a,0x05,0xe3,0x00}
374   },
375   {
376	{0x2a,0x05,0xd3,0x00},
377	{0x2a,0x05,0xd3,0x00}
378   }
379};
380
381static const unsigned char SiS310_TVPhaseIncr2[3][2][4] =
382{
383   {
384	{0x21,0xf0,0x7b,0xd6},
385	{0x21,0xf0,0x7b,0xd6}
386   },
387   {
388	{0x2a,0x0a,0x41,0xe9},
389	{0x2a,0x0a,0x41,0xe9}
390   },
391   {
392	{0x2a,0x05,0xd3,0x00},
393	{0x2a,0x05,0xd3,0x00}
394   }
395};
396
397/**************************************************************/
398/* CUSTOM TIMING DATA --------------------------------------- */
399/**************************************************************/
400
401/* Inventec / Compaq Presario 3045US, 3017 */
402
403static const struct SiS_LCDData SiS310_ExtCompaq1280x1024Data[] =
404{
405	{  211,  60,1024, 501,1688,1066},
406	{  211,  60,1024, 508,1688,1066},
407	{  211,  60,1024, 501,1688,1066},
408	{  211,  60,1024, 508,1688,1066},
409	{   32,  15,1696, 501,1696,1066},
410	{  212,  75,1024, 621,1696,1066},
411	{    4,   3,1696, 810,1696,1066},
412	{    1,   1,1696,1066,1696,1066}
413};
414
415/* Asus A2xxxH _2 */
416
417static const struct SiS_Part2PortTbl SiS310_CRT2Part2_Asus1024x768_3[] =
418{
419	{{0x25,0x13,0xc9,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
420	{{0x2c,0x13,0x9a,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
421	{{0x25,0x13,0xc9,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
422	{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
423	{{0x38,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
424	{{0x38,0x13,0x16,0x25,0xff,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
425	{{0x36,0x13,0x13,0x25,0xff,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
426	{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
427	{{0x25,0x13,0xc9,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}}
428};
429
430
431
432
433