]> rtime.felk.cvut.cz Git - hercules2020/nv-tegra/linux-4.4.git/blob - drivers/video/fbdev/core/modedb.c
8612a2d29c29ec9c31dfeea68c235da425de27c0
[hercules2020/nv-tegra/linux-4.4.git] / drivers / video / fbdev / core / modedb.c
1 /*
2  *  linux/drivers/video/modedb.c -- Standard video mode database management
3  *
4  *      Copyright (C) 1999 Geert Uytterhoeven
5  *
6  *      2001 - Documented with DocBook
7  *      - Brad Douglas <brad@neruo.com>
8  *
9  *  This file is subject to the terms and conditions of the GNU General Public
10  *  License. See the file COPYING in the main directory of this archive for
11  *  more details.
12  */
13
14 #include <linux/module.h>
15 #include <linux/slab.h>
16 #include <linux/fb.h>
17 #include <linux/kernel.h>
18
19 #undef DEBUG
20
21 #define name_matches(v, s, l) \
22     ((v).name && !strncmp((s), (v).name, (l)) && strlen((v).name) == (l))
23 #define res_matches(v, x, y) \
24     ((v).xres == (x) && (v).yres == (y))
25
26 #ifdef DEBUG
27 #define DPRINTK(fmt, args...)   printk("modedb %s: " fmt, __func__ , ## args)
28 #else
29 #define DPRINTK(fmt, args...)
30 #endif
31
32 /*
33  *  Standard video mode definitions (taken from XFree86)
34  */
35
36 static const struct fb_videomode modedb[] = {
37
38         /* 640x400 @ 70 Hz, 31.5 kHz hsync */
39         { NULL, 70, 640, 400, 39721, 40, 24, 39, 9, 96, 2, 0,
40                 FB_VMODE_NONINTERLACED },
41
42         /* 640x480 @ 60 Hz, 31.5 kHz hsync */
43         { NULL, 60, 640, 480, 39721, 40, 24, 32, 11, 96, 2,     0,
44                 FB_VMODE_NONINTERLACED },
45
46         /* 800x600 @ 56 Hz, 35.15 kHz hsync */
47         { NULL, 56, 800, 600, 27777, 128, 24, 22, 1, 72, 2,     0,
48                 FB_VMODE_NONINTERLACED },
49
50         /* 1024x768 @ 87 Hz interlaced, 35.5 kHz hsync */
51         { NULL, 87, 1024, 768, 22271, 56, 24, 33, 8, 160, 8, 0,
52                 FB_VMODE_INTERLACED },
53
54         /* 640x400 @ 85 Hz, 37.86 kHz hsync */
55         { NULL, 85, 640, 400, 31746, 96, 32, 41, 1, 64, 3,
56                 FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
57
58         /* 640x480 @ 72 Hz, 36.5 kHz hsync */
59         { NULL, 72, 640, 480, 31746, 144, 40, 30, 8, 40, 3, 0,
60                 FB_VMODE_NONINTERLACED },
61
62         /* 640x480 @ 75 Hz, 37.50 kHz hsync */
63         { NULL, 75, 640, 480, 31746, 120, 16, 16, 1, 64, 3,     0,
64                 FB_VMODE_NONINTERLACED },
65
66         /* 800x600 @ 60 Hz, 37.8 kHz hsync */
67         { NULL, 60, 800, 600, 25000, 88, 40, 23, 1, 128, 4,
68                 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
69                 FB_VMODE_NONINTERLACED },
70
71         /* 640x480 @ 85 Hz, 43.27 kHz hsync */
72         { NULL, 85, 640, 480, 27777, 80, 56, 25, 1, 56, 3, 0,
73                 FB_VMODE_NONINTERLACED },
74
75         /* 1152x864 @ 89 Hz interlaced, 44 kHz hsync */
76         { NULL, 89, 1152, 864, 15384, 96, 16, 110, 1, 216, 10, 0,
77                 FB_VMODE_INTERLACED },
78         /* 800x600 @ 72 Hz, 48.0 kHz hsync */
79         { NULL, 72, 800, 600, 20000, 64, 56, 23, 37, 120, 6,
80                 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
81                 FB_VMODE_NONINTERLACED },
82
83         /* 1024x768 @ 60 Hz, 48.4 kHz hsync */
84         { NULL, 60, 1024, 768, 15384, 168, 8, 29, 3, 144, 6, 0,
85                 FB_VMODE_NONINTERLACED },
86
87         /* 640x480 @ 100 Hz, 53.01 kHz hsync */
88         { NULL, 100, 640, 480, 21834, 96, 32, 36, 8, 96, 6,     0,
89                 FB_VMODE_NONINTERLACED },
90
91         /* 1152x864 @ 60 Hz, 53.5 kHz hsync */
92         { NULL, 60, 1152, 864, 11123, 208, 64, 16, 4, 256, 8, 0,
93                 FB_VMODE_NONINTERLACED },
94
95         /* 800x600 @ 85 Hz, 55.84 kHz hsync */
96         { NULL, 85, 800, 600, 16460, 160, 64, 36, 16, 64, 5, 0,
97                 FB_VMODE_NONINTERLACED },
98
99         /* 1024x768 @ 70 Hz, 56.5 kHz hsync */
100         { NULL, 70, 1024, 768, 13333, 144, 24, 29, 3, 136, 6, 0,
101                 FB_VMODE_NONINTERLACED },
102
103         /* 1280x1024 @ 87 Hz interlaced, 51 kHz hsync */
104         { NULL, 87, 1280, 1024, 12500, 56, 16, 128, 1, 216, 12, 0,
105                 FB_VMODE_INTERLACED },
106
107         /* 800x600 @ 100 Hz, 64.02 kHz hsync */
108         { NULL, 100, 800, 600, 14357, 160, 64, 30, 4, 64, 6, 0,
109                 FB_VMODE_NONINTERLACED },
110
111         /* 1024x768 @ 76 Hz, 62.5 kHz hsync */
112         { NULL, 76, 1024, 768, 11764, 208, 8, 36, 16, 120, 3, 0,
113                 FB_VMODE_NONINTERLACED },
114
115         /* 1152x864 @ 70 Hz, 62.4 kHz hsync */
116         { NULL, 70, 1152, 864, 10869, 106, 56, 20, 1, 160, 10, 0,
117                 FB_VMODE_NONINTERLACED },
118
119         /* 1280x1024 @ 61 Hz, 64.2 kHz hsync */
120         { NULL, 61, 1280, 1024, 9090, 200, 48, 26, 1, 184, 3, 0,
121                 FB_VMODE_NONINTERLACED },
122
123         /* 1400x1050 @ 60Hz, 63.9 kHz hsync */
124         { NULL, 60, 1400, 1050, 9259, 136, 40, 13, 1, 112, 3, 0,
125                 FB_VMODE_NONINTERLACED },
126
127         /* 1400x1050 @ 75,107 Hz, 82,392 kHz +hsync +vsync*/
128         { NULL, 75, 1400, 1050, 7190, 120, 56, 23, 10, 112, 13,
129                 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
130                 FB_VMODE_NONINTERLACED },
131
132         /* 1400x1050 @ 60 Hz, ? kHz +hsync +vsync*/
133         { NULL, 60, 1400, 1050, 9259, 128, 40, 12, 0, 112, 3,
134                 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
135                 FB_VMODE_NONINTERLACED },
136
137         /* 1024x768 @ 85 Hz, 70.24 kHz hsync */
138         { NULL, 85, 1024, 768, 10111, 192, 32, 34, 14, 160, 6, 0,
139                 FB_VMODE_NONINTERLACED },
140
141         /* 1152x864 @ 78 Hz, 70.8 kHz hsync */
142         { NULL, 78, 1152, 864, 9090, 228, 88, 32, 0, 84, 12, 0,
143                 FB_VMODE_NONINTERLACED },
144
145         /* 1280x1024 @ 70 Hz, 74.59 kHz hsync */
146         { NULL, 70, 1280, 1024, 7905, 224, 32, 28, 8, 160, 8, 0,
147                 FB_VMODE_NONINTERLACED },
148
149         /* 1600x1200 @ 60Hz, 75.00 kHz hsync */
150         { NULL, 60, 1600, 1200, 6172, 304, 64, 46, 1, 192, 3,
151                 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
152                 FB_VMODE_NONINTERLACED },
153
154         /* 1152x864 @ 84 Hz, 76.0 kHz hsync */
155         { NULL, 84, 1152, 864, 7407, 184, 312, 32, 0, 128, 12, 0,
156                 FB_VMODE_NONINTERLACED },
157
158         /* 1280x1024 @ 74 Hz, 78.85 kHz hsync */
159         { NULL, 74, 1280, 1024, 7407, 256, 32, 34, 3, 144, 3, 0,
160                 FB_VMODE_NONINTERLACED },
161
162         /* 1024x768 @ 100Hz, 80.21 kHz hsync */
163         { NULL, 100, 1024, 768, 8658, 192, 32, 21, 3, 192, 10, 0,
164                 FB_VMODE_NONINTERLACED },
165
166         /* 1280x1024 @ 76 Hz, 81.13 kHz hsync */
167         { NULL, 76, 1280, 1024, 7407, 248, 32, 34, 3, 104, 3, 0,
168                 FB_VMODE_NONINTERLACED },
169
170         /* 1600x1200 @ 70 Hz, 87.50 kHz hsync */
171         { NULL, 70, 1600, 1200, 5291, 304, 64, 46, 1, 192, 3, 0,
172                 FB_VMODE_NONINTERLACED },
173
174         /* 1152x864 @ 100 Hz, 89.62 kHz hsync */
175         { NULL, 100, 1152, 864, 7264, 224, 32, 17, 2, 128, 19, 0,
176                 FB_VMODE_NONINTERLACED },
177
178         /* 1280x1024 @ 85 Hz, 91.15 kHz hsync */
179         { NULL, 85, 1280, 1024, 6349, 224, 64, 44, 1, 160, 3,
180                 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
181                 FB_VMODE_NONINTERLACED },
182
183         /* 1600x1200 @ 75 Hz, 93.75 kHz hsync */
184         { NULL, 75, 1600, 1200, 4938, 304, 64, 46, 1, 192, 3,
185                 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
186                 FB_VMODE_NONINTERLACED },
187
188         /* 1680x1050 @ 60 Hz, 65.191 kHz hsync */
189         { NULL, 60, 1680, 1050, 6848, 280, 104, 30, 3, 176, 6,
190                 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
191                 FB_VMODE_NONINTERLACED },
192
193         /* 1600x1200 @ 85 Hz, 105.77 kHz hsync */
194         { NULL, 85, 1600, 1200, 4545, 272, 16, 37, 4, 192, 3,
195                 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
196                 FB_VMODE_NONINTERLACED },
197
198         /* 1280x1024 @ 100 Hz, 107.16 kHz hsync */
199         { NULL, 100, 1280, 1024, 5502, 256, 32, 26, 7, 128, 15, 0,
200                 FB_VMODE_NONINTERLACED },
201
202         /* 1800x1440 @ 64Hz, 96.15 kHz hsync  */
203         { NULL, 64, 1800, 1440, 4347, 304, 96, 46, 1, 192, 3,
204                 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
205                 FB_VMODE_NONINTERLACED },
206
207         /* 1800x1440 @ 70Hz, 104.52 kHz hsync  */
208         { NULL, 70, 1800, 1440, 4000, 304, 96, 46, 1, 192, 3,
209                 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
210                 FB_VMODE_NONINTERLACED },
211
212         /* 512x384 @ 78 Hz, 31.50 kHz hsync */
213         { NULL, 78, 512, 384, 49603, 48, 16, 16, 1, 64, 3, 0,
214                 FB_VMODE_NONINTERLACED },
215
216         /* 512x384 @ 85 Hz, 34.38 kHz hsync */
217         { NULL, 85, 512, 384, 45454, 48, 16, 16, 1, 64, 3, 0,
218                 FB_VMODE_NONINTERLACED },
219
220         /* 320x200 @ 70 Hz, 31.5 kHz hsync, 8:5 aspect ratio */
221         { NULL, 70, 320, 200, 79440, 16, 16, 20, 4, 48, 1, 0,
222                 FB_VMODE_DOUBLE },
223
224         /* 320x240 @ 60 Hz, 31.5 kHz hsync, 4:3 aspect ratio */
225         { NULL, 60, 320, 240, 79440, 16, 16, 16, 5, 48, 1, 0,
226                 FB_VMODE_DOUBLE },
227
228         /* 320x240 @ 72 Hz, 36.5 kHz hsync */
229         { NULL, 72, 320, 240, 63492, 16, 16, 16, 4, 48, 2, 0,
230                 FB_VMODE_DOUBLE },
231
232         /* 400x300 @ 56 Hz, 35.2 kHz hsync, 4:3 aspect ratio */
233         { NULL, 56, 400, 300, 55555, 64, 16, 10, 1, 32, 1, 0,
234                 FB_VMODE_DOUBLE },
235
236         /* 400x300 @ 60 Hz, 37.8 kHz hsync */
237         { NULL, 60, 400, 300, 50000, 48, 16, 11, 1, 64, 2, 0,
238                 FB_VMODE_DOUBLE },
239
240         /* 400x300 @ 72 Hz, 48.0 kHz hsync */
241         { NULL, 72, 400, 300, 40000, 32, 24, 11, 19, 64, 3,     0,
242                 FB_VMODE_DOUBLE },
243
244         /* 480x300 @ 56 Hz, 35.2 kHz hsync, 8:5 aspect ratio */
245         { NULL, 56, 480, 300, 46176, 80, 16, 10, 1, 40, 1, 0,
246                 FB_VMODE_DOUBLE },
247
248         /* 480x300 @ 60 Hz, 37.8 kHz hsync */
249         { NULL, 60, 480, 300, 41858, 56, 16, 11, 1, 80, 2, 0,
250                 FB_VMODE_DOUBLE },
251
252         /* 480x300 @ 63 Hz, 39.6 kHz hsync */
253         { NULL, 63, 480, 300, 40000, 56, 16, 11, 1, 80, 2, 0,
254                 FB_VMODE_DOUBLE },
255
256         /* 480x300 @ 72 Hz, 48.0 kHz hsync */
257         { NULL, 72, 480, 300, 33386, 40, 24, 11, 19, 80, 3, 0,
258                 FB_VMODE_DOUBLE },
259
260         /* 1920x1200 @ 60 Hz, 74.5 Khz hsync */
261         { NULL, 60, 1920, 1200, 5177, 128, 336, 1, 38, 208, 3,
262                 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
263                 FB_VMODE_NONINTERLACED },
264
265         /* 1152x768, 60 Hz, PowerBook G4 Titanium I and II */
266         { NULL, 60, 1152, 768, 14047, 158, 26, 29, 3, 136, 6,
267                 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
268                 FB_VMODE_NONINTERLACED },
269
270         /* 1366x768, 60 Hz, 47.403 kHz hsync, WXGA 16:9 aspect ratio */
271         { NULL, 60, 1366, 768, 13806, 120, 10, 14, 3, 32, 5, 0,
272                 FB_VMODE_NONINTERLACED },
273
274         /* 1280x800, 60 Hz, 47.403 kHz hsync, WXGA 16:10 aspect ratio */
275         { NULL, 60, 1280, 800, 12048, 200, 64, 24, 1, 136, 3, 0,
276                 FB_VMODE_NONINTERLACED },
277
278         /* 720x576i @ 50 Hz, 15.625 kHz hsync (PAL RGB) */
279         { NULL, 50, 720, 576, 74074, 64, 16, 39, 5, 64, 5, 0,
280                 FB_VMODE_INTERLACED },
281
282         /* 800x520i @ 50 Hz, 15.625 kHz hsync (PAL RGB) */
283         { NULL, 50, 800, 520, 58823, 144, 64, 72, 28, 80, 5, 0,
284                 FB_VMODE_INTERLACED },
285
286         /* 864x480 @ 60 Hz, 35.15 kHz hsync */
287         { NULL, 60, 864, 480, 27777, 1, 1, 1, 1, 0, 0,
288                 0, FB_VMODE_NONINTERLACED },
289 };
290
291 #ifdef CONFIG_FB_MODE_HELPERS
292 const struct fb_videomode cea_modes[] = {
293         {},
294         /* 1: 640x480p @ 59.94Hz/60Hz */
295         {.refresh = 59, .xres = 640, .yres = 480, .pixclock = 39721,
296          .left_margin = 48, .right_margin = 16,
297          .upper_margin = 33, .lower_margin = 10,
298          .hsync_len = 96, .vsync_len = 2,
299          .sync = 0,
300          .flag = FB_FLAG_RATIO_4_3,
301          .vmode = FB_VMODE_NONINTERLACED},
302         /* 2: 720x480p @ 59.94Hz/60Hz */
303         {.refresh = 59, .xres = 720, .yres = 480, .pixclock = 37037,
304          .left_margin = 60, .right_margin = 16,
305          .upper_margin = 30, .lower_margin = 9,
306          .hsync_len = 62, .vsync_len = 6,
307          .sync = 0,
308          .flag = FB_FLAG_RATIO_4_3,
309          .vmode = FB_VMODE_NONINTERLACED},
310         /* 3: 720x480p @ 59.94Hz/60Hz */
311         {.refresh = 59, .xres = 720, .yres = 480, .pixclock = 37037,
312          .left_margin = 60, .right_margin = 16,
313          .upper_margin = 30, .lower_margin = 9,
314          .hsync_len = 62, .vsync_len = 6,
315          .sync = 0,
316          .flag = FB_FLAG_RATIO_16_9,
317          .vmode = FB_VMODE_NONINTERLACED},
318         /* 4: 1280x720p @ 59.94Hz/60Hz */
319         {.refresh = 60, .xres = 1280, .yres = 720, .pixclock = 13468,
320          .left_margin = 220, .right_margin = 110,
321          .upper_margin = 20, .lower_margin = 5,
322          .hsync_len = 40, .vsync_len = 5,
323          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
324          .flag = FB_FLAG_RATIO_16_9,
325          .vmode = FB_VMODE_NONINTERLACED},
326         /* 5: 1920x1080i @ 59.94Hz/60Hz */
327         {.refresh = 60, .xres = 1920, .yres = 1080, .pixclock = 13468,
328          .left_margin = 148, .right_margin = 88,
329          .upper_margin = 15, .lower_margin = 2,
330          .hsync_len = 44, .vsync_len = 5,
331          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
332          .flag = FB_FLAG_RATIO_16_9,
333          .vmode = FB_VMODE_INTERLACED},
334         /* 6: 720(1440)x480i @ 59.94Hz/60Hz */
335         {.refresh = 59, .xres = 1440, .yres = 480, .pixclock = 37037,
336          .left_margin = 114, .right_margin = 38,
337          .upper_margin = 15, .lower_margin = 4,
338          .hsync_len = 124, .vsync_len = 3,
339          .sync = 0,
340          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
341          .vmode = FB_VMODE_INTERLACED},
342         /* 7: 720(1440)x480i @ 59.94Hz/60Hz */
343         {.refresh = 59, .xres = 1440, .yres = 480, .pixclock = 37037,
344          .left_margin = 114, .right_margin = 38,
345          .upper_margin = 15, .lower_margin = 4,
346          .hsync_len = 124, .vsync_len = 3,
347          .sync = 0,
348          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
349          .vmode = FB_VMODE_INTERLACED},
350         /* 8: 720(1440)x240p @ 59.94Hz/60Hz */
351         {.refresh = 59, .xres = 1440, .yres = 240, .pixclock = 37037,
352          .left_margin = 114, .right_margin = 38,
353          .upper_margin = 15, .lower_margin = 5,
354          .hsync_len = 124, .vsync_len = 3,
355          .sync = 0,
356          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
357          .vmode = FB_VMODE_NONINTERLACED},
358         /* 9: 720(1440)x240p @ 59.94Hz/60Hz */
359         {.refresh = 59, .xres = 1440, .yres = 240, .pixclock = 37037,
360          .left_margin = 114, .right_margin = 38,
361          .upper_margin = 15, .lower_margin = 5,
362          .hsync_len = 124, .vsync_len = 3,
363          .sync = 0,
364          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
365          .vmode = FB_VMODE_NONINTERLACED},
366         /* 10: 2880x480i @ 59.94Hz/60Hz */
367         {.refresh = 59, .xres = 2880, .yres = 480, .pixclock = 18518,
368          .left_margin = 228, .right_margin = 76,
369          .upper_margin = 15, .lower_margin = 4,
370          .hsync_len = 248, .vsync_len = 3,
371          .sync = 0,
372          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
373          .vmode = FB_VMODE_INTERLACED},
374         /* 11: 2880x480i @ 59.94Hz/60Hz */
375         {.refresh = 59, .xres = 2880, .yres = 480, .pixclock = 18518,
376          .left_margin = 228, .right_margin = 76,
377          .upper_margin = 15, .lower_margin = 4,
378          .hsync_len = 248, .vsync_len = 3,
379          .sync = 0,
380          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
381          .vmode = FB_VMODE_INTERLACED},
382         /* 12: 2880x240p @ 59.94Hz/60Hz */
383         {.refresh = 59, .xres = 2880, .yres = 240, .pixclock = 18518,
384          .left_margin = 228, .right_margin = 76,
385          .upper_margin = 15, .lower_margin = 5,
386          .hsync_len = 248, .vsync_len = 3,
387          .sync = 0,
388          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
389          .vmode = FB_VMODE_NONINTERLACED},
390         /* 13: 2880x240p @ 59.94Hz/60Hz */
391         {.refresh = 59, .xres = 2880, .yres = 240, .pixclock = 18518,
392          .left_margin = 228, .right_margin = 76,
393          .upper_margin = 15, .lower_margin = 5,
394          .hsync_len = 248, .vsync_len = 3,
395          .sync = 0,
396          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
397          .vmode = FB_VMODE_NONINTERLACED},
398         /* 14: 1440x480p @ 59.94Hz/60Hz */
399         {.refresh = 59, .xres = 1440, .yres = 480, .pixclock = 18518,
400          .left_margin = 120, .right_margin = 32,
401          .upper_margin = 30, .lower_margin = 9,
402          .hsync_len = 124, .vsync_len = 6,
403          .sync = 0,
404          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
405          .vmode = FB_VMODE_NONINTERLACED},
406         /* 15: 1440x480p @ 59.94Hz/60Hz */
407         {.refresh = 59, .xres = 1440, .yres = 480, .pixclock = 18518,
408          .left_margin = 120, .right_margin = 32,
409          .upper_margin = 30, .lower_margin = 9,
410          .hsync_len = 124, .vsync_len = 6,
411          .sync = 0,
412          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
413          .vmode = FB_VMODE_NONINTERLACED},
414         /* 16: 1920x1080p @ 59.94Hz/60Hz */
415         {.refresh = 60, .xres = 1920, .yres = 1080, .pixclock = 6734,
416          .left_margin = 148, .right_margin = 88,
417          .upper_margin = 36, .lower_margin = 4,
418          .hsync_len = 44, .vsync_len = 5,
419          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
420          .flag = FB_FLAG_RATIO_16_9,
421          .vmode = FB_VMODE_NONINTERLACED},
422         /* 17: 720x576p @ 50Hz */
423         {.refresh = 50, .xres = 720, .yres = 576, .pixclock = 37037,
424          .left_margin = 68, .right_margin = 12,
425          .upper_margin = 39, .lower_margin = 5,
426          .hsync_len = 64, .vsync_len = 5,
427          .sync = 0,
428          .flag = FB_FLAG_RATIO_4_3,
429          .vmode = FB_VMODE_NONINTERLACED},
430         /* 18: 720x576p @ 50Hz */
431         {.refresh = 50, .xres = 720, .yres = 576, .pixclock = 37037,
432          .left_margin = 68, .right_margin = 12,
433          .upper_margin = 39, .lower_margin = 5,
434          .hsync_len = 64, .vsync_len = 5,
435          .sync = 0,
436          .flag = FB_FLAG_RATIO_16_9,
437          .vmode = FB_VMODE_NONINTERLACED},
438         /* 19: 1280x720p @ 50Hz */
439         {.refresh = 50, .xres = 1280, .yres = 720, .pixclock = 13468,
440          .left_margin = 220, .right_margin = 440,
441          .upper_margin = 20, .lower_margin = 5,
442          .hsync_len = 40, .vsync_len = 5,
443          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
444          .flag = FB_FLAG_RATIO_16_9,
445          .vmode = FB_VMODE_NONINTERLACED},
446         /* 20: 1920x1080i @ 50Hz */
447         {.refresh = 50, .xres = 1920, .yres = 1080, .pixclock = 13468,
448          .left_margin = 148, .right_margin = 528,
449          .upper_margin = 15, .lower_margin = 2,
450          .hsync_len = 44, .vsync_len = 5,
451          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
452          .flag = FB_FLAG_RATIO_16_9,
453          .vmode = FB_VMODE_INTERLACED},
454         /* 21: 720(1440)x576i @ 50Hz */
455         {.refresh = 50, .xres = 1440, .yres = 576, .pixclock = 37037,
456          .left_margin = 138, .right_margin = 24,
457          .upper_margin = 19, .lower_margin = 2,
458          .hsync_len = 126, .vsync_len = 3,
459          .sync = 0,
460          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
461          .vmode = FB_VMODE_INTERLACED},
462         /* 22: 720(1440)x576i @ 50Hz */
463         {.refresh = 50, .xres = 1440, .yres = 576, .pixclock = 37037,
464          .left_margin = 138, .right_margin = 24,
465          .upper_margin = 19, .lower_margin = 2,
466          .hsync_len = 126, .vsync_len = 3,
467          .sync = 0,
468          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
469          .vmode = FB_VMODE_INTERLACED},
470         /* 23: 720(1440)x288p @ 50Hz */
471         {.refresh = 49, .xres = 1440, .yres = 288, .pixclock = 37037,
472          .left_margin = 138, .right_margin = 24,
473          .upper_margin = 19, .lower_margin = 4,
474          .hsync_len = 126, .vsync_len = 3,
475          .sync = 0,
476          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
477          .vmode = FB_VMODE_NONINTERLACED},
478         /* 24: 720(1440)x288p @ 50Hz */
479         {.refresh = 49, .xres = 1440, .yres = 288, .pixclock = 37037,
480          .left_margin = 138, .right_margin = 24,
481          .upper_margin = 19, .lower_margin = 4,
482          .hsync_len = 126, .vsync_len = 3,
483          .sync = 0,
484          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
485          .vmode = FB_VMODE_NONINTERLACED},
486         /* 25: 2880x576i @ 50Hz */
487         {.refresh = 50, .xres = 2880, .yres = 576, .pixclock = 18518,
488          .left_margin = 276, .right_margin = 48,
489          .upper_margin = 19, .lower_margin = 2,
490          .hsync_len = 252, .vsync_len = 3,
491          .sync = 0,
492          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
493          .vmode = FB_VMODE_INTERLACED},
494         /* 26: 2880x576i @ 50Hz */
495         {.refresh = 50, .xres = 2880, .yres = 576, .pixclock = 18518,
496          .left_margin = 276, .right_margin = 48,
497          .upper_margin = 19, .lower_margin = 2,
498          .hsync_len = 252, .vsync_len = 3,
499          .sync = 0,
500          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
501          .vmode = FB_VMODE_INTERLACED},
502         /* 27: 2880x288p @ 50Hz */
503         {.refresh = 49, .xres = 2880, .yres = 288, .pixclock = 18518,
504          .left_margin = 276, .right_margin = 48,
505          .upper_margin = 19, .lower_margin = 4,
506          .hsync_len = 252, .vsync_len = 3,
507          .sync = 0,
508          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
509          .vmode = FB_VMODE_NONINTERLACED},
510         /* 28: 2880x288p @ 50Hz */
511         {.refresh = 49, .xres = 2880, .yres = 288, .pixclock = 18518,
512          .left_margin = 276, .right_margin = 48,
513          .upper_margin = 19, .lower_margin = 4,
514          .hsync_len = 252, .vsync_len = 3,
515          .sync = 0,
516          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
517          .vmode = FB_VMODE_NONINTERLACED},
518         /* 29: 1440x576p @ 50Hz */
519         {.refresh = 50, .xres = 1440, .yres = 576, .pixclock = 18518,
520          .left_margin = 136, .right_margin = 24,
521          .upper_margin = 39, .lower_margin = 5,
522          .hsync_len = 128, .vsync_len = 5,
523          .sync = 0,
524          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
525          .vmode = FB_VMODE_NONINTERLACED},
526         /* 30: 1440x576p @ 50Hz */
527         {.refresh = 50, .xres = 1440, .yres = 576, .pixclock = 18518,
528          .left_margin = 136, .right_margin = 24,
529          .upper_margin = 39, .lower_margin = 5,
530          .hsync_len = 128, .vsync_len = 5,
531          .sync = 0,
532          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
533          .vmode = FB_VMODE_NONINTERLACED},
534         /* 31: 1920x1080p @ 50Hz */
535         {.refresh = 50, .xres = 1920, .yres = 1080, .pixclock = 6734,
536          .left_margin = 148, .right_margin = 528,
537          .upper_margin = 36, .lower_margin = 4,
538          .hsync_len = 44, .vsync_len = 5,
539          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
540          .flag = FB_FLAG_RATIO_16_9,
541          .vmode = FB_VMODE_NONINTERLACED},
542         /* 32: 1920x1080p @ 23.97Hz/24Hz */
543         {.refresh = 24, .xres = 1920, .yres = 1080, .pixclock = 13468,
544          .left_margin = 148, .right_margin = 638,
545          .upper_margin = 36, .lower_margin = 4,
546          .hsync_len = 44, .vsync_len = 5,
547          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
548          .flag = FB_FLAG_RATIO_16_9,
549          .vmode = FB_VMODE_NONINTERLACED},
550         /* 33: 1920x1080p @ 25Hz */
551         {.refresh = 25, .xres = 1920, .yres = 1080, .pixclock = 13468,
552          .left_margin = 148, .right_margin = 528,
553          .upper_margin = 36, .lower_margin = 4,
554          .hsync_len = 44, .vsync_len = 5,
555          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
556          .flag = FB_FLAG_RATIO_16_9,
557          .vmode = FB_VMODE_NONINTERLACED},
558         /* 34: 1920x1080p @ 29.97Hz/30Hz */
559         {.refresh = 30, .xres = 1920, .yres = 1080, .pixclock = 13468,
560          .left_margin = 148, .right_margin = 88,
561          .upper_margin = 36, .lower_margin = 4,
562          .hsync_len = 44, .vsync_len = 5,
563          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
564          .flag = FB_FLAG_RATIO_16_9,
565          .vmode = FB_VMODE_NONINTERLACED},
566         /* 35: 2880x480p @ 59.94Hz/60Hz */
567         {.refresh = 59, .xres = 2880, .yres = 480, .pixclock = 9259,
568          .left_margin = 240, .right_margin = 64,
569          .upper_margin = 30, .lower_margin = 9,
570          .hsync_len = 248, .vsync_len = 6,
571          .sync = 0,
572          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
573          .vmode = FB_VMODE_NONINTERLACED},
574         /* 36: 2880x480p @ 59.94Hz/60Hz */
575         {.refresh = 59, .xres = 2880, .yres = 480, .pixclock = 9259,
576          .left_margin = 240, .right_margin = 64,
577          .upper_margin = 30, .lower_margin = 9,
578          .hsync_len = 248, .vsync_len = 6,
579          .sync = 0,
580          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
581          .vmode = FB_VMODE_NONINTERLACED},
582         /* 37: 2880x576p @ 50Hz */
583         {.refresh = 50, .xres = 2880, .yres = 576, .pixclock = 9259,
584          .left_margin = 272, .right_margin = 48,
585          .upper_margin = 39, .lower_margin = 5,
586          .hsync_len = 256, .vsync_len = 5,
587          .sync = 0,
588          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
589          .vmode = FB_VMODE_NONINTERLACED},
590         /* 38: 2880x576p @ 50Hz */
591         {.refresh = 50, .xres = 2880, .yres = 576, .pixclock = 9259,
592          .left_margin = 272, .right_margin = 48,
593          .upper_margin = 39, .lower_margin = 5,
594          .hsync_len = 256, .vsync_len = 5,
595          .sync = 0,
596          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
597          .vmode = FB_VMODE_NONINTERLACED},
598         /* 39: 1920x1080i @ 50Hz */
599         {.refresh = 50, .xres = 1920, .yres = 1080, .pixclock = 13888,
600          .left_margin = 184, .right_margin = 32,
601          .upper_margin = 57, .lower_margin = 2,
602          .hsync_len = 168, .vsync_len = 5,
603          .sync = FB_SYNC_HOR_HIGH_ACT,
604          .flag = FB_FLAG_RATIO_16_9,
605          .vmode = FB_VMODE_INTERLACED},
606         /* 40: 1920x1080i @ 100Hz */
607         {.refresh = 100, .xres = 1920, .yres = 1080, .pixclock = 6734,
608          .left_margin = 148, .right_margin = 528,
609          .upper_margin = 15, .lower_margin = 2,
610          .hsync_len = 44, .vsync_len = 5,
611          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
612          .flag = FB_FLAG_RATIO_16_9,
613          .vmode = FB_VMODE_INTERLACED},
614         /* 41: 1280x720p @ 100Hz */
615         {.refresh = 100, .xres = 1280, .yres = 720, .pixclock = 6734,
616          .left_margin = 220, .right_margin = 440,
617          .upper_margin = 20, .lower_margin = 5,
618          .hsync_len = 40, .vsync_len = 5,
619          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
620          .flag = FB_FLAG_RATIO_16_9,
621          .vmode = FB_VMODE_NONINTERLACED},
622         /* 42: 720x576p @ 100Hz */
623         {.refresh = 100, .xres = 720, .yres = 576, .pixclock = 18518,
624          .left_margin = 68, .right_margin = 12,
625          .upper_margin = 39, .lower_margin = 5,
626          .hsync_len = 64, .vsync_len = 5,
627          .sync = 0,
628          .flag = FB_FLAG_RATIO_4_3,
629          .vmode = FB_VMODE_NONINTERLACED},
630         /* 43: 720x576p @ 100Hz */
631         {.refresh = 100, .xres = 720, .yres = 576, .pixclock = 18518,
632          .left_margin = 68, .right_margin = 12,
633          .upper_margin = 39, .lower_margin = 5,
634          .hsync_len = 64, .vsync_len = 5,
635          .sync = 0,
636          .flag = FB_FLAG_RATIO_16_9,
637          .vmode = FB_VMODE_NONINTERLACED},
638         /* 44: 720(1440)x576i @ 100Hz */
639         {.refresh = 100, .xres = 1440, .yres = 576, .pixclock = 18518,
640          .left_margin = 138, .right_margin = 24,
641          .upper_margin = 19, .lower_margin = 2,
642          .hsync_len = 126, .vsync_len = 3,
643          .sync = 0,
644          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
645          .vmode = FB_VMODE_INTERLACED},
646         /* 45: 720(1440)x576i @ 100Hz */
647         {.refresh = 100, .xres = 1440, .yres = 576, .pixclock = 18518,
648          .left_margin = 138, .right_margin = 24,
649          .upper_margin = 19, .lower_margin = 2,
650          .hsync_len = 126, .vsync_len = 3,
651          .sync = 0,
652          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
653          .vmode = FB_VMODE_INTERLACED},
654         /* 46: 1920x1080i @ 119.88/120Hz */
655         {.refresh = 120, .xres = 1920, .yres = 1080, .pixclock = 6734,
656          .left_margin = 148, .right_margin = 88,
657          .upper_margin = 15, .lower_margin = 2,
658          .hsync_len = 44, .vsync_len = 5,
659          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
660          .flag = FB_FLAG_RATIO_16_9,
661          .vmode = FB_VMODE_INTERLACED},
662         /* 47: 1280x720p @ 119.88/120Hz */
663         {.refresh = 120, .xres = 1280, .yres = 720, .pixclock = 6734,
664          .left_margin = 220, .right_margin = 110,
665          .upper_margin = 20, .lower_margin = 5,
666          .hsync_len = 40, .vsync_len = 5,
667          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
668          .flag = FB_FLAG_RATIO_16_9,
669          .vmode = FB_VMODE_NONINTERLACED},
670         /* 48: 720x480p @ 119.88/120Hz */
671         {.refresh = 119, .xres = 720, .yres = 480, .pixclock = 18518,
672          .left_margin = 60, .right_margin = 16,
673          .upper_margin = 30, .lower_margin = 9,
674          .hsync_len = 62, .vsync_len = 6,
675          .sync = 0,
676          .flag = FB_FLAG_RATIO_4_3,
677          .vmode = FB_VMODE_NONINTERLACED},
678         /* 49: 720x480p @ 119.88/120Hz */
679         {.refresh = 119, .xres = 720, .yres = 480, .pixclock = 18518,
680          .left_margin = 60, .right_margin = 16,
681          .upper_margin = 30, .lower_margin = 9,
682          .hsync_len = 62, .vsync_len = 6,
683          .sync = 0,
684          .flag = FB_FLAG_RATIO_16_9,
685          .vmode = FB_VMODE_NONINTERLACED},
686         /* 50: 720(1440)x480i @ 119.88/120Hz */
687         {.refresh = 119, .xres = 1440, .yres = 480, .pixclock = 18518,
688          .left_margin = 114, .right_margin = 38,
689          .upper_margin = 15, .lower_margin = 4,
690          .hsync_len = 124, .vsync_len = 3,
691          .sync = 0,
692          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
693          .vmode = FB_VMODE_INTERLACED},
694         /* 51: 720(1440)x480i @ 119.88/120Hz */
695         {.refresh = 119, .xres = 1440, .yres = 480, .pixclock = 18518,
696          .left_margin = 114, .right_margin = 38,
697          .upper_margin = 15, .lower_margin = 4,
698          .hsync_len = 124, .vsync_len = 3,
699          .sync = 0,
700          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
701          .vmode = FB_VMODE_INTERLACED},
702         /* 52: 720x576p @ 200Hz */
703         {.refresh = 200, .xres = 720, .yres = 576, .pixclock = 9259,
704          .left_margin = 68, .right_margin = 12,
705          .upper_margin = 39, .lower_margin = 5,
706          .hsync_len = 64, .vsync_len = 5,
707          .sync = 0,
708          .flag = FB_FLAG_RATIO_4_3,
709          .vmode = FB_VMODE_NONINTERLACED},
710         /* 53: 720x576p @ 200Hz */
711         {.refresh = 200, .xres = 720, .yres = 576, .pixclock = 9259,
712          .left_margin = 68, .right_margin = 12,
713          .upper_margin = 39, .lower_margin = 5,
714          .hsync_len = 64, .vsync_len = 5,
715          .sync = 0,
716          .flag = FB_FLAG_RATIO_16_9,
717          .vmode = FB_VMODE_NONINTERLACED},
718         /* 54: 720(1440)x576i @ 200Hz */
719         {.refresh = 200, .xres = 1440, .yres = 576, .pixclock = 9259,
720          .left_margin = 138, .right_margin = 24,
721          .upper_margin = 19, .lower_margin = 2,
722          .hsync_len = 126, .vsync_len = 3,
723          .sync = 0,
724          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
725          .vmode = FB_VMODE_INTERLACED},
726         /* 55: 720(1440)x576i @ 200Hz */
727         {.refresh = 200, .xres = 1440, .yres = 576, .pixclock = 9259,
728          .left_margin = 138, .right_margin = 24,
729          .upper_margin = 19, .lower_margin = 2,
730          .hsync_len = 126, .vsync_len = 3,
731          .sync = 0,
732          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
733          .vmode = FB_VMODE_INTERLACED},
734         /* 56: 720x480p @ 239.76/240Hz */
735         {.refresh = 239, .xres = 720, .yres = 480, .pixclock = 9259,
736          .left_margin = 60, .right_margin = 16,
737          .upper_margin = 30, .lower_margin = 9,
738          .hsync_len = 62, .vsync_len = 6,
739          .sync = 0,
740          .flag = FB_FLAG_RATIO_4_3,
741          .vmode = FB_VMODE_NONINTERLACED},
742         /* 57: 720x480p @ 239.76/240Hz */
743         {.refresh = 239, .xres = 720, .yres = 480, .pixclock = 9259,
744          .left_margin = 60, .right_margin = 16,
745          .upper_margin = 30, .lower_margin = 9,
746          .hsync_len = 62, .vsync_len = 6,
747          .sync = 0,
748          .flag = FB_FLAG_RATIO_16_9,
749          .vmode = FB_VMODE_NONINTERLACED},
750         /* 58: 720(1440)x480i @ 239.76/240Hz */
751         {.refresh = 239, .xres = 1440, .yres = 480, .pixclock = 9259,
752          .left_margin = 114, .right_margin = 38,
753          .upper_margin = 15, .lower_margin = 4,
754          .hsync_len = 124, .vsync_len = 3,
755          .sync = 0,
756          .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
757          .vmode = FB_VMODE_INTERLACED},
758         /* 59: 720(1440)x480i @ 239.76/240Hz */
759         {.refresh = 239, .xres = 1440, .yres = 480, .pixclock = 9259,
760          .left_margin = 114, .right_margin = 38,
761          .upper_margin = 15, .lower_margin = 4,
762          .hsync_len = 124, .vsync_len = 3,
763          .sync = 0,
764          .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
765          .vmode = FB_VMODE_INTERLACED},
766         /* 60: 1280x720p @ 23.97Hz/24Hz */
767         {.refresh = 24, .xres = 1280, .yres = 720, .pixclock = 16835,
768          .left_margin = 220, .right_margin = 1760,
769          .upper_margin = 20, .lower_margin = 5,
770          .hsync_len = 40, .vsync_len = 5,
771          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
772          .flag = FB_FLAG_RATIO_16_9,
773          .vmode = FB_VMODE_NONINTERLACED},
774         /* 61: 1280x720p @ 25Hz */
775         {.refresh = 25, .xres = 1280, .yres = 720, .pixclock = 13468,
776          .left_margin = 220, .right_margin = 2420,
777          .upper_margin = 20, .lower_margin = 5,
778          .hsync_len = 40, .vsync_len = 5,
779          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
780          .flag = FB_FLAG_RATIO_16_9,
781          .vmode = FB_VMODE_NONINTERLACED},
782         /* 62: 1280x720p @ 29.97Hz/30Hz */
783         {.refresh = 30, .xres = 1280, .yres = 720, .pixclock = 13468,
784          .left_margin = 220, .right_margin = 1760,
785          .upper_margin = 20, .lower_margin = 5,
786          .hsync_len = 40, .vsync_len = 5,
787          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
788          .flag = FB_FLAG_RATIO_16_9,
789          .vmode = FB_VMODE_NONINTERLACED},
790         /* 63: 1920x1080p @ 119.88/120Hz */
791         {.refresh = 120, .xres = 1920, .yres = 1080, .pixclock = 3367,
792          .left_margin = 148, .right_margin = 88,
793          .upper_margin = 36, .lower_margin = 4,
794          .hsync_len = 44, .vsync_len = 5,
795          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
796          .flag = FB_FLAG_RATIO_16_9,
797          .vmode = FB_VMODE_NONINTERLACED},
798         /* 64: 1920x1080p @ 100Hz */
799         {.refresh = 100, .xres = 1920, .yres = 1080, .pixclock = 3367,
800          .left_margin = 148, .right_margin = 528,
801          .upper_margin = 36, .lower_margin = 4,
802          .hsync_len = 44, .vsync_len = 5,
803          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
804          .flag = FB_FLAG_RATIO_16_9,
805          .vmode = FB_VMODE_NONINTERLACED},
806          /* 65: 1280x720p @ 24Hz */
807         {.refresh = 24, .xres = 1280, .yres = 720, .pixclock = 16835,
808          .left_margin = 220, .right_margin = 1760,
809          .upper_margin = 20, .lower_margin = 5,
810          .hsync_len = 40, .vsync_len = 5,
811          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
812          .flag = FB_FLAG_RATIO_64_27,
813          .vmode = FB_VMODE_NONINTERLACED},
814         /* 66: 1280x720p @ 25Hz */
815         {.refresh = 25, .xres = 1280, .yres = 720, .pixclock = 13468,
816          .left_margin = 220, .right_margin = 2420,
817          .upper_margin = 20, .lower_margin = 5,
818          .hsync_len = 40, .vsync_len = 5,
819          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
820          .flag = FB_FLAG_RATIO_64_27,
821          .vmode = FB_VMODE_NONINTERLACED},
822         /* 67: 1280x720p @ 30Hz */
823         {.refresh = 30, .xres = 1280, .yres = 720, .pixclock = 13468,
824          .left_margin = 220, .right_margin = 1760,
825          .upper_margin = 20, .lower_margin = 5,
826          .hsync_len = 40, .vsync_len = 5,
827          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
828          .flag = FB_FLAG_RATIO_64_27,
829          .vmode = FB_VMODE_NONINTERLACED},
830         /* 68: 1280x720p @ 50Hz */
831         {.refresh = 50, .xres = 1280, .yres = 720, .pixclock = 13468,
832          .left_margin = 220, .right_margin = 440,
833          .upper_margin = 20, .lower_margin = 5,
834          .hsync_len = 40, .vsync_len = 5,
835          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
836          .flag = FB_FLAG_RATIO_64_27,
837          .vmode = FB_VMODE_NONINTERLACED},
838         /* 69: 1280x720p @ 60Hz */
839         {.refresh = 60, .xres = 1280, .yres = 720, .pixclock = 13468,
840          .left_margin = 220, .right_margin = 110,
841          .upper_margin = 20, .lower_margin = 5,
842          .hsync_len = 40, .vsync_len = 5,
843          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
844          .flag = FB_FLAG_RATIO_64_27,
845          .vmode = FB_VMODE_NONINTERLACED},
846         /* 70: 1280x720p @ 100Hz */
847         {.refresh = 100, .xres = 1280, .yres = 720, .pixclock = 6734,
848          .left_margin = 220, .right_margin = 440,
849          .upper_margin = 20, .lower_margin = 5,
850          .hsync_len = 40, .vsync_len = 5,
851          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
852          .flag = FB_FLAG_RATIO_64_27,
853          .vmode = FB_VMODE_NONINTERLACED},
854         /* 71: 1280x720p @ 120Hz */
855         {.refresh = 120, .xres = 1280, .yres = 720, .pixclock = 6734,
856          .left_margin = 220, .right_margin = 110,
857          .upper_margin = 20, .lower_margin = 5,
858          .hsync_len = 40, .vsync_len = 5,
859          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
860          .flag = FB_FLAG_RATIO_64_27,
861          .vmode = FB_VMODE_NONINTERLACED},
862         /* 72: 1920x1080p @ 24Hz */
863         {.refresh = 24, .xres = 1920, .yres = 1080, .pixclock = 13468,
864          .left_margin = 148, .right_margin = 638,
865          .upper_margin = 36, .lower_margin = 4,
866          .hsync_len = 44, .vsync_len = 5,
867          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
868          .flag = FB_FLAG_RATIO_64_27,
869          .vmode = FB_VMODE_NONINTERLACED},
870         /* 73: 1920x1080p @ 25Hz */
871         {.refresh = 25, .xres = 1920, .yres = 1080, .pixclock = 13468,
872          .left_margin = 148, .right_margin = 528,
873          .upper_margin = 36, .lower_margin = 4,
874          .hsync_len = 44, .vsync_len = 5,
875          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
876          .flag = FB_FLAG_RATIO_64_27,
877          .vmode = FB_VMODE_NONINTERLACED},
878         /* 74: 1920x1080p @ 30Hz */
879         {.refresh = 30, .xres = 1920, .yres = 1080, .pixclock = 13468,
880          .left_margin = 148, .right_margin = 88,
881          .upper_margin = 36, .lower_margin = 4,
882          .hsync_len = 44, .vsync_len = 5,
883          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
884          .flag = FB_FLAG_RATIO_64_27,
885          .vmode = FB_VMODE_NONINTERLACED},
886         /* 75: 1920x1080p @ 50Hz */
887         {.refresh = 50, .xres = 1920, .yres = 1080, .pixclock = 6734,
888          .left_margin = 148, .right_margin = 528,
889          .upper_margin = 36, .lower_margin = 4,
890          .hsync_len = 44, .vsync_len = 5,
891          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
892          .flag = FB_FLAG_RATIO_64_27,
893          .vmode = FB_VMODE_NONINTERLACED},
894         /* 76: 1920x1080p @ 60Hz */
895         {.refresh = 60, .xres = 1920, .yres = 1080, .pixclock = 6734,
896          .left_margin = 148, .right_margin = 88,
897          .upper_margin = 36, .lower_margin = 4,
898          .hsync_len = 44, .vsync_len = 5,
899          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
900          .flag = FB_FLAG_RATIO_64_27,
901          .vmode = FB_VMODE_NONINTERLACED},
902         /* 77: 1920x1080p @ 100Hz */
903         {.refresh = 100, .xres = 1920, .yres = 1080, .pixclock = 3367,
904          .left_margin = 148, .right_margin = 528,
905          .upper_margin = 36, .lower_margin = 4,
906          .hsync_len = 44, .vsync_len = 5,
907          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
908          .flag = FB_FLAG_RATIO_64_27,
909          .vmode = FB_VMODE_NONINTERLACED},
910         /* 78: 1920x1080p @ 120Hz */
911         {.refresh = 120, .xres = 1920, .yres = 1080, .pixclock = 3367,
912          .left_margin = 148, .right_margin = 88,
913          .upper_margin = 36, .lower_margin = 4,
914          .hsync_len = 44, .vsync_len = 5,
915          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
916          .flag = FB_FLAG_RATIO_64_27,
917          .vmode = FB_VMODE_NONINTERLACED},
918         /* 79: 1680x720p @ 24Hz */
919         {.refresh = 24, .xres = 1680, .yres = 720, .pixclock = 16835,
920          .left_margin = 220, .right_margin = 1360,
921          .upper_margin = 20, .lower_margin = 5,
922          .hsync_len = 40, .vsync_len = 5,
923          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
924          .flag = FB_FLAG_RATIO_64_27,
925          .vmode = FB_VMODE_NONINTERLACED},
926         /* 80: 1680x720p @ 25Hz */
927         {.refresh = 25, .xres = 1680, .yres = 720, .pixclock = 16835,
928          .left_margin = 220, .right_margin = 1228,
929          .upper_margin = 20, .lower_margin = 5,
930          .hsync_len = 40, .vsync_len = 5,
931          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
932          .flag = FB_FLAG_RATIO_64_27,
933          .vmode = FB_VMODE_NONINTERLACED},
934         /* 81: 1680x720p @ 30Hz */
935         {.refresh = 30, .xres = 1680, .yres = 720, .pixclock = 16835,
936          .left_margin = 220, .right_margin = 700,
937          .upper_margin = 20, .lower_margin = 5,
938          .hsync_len = 40, .vsync_len = 5,
939          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
940          .flag = FB_FLAG_RATIO_64_27,
941          .vmode = FB_VMODE_NONINTERLACED},
942         /* 82: 1680x720p @ 50Hz */
943         {.refresh = 50, .xres = 1680, .yres = 720, .pixclock = 12121,
944          .left_margin = 220, .right_margin = 260,
945          .upper_margin = 20, .lower_margin = 5,
946          .hsync_len = 40, .vsync_len = 5,
947          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
948          .flag = FB_FLAG_RATIO_64_27,
949          .vmode = FB_VMODE_NONINTERLACED},
950         /* 83: 1680x720p @ 60Hz */
951         {.refresh = 60, .xres = 1680, .yres = 720, .pixclock = 10101,
952          .left_margin = 220, .right_margin = 260,
953          .upper_margin = 20, .lower_margin = 5,
954          .hsync_len = 40, .vsync_len = 5,
955          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
956          .flag = FB_FLAG_RATIO_64_27,
957          .vmode = FB_VMODE_NONINTERLACED},
958         /* 84: 1680x720p @ 100Hz */
959         {.refresh = 100, .xres = 1680, .yres = 720, .pixclock = 6060,
960          .left_margin = 220, .right_margin = 60,
961          .upper_margin = 95, .lower_margin = 5,
962          .hsync_len = 40, .vsync_len = 5,
963          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
964          .flag = FB_FLAG_RATIO_64_27,
965          .vmode = FB_VMODE_NONINTERLACED},
966         /* 85: 1680x720p @ 120Hz */
967         {.refresh = 120, .xres = 1680, .yres = 720, .pixclock = 5050,
968          .left_margin = 220, .right_margin = 60,
969          .upper_margin = 95, .lower_margin = 5,
970          .hsync_len = 40, .vsync_len = 5,
971          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
972          .flag = FB_FLAG_RATIO_64_27,
973          .vmode = FB_VMODE_NONINTERLACED},
974         /* 86: 2560x1080p @ 24Hz */
975         {.refresh = 24, .xres = 2560, .yres = 1080, .pixclock = 10101,
976          .left_margin = 148, .right_margin = 998,
977          .upper_margin = 11, .lower_margin = 4,
978          .hsync_len = 44, .vsync_len = 5,
979          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
980          .flag = FB_FLAG_RATIO_64_27,
981          .vmode = FB_VMODE_NONINTERLACED},
982         /* 87: 2560x1080p @ 25Hz */
983         {.refresh = 25, .xres = 2560, .yres = 1080, .pixclock = 11111,
984          .left_margin = 148, .right_margin = 448,
985          .upper_margin = 36, .lower_margin = 4,
986          .hsync_len = 44, .vsync_len = 5,
987          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
988          .flag = FB_FLAG_RATIO_64_27,
989          .vmode = FB_VMODE_NONINTERLACED},
990         /* 88: 2560x1080p @ 30Hz */
991         {.refresh = 30, .xres = 2560, .yres = 1080, .pixclock = 8417,
992          .left_margin = 148, .right_margin = 768,
993          .upper_margin = 36, .lower_margin = 4,
994          .hsync_len = 44, .vsync_len = 5,
995          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
996          .flag = FB_FLAG_RATIO_64_27,
997          .vmode = FB_VMODE_NONINTERLACED},
998         /* 89: 2560x1080p @ 50Hz */
999         {.refresh = 50, .xres = 2560, .yres = 1080, .pixclock = 5387,
1000          .left_margin = 148, .right_margin = 548,
1001          .upper_margin = 36, .lower_margin = 4,
1002          .hsync_len = 44, .vsync_len = 5,
1003          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1004          .flag = FB_FLAG_RATIO_64_27,
1005          .vmode = FB_VMODE_NONINTERLACED},
1006         /* 90: 2560x1080p @ 60Hz */
1007         {.refresh = 60, .xres = 2560, .yres = 1080, .pixclock = 5050,
1008          .left_margin = 148, .right_margin = 248,
1009          .upper_margin = 11, .lower_margin = 4,
1010          .hsync_len = 44, .vsync_len = 5,
1011          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1012          .flag = FB_FLAG_RATIO_64_27,
1013          .vmode = FB_VMODE_NONINTERLACED},
1014         /* 91: 2560x1080p @ 100Hz */
1015         {.refresh = 100, .xres = 2560, .yres = 1080, .pixclock = 2693,
1016          .left_margin = 148, .right_margin = 218,
1017          .upper_margin = 161, .lower_margin = 4,
1018          .hsync_len = 44, .vsync_len = 5,
1019          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1020          .flag = FB_FLAG_RATIO_64_27,
1021          .vmode = FB_VMODE_NONINTERLACED},
1022         /* 92: 2560x1080p @ 120Hz */
1023         {.refresh = 120, .xres = 2560, .yres = 1080, .pixclock = 2020,
1024          .left_margin = 148, .right_margin = 548,
1025          .upper_margin = 161, .lower_margin = 4,
1026          .hsync_len = 44, .vsync_len = 5,
1027          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1028          .flag = FB_FLAG_RATIO_64_27,
1029          .vmode = FB_VMODE_NONINTERLACED},
1030         /* 93: 3840x2160p @ 24Hz */
1031         {.refresh = 24, .xres = 3840, .yres = 2160, .pixclock = 3367,
1032          .left_margin = 296, .right_margin = 1276,
1033          .upper_margin = 72, .lower_margin = 8,
1034          .hsync_len = 88, .vsync_len = 10,
1035          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1036          .flag = FB_FLAG_RATIO_16_9,
1037          .vmode = FB_VMODE_NONINTERLACED},
1038         /* 94: 3840x2160p @ 25Hz */
1039         {.refresh = 25, .xres = 3840, .yres = 2160, .pixclock = 3367,
1040          .left_margin = 296, .right_margin = 1056,
1041          .upper_margin = 72, .lower_margin = 8,
1042          .hsync_len = 88, .vsync_len = 10,
1043          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1044          .flag = FB_FLAG_RATIO_16_9,
1045          .vmode = FB_VMODE_NONINTERLACED},
1046         /* 95: 3840x2160p @ 30Hz */
1047         {.refresh = 30, .xres = 3840, .yres = 2160, .pixclock = 3367,
1048          .left_margin = 296, .right_margin = 176,
1049          .upper_margin = 72, .lower_margin = 8,
1050          .hsync_len = 88, .vsync_len = 10,
1051          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1052          .flag = FB_FLAG_RATIO_16_9,
1053          .vmode = FB_VMODE_NONINTERLACED},
1054         /* 96: 3840x2160p @ 50Hz */
1055         {.refresh = 50, .xres = 3840, .yres = 2160, .pixclock = 1683,
1056          .left_margin = 296, .right_margin = 1056,
1057          .upper_margin = 72, .lower_margin = 8,
1058          .hsync_len = 88, .vsync_len = 10,
1059          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1060          .flag = FB_FLAG_RATIO_16_9,
1061          .vmode = FB_VMODE_NONINTERLACED},
1062         /* 97: 3840x2160p @ 60Hz */
1063         {.refresh = 60, .xres = 3840, .yres = 2160, .pixclock = 1683,
1064          .left_margin = 296, .right_margin = 176,
1065          .upper_margin = 72, .lower_margin = 8,
1066          .hsync_len = 88, .vsync_len = 10,
1067          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1068          .flag = FB_FLAG_RATIO_16_9,
1069          .vmode = FB_VMODE_NONINTERLACED},
1070         /* 98: 4096x2160p @ 24Hz */
1071         {.refresh = 24, .xres = 4096, .yres = 2160, .pixclock = 3367,
1072          .left_margin = 296, .right_margin = 1020,
1073          .upper_margin = 72, .lower_margin = 8,
1074          .hsync_len = 88, .vsync_len = 10,
1075          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1076          .flag = FB_FLAG_RATIO_256_135,
1077          .vmode = FB_VMODE_NONINTERLACED},
1078         /* 99: 4096x2160p @ 25Hz */
1079         {.refresh = 25, .xres = 4096, .yres = 2160, .pixclock = 3367,
1080          .left_margin = 128, .right_margin = 968,
1081          .upper_margin = 72, .lower_margin = 8,
1082          .hsync_len = 88, .vsync_len = 10,
1083          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1084          .flag = FB_FLAG_RATIO_256_135,
1085          .vmode = FB_VMODE_NONINTERLACED},
1086         /* 100: 4096x2160p @ 30Hz */
1087         {.refresh = 30, .xres = 4096, .yres = 2160, .pixclock = 3367,
1088          .left_margin = 128, .right_margin = 88,
1089          .upper_margin = 72, .lower_margin = 8,
1090          .hsync_len = 88, .vsync_len = 10,
1091          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1092          .flag = FB_FLAG_RATIO_256_135,
1093          .vmode = FB_VMODE_NONINTERLACED},
1094         /* 101: 4096x2160p @ 50Hz */
1095         {.refresh = 50, .xres = 4096, .yres = 2160, .pixclock = 1683,
1096          .left_margin = 128, .right_margin = 968,
1097          .upper_margin = 72, .lower_margin = 8,
1098          .hsync_len = 88, .vsync_len = 10,
1099          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1100          .flag = FB_FLAG_RATIO_256_135,
1101          .vmode = FB_VMODE_NONINTERLACED},
1102         /* 102: 4096x2160p @ 60Hz */
1103         {.refresh = 60, .xres = 4096, .yres = 2160, .pixclock = 1683,
1104          .left_margin = 128, .right_margin = 88,
1105          .upper_margin = 72, .lower_margin = 8,
1106          .hsync_len = 88, .vsync_len = 10,
1107          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1108          .flag = FB_FLAG_RATIO_256_135,
1109          .vmode = FB_VMODE_NONINTERLACED},
1110         /* 103: 3840x2160p @ 24Hz */
1111         {.refresh = 24, .xres = 3840, .yres = 2160, .pixclock = 3367,
1112          .left_margin = 296, .right_margin = 1276,
1113          .upper_margin = 72, .lower_margin = 8,
1114          .hsync_len = 88, .vsync_len = 10,
1115          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1116          .flag = FB_FLAG_RATIO_64_27,
1117          .vmode = FB_VMODE_NONINTERLACED},
1118         /* 104: 3840x2160p @ 25Hz */
1119         {.refresh = 25, .xres = 3840, .yres = 2160, .pixclock = 3367,
1120          .left_margin = 296, .right_margin = 1056,
1121          .upper_margin = 72, .lower_margin = 8,
1122          .hsync_len = 88, .vsync_len = 10,
1123          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1124          .flag = FB_FLAG_RATIO_64_27,
1125          .vmode = FB_VMODE_NONINTERLACED},
1126         /* 105: 3840x2160p @ 30Hz */
1127         {.refresh = 30, .xres = 3840, .yres = 2160, .pixclock = 3367,
1128          .left_margin = 296, .right_margin = 176,
1129          .upper_margin = 72, .lower_margin = 8,
1130          .hsync_len = 88, .vsync_len = 10,
1131          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1132          .flag = FB_FLAG_RATIO_64_27,
1133          .vmode = FB_VMODE_NONINTERLACED},
1134         /* 106: 3840x2160p @ 50Hz */
1135         {.refresh = 50, .xres = 3840, .yres = 2160, .pixclock = 1683,
1136          .left_margin = 296, .right_margin = 1056,
1137          .upper_margin = 72, .lower_margin = 8,
1138          .hsync_len = 88, .vsync_len = 10,
1139          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1140          .flag = FB_FLAG_RATIO_64_27,
1141          .vmode = FB_VMODE_NONINTERLACED},
1142         /* 107: 3840x2160p @ 60Hz */
1143         {.refresh = 60, .xres = 3840, .yres = 2160, .pixclock = 1683,
1144          .left_margin = 296, .right_margin = 176,
1145          .upper_margin = 72, .lower_margin = 8,
1146          .hsync_len = 88, .vsync_len = 10,
1147          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1148          .flag = FB_FLAG_RATIO_64_27,
1149          .vmode = FB_VMODE_NONINTERLACED},
1150 };
1151 EXPORT_SYMBOL(cea_modes);
1152
1153 const struct fb_videomode hdmi_ext_modes[HDMI_EXT_MODEDB_SIZE] = {
1154         {},
1155         /* HDMI_VIC 0x01: 3840x2160p @ 29.97/30Hz */
1156         {.refresh = 30, .xres = 3840, .yres = 2160, .pixclock = 3367,
1157          .left_margin = 296, .right_margin = 176,
1158          .upper_margin = 72, .lower_margin = 8,
1159          .hsync_len = 88, .vsync_len = 10,
1160          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1161          .flag = FB_FLAG_RATIO_16_9,
1162          .vmode = FB_VMODE_NONINTERLACED},
1163         /* HDMI_VIC 0x02: 3840x2160p @ 25Hz */
1164         {.refresh = 25, .xres = 3840, .yres = 2160, .pixclock = 3367,
1165          .left_margin = 296, .right_margin = 1056,
1166          .upper_margin = 72, .lower_margin = 8,
1167          .hsync_len = 88, .vsync_len = 10,
1168          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1169          .flag = FB_FLAG_RATIO_16_9,
1170          .vmode = FB_VMODE_NONINTERLACED},
1171         /* HDMI_VIC 0x03: 3840x2160p @ 23.98/24Hz */
1172         {.refresh = 24, .xres = 3840, .yres = 2160, .pixclock = 3367,
1173          .left_margin = 296, .right_margin = 1276,
1174          .upper_margin = 72, .lower_margin = 8,
1175          .hsync_len = 88, .vsync_len = 10,
1176          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1177          .flag = FB_FLAG_RATIO_16_9,
1178          .vmode = FB_VMODE_NONINTERLACED},
1179         /* HDMI_VIC 0x04: 4096x2160p @ 24Hz */
1180         {.refresh = 24, .xres = 4096, .yres = 2160, .pixclock = 3367,
1181          .left_margin = 296, .right_margin = 1020,
1182          .upper_margin = 72, .lower_margin = 8,
1183          .hsync_len = 88, .vsync_len = 10,
1184          .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1185          .flag = FB_FLAG_RATIO_16_9,
1186          .vmode = FB_VMODE_NONINTERLACED},
1187 };
1188 EXPORT_SYMBOL(hdmi_ext_modes);
1189
1190 const struct fb_videomode vesa_modes[VESA_MODEDB_SIZE] = {
1191         /* 0 640x350-85 VESA */
1192         { NULL, 85, 640, 350, 31746, 96, 32, 60, 32, 64, 3,
1193           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1194         /* 1 640x400-85 VESA */
1195         { NULL, 85, 640, 400, 31746, 96, 32, 41, 1, 64, 3,
1196           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1197         /* 2 720x400-85 VESA */
1198         { NULL, 85, 720, 400, 28169, 108, 36, 42, 1, 72, 3,
1199           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1200         /* 3 640x480-60 VESA */
1201         { NULL, 60, 640, 480, 39722, 48, 16, 33, 10, 96, 2,
1202           0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1203         /* 4 640x480-72 VESA */
1204         { NULL, 72, 640, 480, 31746, 128, 24, 29, 9, 40, 2,
1205           0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1206         /* 5 640x480-75 VESA */
1207         { NULL, 75, 640, 480, 31746, 120, 16, 16, 1, 64, 3,
1208           0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1209         /* 6 640x480-85 VESA */
1210         { NULL, 85, 640, 480, 27777, 80, 56, 25, 1, 56, 3,
1211           0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1212         /* 7 800x600-56 VESA */
1213         { NULL, 56, 800, 600, 27777, 128, 24, 22, 1, 72, 2,
1214           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1215           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1216         /* 8 800x600-60 VESA */
1217         { NULL, 60, 800, 600, 25000, 88, 40, 23, 1, 128, 4,
1218           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1219           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1220         /* 9 800x600-72 VESA */
1221         { NULL, 72, 800, 600, 20000, 64, 56, 23, 37, 120, 6,
1222           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1223           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1224         /* 10 800x600-75 VESA */
1225         { NULL, 75, 800, 600, 20202, 160, 16, 21, 1, 80, 3,
1226           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1227           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1228         /* 11 800x600-85 VESA */
1229         { NULL, 85, 800, 600, 17777, 152, 32, 27, 1, 64, 3,
1230           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1231           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1232         /* 12 800x600-120 VESA */
1233         { NULL, 120, 800, 600, 13651, 80, 48, 29, 3, 32, 4,
1234           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1235         /* 13 848x480-60 VESA */
1236         { NULL, 60, 848, 480, 29629, 112, 16, 23, 6, 112, 8,
1237           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1238           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1239         /* 14 1024x768-43 VESA */
1240         { NULL, 43, 1024, 768, 22271, 56, 8, 45, 0, 176, 4,
1241           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1242           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1243         /* 15 1024x768-60 VESA */
1244         { NULL, 60, 1024, 768, 15384, 160, 24, 29, 3, 136, 6,
1245           0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1246         /* 16 1024x768-70 VESA */
1247         { NULL, 70, 1024, 768, 13333, 144, 24, 29, 3, 136, 6,
1248           0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1249         /* 17 1024x768-75 VESA */
1250         { NULL, 75, 1024, 768, 12698, 176, 16, 28, 1, 96, 3,
1251           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1252           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1253         /* 18 1024x768-85 VESA */
1254         { NULL, 85, 1024, 768, 10582, 208, 48, 36, 1, 96, 3,
1255           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1256           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1257         /* 19 1024x768-120 VESA */
1258         { NULL, 120, 1024, 768, 8658, 80, 48, 38, 3, 32, 4,
1259           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1260         /* 20 1152x864-75 VESA */
1261         { NULL, 75, 1152, 864, 9259, 256, 64, 32, 1, 128, 3,
1262           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1263           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1264         /* 21 1280x768-60 VESA */
1265         { NULL, 60, 1280, 768, 14652, 80, 48, 12, 3, 32, 7,
1266           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1267         /* 22 1280x768-60 VESA */
1268         { NULL, 60, 1280, 768, 12578, 192, 64, 20, 3, 128, 7,
1269           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1270         /* 23 1280x768-75 VESA */
1271         { NULL, 75, 1280, 768, 9779, 208, 80, 27, 3, 128, 7,
1272           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1273         /* 24 1280x768-85 VESA */
1274         { NULL, 85, 1280, 768, 8510, 216, 80, 31, 3, 136, 7,
1275           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1276         /* 25 1280x768-120 VESA */
1277         { NULL, 120, 1280, 768, 7130, 80, 48, 35, 3, 32, 7,
1278           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1279         /* 26 1280x800-60 VESA */
1280         { NULL, 60, 1280, 800, 14084, 80, 48, 14, 3, 32, 6,
1281           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1282         /* 27 1280x800-60 VESA */
1283         { NULL, 60, 1280, 800, 11976, 200, 72, 22, 3, 128, 6,
1284           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1285         /* 28 1280x800-75 VESA */
1286         { NULL, 75, 1280, 800, 9389, 208, 80, 29, 3, 128, 6,
1287           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1288         /* 29 1280x800-85 VESA */
1289         { NULL, 85, 1280, 800, 8163, 216, 80, 34, 3, 136, 6,
1290           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1291         /* 30 1280x800-120 VESA */
1292         { NULL, 120, 1280, 800, 6837, 80, 48, 38, 3, 32, 6,
1293           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1294         /* 31 1280x960-60 VESA */
1295         { NULL, 60, 1280, 960, 9259, 312, 96, 36, 1, 112, 3,
1296           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1297           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1298         /* 32 1280x960-85 VESA */
1299         { NULL, 85, 1280, 960, 6734, 224, 64, 47, 1, 160, 3,
1300           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1301           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1302         /* 33 1280x960-120 VESA */
1303         { NULL, 120, 1280, 960, 5698, 80, 48, 50, 3, 32, 4,
1304           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1305         /* 34 1280x1024-60 VESA */
1306         { NULL, 60, 1280, 1024, 9262, 248, 48, 38, 1, 112, 3,
1307           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1308           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1309         /* 35 1280x1024-75 VESA */
1310         { NULL, 75, 1280, 1024, 7407, 248, 16, 38, 1, 144, 3,
1311           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1312           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1313         /* 36 1280x1024-85 VESA */
1314         { NULL, 85, 1280, 1024, 6349, 224, 64, 44, 1, 160, 3,
1315           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1316           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1317         /* 37 1280x1024-120 VESA */
1318         { NULL, 120, 1280, 1024, 5340, 80, 48, 50, 3, 32, 7,
1319           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1320         /* 38 1360x768-60 VESA */
1321         { NULL, 60, 1360, 768, 11695, 256, 64, 18, 3, 112, 6,
1322           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1323           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1324         /* 39 1360x768-120 VESA */
1325         { NULL, 120, 1360, 768, 6745, 80, 48, 37, 3, 32, 5,
1326           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1327         /* 40 1400x1050-60 VESA */
1328         { NULL, 60, 1400, 1050, 9900, 80, 48, 23, 3, 32, 4,
1329           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1330         /* 41 1400x1050-60 VESA */
1331         { NULL, 60, 1400, 1050, 8213, 232, 88, 32, 3, 144, 4,
1332           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1333         /* 42 1400x1050-75 VESA */
1334         { NULL, 75, 1400, 1050, 6410, 248, 104, 42, 3, 144, 4,
1335           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1336         /* 43 1400x1050-85 VESA */
1337         { NULL, 85, 1400, 1050, 5571, 256, 104, 48, 3, 152, 4,
1338           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1339         /* 44 1400x1050-120 VESA */
1340         { NULL, 120, 1400, 1050, 4807, 80, 48, -7, 3, 32, 4,
1341           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1342         /* 45 1440x900-60 VESA */
1343         { NULL, 60, 1440, 900, 11267, 80, 48, 17, 3, 32, 6,
1344           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1345         /* 46 1440x900-60 VESA */
1346         { NULL, 60, 1440, 900, 9389, 232, 80, 25, 3, 152, 6,
1347           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1348         /* 47 1440x900-75 VESA */
1349         { NULL, 75, 1440, 900, 7312, 248, 96, 33, 3, 152, 6,
1350           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1351         /* 48 1440x900-85 VESA */
1352         { NULL, 85, 1440, 900, 6369, 256, 104, 39, 3, 152, 6,
1353           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1354         /* 49 1440x900-120 VESA */
1355         { NULL, 120, 1440, 900, 5471, 80, 48, 44, 3, 32, 6,
1356           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1357         /* 50 1600x1200-60 VESA */
1358         { NULL, 60, 1600, 1200, 6172, 304, 64, 46, 1, 192, 3,
1359           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1360           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1361         /* 51 1600x1200-65 VESA */
1362         { NULL, 65, 1600, 1200, 5698, 304, 64, 46, 1, 192, 3,
1363           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1364           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1365         /* 52 1600x1200-70 VESA */
1366         { NULL, 70, 1600, 1200, 5291, 304, 64, 46, 1, 192, 3,
1367           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1368           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1369         /* 53 1600x1200-75 VESA */
1370         { NULL, 75, 1600, 1200, 4938, 304, 64, 46, 1, 192, 3,
1371           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1372           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1373         /* 54 1600x1200-85 VESA */
1374         { NULL, 85, 1600, 1200, 4357, 304, 64, 46, 1, 192, 3,
1375           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1376           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1377         /* 55 1600x1200-120 VESA */
1378         { NULL, 120, 1600, 1200, 3727, 80, 48, 64, 3, 32, 4,
1379           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1380         /* 56 1680x1050-60 VESA */
1381         { NULL, 60, 1680, 1050, 8403, 80, 48, 21, 3, 32, 6,
1382           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1383         /* 57 1680x1050-60 VESA */
1384         { NULL, 60, 1680, 1050, 6837, 280, 104, 30, 3, 176, 6,
1385           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1386         /* 58 1680x1050-75 VESA */
1387         { NULL, 75, 1680, 1050, 5347, 296, 120, 40, 3, 176, 6,
1388           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1389         /* 59 1680x1050-85 VESA */
1390         { NULL, 85, 1680, 1050, 4656, 304, 128, 46, 3, 176, 6,
1391           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1392         /* 60 1680x1050-120 VESA */
1393         { NULL, 120, 1680, 1050, 4073, 80, 48, 53, 3, 32, 6,
1394           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1395         /* 61 1792x1344-60 VESA */
1396         { NULL, 60, 1792, 1344, 4884, 328, 128, 46, 1, 200, 3,
1397           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1398         /* 62 1792x1344-75 VESA */
1399         { NULL, 75, 1792, 1344, 3831, 352, 96, 69, 1, 216, 3,
1400           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1401         /* 63 1792x1344-120 VESA */
1402         { NULL, 120, 1792, 1344, 3000, 80, 48, 72, 3, 32, 4,
1403           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1404         /* 64 1856x1392-60 VESA */
1405         { NULL, 60, 1856, 1392, 4581, 352, 96, 43, 1, 224, 3,
1406           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1407         /* 65 1856x1392-75 VESA */
1408         { NULL, 75, 1856, 1392, 3472, 352, 128, 104, 1, 224, 3,
1409           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1410         /* 66 1856x1392-120 VESA */
1411         { NULL, 120, 1856, 1392, 2805, 80, 48, 75, 3, 32, 4,
1412           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1413         /* 67 1920x1200-60 VESA */
1414         { NULL, 60, 1920, 1200, 6493, 80, 48, 26, 3, 32, 6,
1415           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1416         /* 68 1920x1200-60 VESA */
1417         { NULL, 60, 1920, 1200, 5174, 336, 136, 36, 3, 200, 6,
1418           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1419         /* 69 1920x1200-75 VESA */
1420         { NULL, 75, 1920, 1200, 4077, 344, 136, 46, 3, 208, 6,
1421           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1422         /* 70 1920x1200-85 VESA */
1423         { NULL, 85, 1920, 1200, 3555, 352, 144, 53, 3, 208, 6,
1424           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1425         /* 71 1920x1200-120 VESA */
1426         { NULL, 120, 1920, 1200, 3154, 80, 48, 62, 3, 32, 6,
1427           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1428         /* 72 1920x1440-60 VESA */
1429         { NULL, 60, 1920, 1440, 4273, 344, 128, 56, 1, 208, 3,
1430           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1431         /* 73 1920x1440-75 VESA */
1432         { NULL, 75, 1920, 1440, 3367, 352, 144, 56, 1, 224, 3,
1433           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1434         /* 74 1920x1440-120 VESA */
1435         { NULL, 120, 1920, 1440, 2628, 80, 48, 78, 3, 32, 4,
1436           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1437         /* 75 2560x1600-60 VESA */
1438         { NULL, 60, 2560, 1600, 3724, 80, 48, 37, 3, 32, 6,
1439           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1440         /* 76 2560x1600-60 VESA */
1441         { NULL, 60, 2560, 1600, 2869, 472, 192, 49, 3, 280, 6,
1442           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1443         /* 77 2560x1600-75 VESA */
1444         { NULL, 75, 2560, 1600, 2256, 488, 208, 63, 3, 280, 6,
1445           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1446         /* 78 2560x1600-85 VESA */
1447         { NULL, 85, 2560, 1600, 1979, 488, 208, 73, 3, 280, 6,
1448           FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1449         /* 79 2560x1600-120 VESA */
1450         { NULL, 120, 2560, 1600, 1809, 80, 48, 85, 3, 32, 6,
1451           FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1452         /* 80 1366x768-60 VESA */
1453         { NULL, 60, 1366, 768, 11695, 213, 70, 24, 3, 143, 3,
1454           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1455           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1456         /* 81 1920x1080-60 VESA */
1457         { NULL, 60, 1920, 1080, 6734, 148, 88, 36, 4, 44, 5,
1458           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1459           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1460         /* 82 1600x900-60 VESA */
1461         { NULL, 60, 1600, 900, 9259, 96, 24, 96, 1, 80, 3,
1462           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1463           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1464         /* 83 2048x1152-60 VESA */
1465         { NULL, 60, 2048, 1152, 6172, 96, 26, 44, 1, 80, 3,
1466           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1467           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1468         /* 84 1280x720-60 VESA */
1469         { NULL, 60, 1280, 720, 13468, 220, 110, 20, 5, 40, 5,
1470           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1471           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1472         /* 85 1366x768-60 VESA */
1473         { NULL, 60, 1366, 768, 13888, 64, 14, 28, 1, 56, 3,
1474           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1475           FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
1476 };
1477 EXPORT_SYMBOL(vesa_modes);
1478
1479 const struct dmt_videomode dmt_modes[DMT_SIZE] = {
1480         { 0x01, 0x0000, 0x000000, &vesa_modes[0] },
1481         { 0x02, 0x3119, 0x000000, &vesa_modes[1] },
1482         { 0x03, 0x0000, 0x000000, &vesa_modes[2] },
1483         { 0x04, 0x3140, 0x000000, &vesa_modes[3] },
1484         { 0x05, 0x314c, 0x000000, &vesa_modes[4] },
1485         { 0x06, 0x314f, 0x000000, &vesa_modes[5] },
1486         { 0x07, 0x3159, 0x000000, &vesa_modes[6] },
1487         { 0x08, 0x0000, 0x000000, &vesa_modes[7] },
1488         { 0x09, 0x4540, 0x000000, &vesa_modes[8] },
1489         { 0x0a, 0x454c, 0x000000, &vesa_modes[9] },
1490         { 0x0b, 0x454f, 0x000000, &vesa_modes[10] },
1491         { 0x0c, 0x4559, 0x000000, &vesa_modes[11] },
1492         { 0x0d, 0x0000, 0x000000, &vesa_modes[12] },
1493         { 0x0e, 0x0000, 0x000000, &vesa_modes[13] },
1494         { 0x0f, 0x0000, 0x000000, &vesa_modes[14] },
1495         { 0x10, 0x6140, 0x000000, &vesa_modes[15] },
1496         { 0x11, 0x614a, 0x000000, &vesa_modes[16] },
1497         { 0x12, 0x614f, 0x000000, &vesa_modes[17] },
1498         { 0x13, 0x6159, 0x000000, &vesa_modes[18] },
1499         { 0x14, 0x0000, 0x000000, &vesa_modes[19] },
1500         { 0x15, 0x714f, 0x000000, &vesa_modes[20] },
1501         { 0x16, 0x0000, 0x7f1c21, &vesa_modes[21] },
1502         { 0x17, 0x0000, 0x7f1c28, &vesa_modes[22] },
1503         { 0x18, 0x0000, 0x7f1c44, &vesa_modes[23] },
1504         { 0x19, 0x0000, 0x7f1c62, &vesa_modes[24] },
1505         { 0x1a, 0x0000, 0x000000, &vesa_modes[25] },
1506         { 0x1b, 0x0000, 0x8f1821, &vesa_modes[26] },
1507         { 0x1c, 0x8100, 0x8f1828, &vesa_modes[27] },
1508         { 0x1d, 0x810f, 0x8f1844, &vesa_modes[28] },
1509         { 0x1e, 0x8119, 0x8f1862, &vesa_modes[29] },
1510         { 0x1f, 0x0000, 0x000000, &vesa_modes[30] },
1511         { 0x20, 0x8140, 0x000000, &vesa_modes[31] },
1512         { 0x21, 0x8159, 0x000000, &vesa_modes[32] },
1513         { 0x22, 0x0000, 0x000000, &vesa_modes[33] },
1514         { 0x23, 0x8180, 0x000000, &vesa_modes[34] },
1515         { 0x24, 0x818f, 0x000000, &vesa_modes[35] },
1516         { 0x25, 0x8199, 0x000000, &vesa_modes[36] },
1517         { 0x26, 0x0000, 0x000000, &vesa_modes[37] },
1518         { 0x27, 0x0000, 0x000000, &vesa_modes[38] },
1519         { 0x28, 0x0000, 0x000000, &vesa_modes[39] },
1520         { 0x29, 0x0000, 0x0c2021, &vesa_modes[40] },
1521         { 0x2a, 0x9040, 0x0c2028, &vesa_modes[41] },
1522         { 0x2b, 0x904f, 0x0c2044, &vesa_modes[42] },
1523         { 0x2c, 0x9059, 0x0c2062, &vesa_modes[43] },
1524         { 0x2d, 0x0000, 0x000000, &vesa_modes[44] },
1525         { 0x2e, 0x0000, 0xc11821, &vesa_modes[45] },
1526         { 0x2f, 0x9500, 0xc11828, &vesa_modes[46] },
1527         { 0x30, 0x950f, 0xc11844, &vesa_modes[47] },
1528         { 0x31, 0x9519, 0xc11868, &vesa_modes[48] },
1529         { 0x32, 0x0000, 0x000000, &vesa_modes[49] },
1530         { 0x33, 0xa940, 0x000000, &vesa_modes[50] },
1531         { 0x34, 0xa945, 0x000000, &vesa_modes[51] },
1532         { 0x35, 0xa94a, 0x000000, &vesa_modes[52] },
1533         { 0x36, 0xa94f, 0x000000, &vesa_modes[53] },
1534         { 0x37, 0xa959, 0x000000, &vesa_modes[54] },
1535         { 0x38, 0x0000, 0x000000, &vesa_modes[55] },
1536         { 0x39, 0x0000, 0x0c2821, &vesa_modes[56] },
1537         { 0x3a, 0xb300, 0x0c2828, &vesa_modes[57] },
1538         { 0x3b, 0xb30f, 0x0c2844, &vesa_modes[58] },
1539         { 0x3c, 0xb319, 0x0c2868, &vesa_modes[59] },
1540         { 0x3d, 0x0000, 0x000000, &vesa_modes[60] },
1541         { 0x3e, 0xc140, 0x000000, &vesa_modes[61] },
1542         { 0x3f, 0xc14f, 0x000000, &vesa_modes[62] },
1543         { 0x40, 0x0000, 0x000000, &vesa_modes[63] },
1544         { 0x41, 0xc940, 0x000000, &vesa_modes[64] },
1545         { 0x42, 0xc94f, 0x000000, &vesa_modes[65] },
1546         { 0x43, 0x0000, 0x000000, &vesa_modes[66] },
1547         { 0x44, 0x0000, 0x572821, &vesa_modes[67] },
1548         { 0x45, 0xd100, 0x572828, &vesa_modes[68] },
1549         { 0x46, 0xd10f, 0x572844, &vesa_modes[69] },
1550         { 0x47, 0xd119, 0x572862, &vesa_modes[70] },
1551         { 0x48, 0x0000, 0x000000, &vesa_modes[71] },
1552         { 0x49, 0xd140, 0x000000, &vesa_modes[72] },
1553         { 0x4a, 0xd14f, 0x000000, &vesa_modes[73] },
1554         { 0x4b, 0x0000, 0x000000, &vesa_modes[74] },
1555         { 0x4c, 0x0000, 0x1f3821, &vesa_modes[75] },
1556         { 0x4d, 0x0000, 0x1f3828, &vesa_modes[76] },
1557         { 0x4e, 0x0000, 0x1f3844, &vesa_modes[77] },
1558         { 0x4f, 0x0000, 0x1f3862, &vesa_modes[78] },
1559         { 0x50, 0x0000, 0x000000, &vesa_modes[79] },
1560         { 0x51, 0x0000, 0x000000, &vesa_modes[80] },
1561         { 0x52, 0xd1c0, 0x000000, &vesa_modes[81] },
1562         { 0x53, 0xa9c0, 0x000000, &vesa_modes[82] },
1563         { 0x54, 0xe1c0, 0x000000, &vesa_modes[83] },
1564         { 0x55, 0x81c0, 0x000000, &vesa_modes[84] },
1565         { 0x56, 0x0000, 0x000000, &vesa_modes[85] },
1566         { 0x57, 0x0000, 0x000000, &vesa_modes[86] },
1567         { 0x58, 0x0000, 0x000000, &vesa_modes[87] },
1568 };
1569 EXPORT_SYMBOL(dmt_modes);
1570 #endif /* CONFIG_FB_MODE_HELPERS */
1571
1572 /**
1573  *      fb_try_mode - test a video mode
1574  *      @var: frame buffer user defined part of display
1575  *      @info: frame buffer info structure
1576  *      @mode: frame buffer video mode structure
1577  *      @bpp: color depth in bits per pixel
1578  *
1579  *      Tries a video mode to test it's validity for device @info.
1580  *
1581  *      Returns 1 on success.
1582  *
1583  */
1584
1585 static int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info,
1586                        const struct fb_videomode *mode, unsigned int bpp)
1587 {
1588         int err = 0;
1589
1590         DPRINTK("Trying mode %s %dx%d-%d@%d\n",
1591                 mode->name ? mode->name : "noname",
1592                 mode->xres, mode->yres, bpp, mode->refresh);
1593         var->xres = mode->xres;
1594         var->yres = mode->yres;
1595         var->xres_virtual = mode->xres;
1596         var->yres_virtual = mode->yres;
1597         var->xoffset = 0;
1598         var->yoffset = 0;
1599         var->bits_per_pixel = bpp;
1600         var->activate |= FB_ACTIVATE_TEST;
1601         var->pixclock = mode->pixclock;
1602         var->left_margin = mode->left_margin;
1603         var->right_margin = mode->right_margin;
1604         var->upper_margin = mode->upper_margin;
1605         var->lower_margin = mode->lower_margin;
1606         var->hsync_len = mode->hsync_len;
1607         var->vsync_len = mode->vsync_len;
1608         var->sync = mode->sync;
1609         var->vmode = mode->vmode;
1610         if (info->fbops->fb_check_var)
1611                 err = info->fbops->fb_check_var(var, info);
1612         var->activate &= ~FB_ACTIVATE_TEST;
1613         return err;
1614 }
1615
1616 /**
1617  *     fb_find_mode - finds a valid video mode
1618  *     @var: frame buffer user defined part of display
1619  *     @info: frame buffer info structure
1620  *     @mode_option: string video mode to find
1621  *     @db: video mode database
1622  *     @dbsize: size of @db
1623  *     @default_mode: default video mode to fall back to
1624  *     @default_bpp: default color depth in bits per pixel
1625  *
1626  *     Finds a suitable video mode, starting with the specified mode
1627  *     in @mode_option with fallback to @default_mode.  If
1628  *     @default_mode fails, all modes in the video mode database will
1629  *     be tried.
1630  *
1631  *     Valid mode specifiers for @mode_option:
1632  *
1633  *     <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m] or
1634  *     <name>[-<bpp>][@<refresh>]
1635  *
1636  *     with <xres>, <yres>, <bpp> and <refresh> decimal numbers and
1637  *     <name> a string.
1638  *
1639  *      If 'M' is present after yres (and before refresh/bpp if present),
1640  *      the function will compute the timings using VESA(tm) Coordinated
1641  *      Video Timings (CVT).  If 'R' is present after 'M', will compute with
1642  *      reduced blanking (for flatpanels).  If 'i' is present, compute
1643  *      interlaced mode.  If 'm' is present, add margins equal to 1.8%
1644  *      of xres rounded down to 8 pixels, and 1.8% of yres. The char
1645  *      'i' and 'm' must be after 'M' and 'R'. Example:
1646  *
1647  *      1024x768MR-8@60m - Reduced blank with margins at 60Hz.
1648  *
1649  *     NOTE: The passed struct @var is _not_ cleared!  This allows you
1650  *     to supply values for e.g. the grayscale and accel_flags fields.
1651  *
1652  *     Returns zero for failure, 1 if using specified @mode_option,
1653  *     2 if using specified @mode_option with an ignored refresh rate,
1654  *     3 if default mode is used, 4 if fall back to any valid mode.
1655  *
1656  */
1657
1658 int fb_find_mode(struct fb_var_screeninfo *var,
1659                  struct fb_info *info, const char *mode_option,
1660                  const struct fb_videomode *db, unsigned int dbsize,
1661                  const struct fb_videomode *default_mode,
1662                  unsigned int default_bpp)
1663 {
1664         int i;
1665
1666         /* Set up defaults */
1667         if (!db) {
1668                 db = modedb;
1669                 dbsize = ARRAY_SIZE(modedb);
1670         }
1671
1672         if (!default_mode)
1673                 default_mode = &db[0];
1674
1675         if (!default_bpp)
1676                 default_bpp = 8;
1677
1678         /* Did the user specify a video mode? */
1679         if (!mode_option)
1680                 mode_option = fb_mode_option;
1681         if (mode_option) {
1682                 const char *name = mode_option;
1683                 unsigned int namelen = strlen(name);
1684                 int res_specified = 0, bpp_specified = 0, refresh_specified = 0;
1685                 unsigned int xres = 0, yres = 0, bpp = default_bpp, refresh = 0;
1686                 int yres_specified = 0, cvt = 0, rb = 0, interlace = 0;
1687                 int margins = 0;
1688                 u32 best, diff, tdiff;
1689
1690                 for (i = namelen-1; i >= 0; i--) {
1691                         switch (name[i]) {
1692                         case '@':
1693                                 namelen = i;
1694                                 if (!refresh_specified && !bpp_specified &&
1695                                     !yres_specified) {
1696                                         refresh = simple_strtol(&name[i+1], NULL,
1697                                                                 10);
1698                                         refresh_specified = 1;
1699                                         if (cvt || rb)
1700                                                 cvt = 0;
1701                                 } else
1702                                         goto done;
1703                                 break;
1704                         case '-':
1705                                 namelen = i;
1706                                 if (!bpp_specified && !yres_specified) {
1707                                         bpp = simple_strtol(&name[i+1], NULL,
1708                                                             10);
1709                                         bpp_specified = 1;
1710                                         if (cvt || rb)
1711                                                 cvt = 0;
1712                                 } else
1713                                         goto done;
1714                                 break;
1715                         case 'x':
1716                                 if (!yres_specified) {
1717                                         yres = simple_strtol(&name[i+1], NULL,
1718                                                              10);
1719                                         yres_specified = 1;
1720                                 } else
1721                                         goto done;
1722                                 break;
1723                         case '0' ... '9':
1724                                 break;
1725                         case 'M':
1726                                 if (!yres_specified)
1727                                         cvt = 1;
1728                                 break;
1729                         case 'R':
1730                                 if (!cvt)
1731                                         rb = 1;
1732                                 break;
1733                         case 'm':
1734                                 if (!cvt)
1735                                         margins = 1;
1736                                 break;
1737                         case 'i':
1738                                 if (!cvt)
1739                                         interlace = 1;
1740                                 break;
1741                         default:
1742                                 goto done;
1743                         }
1744                 }
1745                 if (i < 0 && yres_specified) {
1746                         xres = simple_strtol(name, NULL, 10);
1747                         res_specified = 1;
1748                 }
1749 done:
1750                 if (cvt) {
1751                         struct fb_videomode cvt_mode;
1752                         int ret;
1753
1754                         DPRINTK("CVT mode %dx%d@%dHz%s%s%s\n", xres, yres,
1755                                 (refresh) ? refresh : 60,
1756                                 (rb) ? " reduced blanking" : "",
1757                                 (margins) ? " with margins" : "",
1758                                 (interlace) ? " interlaced" : "");
1759
1760                         memset(&cvt_mode, 0, sizeof(cvt_mode));
1761                         cvt_mode.xres = xres;
1762                         cvt_mode.yres = yres;
1763                         cvt_mode.refresh = (refresh) ? refresh : 60;
1764
1765                         if (interlace)
1766                                 cvt_mode.vmode |= FB_VMODE_INTERLACED;
1767                         else
1768                                 cvt_mode.vmode &= ~FB_VMODE_INTERLACED;
1769
1770                         ret = fb_find_mode_cvt(&cvt_mode, margins, rb);
1771
1772                         if (!ret && !fb_try_mode(var, info, &cvt_mode, bpp)) {
1773                                 DPRINTK("modedb CVT: CVT mode ok\n");
1774                                 return 1;
1775                         }
1776
1777                         DPRINTK("CVT mode invalid, getting mode from database\n");
1778                 }
1779
1780                 DPRINTK("Trying specified video mode%s %ix%i\n",
1781                         refresh_specified ? "" : " (ignoring refresh rate)",
1782                         xres, yres);
1783
1784                 if (!refresh_specified) {
1785                         /*
1786                          * If the caller has provided a custom mode database and
1787                          * a valid monspecs structure, we look for the mode with
1788                          * the highest refresh rate.  Otherwise we play it safe
1789                          * it and try to find a mode with a refresh rate closest
1790                          * to the standard 60 Hz.
1791                          */
1792                         if (db != modedb &&
1793                             info->monspecs.vfmin && info->monspecs.vfmax &&
1794                             info->monspecs.hfmin && info->monspecs.hfmax &&
1795                             info->monspecs.dclkmax) {
1796                                 refresh = 1000;
1797                         } else {
1798                                 refresh = 60;
1799                         }
1800                 }
1801
1802                 diff = -1;
1803                 best = -1;
1804                 for (i = 0; i < dbsize; i++) {
1805                         if ((name_matches(db[i], name, namelen) ||
1806                              (res_specified && res_matches(db[i], xres, yres))) &&
1807                             !fb_try_mode(var, info, &db[i], bpp)) {
1808                                 if (refresh_specified && db[i].refresh == refresh)
1809                                         return 1;
1810
1811                                 if (abs(db[i].refresh - refresh) < diff) {
1812                                         diff = abs(db[i].refresh - refresh);
1813                                         best = i;
1814                                 }
1815                         }
1816                 }
1817                 if (best != -1) {
1818                         fb_try_mode(var, info, &db[best], bpp);
1819                         return (refresh_specified) ? 2 : 1;
1820                 }
1821
1822                 diff = 2 * (xres + yres);
1823                 best = -1;
1824                 DPRINTK("Trying best-fit modes\n");
1825                 for (i = 0; i < dbsize; i++) {
1826                         DPRINTK("Trying %ix%i\n", db[i].xres, db[i].yres);
1827                         if (!fb_try_mode(var, info, &db[i], bpp)) {
1828                                 tdiff = abs(db[i].xres - xres) +
1829                                         abs(db[i].yres - yres);
1830
1831                                 /*
1832                                  * Penalize modes with resolutions smaller
1833                                  * than requested.
1834                                  */
1835                                 if (xres > db[i].xres || yres > db[i].yres)
1836                                         tdiff += xres + yres;
1837
1838                                 if (diff > tdiff) {
1839                                         diff = tdiff;
1840                                         best = i;
1841                                 }
1842                         }
1843                 }
1844                 if (best != -1) {
1845                         fb_try_mode(var, info, &db[best], bpp);
1846                         return 5;
1847                 }
1848         }
1849
1850         DPRINTK("Trying default video mode\n");
1851         if (!fb_try_mode(var, info, default_mode, default_bpp))
1852                 return 3;
1853
1854         DPRINTK("Trying all modes\n");
1855         for (i = 0; i < dbsize; i++)
1856                 if (!fb_try_mode(var, info, &db[i], default_bpp))
1857                         return 4;
1858
1859         DPRINTK("No valid mode found\n");
1860         return 0;
1861 }
1862
1863 /**
1864  * fb_var_to_videomode - convert fb_var_screeninfo to fb_videomode
1865  * @mode: pointer to struct fb_videomode
1866  * @var: pointer to struct fb_var_screeninfo
1867  */
1868 void fb_var_to_videomode(struct fb_videomode *mode,
1869                          const struct fb_var_screeninfo *var)
1870 {
1871         u32 pixclock, hfreq, htotal, vtotal;
1872
1873         mode->name = NULL;
1874         mode->xres = var->xres;
1875         mode->yres = var->yres;
1876         mode->pixclock = var->pixclock;
1877         mode->hsync_len = var->hsync_len;
1878         mode->vsync_len = var->vsync_len;
1879         mode->left_margin = var->left_margin;
1880         mode->right_margin = var->right_margin;
1881         mode->upper_margin = var->upper_margin;
1882         mode->lower_margin = var->lower_margin;
1883         mode->sync = var->sync;
1884         mode->vmode = var->vmode & (FB_VMODE_MASK | FB_VMODE_STEREO_MASK);
1885         mode->flag = FB_MODE_IS_FROM_VAR;
1886         mode->refresh = 0;
1887
1888         if (!var->pixclock)
1889                 return;
1890
1891         pixclock = PICOS2KHZ(var->pixclock) * 1000;
1892
1893         htotal = var->xres + var->right_margin + var->hsync_len +
1894                 var->left_margin;
1895         vtotal = var->yres + var->lower_margin + var->vsync_len +
1896                 var->upper_margin;
1897
1898         if (var->vmode & FB_VMODE_INTERLACED)
1899                 vtotal /= 2;
1900         if (var->vmode & FB_VMODE_DOUBLE)
1901                 vtotal *= 2;
1902
1903         hfreq = pixclock/htotal;
1904         mode->refresh = hfreq/vtotal;
1905 }
1906
1907 /**
1908  * fb_videomode_to_var - convert fb_videomode to fb_var_screeninfo
1909  * @var: pointer to struct fb_var_screeninfo
1910  * @mode: pointer to struct fb_videomode
1911  */
1912 void fb_videomode_to_var(struct fb_var_screeninfo *var,
1913                          const struct fb_videomode *mode)
1914 {
1915         var->xres = mode->xres;
1916         var->yres = mode->yres;
1917         var->xres_virtual = mode->xres;
1918         var->yres_virtual = mode->yres;
1919         var->xoffset = 0;
1920         var->yoffset = 0;
1921         var->pixclock = mode->pixclock;
1922         var->left_margin = mode->left_margin;
1923         var->right_margin = mode->right_margin;
1924         var->upper_margin = mode->upper_margin;
1925         var->lower_margin = mode->lower_margin;
1926         var->hsync_len = mode->hsync_len;
1927         var->vsync_len = mode->vsync_len;
1928         var->sync = mode->sync;
1929         var->vmode = mode->vmode & (FB_VMODE_MASK | FB_VMODE_STEREO_MASK);
1930 }
1931
1932 /**
1933  * fb_mode_find_cea - finds a cea mode
1934  *
1935  * RETURNS:
1936  * cea vic code, 0 if not a cea mode
1937  */
1938 int fb_mode_find_cea(struct fb_videomode *mode)
1939 {
1940         int i;
1941
1942         /* TODO: optimize search, for now start from top */
1943         for (i = CEA_MODEDB_SIZE - 1; i > 0; i--)
1944                 if (fb_mode_is_equal_tolerance(cea_modes + i, mode,
1945                                         FB_MODE_TOLERANCE_DEFAULT))
1946                         return i;
1947
1948         return 0;
1949 }
1950
1951 /**
1952  * fb_mode_is_equal - compare 2 videomodes, with the second one possibly
1953  * generated by a modeset operation. In this case, use special comparison
1954  * for the vmode flags. Do not compare special vmode flags related to
1955  * colorimetry and bits per component. Use adequate rules for yuv420 flags.
1956  * @mode1: first videomode
1957  * @mode2: second videomode, possibly from a modeset
1958  *
1959  * RETURNS:
1960  * 1 if equal, 0 if not
1961  */
1962 int fb_mode_is_equal(const struct fb_videomode *mode1,
1963                      const struct fb_videomode *mode2)
1964 {
1965         /* Compare all the other information first */
1966         if (mode1->xres         != mode2->xres ||
1967             mode1->yres         != mode2->yres ||
1968             mode1->refresh      != mode2->refresh ||
1969             mode1->hsync_len    != mode2->hsync_len ||
1970             mode1->vsync_len    != mode2->vsync_len ||
1971             mode1->left_margin  != mode2->left_margin ||
1972             mode1->right_margin != mode2->right_margin ||
1973             mode1->upper_margin != mode2->upper_margin ||
1974             mode1->lower_margin != mode2->lower_margin ||
1975             mode1->sync         != mode2->sync)
1976                 return 0;
1977
1978         /* If bitfields already match, skip further testing */
1979         if (mode1->vmode == mode2->vmode)
1980                 return 1;
1981
1982         /* If it is not from a modeset, use traditional comparison */
1983         if (!(mode2->flag & FB_MODE_IS_FROM_VAR))
1984                 return (mode1->vmode == mode2->vmode);
1985
1986         /* Compare stereo and scanning properties, they should match */
1987         if ((mode1->vmode & (FB_VMODE_STEREO_MASK | FB_VMODE_SCAN_MASK)) !=
1988             (mode2->vmode & (FB_VMODE_STEREO_MASK | FB_VMODE_SCAN_MASK)))
1989                 return 0;
1990
1991         /*
1992          * Compare only FB_VMODE_Y420 and FB_VMODE_Y420_ONLY, as they are the
1993          * only flags not provided through fb_fix_screeninfo to userspace.
1994          */
1995         if ((mode1->vmode & (FB_VMODE_Y420 | FB_VMODE_Y420_ONLY)) ==
1996             (mode2->vmode & (FB_VMODE_Y420 | FB_VMODE_Y420_ONLY)))
1997                 return 1;
1998
1999         /*
2000          *Special case when comparing an RGB or YUV420 mode from set (mode2)
2001          * to a mode capable of both, YUV420 and RGB (mode1). Neither mode1
2002          * nor mode2 may have the FB_VMODE_Y420_ONLY flag set.
2003          */
2004         if (!(mode1->vmode & FB_VMODE_Y420_ONLY) &&
2005             !(mode2->vmode & FB_VMODE_Y420_ONLY) &&
2006              (mode1->vmode & FB_VMODE_Y420))
2007                 return 1;
2008
2009         /* In any other case, report the modes do not match */
2010         return 0;
2011 }
2012
2013 /**
2014  * fb_mode_is_equal_tolerance - compare 2 videomodes with a tolerance in
2015  * pixclock. Similar to fb_mode_is_equal
2016  *
2017  * RETURNS:
2018  * 1 if equal, 0 if not
2019  */
2020 int fb_mode_is_equal_tolerance(const struct fb_videomode *mode1,
2021                                const struct fb_videomode *mode2,
2022                                unsigned int tolerance)
2023 {
2024         /*
2025          * Note: this function intentionally doesn't check refresh and flags.
2026          * refresh is an optional field and always has +1/-1 rounding errors
2027          */
2028
2029         if (mode1->xres             == mode2->xres &&
2030                 mode1->yres         == mode2->yres &&
2031                 mode2->pixclock * (1000-tolerance) / 1000 <= mode1->pixclock &&
2032                 mode1->pixclock <= mode2->pixclock * (1000+tolerance) / 1000 &&
2033                 mode1->hsync_len    == mode2->hsync_len &&
2034                 mode1->vsync_len    == mode2->vsync_len &&
2035                 mode1->left_margin  == mode2->left_margin &&
2036                 mode1->right_margin == mode2->right_margin &&
2037                 mode1->upper_margin == mode2->upper_margin &&
2038                 mode1->lower_margin == mode2->lower_margin &&
2039                 mode1->sync         == mode2->sync &&
2040                 mode1->vmode        == mode2->vmode)
2041                 return 1;
2042         else
2043                 return 0;
2044 }
2045
2046 /**
2047  * fb_var_is_equal - compare two struct fb_var_screeninfo for equality
2048  * @var1: first variable screen info
2049  * @var2: second variable screen info
2050  *
2051  * This is stricter than strictly necessary, but it is assumed that this will
2052  * only be called on screen info structures derived from the same mode and
2053  * will therefore have the exact same flags. Flexibility is sacrificed for
2054  * simplicity.
2055  *
2056  * Returns:
2057  * True if both screen info structures match, false otherwise.
2058  */
2059 static bool fb_var_is_equal(const struct fb_var_screeninfo *var1,
2060                             const struct fb_var_screeninfo *var2)
2061 {
2062         if (var1->xres != var2->xres ||
2063             var1->yres != var2->yres ||
2064             var1->pixclock != var2->pixclock ||
2065             var1->left_margin != var2->left_margin ||
2066             var1->right_margin != var2->right_margin ||
2067             var1->upper_margin != var2->upper_margin ||
2068             var1->lower_margin != var2->lower_margin ||
2069             var1->hsync_len != var2->hsync_len ||
2070             var1->vsync_len != var2->vsync_len)
2071                 return false;
2072
2073         if (var1->vmode == var2->vmode)
2074                 return true;
2075
2076         /*
2077          * This could probably be less strict, similar to what's done in the
2078          * fb_mode_is_equal() function, but given the assumption that both
2079          * screen info structures are derived from the same mode, the above
2080          * checks should be good enough.
2081          */
2082
2083         return false;
2084 }
2085
2086 /**
2087  * fb_find_best_mode - find best matching videomode
2088  * @var: pointer to struct fb_var_screeninfo
2089  * @head: pointer to struct list_head of modelist
2090  *
2091  * RETURNS:
2092  * struct fb_videomode, NULL if none found
2093  *
2094  * IMPORTANT:
2095  * This function assumes that all modelist entries in
2096  * info->modelist are valid.
2097  *
2098  * NOTES:
2099  * Finds best matching videomode which has an equal or greater dimension than
2100  * var->xres and var->yres.  If more than 1 videomode is found, will return
2101  * the videomode with the highest refresh rate
2102  */
2103 const struct fb_videomode *fb_find_best_mode(const struct fb_var_screeninfo *var,
2104                                              struct list_head *head)
2105 {
2106         struct list_head *pos;
2107         struct fb_modelist *modelist;
2108         struct fb_videomode *mode, *best = NULL;
2109         u32 diff = -1;
2110
2111         list_for_each(pos, head) {
2112                 u32 d;
2113
2114                 modelist = list_entry(pos, struct fb_modelist, list);
2115                 mode = &modelist->mode;
2116
2117                 if (mode->xres >= var->xres && mode->yres >= var->yres) {
2118                         d = (mode->xres - var->xres) +
2119                                 (mode->yres - var->yres);
2120                         if (diff > d) {
2121                                 diff = d;
2122                                 best = mode;
2123                         } else if (diff == d && best &&
2124                                    mode->refresh > best->refresh)
2125                                 best = mode;
2126                 }
2127         }
2128         return best;
2129 }
2130
2131 /**
2132  * fb_find_nearest_mode - find closest videomode
2133  *
2134  * @mode: pointer to struct fb_videomode
2135  * @head: pointer to modelist
2136  *
2137  * Finds best matching videomode, smaller or greater in dimension.
2138  * If more than 1 videomode is found, will return the videomode with
2139  * the closest refresh rate.
2140  */
2141 const struct fb_videomode *fb_find_nearest_mode(const struct fb_videomode *mode,
2142                                                 struct list_head *head)
2143 {
2144         struct list_head *pos;
2145         struct fb_modelist *modelist;
2146         struct fb_videomode *cmode, *best = NULL;
2147         u32 diff = -1, diff_refresh = -1;
2148
2149         list_for_each(pos, head) {
2150                 u32 d;
2151
2152                 modelist = list_entry(pos, struct fb_modelist, list);
2153                 cmode = &modelist->mode;
2154
2155                 d = abs(cmode->xres - mode->xres) +
2156                         abs(cmode->yres - mode->yres);
2157                 if (diff > d) {
2158                         diff = d;
2159                         diff_refresh = abs(cmode->refresh - mode->refresh);
2160                         best = cmode;
2161                 } else if (diff == d) {
2162                         d = abs(cmode->refresh - mode->refresh);
2163                         if (diff_refresh > d) {
2164                                 diff_refresh = d;
2165                                 best = cmode;
2166                         }
2167                 }
2168         }
2169
2170         return best;
2171 }
2172
2173 /**
2174  * fb_match_mode - find a videomode which exactly matches the timings in var
2175  * @var: pointer to struct fb_var_screeninfo
2176  * @head: pointer to struct list_head of modelist
2177  *
2178  * RETURNS:
2179  * struct fb_videomode, NULL if none found
2180  */
2181 const struct fb_videomode *fb_match_mode(const struct fb_var_screeninfo *var,
2182                                          struct list_head *head)
2183 {
2184         struct list_head *pos;
2185         struct fb_modelist *modelist;
2186         struct fb_var_screeninfo v;
2187
2188         list_for_each(pos, head) {
2189                 modelist = list_entry(pos, struct fb_modelist, list);
2190                 fb_videomode_to_var(&v, &modelist->mode);
2191                 if (fb_var_is_equal(var, &v))
2192                         return &modelist->mode;
2193         }
2194         return NULL;
2195 }
2196
2197 /**
2198  * fb_add_videomode - adds videomode entry to modelist
2199  * @mode: videomode to add
2200  * @head: struct list_head of modelist
2201  *
2202  * NOTES:
2203  * Will only add unmatched mode entries
2204  */
2205 int fb_add_videomode(const struct fb_videomode *mode, struct list_head *head)
2206 {
2207         struct list_head *pos;
2208         struct fb_modelist *modelist;
2209         struct fb_videomode *m;
2210         int found = 0;
2211
2212         list_for_each(pos, head) {
2213                 modelist = list_entry(pos, struct fb_modelist, list);
2214                 m = &modelist->mode;
2215                 if (fb_mode_is_equal(m, mode)) {
2216                         found = 1;
2217                         break;
2218                 }
2219         }
2220         if (!found) {
2221                 modelist = kmalloc(sizeof(struct fb_modelist),
2222                                                   GFP_KERNEL);
2223
2224                 if (!modelist)
2225                         return -ENOMEM;
2226                 modelist->mode = *mode;
2227                 list_add_tail(&modelist->list, head);
2228         }
2229         return 0;
2230 }
2231
2232 /**
2233  * fb_delete_videomode - removed videomode entry from modelist
2234  * @mode: videomode to remove
2235  * @head: struct list_head of modelist
2236  *
2237  * NOTES:
2238  * Will remove all matching mode entries
2239  */
2240 void fb_delete_videomode(const struct fb_videomode *mode,
2241                          struct list_head *head)
2242 {
2243         struct list_head *pos, *n;
2244         struct fb_modelist *modelist;
2245         struct fb_videomode *m;
2246
2247         list_for_each_safe(pos, n, head) {
2248                 modelist = list_entry(pos, struct fb_modelist, list);
2249                 m = &modelist->mode;
2250                 if (fb_mode_is_equal(m, mode)) {
2251                         list_del(pos);
2252                         kfree(pos);
2253                 }
2254         }
2255 }
2256
2257 /**
2258  * fb_destroy_modelist - destroy modelist
2259  * @head: struct list_head of modelist
2260  */
2261 void fb_destroy_modelist(struct list_head *head)
2262 {
2263         struct list_head *pos, *n;
2264
2265         list_for_each_safe(pos, n, head) {
2266                 list_del(pos);
2267                 kfree(pos);
2268         }
2269 }
2270 EXPORT_SYMBOL_GPL(fb_destroy_modelist);
2271
2272 /**
2273  * fb_videomode_to_modelist - convert mode array to mode list
2274  * @modedb: array of struct fb_videomode
2275  * @num: number of entries in array
2276  * @head: struct list_head of modelist
2277  */
2278 void fb_videomode_to_modelist(const struct fb_videomode *modedb, int num,
2279                               struct list_head *head)
2280 {
2281         int i;
2282
2283         INIT_LIST_HEAD(head);
2284
2285         for (i = 0; i < num; i++) {
2286                 if (fb_add_videomode(&modedb[i], head))
2287                         return;
2288         }
2289 }
2290
2291 const struct fb_videomode *fb_find_best_display(const struct fb_monspecs *specs,
2292                                                 struct list_head *head)
2293 {
2294         struct list_head *pos;
2295         struct fb_modelist *modelist;
2296         const struct fb_videomode *m, *m1 = NULL, *md = NULL, *best = NULL;
2297         int first = 0;
2298
2299         if (!head->prev || !head->next || list_empty(head))
2300                 goto finished;
2301
2302         /* get the first detailed mode and the very first mode */
2303         list_for_each(pos, head) {
2304                 modelist = list_entry(pos, struct fb_modelist, list);
2305                 m = &modelist->mode;
2306
2307                 if (!first) {
2308                         m1 = m;
2309                         first = 1;
2310                 }
2311
2312                 if (m->flag & FB_MODE_IS_FIRST) {
2313                         md = m;
2314                         break;
2315                 }
2316         }
2317
2318         /* first detailed timing is preferred */
2319         if (specs->misc & FB_MISC_1ST_DETAIL) {
2320                 best = md;
2321                 goto finished;
2322         }
2323
2324         /* find best mode based on display width and height */
2325         if (specs->max_x && specs->max_y) {
2326                 struct fb_var_screeninfo var;
2327
2328                 memset(&var, 0, sizeof(struct fb_var_screeninfo));
2329                 var.xres = (specs->max_x * 7200)/254;
2330                 var.yres = (specs->max_y * 7200)/254;
2331                 m = fb_find_best_mode(&var, head);
2332                 if (m) {
2333                         best = m;
2334                         goto finished;
2335                 }
2336         }
2337
2338         /* use first detailed mode */
2339         if (md) {
2340                 best = md;
2341                 goto finished;
2342         }
2343
2344         /* last resort, use the very first mode */
2345         best = m1;
2346 finished:
2347         return best;
2348 }
2349 EXPORT_SYMBOL(fb_find_best_display);
2350
2351 EXPORT_SYMBOL(fb_videomode_to_var);
2352 EXPORT_SYMBOL(fb_var_to_videomode);
2353 EXPORT_SYMBOL(fb_mode_is_equal);
2354 EXPORT_SYMBOL(fb_mode_find_cea);
2355 EXPORT_SYMBOL(fb_add_videomode);
2356 EXPORT_SYMBOL(fb_match_mode);
2357 EXPORT_SYMBOL(fb_find_best_mode);
2358 EXPORT_SYMBOL(fb_find_nearest_mode);
2359 EXPORT_SYMBOL(fb_videomode_to_modelist);
2360 EXPORT_SYMBOL(fb_find_mode);
2361 EXPORT_SYMBOL(fb_find_mode_cvt);