struct mcde *mcde;
struct drm_bridge bridge;
struct drm_panel *panel;
- struct drm_bridge *bridge_out;
struct mipi_dsi_host dsi_host;
struct mipi_dsi_device *mdsi;
const struct drm_display_mode *mode;
}
/* Attach the DSI bridge to the output (panel etc) bridge */
- return drm_bridge_attach(encoder, d->bridge_out, bridge, flags);
+ return drm_bridge_attach(encoder, d->bridge.next_bridge, bridge, flags);
}
static const struct drm_bridge_funcs mcde_dsi_bridge_funcs = {
struct mcde_dsi *d = dev_get_drvdata(dev);
struct device_node *child;
struct drm_panel *panel = NULL;
- struct drm_bridge *bridge = NULL;
+ struct drm_bridge *bridge __free(drm_bridge_put) = NULL;
if (!of_get_available_child_count(dev->of_node)) {
dev_info(dev, "unused DSI interface\n");
PTR_ERR(panel));
panel = NULL;
- bridge = of_drm_find_bridge(child);
+ bridge = of_drm_find_and_get_bridge(child);
if (!bridge) {
dev_err(dev, "failed to find bridge\n");
of_node_put(child);
dev_err(dev, "error adding panel bridge\n");
return PTR_ERR(bridge);
}
+ drm_bridge_get(bridge);
dev_info(dev, "connected to panel\n");
d->panel = panel;
} else if (bridge) {
return -ENODEV;
}
- d->bridge_out = bridge;
+ d->bridge.next_bridge = drm_bridge_get(bridge);
/* Create a bridge for this DSI channel */
d->bridge.of_node = dev->of_node;
struct mcde_dsi *d = dev_get_drvdata(dev);
if (d->panel)
- drm_panel_bridge_remove(d->bridge_out);
+ drm_panel_bridge_remove(d->bridge.next_bridge);
regmap_update_bits(d->prcmu, PRCM_DSI_SW_RESET,
PRCM_DSI_SW_RESET_DSI0_SW_RESETN, 0);
}