aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-06-24 09:00:14 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2016-06-24 09:42:58 -0400
commit7a418e3448f8c47fb44cc995d7983e735b9774c7 (patch)
tree580a071b607b1992e110093e6d2ee11ffe6b6f52
parentfda9ee98230cd4799cddaede37ab3051ac7645df (diff)
drm/i915: Move registration actions to connector->late_register
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
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c48
-rw-r--r--drivers/gpu/drm/i915/intel_dp_mst.c2
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c19
3 files changed, 34 insertions, 35 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 85f2801b16ed..d4e037e20fa1 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1249,35 +1249,18 @@ intel_dp_aux_fini(struct intel_dp *intel_dp)
1249 kfree(intel_dp->aux.name); 1249 kfree(intel_dp->aux.name);
1250} 1250}
1251 1251
1252static int 1252static void
1253intel_dp_aux_init(struct intel_dp *intel_dp, struct intel_connector *connector) 1253intel_dp_aux_init(struct intel_dp *intel_dp, struct intel_connector *connector)
1254{ 1254{
1255 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 1255 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1256 enum port port = intel_dig_port->port; 1256 enum port port = intel_dig_port->port;
1257 int ret;
1258 1257
1259 intel_aux_reg_init(intel_dp); 1258 intel_aux_reg_init(intel_dp);
1259 drm_dp_aux_init(&intel_dp->aux);
1260 1260
1261 /* Failure to allocate our preferred name is not critical */
1261 intel_dp->aux.name = kasprintf(GFP_KERNEL, "DPDDC-%c", port_name(port)); 1262 intel_dp->aux.name = kasprintf(GFP_KERNEL, "DPDDC-%c", port_name(port));
1262 if (!intel_dp->aux.name)
1263 return -ENOMEM;
1264
1265 intel_dp->aux.dev = connector->base.kdev;
1266 intel_dp->aux.transfer = intel_dp_aux_transfer; 1263 intel_dp->aux.transfer = intel_dp_aux_transfer;
1267
1268 DRM_DEBUG_KMS("registering %s bus for %s\n",
1269 intel_dp->aux.name,
1270 connector->base.kdev->kobj.name);
1271
1272 ret = drm_dp_aux_register(&intel_dp->aux);
1273 if (ret < 0) {
1274 DRM_ERROR("drm_dp_aux_register() for %s failed (%d)\n",
1275 intel_dp->aux.name, ret);
1276 kfree(intel_dp->aux.name);
1277 return ret;
1278 }
1279
1280 return 0;
1281} 1264}
1282 1265
1283static int 1266static int
@@ -4520,6 +4503,20 @@ done:
4520 return 0; 4503 return 0;
4521} 4504}
4522 4505
4506static int
4507intel_dp_connector_register(struct drm_connector *connector)
4508{
4509 struct intel_dp *intel_dp = intel_attached_dp(connector);
4510
4511 i915_debugfs_connector_add(connector);
4512
4513 DRM_DEBUG_KMS("registering %s bus for %s\n",
4514 intel_dp->aux.name, connector->kdev->kobj.name);
4515
4516 intel_dp->aux.dev = connector->kdev;
4517 return drm_dp_aux_register(&intel_dp->aux);
4518}
4519
4523static void 4520static void
4524intel_dp_connector_unregister(struct drm_connector *connector) 4521intel_dp_connector_unregister(struct drm_connector *connector)
4525{ 4522{
@@ -4648,6 +4645,7 @@ static const struct drm_connector_funcs intel_dp_connector_funcs = {
4648 .fill_modes = drm_helper_probe_single_connector_modes, 4645 .fill_modes = drm_helper_probe_single_connector_modes,
4649 .set_property = intel_dp_set_property, 4646 .set_property = intel_dp_set_property,
4650 .atomic_get_property = intel_connector_atomic_get_property, 4647 .atomic_get_property = intel_connector_atomic_get_property,
4648 .late_register = intel_dp_connector_register,
4651 .early_unregister = intel_dp_connector_unregister, 4649 .early_unregister = intel_dp_connector_unregister,
4652 .destroy = intel_dp_connector_destroy, 4650 .destroy = intel_dp_connector_destroy,
4653 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 4651 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
@@ -5515,7 +5513,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
5515 struct drm_device *dev = intel_encoder->base.dev; 5513 struct drm_device *dev = intel_encoder->base.dev;
5516 struct drm_i915_private *dev_priv = dev->dev_private; 5514 struct drm_i915_private *dev_priv = dev->dev_private;
5517 enum port port = intel_dig_port->port; 5515 enum port port = intel_dig_port->port;
5518 int type, ret; 5516 int type;
5519 5517
5520 if (WARN(intel_dig_port->max_lanes < 1, 5518 if (WARN(intel_dig_port->max_lanes < 1,
5521 "Not enough lanes (%d) for DP on port %c\n", 5519 "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,
5574 connector->interlace_allowed = true; 5572 connector->interlace_allowed = true;
5575 connector->doublescan_allowed = 0; 5573 connector->doublescan_allowed = 0;
5576 5574
5575 intel_dp_aux_init(intel_dp, intel_connector);
5576
5577 INIT_DELAYED_WORK(&intel_dp->panel_vdd_work, 5577 INIT_DELAYED_WORK(&intel_dp->panel_vdd_work,
5578 edp_panel_vdd_work); 5578 edp_panel_vdd_work);
5579 5579
@@ -5608,10 +5608,6 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
5608 BUG(); 5608 BUG();
5609 } 5609 }
5610 5610
5611 ret = intel_dp_aux_init(intel_dp, intel_connector);
5612 if (ret)
5613 goto fail;
5614
5615 /* init MST on ports that can support it */ 5611 /* init MST on ports that can support it */
5616 if (HAS_DP_MST(dev) && 5612 if (HAS_DP_MST(dev) &&
5617 (port == PORT_B || port == PORT_C || port == PORT_D)) 5613 (port == PORT_B || port == PORT_C || port == PORT_D))
@@ -5635,8 +5631,6 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
5635 I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd); 5631 I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
5636 } 5632 }
5637 5633
5638 i915_debugfs_connector_add(connector);
5639
5640 return true; 5634 return true;
5641 5635
5642fail: 5636fail:
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
index 9646816604be..89e7c98f5693 100644
--- a/drivers/gpu/drm/i915/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/intel_dp_mst.c
@@ -477,9 +477,11 @@ static void intel_dp_register_mst_connector(struct drm_connector *connector)
477{ 477{
478 struct intel_connector *intel_connector = to_intel_connector(connector); 478 struct intel_connector *intel_connector = to_intel_connector(connector);
479 struct drm_device *dev = connector->dev; 479 struct drm_device *dev = connector->dev;
480
480 drm_modeset_lock_all(dev); 481 drm_modeset_lock_all(dev);
481 intel_connector_add_to_fbdev(intel_connector); 482 intel_connector_add_to_fbdev(intel_connector);
482 drm_modeset_unlock_all(dev); 483 drm_modeset_unlock_all(dev);
484
483 drm_connector_register(&intel_connector->base); 485 drm_connector_register(&intel_connector->base);
484} 486}
485 487
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 02b4a6695528..580cc876a90f 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -2177,6 +2177,16 @@ done:
2177#undef CHECK_PROPERTY 2177#undef CHECK_PROPERTY
2178} 2178}
2179 2179
2180static int
2181intel_sdvo_connector_register(struct drm_connector *connector)
2182{
2183 struct intel_sdvo *sdvo = intel_attached_sdvo(connector);
2184
2185 return sysfs_create_link(&connector->kdev->kobj,
2186 &sdvo->ddc.dev.kobj,
2187 sdvo->ddc.dev.kobj.name);
2188}
2189
2180static void 2190static void
2181intel_sdvo_connector_unregister(struct drm_connector *connector) 2191intel_sdvo_connector_unregister(struct drm_connector *connector)
2182{ 2192{
@@ -2193,6 +2203,7 @@ static const struct drm_connector_funcs intel_sdvo_connector_funcs = {
2193 .fill_modes = drm_helper_probe_single_connector_modes, 2203 .fill_modes = drm_helper_probe_single_connector_modes,
2194 .set_property = intel_sdvo_set_property, 2204 .set_property = intel_sdvo_set_property,
2195 .atomic_get_property = intel_connector_atomic_get_property, 2205 .atomic_get_property = intel_connector_atomic_get_property,
2206 .late_register = intel_sdvo_connector_register,
2196 .early_unregister = intel_sdvo_connector_unregister, 2207 .early_unregister = intel_sdvo_connector_unregister,
2197 .destroy = intel_sdvo_destroy, 2208 .destroy = intel_sdvo_destroy,
2198 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 2209 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
@@ -2384,16 +2395,8 @@ intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
2384 if (ret < 0) 2395 if (ret < 0)
2385 goto err1; 2396 goto err1;
2386 2397
2387 ret = sysfs_create_link(&drm_connector->kdev->kobj,
2388 &encoder->ddc.dev.kobj,
2389 encoder->ddc.dev.kobj.name);
2390 if (ret < 0)
2391 goto err2;
2392
2393 return 0; 2398 return 0;
2394 2399
2395err2:
2396 drm_connector_unregister(drm_connector);
2397err1: 2400err1:
2398 drm_connector_cleanup(drm_connector); 2401 drm_connector_cleanup(drm_connector);
2399 2402