diff options
author | Erik Gilling <konkers@android.com> | 2010-11-04 13:48:53 -0700 |
---|---|---|
committer | Erik Gilling <konkers@android.com> | 2010-11-09 13:54:42 -0800 |
commit | 15e220587f20b66db19043104542ef2eea6d8644 (patch) | |
tree | e9c10e595edb4904cca9b3119e1da7e61c5ea43f /drivers/video/fbmon.c | |
parent | 961428a649899d0e83f76f27526b26a196d8dc2e (diff) |
video: add short video mode decode to fbmon
Change-Id: Ida529e096688c231029628d3d16d6f8569bfe2c9
Signed-off-by: Erik Gilling <konkers@android.com>
Diffstat (limited to 'drivers/video/fbmon.c')
-rw-r--r-- | drivers/video/fbmon.c | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/drivers/video/fbmon.c b/drivers/video/fbmon.c index a0b5a93b72d2..0841e6b27e5c 100644 --- a/drivers/video/fbmon.c +++ b/drivers/video/fbmon.c @@ -976,6 +976,7 @@ void fb_edid_to_monspecs(unsigned char *edid, struct fb_monspecs *specs) void fb_edid_add_monspecs(unsigned char *edid, struct fb_monspecs *specs) { unsigned char *block; + unsigned char *dtd_block; struct fb_videomode *mode, *m; int num = 0, i, first = 1; @@ -992,14 +993,42 @@ void fb_edid_add_monspecs(unsigned char *edid, struct fb_monspecs *specs) if (mode == NULL) return; - block = edid + edid[0x2]; + block = edid + 0x4; + dtd_block = edid + edid[0x2]; + + DPRINTK(" Short Video Modes\n"); + while (block < dtd_block) { + unsigned tag = block[0] >> 5; + unsigned len = block[0] & 0x1f; + + block++; + if (dtd_block - block < len) + break; + + if (tag == 0x2) { + for (i = 0; i < len; i++) { + unsigned m = block[i]; + if (m > 0 && m < CEA_MODEDB_SIZE) { + memcpy(&mode[num], &cea_modes[m], + sizeof(mode[num])); + DPRINTK(" %d: %dx%d @ %d\n", m, + cea_modes[m].xres, cea_modes[m].yres, + cea_modes[m].refresh); + + num++; + } + } + } + + block += len; + } DPRINTK(" Extended Detailed Timings\n"); for (i = 0; i < (128 - edid[0x2]) / DETAILED_TIMING_DESCRIPTION_SIZE; - i++, block += DETAILED_TIMING_DESCRIPTION_SIZE) { - if (!(block[0] == 0x00 && block[1] == 0x00)) { - get_detailed_timing(block, &mode[num]); + i++, dtd_block += DETAILED_TIMING_DESCRIPTION_SIZE) { + if (!(dtd_block[0] == 0x00 && dtd_block[1] == 0x00)) { + get_detailed_timing(dtd_block, &mode[num]); if (first) { mode[num].flag |= FB_MODE_IS_FIRST; first = 0; |