hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/gpu/drm/drm_encoder.c
....@@ -21,7 +21,10 @@
2121 */
2222
2323 #include <linux/export.h>
24
-#include <drm/drmP.h>
24
+
25
+#include <drm/drm_bridge.h>
26
+#include <drm/drm_device.h>
27
+#include <drm/drm_drv.h>
2528 #include <drm/drm_encoder.h>
2629
2730 #include "drm_crtc_internal.h"
....@@ -137,6 +140,7 @@
137140 goto out_put;
138141 }
139142
143
+ INIT_LIST_HEAD(&encoder->bridge_chain);
140144 list_add_tail(&encoder->head, &dev->mode_config.encoder_list);
141145 encoder->index = dev->mode_config.num_encoder++;
142146
....@@ -157,22 +161,16 @@
157161 void drm_encoder_cleanup(struct drm_encoder *encoder)
158162 {
159163 struct drm_device *dev = encoder->dev;
164
+ struct drm_bridge *bridge, *next;
160165
161166 /* Note that the encoder_list is considered to be static; should we
162167 * remove the drm_encoder at runtime we would have to decrement all
163168 * the indices on the drm_encoder after us in the encoder_list.
164169 */
165170
166
- if (encoder->bridge) {
167
- struct drm_bridge *bridge = encoder->bridge;
168
- struct drm_bridge *next;
169
-
170
- while (bridge) {
171
- next = bridge->next;
172
- drm_bridge_detach(bridge);
173
- bridge = next;
174
- }
175
- }
171
+ list_for_each_entry_safe(bridge, next, &encoder->bridge_chain,
172
+ chain_node)
173
+ drm_bridge_detach(bridge);
176174
177175 drm_mode_object_unregister(dev, &encoder->base);
178176 kfree(encoder->name);
....@@ -222,7 +220,7 @@
222220 struct drm_crtc *crtc;
223221
224222 if (!drm_core_check_feature(dev, DRIVER_MODESET))
225
- return -EINVAL;
223
+ return -EOPNOTSUPP;
226224
227225 encoder = drm_encoder_find(dev, file_priv, enc_resp->encoder_id);
228226 if (!encoder)