diff options
-rw-r--r-- | drivers/video/geode/gxfb_core.c | 37 | ||||
-rw-r--r-- | drivers/video/geode/lxfb_core.c | 37 |
2 files changed, 67 insertions, 7 deletions
diff --git a/drivers/video/geode/gxfb_core.c b/drivers/video/geode/gxfb_core.c index f16c21d5bc21..de2b8f9876a5 100644 --- a/drivers/video/geode/gxfb_core.c +++ b/drivers/video/geode/gxfb_core.c | |||
@@ -41,7 +41,7 @@ static int vram; | |||
41 | static int vt_switch; | 41 | static int vt_switch; |
42 | 42 | ||
43 | /* Modes relevant to the GX (taken from modedb.c) */ | 43 | /* Modes relevant to the GX (taken from modedb.c) */ |
44 | static const struct fb_videomode gx_modedb[] __initdata = { | 44 | static struct fb_videomode gx_modedb[] __initdata = { |
45 | /* 640x480-60 VESA */ | 45 | /* 640x480-60 VESA */ |
46 | { NULL, 60, 640, 480, 39682, 48, 16, 33, 10, 96, 2, | 46 | { NULL, 60, 640, 480, 39682, 48, 16, 33, 10, 96, 2, |
47 | 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, | 47 | 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, |
@@ -108,6 +108,35 @@ static const struct fb_videomode gx_modedb[] __initdata = { | |||
108 | FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, | 108 | FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, |
109 | }; | 109 | }; |
110 | 110 | ||
111 | #ifdef CONFIG_OLPC | ||
112 | #include <asm/olpc.h> | ||
113 | |||
114 | static struct fb_videomode gx_dcon_modedb[] __initdata = { | ||
115 | /* The only mode the DCON has is 1200x900 */ | ||
116 | { NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3, | ||
117 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||
118 | FB_VMODE_NONINTERLACED, 0 } | ||
119 | }; | ||
120 | |||
121 | static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | ||
122 | { | ||
123 | if (olpc_has_dcon()) { | ||
124 | *modedb = (struct fb_videomode *) gx_dcon_modedb; | ||
125 | *size = ARRAY_SIZE(gx_dcon_modedb); | ||
126 | } else { | ||
127 | *modedb = (struct fb_videomode *) gx_modedb; | ||
128 | *size = ARRAY_SIZE(gx_modedb); | ||
129 | } | ||
130 | } | ||
131 | |||
132 | #else | ||
133 | static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | ||
134 | { | ||
135 | *modedb = (struct fb_videomode *) gx_modedb; | ||
136 | *size = ARRAY_SIZE(gx_modedb); | ||
137 | } | ||
138 | #endif | ||
139 | |||
111 | static int gxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | 140 | static int gxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) |
112 | { | 141 | { |
113 | if (var->xres > 1600 || var->yres > 1200) | 142 | if (var->xres > 1600 || var->yres > 1200) |
@@ -350,6 +379,9 @@ static int __init gxfb_probe(struct pci_dev *pdev, const struct pci_device_id *i | |||
350 | int ret; | 379 | int ret; |
351 | unsigned long val; | 380 | unsigned long val; |
352 | 381 | ||
382 | struct fb_videomode *modedb_ptr; | ||
383 | unsigned int modedb_size; | ||
384 | |||
353 | info = gxfb_init_fbinfo(&pdev->dev); | 385 | info = gxfb_init_fbinfo(&pdev->dev); |
354 | if (!info) | 386 | if (!info) |
355 | return -ENOMEM; | 387 | return -ENOMEM; |
@@ -369,8 +401,9 @@ static int __init gxfb_probe(struct pci_dev *pdev, const struct pci_device_id *i | |||
369 | else | 401 | else |
370 | par->enable_crt = 1; | 402 | par->enable_crt = 1; |
371 | 403 | ||
404 | get_modedb(&modedb_ptr, &modedb_size); | ||
372 | ret = fb_find_mode(&info->var, info, mode_option, | 405 | ret = fb_find_mode(&info->var, info, mode_option, |
373 | gx_modedb, ARRAY_SIZE(gx_modedb), NULL, 16); | 406 | modedb_ptr, modedb_size, NULL, 16); |
374 | if (ret == 0 || ret == 4) { | 407 | if (ret == 0 || ret == 4) { |
375 | dev_err(&pdev->dev, "could not find valid video mode\n"); | 408 | dev_err(&pdev->dev, "could not find valid video mode\n"); |
376 | ret = -EINVAL; | 409 | ret = -EINVAL; |
diff --git a/drivers/video/geode/lxfb_core.c b/drivers/video/geode/lxfb_core.c index 15150ed41cec..2cd9b74d2225 100644 --- a/drivers/video/geode/lxfb_core.c +++ b/drivers/video/geode/lxfb_core.c | |||
@@ -36,7 +36,7 @@ static int vt_switch; | |||
36 | * we try to make it something sane - 640x480-60 is sane | 36 | * we try to make it something sane - 640x480-60 is sane |
37 | */ | 37 | */ |
38 | 38 | ||
39 | static const struct fb_videomode geode_modedb[] __initdata = { | 39 | static struct fb_videomode geode_modedb[] __initdata = { |
40 | /* 640x480-60 */ | 40 | /* 640x480-60 */ |
41 | { NULL, 60, 640, 480, 39682, 48, 8, 25, 2, 88, 2, | 41 | { NULL, 60, 640, 480, 39682, 48, 8, 25, 2, 88, 2, |
42 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | 42 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, |
@@ -217,6 +217,35 @@ static const struct fb_videomode geode_modedb[] __initdata = { | |||
217 | 0, FB_VMODE_NONINTERLACED, 0 }, | 217 | 0, FB_VMODE_NONINTERLACED, 0 }, |
218 | }; | 218 | }; |
219 | 219 | ||
220 | #ifdef CONFIG_OLPC | ||
221 | #include <asm/olpc.h> | ||
222 | |||
223 | static struct fb_videomode olpc_dcon_modedb[] __initdata = { | ||
224 | /* The only mode the DCON has is 1200x900 */ | ||
225 | { NULL, 50, 1200, 900, 17460, 24, 8, 4, 5, 8, 3, | ||
226 | FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||
227 | FB_VMODE_NONINTERLACED, 0 } | ||
228 | }; | ||
229 | |||
230 | static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | ||
231 | { | ||
232 | if (olpc_has_dcon()) { | ||
233 | *modedb = (struct fb_videomode *) olpc_dcon_modedb; | ||
234 | *size = ARRAY_SIZE(olpc_dcon_modedb); | ||
235 | } else { | ||
236 | *modedb = (struct fb_videomode *) geode_modedb; | ||
237 | *size = ARRAY_SIZE(geode_modedb); | ||
238 | } | ||
239 | } | ||
240 | |||
241 | #else | ||
242 | static void __init get_modedb(struct fb_videomode **modedb, unsigned int *size) | ||
243 | { | ||
244 | *modedb = (struct fb_videomode *) geode_modedb; | ||
245 | *size = ARRAY_SIZE(geode_modedb); | ||
246 | } | ||
247 | #endif | ||
248 | |||
220 | static int lxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | 249 | static int lxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) |
221 | { | 250 | { |
222 | if (var->xres > 1920 || var->yres > 1440) | 251 | if (var->xres > 1920 || var->yres > 1440) |
@@ -477,7 +506,7 @@ static int __init lxfb_probe(struct pci_dev *pdev, | |||
477 | int ret; | 506 | int ret; |
478 | 507 | ||
479 | struct fb_videomode *modedb_ptr; | 508 | struct fb_videomode *modedb_ptr; |
480 | int modedb_size; | 509 | unsigned int modedb_size; |
481 | 510 | ||
482 | info = lxfb_init_fbinfo(&pdev->dev); | 511 | info = lxfb_init_fbinfo(&pdev->dev); |
483 | 512 | ||
@@ -502,9 +531,7 @@ static int __init lxfb_probe(struct pci_dev *pdev, | |||
502 | 531 | ||
503 | /* Set up the mode database */ | 532 | /* Set up the mode database */ |
504 | 533 | ||
505 | modedb_ptr = (struct fb_videomode *) geode_modedb; | 534 | get_modedb(&modedb_ptr, &modedb_size); |
506 | modedb_size = ARRAY_SIZE(geode_modedb); | ||
507 | |||
508 | ret = fb_find_mode(&info->var, info, mode_option, | 535 | ret = fb_find_mode(&info->var, info, mode_option, |
509 | modedb_ptr, modedb_size, NULL, 16); | 536 | modedb_ptr, modedb_size, NULL, 16); |
510 | 537 | ||