From mboxrd@z Thu Jan 1 00:00:00 1970 From: Zhenyu Wang Subject: [PATCH 2/4] drm/i915: Enable DisplayPort audio Date: Sun, 19 Sep 2010 14:52:07 +0800 Message-ID: <1284879129-19720-3-git-send-email-zhenyuw@linux.intel.com> References: <1284879129-19720-1-git-send-email-zhenyuw@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1284879129-19720-1-git-send-email-zhenyuw@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org Errors-To: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org To: dri-devel@lists.freedesktop.org Cc: intel-gfx@lists.freedesktop.org, fengguang.wu@intel.com List-Id: dri-devel@lists.freedesktop.org This will turn on DP audio output by checking monitor's audio capability. Tested-by: Wu Fengguang Signed-off-by: Zhenyu Wang --- drivers/gpu/drm/i915/intel_dp.c | 61 +++++++++++++++++++++++---------------- 1 files changed, 36 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 208a4ec..81fca1e 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -1444,39 +1444,50 @@ intel_dp_detect(struct drm_connector *connector) struct drm_i915_private *dev_priv = dev->dev_private; uint32_t temp, bit; enum drm_connector_status status; + struct edid *edid = NULL; intel_dp->has_audio = false; - if (HAS_PCH_SPLIT(dev)) - return ironlake_dp_detect(connector); + if (HAS_PCH_SPLIT(dev)) { + status = ironlake_dp_detect(connector); + } else { + switch (intel_dp->output_reg) { + case DP_B: + bit = DPB_HOTPLUG_INT_STATUS; + break; + case DP_C: + bit = DPC_HOTPLUG_INT_STATUS; + break; + case DP_D: + bit = DPD_HOTPLUG_INT_STATUS; + break; + default: + return connector_status_unknown; + } - switch (intel_dp->output_reg) { - case DP_B: - bit = DPB_HOTPLUG_INT_STATUS; - break; - case DP_C: - bit = DPC_HOTPLUG_INT_STATUS; - break; - case DP_D: - bit = DPD_HOTPLUG_INT_STATUS; - break; - default: - return connector_status_unknown; - } + temp = I915_READ(PORT_HOTPLUG_STAT); - temp = I915_READ(PORT_HOTPLUG_STAT); + if ((temp & bit) == 0) + return connector_status_disconnected; - if ((temp & bit) == 0) - return connector_status_disconnected; + status = connector_status_disconnected; + if (intel_dp_aux_native_read(intel_dp, 0x000, intel_dp->dpcd, + sizeof (intel_dp->dpcd)) == sizeof (intel_dp->dpcd)) + { + if (intel_dp->dpcd[0] != 0) + status = connector_status_connected; + } + } - status = connector_status_disconnected; - if (intel_dp_aux_native_read(intel_dp, - 0x000, intel_dp->dpcd, - sizeof (intel_dp->dpcd)) == sizeof (intel_dp->dpcd)) - { - if (intel_dp->dpcd[0] != 0) - status = connector_status_connected; + if (status == connector_status_connected) { + edid = drm_get_edid(connector, intel_dp->base.ddc_bus); + if (edid) { + intel_dp->has_audio = drm_detect_monitor_audio(edid); + connector->display_info.raw_edid = NULL; + kfree(edid); + } } + return status; } -- 1.7.1