Blame view

drivers/video/modedb.c 32.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  /*
   *  linux/drivers/video/modedb.c -- Standard video mode database management
   *
   *	Copyright (C) 1999 Geert Uytterhoeven
   *
   *	2001 - Documented with DocBook
   *	- Brad Douglas <brad@neruo.com>
   *
   *  This file is subject to the terms and conditions of the GNU General Public
   *  License. See the file COPYING in the main directory of this archive for
   *  more details.
   */
  
  #include <linux/module.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
15
  #include <linux/slab.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
  #include <linux/fb.h>
2cb96f866   Andy Shevchenko   fbdev: drop custo...
17
  #include <linux/kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
19
20
21
22
23
24
25
26
  
  #undef DEBUG
  
  #define name_matches(v, s, l) \
      ((v).name && !strncmp((s), (v).name, (l)) && strlen((v).name) == (l))
  #define res_matches(v, x, y) \
      ((v).xres == (x) && (v).yres == (y))
  
  #ifdef DEBUG
5ae121705   Harvey Harrison   video: replace re...
27
  #define DPRINTK(fmt, args...)	printk("modedb %s: " fmt, __func__ , ## args)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
30
  #else
  #define DPRINTK(fmt, args...)
  #endif
9a054fbac   Geert Uytterhoeven   fb: move and rena...
31
  const char *fb_mode_option;
