diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_encoder.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_encoder.c index d8e7e9877ba8..3f98eae9b6ac 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_encoder.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_encoder.c @@ -90,9 +90,22 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu, drm_bridge_get(bridge); if (output == RCAR_DU_OUTPUT_DSI0 || - output == RCAR_DU_OUTPUT_DSI1) + output == RCAR_DU_OUTPUT_DSI1) { + struct drm_bridge *dsi_bridge; + + /* + * When we have a DSC block between the DU and the DSI, + * the "bridge" points to the DSC. Detect the DSC by looking + * at the bridge type, and skip the DSC if the bridge is not + * the DSI bridge. + */ + + dsi_bridge = bridge->type == DRM_MODE_CONNECTOR_DSI ? + bridge : bridge->next_bridge; + rcdu->dsi[output - RCAR_DU_OUTPUT_DSI0] = - drm_bridge_get(bridge); + drm_bridge_get(dsi_bridge); + } } /* diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c b/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c index 6e46d6d99f3c..af4edb207486 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c @@ -957,6 +957,7 @@ static int rcar_mipi_dsi_host_attach(struct mipi_dsi_host *host, /* Initialize the DRM bridge. */ dsi->bridge.of_node = dsi->dev->of_node; + dsi->bridge.type = DRM_MODE_CONNECTOR_DSI; drm_bridge_add(&dsi->bridge); return 0;