diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /drivers/video/modedb.c | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'drivers/video/modedb.c')
-rw-r--r-- | drivers/video/modedb.c | 1022 |
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 |
295 | const struct fb_videomode cea_modes[64] = { | 295 | const 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 | }; |
810 | EXPORT_SYMBOL(cea_modes); | ||
351 | 811 | ||
352 | const struct fb_videomode vesa_modes[] = { | 812 | const 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); | |||
491 | static int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info, | 951 | static 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 | } | ||
655 | done: | 1110 | done: |
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 | } |