{
struct samsung_dsim *dsi = host_to_dsi(host);
const struct samsung_dsim_plat_data *pdata = dsi->plat_data;
+ struct drm_bridge *next_bridge;
struct device *dev = dsi->dev;
struct device_node *np = dev->of_node;
struct device_node *remote;
panel = of_drm_find_panel(remote);
if (!IS_ERR(panel)) {
- dsi->out_bridge = devm_drm_panel_bridge_add(dev, panel);
+ next_bridge = devm_drm_panel_bridge_add(dev, panel);
} else {
- dsi->out_bridge = of_drm_find_bridge(remote);
- if (!dsi->out_bridge)
- dsi->out_bridge = ERR_PTR(-EINVAL);
+ next_bridge = of_drm_find_bridge(remote);
+ if (!next_bridge)
+ next_bridge = ERR_PTR(-EINVAL);
}
of_node_put(remote);
- if (IS_ERR(dsi->out_bridge)) {
- ret = PTR_ERR(dsi->out_bridge);
+ if (IS_ERR(next_bridge)) {
+ ret = PTR_ERR(next_bridge);
DRM_DEV_ERROR(dev, "failed to find the bridge: %d\n", ret);
return ret;
}
return ret;
}
+ // The next bridge can be used by host_ops->attach
+ dsi->out_bridge = next_bridge;
+
if (pdata->host_ops && pdata->host_ops->attach) {
ret = pdata->host_ops->attach(dsi, device);
if (ret)
- return ret;
+ goto err_release_next_bridge;
}
dsi->lanes = device->lanes;
dsi->mode_flags = device->mode_flags;
return 0;
+
+err_release_next_bridge:
+ dsi->out_bridge = NULL;
+ return ret;
}
static void samsung_dsim_unregister_te_irq(struct samsung_dsim *dsi)
struct samsung_dsim *dsi = host_to_dsi(host);
const struct samsung_dsim_plat_data *pdata = dsi->plat_data;
- dsi->out_bridge = NULL;
-
if (pdata->host_ops && pdata->host_ops->detach)
pdata->host_ops->detach(dsi, device);
+ dsi->out_bridge = NULL;
+
samsung_dsim_unregister_te_irq(dsi);
drm_bridge_remove(&dsi->bridge);