drm/bridge: Add a devm_ allocator for panel bridge.
This will let drivers reduce the error cleanup they need, in particular the "is_panel_bridge" flag. v2: Slight cleanup of remove function by Andrzej Signed-off-by: Eric Anholt <eric@anholt.net> Reviewed-by: Andrzej Hajda <a.hajda@samsung.com> Reviewed-by: Philippe Cornu <philippe.cornu@st.com> Tested-by: Philippe Cornu <philippe.cornu@st.com> Link: https://patchwork.freedesktop.org/patch/msgid/20170718210510.12229-2-eric@anholt.net
This commit is contained in:
Родитель
15b4511a4a
Коммит
67022227ff
|
@ -195,3 +195,33 @@ void drm_panel_bridge_remove(struct drm_bridge *bridge)
|
|||
devm_kfree(panel_bridge->panel->dev, bridge);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_panel_bridge_remove);
|
||||
|
||||
static void devm_drm_panel_bridge_release(struct device *dev, void *res)
|
||||
{
|
||||
struct drm_bridge **bridge = res;
|
||||
|
||||
drm_panel_bridge_remove(*bridge);
|
||||
}
|
||||
|
||||
struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
|
||||
struct drm_panel *panel,
|
||||
u32 connector_type)
|
||||
{
|
||||
struct drm_bridge **ptr, *bridge;
|
||||
|
||||
ptr = devres_alloc(devm_drm_panel_bridge_release, sizeof(*ptr),
|
||||
GFP_KERNEL);
|
||||
if (!ptr)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
bridge = drm_panel_bridge_add(panel, connector_type);
|
||||
if (!IS_ERR(bridge)) {
|
||||
*ptr = bridge;
|
||||
devres_add(dev, ptr);
|
||||
} else {
|
||||
devres_free(ptr);
|
||||
}
|
||||
|
||||
return bridge;
|
||||
}
|
||||
EXPORT_SYMBOL(devm_drm_panel_bridge_add);
|
||||
|
|
|
@ -268,6 +268,9 @@ void drm_bridge_enable(struct drm_bridge *bridge);
|
|||
struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel,
|
||||
u32 connector_type);
|
||||
void drm_panel_bridge_remove(struct drm_bridge *bridge);
|
||||
struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
|
||||
struct drm_panel *panel,
|
||||
u32 connector_type);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
Загрузка…
Ссылка в новой задаче