659179b28   Geoff Levand   fbdev: export sym...
32
  EXPORT_SYMBOL_GPL(fb_mode_option);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33

ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
34
35
36
  /*
   *  Standard video mode definitions (taken from XFree86)
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
  static const struct fb_videomode modedb[] = {
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
39

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
  	/* 640x400 @ 70 Hz, 31.5 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
41
42
  	{ NULL, 70, 640, 400, 39721, 40, 24, 39, 9, 96, 2, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
  	/* 640x480 @ 60 Hz, 31.5 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
44
45
  	{ NULL, 60, 640, 480, 39721, 40, 24, 32, 11, 96, 2,	0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
  	/* 800x600 @ 56 Hz, 35.15 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
47
48
  	{ NULL, 56, 800, 600, 27777, 128, 24, 22, 1, 72, 2,	0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
  	/* 1024x768 @ 87 Hz interlaced, 35.5 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
50
51
  	{ NULL, 87, 1024, 768, 22271, 56, 24, 33, 8, 160, 8, 0,
  		FB_VMODE_INTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
  	/* 640x400 @ 85 Hz, 37.86 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
53
54
  	{ NULL, 85, 640, 400, 31746, 96, 32, 41, 1, 64, 3,
  		FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
  	/* 640x480 @ 72 Hz, 36.5 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
56
57
  	{ NULL, 72, 640, 480, 31746, 144, 40, 30, 8, 40, 3, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
  	/* 640x480 @ 75 Hz, 37.50 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
59
60
  	{ NULL, 75, 640, 480, 31746, 120, 16, 16, 1, 64, 3,	0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
  	/* 800x600 @ 60 Hz, 37.8 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
62
63
64
  	{ NULL, 60, 800, 600, 25000, 88, 40, 23, 1, 128, 4,
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65
  	/* 640x480 @ 85 Hz, 43.27 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
66
67
  	{ NULL, 85, 640, 480, 27777, 80, 56, 25, 1, 56, 3, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
  	/* 1152x864 @ 89 Hz interlaced, 44 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
69
70
  	{ NULL, 89, 1152, 864, 15384, 96, 16, 110, 1, 216, 10, 0,
  		FB_VMODE_INTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
  	/* 800x600 @ 72 Hz, 48.0 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
72
73
74
  	{ NULL, 72, 800, 600, 20000, 64, 56, 23, 37, 120, 6,
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
  	/* 1024x768 @ 60 Hz, 48.4 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
76
77
  	{ NULL, 60, 1024, 768, 15384, 168, 8, 29, 3, 144, 6, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
  	/* 640x480 @ 100 Hz, 53.01 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
79
80
  	{ NULL, 100, 640, 480, 21834, 96, 32, 36, 8, 96, 6,	0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
  	/* 1152x864 @ 60 Hz, 53.5 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
82
83
  	{ NULL, 60, 1152, 864, 11123, 208, 64, 16, 4, 256, 8, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84
  	/* 800x600 @ 85 Hz, 55.84 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
85
86
  	{ NULL, 85, 800, 600, 16460, 160, 64, 36, 16, 64, 5, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87
  	/* 1024x768 @ 70 Hz, 56.5 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
88
89
  	{ NULL, 70, 1024, 768, 13333, 144, 24, 29, 3, 136, 6, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
  	/* 1280x1024 @ 87 Hz interlaced, 51 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
91
92
  	{ NULL, 87, 1280, 1024, 12500, 56, 16, 128, 1, 216, 12,	0,
  		FB_VMODE_INTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93
  	/* 800x600 @ 100 Hz, 64.02 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
94
95
  	{ NULL, 100, 800, 600, 14357, 160, 64, 30, 4, 64, 6, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
  	/* 1024x768 @ 76 Hz, 62.5 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
97
98
  	{ NULL, 76, 1024, 768, 11764, 208, 8, 36, 16, 120, 3, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
  	/* 1152x864 @ 70 Hz, 62.4 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
100
101
  	{ NULL, 70, 1152, 864, 10869, 106, 56, 20, 1, 160, 10, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
102
  	/* 1280x1024 @ 61 Hz, 64.2 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
103
104
  	{ NULL, 61, 1280, 1024, 9090, 200, 48, 26, 1, 184, 3, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
  	/* 1400x1050 @ 60Hz, 63.9 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
106
107
  	{ NULL, 60, 1400, 1050, 9259, 136, 40, 13, 1, 112, 3, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
  	/* 1400x1050 @ 75,107 Hz, 82,392 kHz +hsync +vsync*/
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
109
110
111
  	{ NULL, 75, 1400, 1050, 7190, 120, 56, 23, 10, 112, 13,
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
  	/* 1400x1050 @ 60 Hz, ? kHz +hsync +vsync*/
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
113
114
115
  	{ NULL, 60, 1400, 1050, 9259, 128, 40, 12, 0, 112, 3,
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
116
  	/* 1024x768 @ 85 Hz, 70.24 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
117
118
  	{ NULL, 85, 1024, 768, 10111, 192, 32, 34, 14, 160, 6, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119
  	/* 1152x864 @ 78 Hz, 70.8 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
120
121
  	{ NULL, 78, 1152, 864, 9090, 228, 88, 32, 0, 84, 12, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
  	/* 1280x1024 @ 70 Hz, 74.59 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
123
124
  	{ NULL, 70, 1280, 1024, 7905, 224, 32, 28, 8, 160, 8, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
  	/* 1600x1200 @ 60Hz, 75.00 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
126
127
128
  	{ NULL, 60, 1600, 1200, 6172, 304, 64, 46, 1, 192, 3,
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
  	/* 1152x864 @ 84 Hz, 76.0 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
130
131
  	{ NULL, 84, 1152, 864, 7407, 184, 312, 32, 0, 128, 12, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
  	/* 1280x1024 @ 74 Hz, 78.85 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
133
134
  	{ NULL, 74, 1280, 1024, 7407, 256, 32, 34, 3, 144, 3, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135
  	/* 1024x768 @ 100Hz, 80.21 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
136
137
  	{ NULL, 100, 1024, 768, 8658, 192, 32, 21, 3, 192, 10, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
  	/* 1280x1024 @ 76 Hz, 81.13 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
139
140
  	{ NULL, 76, 1280, 1024, 7407, 248, 32, 34, 3, 104, 3, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
  	/* 1600x1200 @ 70 Hz, 87.50 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
142
143
  	{ NULL, 70, 1600, 1200, 5291, 304, 64, 46, 1, 192, 3, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
144
  	/* 1152x864 @ 100 Hz, 89.62 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
145
146
  	{ NULL, 100, 1152, 864, 7264, 224, 32, 17, 2, 128, 19, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147
  	/* 1280x1024 @ 85 Hz, 91.15 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
148
149
150
  	{ NULL, 85, 1280, 1024, 6349, 224, 64, 44, 1, 160, 3,
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
151
  	/* 1600x1200 @ 75 Hz, 93.75 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
152
153
154
  	{ NULL, 75, 1600, 1200, 4938, 304, 64, 46, 1, 192, 3,
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED },
b0c879782   Olaf Hering   [PATCH] fbdev: ad...
155
  	/* 1680x1050 @ 60 Hz, 65.191 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
156
157
158
  	{ NULL, 60, 1680, 1050, 6848, 280, 104, 30, 3, 176, 6,
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
159
  	/* 1600x1200 @ 85 Hz, 105.77 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
160
161
162
  	{ NULL, 85, 1600, 1200, 4545, 272, 16, 37, 4, 192, 3,
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163
  	/* 1280x1024 @ 100 Hz, 107.16 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
164
165
  	{ NULL, 100, 1280, 1024, 5502, 256, 32, 26, 7, 128, 15, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
166
  	/* 1800x1440 @ 64Hz, 96.15 kHz hsync  */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
167
168
169
  	{ NULL, 64, 1800, 1440, 4347, 304, 96, 46, 1, 192, 3,
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170
  	/* 1800x1440 @ 70Hz, 104.52 kHz hsync  */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
171
172
173
  	{ NULL, 70, 1800, 1440, 4000, 304, 96, 46, 1, 192, 3,
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
  	/* 512x384 @ 78 Hz, 31.50 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
175
176
  	{ NULL, 78, 512, 384, 49603, 48, 16, 16, 1, 64, 3, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
  	/* 512x384 @ 85 Hz, 34.38 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
178
179
  	{ NULL, 85, 512, 384, 45454, 48, 16, 16, 1, 64, 3, 0,
  		FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
180
  	/* 320x200 @ 70 Hz, 31.5 kHz hsync, 8:5 aspect ratio */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
181
182
  	{ NULL, 70, 320, 200, 79440, 16, 16, 20, 4, 48, 1, 0,
  		FB_VMODE_DOUBLE },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
  	/* 320x240 @ 60 Hz, 31.5 kHz hsync, 4:3 aspect ratio */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
184
185
  	{ NULL, 60, 320, 240, 79440, 16, 16, 16, 5, 48, 1, 0,
  		FB_VMODE_DOUBLE },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
  	/* 320x240 @ 72 Hz, 36.5 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
187
188
  	{ NULL, 72, 320, 240, 63492, 16, 16, 16, 4, 48, 2, 0,
  		FB_VMODE_DOUBLE },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
  	/* 400x300 @ 56 Hz, 35.2 kHz hsync, 4:3 aspect ratio */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
190
191
  	{ NULL, 56, 400, 300, 55555, 64, 16, 10, 1, 32, 1, 0,
  		FB_VMODE_DOUBLE },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
192
  	/* 400x300 @ 60 Hz, 37.8 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
193
194
  	{ NULL, 60, 400, 300, 50000, 48, 16, 11, 1, 64, 2, 0,
  		FB_VMODE_DOUBLE },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
  	/* 400x300 @ 72 Hz, 48.0 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
196
197
  	{ NULL, 72, 400, 300, 40000, 32, 24, 11, 19, 64, 3,	0,
  		FB_VMODE_DOUBLE },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
  	/* 480x300 @ 56 Hz, 35.2 kHz hsync, 8:5 aspect ratio */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
199
200
  	{ NULL, 56, 480, 300, 46176, 80, 16, 10, 1, 40, 1, 0,
  		FB_VMODE_DOUBLE },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
  	/* 480x300 @ 60 Hz, 37.8 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
202
203
  	{ NULL, 60, 480, 300, 41858, 56, 16, 11, 1, 80, 2, 0,
  		FB_VMODE_DOUBLE },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
204
  	/* 480x300 @ 63 Hz, 39.6 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
205
206
  	{ NULL, 63, 480, 300, 40000, 56, 16, 11, 1, 80, 2, 0,
  		FB_VMODE_DOUBLE },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
  	/* 480x300 @ 72 Hz, 48.0 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
208
209
  	{ NULL, 72, 480, 300, 33386, 40, 24, 11, 19, 80, 3, 0,
  		FB_VMODE_DOUBLE },
db6778db7   Antonino Daplas   [PATCH] nvidiafb:...
210
  	/* 1920x1200 @ 60 Hz, 74.5 Khz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
211
212
213
  	{ NULL, 60, 1920, 1200, 5177, 128, 336, 1, 38, 208, 3,
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED },
1dfcdfae5   Michael Hanselmann   [PATCH] fbdev: Fr...
214
  	/* 1152x768, 60 Hz, PowerBook G4 Titanium I and II */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
215
216
217
  	{ NULL, 60, 1152, 768, 14047, 158, 26, 29, 3, 136, 6,
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED },
f71689e41   Dennis Munsie   [PATCH] fbdev: Ad...
218
  	/* 1366x768, 60 Hz, 47.403 kHz hsync, WXGA 16:9 aspect ratio */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
219
220
  	{ NULL, 60, 1366, 768, 13806, 120, 10, 14, 3, 32, 5, 0,
  		FB_VMODE_NONINTERLACED },
545c44233   alex   fix radeonfb regr...
221
  	/* 1280x800, 60 Hz, 47.403 kHz hsync, WXGA 16:10 aspect ratio */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
222
223
224
225
226
227
228
229
230
231
  	{ NULL, 60, 1280, 800, 12048, 200, 64, 24, 1, 136, 3, 0,
  		FB_VMODE_NONINTERLACED },
  
  	/* 720x576i @ 50 Hz, 15.625 kHz hsync (PAL RGB) */
  	{ NULL, 50, 720, 576, 74074, 64, 16, 39, 5, 64, 5, 0,
  		FB_VMODE_INTERLACED },
  
  	/* 800x520i @ 50 Hz, 15.625 kHz hsync (PAL RGB) */
  	{ NULL, 50, 800, 520, 58823, 144, 64, 72, 28, 80, 5, 0,
  		FB_VMODE_INTERLACED },
17ca20cb7   Mayuresh Janorkar   fbdev: modedb: Ad...
232
  	/* 864x480 @ 60 Hz, 35.15 kHz hsync */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
233
234
  	{ NULL, 60, 864, 480, 27777, 1, 1, 1, 1, 0, 0,
  		0, FB_VMODE_NONINTERLACED },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
235
236
237
  };
  
  #ifdef CONFIG_FB_MODE_HELPERS
0ad83f688   Guennadi Liakhovetski   fbdev: when parsi...
238
239
240
  const struct fb_videomode cea_modes[64] = {
  	/* #1: 640x480p@59.94/60Hz */
  	[1] = {
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
241
242
  		NULL, 60, 640, 480, 39722, 48, 16, 33, 10, 96, 2, 0,
  		FB_VMODE_NONINTERLACED, 0,
0ad83f688   Guennadi Liakhovetski   fbdev: when parsi...
243
244
245
  	},
  	/* #3: 720x480p@59.94/60Hz */
  	[3] = {
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
246
247
  		NULL, 60, 720, 480, 37037, 60, 16, 30, 9, 62, 6, 0,
  		FB_VMODE_NONINTERLACED, 0,
0ad83f688   Guennadi Liakhovetski   fbdev: when parsi...
248
249
250
  	},
  	/* #5: 1920x1080i@59.94/60Hz */
  	[5] = {
2006920a1   Arnd Hannemann   fbdev: modedb: fi...
251
  		NULL, 60, 1920, 1080, 13763, 148, 88, 15, 2, 44, 5,
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
252
253
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_INTERLACED, 0,
0ad83f688   Guennadi Liakhovetski   fbdev: when parsi...
254
255
256
  	},
  	/* #7: 720(1440)x480iH@59.94/60Hz */
  	[7] = {
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
257
258
  		NULL, 60, 1440, 480, 18554/*37108*/, 114, 38, 15, 4, 124, 3, 0,
  		FB_VMODE_INTERLACED, 0,
0ad83f688   Guennadi Liakhovetski   fbdev: when parsi...
259
260
261
  	},
  	/* #9: 720(1440)x240pH@59.94/60Hz */
  	[9] = {
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
262
263
  		NULL, 60, 1440, 240, 18554, 114, 38, 16, 4, 124, 3, 0,
  		FB_VMODE_NONINTERLACED, 0,
0ad83f688   Guennadi Liakhovetski   fbdev: when parsi...
264
265
266
  	},
  	/* #18: 720x576pH@50Hz */
  	[18] = {
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
267
268
  		NULL, 50, 720, 576, 37037, 68, 12, 39, 5, 64, 5, 0,
  		FB_VMODE_NONINTERLACED, 0,
0ad83f688   Guennadi Liakhovetski   fbdev: when parsi...
269
270
271
  	},
  	/* #19: 1280x720p@50Hz */
  	[19] = {
2006920a1   Arnd Hannemann   fbdev: modedb: fi...
272
  		NULL, 50, 1280, 720, 13468, 220, 440, 20, 5, 40, 5,
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
273
274
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED, 0,
0ad83f688   Guennadi Liakhovetski   fbdev: when parsi...
275
276
277
  	},
  	/* #20: 1920x1080i@50Hz */
  	[20] = {
2006920a1   Arnd Hannemann   fbdev: modedb: fi...
278
  		NULL, 50, 1920, 1080, 13480, 148, 528, 15, 5, 528, 5,
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
279
280
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_INTERLACED, 0,
0ad83f688   Guennadi Liakhovetski   fbdev: when parsi...
281
282
283
  	},
  	/* #32: 1920x1080p@23.98/24Hz */
  	[32] = {
2006920a1   Arnd Hannemann   fbdev: modedb: fi...
284
  		NULL, 24, 1920, 1080, 13468, 148, 638, 36, 4, 44, 5,
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
285
286
  		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  		FB_VMODE_NONINTERLACED, 0,
0ad83f688   Guennadi Liakhovetski   fbdev: when parsi...
287
288
289
  	},
  	/* #35: (2880)x480p4x@59.94/60Hz */
  	[35] = {
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
290
291
  		NULL, 60, 2880, 480, 9250, 240, 64, 30, 9, 248, 6, 0,
  		FB_VMODE_NONINTERLACED, 0,
0ad83f688   Guennadi Liakhovetski   fbdev: when parsi...
292
293
  	},
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
295
296
297
298
299
300
301
302
303
304
  const struct fb_videomode vesa_modes[] = {
  	/* 0 640x350-85 VESA */
  	{ NULL, 85, 640, 350, 31746,  96, 32, 60, 32, 64, 3,
  	  FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA},
  	/* 1 640x400-85 VESA */
  	{ NULL, 85, 640, 400, 31746,  96, 32, 41, 01, 64, 3,
  	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 2 720x400-85 VESA */
  	{ NULL, 85, 721, 400, 28169, 108, 36, 42, 01, 72, 3,
  	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 3 640x480-60 VESA */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
305
  	{ NULL, 60, 640, 480, 39682,  48, 16, 33, 10, 96, 2,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
306
307
  	  0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 4 640x480-72 VESA */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
308
  	{ NULL, 72, 640, 480, 31746, 128, 24, 29, 9, 40, 2,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
  	  0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 5 640x480-75 VESA */
  	{ NULL, 75, 640, 480, 31746, 120, 16, 16, 01, 64, 3,
  	  0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 6 640x480-85 VESA */
  	{ NULL, 85, 640, 480, 27777, 80, 56, 25, 01, 56, 3,
  	  0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 7 800x600-56 VESA */
  	{ NULL, 56, 800, 600, 27777, 128, 24, 22, 01, 72, 2,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 8 800x600-60 VESA */
  	{ NULL, 60, 800, 600, 25000, 88, 40, 23, 01, 128, 4,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 9 800x600-72 VESA */
  	{ NULL, 72, 800, 600, 20000, 64, 56, 23, 37, 120, 6,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 10 800x600-75 VESA */
  	{ NULL, 75, 800, 600, 20202, 160, 16, 21, 01, 80, 3,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 11 800x600-85 VESA */
  	{ NULL, 85, 800, 600, 17761, 152, 32, 27, 01, 64, 3,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
          /* 12 1024x768i-43 VESA */
9d775e17b   Antonino A. Daplas   fbdev: Fix incorr...
337
  	{ NULL, 43, 1024, 768, 22271, 56, 8, 41, 0, 176, 8,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_INTERLACED, FB_MODE_IS_VESA },
  	/* 13 1024x768-60 VESA */
  	{ NULL, 60, 1024, 768, 15384, 160, 24, 29, 3, 136, 6,
  	  0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 14 1024x768-70 VESA */
  	{ NULL, 70, 1024, 768, 13333, 144, 24, 29, 3, 136, 6,
  	  0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 15 1024x768-75 VESA */
  	{ NULL, 75, 1024, 768, 12690, 176, 16, 28, 1, 96, 3,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 16 1024x768-85 VESA */
  	{ NULL, 85, 1024, 768, 10582, 208, 48, 36, 1, 96, 3,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 17 1152x864-75 VESA */
3efbb987c   Jiri Moravec   fbdev: fix typo i...
355
  	{ NULL, 75, 1152, 864, 9259, 256, 64, 32, 1, 128, 3,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 18 1280x960-60 VESA */
  	{ NULL, 60, 1280, 960, 9259, 312, 96, 36, 1, 112, 3,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 19 1280x960-85 VESA */
  	{ NULL, 85, 1280, 960, 6734, 224, 64, 47, 1, 160, 3,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 20 1280x1024-60 VESA */
  	{ NULL, 60, 1280, 1024, 9259, 248, 48, 38, 1, 112, 3,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 21 1280x1024-75 VESA */
  	{ NULL, 75, 1280, 1024, 7407, 248, 16, 38, 1, 144, 3,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 22 1280x1024-85 VESA */
  	{ NULL, 85, 1280, 1024, 6349, 224, 64, 44, 1, 160, 3,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 23 1600x1200-60 VESA */
  	{ NULL, 60, 1600, 1200, 6172, 304, 64, 46, 1, 192, 3,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 24 1600x1200-65 VESA */
  	{ NULL, 65, 1600, 1200, 5698, 304,  64, 46, 1, 192, 3,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 25 1600x1200-70 VESA */
  	{ NULL, 70, 1600, 1200, 5291, 304, 64, 46, 1, 192, 3,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 26 1600x1200-75 VESA */
ccd8c79c5   Mayuresh Janorkar   video: tidy up mo...
391
  	{ NULL, 75, 1600, 1200, 4938, 304, 64, 46, 1, 192, 3,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 27 1600x1200-85 VESA */
  	{ NULL, 85, 1600, 1200, 4357, 304, 64, 46, 1, 192, 3,
  	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  	  FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 28 1792x1344-60 VESA */
  	{ NULL, 60, 1792, 1344, 4882, 328, 128, 46, 1, 200, 3,
  	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 29 1792x1344-75 VESA */
  	{ NULL, 75, 1792, 1344, 3831, 352, 96, 69, 1, 216, 3,
  	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 30 1856x1392-60 VESA */
  	{ NULL, 60, 1856, 1392, 4580, 352, 96, 43, 1, 224, 3,
  	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 31 1856x1392-75 VESA */
  	{ NULL, 75, 1856, 1392, 3472, 352, 128, 104, 1, 224, 3,
  	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 32 1920x1440-60 VESA */
  	{ NULL, 60, 1920, 1440, 4273, 344, 128, 56, 1, 200, 3,
  	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  	/* 33 1920x1440-75 VESA */
9d775e17b   Antonino A. Daplas   fbdev: Fix incorr...
414
  	{ NULL, 75, 1920, 1440, 3367, 352, 144, 56, 1, 224, 3,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
415
416
417
418
  	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
  };
  EXPORT_SYMBOL(vesa_modes);
  #endif /* CONFIG_FB_MODE_HELPERS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
  /**
   *	fb_try_mode - test a video mode
   *	@var: frame buffer user defined part of display
   *	@info: frame buffer info structure
   *	@mode: frame buffer video mode structure
   *	@bpp: color depth in bits per pixel
   *
   *	Tries a video mode to test it's validity for device @info.
   *
   *	Returns 1 on success.
   *
   */
  
  static int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info,
  		       const struct fb_videomode *mode, unsigned int bpp)
  {
f92d39e92   Timur Tabi   fbdev: fix indent...
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
  	int err = 0;
  
  	DPRINTK("Trying mode %s %dx%d-%d@%d
  ",
  		mode->name ? mode->name : "noname",
  		mode->xres, mode->yres, bpp, mode->refresh);
  	var->xres = mode->xres;
  	var->yres = mode->yres;
  	var->xres_virtual = mode->xres;
  	var->yres_virtual = mode->yres;
  	var->xoffset = 0;
  	var->yoffset = 0;
  	var->bits_per_pixel = bpp;
  	var->activate |= FB_ACTIVATE_TEST;
  	var->pixclock = mode->pixclock;
  	var->left_margin = mode->left_margin;
  	var->right_margin = mode->right_margin;
  	var->upper_margin = mode->upper_margin;
  	var->lower_margin = mode->lower_margin;
  	var->hsync_len = mode->hsync_len;
  	var->vsync_len = mode->vsync_len;
  	var->sync = mode->sync;
  	var->vmode = mode->vmode;
  	if (info->fbops->fb_check_var)
  		err = info->fbops->fb_check_var(var, info);
  	var->activate &= ~FB_ACTIVATE_TEST;
  	return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
462
463
464
  }
  
  /**
f92d39e92   Timur Tabi   fbdev: fix indent...
465
466
467
468
469
470
471
472
   *     fb_find_mode - finds a valid video mode
   *     @var: frame buffer user defined part of display
   *     @info: frame buffer info structure
   *     @mode_option: string video mode to find
   *     @db: video mode database
   *     @dbsize: size of @db
   *     @default_mode: default video mode to fall back to
   *     @default_bpp: default color depth in bits per pixel
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
473
   *
f92d39e92   Timur Tabi   fbdev: fix indent...
474
475
476
477
   *     Finds a suitable video mode, starting with the specified mode
   *     in @mode_option with fallback to @default_mode.  If
   *     @default_mode fails, all modes in the video mode database will
   *     be tried.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
478
   *
f92d39e92   Timur Tabi   fbdev: fix indent...
479
   *     Valid mode specifiers for @mode_option:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
480
   *
f92d39e92   Timur Tabi   fbdev: fix indent...
481
482
   *     <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m] or
   *     <name>[-<bpp>][@<refresh>]
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
483
   *
f92d39e92   Timur Tabi   fbdev: fix indent...
484
485
   *     with <xres>, <yres>, <bpp> and <refresh> decimal numbers and
   *     <name> a string.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
486
   *
96fe6a210   Antonino A. Daplas   [PATCH] fbdev: Ad...
487
488
489
490
491
492
493
494
495
496
   *      If 'M' is present after yres (and before refresh/bpp if present),
   *      the function will compute the timings using VESA(tm) Coordinated
   *      Video Timings (CVT).  If 'R' is present after 'M', will compute with
   *      reduced blanking (for flatpanels).  If 'i' is present, compute
   *      interlaced mode.  If 'm' is present, add margins equal to 1.8%
   *      of xres rounded down to 8 pixels, and 1.8% of yres. The char
   *      'i' and 'm' must be after 'M' and 'R'. Example:
   *
   *      1024x768MR-8@60m - Reduced blank with margins at 60Hz.
   *
f92d39e92   Timur Tabi   fbdev: fix indent...
497
498
   *     NOTE: The passed struct @var is _not_ cleared!  This allows you
   *     to supply values for e.g. the grayscale and accel_flags fields.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
499
   *
f92d39e92   Timur Tabi   fbdev: fix indent...
500
501
502
   *     Returns zero for failure, 1 if using specified @mode_option,
   *     2 if using specified @mode_option with an ignored refresh rate,
   *     3 if default mode is used, 4 if fall back to any valid mode.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
503
504
505
506
507
508
509
510
511
   *
   */
  
  int fb_find_mode(struct fb_var_screeninfo *var,
  		 struct fb_info *info, const char *mode_option,
  		 const struct fb_videomode *db, unsigned int dbsize,
  		 const struct fb_videomode *default_mode,
  		 unsigned int default_bpp)
  {
f92d39e92   Timur Tabi   fbdev: fix indent...
512
  	int i;
96fe6a210   Antonino A. Daplas   [PATCH] fbdev: Ad...
513

f92d39e92   Timur Tabi   fbdev: fix indent...
514
515
516
517
518
  	/* Set up defaults */
  	if (!db) {
  		db = modedb;
  		dbsize = ARRAY_SIZE(modedb);
  	}
96fe6a210   Antonino A. Daplas   [PATCH] fbdev: Ad...
519

f92d39e92   Timur Tabi   fbdev: fix indent...
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
  	if (!default_mode)
  		default_mode = &db[0];
  
  	if (!default_bpp)
  		default_bpp = 8;
  
  	/* Did the user specify a video mode? */
  	if (!mode_option)
  		mode_option = fb_mode_option;
  	if (mode_option) {
  		const char *name = mode_option;
  		unsigned int namelen = strlen(name);
  		int res_specified = 0, bpp_specified = 0, refresh_specified = 0;
  		unsigned int xres = 0, yres = 0, bpp = default_bpp, refresh = 0;
  		int yres_specified = 0, cvt = 0, rb = 0, interlace = 0;
  		int margins = 0;
  		u32 best, diff, tdiff;
  
  		for (i = namelen-1; i >= 0; i--) {
  			switch (name[i]) {
  			case '@':
  				namelen = i;
  				if (!refresh_specified && !bpp_specified &&
  				    !yres_specified) {
  					refresh = simple_strtol(&name[i+1], NULL,
  								10);
  					refresh_specified = 1;
  					if (cvt || rb)
  						cvt = 0;
  				} else
  					goto done;
  				break;
  			case '-':
  				namelen = i;
  				if (!bpp_specified && !yres_specified) {
  					bpp = simple_strtol(&name[i+1], NULL,
  							    10);
  					bpp_specified = 1;
  					if (cvt || rb)
  						cvt = 0;
  				} else
  					goto done;
  				break;
  			case 'x':
  				if (!yres_specified) {
  					yres = simple_strtol(&name[i+1], NULL,
  							     10);
  					yres_specified = 1;
  				} else
  					goto done;
  				break;
  			case '0' ... '9':
  				break;
  			case 'M':
  				if (!yres_specified)
  					cvt = 1;
  				break;
  			case 'R':
  				if (!cvt)
  					rb = 1;
  				break;
  			case 'm':
  				if (!cvt)
  					margins = 1;
  				break;
  			case 'i':
  				if (!cvt)
  					interlace = 1;
  				break;
  			default:
  				goto done;
  			}
  		}
  		if (i < 0 && yres_specified) {
  			xres = simple_strtol(name, NULL, 10);
  			res_specified = 1;
  		}
  done:
  		if (cvt) {
  			struct fb_videomode cvt_mode;
  			int ret;
  
  			DPRINTK("CVT mode %dx%d@%dHz%s%s%s
  ", xres, yres,
  				(refresh) ? refresh : 60,
  				(rb) ? " reduced blanking" : "",
  				(margins) ? " with margins" : "",
  				(interlace) ? " interlaced" : "");
  
  			memset(&cvt_mode, 0, sizeof(cvt_mode));
  			cvt_mode.xres = xres;
  			cvt_mode.yres = yres;
  			cvt_mode.refresh = (refresh) ? refresh : 60;
  
  			if (interlace)
  				cvt_mode.vmode |= FB_VMODE_INTERLACED;
  			else
  				cvt_mode.vmode &= ~FB_VMODE_INTERLACED;
  
  			ret = fb_find_mode_cvt(&cvt_mode, margins, rb);
  
  			if (!ret && !fb_try_mode(var, info, &cvt_mode, bpp)) {
  				DPRINTK("modedb CVT: CVT mode ok
  ");
  				return 1;
  			}
96fe6a210   Antonino A. Daplas   [PATCH] fbdev: Ad...
626

f92d39e92   Timur Tabi   fbdev: fix indent...
627
628
629
  			DPRINTK("CVT mode invalid, getting mode from database
  ");
  		}
96fe6a210   Antonino A. Daplas   [PATCH] fbdev: Ad...
630

f92d39e92   Timur Tabi   fbdev: fix indent...
631
632
633
634
  		DPRINTK("Trying specified video mode%s %ix%i
  ",
  			refresh_specified ? "" : " (ignoring refresh rate)",
  			xres, yres);
96fe6a210   Antonino A. Daplas   [PATCH] fbdev: Ad...
635

f92d39e92   Timur Tabi   fbdev: fix indent...
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
  		if (!refresh_specified) {
  			/*
  			 * If the caller has provided a custom mode database and
  			 * a valid monspecs structure, we look for the mode with
  			 * the highest refresh rate.  Otherwise we play it safe
  			 * it and try to find a mode with a refresh rate closest
  			 * to the standard 60 Hz.
  			 */
  			if (db != modedb &&
  			    info->monspecs.vfmin && info->monspecs.vfmax &&
  			    info->monspecs.hfmin && info->monspecs.hfmax &&
  			    info->monspecs.dclkmax) {
  				refresh = 1000;
  			} else {
  				refresh = 60;
  			}
1c5dd1709   Michal Januszewski   fbdev: find mode ...
652
  		}
1c5dd1709   Michal Januszewski   fbdev: find mode ...
653

f92d39e92   Timur Tabi   fbdev: fix indent...
654
655
656
657
658
659
660
661
  		diff = -1;
  		best = -1;
  		for (i = 0; i < dbsize; i++) {
  			if ((name_matches(db[i], name, namelen) ||
  			     (res_specified && res_matches(db[i], xres, yres))) &&
  			    !fb_try_mode(var, info, &db[i], bpp)) {
  				if (refresh_specified && db[i].refresh == refresh)
  					return 1;
1c5dd1709   Michal Januszewski   fbdev: find mode ...
662
663
664
  				if (abs(db[i].refresh - refresh) < diff) {
  					diff = abs(db[i].refresh - refresh);
  					best = i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
665
666
667
  				}
  			}
  		}
f92d39e92   Timur Tabi   fbdev: fix indent...
668
669
670
671
  		if (best != -1) {
  			fb_try_mode(var, info, &db[best], bpp);
  			return (refresh_specified) ? 2 : 1;
  		}
6b745b6fd   Michal Januszewski   fbdev: make the b...
672

f92d39e92   Timur Tabi   fbdev: fix indent...
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
  		diff = 2 * (xres + yres);
  		best = -1;
  		DPRINTK("Trying best-fit modes
  ");
  		for (i = 0; i < dbsize; i++) {
  			DPRINTK("Trying %ix%i
  ", db[i].xres, db[i].yres);
  			if (!fb_try_mode(var, info, &db[i], bpp)) {
  				tdiff = abs(db[i].xres - xres) +
  					abs(db[i].yres - yres);
  
  				/*
  				 * Penalize modes with resolutions smaller
  				 * than requested.
  				 */
  				if (xres > db[i].xres || yres > db[i].yres)
  					tdiff += xres + yres;
  
  				if (diff > tdiff) {
  					diff = tdiff;
  					best = i;
  				}
6b745b6fd   Michal Januszewski   fbdev: make the b...
695
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
696
  		}
f92d39e92   Timur Tabi   fbdev: fix indent...
697
698
699
700
  		if (best != -1) {
  			fb_try_mode(var, info, &db[best], bpp);
  			return 5;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
701
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
702

f92d39e92   Timur Tabi   fbdev: fix indent...
703
704
705
706
  	DPRINTK("Trying default video mode
  ");
  	if (!fb_try_mode(var, info, default_mode, default_bpp))
  		return 3;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
707

f92d39e92   Timur Tabi   fbdev: fix indent...
708
709
710
711
712
  	DPRINTK("Trying all modes
  ");
  	for (i = 0; i < dbsize; i++)
  		if (!fb_try_mode(var, info, &db[i], default_bpp))
  			return 4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
713

f92d39e92   Timur Tabi   fbdev: fix indent...
714
715
716
  	DPRINTK("No valid mode found
  ");
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
717
718
719
720
721
722
723
724
  }
  
  /**
   * fb_var_to_videomode - convert fb_var_screeninfo to fb_videomode
   * @mode: pointer to struct fb_videomode
   * @var: pointer to struct fb_var_screeninfo
   */
  void fb_var_to_videomode(struct fb_videomode *mode,
9791d763d   Geert Uytterhoeven   [PATCH] fbdev mod...
725
  			 const struct fb_var_screeninfo *var)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
  {
  	u32 pixclock, hfreq, htotal, vtotal;
  
  	mode->name = NULL;
  	mode->xres = var->xres;
  	mode->yres = var->yres;
  	mode->pixclock = var->pixclock;
  	mode->hsync_len = var->hsync_len;
  	mode->vsync_len = var->vsync_len;
  	mode->left_margin = var->left_margin;
  	mode->right_margin = var->right_margin;
  	mode->upper_margin = var->upper_margin;
  	mode->lower_margin = var->lower_margin;
  	mode->sync = var->sync;
  	mode->vmode = var->vmode & FB_VMODE_MASK;
  	mode->flag = FB_MODE_IS_FROM_VAR;
8fb6567e3   Michal Januszewski   [PATCH] fbdev: fi...
742
  	mode->refresh = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
  	if (!var->pixclock)
  		return;
  
  	pixclock = PICOS2KHZ(var->pixclock) * 1000;
  
  	htotal = var->xres + var->right_margin + var->hsync_len +
  		var->left_margin;
  	vtotal = var->yres + var->lower_margin + var->vsync_len +
  		var->upper_margin;
  
  	if (var->vmode & FB_VMODE_INTERLACED)
  		vtotal /= 2;
  	if (var->vmode & FB_VMODE_DOUBLE)
  		vtotal *= 2;
  
  	hfreq = pixclock/htotal;
  	mode->refresh = hfreq/vtotal;
  }
  
  /**
   * fb_videomode_to_var - convert fb_videomode to fb_var_screeninfo
   * @var: pointer to struct fb_var_screeninfo
   * @mode: pointer to struct fb_videomode
   */
  void fb_videomode_to_var(struct fb_var_screeninfo *var,
9791d763d   Geert Uytterhoeven   [PATCH] fbdev mod...
768
  			 const struct fb_videomode *mode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
769
770
771
  {
  	var->xres = mode->xres;
  	var->yres = mode->yres;
dcfe2666f   Geert Uytterhoeven   [PATCH] fb_videom...
772
773
774
775
  	var->xres_virtual = mode->xres;
  	var->yres_virtual = mode->yres;
  	var->xoffset = 0;
  	var->yoffset = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
776
777
  	var->pixclock = mode->pixclock;
  	var->left_margin = mode->left_margin;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
778
779
780
  	var->right_margin = mode->right_margin;
  	var->upper_margin = mode->upper_margin;
  	var->lower_margin = mode->lower_margin;
dcfe2666f   Geert Uytterhoeven   [PATCH] fb_videom...
781
782
  	var->hsync_len = mode->hsync_len;
  	var->vsync_len = mode->vsync_len;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
783
784
785
786
787
788
789
790
791
792
793
794
  	var->sync = mode->sync;
  	var->vmode = mode->vmode & FB_VMODE_MASK;
  }
  
  /**
   * fb_mode_is_equal - compare 2 videomodes
   * @mode1: first videomode
   * @mode2: second videomode
   *
   * RETURNS:
   * 1 if equal, 0 if not
   */
9791d763d   Geert Uytterhoeven   [PATCH] fbdev mod...
795
796
  int fb_mode_is_equal(const struct fb_videomode *mode1,
  		     const struct fb_videomode *mode2)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
  {
  	return (mode1->xres         == mode2->xres &&
  		mode1->yres         == mode2->yres &&
  		mode1->pixclock     == mode2->pixclock &&
  		mode1->hsync_len    == mode2->hsync_len &&
  		mode1->vsync_len    == mode2->vsync_len &&
  		mode1->left_margin  == mode2->left_margin &&
  		mode1->right_margin == mode2->right_margin &&
  		mode1->upper_margin == mode2->upper_margin &&
  		mode1->lower_margin == mode2->lower_margin &&
  		mode1->sync         == mode2->sync &&
  		mode1->vmode        == mode2->vmode);
  }
  
  /**
   * fb_find_best_mode - find best matching videomode
   * @var: pointer to struct fb_var_screeninfo
   * @head: pointer to struct list_head of modelist
   *
   * RETURNS:
   * struct fb_videomode, NULL if none found
   *
   * IMPORTANT:
   * This function assumes that all modelist entries in
   * info->modelist are valid.
   *
   * NOTES:
   * Finds best matching videomode which has an equal or greater dimension than
   * var->xres and var->yres.  If more than 1 videomode is found, will return
   * the videomode with the highest refresh rate
   */
9791d763d   Geert Uytterhoeven   [PATCH] fbdev mod...
828
829
  const struct fb_videomode *fb_find_best_mode(const struct fb_var_screeninfo *var,
  					     struct list_head *head)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
  {
  	struct list_head *pos;
  	struct fb_modelist *modelist;
  	struct fb_videomode *mode, *best = NULL;
  	u32 diff = -1;
  
  	list_for_each(pos, head) {
  		u32 d;
  
  		modelist = list_entry(pos, struct fb_modelist, list);
  		mode = &modelist->mode;
  
  		if (mode->xres >= var->xres && mode->yres >= var->yres) {
  			d = (mode->xres - var->xres) +
  				(mode->yres - var->yres);
  			if (diff > d) {
  				diff = d;
  				best = mode;
17cc6281c   Antonino A. Daplas   [PATCH] fbdev: Co...
848
849
850
  			} else if (diff == d && best &&
  				   mode->refresh > best->refresh)
  				best = mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
851
852
853
854
855
856
  		}
  	}
  	return best;
  }
  
  /**
8fb6567e3   Michal Januszewski   [PATCH] fbdev: fi...
857
   * fb_find_nearest_mode - find closest videomode
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
858
   *
8fb6567e3   Michal Januszewski   [PATCH] fbdev: fi...
859
   * @mode: pointer to struct fb_videomode
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
860
861
862
863
   * @head: pointer to modelist
   *
   * Finds best matching videomode, smaller or greater in dimension.
   * If more than 1 videomode is found, will return the videomode with
8fb6567e3   Michal Januszewski   [PATCH] fbdev: fi...
864
   * the closest refresh rate.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
865
   */
9791d763d   Geert Uytterhoeven   [PATCH] fbdev mod...
866
867
  const struct fb_videomode *fb_find_nearest_mode(const struct fb_videomode *mode,
  					        struct list_head *head)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
868
869
870
  {
  	struct list_head *pos;
  	struct fb_modelist *modelist;
8fb6567e3   Michal Januszewski   [PATCH] fbdev: fi...
871
  	struct fb_videomode *cmode, *best = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
872
873
874
875
876
877
  	u32 diff = -1, diff_refresh = -1;
  
  	list_for_each(pos, head) {
  		u32 d;
  
  		modelist = list_entry(pos, struct fb_modelist, list);
8fb6567e3   Michal Januszewski   [PATCH] fbdev: fi...
878
  		cmode = &modelist->mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
879

8fb6567e3   Michal Januszewski   [PATCH] fbdev: fi...
880
881
  		d = abs(cmode->xres - mode->xres) +
  			abs(cmode->yres - mode->yres);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
882
883
  		if (diff > d) {
  			diff = d;
e504b8480   Andrew Kephart   fbdev: Fix fb_fin...
884
  			diff_refresh = abs(cmode->refresh - mode->refresh);
8fb6567e3   Michal Januszewski   [PATCH] fbdev: fi...
885
  			best = cmode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
886
  		} else if (diff == d) {
8fb6567e3   Michal Januszewski   [PATCH] fbdev: fi...
887
  			d = abs(cmode->refresh - mode->refresh);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
888
889
  			if (diff_refresh > d) {
  				diff_refresh = d;
8fb6567e3   Michal Januszewski   [PATCH] fbdev: fi...
890
  				best = cmode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
  			}
  		}
  	}
  
  	return best;
  }
  
  /**
   * fb_match_mode - find a videomode which exactly matches the timings in var
   * @var: pointer to struct fb_var_screeninfo
   * @head: pointer to struct list_head of modelist
   *
   * RETURNS:
   * struct fb_videomode, NULL if none found
   */
9791d763d   Geert Uytterhoeven   [PATCH] fbdev mod...
906
907
  const struct fb_videomode *fb_match_mode(const struct fb_var_screeninfo *var,
  					 struct list_head *head)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
  {
  	struct list_head *pos;
  	struct fb_modelist *modelist;
  	struct fb_videomode *m, mode;
  
  	fb_var_to_videomode(&mode, var);
  	list_for_each(pos, head) {
  		modelist = list_entry(pos, struct fb_modelist, list);
  		m = &modelist->mode;
  		if (fb_mode_is_equal(m, &mode))
  			return m;
  	}
  	return NULL;
  }
  
  /**
a8b192543   Ben Hutchings   video: fix first ...
924
   * fb_add_videomode - adds videomode entry to modelist
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
925
926
927
928
929
930
   * @mode: videomode to add
   * @head: struct list_head of modelist
   *
   * NOTES:
   * Will only add unmatched mode entries
   */
9791d763d   Geert Uytterhoeven   [PATCH] fbdev mod...
931
  int fb_add_videomode(const struct fb_videomode *mode, struct list_head *head)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
  {
  	struct list_head *pos;
  	struct fb_modelist *modelist;
  	struct fb_videomode *m;
  	int found = 0;
  
  	list_for_each(pos, head) {
  		modelist = list_entry(pos, struct fb_modelist, list);
  		m = &modelist->mode;
  		if (fb_mode_is_equal(m, mode)) {
  			found = 1;
  			break;
  		}
  	}
  	if (!found) {
  		modelist = kmalloc(sizeof(struct fb_modelist),
  						  GFP_KERNEL);
  
  		if (!modelist)
  			return -ENOMEM;
  		modelist->mode = *mode;
  		list_add(&modelist->list, head);
  	}
  	return 0;
  }
  
  /**
a8b192543   Ben Hutchings   video: fix first ...
959
   * fb_delete_videomode - removed videomode entry from modelist
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
960
961
962
963
964
965
   * @mode: videomode to remove
   * @head: struct list_head of modelist
   *
   * NOTES:
   * Will remove all matching mode entries
   */
9791d763d   Geert Uytterhoeven   [PATCH] fbdev mod...
966
967
  void fb_delete_videomode(const struct fb_videomode *mode,
  			 struct list_head *head)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
  {
  	struct list_head *pos, *n;
  	struct fb_modelist *modelist;
  	struct fb_videomode *m;
  
  	list_for_each_safe(pos, n, head) {
  		modelist = list_entry(pos, struct fb_modelist, list);
  		m = &modelist->mode;
  		if (fb_mode_is_equal(m, mode)) {
  			list_del(pos);
  			kfree(pos);
  		}
  	}
  }
  
  /**
a8b192543   Ben Hutchings   video: fix first ...
984
   * fb_destroy_modelist - destroy modelist
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
985
986
987
988
989
990
991
992
993
994
995
   * @head: struct list_head of modelist
   */
  void fb_destroy_modelist(struct list_head *head)
  {
  	struct list_head *pos, *n;
  
  	list_for_each_safe(pos, n, head) {
  		list_del(pos);
  		kfree(pos);
  	}
  }
9953d236e   Michal Januszewski   fbdev: export fb_...
996
  EXPORT_SYMBOL_GPL(fb_destroy_modelist);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
997
998
  
  /**
a8b192543   Ben Hutchings   video: fix first ...
999
   * fb_videomode_to_modelist - convert mode array to mode list
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1000
1001
1002
1003
   * @modedb: array of struct fb_videomode
   * @num: number of entries in array
   * @head: struct list_head of modelist
   */
9791d763d   Geert Uytterhoeven   [PATCH] fbdev mod...
1004
  void fb_videomode_to_modelist(const struct fb_videomode *modedb, int num,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
  			      struct list_head *head)
  {
  	int i;
  
  	INIT_LIST_HEAD(head);
  
  	for (i = 0; i < num; i++) {
  		if (fb_add_videomode(&modedb[i], head))
  			return;
  	}
  }
9791d763d   Geert Uytterhoeven   [PATCH] fbdev mod...
1016
1017
  const struct fb_videomode *fb_find_best_display(const struct fb_monspecs *specs,
  					        struct list_head *head)
003cfc0c5   Antonino A. Daplas   [PATCH] fbdev: Ad...
1018
1019
1020
  {
  	struct list_head *pos;
  	struct fb_modelist *modelist;
9791d763d   Geert Uytterhoeven   [PATCH] fbdev mod...
1021
  	const struct fb_videomode *m, *m1 = NULL, *md = NULL, *best = NULL;
003cfc0c5   Antonino A. Daplas   [PATCH] fbdev: Ad...
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
  	int first = 0;
  
  	if (!head->prev || !head->next || list_empty(head))
  		goto finished;
  
  	/* get the first detailed mode and the very first mode */
  	list_for_each(pos, head) {
  		modelist = list_entry(pos, struct fb_modelist, list);
  		m = &modelist->mode;
  
  		if (!first) {
  			m1 = m;
  			first = 1;
  		}
  
  		if (m->flag & FB_MODE_IS_FIRST) {
   			md = m;
  			break;
  		}
  	}
  
  	/* first detailed timing is preferred */
  	if (specs->misc & FB_MISC_1ST_DETAIL) {
  		best = md;
  		goto finished;
  	}
  
  	/* find best mode based on display width and height */
  	if (specs->max_x && specs->max_y) {
  		struct fb_var_screeninfo var;
  
  		memset(&var, 0, sizeof(struct fb_var_screeninfo));
  		var.xres = (specs->max_x * 7200)/254;
  		var.yres = (specs->max_y * 7200)/254;
  		m = fb_find_best_mode(&var, head);
  		if (m) {
  			best = m;
  			goto finished;
  		}
  	}
  
  	/* use first detailed mode */
  	if (md) {
  		best = md;
  		goto finished;
  	}
  
  	/* last resort, use the very first mode */
  	best = m1;
  finished:
  	return best;
  }
  EXPORT_SYMBOL(fb_find_best_display);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1075
1076
1077
1078
  EXPORT_SYMBOL(fb_videomode_to_var);
  EXPORT_SYMBOL(fb_var_to_videomode);
  EXPORT_SYMBOL(fb_mode_is_equal);
  EXPORT_SYMBOL(fb_add_videomode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1079
1080
1081
1082
1083
  EXPORT_SYMBOL(fb_match_mode);
  EXPORT_SYMBOL(fb_find_best_mode);
  EXPORT_SYMBOL(fb_find_nearest_mode);
  EXPORT_SYMBOL(fb_videomode_to_modelist);
  EXPORT_SYMBOL(fb_find_mode);
1bae852fb   Tormod Volden   savagefb: Use pan...
1084
  EXPORT_SYMBOL(fb_find_mode_cvt);