Advertisement
Guest User

Untitled

a guest
Jun 6th, 2019
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 4.57 KB | None | 0 0
  1. From 6c39ae2ecdb30cec4a2bd320926c839d5c0ec9cc Mon Sep 17 00:00:00 2001
  2. From: Leo Li <sunpeng.li@amd.com>
  3. Date: Thu, 6 Jun 2019 15:02:42 -0400
  4. Subject: [PATCH] Fixing driver unload with mst devices
  5.  
  6. Signed-off-by: Leo Li <sunpeng.li@amd.com>
  7. ---
  8. drivers/gpu/drm/drm_dp_helper.c       | 12 ++++++++++++
  9.  drivers/gpu/drm/drm_dp_mst_topology.c |  7 -------
  10.  drivers/gpu/drm/i915/intel_dp_mst.c   | 33 +++++++++++++++++++++++++++++++--
  11.  include/drm/drm_dp_helper.h           |  2 ++
  12.  4 files changed, 45 insertions(+), 9 deletions(-)
  13.  
  14. diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
  15. index e6af758..4de68ea 100644
  16. --- a/drivers/gpu/drm/drm_dp_helper.c
  17. +++ b/drivers/gpu/drm/drm_dp_helper.c
  18. @@ -1174,6 +1174,18 @@ void drm_dp_aux_unregister(struct drm_dp_aux *aux)
  19.  }
  20.  EXPORT_SYMBOL(drm_dp_aux_unregister);
  21.  
  22. +int drm_dp_remote_aux_register(struct drm_dp_aux *aux)
  23. +{
  24. +   return drm_dp_aux_register_devnode(aux);
  25. +}
  26. +EXPORT_SYMBOL(drm_dp_remote_aux_register);
  27. +
  28. +void drm_dp_remote_aux_unregister(struct drm_dp_aux *aux)
  29. +{
  30. +   drm_dp_aux_unregister_devnode(aux);
  31. +}
  32. +EXPORT_SYMBOL(drm_dp_remote_aux_unregister);
  33. +
  34.  #define PSR_SETUP_TIME(x) [DP_PSR_SETUP_TIME_ ## x >> DP_PSR_SETUP_TIME_SHIFT] = (x)
  35.  
  36.  /**
  37. diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
  38. index 3829f54..a85f055 100644
  39. --- a/drivers/gpu/drm/drm_dp_mst_topology.c
  40. +++ b/drivers/gpu/drm/drm_dp_mst_topology.c
  41. @@ -1243,7 +1243,6 @@ static void drm_dp_destroy_port(struct kref *kref)
  42.     struct drm_dp_mst_topology_mgr *mgr = port->mgr;
  43.  
  44.     if (!port->input) {
  45. -       drm_dp_aux_unregister_devnode(&port->aux);
  46.  
  47.         port->vcpi.num_slots = 0;
  48.  
  49. @@ -1675,12 +1674,6 @@ static void drm_dp_add_port(struct drm_dp_mst_branch *mstb,
  50.             drm_connector_set_tile_property(port->connector);
  51.         }
  52.         (*mstb->mgr->cbs->register_connector)(port->connector);
  53. -
  54. -       if (port->connector->registration_state ==
  55. -           DRM_CONNECTOR_REGISTERED)
  56. -           port->aux.dev = port->connector->kdev;
  57. -
  58. -       drm_dp_aux_register_devnode(&port->aux);
  59.     }
  60.  
  61.  out:
  62. diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
  63. index 0caf645..a3d9bc7 100644
  64. --- a/drivers/gpu/drm/i915/intel_dp_mst.c
  65. +++ b/drivers/gpu/drm/i915/intel_dp_mst.c
  66. @@ -399,13 +399,42 @@ intel_dp_mst_detect(struct drm_connector *connector, bool force)
  67.                       intel_connector->port);
  68.  }
  69.  
  70. +static int
  71. +intel_dp_mst_connector_late_register(struct drm_connector *connector)
  72. +{
  73. +   struct intel_connector *intel_connector = to_intel_connector(connector);
  74. +   struct drm_dp_mst_port *port = intel_connector->port;
  75. +
  76. +   int ret;
  77. +
  78. +   ret = intel_connector_register(connector);
  79. +   if (ret)
  80. +       return ret;
  81. +
  82. +   DRM_DEBUG_KMS("registering %s MST bus for %s\n",
  83. +             port->aux.name, connector->kdev->kobj.name);
  84. +
  85. +   port->aux.dev = connector->kdev;
  86. +   return drm_dp_remote_aux_register(&port->aux);
  87. +}
  88. +
  89. +static void
  90. +intel_dp_mst_connector_early_unregister(struct drm_connector *connector)
  91. +{
  92. +   struct intel_connector *intel_connector = to_intel_connector(connector);
  93. +   struct drm_dp_mst_port *port = intel_connector->port;
  94. +
  95. +   drm_dp_remote_aux_unregister(&port->aux);
  96. +   intel_connector_unregister(connector);
  97. +}
  98. +
  99.  static const struct drm_connector_funcs intel_dp_mst_connector_funcs = {
  100.     .detect = intel_dp_mst_detect,
  101.     .fill_modes = drm_helper_probe_single_connector_modes,
  102.     .atomic_get_property = intel_digital_connector_atomic_get_property,
  103.     .atomic_set_property = intel_digital_connector_atomic_set_property,
  104. -   .late_register = intel_connector_register,
  105. -   .early_unregister = intel_connector_unregister,
  106. +   .late_register = intel_dp_mst_connector_late_register,
  107. +   .early_unregister = intel_dp_mst_connector_early_unregister,
  108.     .destroy = intel_connector_destroy,
  109.     .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
  110.     .atomic_duplicate_state = intel_digital_connector_duplicate_state,
  111. diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
  112. index efd14b8..d086897 100644
  113. --- a/include/drm/drm_dp_helper.h
  114. +++ b/include/drm/drm_dp_helper.h
  115. @@ -1371,6 +1371,8 @@ void drm_dp_downstream_debug(struct seq_file *m, const u8 dpcd[DP_RECEIVER_CAP_S
  116.  void drm_dp_aux_init(struct drm_dp_aux *aux);
  117.  int drm_dp_aux_register(struct drm_dp_aux *aux);
  118.  void drm_dp_aux_unregister(struct drm_dp_aux *aux);
  119. +int drm_dp_remote_aux_register(struct drm_dp_aux *aux);
  120. +void drm_dp_remote_aux_unregister(struct drm_dp_aux *aux);
  121.  
  122.  int drm_dp_start_crc(struct drm_dp_aux *aux, struct drm_crtc *crtc);
  123.  int drm_dp_stop_crc(struct drm_dp_aux *aux);
  124. --
  125. 2.7.4
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement