aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_edid.c
diff options
context:
space:
mode:
authorJesse Barnes <jbarnes@virtuousgeek.org>2011-04-15 15:49:23 -0400
committerDave Airlie <airlied@redhat.com>2011-04-28 00:42:58 -0400
commit3b11228b54cc6bda4a72bb22984203c6eff4338a (patch)
treeaccdc0765e163c0384b37b70f9f1601bc99fc52a /drivers/gpu/drm/drm_edid.c
parente8e7a2b8ccfdae0d4cb6bd25824bbedcd42da316 (diff)
drm: add bit depth parsing
EDID 1.4 digital monitors report the bit depth supported in the input field. Add support for parsing this out and storing the info in the display_info structure for use by drivers. [airlied: tweaked to fix inter-patch dependency] Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> Reviewed-by: Adam Jackson <ajax@redhat.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.c54
1 files changed, 52 insertions, 2 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index adc9358c9bec..fe0d3dcd4d31 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1413,6 +1413,57 @@ end:
1413EXPORT_SYMBOL(drm_detect_monitor_audio); 1413EXPORT_SYMBOL(drm_detect_monitor_audio);
1414 1414
1415/** 1415/**
1416 * drm_add_display_info - pull display info out if present
1417 * @edid: EDID data
1418 * @info: display info (attached to connector)
1419 *
1420 * Grab any available display info and stuff it into the drm_display_info
1421 * structure that's part of the connector. Useful for tracking bpp and
1422 * color spaces.
1423 */
1424static void drm_add_display_info(struct edid *edid,
1425 struct drm_display_info *info)
1426{
1427 info->width_mm = edid->width_cm * 10;
1428 info->height_mm = edid->height_cm * 10;
1429
1430 /* driver figures it out in this case */
1431 info->bpc = 0;
1432
1433 /* Only defined for 1.4 with digital displays */
1434 if (edid->revision < 4)
1435 return;
1436
1437 if (!(edid->input & DRM_EDID_INPUT_DIGITAL))
1438 return;
1439
1440 switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) {
1441 case DRM_EDID_DIGITAL_DEPTH_6:
1442 info->bpc = 6;
1443 break;
1444 case DRM_EDID_DIGITAL_DEPTH_8:
1445 info->bpc = 8;
1446 break;
1447 case DRM_EDID_DIGITAL_DEPTH_10:
1448 info->bpc = 10;
1449 break;
1450 case DRM_EDID_DIGITAL_DEPTH_12:
1451 info->bpc = 12;
1452 break;
1453 case DRM_EDID_DIGITAL_DEPTH_14:
1454 info->bpc = 14;
1455 break;
1456 case DRM_EDID_DIGITAL_DEPTH_16:
1457 info->bpc = 16;
1458 break;
1459 case DRM_EDID_DIGITAL_DEPTH_UNDEF:
1460 default:
1461 info->bpc = 0;
1462 break;
1463 }
1464}
1465
1466/**
1416 * drm_add_edid_modes - add modes from EDID data, if available 1467 * drm_add_edid_modes - add modes from EDID data, if available
1417 * @connector: connector we're probing 1468 * @connector: connector we're probing
1418 * @edid: edid data 1469 * @edid: edid data
@@ -1460,8 +1511,7 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
1460 if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) 1511 if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
1461 edid_fixup_preferred(connector, quirks); 1512 edid_fixup_preferred(connector, quirks);
1462 1513
1463 connector->display_info.width_mm = edid->width_cm * 10; 1514 drm_add_display_info(edid, &connector->display_info);
1464 connector->display_info.height_mm = edid->height_cm * 10;
1465 1515
1466 return num_modes; 1516 return num_modes;
1467} 1517}