1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
4*4882a593Smuzhiyun * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <linux/via-core.h>
9*4882a593Smuzhiyun #include "global.h"
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun struct io_reg CN400_ModeXregs[] = { {VIASR, SR10, 0xFF, 0x01},
12*4882a593Smuzhiyun {VIASR, SR15, 0x02, 0x02},
13*4882a593Smuzhiyun {VIASR, SR16, 0xBF, 0x08},
14*4882a593Smuzhiyun {VIASR, SR17, 0xFF, 0x1F},
15*4882a593Smuzhiyun {VIASR, SR18, 0xFF, 0x4E},
16*4882a593Smuzhiyun {VIASR, SR1A, 0xFB, 0x08},
17*4882a593Smuzhiyun {VIASR, SR1E, 0x0F, 0x01},
18*4882a593Smuzhiyun {VIASR, SR2A, 0xFF, 0x00},
19*4882a593Smuzhiyun {VIACR, CR32, 0xFF, 0x00},
20*4882a593Smuzhiyun {VIACR, CR33, 0xFF, 0x00},
21*4882a593Smuzhiyun {VIACR, CR35, 0xFF, 0x00},
22*4882a593Smuzhiyun {VIACR, CR36, 0x08, 0x00},
23*4882a593Smuzhiyun {VIACR, CR69, 0xFF, 0x00},
24*4882a593Smuzhiyun {VIACR, CR6A, 0xFF, 0x40},
25*4882a593Smuzhiyun {VIACR, CR6B, 0xFF, 0x00},
26*4882a593Smuzhiyun {VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
27*4882a593Smuzhiyun {VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
28*4882a593Smuzhiyun {VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
29*4882a593Smuzhiyun {VIACR, CR8B, 0xFF, 0x69}, /* LCD Power Sequence Control 0 */
30*4882a593Smuzhiyun {VIACR, CR8C, 0xFF, 0x57}, /* LCD Power Sequence Control 1 */
31*4882a593Smuzhiyun {VIACR, CR8D, 0xFF, 0x00}, /* LCD Power Sequence Control 2 */
32*4882a593Smuzhiyun {VIACR, CR8E, 0xFF, 0x7B}, /* LCD Power Sequence Control 3 */
33*4882a593Smuzhiyun {VIACR, CR8F, 0xFF, 0x03}, /* LCD Power Sequence Control 4 */
34*4882a593Smuzhiyun {VIACR, CR90, 0xFF, 0x30}, /* LCD Power Sequence Control 5 */
35*4882a593Smuzhiyun {VIACR, CR91, 0xFF, 0xA0}, /* 24/12 bit LVDS Data off */
36*4882a593Smuzhiyun {VIACR, CR96, 0xFF, 0x00},
37*4882a593Smuzhiyun {VIACR, CR97, 0xFF, 0x00},
38*4882a593Smuzhiyun {VIACR, CR99, 0xFF, 0x00},
39*4882a593Smuzhiyun {VIACR, CR9B, 0xFF, 0x00}
40*4882a593Smuzhiyun };
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun /* Video Mode Table for VT3314 chipset*/
43*4882a593Smuzhiyun /* Common Setting for Video Mode */
44*4882a593Smuzhiyun struct io_reg CN700_ModeXregs[] = { {VIASR, SR10, 0xFF, 0x01},
45*4882a593Smuzhiyun {VIASR, SR15, 0x02, 0x02},
46*4882a593Smuzhiyun {VIASR, SR16, 0xBF, 0x08},
47*4882a593Smuzhiyun {VIASR, SR17, 0xFF, 0x1F},
48*4882a593Smuzhiyun {VIASR, SR18, 0xFF, 0x4E},
49*4882a593Smuzhiyun {VIASR, SR1A, 0xFB, 0x82},
50*4882a593Smuzhiyun {VIASR, SR1B, 0xFF, 0xF0},
51*4882a593Smuzhiyun {VIASR, SR1F, 0xFF, 0x00},
52*4882a593Smuzhiyun {VIASR, SR1E, 0xFF, 0x01},
53*4882a593Smuzhiyun {VIASR, SR22, 0xFF, 0x1F},
54*4882a593Smuzhiyun {VIASR, SR2A, 0x0F, 0x00},
55*4882a593Smuzhiyun {VIASR, SR2E, 0xFF, 0xFF},
56*4882a593Smuzhiyun {VIASR, SR3F, 0xFF, 0xFF},
57*4882a593Smuzhiyun {VIASR, SR40, 0xF7, 0x00},
58*4882a593Smuzhiyun {VIASR, CR30, 0xFF, 0x04},
59*4882a593Smuzhiyun {VIACR, CR32, 0xFF, 0x00},
60*4882a593Smuzhiyun {VIACR, CR33, 0x7F, 0x00},
61*4882a593Smuzhiyun {VIACR, CR35, 0xFF, 0x00},
62*4882a593Smuzhiyun {VIACR, CR36, 0xFF, 0x31},
63*4882a593Smuzhiyun {VIACR, CR41, 0xFF, 0x80},
64*4882a593Smuzhiyun {VIACR, CR42, 0xFF, 0x00},
65*4882a593Smuzhiyun {VIACR, CR55, 0x80, 0x00},
66*4882a593Smuzhiyun {VIACR, CR5D, 0x80, 0x00}, /*Horizontal Retrace Start bit[11] should be 0*/
67*4882a593Smuzhiyun {VIACR, CR68, 0xFF, 0x67}, /* Default FIFO For IGA2 */
68*4882a593Smuzhiyun {VIACR, CR69, 0xFF, 0x00},
69*4882a593Smuzhiyun {VIACR, CR6A, 0xFD, 0x40},
70*4882a593Smuzhiyun {VIACR, CR6B, 0xFF, 0x00},
71*4882a593Smuzhiyun {VIACR, CR77, 0xFF, 0x00}, /* LCD scaling Factor */
72*4882a593Smuzhiyun {VIACR, CR78, 0xFF, 0x00}, /* LCD scaling Factor */
73*4882a593Smuzhiyun {VIACR, CR79, 0xFF, 0x00}, /* LCD scaling Factor */
74*4882a593Smuzhiyun {VIACR, CR9F, 0x03, 0x00}, /* LCD scaling Factor */
75*4882a593Smuzhiyun {VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
76*4882a593Smuzhiyun {VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
77*4882a593Smuzhiyun {VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
78*4882a593Smuzhiyun {VIACR, CR8B, 0xFF, 0x5D}, /* LCD Power Sequence Control 0 */
79*4882a593Smuzhiyun {VIACR, CR8C, 0xFF, 0x2B}, /* LCD Power Sequence Control 1 */
80*4882a593Smuzhiyun {VIACR, CR8D, 0xFF, 0x6F}, /* LCD Power Sequence Control 2 */
81*4882a593Smuzhiyun {VIACR, CR8E, 0xFF, 0x2B}, /* LCD Power Sequence Control 3 */
82*4882a593Smuzhiyun {VIACR, CR8F, 0xFF, 0x01}, /* LCD Power Sequence Control 4 */
83*4882a593Smuzhiyun {VIACR, CR90, 0xFF, 0x01}, /* LCD Power Sequence Control 5 */
84*4882a593Smuzhiyun {VIACR, CR91, 0xFF, 0xA0}, /* 24/12 bit LVDS Data off */
85*4882a593Smuzhiyun {VIACR, CR96, 0xFF, 0x00},
86*4882a593Smuzhiyun {VIACR, CR97, 0xFF, 0x00},
87*4882a593Smuzhiyun {VIACR, CR99, 0xFF, 0x00},
88*4882a593Smuzhiyun {VIACR, CR9B, 0xFF, 0x00},
89*4882a593Smuzhiyun {VIACR, CR9D, 0xFF, 0x80},
90*4882a593Smuzhiyun {VIACR, CR9E, 0xFF, 0x80}
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun struct io_reg KM400_ModeXregs[] = {
94*4882a593Smuzhiyun {VIASR, SR10, 0xFF, 0x01}, /* Unlock Register */
95*4882a593Smuzhiyun {VIASR, SR16, 0xFF, 0x08}, /* Display FIFO threshold Control */
96*4882a593Smuzhiyun {VIASR, SR17, 0xFF, 0x1F}, /* Display FIFO Control */
97*4882a593Smuzhiyun {VIASR, SR18, 0xFF, 0x4E}, /* GFX PREQ threshold */
98*4882a593Smuzhiyun {VIASR, SR1A, 0xFF, 0x0a}, /* GFX PREQ threshold */
99*4882a593Smuzhiyun {VIASR, SR1F, 0xFF, 0x00}, /* Memory Control 0 */
100*4882a593Smuzhiyun {VIASR, SR1B, 0xFF, 0xF0}, /* Power Management Control 0 */
101*4882a593Smuzhiyun {VIASR, SR1E, 0xFF, 0x01}, /* Power Management Control */
102*4882a593Smuzhiyun {VIASR, SR20, 0xFF, 0x00}, /* Sequencer Arbiter Control 0 */
103*4882a593Smuzhiyun {VIASR, SR21, 0xFF, 0x00}, /* Sequencer Arbiter Control 1 */
104*4882a593Smuzhiyun {VIASR, SR22, 0xFF, 0x1F}, /* Display Arbiter Control 1 */
105*4882a593Smuzhiyun {VIASR, SR2A, 0xFF, 0x00}, /* Power Management Control 5 */
106*4882a593Smuzhiyun {VIASR, SR2D, 0xFF, 0xFF}, /* Power Management Control 1 */
107*4882a593Smuzhiyun {VIASR, SR2E, 0xFF, 0xFF}, /* Power Management Control 2 */
108*4882a593Smuzhiyun {VIACR, CR33, 0xFF, 0x00},
109*4882a593Smuzhiyun {VIACR, CR55, 0x80, 0x00},
110*4882a593Smuzhiyun {VIACR, CR5D, 0x80, 0x00},
111*4882a593Smuzhiyun {VIACR, CR36, 0xFF, 0x01}, /* Power Mangement 3 */
112*4882a593Smuzhiyun {VIACR, CR68, 0xFF, 0x67}, /* Default FIFO For IGA2 */
113*4882a593Smuzhiyun {VIACR, CR6A, 0x20, 0x20}, /* Extended FIFO On */
114*4882a593Smuzhiyun {VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
115*4882a593Smuzhiyun {VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
116*4882a593Smuzhiyun {VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
117*4882a593Smuzhiyun {VIACR, CR8B, 0xFF, 0x2D}, /* LCD Power Sequence Control 0 */
118*4882a593Smuzhiyun {VIACR, CR8C, 0xFF, 0x2D}, /* LCD Power Sequence Control 1 */
119*4882a593Smuzhiyun {VIACR, CR8D, 0xFF, 0xC8}, /* LCD Power Sequence Control 2 */
120*4882a593Smuzhiyun {VIACR, CR8E, 0xFF, 0x36}, /* LCD Power Sequence Control 3 */
121*4882a593Smuzhiyun {VIACR, CR8F, 0xFF, 0x00}, /* LCD Power Sequence Control 4 */
122*4882a593Smuzhiyun {VIACR, CR90, 0xFF, 0x10}, /* LCD Power Sequence Control 5 */
123*4882a593Smuzhiyun {VIACR, CR91, 0xFF, 0xA0}, /* 24/12 bit LVDS Data off */
124*4882a593Smuzhiyun {VIACR, CR96, 0xFF, 0x03}, /* DVP0 ; DVP0 Clock Skew */
125*4882a593Smuzhiyun {VIACR, CR97, 0xFF, 0x03}, /* DFP high ; DFPH Clock Skew */
126*4882a593Smuzhiyun {VIACR, CR99, 0xFF, 0x03}, /* DFP low ; DFPL Clock Skew*/
127*4882a593Smuzhiyun {VIACR, CR9B, 0xFF, 0x07} /* DVI on DVP1 ; DVP1 Clock Skew*/
128*4882a593Smuzhiyun };
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun /* For VT3324: Common Setting for Video Mode */
131*4882a593Smuzhiyun struct io_reg CX700_ModeXregs[] = { {VIASR, SR10, 0xFF, 0x01},
132*4882a593Smuzhiyun {VIASR, SR15, 0x02, 0x02},
133*4882a593Smuzhiyun {VIASR, SR16, 0xBF, 0x08},
134*4882a593Smuzhiyun {VIASR, SR17, 0xFF, 0x1F},
135*4882a593Smuzhiyun {VIASR, SR18, 0xFF, 0x4E},
136*4882a593Smuzhiyun {VIASR, SR1A, 0xFB, 0x08},
137*4882a593Smuzhiyun {VIASR, SR1B, 0xFF, 0xF0},
138*4882a593Smuzhiyun {VIASR, SR1E, 0xFF, 0x01},
139*4882a593Smuzhiyun {VIASR, SR2A, 0xFF, 0x00},
140*4882a593Smuzhiyun {VIASR, SR2D, 0xC0, 0xC0}, /* delayed E3_ECK */
141*4882a593Smuzhiyun {VIACR, CR32, 0xFF, 0x00},
142*4882a593Smuzhiyun {VIACR, CR33, 0xFF, 0x00},
143*4882a593Smuzhiyun {VIACR, CR35, 0xFF, 0x00},
144*4882a593Smuzhiyun {VIACR, CR36, 0x08, 0x00},
145*4882a593Smuzhiyun {VIACR, CR47, 0xC8, 0x00}, /* Clear VCK Plus. */
146*4882a593Smuzhiyun {VIACR, CR69, 0xFF, 0x00},
147*4882a593Smuzhiyun {VIACR, CR6A, 0xFF, 0x40},
148*4882a593Smuzhiyun {VIACR, CR6B, 0xFF, 0x00},
149*4882a593Smuzhiyun {VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
150*4882a593Smuzhiyun {VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
151*4882a593Smuzhiyun {VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
152*4882a593Smuzhiyun {VIACR, CRD4, 0xFF, 0x81}, /* Second power sequence control */
153*4882a593Smuzhiyun {VIACR, CR8B, 0xFF, 0x5D}, /* LCD Power Sequence Control 0 */
154*4882a593Smuzhiyun {VIACR, CR8C, 0xFF, 0x2B}, /* LCD Power Sequence Control 1 */
155*4882a593Smuzhiyun {VIACR, CR8D, 0xFF, 0x6F}, /* LCD Power Sequence Control 2 */
156*4882a593Smuzhiyun {VIACR, CR8E, 0xFF, 0x2B}, /* LCD Power Sequence Control 3 */
157*4882a593Smuzhiyun {VIACR, CR8F, 0xFF, 0x01}, /* LCD Power Sequence Control 4 */
158*4882a593Smuzhiyun {VIACR, CR90, 0xFF, 0x01}, /* LCD Power Sequence Control 5 */
159*4882a593Smuzhiyun {VIACR, CR91, 0xFF, 0x80}, /* 24/12 bit LVDS Data off */
160*4882a593Smuzhiyun {VIACR, CR96, 0xFF, 0x00},
161*4882a593Smuzhiyun {VIACR, CR97, 0xFF, 0x00},
162*4882a593Smuzhiyun {VIACR, CR99, 0xFF, 0x00},
163*4882a593Smuzhiyun {VIACR, CR9B, 0xFF, 0x00}
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun struct io_reg VX855_ModeXregs[] = {
167*4882a593Smuzhiyun {VIASR, SR10, 0xFF, 0x01},
168*4882a593Smuzhiyun {VIASR, SR15, 0x02, 0x02},
169*4882a593Smuzhiyun {VIASR, SR16, 0xBF, 0x08},
170*4882a593Smuzhiyun {VIASR, SR17, 0xFF, 0x1F},
171*4882a593Smuzhiyun {VIASR, SR18, 0xFF, 0x4E},
172*4882a593Smuzhiyun {VIASR, SR1A, 0xFB, 0x08},
173*4882a593Smuzhiyun {VIASR, SR1B, 0xFF, 0xF0},
174*4882a593Smuzhiyun {VIASR, SR1E, 0x07, 0x01},
175*4882a593Smuzhiyun {VIASR, SR2A, 0xF0, 0x00},
176*4882a593Smuzhiyun {VIASR, SR58, 0xFF, 0x00},
177*4882a593Smuzhiyun {VIASR, SR59, 0xFF, 0x00},
178*4882a593Smuzhiyun {VIASR, SR2D, 0xC0, 0xC0}, /* delayed E3_ECK */
179*4882a593Smuzhiyun {VIACR, CR32, 0xFF, 0x00},
180*4882a593Smuzhiyun {VIACR, CR33, 0x7F, 0x00},
181*4882a593Smuzhiyun {VIACR, CR35, 0xFF, 0x00},
182*4882a593Smuzhiyun {VIACR, CR36, 0x08, 0x00},
183*4882a593Smuzhiyun {VIACR, CR69, 0xFF, 0x00},
184*4882a593Smuzhiyun {VIACR, CR6A, 0xFD, 0x60},
185*4882a593Smuzhiyun {VIACR, CR6B, 0xFF, 0x00},
186*4882a593Smuzhiyun {VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
187*4882a593Smuzhiyun {VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
188*4882a593Smuzhiyun {VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
189*4882a593Smuzhiyun {VIACR, CRD4, 0xFF, 0x81}, /* Second power sequence control */
190*4882a593Smuzhiyun {VIACR, CR91, 0xFF, 0x80}, /* 24/12 bit LVDS Data off */
191*4882a593Smuzhiyun {VIACR, CR96, 0xFF, 0x00},
192*4882a593Smuzhiyun {VIACR, CR97, 0xFF, 0x00},
193*4882a593Smuzhiyun {VIACR, CR99, 0xFF, 0x00},
194*4882a593Smuzhiyun {VIACR, CR9B, 0xFF, 0x00},
195*4882a593Smuzhiyun {VIACR, CRD2, 0xFF, 0xFF} /* TMDS/LVDS control register. */
196*4882a593Smuzhiyun };
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun /* Video Mode Table */
199*4882a593Smuzhiyun /* Common Setting for Video Mode */
200*4882a593Smuzhiyun struct io_reg CLE266_ModeXregs[] = { {VIASR, SR1E, 0xF0, 0x00},
201*4882a593Smuzhiyun {VIASR, SR2A, 0x0F, 0x00},
202*4882a593Smuzhiyun {VIASR, SR15, 0x02, 0x02},
203*4882a593Smuzhiyun {VIASR, SR16, 0xBF, 0x08},
204*4882a593Smuzhiyun {VIASR, SR17, 0xFF, 0x1F},
205*4882a593Smuzhiyun {VIASR, SR18, 0xFF, 0x4E},
206*4882a593Smuzhiyun {VIASR, SR1A, 0xFB, 0x08},
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun {VIACR, CR32, 0xFF, 0x00},
209*4882a593Smuzhiyun {VIACR, CR35, 0xFF, 0x00},
210*4882a593Smuzhiyun {VIACR, CR36, 0x08, 0x00},
211*4882a593Smuzhiyun {VIACR, CR6A, 0xFF, 0x80},
212*4882a593Smuzhiyun {VIACR, CR6A, 0xFF, 0xC0},
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun {VIACR, CR55, 0x80, 0x00},
215*4882a593Smuzhiyun {VIACR, CR5D, 0x80, 0x00},
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun {VIAGR, GR20, 0xFF, 0x00},
218*4882a593Smuzhiyun {VIAGR, GR21, 0xFF, 0x00},
219*4882a593Smuzhiyun {VIAGR, GR22, 0xFF, 0x00},
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun /* Mode:1024X768 */
224*4882a593Smuzhiyun struct io_reg PM1024x768[] = { {VIASR, 0x16, 0xBF, 0x0C},
225*4882a593Smuzhiyun {VIASR, 0x18, 0xFF, 0x4C}
226*4882a593Smuzhiyun };
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun struct patch_table res_patch_table[] = {
229*4882a593Smuzhiyun {ARRAY_SIZE(PM1024x768), PM1024x768}
230*4882a593Smuzhiyun };
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun /* struct VPITTable {
233*4882a593Smuzhiyun unsigned char Misc;
234*4882a593Smuzhiyun unsigned char SR[StdSR];
235*4882a593Smuzhiyun unsigned char CR[StdCR];
236*4882a593Smuzhiyun unsigned char GR[StdGR];
237*4882a593Smuzhiyun unsigned char AR[StdAR];
238*4882a593Smuzhiyun };*/
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun struct VPITTable VPIT = {
241*4882a593Smuzhiyun /* Msic */
242*4882a593Smuzhiyun 0xC7,
243*4882a593Smuzhiyun /* Sequencer */
244*4882a593Smuzhiyun {0x01, 0x0F, 0x00, 0x0E},
245*4882a593Smuzhiyun /* Graphic Controller */
246*4882a593Smuzhiyun {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
247*4882a593Smuzhiyun /* Attribute Controller */
248*4882a593Smuzhiyun {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
249*4882a593Smuzhiyun 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
250*4882a593Smuzhiyun 0x01, 0x00, 0x0F, 0x00}
251*4882a593Smuzhiyun };
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun /********************/
254*4882a593Smuzhiyun /* Mode Table */
255*4882a593Smuzhiyun /********************/
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun static const struct fb_videomode viafb_modes[] = {
258*4882a593Smuzhiyun {NULL, 60, 480, 640, 40285, 72, 24, 19, 1, 48, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
259*4882a593Smuzhiyun {NULL, 60, 640, 480, 39682, 48, 16, 33, 10, 96, 2, 0, 0, 0},
260*4882a593Smuzhiyun {NULL, 75, 640, 480, 31746, 120, 16, 16, 1, 64, 3, 0, 0, 0},
261*4882a593Smuzhiyun {NULL, 85, 640, 480, 27780, 80, 56, 25, 1, 56, 3, 0, 0, 0},
262*4882a593Smuzhiyun {NULL, 100, 640, 480, 23167, 104, 40, 25, 1, 64, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
263*4882a593Smuzhiyun {NULL, 120, 640, 480, 19081, 104, 40, 31, 1, 64, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
264*4882a593Smuzhiyun {NULL, 60, 720, 480, 37426, 88, 16, 13, 1, 72, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
265*4882a593Smuzhiyun {NULL, 60, 720, 576, 30611, 96, 24, 17, 1, 72, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
266*4882a593Smuzhiyun {NULL, 60, 800, 600, 25131, 88, 40, 23, 1, 128, 4, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
267*4882a593Smuzhiyun {NULL, 75, 800, 600, 20202, 160, 16, 21, 1, 80, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
268*4882a593Smuzhiyun {NULL, 85, 800, 600, 17790, 152, 32, 27, 1, 64, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
269*4882a593Smuzhiyun {NULL, 100, 800, 600, 14667, 136, 48, 32, 1, 88, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
270*4882a593Smuzhiyun {NULL, 120, 800, 600, 11911, 144, 56, 39, 1, 88, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
271*4882a593Smuzhiyun {NULL, 60, 800, 480, 33602, 96, 24, 10, 3, 72, 7, FB_SYNC_VERT_HIGH_ACT, 0, 0},
272*4882a593Smuzhiyun {NULL, 60, 848, 480, 31565, 104, 24, 12, 3, 80, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
273*4882a593Smuzhiyun {NULL, 60, 856, 480, 31517, 104, 16, 13, 1, 88, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
274*4882a593Smuzhiyun {NULL, 60, 1024, 512, 24218, 136, 32, 15, 1, 104, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
275*4882a593Smuzhiyun {NULL, 60, 1024, 600, 20423, 144, 40, 18, 1, 104, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
276*4882a593Smuzhiyun {NULL, 60, 1024, 768, 15385, 160, 24, 29, 3, 136, 6, 0, 0, 0},
277*4882a593Smuzhiyun {NULL, 75, 1024, 768, 12703, 176, 16, 28, 1, 96, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
278*4882a593Smuzhiyun {NULL, 85, 1024, 768, 10581, 208, 48, 36, 1, 96, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
279*4882a593Smuzhiyun {NULL, 100, 1024, 768, 8825, 184, 72, 42, 1, 112, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
280*4882a593Smuzhiyun {NULL, 75, 1152, 864, 9259, 256, 64, 32, 1, 128, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
281*4882a593Smuzhiyun {NULL, 60, 1280, 768, 12478, 200, 64, 23, 1, 136, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
282*4882a593Smuzhiyun {NULL, 50, 1280, 768, 15342, 184, 56, 19, 1, 128, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
283*4882a593Smuzhiyun {NULL, 60, 960, 600, 21964, 128, 32, 15, 3, 96, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
284*4882a593Smuzhiyun {NULL, 60, 1000, 600, 20803, 144, 40, 18, 1, 104, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
285*4882a593Smuzhiyun {NULL, 60, 1024, 576, 21278, 144, 40, 17, 1, 104, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
286*4882a593Smuzhiyun {NULL, 60, 1088, 612, 18825, 152, 48, 16, 3, 104, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
287*4882a593Smuzhiyun {NULL, 60, 1152, 720, 14974, 168, 56, 19, 3, 112, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
288*4882a593Smuzhiyun {NULL, 60, 1200, 720, 14248, 184, 56, 22, 1, 128, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
289*4882a593Smuzhiyun {NULL, 49, 1200, 900, 17703, 21, 11, 1, 1, 32, 10, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
290*4882a593Smuzhiyun {NULL, 60, 1280, 600, 16259, 184, 56, 18, 1, 128, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
291*4882a593Smuzhiyun {NULL, 60, 1280, 800, 11938, 200, 72, 22, 3, 128, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
292*4882a593Smuzhiyun {NULL, 60, 1280, 960, 9259, 312, 96, 36, 1, 112, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
293*4882a593Smuzhiyun {NULL, 60, 1280, 1024, 9262, 248, 48, 38, 1, 112, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
294*4882a593Smuzhiyun {NULL, 75, 1280, 1024, 7409, 248, 16, 38, 1, 144, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
295*4882a593Smuzhiyun {NULL, 85, 1280, 1024, 6351, 224, 64, 44, 1, 160, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
296*4882a593Smuzhiyun {NULL, 60, 1360, 768, 11759, 208, 72, 22, 3, 136, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
297*4882a593Smuzhiyun {NULL, 60, 1368, 768, 11646, 216, 72, 23, 1, 144, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
298*4882a593Smuzhiyun {NULL, 50, 1368, 768, 14301, 200, 56, 19, 1, 144, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
299*4882a593Smuzhiyun {NULL, 60, 1368, 768, 11646, 216, 72, 23, 1, 144, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
300*4882a593Smuzhiyun {NULL, 60, 1440, 900, 9372, 232, 80, 25, 3, 152, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
301*4882a593Smuzhiyun {NULL, 75, 1440, 900, 7311, 248, 96, 33, 3, 152, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
302*4882a593Smuzhiyun {NULL, 60, 1440, 1040, 7993, 248, 96, 33, 1, 152, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
303*4882a593Smuzhiyun {NULL, 60, 1600, 900, 8449, 256, 88, 26, 3, 168, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
304*4882a593Smuzhiyun {NULL, 60, 1600, 1024, 7333, 272, 104, 32, 1, 168, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
305*4882a593Smuzhiyun {NULL, 60, 1600, 1200, 6172, 304, 64, 46, 1, 192, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
306*4882a593Smuzhiyun {NULL, 75, 1600, 1200, 4938, 304, 64, 46, 1, 192, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
307*4882a593Smuzhiyun {NULL, 60, 1680, 1050, 6832, 280, 104, 30, 3, 176, 6, 0, 0, 0},
308*4882a593Smuzhiyun {NULL, 75, 1680, 1050, 5339, 296, 120, 40, 3, 176, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
309*4882a593Smuzhiyun {NULL, 60, 1792, 1344, 4883, 328, 128, 46, 1, 200, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
310*4882a593Smuzhiyun {NULL, 60, 1856, 1392, 4581, 352, 96, 43, 1, 224, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
311*4882a593Smuzhiyun {NULL, 60, 1920, 1440, 4273, 344, 128, 56, 1, 208, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
312*4882a593Smuzhiyun {NULL, 75, 1920, 1440, 3367, 352, 144, 56, 1, 224, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
313*4882a593Smuzhiyun {NULL, 60, 2048, 1536, 3738, 376, 152, 49, 3, 224, 4, FB_SYNC_VERT_HIGH_ACT, 0, 0},
314*4882a593Smuzhiyun {NULL, 60, 1280, 720, 13484, 216, 112, 20, 5, 40, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
315*4882a593Smuzhiyun {NULL, 50, 1280, 720, 16538, 176, 48, 17, 1, 128, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
316*4882a593Smuzhiyun {NULL, 60, 1920, 1080, 5776, 328, 128, 32, 3, 200, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
317*4882a593Smuzhiyun {NULL, 60, 1920, 1200, 5164, 336, 136, 36, 3, 200, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
318*4882a593Smuzhiyun {NULL, 60, 1400, 1050, 8210, 232, 88, 32, 3, 144, 4, FB_SYNC_VERT_HIGH_ACT, 0, 0},
319*4882a593Smuzhiyun {NULL, 75, 1400, 1050, 6398, 248, 104, 42, 3, 144, 4, FB_SYNC_VERT_HIGH_ACT, 0, 0} };
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun static const struct fb_videomode viafb_rb_modes[] = {
322*4882a593Smuzhiyun {NULL, 60, 1360, 768, 13879, 80, 48, 14, 3, 32, 5, FB_SYNC_HOR_HIGH_ACT, 0, 0},
323*4882a593Smuzhiyun {NULL, 60, 1440, 900, 11249, 80, 48, 17, 3, 32, 6, FB_SYNC_HOR_HIGH_ACT, 0, 0},
324*4882a593Smuzhiyun {NULL, 60, 1400, 1050, 9892, 80, 48, 23, 3, 32, 4, FB_SYNC_HOR_HIGH_ACT, 0, 0},
325*4882a593Smuzhiyun {NULL, 60, 1600, 900, 10226, 80, 48, 18, 3, 32, 5, FB_SYNC_HOR_HIGH_ACT, 0, 0},
326*4882a593Smuzhiyun {NULL, 60, 1680, 1050, 8387, 80, 48, 21, 3, 32, 6, FB_SYNC_HOR_HIGH_ACT, 0, 0},
327*4882a593Smuzhiyun {NULL, 60, 1920, 1080, 7212, 80, 48, 23, 3, 32, 5, FB_SYNC_HOR_HIGH_ACT, 0, 0},
328*4882a593Smuzhiyun {NULL, 60, 1920, 1200, 6488, 80, 48, 26, 3, 32, 6, FB_SYNC_HOR_HIGH_ACT, 0, 0} };
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun int NUM_TOTAL_CN400_ModeXregs = ARRAY_SIZE(CN400_ModeXregs);
331*4882a593Smuzhiyun int NUM_TOTAL_CN700_ModeXregs = ARRAY_SIZE(CN700_ModeXregs);
332*4882a593Smuzhiyun int NUM_TOTAL_KM400_ModeXregs = ARRAY_SIZE(KM400_ModeXregs);
333*4882a593Smuzhiyun int NUM_TOTAL_CX700_ModeXregs = ARRAY_SIZE(CX700_ModeXregs);
334*4882a593Smuzhiyun int NUM_TOTAL_VX855_ModeXregs = ARRAY_SIZE(VX855_ModeXregs);
335*4882a593Smuzhiyun int NUM_TOTAL_CLE266_ModeXregs = ARRAY_SIZE(CLE266_ModeXregs);
336*4882a593Smuzhiyun int NUM_TOTAL_PATCH_MODE = ARRAY_SIZE(res_patch_table);
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun
get_best_mode(const struct fb_videomode * modes,int n,int hres,int vres,int refresh)339*4882a593Smuzhiyun static const struct fb_videomode *get_best_mode(
340*4882a593Smuzhiyun const struct fb_videomode *modes, int n,
341*4882a593Smuzhiyun int hres, int vres, int refresh)
342*4882a593Smuzhiyun {
343*4882a593Smuzhiyun const struct fb_videomode *best = NULL;
344*4882a593Smuzhiyun int i;
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun for (i = 0; i < n; i++) {
347*4882a593Smuzhiyun if (modes[i].xres != hres || modes[i].yres != vres)
348*4882a593Smuzhiyun continue;
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun if (!best || abs(modes[i].refresh - refresh) <
351*4882a593Smuzhiyun abs(best->refresh - refresh))
352*4882a593Smuzhiyun best = &modes[i];
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun return best;
356*4882a593Smuzhiyun }
357*4882a593Smuzhiyun
viafb_get_best_mode(int hres,int vres,int refresh)358*4882a593Smuzhiyun const struct fb_videomode *viafb_get_best_mode(int hres, int vres, int refresh)
359*4882a593Smuzhiyun {
360*4882a593Smuzhiyun return get_best_mode(viafb_modes, ARRAY_SIZE(viafb_modes),
361*4882a593Smuzhiyun hres, vres, refresh);
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun
viafb_get_best_rb_mode(int hres,int vres,int refresh)364*4882a593Smuzhiyun const struct fb_videomode *viafb_get_best_rb_mode(int hres, int vres,
365*4882a593Smuzhiyun int refresh)
366*4882a593Smuzhiyun {
367*4882a593Smuzhiyun return get_best_mode(viafb_rb_modes, ARRAY_SIZE(viafb_rb_modes),
368*4882a593Smuzhiyun hres, vres, refresh);
369*4882a593Smuzhiyun }
370