diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-02-09 13:46:58 -0500 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-02-11 04:20:50 -0500 |
commit | 1aad7ac0458f40e2d0365d488620084f3965f6e7 (patch) | |
tree | c40505227bcec6d0ddb01e6b574be4eb6c7790e3 /drivers/gpu/drm/i915/intel_sdvo.c | |
parent | 139467433e50926d22338e9dc754feaaf94b9db0 (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.c | 34 |
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 | ||
1693 | static 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 | |||
1693 | static int | 1709 | static int |
1694 | intel_sdvo_set_property(struct drm_connector *connector, | 1710 | intel_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 | ||