diff options
Diffstat (limited to 'drivers/gpu/drm/drm_encoder.c')
| -rw-r--r-- | drivers/gpu/drm/drm_encoder.c | 15 | 
1 files changed, 5 insertions, 10 deletions
diff --git a/drivers/gpu/drm/drm_encoder.c b/drivers/gpu/drm/drm_encoder.c index 80d88a55302e..e555281f43d4 100644 --- a/drivers/gpu/drm/drm_encoder.c +++ b/drivers/gpu/drm/drm_encoder.c @@ -140,6 +140,7 @@ int drm_encoder_init(struct drm_device *dev,  		goto out_put;  	} +	INIT_LIST_HEAD(&encoder->bridge_chain);  	list_add_tail(&encoder->head, &dev->mode_config.encoder_list);  	encoder->index = dev->mode_config.num_encoder++; @@ -160,22 +161,16 @@ EXPORT_SYMBOL(drm_encoder_init);  void drm_encoder_cleanup(struct drm_encoder *encoder)  {  	struct drm_device *dev = encoder->dev; +	struct drm_bridge *bridge, *next;  	/* Note that the encoder_list is considered to be static; should we  	 * remove the drm_encoder at runtime we would have to decrement all  	 * the indices on the drm_encoder after us in the encoder_list.  	 */ -	if (encoder->bridge) { -		struct drm_bridge *bridge = encoder->bridge; -		struct drm_bridge *next; - -		while (bridge) { -			next = bridge->next; -			drm_bridge_detach(bridge); -			bridge = next; -		} -	} +	list_for_each_entry_safe(bridge, next, &encoder->bridge_chain, +				 chain_node) +		drm_bridge_detach(bridge);  	drm_mode_object_unregister(dev, &encoder->base);  	kfree(encoder->name);  |