mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
drm/bridge: waveshare-dsi: Register and attach our DSI device at probe
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>
This commit is contained in:
parent
abdcd4c358
commit
b8eb97ead8
|
|
@ -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[] = {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user