diff options
Diffstat (limited to 'drivers/gpu/drm/drm_connector.c')
-rw-r--r-- | drivers/gpu/drm/drm_connector.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index 5a4526289392..7a7019ac9388 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c | |||
@@ -225,6 +225,7 @@ int drm_connector_init(struct drm_device *dev, | |||
225 | 225 | ||
226 | INIT_LIST_HEAD(&connector->probed_modes); | 226 | INIT_LIST_HEAD(&connector->probed_modes); |
227 | INIT_LIST_HEAD(&connector->modes); | 227 | INIT_LIST_HEAD(&connector->modes); |
228 | mutex_init(&connector->mutex); | ||
228 | connector->edid_blob_ptr = NULL; | 229 | connector->edid_blob_ptr = NULL; |
229 | connector->status = connector_status_unknown; | 230 | connector->status = connector_status_unknown; |
230 | 231 | ||
@@ -359,6 +360,8 @@ void drm_connector_cleanup(struct drm_connector *connector) | |||
359 | connector->funcs->atomic_destroy_state(connector, | 360 | connector->funcs->atomic_destroy_state(connector, |
360 | connector->state); | 361 | connector->state); |
361 | 362 | ||
363 | mutex_destroy(&connector->mutex); | ||
364 | |||
362 | memset(connector, 0, sizeof(*connector)); | 365 | memset(connector, 0, sizeof(*connector)); |
363 | } | 366 | } |
364 | EXPORT_SYMBOL(drm_connector_cleanup); | 367 | EXPORT_SYMBOL(drm_connector_cleanup); |
@@ -374,14 +377,18 @@ EXPORT_SYMBOL(drm_connector_cleanup); | |||
374 | */ | 377 | */ |
375 | int drm_connector_register(struct drm_connector *connector) | 378 | int drm_connector_register(struct drm_connector *connector) |
376 | { | 379 | { |
377 | int ret; | 380 | int ret = 0; |
378 | 381 | ||
379 | if (connector->registered) | 382 | if (!connector->dev->registered) |
380 | return 0; | 383 | return 0; |
381 | 384 | ||
385 | mutex_lock(&connector->mutex); | ||
386 | if (connector->registered) | ||
387 | goto unlock; | ||
388 | |||
382 | ret = drm_sysfs_connector_add(connector); | 389 | ret = drm_sysfs_connector_add(connector); |
383 | if (ret) | 390 | if (ret) |
384 | return ret; | 391 | goto unlock; |
385 | 392 | ||
386 | ret = drm_debugfs_connector_add(connector); | 393 | ret = drm_debugfs_connector_add(connector); |
387 | if (ret) { | 394 | if (ret) { |
@@ -397,12 +404,14 @@ int drm_connector_register(struct drm_connector *connector) | |||
397 | drm_mode_object_register(connector->dev, &connector->base); | 404 | drm_mode_object_register(connector->dev, &connector->base); |
398 | 405 | ||
399 | connector->registered = true; | 406 | connector->registered = true; |
400 | return 0; | 407 | goto unlock; |
401 | 408 | ||
402 | err_debugfs: | 409 | err_debugfs: |
403 | drm_debugfs_connector_remove(connector); | 410 | drm_debugfs_connector_remove(connector); |
404 | err_sysfs: | 411 | err_sysfs: |
405 | drm_sysfs_connector_remove(connector); | 412 | drm_sysfs_connector_remove(connector); |
413 | unlock: | ||
414 | mutex_unlock(&connector->mutex); | ||
406 | return ret; | 415 | return ret; |
407 | } | 416 | } |
408 | EXPORT_SYMBOL(drm_connector_register); | 417 | EXPORT_SYMBOL(drm_connector_register); |
@@ -415,8 +424,11 @@ EXPORT_SYMBOL(drm_connector_register); | |||
415 | */ | 424 | */ |
416 | void drm_connector_unregister(struct drm_connector *connector) | 425 | void drm_connector_unregister(struct drm_connector *connector) |
417 | { | 426 | { |
418 | if (!connector->registered) | 427 | mutex_lock(&connector->mutex); |
428 | if (!connector->registered) { | ||
429 | mutex_unlock(&connector->mutex); | ||
419 | return; | 430 | return; |
431 | } | ||
420 | 432 | ||
421 | if (connector->funcs->early_unregister) | 433 | if (connector->funcs->early_unregister) |
422 | connector->funcs->early_unregister(connector); | 434 | connector->funcs->early_unregister(connector); |
@@ -425,6 +437,7 @@ void drm_connector_unregister(struct drm_connector *connector) | |||
425 | drm_debugfs_connector_remove(connector); | 437 | drm_debugfs_connector_remove(connector); |
426 | 438 | ||
427 | connector->registered = false; | 439 | connector->registered = false; |
440 | mutex_unlock(&connector->mutex); | ||
428 | } | 441 | } |
429 | EXPORT_SYMBOL(drm_connector_unregister); | 442 | EXPORT_SYMBOL(drm_connector_unregister); |
430 | 443 | ||