Commit a9756bb5 authored by Zhenyu Wang's avatar Zhenyu Wang Committed by Chris Wilson

drm/i915: Enable DisplayPort audio

This will turn on DP audio output by checking monitor's audio
capability.
Signed-off-by: default avatarZhenyu Wang <zhenyuw@linux.intel.com>
[ickle: rebase onto recent changes and rearranged for clarity]
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
parent 8fe9790d
...@@ -1458,9 +1458,8 @@ intel_dp_check_link_status(struct intel_dp *intel_dp) ...@@ -1458,9 +1458,8 @@ intel_dp_check_link_status(struct intel_dp *intel_dp)
} }
static enum drm_connector_status static enum drm_connector_status
ironlake_dp_detect(struct drm_connector *connector) ironlake_dp_detect(struct intel_dp *intel_dp)
{ {
struct intel_dp *intel_dp = intel_attached_dp(connector);
enum drm_connector_status status; enum drm_connector_status status;
/* Can't disconnect eDP */ /* Can't disconnect eDP */
...@@ -1470,8 +1469,8 @@ ironlake_dp_detect(struct drm_connector *connector) ...@@ -1470,8 +1469,8 @@ ironlake_dp_detect(struct drm_connector *connector)
status = connector_status_disconnected; status = connector_status_disconnected;
if (intel_dp_aux_native_read(intel_dp, if (intel_dp_aux_native_read(intel_dp,
0x000, intel_dp->dpcd, 0x000, intel_dp->dpcd,
sizeof (intel_dp->dpcd)) == sizeof (intel_dp->dpcd)) sizeof (intel_dp->dpcd))
{ == sizeof(intel_dp->dpcd)) {
if (intel_dp->dpcd[0] != 0) if (intel_dp->dpcd[0] != 0)
status = connector_status_connected; status = connector_status_connected;
} }
...@@ -1480,25 +1479,13 @@ ironlake_dp_detect(struct drm_connector *connector) ...@@ -1480,25 +1479,13 @@ ironlake_dp_detect(struct drm_connector *connector)
return status; return status;
} }
/**
* Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection.
*
* \return true if DP port is connected.
* \return false if DP port is disconnected.
*/
static enum drm_connector_status static enum drm_connector_status
intel_dp_detect(struct drm_connector *connector, bool force) g4x_dp_detect(struct intel_dp *intel_dp)
{ {
struct intel_dp *intel_dp = intel_attached_dp(connector);
struct drm_device *dev = intel_dp->base.base.dev; struct drm_device *dev = intel_dp->base.base.dev;
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
uint32_t temp, bit;
enum drm_connector_status status; enum drm_connector_status status;
uint32_t temp, bit;
intel_dp->has_audio = false;
if (HAS_PCH_SPLIT(dev))
return ironlake_dp_detect(connector);
switch (intel_dp->output_reg) { switch (intel_dp->output_reg) {
case DP_B: case DP_B:
...@@ -1520,14 +1507,47 @@ intel_dp_detect(struct drm_connector *connector, bool force) ...@@ -1520,14 +1507,47 @@ intel_dp_detect(struct drm_connector *connector, bool force)
return connector_status_disconnected; return connector_status_disconnected;
status = connector_status_disconnected; status = connector_status_disconnected;
if (intel_dp_aux_native_read(intel_dp, if (intel_dp_aux_native_read(intel_dp, 0x000, intel_dp->dpcd,
0x000, intel_dp->dpcd,
sizeof (intel_dp->dpcd)) == sizeof (intel_dp->dpcd)) sizeof (intel_dp->dpcd)) == sizeof (intel_dp->dpcd))
{ {
if (intel_dp->dpcd[0] != 0) if (intel_dp->dpcd[0] != 0)
status = connector_status_connected; status = connector_status_connected;
} }
return bit;
}
/**
* Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection.
*
* \return true if DP port is connected.
* \return false if DP port is disconnected.
*/
static enum drm_connector_status
intel_dp_detect(struct drm_connector *connector, bool force)
{
struct intel_dp *intel_dp = intel_attached_dp(connector);
struct drm_device *dev = intel_dp->base.base.dev;
enum drm_connector_status status;
struct edid *edid = NULL;
intel_dp->has_audio = false;
if (HAS_PCH_SPLIT(dev))
status = ironlake_dp_detect(intel_dp);
else
status = g4x_dp_detect(intel_dp);
if (status != connector_status_connected)
return status; return status;
edid = drm_get_edid(connector, &intel_dp->adapter);
if (edid) {
intel_dp->has_audio = drm_detect_monitor_audio(edid);
connector->display_info.raw_edid = NULL;
kfree(edid);
}
return connector_status_connected;
} }
static int intel_dp_get_modes(struct drm_connector *connector) static int intel_dp_get_modes(struct drm_connector *connector)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment