drm/amd/display: Only register backlight device if embedded panel connected
authorHarry Wentland <harry.wentland@amd.com>
Mon, 12 Mar 2018 15:16:47 +0000 (11:16 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 11 Apr 2018 18:08:02 +0000 (13:08 -0500)
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index 74839478bdc941616a3ee21e0dd98fe0cc504063..6636f4e9d30c47d8c0c6b8c9f1cbfffc39051210 100644 (file)
@@ -1403,6 +1403,28 @@ static int initialize_plane(struct amdgpu_display_manager *dm,
        return ret;
 }
 
+
+static void register_backlight_device(struct amdgpu_display_manager *dm,
+                                     struct dc_link *link)
+{
+#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\
+       defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
+
+       if ((link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) &&
+           link->type != dc_connection_none) {
+               /* Event if registration failed, we should continue with
+                * DM initialization because not having a backlight control
+                * is better then a black screen.
+                */
+               amdgpu_dm_register_backlight_device(dm);
+
+               if (dm->backlight_dev)
+                       dm->backlight_link = link;
+       }
+#endif
+}
+
+
 /* In this architecture, the association
  * connector -> encoder -> crtc
  * id not really requried. The crtc and connector will hold the
@@ -1456,6 +1478,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
 
        /* loops over all connectors on the board */
        for (i = 0; i < link_cnt; i++) {
+               struct dc_link *link = NULL;
 
                if (i > AMDGPU_DM_MAX_DISPLAY_INDEX) {
                        DRM_ERROR(
@@ -1482,9 +1505,14 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
                        goto fail;
                }
 
-               if (dc_link_detect(dc_get_link_at_index(dm->dc, i),
-                               DETECT_REASON_BOOT))
+               link = dc_get_link_at_index(dm->dc, i);
+
+               if (dc_link_detect(link, DETECT_REASON_BOOT)) {
                        amdgpu_dm_update_connector_after_detect(aconnector);
+                       register_backlight_device(dm, link);
+               }
+
+
        }
 
        /* Software is initialized. Now we can register interrupt handlers. */
@@ -2684,7 +2712,8 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector)
 #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\
        defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
 
-       if (link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) {
+       if ((link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) &&
+           link->type != dc_connection_none) {
                amdgpu_dm_register_backlight_device(dm);
 
                if (dm->backlight_dev) {
@@ -3557,6 +3586,7 @@ create_i2c(struct ddc_service *ddc_service,
        return i2c;
 }
 
+
 /* Note: this function assumes that dc_link_detect() was called for the
  * dc_link which will be represented by this aconnector.
  */
@@ -3626,28 +3656,6 @@ static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
                || connector_type == DRM_MODE_CONNECTOR_eDP)
                amdgpu_dm_initialize_dp_connector(dm, aconnector);
 
-#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\
-       defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
-
-       /* NOTE: this currently will create backlight device even if a panel
-        * is not connected to the eDP/LVDS connector.
-        *
-        * This is less than ideal but we don't have sink information at this
-        * stage since detection happens after. We can't do detection earlier
-        * since MST detection needs connectors to be created first.
-        */
-       if (link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) {
-               /* Event if registration failed, we should continue with
-                * DM initialization because not having a backlight control
-                * is better then a black screen.
-                */
-               amdgpu_dm_register_backlight_device(dm);
-
-               if (dm->backlight_dev)
-                       dm->backlight_link = link;
-       }
-#endif
-
 out_free:
        if (res) {
                kfree(i2c);