drm/amdgpu: add DisplayPort CEC-Tunneling-over-AUX support
authorHans Verkuil <hans.verkuil@cisco.com>
Mon, 27 Aug 2018 08:08:18 +0000 (10:08 +0200)
committerHans Verkuil <hans.verkuil@cisco.com>
Fri, 31 Aug 2018 08:20:40 +0000 (10:20 +0200)
Add DisplayPort CEC-Tunneling-over-AUX support to amdgpu.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/de9586bb-151e-bae9-b8e3-14db107a60df@xs4all.nl
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c

index 11d6dd23eeb874d7dcaf633139192b77db9aa36c..af6adffba788a1c27d0e3626103267da6c3033d8 100644 (file)
@@ -896,6 +896,7 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector)
                aconnector->dc_sink = sink;
                if (sink->dc_edid.length == 0) {
                        aconnector->edid = NULL;
+                       drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux);
                } else {
                        aconnector->edid =
                                (struct edid *) sink->dc_edid.raw_edid;
@@ -903,10 +904,13 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector)
 
                        drm_connector_update_edid_property(connector,
                                        aconnector->edid);
+                       drm_dp_cec_set_edid(&aconnector->dm_dp_aux.aux,
+                                           aconnector->edid);
                }
                amdgpu_dm_add_sink_to_freesync_module(connector, aconnector->edid);
 
        } else {
+               drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux);
                amdgpu_dm_remove_sink_from_freesync_module(connector);
                drm_connector_update_edid_property(connector, NULL);
                aconnector->num_modes = 0;
@@ -1061,8 +1065,10 @@ static void handle_hpd_rx_irq(void *param)
            (dc_link->type == dc_connection_mst_branch))
                dm_handle_hpd_rx_irq(aconnector);
 
-       if (dc_link->type != dc_connection_mst_branch)
+       if (dc_link->type != dc_connection_mst_branch) {
+               drm_dp_cec_irq(&aconnector->dm_dp_aux.aux);
                mutex_unlock(&aconnector->hpd_lock);
+       }
 }
 
 static void register_hpd_handlers(struct amdgpu_device *adev)
@@ -2731,6 +2737,7 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector)
                dm->backlight_dev = NULL;
        }
 #endif
+       drm_dp_cec_unregister_connector(&aconnector->dm_dp_aux.aux);
        drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(connector);
index 9a300732ba3747a86541d8b62c2562e27e96b9fc..18a3a6e5ffa03b2a1f7df954993f85cf36326aa2 100644 (file)
@@ -496,6 +496,8 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
        aconnector->dm_dp_aux.ddc_service = aconnector->dc_link->ddc;
 
        drm_dp_aux_register(&aconnector->dm_dp_aux.aux);
+       drm_dp_cec_register_connector(&aconnector->dm_dp_aux.aux,
+                                     aconnector->base.name, dm->adev->dev);
        aconnector->mst_mgr.cbs = &dm_mst_cbs;
        drm_dp_mst_topology_mgr_init(
                &aconnector->mst_mgr,