drm/bridge: Add a devm_ allocator for panel bridge.
authorEric Anholt <eric@anholt.net>
Tue, 18 Jul 2017 21:05:06 +0000 (14:05 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 26 Jul 2017 19:19:47 +0000 (12:19 -0700)
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
drivers/gpu/drm/bridge/panel.c
include/drm/drm_bridge.h

index 685c1a480201f101a282f70d60119fcab0543c7e..292ee92a9c97b754ea98ea931d20715d4c1517cb 100644 (file)
@@ -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);
index 1dc94d5392e27d6abd6f0f7b4ad2fd8b5ecad975..6522d4cbc9d9d7426728198024ce44aa622f2b32 100644 (file)
@@ -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