aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_crtc_helper.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index a6e42433ef0e..1c4d6746f90c 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -631,8 +631,12 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
631 mode_changed = true; 631 mode_changed = true;
632 } 632 }
633 633
634 /* take a reference on all connectors in set */ 634 /* take a reference on all unbound connectors in set, reuse the
635 * already taken reference for bound connectors
636 */
635 for (ro = 0; ro < set->num_connectors; ro++) { 637 for (ro = 0; ro < set->num_connectors; ro++) {
638 if (set->connectors[ro]->encoder)
639 continue;
636 drm_connector_reference(set->connectors[ro]); 640 drm_connector_reference(set->connectors[ro]);
637 } 641 }
638 642
@@ -754,12 +758,6 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
754 } 758 }
755 } 759 }
756 760
757 /* after fail drop reference on all connectors in save set */
758 count = 0;
759 drm_for_each_connector(connector, dev) {
760 drm_connector_unreference(&save_connectors[count++]);
761 }
762
763 kfree(save_connectors); 761 kfree(save_connectors);
764 kfree(save_encoders); 762 kfree(save_encoders);
765 return 0; 763 return 0;
@@ -776,8 +774,12 @@ fail:
776 *connector = save_connectors[count++]; 774 *connector = save_connectors[count++];
777 } 775 }
778 776
779 /* after fail drop reference on all connectors in set */ 777 /* after fail drop reference on all unbound connectors in set, let
778 * bound connectors keep their reference
779 */
780 for (ro = 0; ro < set->num_connectors; ro++) { 780 for (ro = 0; ro < set->num_connectors; ro++) {
781 if (set->connectors[ro]->encoder)
782 continue;
781 drm_connector_unreference(set->connectors[ro]); 783 drm_connector_unreference(set->connectors[ro]);
782 } 784 }
783 785