@@ -547,15 +547,20 @@ EXPORT_SYMBOL(drm_bridge_chain_disable);
547
547
* encoder chain, starting from the first bridge to the last. These are called
548
548
* after completing the encoder's prepare op.
549
549
*
550
- * If a bridge sets @pre_enable_upstream_first, then the @post_disable for that
551
- * bridge will be called before the previous one to reverse the @pre_enable
552
- * calling direction.
553
- *
554
550
* Note: the bridge passed should be the one closest to the encoder
555
551
*/
556
552
void drm_bridge_chain_post_disable (struct drm_bridge * bridge )
557
553
{
558
- drm_atomic_bridge_chain_post_disable (bridge , NULL );
554
+ struct drm_encoder * encoder ;
555
+
556
+ if (!bridge )
557
+ return ;
558
+
559
+ encoder = bridge -> encoder ;
560
+ list_for_each_entry_from (bridge , & encoder -> bridge_chain , chain_node ) {
561
+ if (bridge -> funcs -> post_disable )
562
+ bridge -> funcs -> post_disable (bridge );
563
+ }
559
564
}
560
565
EXPORT_SYMBOL (drm_bridge_chain_post_disable );
561
566
@@ -597,14 +602,24 @@ EXPORT_SYMBOL(drm_bridge_chain_mode_set);
597
602
* chain, starting from the last bridge to the first. These are called
598
603
* before calling the encoder's commit op.
599
604
*
600
- * If a bridge sets @pre_enable_upstream_first, then the @pre_enable for the
601
- * previous bridge will be called before @pre_enable of this bridge.
602
- *
603
605
* Note: the bridge passed should be the one closest to the encoder
604
606
*/
605
607
void drm_bridge_chain_pre_enable (struct drm_bridge * bridge )
606
608
{
607
- drm_atomic_bridge_chain_pre_enable (bridge , NULL );
609
+ struct drm_encoder * encoder ;
610
+ struct drm_bridge * iter ;
611
+
612
+ if (!bridge )
613
+ return ;
614
+
615
+ encoder = bridge -> encoder ;
616
+ list_for_each_entry_reverse (iter , & encoder -> bridge_chain , chain_node ) {
617
+ if (iter -> funcs -> pre_enable )
618
+ iter -> funcs -> pre_enable (iter );
619
+
620
+ if (iter == bridge )
621
+ break ;
622
+ }
608
623
}
609
624
EXPORT_SYMBOL (drm_bridge_chain_pre_enable );
610
625
@@ -676,25 +691,6 @@ void drm_atomic_bridge_chain_disable(struct drm_bridge *bridge,
676
691
}
677
692
EXPORT_SYMBOL (drm_atomic_bridge_chain_disable );
678
693
679
- static void drm_atomic_bridge_call_post_disable (struct drm_bridge * bridge ,
680
- struct drm_atomic_state * old_state )
681
- {
682
- if (old_state && bridge -> funcs -> atomic_post_disable ) {
683
- struct drm_bridge_state * old_bridge_state ;
684
-
685
- old_bridge_state =
686
- drm_atomic_get_old_bridge_state (old_state ,
687
- bridge );
688
- if (WARN_ON (!old_bridge_state ))
689
- return ;
690
-
691
- bridge -> funcs -> atomic_post_disable (bridge ,
692
- old_bridge_state );
693
- } else if (bridge -> funcs -> post_disable ) {
694
- bridge -> funcs -> post_disable (bridge );
695
- }
696
- }
697
-
698
694
/**
699
695
* drm_atomic_bridge_chain_post_disable - cleans up after disabling all bridges
700
696
* in the encoder chain
@@ -705,85 +701,37 @@ static void drm_atomic_bridge_call_post_disable(struct drm_bridge *bridge,
705
701
* &drm_bridge_funcs.post_disable) op for all the bridges in the encoder chain,
706
702
* starting from the first bridge to the last. These are called after completing
707
703
* &drm_encoder_helper_funcs.atomic_disable
708
- * If a bridge sets @pre_enable_upstream_first, then the @post_disable for that
709
- * bridge will be called before the previous one to reverse the @pre_enable
710
- * calling direction.
711
704
*
712
705
* Note: the bridge passed should be the one closest to the encoder
713
706
*/
714
707
void drm_atomic_bridge_chain_post_disable (struct drm_bridge * bridge ,
715
708
struct drm_atomic_state * old_state )
716
709
{
717
710
struct drm_encoder * encoder ;
718
- struct drm_bridge * next , * limit ;
719
711
720
712
if (!bridge )
721
713
return ;
722
714
723
715
encoder = bridge -> encoder ;
724
-
725
716
list_for_each_entry_from (bridge , & encoder -> bridge_chain , chain_node ) {
726
- limit = NULL ;
727
-
728
- if (!list_is_last (& bridge -> chain_node , & encoder -> bridge_chain )) {
729
- next = list_next_entry (bridge , chain_node );
730
-
731
- if (next -> pre_enable_upstream_first ) {
732
- /* Downstream bridge had requested that upstream
733
- * was enabled first, so disabled last
734
- */
735
- limit = next ;
736
-
737
- /* Find the next bridge that has NOT requested
738
- * upstream to be enabled first / disabled last
739
- */
740
- list_for_each_entry_from (next , & encoder -> bridge_chain ,
741
- chain_node ) {
742
- if (next -> pre_enable_upstream_first ) {
743
- next = list_prev_entry (next , chain_node );
744
- limit = next ;
745
- break ;
746
- }
747
- }
748
-
749
- /* Call these bridges in reverse order */
750
- list_for_each_entry_from_reverse (next , & encoder -> bridge_chain ,
751
- chain_node ) {
752
- if (next == bridge )
753
- break ;
754
-
755
- drm_atomic_bridge_call_post_disable (next ,
756
- old_state );
757
- }
758
- }
759
- }
717
+ if (bridge -> funcs -> atomic_post_disable ) {
718
+ struct drm_bridge_state * old_bridge_state ;
760
719
761
- drm_atomic_bridge_call_post_disable (bridge , old_state );
720
+ old_bridge_state =
721
+ drm_atomic_get_old_bridge_state (old_state ,
722
+ bridge );
723
+ if (WARN_ON (!old_bridge_state ))
724
+ return ;
762
725
763
- if (limit )
764
- bridge = limit ;
726
+ bridge -> funcs -> atomic_post_disable (bridge ,
727
+ old_bridge_state );
728
+ } else if (bridge -> funcs -> post_disable ) {
729
+ bridge -> funcs -> post_disable (bridge );
730
+ }
765
731
}
766
732
}
767
733
EXPORT_SYMBOL (drm_atomic_bridge_chain_post_disable );
768
734
769
- static void drm_atomic_bridge_call_pre_enable (struct drm_bridge * bridge ,
770
- struct drm_atomic_state * old_state )
771
- {
772
- if (old_state && bridge -> funcs -> atomic_pre_enable ) {
773
- struct drm_bridge_state * old_bridge_state ;
774
-
775
- old_bridge_state =
776
- drm_atomic_get_old_bridge_state (old_state ,
777
- bridge );
778
- if (WARN_ON (!old_bridge_state ))
779
- return ;
780
-
781
- bridge -> funcs -> atomic_pre_enable (bridge , old_bridge_state );
782
- } else if (bridge -> funcs -> pre_enable ) {
783
- bridge -> funcs -> pre_enable (bridge );
784
- }
785
- }
786
-
787
735
/**
788
736
* drm_atomic_bridge_chain_pre_enable - prepares for enabling all bridges in
789
737
* the encoder chain
@@ -795,61 +743,32 @@ static void drm_atomic_bridge_call_pre_enable(struct drm_bridge *bridge,
795
743
* starting from the last bridge to the first. These are called before calling
796
744
* &drm_encoder_helper_funcs.atomic_enable
797
745
*
798
- * If a bridge sets @pre_enable_upstream_first, then the pre_enable for the
799
- * upstream bridge will be called before pre_enable of this bridge.
800
- *
801
746
* Note: the bridge passed should be the one closest to the encoder
802
747
*/
803
748
void drm_atomic_bridge_chain_pre_enable (struct drm_bridge * bridge ,
804
749
struct drm_atomic_state * old_state )
805
750
{
806
751
struct drm_encoder * encoder ;
807
- struct drm_bridge * iter , * next , * limit ;
752
+ struct drm_bridge * iter ;
808
753
809
754
if (!bridge )
810
755
return ;
811
756
812
757
encoder = bridge -> encoder ;
813
-
814
758
list_for_each_entry_reverse (iter , & encoder -> bridge_chain , chain_node ) {
815
- if (iter -> pre_enable_upstream_first ) {
816
- next = iter ;
817
- limit = bridge ;
818
- list_for_each_entry_from_reverse (next ,
819
- & encoder -> bridge_chain ,
820
- chain_node ) {
821
- if (next == bridge )
822
- break ;
823
-
824
- if (!next -> pre_enable_upstream_first ) {
825
- /* Found first bridge that does NOT
826
- * request upstream to be enabled first
827
- */
828
- limit = list_prev_entry (next , chain_node );
829
- break ;
830
- }
831
- }
832
-
833
- list_for_each_entry_from (next , & encoder -> bridge_chain , chain_node ) {
834
- /* Call requested upstream bridge pre_enable
835
- * in order.
836
- */
837
- if (next == iter )
838
- /* At the first bridgge to request upstream
839
- * bridges called first.
840
- */
841
- break ;
842
-
843
- drm_atomic_bridge_call_pre_enable (next , old_state );
844
- }
845
- }
759
+ if (iter -> funcs -> atomic_pre_enable ) {
760
+ struct drm_bridge_state * old_bridge_state ;
846
761
847
- drm_atomic_bridge_call_pre_enable (iter , old_state );
762
+ old_bridge_state =
763
+ drm_atomic_get_old_bridge_state (old_state ,
764
+ iter );
765
+ if (WARN_ON (!old_bridge_state ))
766
+ return ;
848
767
849
- if ( iter -> pre_enable_upstream_first )
850
- /* Jump all bridges that we have already pre_enabled
851
- */
852
- iter = limit ;
768
+ iter -> funcs -> atomic_pre_enable ( iter , old_bridge_state );
769
+ } else if ( iter -> funcs -> pre_enable ) {
770
+ iter -> funcs -> pre_enable ( iter );
771
+ }
853
772
854
773
if (iter == bridge )
855
774
break ;
0 commit comments