aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/modedb.c
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
commit8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch)
treea8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /drivers/video/modedb.c
parent406089d01562f1e2bf9f089fd7637009ebaad589 (diff)
Patched in Tegra support.
Diffstat (limited to 'drivers/video/modedb.c')
-rw-r--r--drivers/video/modedb.c1022
1 files changed, 738 insertions, 284 deletions
diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c
index a9a907c440d..34048e2b124 100644
--- a/drivers/video/modedb.c
+++ b/drivers/video/modedb.c
@@ -292,64 +292,524 @@ static const struct fb_videomode modedb[] = {
292}; 292};
293 293
294#ifdef CONFIG_FB_MODE_HELPERS 294#ifdef CONFIG_FB_MODE_HELPERS
295const struct fb_videomode cea_modes[64] = { 295const struct fb_videomode cea_modes[CEA_MODEDB_SIZE] = {
296 /* #1: 640x480p@59.94/60Hz */ 296 {},
297 [1] = { 297 /* 1: 640x480p @ 59.94Hz/60Hz */
298 NULL, 60, 640, 480, 39722, 48, 16, 33, 10, 96, 2, 0, 298 {.refresh = 59, .xres = 640, .yres = 480, .pixclock = 39721,
299 FB_VMODE_NONINTERLACED, 0, 299 .left_margin = 48, .right_margin = 16,
300 }, 300 .upper_margin = 33, .lower_margin = 1,
301 /* #3: 720x480p@59.94/60Hz */ 301 .hsync_len = 96, .vsync_len = 2,
302 [3] = { 302 .sync = 0,
303 NULL, 60, 720, 480, 37037, 60, 16, 30, 9, 62, 6, 0, 303 .flag = FB_FLAG_RATIO_4_3,
304 FB_VMODE_NONINTERLACED, 0, 304 .vmode = FB_VMODE_NONINTERLACED},
305 }, 305 /* 2: 720x480p @ 59.94Hz/60Hz */
306 /* #5: 1920x1080i@59.94/60Hz */ 306 {.refresh = 59, .xres = 720, .yres = 480, .pixclock = 37037,
307 [5] = { 307 .left_margin = 60, .right_margin = 16,
308 NULL, 60, 1920, 1080, 13763, 148, 88, 15, 2, 44, 5, 308 .upper_margin = 30, .lower_margin = 9,
309 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 309 .hsync_len = 62, .vsync_len = 6,
310 FB_VMODE_INTERLACED, 0, 310 .sync = 0,
311 }, 311 .flag = FB_FLAG_RATIO_4_3,
312 /* #7: 720(1440)x480iH@59.94/60Hz */ 312 .vmode = FB_VMODE_NONINTERLACED},
313 [7] = { 313 /* 3: 720x480p @ 59.94Hz/60Hz */
314 NULL, 60, 1440, 480, 18554/*37108*/, 114, 38, 15, 4, 124, 3, 0, 314 {.refresh = 59, .xres = 720, .yres = 480, .pixclock = 37037,
315 FB_VMODE_INTERLACED, 0, 315 .left_margin = 60, .right_margin = 16,
316 }, 316 .upper_margin = 30, .lower_margin = 9,
317 /* #9: 720(1440)x240pH@59.94/60Hz */ 317 .hsync_len = 62, .vsync_len = 6,
318 [9] = { 318 .sync = 0,
319 NULL, 60, 1440, 240, 18554, 114, 38, 16, 4, 124, 3, 0, 319 .flag = FB_FLAG_RATIO_16_9,
320 FB_VMODE_NONINTERLACED, 0, 320 .vmode = FB_VMODE_NONINTERLACED},
321 }, 321 /* 4: 1280x720p @ 59.94Hz/60Hz */
322 /* #18: 720x576pH@50Hz */ 322 {.refresh = 60, .xres = 1280, .yres = 720, .pixclock = 13468,
323 [18] = { 323 .left_margin = 220, .right_margin = 110,
324 NULL, 50, 720, 576, 37037, 68, 12, 39, 5, 64, 5, 0, 324 .upper_margin = 20, .lower_margin = 5,
325 FB_VMODE_NONINTERLACED, 0, 325 .hsync_len = 40, .vsync_len = 5,
326 }, 326 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
327 /* #19: 1280x720p@50Hz */ 327 .flag = FB_FLAG_RATIO_16_9,
328 [19] = { 328 .vmode = FB_VMODE_NONINTERLACED},
329 NULL, 50, 1280, 720, 13468, 220, 440, 20, 5, 40, 5, 329 /* 5: 1920x1080i @ 59.94Hz/60Hz */
330 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 330 {.refresh = 60, .xres = 1920, .yres = 1080, .pixclock = 13468,
331 FB_VMODE_NONINTERLACED, 0, 331 .left_margin = 148, .right_margin = 88,
332 }, 332 .upper_margin = 15, .lower_margin = 2,
333 /* #20: 1920x1080i@50Hz */ 333 .hsync_len = 44, .vsync_len = 5,
334 [20] = { 334 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
335 NULL, 50, 1920, 1080, 13480, 148, 528, 15, 5, 528, 5, 335 .flag = FB_FLAG_RATIO_16_9,
336 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 336 .vmode = FB_VMODE_INTERLACED},
337 FB_VMODE_INTERLACED, 0, 337 /* 6: 720(1440)x480i @ 59.94Hz/60Hz */
338 }, 338 {.refresh = 59, .xres = 1440, .yres = 480, .pixclock = 37037,
339 /* #32: 1920x1080p@23.98/24Hz */ 339 .left_margin = 114, .right_margin = 38,
340 [32] = { 340 .upper_margin = 15, .lower_margin = 4,
341 NULL, 24, 1920, 1080, 13468, 148, 638, 36, 4, 44, 5, 341 .hsync_len = 124, .vsync_len = 3,
342 FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 342 .sync = 0,
343 FB_VMODE_NONINTERLACED, 0, 343 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
344 }, 344 .vmode = FB_VMODE_INTERLACED},
345 /* #35: (2880)x480p4x@59.94/60Hz */ 345 /* 7: 720(1440)x480i @ 59.94Hz/60Hz */
346 [35] = { 346 {.refresh = 59, .xres = 1440, .yres = 480, .pixclock = 37037,
347 NULL, 60, 2880, 480, 9250, 240, 64, 30, 9, 248, 6, 0, 347 .left_margin = 114, .right_margin = 38,
348 FB_VMODE_NONINTERLACED, 0, 348 .upper_margin = 15, .lower_margin = 4,
349 }, 349 .hsync_len = 124, .vsync_len = 3,
350 .sync = 0,
351 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
352 .vmode = FB_VMODE_INTERLACED},
353 /* 8: 720(1440)x240p @ 59.94Hz/60Hz */
354 {.refresh = 59, .xres = 1440, .yres = 240, .pixclock = 37037,
355 .left_margin = 114, .right_margin = 38,
356 .upper_margin = 15, .lower_margin = 5,
357 .hsync_len = 124, .vsync_len = 3,
358 .sync = 0,
359 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
360 .vmode = FB_VMODE_NONINTERLACED},
361 /* 9: 720(1440)x240p @ 59.94Hz/60Hz */
362 {.refresh = 59, .xres = 1440, .yres = 240, .pixclock = 37037,
363 .left_margin = 114, .right_margin = 38,
364 .upper_margin = 15, .lower_margin = 5,
365 .hsync_len = 124, .vsync_len = 3,
366 .sync = 0,
367 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
368 .vmode = FB_VMODE_NONINTERLACED},
369 /* 10: 2880x480i @ 59.94Hz/60Hz */
370 {.refresh = 59, .xres = 2880, .yres = 480, .pixclock = 18518,
371 .left_margin = 228, .right_margin = 76,
372 .upper_margin = 15, .lower_margin = 4,
373 .hsync_len = 248, .vsync_len = 3,
374 .sync = 0,
375 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
376 .vmode = FB_VMODE_INTERLACED},
377 /* 11: 2880x480i @ 59.94Hz/60Hz */
378 {.refresh = 59, .xres = 2880, .yres = 480, .pixclock = 18518,
379 .left_margin = 228, .right_margin = 76,
380 .upper_margin = 15, .lower_margin = 4,
381 .hsync_len = 248, .vsync_len = 3,
382 .sync = 0,
383 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
384 .vmode = FB_VMODE_INTERLACED},
385 /* 12: 2880x240p @ 59.94Hz/60Hz */
386 {.refresh = 59, .xres = 2880, .yres = 240, .pixclock = 18518,
387 .left_margin = 228, .right_margin = 76,
388 .upper_margin = 15, .lower_margin = 5,
389 .hsync_len = 248, .vsync_len = 3,
390 .sync = 0,
391 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
392 .vmode = FB_VMODE_NONINTERLACED},
393 /* 13: 2880x240p @ 59.94Hz/60Hz */
394 {.refresh = 59, .xres = 2880, .yres = 240, .pixclock = 18518,
395 .left_margin = 228, .right_margin = 76,
396 .upper_margin = 15, .lower_margin = 5,
397 .hsync_len = 248, .vsync_len = 3,
398 .sync = 0,
399 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
400 .vmode = FB_VMODE_NONINTERLACED},
401 /* 14: 1440x480p @ 59.94Hz/60Hz */
402 {.refresh = 59, .xres = 1440, .yres = 480, .pixclock = 18518,
403 .left_margin = 120, .right_margin = 32,
404 .upper_margin = 30, .lower_margin = 9,
405 .hsync_len = 124, .vsync_len = 6,
406 .sync = 0,
407 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
408 .vmode = FB_VMODE_NONINTERLACED},
409 /* 15: 1440x480p @ 59.94Hz/60Hz */
410 {.refresh = 59, .xres = 1440, .yres = 480, .pixclock = 18518,
411 .left_margin = 120, .right_margin = 32,
412 .upper_margin = 30, .lower_margin = 9,
413 .hsync_len = 124, .vsync_len = 6,
414 .sync = 0,
415 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
416 .vmode = FB_VMODE_NONINTERLACED},
417 /* 16: 1920x1080p @ 59.94Hz/60Hz */
418 {.refresh = 60, .xres = 1920, .yres = 1080, .pixclock = 6734,
419 .left_margin = 148, .right_margin = 88,
420 .upper_margin = 36, .lower_margin = 4,
421 .hsync_len = 44, .vsync_len = 5,
422 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
423 .flag = FB_FLAG_RATIO_16_9,
424 .vmode = FB_VMODE_NONINTERLACED},
425 /* 17: 720x576p @ 50Hz */
426 {.refresh = 50, .xres = 720, .yres = 576, .pixclock = 37037,
427 .left_margin = 68, .right_margin = 12,
428 .upper_margin = 39, .lower_margin = 5,
429 .hsync_len = 64, .vsync_len = 5,
430 .sync = 0,
431 .flag = FB_FLAG_RATIO_4_3,
432 .vmode = FB_VMODE_NONINTERLACED},
433 /* 18: 720x576p @ 50Hz */
434 {.refresh = 50, .xres = 720, .yres = 576, .pixclock = 37037,
435 .left_margin = 68, .right_margin = 12,
436 .upper_margin = 39, .lower_margin = 5,
437 .hsync_len = 64, .vsync_len = 5,
438 .sync = 0,
439 .flag = FB_FLAG_RATIO_16_9,
440 .vmode = FB_VMODE_NONINTERLACED},
441 /* 19: 1280x720p @ 50Hz */
442 {.refresh = 50, .xres = 1280, .yres = 720, .pixclock = 13468,
443 .left_margin = 220, .right_margin = 440,
444 .upper_margin = 20, .lower_margin = 5,
445 .hsync_len = 40, .vsync_len = 5,
446 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
447 .flag = FB_FLAG_RATIO_16_9,
448 .vmode = FB_VMODE_NONINTERLACED},
449 /* 20: 1920x1080i @ 50Hz */
450 {.refresh = 50, .xres = 1920, .yres = 1080, .pixclock = 13468,
451 .left_margin = 148, .right_margin = 528,
452 .upper_margin = 15, .lower_margin = 2,
453 .hsync_len = 44, .vsync_len = 5,
454 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
455 .flag = FB_FLAG_RATIO_16_9,
456 .vmode = FB_VMODE_INTERLACED},
457 /* 21: 720(1440)x576i @ 50Hz */
458 {.refresh = 50, .xres = 1440, .yres = 576, .pixclock = 37037,
459 .left_margin = 138, .right_margin = 24,
460 .upper_margin = 19, .lower_margin = 2,
461 .hsync_len = 126, .vsync_len = 3,
462 .sync = 0,
463 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
464 .vmode = FB_VMODE_INTERLACED},
465 /* 22: 720(1440)x576i @ 50Hz */
466 {.refresh = 50, .xres = 1440, .yres = 576, .pixclock = 37037,
467 .left_margin = 138, .right_margin = 24,
468 .upper_margin = 19, .lower_margin = 2,
469 .hsync_len = 126, .vsync_len = 3,
470 .sync = 0,
471 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
472 .vmode = FB_VMODE_INTERLACED},
473 /* 23: 720(1440)x288p @ 50Hz */
474 {.refresh = 49, .xres = 1440, .yres = 288, .pixclock = 37037,
475 .left_margin = 138, .right_margin = 24,
476 .upper_margin = 19, .lower_margin = 4,
477 .hsync_len = 126, .vsync_len = 3,
478 .sync = 0,
479 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
480 .vmode = FB_VMODE_NONINTERLACED},
481 /* 24: 720(1440)x288p @ 50Hz */
482 {.refresh = 49, .xres = 1440, .yres = 288, .pixclock = 37037,
483 .left_margin = 138, .right_margin = 24,
484 .upper_margin = 19, .lower_margin = 4,
485 .hsync_len = 126, .vsync_len = 3,
486 .sync = 0,
487 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
488 .vmode = FB_VMODE_NONINTERLACED},
489 /* 25: 2880x576i @ 50Hz */
490 {.refresh = 50, .xres = 2880, .yres = 576, .pixclock = 18518,
491 .left_margin = 276, .right_margin = 48,
492 .upper_margin = 19, .lower_margin = 2,
493 .hsync_len = 252, .vsync_len = 3,
494 .sync = 0,
495 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
496 .vmode = FB_VMODE_INTERLACED},
497 /* 26: 2880x576i @ 50Hz */
498 {.refresh = 50, .xres = 2880, .yres = 576, .pixclock = 18518,
499 .left_margin = 276, .right_margin = 48,
500 .upper_margin = 19, .lower_margin = 2,
501 .hsync_len = 252, .vsync_len = 3,
502 .sync = 0,
503 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
504 .vmode = FB_VMODE_INTERLACED},
505 /* 27: 2880x288p @ 50Hz */
506 {.refresh = 49, .xres = 2880, .yres = 288, .pixclock = 18518,
507 .left_margin = 276, .right_margin = 48,
508 .upper_margin = 19, .lower_margin = 4,
509 .hsync_len = 252, .vsync_len = 3,
510 .sync = 0,
511 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
512 .vmode = FB_VMODE_NONINTERLACED},
513 /* 28: 2880x288p @ 50Hz */
514 {.refresh = 49, .xres = 2880, .yres = 288, .pixclock = 18518,
515 .left_margin = 276, .right_margin = 48,
516 .upper_margin = 19, .lower_margin = 4,
517 .hsync_len = 252, .vsync_len = 3,
518 .sync = 0,
519 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
520 .vmode = FB_VMODE_NONINTERLACED},
521 /* 29: 1440x576p @ 50Hz */
522 {.refresh = 50, .xres = 1440, .yres = 576, .pixclock = 18518,
523 .left_margin = 136, .right_margin = 24,
524 .upper_margin = 39, .lower_margin = 5,
525 .hsync_len = 128, .vsync_len = 5,
526 .sync = 0,
527 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
528 .vmode = FB_VMODE_NONINTERLACED},
529 /* 30: 1440x576p @ 50Hz */
530 {.refresh = 50, .xres = 1440, .yres = 576, .pixclock = 18518,
531 .left_margin = 136, .right_margin = 24,
532 .upper_margin = 39, .lower_margin = 5,
533 .hsync_len = 128, .vsync_len = 5,
534 .sync = 0,
535 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
536 .vmode = FB_VMODE_NONINTERLACED},
537 /* 31: 1920x1080p @ 50Hz */
538 {.refresh = 50, .xres = 1920, .yres = 1080, .pixclock = 6734,
539 .left_margin = 148, .right_margin = 528,
540 .upper_margin = 36, .lower_margin = 4,
541 .hsync_len = 44, .vsync_len = 5,
542 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
543 .flag = FB_FLAG_RATIO_16_9,
544 .vmode = FB_VMODE_NONINTERLACED},
545 /* 32: 1920x1080p @ 23.97Hz/24Hz */
546 {.refresh = 24, .xres = 1920, .yres = 1080, .pixclock = 13468,
547 .left_margin = 148, .right_margin = 638,
548 .upper_margin = 36, .lower_margin = 4,
549 .hsync_len = 44, .vsync_len = 5,
550 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
551 .flag = FB_FLAG_RATIO_16_9,
552 .vmode = FB_VMODE_NONINTERLACED},
553 /* 33: 1920x1080p @ 25Hz */
554 {.refresh = 25, .xres = 1920, .yres = 1080, .pixclock = 13468,
555 .left_margin = 148, .right_margin = 528,
556 .upper_margin = 36, .lower_margin = 4,
557 .hsync_len = 44, .vsync_len = 5,
558 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
559 .flag = FB_FLAG_RATIO_16_9,
560 .vmode = FB_VMODE_NONINTERLACED},
561 /* 34: 1920x1080p @ 29.97Hz/30Hz */
562 {.refresh = 30, .xres = 1920, .yres = 1080, .pixclock = 13468,
563 .left_margin = 148, .right_margin = 88,
564 .upper_margin = 36, .lower_margin = 4,
565 .hsync_len = 44, .vsync_len = 5,
566 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
567 .flag = FB_FLAG_RATIO_16_9,
568 .vmode = FB_VMODE_NONINTERLACED},
569 /* 35: 2880x480p @ 59.94Hz/60Hz */
570 {.refresh = 59, .xres = 2880, .yres = 480, .pixclock = 9259,
571 .left_margin = 240, .right_margin = 64,
572 .upper_margin = 30, .lower_margin = 9,
573 .hsync_len = 248, .vsync_len = 6,
574 .sync = 0,
575 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
576 .vmode = FB_VMODE_NONINTERLACED},
577 /* 36: 2880x480p @ 59.94Hz/60Hz */
578 {.refresh = 59, .xres = 2880, .yres = 480, .pixclock = 9259,
579 .left_margin = 240, .right_margin = 64,
580 .upper_margin = 30, .lower_margin = 9,
581 .hsync_len = 248, .vsync_len = 6,
582 .sync = 0,
583 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
584 .vmode = FB_VMODE_NONINTERLACED},
585 /* 37: 2880x576p @ 50Hz */
586 {.refresh = 50, .xres = 2880, .yres = 576, .pixclock = 9259,
587 .left_margin = 272, .right_margin = 48,
588 .upper_margin = 39, .lower_margin = 5,
589 .hsync_len = 256, .vsync_len = 5,
590 .sync = 0,
591 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
592 .vmode = FB_VMODE_NONINTERLACED},
593 /* 38: 2880x576p @ 50Hz */
594 {.refresh = 50, .xres = 2880, .yres = 576, .pixclock = 9259,
595 .left_margin = 272, .right_margin = 48,
596 .upper_margin = 39, .lower_margin = 5,
597 .hsync_len = 256, .vsync_len = 5,
598 .sync = 0,
599 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
600 .vmode = FB_VMODE_NONINTERLACED},
601 /* 39: 1920x1080i @ 50Hz */
602 {.refresh = 50, .xres = 1920, .yres = 1080, .pixclock = 13888,
603 .left_margin = 184, .right_margin = 32,
604 .upper_margin = 57, .lower_margin = 2,
605 .hsync_len = 168, .vsync_len = 5,
606 .sync = FB_SYNC_HOR_HIGH_ACT,
607 .flag = FB_FLAG_RATIO_16_9,
608 .vmode = FB_VMODE_INTERLACED},
609 /* 40: 1920x1080i @ 100Hz */
610 {.refresh = 100, .xres = 1920, .yres = 1080, .pixclock = 6734,
611 .left_margin = 148, .right_margin = 528,
612 .upper_margin = 15, .lower_margin = 2,
613 .hsync_len = 44, .vsync_len = 5,
614 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
615 .flag = FB_FLAG_RATIO_16_9,
616 .vmode = FB_VMODE_INTERLACED},
617 /* 41: 1280x720p @ 100Hz */
618 {.refresh = 100, .xres = 1280, .yres = 720, .pixclock = 6734,
619 .left_margin = 220, .right_margin = 440,
620 .upper_margin = 20, .lower_margin = 5,
621 .hsync_len = 40, .vsync_len = 5,
622 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
623 .flag = FB_FLAG_RATIO_16_9,
624 .vmode = FB_VMODE_NONINTERLACED},
625 /* 42: 720x576p @ 100Hz */
626 {.refresh = 100, .xres = 720, .yres = 576, .pixclock = 18518,
627 .left_margin = 68, .right_margin = 12,
628 .upper_margin = 39, .lower_margin = 5,
629 .hsync_len = 64, .vsync_len = 5,
630 .sync = 0,
631 .flag = FB_FLAG_RATIO_4_3,
632 .vmode = FB_VMODE_NONINTERLACED},
633 /* 43: 720x576p @ 100Hz */
634 {.refresh = 100, .xres = 720, .yres = 576, .pixclock = 18518,
635 .left_margin = 68, .right_margin = 12,
636 .upper_margin = 39, .lower_margin = 5,
637 .hsync_len = 64, .vsync_len = 5,
638 .sync = 0,
639 .flag = FB_FLAG_RATIO_16_9,
640 .vmode = FB_VMODE_NONINTERLACED},
641 /* 44: 720(1440)x576i @ 100Hz */
642 {.refresh = 100, .xres = 1440, .yres = 576, .pixclock = 18518,
643 .left_margin = 138, .right_margin = 24,
644 .upper_margin = 19, .lower_margin = 2,
645 .hsync_len = 126, .vsync_len = 3,
646 .sync = 0,
647 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
648 .vmode = FB_VMODE_INTERLACED},
649 /* 45: 720(1440)x576i @ 100Hz */
650 {.refresh = 100, .xres = 1440, .yres = 576, .pixclock = 18518,
651 .left_margin = 138, .right_margin = 24,
652 .upper_margin = 19, .lower_margin = 2,
653 .hsync_len = 126, .vsync_len = 3,
654 .sync = 0,
655 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
656 .vmode = FB_VMODE_INTERLACED},
657 /* 46: 1920x1080i @ 119.88/120Hz */
658 {.refresh = 120, .xres = 1920, .yres = 1080, .pixclock = 6734,
659 .left_margin = 148, .right_margin = 88,
660 .upper_margin = 15, .lower_margin = 2,
661 .hsync_len = 44, .vsync_len = 5,
662 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
663 .flag = FB_FLAG_RATIO_16_9,
664 .vmode = FB_VMODE_INTERLACED},
665 /* 47: 1280x720p @ 119.88/120Hz */
666 {.refresh = 120, .xres = 1280, .yres = 720, .pixclock = 6734,
667 .left_margin = 220, .right_margin = 110,
668 .upper_margin = 20, .lower_margin = 5,
669 .hsync_len = 40, .vsync_len = 5,
670 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
671 .flag = FB_FLAG_RATIO_16_9,
672 .vmode = FB_VMODE_NONINTERLACED},
673 /* 48: 720x480p @ 119.88/120Hz */
674 {.refresh = 119, .xres = 720, .yres = 480, .pixclock = 18518,
675 .left_margin = 60, .right_margin = 16,
676 .upper_margin = 30, .lower_margin = 9,
677 .hsync_len = 62, .vsync_len = 6,
678 .sync = 0,
679 .flag = FB_FLAG_RATIO_4_3,
680 .vmode = FB_VMODE_NONINTERLACED},
681 /* 49: 720x480p @ 119.88/120Hz */
682 {.refresh = 119, .xres = 720, .yres = 480, .pixclock = 18518,
683 .left_margin = 60, .right_margin = 16,
684 .upper_margin = 30, .lower_margin = 9,
685 .hsync_len = 62, .vsync_len = 6,
686 .sync = 0,
687 .flag = FB_FLAG_RATIO_16_9,
688 .vmode = FB_VMODE_NONINTERLACED},
689 /* 50: 720(1440)x480i @ 119.88/120Hz */
690 {.refresh = 119, .xres = 1440, .yres = 480, .pixclock = 18518,
691 .left_margin = 114, .right_margin = 38,
692 .upper_margin = 15, .lower_margin = 4,
693 .hsync_len = 124, .vsync_len = 3,
694 .sync = 0,
695 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
696 .vmode = FB_VMODE_INTERLACED},
697 /* 51: 720(1440)x480i @ 119.88/120Hz */
698 {.refresh = 119, .xres = 1440, .yres = 480, .pixclock = 18518,
699 .left_margin = 114, .right_margin = 38,
700 .upper_margin = 15, .lower_margin = 4,
701 .hsync_len = 124, .vsync_len = 3,
702 .sync = 0,
703 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
704 .vmode = FB_VMODE_INTERLACED},
705 /* 52: 720x576p @ 200Hz */
706 {.refresh = 200, .xres = 720, .yres = 576, .pixclock = 9259,
707 .left_margin = 68, .right_margin = 12,
708 .upper_margin = 39, .lower_margin = 5,
709 .hsync_len = 64, .vsync_len = 5,
710 .sync = 0,
711 .flag = FB_FLAG_RATIO_4_3,
712 .vmode = FB_VMODE_NONINTERLACED},
713 /* 53: 720x576p @ 200Hz */
714 {.refresh = 200, .xres = 720, .yres = 576, .pixclock = 9259,
715 .left_margin = 68, .right_margin = 12,
716 .upper_margin = 39, .lower_margin = 5,
717 .hsync_len = 64, .vsync_len = 5,
718 .sync = 0,
719 .flag = FB_FLAG_RATIO_16_9,
720 .vmode = FB_VMODE_NONINTERLACED},
721 /* 54: 720(1440)x576i @ 200Hz */
722 {.refresh = 200, .xres = 1440, .yres = 576, .pixclock = 9259,
723 .left_margin = 138, .right_margin = 24,
724 .upper_margin = 19, .lower_margin = 2,
725 .hsync_len = 126, .vsync_len = 3,
726 .sync = 0,
727 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
728 .vmode = FB_VMODE_INTERLACED},
729 /* 55: 720(1440)x576i @ 200Hz */
730 {.refresh = 200, .xres = 1440, .yres = 576, .pixclock = 9259,
731 .left_margin = 138, .right_margin = 24,
732 .upper_margin = 19, .lower_margin = 2,
733 .hsync_len = 126, .vsync_len = 3,
734 .sync = 0,
735 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
736 .vmode = FB_VMODE_INTERLACED},
737 /* 56: 720x480p @ 239.76/240Hz */
738 {.refresh = 239, .xres = 720, .yres = 480, .pixclock = 9259,
739 .left_margin = 60, .right_margin = 16,
740 .upper_margin = 30, .lower_margin = 9,
741 .hsync_len = 62, .vsync_len = 6,
742 .sync = 0,
743 .flag = FB_FLAG_RATIO_4_3,
744 .vmode = FB_VMODE_NONINTERLACED},
745 /* 57: 720x480p @ 239.76/240Hz */
746 {.refresh = 239, .xres = 720, .yres = 480, .pixclock = 9259,
747 .left_margin = 60, .right_margin = 16,
748 .upper_margin = 30, .lower_margin = 9,
749 .hsync_len = 62, .vsync_len = 6,
750 .sync = 0,
751 .flag = FB_FLAG_RATIO_16_9,
752 .vmode = FB_VMODE_NONINTERLACED},
753 /* 58: 720(1440)x480i @ 239.76/240Hz */
754 {.refresh = 239, .xres = 1440, .yres = 480, .pixclock = 9259,
755 .left_margin = 114, .right_margin = 38,
756 .upper_margin = 15, .lower_margin = 4,
757 .hsync_len = 124, .vsync_len = 3,
758 .sync = 0,
759 .flag = FB_FLAG_RATIO_4_3 | FB_FLAG_PIXEL_REPEAT,
760 .vmode = FB_VMODE_INTERLACED},
761 /* 59: 720(1440)x480i @ 239.76/240Hz */
762 {.refresh = 239, .xres = 1440, .yres = 480, .pixclock = 9259,
763 .left_margin = 114, .right_margin = 38,
764 .upper_margin = 15, .lower_margin = 4,
765 .hsync_len = 124, .vsync_len = 3,
766 .sync = 0,
767 .flag = FB_FLAG_RATIO_16_9 | FB_FLAG_PIXEL_REPEAT,
768 .vmode = FB_VMODE_INTERLACED},
769 /* 60: 1280x720p @ 23.97Hz/24Hz */
770 {.refresh = 24, .xres = 1280, .yres = 720, .pixclock = 16835,
771 .left_margin = 220, .right_margin = 1760,
772 .upper_margin = 20, .lower_margin = 5,
773 .hsync_len = 40, .vsync_len = 5,
774 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
775 .flag = FB_FLAG_RATIO_16_9,
776 .vmode = FB_VMODE_NONINTERLACED},
777 /* 61: 1280x720p @ 25Hz */
778 {.refresh = 25, .xres = 1280, .yres = 720, .pixclock = 13468,
779 .left_margin = 220, .right_margin = 2420,
780 .upper_margin = 20, .lower_margin = 5,
781 .hsync_len = 40, .vsync_len = 5,
782 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
783 .flag = FB_FLAG_RATIO_16_9,
784 .vmode = FB_VMODE_NONINTERLACED},
785 /* 62: 1280x720p @ 29.97Hz/30Hz */
786 {.refresh = 30, .xres = 1280, .yres = 720, .pixclock = 13468,
787 .left_margin = 220, .right_margin = 1760,
788 .upper_margin = 20, .lower_margin = 5,
789 .hsync_len = 40, .vsync_len = 5,
790 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
791 .flag = FB_FLAG_RATIO_16_9,
792 .vmode = FB_VMODE_NONINTERLACED},
793 /* 63: 1920x1080p @ 119.88/120Hz */
794 {.refresh = 120, .xres = 1920, .yres = 1080, .pixclock = 3367,
795 .left_margin = 148, .right_margin = 88,
796 .upper_margin = 36, .lower_margin = 4,
797 .hsync_len = 44, .vsync_len = 5,
798 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
799 .flag = FB_FLAG_RATIO_16_9,
800 .vmode = FB_VMODE_NONINTERLACED},
801 /* 64: 1920x1080p @ 100Hz */
802 {.refresh = 100, .xres = 1920, .yres = 1080, .pixclock = 3367,
803 .left_margin = 148, .right_margin = 528,
804 .upper_margin = 36, .lower_margin = 4,
805 .hsync_len = 44, .vsync_len = 5,
806 .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
807 .flag = FB_FLAG_RATIO_16_9,
808 .vmode = FB_VMODE_NONINTERLACED},
350}; 809};
810EXPORT_SYMBOL(cea_modes);
351 811
352const struct fb_videomode vesa_modes[] = { 812const struct fb_videomode vesa_modes[VESA_MODEDB_SIZE] = {
353 /* 0 640x350-85 VESA */ 813 /* 0 640x350-85 VESA */
354 { NULL, 85, 640, 350, 31746, 96, 32, 60, 32, 64, 3, 814 { NULL, 85, 640, 350, 31746, 96, 32, 60, 32, 64, 3,
355 FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA}, 815 FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA},
@@ -491,56 +951,55 @@ EXPORT_SYMBOL(vesa_modes);
491static int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info, 951static int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info,
492 const struct fb_videomode *mode, unsigned int bpp) 952 const struct fb_videomode *mode, unsigned int bpp)
493{ 953{
494 int err = 0; 954 int err = 0;
495 955
496 DPRINTK("Trying mode %s %dx%d-%d@%d\n", 956 DPRINTK("Trying mode %s %dx%d-%d@%d\n", mode->name ? mode->name : "noname",
497 mode->name ? mode->name : "noname", 957 mode->xres, mode->yres, bpp, mode->refresh);
498 mode->xres, mode->yres, bpp, mode->refresh); 958 var->xres = mode->xres;
499 var->xres = mode->xres; 959 var->yres = mode->yres;
500 var->yres = mode->yres; 960 var->xres_virtual = mode->xres;
501 var->xres_virtual = mode->xres; 961 var->yres_virtual = mode->yres;
502 var->yres_virtual = mode->yres; 962 var->xoffset = 0;
503 var->xoffset = 0; 963 var->yoffset = 0;
504 var->yoffset = 0; 964 var->bits_per_pixel = bpp;
505 var->bits_per_pixel = bpp; 965 var->activate |= FB_ACTIVATE_TEST;
506 var->activate |= FB_ACTIVATE_TEST; 966 var->pixclock = mode->pixclock;
507 var->pixclock = mode->pixclock; 967 var->left_margin = mode->left_margin;
508 var->left_margin = mode->left_margin; 968 var->right_margin = mode->right_margin;
509 var->right_margin = mode->right_margin; 969 var->upper_margin = mode->upper_margin;
510 var->upper_margin = mode->upper_margin; 970 var->lower_margin = mode->lower_margin;
511 var->lower_margin = mode->lower_margin; 971 var->hsync_len = mode->hsync_len;
512 var->hsync_len = mode->hsync_len; 972 var->vsync_len = mode->vsync_len;
513 var->vsync_len = mode->vsync_len; 973 var->sync = mode->sync;
514 var->sync = mode->sync; 974 var->vmode = mode->vmode;
515 var->vmode = mode->vmode; 975 if (info->fbops->fb_check_var)
516 if (info->fbops->fb_check_var) 976 err = info->fbops->fb_check_var(var, info);
517 err = info->fbops->fb_check_var(var, info); 977 var->activate &= ~FB_ACTIVATE_TEST;
518 var->activate &= ~FB_ACTIVATE_TEST; 978 return err;
519 return err;
520} 979}
521 980
522/** 981/**
523 * fb_find_mode - finds a valid video mode 982 * fb_find_mode - finds a valid video mode
524 * @var: frame buffer user defined part of display 983 * @var: frame buffer user defined part of display
525 * @info: frame buffer info structure 984 * @info: frame buffer info structure
526 * @mode_option: string video mode to find 985 * @mode_option: string video mode to find
527 * @db: video mode database 986 * @db: video mode database
528 * @dbsize: size of @db 987 * @dbsize: size of @db
529 * @default_mode: default video mode to fall back to 988 * @default_mode: default video mode to fall back to
530 * @default_bpp: default color depth in bits per pixel 989 * @default_bpp: default color depth in bits per pixel
531 * 990 *
532 * Finds a suitable video mode, starting with the specified mode 991 * Finds a suitable video mode, starting with the specified mode
533 * in @mode_option with fallback to @default_mode. If 992 * in @mode_option with fallback to @default_mode. If
534 * @default_mode fails, all modes in the video mode database will 993 * @default_mode fails, all modes in the video mode database will
535 * be tried. 994 * be tried.
536 * 995 *
537 * Valid mode specifiers for @mode_option: 996 * Valid mode specifiers for @mode_option:
538 * 997 *
539 * <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m] or 998 * <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m] or
540 * <name>[-<bpp>][@<refresh>] 999 * <name>[-<bpp>][@<refresh>]
541 * 1000 *
542 * with <xres>, <yres>, <bpp> and <refresh> decimal numbers and 1001 * with <xres>, <yres>, <bpp> and <refresh> decimal numbers and
543 * <name> a string. 1002 * <name> a string.
544 * 1003 *
545 * If 'M' is present after yres (and before refresh/bpp if present), 1004 * If 'M' is present after yres (and before refresh/bpp if present),
546 * the function will compute the timings using VESA(tm) Coordinated 1005 * the function will compute the timings using VESA(tm) Coordinated
@@ -552,12 +1011,12 @@ static int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info,
552 * 1011 *
553 * 1024x768MR-8@60m - Reduced blank with margins at 60Hz. 1012 * 1024x768MR-8@60m - Reduced blank with margins at 60Hz.
554 * 1013 *
555 * NOTE: The passed struct @var is _not_ cleared! This allows you 1014 * NOTE: The passed struct @var is _not_ cleared! This allows you
556 * to supply values for e.g. the grayscale and accel_flags fields. 1015 * to supply values for e.g. the grayscale and accel_flags fields.
557 * 1016 *
558 * Returns zero for failure, 1 if using specified @mode_option, 1017 * Returns zero for failure, 1 if using specified @mode_option,
559 * 2 if using specified @mode_option with an ignored refresh rate, 1018 * 2 if using specified @mode_option with an ignored refresh rate,
560 * 3 if default mode is used, 4 if fall back to any valid mode. 1019 * 3 if default mode is used, 4 if fall back to any valid mode.
561 * 1020 *
562 */ 1021 */
563 1022
@@ -567,203 +1026,198 @@ int fb_find_mode(struct fb_var_screeninfo *var,
567 const struct fb_videomode *default_mode, 1026 const struct fb_videomode *default_mode,
568 unsigned int default_bpp) 1027 unsigned int default_bpp)
569{ 1028{
570 int i; 1029 int i;
571 1030
572 /* Set up defaults */ 1031 /* Set up defaults */
573 if (!db) { 1032 if (!db) {
574 db = modedb; 1033 db = modedb;
575 dbsize = ARRAY_SIZE(modedb); 1034 dbsize = ARRAY_SIZE(modedb);
1035 }
1036
1037 if (!default_mode)
1038 default_mode = &db[0];
1039
1040 if (!default_bpp)
1041 default_bpp = 8;
1042
1043 /* Did the user specify a video mode? */
1044 if (!mode_option)
1045 mode_option = fb_mode_option;
1046 if (mode_option) {
1047 const char *name = mode_option;
1048 unsigned int namelen = strlen(name);
1049 int res_specified = 0, bpp_specified = 0, refresh_specified = 0;
1050 unsigned int xres = 0, yres = 0, bpp = default_bpp, refresh = 0;
1051 int yres_specified = 0, cvt = 0, rb = 0, interlace = 0, margins = 0;
1052 u32 best, diff, tdiff;
1053
1054 for (i = namelen-1; i >= 0; i--) {
1055 switch (name[i]) {
1056 case '@':
1057 namelen = i;
1058 if (!refresh_specified && !bpp_specified &&
1059 !yres_specified) {
1060 refresh = simple_strtol(&name[i+1], NULL, 10);
1061 refresh_specified = 1;
1062 if (cvt || rb)
1063 cvt = 0;
1064 } else
1065 goto done;
1066 break;
1067 case '-':
1068 namelen = i;
1069 if (!bpp_specified && !yres_specified) {
1070 bpp = simple_strtol(&name[i+1], NULL, 10);
1071 bpp_specified = 1;
1072 if (cvt || rb)
1073 cvt = 0;
1074 } else
1075 goto done;
1076 break;
1077 case 'x':
1078 if (!yres_specified) {
1079 yres = simple_strtol(&name[i+1], NULL, 10);
1080 yres_specified = 1;
1081 } else
1082 goto done;
1083 break;
1084 case '0' ... '9':
1085 break;
1086 case 'M':
1087 if (!yres_specified)
1088 cvt = 1;
1089 break;
1090 case 'R':
1091 if (!cvt)
1092 rb = 1;
1093 break;
1094 case 'm':
1095 if (!cvt)
1096 margins = 1;
1097 break;
1098 case 'i':
1099 if (!cvt)
1100 interlace = 1;
1101 break;
1102 default:
1103 goto done;
1104 }
1105 }
1106 if (i < 0 && yres_specified) {
1107 xres = simple_strtol(name, NULL, 10);
1108 res_specified = 1;
576 } 1109 }
577
578 if (!default_mode)
579 default_mode = &db[0];
580
581 if (!default_bpp)
582 default_bpp = 8;
583
584 /* Did the user specify a video mode? */
585 if (!mode_option)
586 mode_option = fb_mode_option;
587 if (mode_option) {
588 const char *name = mode_option;
589 unsigned int namelen = strlen(name);
590 int res_specified = 0, bpp_specified = 0, refresh_specified = 0;
591 unsigned int xres = 0, yres = 0, bpp = default_bpp, refresh = 0;
592 int yres_specified = 0, cvt = 0, rb = 0, interlace = 0;
593 int margins = 0;
594 u32 best, diff, tdiff;
595
596 for (i = namelen-1; i >= 0; i--) {
597 switch (name[i]) {
598 case '@':
599 namelen = i;
600 if (!refresh_specified && !bpp_specified &&
601 !yres_specified) {
602 refresh = simple_strtol(&name[i+1], NULL,
603 10);
604 refresh_specified = 1;
605 if (cvt || rb)
606 cvt = 0;
607 } else
608 goto done;
609 break;
610 case '-':
611 namelen = i;
612 if (!bpp_specified && !yres_specified) {
613 bpp = simple_strtol(&name[i+1], NULL,
614 10);
615 bpp_specified = 1;
616 if (cvt || rb)
617 cvt = 0;
618 } else
619 goto done;
620 break;
621 case 'x':
622 if (!yres_specified) {
623 yres = simple_strtol(&name[i+1], NULL,
624 10);
625 yres_specified = 1;
626 } else
627 goto done;
628 break;
629 case '0' ... '9':
630 break;
631 case 'M':
632 if (!yres_specified)
633 cvt = 1;
634 break;
635 case 'R':
636 if (!cvt)
637 rb = 1;
638 break;
639 case 'm':
640 if (!cvt)
641 margins = 1;
642 break;
643 case 'i':
644 if (!cvt)
645 interlace = 1;
646 break;
647 default:
648 goto done;
649 }
650 }
651 if (i < 0 && yres_specified) {
652 xres = simple_strtol(name, NULL, 10);
653 res_specified = 1;
654 }
655done: 1110done:
656 if (cvt) { 1111 if (cvt) {
657 struct fb_videomode cvt_mode; 1112 struct fb_videomode cvt_mode;
658 int ret; 1113 int ret;
659
660 DPRINTK("CVT mode %dx%d@%dHz%s%s%s\n", xres, yres,
661 (refresh) ? refresh : 60,
662 (rb) ? " reduced blanking" : "",
663 (margins) ? " with margins" : "",
664 (interlace) ? " interlaced" : "");
665
666 memset(&cvt_mode, 0, sizeof(cvt_mode));
667 cvt_mode.xres = xres;
668 cvt_mode.yres = yres;
669 cvt_mode.refresh = (refresh) ? refresh : 60;
670
671 if (interlace)
672 cvt_mode.vmode |= FB_VMODE_INTERLACED;
673 else
674 cvt_mode.vmode &= ~FB_VMODE_INTERLACED;
675
676 ret = fb_find_mode_cvt(&cvt_mode, margins, rb);
677
678 if (!ret && !fb_try_mode(var, info, &cvt_mode, bpp)) {
679 DPRINTK("modedb CVT: CVT mode ok\n");
680 return 1;
681 }
682 1114
683 DPRINTK("CVT mode invalid, getting mode from database\n"); 1115 DPRINTK("CVT mode %dx%d@%dHz%s%s%s\n", xres, yres,
684 } 1116 (refresh) ? refresh : 60, (rb) ? " reduced blanking" :
1117 "", (margins) ? " with margins" : "", (interlace) ?
1118 " interlaced" : "");
685 1119
686 DPRINTK("Trying specified video mode%s %ix%i\n", 1120 memset(&cvt_mode, 0, sizeof(cvt_mode));
687 refresh_specified ? "" : " (ignoring refresh rate)", 1121 cvt_mode.xres = xres;
688 xres, yres); 1122 cvt_mode.yres = yres;
1123 cvt_mode.refresh = (refresh) ? refresh : 60;
689 1124
690 if (!refresh_specified) { 1125 if (interlace)
691 /* 1126 cvt_mode.vmode |= FB_VMODE_INTERLACED;
692 * If the caller has provided a custom mode database and 1127 else
693 * a valid monspecs structure, we look for the mode with 1128 cvt_mode.vmode &= ~FB_VMODE_INTERLACED;
694 * the highest refresh rate. Otherwise we play it safe 1129
695 * it and try to find a mode with a refresh rate closest 1130 ret = fb_find_mode_cvt(&cvt_mode, margins, rb);
696 * to the standard 60 Hz.
697 */
698 if (db != modedb &&
699 info->monspecs.vfmin && info->monspecs.vfmax &&
700 info->monspecs.hfmin && info->monspecs.hfmax &&
701 info->monspecs.dclkmax) {
702 refresh = 1000;
703 } else {
704 refresh = 60;
705 }
706 }
707 1131
708 diff = -1; 1132 if (!ret && !fb_try_mode(var, info, &cvt_mode, bpp)) {
709 best = -1; 1133 DPRINTK("modedb CVT: CVT mode ok\n");
710 for (i = 0; i < dbsize; i++) { 1134 return 1;
711 if ((name_matches(db[i], name, namelen) || 1135 }
712 (res_specified && res_matches(db[i], xres, yres))) && 1136
713 !fb_try_mode(var, info, &db[i], bpp)) { 1137 DPRINTK("CVT mode invalid, getting mode from database\n");
714 if (refresh_specified && db[i].refresh == refresh) 1138 }
715 return 1; 1139
1140 DPRINTK("Trying specified video mode%s %ix%i\n",
1141 refresh_specified ? "" : " (ignoring refresh rate)", xres, yres);
1142
1143 if (!refresh_specified) {
1144 /*
1145 * If the caller has provided a custom mode database and a
1146 * valid monspecs structure, we look for the mode with the
1147 * highest refresh rate. Otherwise we play it safe it and
1148 * try to find a mode with a refresh rate closest to the
1149 * standard 60 Hz.
1150 */
1151 if (db != modedb &&
1152 info->monspecs.vfmin && info->monspecs.vfmax &&
1153 info->monspecs.hfmin && info->monspecs.hfmax &&
1154 info->monspecs.dclkmax) {
1155 refresh = 1000;
1156 } else {
1157 refresh = 60;
1158 }
1159 }
716 1160
1161 diff = -1;
1162 best = -1;
1163 for (i = 0; i < dbsize; i++) {
1164 if ((name_matches(db[i], name, namelen) ||
1165 (res_specified && res_matches(db[i], xres, yres))) &&
1166 !fb_try_mode(var, info, &db[i], bpp)) {
1167 if (refresh_specified && db[i].refresh == refresh) {
1168 return 1;
1169 } else {
717 if (abs(db[i].refresh - refresh) < diff) { 1170 if (abs(db[i].refresh - refresh) < diff) {
718 diff = abs(db[i].refresh - refresh); 1171 diff = abs(db[i].refresh - refresh);
719 best = i; 1172 best = i;
720 } 1173 }
721 } 1174 }
722 } 1175 }
723 if (best != -1) { 1176 }
724 fb_try_mode(var, info, &db[best], bpp); 1177 if (best != -1) {
725 return (refresh_specified) ? 2 : 1; 1178 fb_try_mode(var, info, &db[best], bpp);
726 } 1179 return (refresh_specified) ? 2 : 1;
1180 }
727 1181
728 diff = 2 * (xres + yres); 1182 diff = 2 * (xres + yres);
729 best = -1; 1183 best = -1;
730 DPRINTK("Trying best-fit modes\n"); 1184 DPRINTK("Trying best-fit modes\n");
731 for (i = 0; i < dbsize; i++) { 1185 for (i = 0; i < dbsize; i++) {
732 DPRINTK("Trying %ix%i\n", db[i].xres, db[i].yres); 1186 DPRINTK("Trying %ix%i\n", db[i].xres, db[i].yres);
733 if (!fb_try_mode(var, info, &db[i], bpp)) { 1187 if (!fb_try_mode(var, info, &db[i], bpp)) {
734 tdiff = abs(db[i].xres - xres) + 1188 tdiff = abs(db[i].xres - xres) +
735 abs(db[i].yres - yres); 1189 abs(db[i].yres - yres);
736 1190
737 /* 1191 /*
738 * Penalize modes with resolutions smaller 1192 * Penalize modes with resolutions smaller
739 * than requested. 1193 * than requested.
740 */ 1194 */
741 if (xres > db[i].xres || yres > db[i].yres) 1195 if (xres > db[i].xres || yres > db[i].yres)
742 tdiff += xres + yres; 1196 tdiff += xres + yres;
743 1197
744 if (diff > tdiff) { 1198 if (diff > tdiff) {
745 diff = tdiff; 1199 diff = tdiff;
746 best = i; 1200 best = i;
747 }
748 } 1201 }
749 } 1202 }
750 if (best != -1) {
751 fb_try_mode(var, info, &db[best], bpp);
752 return 5;
753 }
754 } 1203 }
1204 if (best != -1) {
1205 fb_try_mode(var, info, &db[best], bpp);
1206 return 5;
1207 }
1208 }
755 1209
756 DPRINTK("Trying default video mode\n"); 1210 DPRINTK("Trying default video mode\n");
757 if (!fb_try_mode(var, info, default_mode, default_bpp)) 1211 if (!fb_try_mode(var, info, default_mode, default_bpp))
758 return 3; 1212 return 3;
759 1213
760 DPRINTK("Trying all modes\n"); 1214 DPRINTK("Trying all modes\n");
761 for (i = 0; i < dbsize; i++) 1215 for (i = 0; i < dbsize; i++)
762 if (!fb_try_mode(var, info, &db[i], default_bpp)) 1216 if (!fb_try_mode(var, info, &db[i], default_bpp))
763 return 4; 1217 return 4;
764 1218
765 DPRINTK("No valid mode found\n"); 1219 DPRINTK("No valid mode found\n");
766 return 0; 1220 return 0;
767} 1221}
768 1222
769/** 1223/**
@@ -787,7 +1241,7 @@ void fb_var_to_videomode(struct fb_videomode *mode,
787 mode->upper_margin = var->upper_margin; 1241 mode->upper_margin = var->upper_margin;
788 mode->lower_margin = var->lower_margin; 1242 mode->lower_margin = var->lower_margin;
789 mode->sync = var->sync; 1243 mode->sync = var->sync;
790 mode->vmode = var->vmode & FB_VMODE_MASK; 1244 mode->vmode = var->vmode & (FB_VMODE_MASK | FB_VMODE_STEREO_MASK);
791 mode->flag = FB_MODE_IS_FROM_VAR; 1245 mode->flag = FB_MODE_IS_FROM_VAR;
792 mode->refresh = 0; 1246 mode->refresh = 0;
793 1247
@@ -832,7 +1286,7 @@ void fb_videomode_to_var(struct fb_var_screeninfo *var,
832 var->hsync_len = mode->hsync_len; 1286 var->hsync_len = mode->hsync_len;
833 var->vsync_len = mode->vsync_len; 1287 var->vsync_len = mode->vsync_len;
834 var->sync = mode->sync; 1288 var->sync = mode->sync;
835 var->vmode = mode->vmode & FB_VMODE_MASK; 1289 var->vmode = mode->vmode & (FB_VMODE_MASK | FB_VMODE_STEREO_MASK);
836} 1290}
837 1291
838/** 1292/**
@@ -1001,7 +1455,7 @@ int fb_add_videomode(const struct fb_videomode *mode, struct list_head *head)
1001 if (!modelist) 1455 if (!modelist)
1002 return -ENOMEM; 1456 return -ENOMEM;
1003 modelist->mode = *mode; 1457 modelist->mode = *mode;
1004 list_add(&modelist->list, head); 1458 list_add_tail(&modelist->list, head);
1005 } 1459 }
1006 return 0; 1460 return 0;
1007} 1461}