Commit 4932e2c3c716067f3580e1a9687bed9d751549e3

Authored by Imre Deak
Committed by Daniel Vetter
1 parent b6ae3c7c60

drm/i915: add unregister callback to connector

Since

commit d9255d57147e1dbcebdf6670409c2fa0ac3609e6
Author: Paulo Zanoni <paulo.r.zanoni@intel.com>
Date:   Thu Sep 26 20:05:59 2013 -0300

it became clear that we need to separate the unload sequence into two
parts:

1. remove all interfaces through which new operations on some object
   (crtc, encoder, connector) can be started and make sure all pending
   operations are completed
2. do the actual tear down of the internal representation of the above
   objects

The above commit achieved this separation for connectors by splitting
out the sysfs removal part from the connector's destroy callback and
doing this removal before calling drm_mode_config_cleanup() which does
the actual tear-down of all the drm objects.

Since we'll have to customize the interface removal part for different
types of connectors in the upcoming patches, add a new unregister
callback and move the interface removal part to it.

No functional change.

Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Antti Koskipää <antti.koskipaa@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>

Showing 11 changed files with 29 additions and 2 deletions Side-by-side Diff

drivers/gpu/drm/i915/i915_drv.h
... ... @@ -2546,6 +2546,7 @@
2546 2546 extern void intel_modeset_init(struct drm_device *dev);
2547 2547 extern void intel_modeset_gem_init(struct drm_device *dev);
2548 2548 extern void intel_modeset_cleanup(struct drm_device *dev);
  2549 +extern void intel_connector_unregister(struct intel_connector *);
2549 2550 extern int intel_modeset_vga_set_state(struct drm_device *dev, bool state);
2550 2551 extern void intel_modeset_setup_hw_state(struct drm_device *dev,
2551 2552 bool force_restore);
drivers/gpu/drm/i915/intel_crt.c
... ... @@ -833,6 +833,7 @@
833 833 crt->base.get_hw_state = intel_crt_get_hw_state;
834 834 }
835 835 intel_connector->get_hw_state = intel_connector_get_hw_state;
  836 + intel_connector->unregister = intel_connector_unregister;
836 837  
837 838 drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
838 839  
drivers/gpu/drm/i915/intel_display.c
... ... @@ -11409,6 +11409,14 @@
11409 11409 intel_setup_overlay(dev);
11410 11410 }
11411 11411  
  11412 +void intel_connector_unregister(struct intel_connector *intel_connector)
  11413 +{
  11414 + struct drm_connector *connector = &intel_connector->base;
  11415 +
  11416 + intel_panel_destroy_backlight(connector);
  11417 + drm_sysfs_connector_remove(connector);
  11418 +}
  11419 +
11412 11420 void intel_modeset_cleanup(struct drm_device *dev)
11413 11421 {
11414 11422 struct drm_i915_private *dev_priv = dev->dev_private;
... ... @@ -11453,8 +11461,10 @@
11453 11461  
11454 11462 /* destroy the backlight and sysfs files before encoders/connectors */
11455 11463 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
11456   - intel_panel_destroy_backlight(connector);
11457   - drm_sysfs_connector_remove(connector);
  11464 + struct intel_connector *intel_connector;
  11465 +
  11466 + intel_connector = to_intel_connector(connector);
  11467 + intel_connector->unregister(intel_connector);
11458 11468 }
11459 11469  
11460 11470 drm_mode_config_cleanup(dev);
drivers/gpu/drm/i915/intel_dp.c
... ... @@ -3799,6 +3799,7 @@
3799 3799 intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
3800 3800 else
3801 3801 intel_connector->get_hw_state = intel_connector_get_hw_state;
  3802 + intel_connector->unregister = intel_connector_unregister;
