drm/nouveau/kms/nv50-: Move AUX adapter reg to connector late register/early unregister
authorLyude Paul <lyude@redhat.com>
Fri, 23 Apr 2021 18:42:54 +0000 (14:42 -0400)
committerLyude Paul <lyude@redhat.com>
Tue, 27 Apr 2021 22:43:41 +0000 (18:43 -0400)
Since AUX adapters on nouveau have their respective DRM connectors as
parents, we need to make sure that we register then after their connectors.

Signed-off-by: Lyude Paul <lyude@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210423184309.207645-3-lyude@redhat.com
Reviewed-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/nouveau/nouveau_connector.c

index 61e6d7412505a39464c27c65cdbfabcfc5757457..c04044be3d324f93bcc61909d74bd294118aacde 100644 (file)
@@ -401,7 +401,6 @@ nouveau_connector_destroy(struct drm_connector *connector)
        drm_connector_cleanup(connector);
        if (nv_connector->aux.transfer) {
                drm_dp_cec_unregister_connector(&nv_connector->aux);
-               drm_dp_aux_unregister(&nv_connector->aux);
                kfree(nv_connector->aux.name);
        }
        kfree(connector);
@@ -905,13 +904,29 @@ nouveau_connector_late_register(struct drm_connector *connector)
        int ret;
 
        ret = nouveau_backlight_init(connector);
+       if (ret)
+               return ret;
 
+       if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
+           connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
+               ret = drm_dp_aux_register(&nouveau_connector(connector)->aux);
+               if (ret)
+                       goto backlight_fini;
+       }
+
+       return 0;
+backlight_fini:
+       nouveau_backlight_fini(connector);
        return ret;
 }
 
 static void
 nouveau_connector_early_unregister(struct drm_connector *connector)
 {
+       if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
+           connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort)
+               drm_dp_aux_unregister(&nouveau_connector(connector)->aux);
+
        nouveau_backlight_fini(connector);
 }
 
@@ -1343,14 +1358,14 @@ nouveau_connector_create(struct drm_device *dev,
                snprintf(aux_name, sizeof(aux_name), "sor-%04x-%04x",
                         dcbe->hasht, dcbe->hashm);
                nv_connector->aux.name = kstrdup(aux_name, GFP_KERNEL);
-               ret = drm_dp_aux_register(&nv_connector->aux);
+               drm_dp_aux_init(&nv_connector->aux);
                if (ret) {
-                       NV_ERROR(drm, "failed to register aux channel\n");
+                       NV_ERROR(drm, "Failed to init AUX adapter for sor-%04x-%04x: %d\n",
+                                dcbe->hasht, dcbe->hashm, ret);
                        kfree(nv_connector);
                        return ERR_PTR(ret);
                }
-               funcs = &nouveau_connector_funcs;
-               break;
+               fallthrough;
        default:
                funcs = &nouveau_connector_funcs;
                break;