]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/bridge: waveshare-dsi: Register and attach our DSI device at probe
authorMarek Vasut <marek.vasut+renesas@mailbox.org>
Fri, 6 Feb 2026 12:57:53 +0000 (13:57 +0100)
committerLuca Ceresoli <luca.ceresoli@bootlin.com>
Tue, 3 Mar 2026 08:11:14 +0000 (09:11 +0100)
In order to avoid any probe ordering issue, the best practice is to move
the secondary MIPI-DSI device registration and attachment to the
MIPI-DSI host at probe time.

Besides solving the probe ordering problems, this makes the bridge work
with R-Car DU. The R-Car DU will attempt to locate the DSI host bridge in
its own rcar_du_probe()->rcar_du_modeset_init()->rcar_du_encoder_init()
by calling of_drm_find_bridge() which calls of_drm_find_and_get_bridge()
and iterates over bridge_list to locate the DSI host bridge.

However, unless the WS driver calls mipi_dsi_attach() in probe(), the
DSI host bridge .attach callback rcar_mipi_dsi_host_attach() is not
called and the DSI host bridge is not added into bridge_list. Therefore
the of_drm_find_and_get_bridge() called from du_probe() will never find
the DSI host bridge and probe will indefinitelly fail with -EPROBE_DEFER.

The circular dependency here is, that if rcar_du_encoder_init() would
manage to find the DSI host bridge, it would call the WS driver .attach
callback ws_bridge_bridge_attach(), but this is too late and can never
happen. This change avoids the circular dependency.

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
Link: https://patch.msgid.link/20260206125801.78705-1-marek.vasut+renesas@mailbox.org
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
drivers/gpu/drm/bridge/waveshare-dsi.c

index 43f4e7412d722281d66b8776aa726a320bc4f7c8..9254446f54958d2ba5a1ee1f3e0b0332efad8fc1 100644 (file)
@@ -80,11 +80,6 @@ static int ws_bridge_bridge_attach(struct drm_bridge *bridge,
                                   enum drm_bridge_attach_flags flags)
 {
        struct ws_bridge *ws = bridge_to_ws_bridge(bridge);
-       int ret;
-
-       ret = ws_bridge_attach_dsi(ws);
-       if (ret)
-               return ret;
 
        return drm_bridge_attach(encoder, ws->next_bridge,
                                 &ws->bridge, flags);
@@ -179,7 +174,7 @@ static int ws_bridge_probe(struct i2c_client *i2c)
        ws->bridge.of_node = dev->of_node;
        devm_drm_bridge_add(dev, &ws->bridge);
 
-       return 0;
+       return ws_bridge_attach_dsi(ws);
 }
 
 static const struct of_device_id ws_bridge_of_ids[] = {