Skip to content

Commit e49f90c

Browse files
committed
Revert "drm/bridge: Introduce pre_enable_upstream_first to alter bridge init order"
This reverts commit 52fa9a4.
1 parent a3936e9 commit e49f90c

File tree

2 files changed

+48
-137
lines changed

2 files changed

+48
-137
lines changed

drivers/gpu/drm/drm_bridge.c

Lines changed: 48 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -547,15 +547,20 @@ EXPORT_SYMBOL(drm_bridge_chain_disable);
547547
* encoder chain, starting from the first bridge to the last. These are called
548548
* after completing the encoder's prepare op.
549549
*
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-
*
554550
* Note: the bridge passed should be the one closest to the encoder
555551
*/
556552
void drm_bridge_chain_post_disable(struct drm_bridge *bridge)
557553
{
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+
}
559564
}
560565
EXPORT_SYMBOL(drm_bridge_chain_post_disable);
561566

@@ -597,14 +602,24 @@ EXPORT_SYMBOL(drm_bridge_chain_mode_set);
597602
* chain, starting from the last bridge to the first. These are called
598603
* before calling the encoder's commit op.
599604
*
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-
*
603605
* Note: the bridge passed should be the one closest to the encoder
604606
*/
605607
void drm_bridge_chain_pre_enable(struct drm_bridge *bridge)
606608
{
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+
}
608623
}
609624
EXPORT_SYMBOL(drm_bridge_chain_pre_enable);
610625

@@ -676,25 +691,6 @@ void drm_atomic_bridge_chain_disable(struct drm_bridge *bridge,
676691
}
677692
EXPORT_SYMBOL(drm_atomic_bridge_chain_disable);
678693

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-
698694
/**
699695
* drm_atomic_bridge_chain_post_disable - cleans up after disabling all bridges
700696
* in the encoder chain
@@ -705,85 +701,37 @@ static void drm_atomic_bridge_call_post_disable(struct drm_bridge *bridge,
705701
* &drm_bridge_funcs.post_disable) op for all the bridges in the encoder chain,
706702
* starting from the first bridge to the last. These are called after completing
707703
* &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.
711704
*
712705
* Note: the bridge passed should be the one closest to the encoder
713706
*/
714707
void drm_atomic_bridge_chain_post_disable(struct drm_bridge *bridge,
715708
struct drm_atomic_state *old_state)
716709
{
717710
struct drm_encoder *encoder;
718-
struct drm_bridge *next, *limit;
719711

720712
if (!bridge)
721713
return;
722714

723715
encoder = bridge->encoder;
724-
725716
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;
760719

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;
762725

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+
}
765731
}
766732
}
767733
EXPORT_SYMBOL(drm_atomic_bridge_chain_post_disable);
768734

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-
787735
/**
788736
* drm_atomic_bridge_chain_pre_enable - prepares for enabling all bridges in
789737
* the encoder chain
@@ -795,61 +743,32 @@ static void drm_atomic_bridge_call_pre_enable(struct drm_bridge *bridge,
795743
* starting from the last bridge to the first. These are called before calling
796744
* &drm_encoder_helper_funcs.atomic_enable
797745
*
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-
*
801746
* Note: the bridge passed should be the one closest to the encoder
802747
*/
803748
void drm_atomic_bridge_chain_pre_enable(struct drm_bridge *bridge,
804749
struct drm_atomic_state *old_state)
805750
{
806751
struct drm_encoder *encoder;
807-
struct drm_bridge *iter, *next, *limit;
752+
struct drm_bridge *iter;
808753

809754
if (!bridge)
810755
return;
811756

812757
encoder = bridge->encoder;
813-
814758
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;
846761

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;
848767

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+
}
853772

854773
if (iter == bridge)
855774
break;

include/drm/drm_bridge.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -768,14 +768,6 @@ struct drm_bridge {
768768
* modes.
769769
*/
770770
bool interlace_allowed;
771-
/**
772-
* @pre_enable_upstream_first: The bridge requires that the upstream
773-
* bridge @pre_enable function is called before its @pre_enable,
774-
* and conversely for post_disable. This is most frequently a
775-
* requirement for DSI devices which need the host to be initialised
776-
* before the peripheral.
777-
*/
778-
bool pre_enable_upstream_first;
779771
/**
780772
* @ddc: Associated I2C adapter for DDC access, if any.
781773
*/

0 commit comments

Comments
 (0)