summaryrefslogtreecommitdiff
path: root/drivers/video/fbmon.c
diff options
context:
space:
mode:
authorErik Gilling <konkers@android.com>2010-11-04 13:48:53 -0700
committerErik Gilling <konkers@android.com>2010-11-09 13:54:42 -0800
commit15e220587f20b66db19043104542ef2eea6d8644 (patch)
treee9c10e595edb4904cca9b3119e1da7e61c5ea43f /drivers/video/fbmon.c
parent961428a649899d0e83f76f27526b26a196d8dc2e (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.c37
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;