aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_sdvo.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-02-09 13:46:58 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2011-02-11 04:20:50 -0500
commit1aad7ac0458f40e2d0365d488620084f3965f6e7 (patch)
treec40505227bcec6d0ddb01e6b574be4eb6c7790e3 /drivers/gpu/drm/i915/intel_sdvo.c
parent139467433e50926d22338e9dc754feaaf94b9db0 (diff)
drm/i915: Trigger modesetting if force-audio changes
If the user changes the force-audio property and it no longer reflects the current configuration, then we need to trigger a mode set in order to update the registers. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_sdvo.c')
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index d2dd90a9a101..7c50cdce84f0 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -1690,6 +1690,22 @@ static void intel_sdvo_destroy(struct drm_connector *connector)
1690 kfree(connector); 1690 kfree(connector);
1691} 1691}
1692 1692
1693static bool intel_sdvo_detect_hdmi_audio(struct drm_connector *connector)
1694{
1695 struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1696 struct edid *edid;
1697 bool has_audio = false;
1698
1699 if (!intel_sdvo->is_hdmi)
1700 return false;
1701
1702 edid = intel_sdvo_get_edid(connector);
1703 if (edid != NULL && edid->input & DRM_EDID_INPUT_DIGITAL)
1704 has_audio = drm_detect_monitor_audio(edid);
1705
1706 return has_audio;
1707}
1708
1693static int 1709static int
1694intel_sdvo_set_property(struct drm_connector *connector, 1710intel_sdvo_set_property(struct drm_connector *connector,
1695 struct drm_property *property, 1711 struct drm_property *property,
@@ -1706,17 +1722,23 @@ intel_sdvo_set_property(struct drm_connector *connector,
1706 return ret; 1722 return ret;
1707 1723
1708 if (property == intel_sdvo_connector->force_audio_property) { 1724 if (property == intel_sdvo_connector->force_audio_property) {
1709 if (val == intel_sdvo_connector->force_audio) 1725 int i = val;
1726 bool has_audio;
1727
1728 if (i == intel_sdvo_connector->force_audio)
1710 return 0; 1729 return 0;
1711 1730
1712 intel_sdvo_connector->force_audio = val; 1731 intel_sdvo_connector->force_audio = i;
1713 1732
1714 if (val > 0 && intel_sdvo->has_hdmi_audio) 1733 if (i == 0)
1715 return 0; 1734 has_audio = intel_sdvo_detect_hdmi_audio(connector);
1716 if (val < 0 && !intel_sdvo->has_hdmi_audio) 1735 else
1736 has_audio = i > 0;
1737
1738 if (has_audio == intel_sdvo->has_hdmi_audio)
1717 return 0; 1739 return 0;
1718 1740
1719 intel_sdvo->has_hdmi_audio = val > 0; 1741 intel_sdvo->has_hdmi_audio = has_audio;
1720 goto done; 1742 goto done;
1721 } 1743 }
1722 1744