drm/i915: Move registration actions to connector->late_register
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Jun 2016 13:00:14 +0000 (14:00 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Jun 2016 13:42:58 +0000 (14:42 +0100)
With the introduction of a connector->func for callback from
drm_connector_register() we can move all the tasks that we want to do
upon registration into that callback. Later, this will allow us to
reorder the registration and defer it until after the device is setup
and ready for userspace.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/1466773227-7994-2-git-send-email-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_dp_mst.c
drivers/gpu/drm/i915/intel_sdvo.c

index 85f2801b16ed8b875b42f1394d99d135758466db..d4e037e20fa10865a40cb864d2aa65bcaeaf5295 100644 (file)
@@ -1249,35 +1249,18 @@ intel_dp_aux_fini(struct intel_dp *intel_dp)
        kfree(intel_dp->aux.name);
 }
 
-static int
+static void
 intel_dp_aux_init(struct intel_dp *intel_dp, struct intel_connector *connector)
 {
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
        enum port port = intel_dig_port->port;
-       int ret;
 
        intel_aux_reg_init(intel_dp);
+       drm_dp_aux_init(&intel_dp->aux);
 
+       /* Failure to allocate our preferred name is not critical */
        intel_dp->aux.name = kasprintf(GFP_KERNEL, "DPDDC-%c", port_name(port));
-       if (!intel_dp->aux.name)
-               return -ENOMEM;
-
-       intel_dp->aux.dev = connector->base.kdev;
        intel_dp->aux.transfer = intel_dp_aux_transfer;
-
-       DRM_DEBUG_KMS("registering %s bus for %s\n",
-                     intel_dp->aux.name,
-                     connector->base.kdev->kobj.name);
-
-       ret = drm_dp_aux_register(&intel_dp->aux);
-       if (ret < 0) {
-               DRM_ERROR("drm_dp_aux_register() for %s failed (%d)\n",
-                         intel_dp->aux.name, ret);
-               kfree(intel_dp->aux.name);
-               return ret;
-       }
-
-       return 0;
 }
 
 static int
@@ -4520,6 +4503,20 @@ done:
        return 0;
 }
 
+static int
+intel_dp_connector_register(struct drm_connector *connector)
+{
+       struct intel_dp *intel_dp = intel_attached_dp(connector);
+
+       i915_debugfs_connector_add(connector);
+
+       DRM_DEBUG_KMS("registering %s bus for %s\n",
+                     intel_dp->aux.name, connector->kdev->kobj.name);
+
+       intel_dp->aux.dev = connector->kdev;
+       return drm_dp_aux_register(&intel_dp->aux);
+}
+
 static void
 intel_dp_connector_unregister(struct drm_connector *connector)
 {
@@ -4648,6 +4645,7 @@ static const struct drm_connector_funcs intel_dp_connector_funcs = {
        .fill_modes = drm_helper_probe_single_connector_modes,
        .set_property = intel_dp_set_property,
        .atomic_get_property = intel_connector_atomic_get_property,
+       .late_register = intel_dp_connector_register,
        .early_unregister = intel_dp_connector_unregister,
        .destroy = intel_dp_connector_destroy,
        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
@@ -5515,7 +5513,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
        struct drm_device *dev = intel_encoder->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        enum port port = intel_dig_port->port;
-       int type, ret;
+       int type;
 
        if (WARN(intel_dig_port->max_lanes < 1,
                 "Not enough lanes (%d) for DP on port %c\n",
@@ -5574,6 +5572,8 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
        connector->interlace_allowed = true;
        connector->doublescan_allowed = 0;
 
+       intel_dp_aux_init(intel_dp, intel_connector);
+
        INIT_DELAYED_WORK(&intel_dp->panel_vdd_work,
                          edp_panel_vdd_work);
 
@@ -5608,10 +5608,6 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
                BUG();
        }
 
-       ret = intel_dp_aux_init(intel_dp, intel_connector);
-       if (ret)
-               goto fail;
-
        /* init MST on ports that can support it */
        if (HAS_DP_MST(dev) &&
            (port == PORT_B || port == PORT_C || port == PORT_D))
@@ -5635,8 +5631,6 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
                I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
        }
 
-       i915_debugfs_connector_add(connector);
-
        return true;
 
 fail:
index 9646816604be657d02e4f9fa56b1dc926234b795..89e7c98f5693059ffeac7e08954b092f5d8b8870 100644 (file)
@@ -477,9 +477,11 @@ static void intel_dp_register_mst_connector(struct drm_connector *connector)
 {
        struct intel_connector *intel_connector = to_intel_connector(connector);
        struct drm_device *dev = connector->dev;
+
        drm_modeset_lock_all(dev);
        intel_connector_add_to_fbdev(intel_connector);
        drm_modeset_unlock_all(dev);
+
        drm_connector_register(&intel_connector->base);
 }
 
index 02b4a669552887fbfd2f36505113f07e2e712e30..580cc876a90fd6d78393415c4f9556b02390d963 100644 (file)
@@ -2177,6 +2177,16 @@ done:
 #undef CHECK_PROPERTY
 }
 
+static int
+intel_sdvo_connector_register(struct drm_connector *connector)
+{
+       struct intel_sdvo *sdvo = intel_attached_sdvo(connector);
+
+       return sysfs_create_link(&connector->kdev->kobj,
+                                &sdvo->ddc.dev.kobj,
+                                sdvo->ddc.dev.kobj.name);
+}
+
 static void
 intel_sdvo_connector_unregister(struct drm_connector *connector)
 {
@@ -2193,6 +2203,7 @@ static const struct drm_connector_funcs intel_sdvo_connector_funcs = {
        .fill_modes = drm_helper_probe_single_connector_modes,
        .set_property = intel_sdvo_set_property,
        .atomic_get_property = intel_connector_atomic_get_property,
+       .late_register = intel_sdvo_connector_register,
        .early_unregister = intel_sdvo_connector_unregister,
        .destroy = intel_sdvo_destroy,
        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
@@ -2384,16 +2395,8 @@ intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
        if (ret < 0)
                goto err1;
 
-       ret = sysfs_create_link(&drm_connector->kdev->kobj,
-                               &encoder->ddc.dev.kobj,
-                               encoder->ddc.dev.kobj.name);
-       if (ret < 0)
-               goto err2;
-
        return 0;
 
-err2:
-       drm_connector_unregister(drm_connector);
 err1:
        drm_connector_cleanup(drm_connector);