Hi,

On 10/10/2025 7:42 AM, Heiko Stübner wrote:
Hi Dmitry,

Am Freitag, 10. Oktober 2025, 00:30:11 Mitteleuropäische Sommerzeit schrieb 
Dmitry Baryshkov:
On Thu, Oct 09, 2025 at 09:30:28PM +0200, Heiko Stuebner wrote:
Right now if there is a next bridge attached to the analogix-dp controller
the driver always assumes this bridge is connected to something, but this
is of course not always true, as that bridge could also be a hotpluggable
dp port for example.

On the other hand, as stated in commit cb640b2ca546 ("drm/bridge: display-
connector: don't set OP_DETECT for DisplayPorts"), "Detecting the monitor
for DisplayPort targets is more complicated than just reading the HPD pin
level" and we should be "letting the actual DP driver perform detection."

So use drm_bridge_detect() to detect the next bridge's state but ignore
that bridge if the analogix-dp is handling the hpd-gpio.

Signed-off-by: Heiko Stuebner <[email protected]>
---
As this patch stands, it would go on top of v6 of Damon's bridge-connector
work, but could very well be also integrated into one of the changes there.

I don't know yet if my ordering and/or reasoning is the correct one or if
a better handling could be done, but with that change I do get a nice
hotplug behaviour on my rk3588-tiger-dp-carrier board, where the
Analogix-DP ends in a full size DP port.

  drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 8 ++++++--
  1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c 
b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index c04b5829712b..cdc56e83b576 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -983,8 +983,12 @@ analogix_dp_bridge_detect(struct drm_bridge *bridge, 
struct drm_connector *conne
        struct analogix_dp_device *dp = to_dp(bridge);
        enum drm_connector_status status = connector_status_disconnected;
- if (dp->plat_data->next_bridge)
-               return connector_status_connected;
+       /*
+        * An optional next bridge should be in charge of detection the
+        * connection status, except if we manage a actual hpd gpio.
+        */
+       if (dp->plat_data->next_bridge && !dp->hpd_gpiod)
+               return drm_bridge_detect(dp->plat_data->next_bridge, connector);

I have tried to use the drm_bridge_detect() API to do this as simple-bridge driver, but it does not work well for bridges that do not declare OP_DETECT.

Take nxp-ptn3460 as an example, the connected status will be treated as connector_status_unknown via the following call stack:

drm_helper_probe_single_connector_modes()
  -> drm_helper_probe_detect()
     -> drm_bridge_connector_detect()
        -> analogix_dp_bridge_detect()
           -> drm_bridge_detect()
              -> return connector_status_unknown due to !OP_DETECT

However, the connected status will be connector_status_connected as expected if Analogix DP does not declare OP_DETECT[0]:

drm_helper_probe_single_connector_modes()
  -> drm_helper_probe_detect()
     -> drm_bridge_connector_detect()
        -> return connector_status_connected due to CONNECTOR_LVDS

Base on Andy's commit 5d156a9c3d5e ("drm/bridge: Pass down connector to drm bridge detect hook"), the drm_connector becomes available in drm_bridge_detect().

It may be better to unify the logic of drm_bridge_detect() and drm_bridge_connector_detect(), which sets the connected status according to the connector_type. Then the codes will be more reasonable and become similar to the simple-bridge demo via 'drm_bridge_detect(dp->plat_data->next_bridge, connector)'.

But we still need a specific check for DP-connector to resolve this issue. The '!dp->hpd_gpiod' may not be well-considered. Perhaps we could introduce a new API, similar to drm_bridge_is_panel(), called drm_bridge_is_display_connector()?


And it's also not correct because the next bridge might be a retimer
with the bridge next to it being a one with the actual detection
capabilities. drm_bridge_connector solves that in a much better way. See
the series at [1]

[1] 
https://lore.kernel.org/dri-devel/[email protected]/

Hence my comment above about that possibly not being the right variant.
Sort of asking for direction :-) .

I am working on top of Damon's drm-bridge-connector series as noted above,
but it looks like the detect function still is called at does then stuff.

My board is the rk3588-tiger-displayport-carrier [0], with a dp-connector
which is the next bridge, so _without_ any changes, the analogix-dp
always assumes "something" is connected and I end up with

[    9.869198] [drm:analogix_dp_bridge_atomic_enable] *ERROR* failed to get hpd 
single ret = -110
[    9.980422] [drm:analogix_dp_bridge_atomic_enable] *ERROR* failed to get hpd 
single ret = -110
[   10.091522] [drm:analogix_dp_bridge_atomic_enable] *ERROR* failed to get hpd 
single ret = -110
[   10.202419] [drm:analogix_dp_bridge_atomic_enable] *ERROR* failed to get hpd 
single ret = -110
[   10.313651] [drm:analogix_dp_bridge_atomic_enable] *ERROR* failed to get hpd 
single ret = -110

when no display is connected.

With this change I do get the expected hotplug behaviour, so something is
missing still even with the bridge-connector series.


Heiko


[0] v3: https://lore.kernel.org/r/[email protected]
     v4: https://lore.kernel.org/r/[email protected]
     (moved hpd-gpios from dp-connector back to analogix-dp per dp-connector
     being not able to detect dp-monitors)

if (!analogix_dp_detect_hpd(dp))
                status = connector_status_connected;





I see... There is also a way to leave the connected status check in Analogix DP bridge:

1.If the later bridge does not support HPD function, the 'force-hpd' property must be set under the DP DT node. The DT modifications may be
large by this way.
2.If the later bridge do support HPD function like the DP-connector, the
connected status detection method is GPIO HPD or functional pin HPD.

With the DT modifications for above 1, the analogix_dp_bridge_detect() can be simplified to:

static enum drm_connector_status
analogix_dp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{
        struct analogix_dp_device *dp = to_dp(bridge);
        enum drm_connector_status status = connector_status_disconnected;

        if (!analogix_dp_detect_hpd(dp))
                status = connector_status_connected;

        return status;
}

Best regards,
Damon

[0]https://lore.kernel.org/all/[email protected]/

Reply via email to