2 * linux/drivers/video/modedb.c -- Standard video mode database management
4 * Copyright (C) 1999 Geert Uytterhoeven
6 * 2001 - Documented with DocBook
7 * - Brad Douglas <brad@neruo.com>
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
14 #include <linux/module.h>
15 #include <linux/slab.h>
17 #include <linux/kernel.h>
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))
27 #define DPRINTK(fmt, args...) printk("modedb %s: " fmt, __func__ , ## args)
29 #define DPRINTK(fmt, args...)
33 * Standard video mode definitions (taken from XFree86)
36 static const struct fb_videomode modedb[] = {
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
123 /* 1400x1050 @ 60Hz, 63.9 kHz hsync */
124 { NULL, 60, 1400, 1050, 9259, 136, 40, 13, 1, 112, 3, 0,
125 FB_VMODE_NONINTERLACED },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
162 /* 1024x768 @ 100Hz, 80.21 kHz hsync */
163 { NULL, 100, 1024, 768, 8658, 192, 32, 21, 3, 192, 10, 0,
164 FB_VMODE_NONINTERLACED },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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,
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,
228 /* 320x240 @ 72 Hz, 36.5 kHz hsync */
229 { NULL, 72, 320, 240, 63492, 16, 16, 16, 4, 48, 2, 0,
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,
236 /* 400x300 @ 60 Hz, 37.8 kHz hsync */
237 { NULL, 60, 400, 300, 50000, 48, 16, 11, 1, 64, 2, 0,
240 /* 400x300 @ 72 Hz, 48.0 kHz hsync */
241 { NULL, 72, 400, 300, 40000, 32, 24, 11, 19, 64, 3, 0,
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,
248 /* 480x300 @ 60 Hz, 37.8 kHz hsync */
249 { NULL, 60, 480, 300, 41858, 56, 16, 11, 1, 80, 2, 0,
252 /* 480x300 @ 63 Hz, 39.6 kHz hsync */
253 { NULL, 63, 480, 300, 40000, 56, 16, 11, 1, 80, 2, 0,
256 /* 480x300 @ 72 Hz, 48.0 kHz hsync */
257 { NULL, 72, 480, 300, 33386, 40, 24, 11, 19, 80, 3, 0,
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 },
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 },
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 },
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 },
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 },
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 },
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 },
291 #ifdef CONFIG_FB_MODE_HELPERS
292 const struct fb_videomode cea_modes[] = {
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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},
1151 EXPORT_SYMBOL(cea_modes);
1153 const struct fb_videomode hdmi_ext_modes[HDMI_EXT_MODEDB_SIZE] = {
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},
1188 EXPORT_SYMBOL(hdmi_ext_modes);
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 },
1477 EXPORT_SYMBOL(vesa_modes);
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] },
1569 EXPORT_SYMBOL(dmt_modes);
1570 #endif /* CONFIG_FB_MODE_HELPERS */
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
1579 * Tries a video mode to test it's validity for device @info.
1581 * Returns 1 on success.
1585 static int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info,
1586 const struct fb_videomode *mode, unsigned int bpp)
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;
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;
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
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
1631 * Valid mode specifiers for @mode_option:
1633 * <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m] or
1634 * <name>[-<bpp>][@<refresh>]
1636 * with <xres>, <yres>, <bpp> and <refresh> decimal numbers and
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:
1647 * 1024x768MR-8@60m - Reduced blank with margins at 60Hz.
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.
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.
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)
1666 /* Set up defaults */
1669 dbsize = ARRAY_SIZE(modedb);
1673 default_mode = &db[0];
1678 /* Did the user specify a video mode? */
1680 mode_option = fb_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;
1688 u32 best, diff, tdiff;
1690 for (i = namelen-1; i >= 0; i--) {
1694 if (!refresh_specified && !bpp_specified &&
1696 refresh = simple_strtol(&name[i+1], NULL,
1698 refresh_specified = 1;
1706 if (!bpp_specified && !yres_specified) {
1707 bpp = simple_strtol(&name[i+1], NULL,
1716 if (!yres_specified) {
1717 yres = simple_strtol(&name[i+1], NULL,
1726 if (!yres_specified)
1745 if (i < 0 && yres_specified) {
1746 xres = simple_strtol(name, NULL, 10);
1751 struct fb_videomode cvt_mode;
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" : "");
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;
1766 cvt_mode.vmode |= FB_VMODE_INTERLACED;
1768 cvt_mode.vmode &= ~FB_VMODE_INTERLACED;
1770 ret = fb_find_mode_cvt(&cvt_mode, margins, rb);
1772 if (!ret && !fb_try_mode(var, info, &cvt_mode, bpp)) {
1773 DPRINTK("modedb CVT: CVT mode ok\n");
1777 DPRINTK("CVT mode invalid, getting mode from database\n");
1780 DPRINTK("Trying specified video mode%s %ix%i\n",
1781 refresh_specified ? "" : " (ignoring refresh rate)",
1784 if (!refresh_specified) {
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.
1793 info->monspecs.vfmin && info->monspecs.vfmax &&
1794 info->monspecs.hfmin && info->monspecs.hfmax &&
1795 info->monspecs.dclkmax) {
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)
1811 if (abs(db[i].refresh - refresh) < diff) {
1812 diff = abs(db[i].refresh - refresh);
1818 fb_try_mode(var, info, &db[best], bpp);
1819 return (refresh_specified) ? 2 : 1;
1822 diff = 2 * (xres + yres);
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);
1832 * Penalize modes with resolutions smaller
1835 if (xres > db[i].xres || yres > db[i].yres)
1836 tdiff += xres + yres;
1845 fb_try_mode(var, info, &db[best], bpp);
1850 DPRINTK("Trying default video mode\n");
1851 if (!fb_try_mode(var, info, default_mode, default_bpp))
1854 DPRINTK("Trying all modes\n");
1855 for (i = 0; i < dbsize; i++)
1856 if (!fb_try_mode(var, info, &db[i], default_bpp))
1859 DPRINTK("No valid mode found\n");
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
1868 void fb_var_to_videomode(struct fb_videomode *mode,
1869 const struct fb_var_screeninfo *var)
1871 u32 pixclock, hfreq, htotal, vtotal;
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;
1891 pixclock = PICOS2KHZ(var->pixclock) * 1000;
1893 htotal = var->xres + var->right_margin + var->hsync_len +
1895 vtotal = var->yres + var->lower_margin + var->vsync_len +
1898 if (var->vmode & FB_VMODE_INTERLACED)
1900 if (var->vmode & FB_VMODE_DOUBLE)
1903 hfreq = pixclock/htotal;
1904 mode->refresh = hfreq/vtotal;
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
1912 void fb_videomode_to_var(struct fb_var_screeninfo *var,
1913 const struct fb_videomode *mode)
1915 var->xres = mode->xres;
1916 var->yres = mode->yres;
1917 var->xres_virtual = mode->xres;
1918 var->yres_virtual = mode->yres;
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);
1933 * fb_mode_find_cea - finds a cea mode
1936 * cea vic code, 0 if not a cea mode
1938 int fb_mode_find_cea(struct fb_videomode *mode)
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))
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
1960 * 1 if equal, 0 if not
1962 int fb_mode_is_equal(const struct fb_videomode *mode1,
1963 const struct fb_videomode *mode2)
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)
1978 /* If bitfields already match, skip further testing */
1979 if (mode1->vmode == mode2->vmode)
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);
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)))
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.
1995 if ((mode1->vmode & (FB_VMODE_Y420 | FB_VMODE_Y420_ONLY)) ==
1996 (mode2->vmode & (FB_VMODE_Y420 | FB_VMODE_Y420_ONLY)))
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.
2004 if (!(mode1->vmode & FB_VMODE_Y420_ONLY) &&
2005 !(mode2->vmode & FB_VMODE_Y420_ONLY) &&
2006 (mode1->vmode & FB_VMODE_Y420))
2009 /* In any other case, report the modes do not match */
2014 * fb_mode_is_equal_tolerance - compare 2 videomodes with a tolerance in
2015 * pixclock. Similar to fb_mode_is_equal
2018 * 1 if equal, 0 if not
2020 int fb_mode_is_equal_tolerance(const struct fb_videomode *mode1,
2021 const struct fb_videomode *mode2,
2022 unsigned int tolerance)
2025 * Note: this function intentionally doesn't check refresh and flags.
2026 * refresh is an optional field and always has +1/-1 rounding errors
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)
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
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
2057 * True if both screen info structures match, false otherwise.
2059 static bool fb_var_is_equal(const struct fb_var_screeninfo *var1,
2060 const struct fb_var_screeninfo *var2)
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)
2073 if (var1->vmode == var2->vmode)
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.
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
2092 * struct fb_videomode, NULL if none found
2095 * This function assumes that all modelist entries in
2096 * info->modelist are valid.
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
2103 const struct fb_videomode *fb_find_best_mode(const struct fb_var_screeninfo *var,
2104 struct list_head *head)
2106 struct list_head *pos;
2107 struct fb_modelist *modelist;
2108 struct fb_videomode *mode, *best = NULL;
2111 list_for_each(pos, head) {
2114 modelist = list_entry(pos, struct fb_modelist, list);
2115 mode = &modelist->mode;
2117 if (mode->xres >= var->xres && mode->yres >= var->yres) {
2118 d = (mode->xres - var->xres) +
2119 (mode->yres - var->yres);
2123 } else if (diff == d && best &&
2124 mode->refresh > best->refresh)
2132 * fb_find_nearest_mode - find closest videomode
2134 * @mode: pointer to struct fb_videomode
2135 * @head: pointer to modelist
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.
2141 const struct fb_videomode *fb_find_nearest_mode(const struct fb_videomode *mode,
2142 struct list_head *head)
2144 struct list_head *pos;
2145 struct fb_modelist *modelist;
2146 struct fb_videomode *cmode, *best = NULL;
2147 u32 diff = -1, diff_refresh = -1;
2149 list_for_each(pos, head) {
2152 modelist = list_entry(pos, struct fb_modelist, list);
2153 cmode = &modelist->mode;
2155 d = abs(cmode->xres - mode->xres) +
2156 abs(cmode->yres - mode->yres);
2159 diff_refresh = abs(cmode->refresh - mode->refresh);
2161 } else if (diff == d) {
2162 d = abs(cmode->refresh - mode->refresh);
2163 if (diff_refresh > d) {
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
2179 * struct fb_videomode, NULL if none found
2181 const struct fb_videomode *fb_match_mode(const struct fb_var_screeninfo *var,
2182 struct list_head *head)
2184 struct list_head *pos;
2185 struct fb_modelist *modelist;
2186 struct fb_var_screeninfo v;
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;
2198 * fb_add_videomode - adds videomode entry to modelist
2199 * @mode: videomode to add
2200 * @head: struct list_head of modelist
2203 * Will only add unmatched mode entries
2205 int fb_add_videomode(const struct fb_videomode *mode, struct list_head *head)
2207 struct list_head *pos;
2208 struct fb_modelist *modelist;
2209 struct fb_videomode *m;
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)) {
2221 modelist = kmalloc(sizeof(struct fb_modelist),
2226 modelist->mode = *mode;
2227 list_add_tail(&modelist->list, head);
2233 * fb_delete_videomode - removed videomode entry from modelist
2234 * @mode: videomode to remove
2235 * @head: struct list_head of modelist
2238 * Will remove all matching mode entries
2240 void fb_delete_videomode(const struct fb_videomode *mode,
2241 struct list_head *head)
2243 struct list_head *pos, *n;
2244 struct fb_modelist *modelist;
2245 struct fb_videomode *m;
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)) {
2258 * fb_destroy_modelist - destroy modelist
2259 * @head: struct list_head of modelist
2261 void fb_destroy_modelist(struct list_head *head)
2263 struct list_head *pos, *n;
2265 list_for_each_safe(pos, n, head) {
2270 EXPORT_SYMBOL_GPL(fb_destroy_modelist);
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
2278 void fb_videomode_to_modelist(const struct fb_videomode *modedb, int num,
2279 struct list_head *head)
2283 INIT_LIST_HEAD(head);
2285 for (i = 0; i < num; i++) {
2286 if (fb_add_videomode(&modedb[i], head))
2291 const struct fb_videomode *fb_find_best_display(const struct fb_monspecs *specs,
2292 struct list_head *head)
2294 struct list_head *pos;
2295 struct fb_modelist *modelist;
2296 const struct fb_videomode *m, *m1 = NULL, *md = NULL, *best = NULL;
2299 if (!head->prev || !head->next || list_empty(head))
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;
2312 if (m->flag & FB_MODE_IS_FIRST) {
2318 /* first detailed timing is preferred */
2319 if (specs->misc & FB_MISC_1ST_DETAIL) {
2324 /* find best mode based on display width and height */
2325 if (specs->max_x && specs->max_y) {
2326 struct fb_var_screeninfo var;
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);
2338 /* use first detailed mode */
2344 /* last resort, use the very first mode */
2349 EXPORT_SYMBOL(fb_find_best_display);
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);