diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index fee23cf93a2b..cd0f649b57a5 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -4333,6 +4333,9 @@ intel_dp_short_pulse(struct intel_dp *intel_dp) | |||
4333 | DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n"); | 4333 | DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n"); |
4334 | } | 4334 | } |
4335 | 4335 | ||
4336 | /* Handle CEC interrupts, if any */ | ||
4337 | drm_dp_cec_irq(&intel_dp->aux); | ||
4338 | |||
4336 | /* defer to the hotplug work for link retraining if needed */ | 4339 | /* defer to the hotplug work for link retraining if needed */ |
4337 | if (intel_dp_needs_link_retrain(intel_dp)) | 4340 | if (intel_dp_needs_link_retrain(intel_dp)) |
4338 | return false; | 4341 | return false; |
@@ -4642,6 +4645,7 @@ intel_dp_set_edid(struct intel_dp *intel_dp) | |||
4642 | intel_connector->detect_edid = edid; | 4645 | intel_connector->detect_edid = edid; |
4643 | 4646 | ||
4644 | intel_dp->has_audio = drm_detect_monitor_audio(edid); | 4647 | intel_dp->has_audio = drm_detect_monitor_audio(edid); |
4648 | drm_dp_cec_set_edid(&intel_dp->aux, edid); | ||
4645 | } | 4649 | } |
4646 | 4650 | ||
4647 | static void | 4651 | static void |
@@ -4649,6 +4653,7 @@ intel_dp_unset_edid(struct intel_dp *intel_dp) | |||
4649 | { | 4653 | { |
4650 | struct intel_connector *intel_connector = intel_dp->attached_connector; | 4654 | struct intel_connector *intel_connector = intel_dp->attached_connector; |
4651 | 4655 | ||
4656 | drm_dp_cec_unset_edid(&intel_dp->aux); | ||
4652 | kfree(intel_connector->detect_edid); | 4657 | kfree(intel_connector->detect_edid); |
4653 | intel_connector->detect_edid = NULL; | 4658 | intel_connector->detect_edid = NULL; |
4654 | 4659 | ||
@@ -4837,6 +4842,7 @@ static int | |||
4837 | intel_dp_connector_register(struct drm_connector *connector) | 4842 | intel_dp_connector_register(struct drm_connector *connector) |
4838 | { | 4843 | { |
4839 | struct intel_dp *intel_dp = intel_attached_dp(connector); | 4844 | struct intel_dp *intel_dp = intel_attached_dp(connector); |
4845 | struct drm_device *dev = connector->dev; | ||
4840 | int ret; | 4846 | int ret; |
4841 | 4847 | ||
4842 | ret = intel_connector_register(connector); | 4848 | ret = intel_connector_register(connector); |
@@ -4849,13 +4855,20 @@ intel_dp_connector_register(struct drm_connector *connector) | |||
4849 | intel_dp->aux.name, connector->kdev->kobj.name); | 4855 | intel_dp->aux.name, connector->kdev->kobj.name); |
4850 | 4856 | ||
4851 | intel_dp->aux.dev = connector->kdev; | 4857 | intel_dp->aux.dev = connector->kdev; |
4852 | return drm_dp_aux_register(&intel_dp->aux); | 4858 | ret = drm_dp_aux_register(&intel_dp->aux); |
4859 | if (!ret) | ||
4860 | drm_dp_cec_register_connector(&intel_dp->aux, | ||
4861 | connector->name, dev->dev); | ||
4862 | return ret; | ||
4853 | } | 4863 | } |
4854 | 4864 | ||
4855 | static void | 4865 | static void |
4856 | intel_dp_connector_unregister(struct drm_connector *connector) | 4866 | intel_dp_connector_unregister(struct drm_connector *connector) |
4857 | { | 4867 | { |
4858 | drm_dp_aux_unregister(&intel_attached_dp(connector)->aux); | 4868 | struct intel_dp *intel_dp = intel_attached_dp(connector); |
4869 | |||
4870 | drm_dp_cec_unregister_connector(&intel_dp->aux); | ||
4871 | drm_dp_aux_unregister(&intel_dp->aux); | ||
4859 | intel_connector_unregister(connector); | 4872 | intel_connector_unregister(connector); |
4860 | } | 4873 | } |
4861 | 4874 | ||
@@ -6051,7 +6064,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, | |||
6051 | edid = drm_get_edid(connector, &intel_dp->aux.ddc); | 6064 | edid = drm_get_edid(connector, &intel_dp->aux.ddc); |
6052 | if (edid) { | 6065 | if (edid) { |
6053 | if (drm_add_edid_modes(connector, edid)) { | 6066 | if (drm_add_edid_modes(connector, edid)) { |
6054 | drm_mode_connector_update_edid_property(connector, | 6067 | drm_connector_update_edid_property(connector, |
6055 | edid); | 6068 | edid); |
6056 | } else { | 6069 | } else { |
6057 | kfree(edid); | 6070 | kfree(edid); |
@@ -6140,8 +6153,8 @@ static void intel_dp_modeset_retry_work_fn(struct work_struct *work) | |||
6140 | /* Set connector link status to BAD and send a Uevent to notify | 6153 | /* Set connector link status to BAD and send a Uevent to notify |
6141 | * userspace to do a modeset. | 6154 | * userspace to do a modeset. |
6142 | */ | 6155 | */ |
6143 | drm_mode_connector_set_link_status_property(connector, | 6156 | drm_connector_set_link_status_property(connector, |
6144 | DRM_MODE_LINK_STATUS_BAD); | 6157 | DRM_MODE_LINK_STATUS_BAD); |
6145 | mutex_unlock(&connector->dev->mode_config.mutex); | 6158 | mutex_unlock(&connector->dev->mode_config.mutex); |
6146 | /* Send Hotplug uevent so userspace can reprobe */ | 6159 | /* Send Hotplug uevent so userspace can reprobe */ |
6147 | drm_kms_helper_hotplug_event(connector->dev); | 6160 | drm_kms_helper_hotplug_event(connector->dev); |