3802 3803  
3803 3804 intel_dp->aux_ch_ctl_reg = intel_dp->output_reg + 0x10;
3804 3805 if (HAS_DDI(dev)) {
drivers/gpu/drm/i915/intel_drv.h
... ... @@ -187,6 +187,14 @@
187 187 * and active (i.e. dpms ON state). */
188 188 bool (*get_hw_state)(struct intel_connector *);
189 189  
  190 + /*
  191 + * Removes all interfaces through which the connector is accessible
  192 + * - like sysfs, debugfs entries -, so that no new operations can be
  193 + * started on the connector. Also makes sure all currently pending
  194 + * operations finish before returing.
  195 + */
  196 + void (*unregister)(struct intel_connector *);
  197 +
190 198 /* Panel info for eDP and LVDS */
191 199 struct intel_panel panel;
192 200  
drivers/gpu/drm/i915/intel_dsi.c
... ... @@ -586,6 +586,7 @@
586 586 intel_encoder->get_config = intel_dsi_get_config;
587 587  
588 588 intel_connector->get_hw_state = intel_connector_get_hw_state;
  589 + intel_connector->unregister = intel_connector_unregister;
589 590  
590 591 for (i = 0; i < ARRAY_SIZE(intel_dsi_devices); i++) {
591 592 dsi = &intel_dsi_devices[i];
drivers/gpu/drm/i915/intel_dvo.c
... ... @@ -477,6 +477,7 @@
477 477 intel_encoder->compute_config = intel_dvo_compute_config;
478 478 intel_encoder->mode_set = intel_dvo_mode_set;
479 479 intel_connector->get_hw_state = intel_dvo_connector_get_hw_state;
  480 + intel_connector->unregister = intel_connector_unregister;
480 481  
481 482 /* Now, try to find a controller */
482 483 for (i = 0; i < ARRAY_SIZE(intel_dvo_devices); i++) {
drivers/gpu/drm/i915/intel_hdmi.c
... ... @@ -1236,6 +1236,7 @@
1236 1236 intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
1237 1237 else
1238 1238 intel_connector->get_hw_state = intel_connector_get_hw_state;
  1239 + intel_connector->unregister = intel_connector_unregister;
1239 1240  
1240 1241 intel_hdmi_add_properties(intel_hdmi, connector);
1241 1242  
drivers/gpu/drm/i915/intel_lvds.c
... ... @@ -958,6 +958,7 @@
958 958 intel_encoder->get_hw_state = intel_lvds_get_hw_state;
959 959 intel_encoder->get_config = intel_lvds_get_config;
960 960 intel_connector->get_hw_state = intel_connector_get_hw_state;
  961 + intel_connector->unregister = intel_connector_unregister;
961 962  
962 963 intel_connector_attach_encoder(intel_connector, intel_encoder);
963 964 intel_encoder->type = INTEL_OUTPUT_LVDS;
drivers/gpu/drm/i915/intel_sdvo.c
... ... @@ -2397,6 +2397,7 @@
2397 2397 connector->base.base.doublescan_allowed = 0;
2398 2398 connector->base.base.display_info.subpixel_order = SubPixelHorizontalRGB;
2399 2399 connector->base.get_hw_state = intel_sdvo_connector_get_hw_state;
  2400 + connector->base.unregister = intel_connector_unregister;
2400 2401  
2401 2402 intel_connector_attach_encoder(&connector->base, &encoder->base);
2402 2403 drm_sysfs_connector_add(&connector->base.base);
drivers/gpu/drm/i915/intel_tv.c
... ... @@ -1634,6 +1634,7 @@
1634 1634 intel_encoder->disable = intel_disable_tv;
1635 1635 intel_encoder->get_hw_state = intel_tv_get_hw_state;
1636 1636 intel_connector->get_hw_state = intel_connector_get_hw_state;
  1637 + intel_connector->unregister = intel_connector_unregister;
1637 1638  
1638 1639 intel_connector_attach_encoder(intel_connector, intel_encoder);
1639 1640 intel_encoder->type = INTEL_OUTPUT_TVOUT;