diff options
author | Christian Schmidt <schmidt@digadd.de> | 2011-12-19 14:03:38 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-12-20 04:51:06 -0500 |
commit | a0ab734d62ef4c35ffa5e39f9ec1e6d6284f05fa (patch) | |
tree | f543a4b51b76585d2befd5552a7265955d3b9b58 /drivers/gpu/drm/drm_edid.c | |
parent | 54ac76f851a1789b047b74a8e14980f2dd1ac749 (diff) |
drm_edid_to_eld: check for CEA data blocks only from structure revision 3 on
CEA datablocks are only defined from revision 3 onwards. Only check for
them if the revision says so.
Signed-of-by: Christian Schmidt <schmidt@digadd.de>
Tested-by: James Cloos <cloos@jhcloos.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/drm_edid.c')
-rw-r--r-- | drivers/gpu/drm/drm_edid.c | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 2283631c9a51..478b122ad1ba 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
@@ -1474,26 +1474,29 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid) | |||
1474 | eld[18] = edid->prod_code[0]; | 1474 | eld[18] = edid->prod_code[0]; |
1475 | eld[19] = edid->prod_code[1]; | 1475 | eld[19] = edid->prod_code[1]; |
1476 | 1476 | ||
1477 | for (db = cea + 4; db < cea + cea[2]; db += dbl + 1) { | 1477 | if (cea[1] >= 3) |
1478 | dbl = db[0] & 0x1f; | 1478 | for (db = cea + 4; db < cea + cea[2]; db += dbl + 1) { |
1479 | 1479 | dbl = db[0] & 0x1f; | |
1480 | switch ((db[0] & 0xe0) >> 5) { | 1480 | |
1481 | case AUDIO_BLOCK: /* Audio Data Block, contains SADs */ | 1481 | switch ((db[0] & 0xe0) >> 5) { |
1482 | sad_count = dbl / 3; | 1482 | case AUDIO_BLOCK: |
1483 | memcpy(eld + 20 + mnl, &db[1], dbl); | 1483 | /* Audio Data Block, contains SADs */ |
1484 | break; | 1484 | sad_count = dbl / 3; |
1485 | case SPEAKER_BLOCK: /* Speaker Allocation Data Block */ | 1485 | memcpy(eld + 20 + mnl, &db[1], dbl); |
1486 | eld[7] = db[1]; | 1486 | break; |
1487 | break; | 1487 | case SPEAKER_BLOCK: |
1488 | case VENDOR_BLOCK: | 1488 | /* Speaker Allocation Data Block */ |
1489 | /* HDMI Vendor-Specific Data Block */ | 1489 | eld[7] = db[1]; |
1490 | if (db[1] == 0x03 && db[2] == 0x0c && db[3] == 0) | 1490 | break; |
1491 | parse_hdmi_vsdb(connector, db); | 1491 | case VENDOR_BLOCK: |
1492 | break; | 1492 | /* HDMI Vendor-Specific Data Block */ |
1493 | default: | 1493 | if (db[1] == 0x03 && db[2] == 0x0c && db[3] == 0) |
1494 | break; | 1494 | parse_hdmi_vsdb(connector, db); |
1495 | break; | ||
1496 | default: | ||
1497 | break; | ||
1498 | } | ||
1495 | } | 1499 | } |
1496 | } | ||
1497 | eld[5] |= sad_count << 4; | 1500 | eld[5] |= sad_count << 4; |
1498 | eld[2] = (20 + mnl + sad_count * 3 + 3) / 4; | 1501 | eld[2] = (20 + mnl + sad_count * 3 + 3) / 4; |
1499 | 1502 | ||