}
 EXPORT_SYMBOL(of_drm_find_panel);
 
+void *__devm_drm_panel_alloc(struct device *dev, size_t size, size_t offset,
+                            const struct drm_panel_funcs *funcs,
+                            int connector_type)
+{
+       void *container;
+       struct drm_panel *panel;
+
+       if (!funcs) {
+               dev_warn(dev, "Missing funcs pointer\n");
+               return ERR_PTR(-EINVAL);
+       }
+
+       container = devm_kzalloc(dev, size, GFP_KERNEL);
+       if (!container)
+               return ERR_PTR(-ENOMEM);
+
+       panel = container + offset;
+       panel->funcs = funcs;
+
+       drm_panel_init(panel, dev, funcs, connector_type);
+
+       return container;
+}
+EXPORT_SYMBOL(__devm_drm_panel_alloc);
+
 /**
  * of_drm_get_panel_orientation - look up the orientation of the panel through
  * the "rotation" binding from a device tree node
 
        bool enabled;
 };
 
+void *__devm_drm_panel_alloc(struct device *dev, size_t size, size_t offset,
+                            const struct drm_panel_funcs *funcs,
+                            int connector_type);
+
+/**
+ * devm_drm_panel_alloc - Allocate and initialize a refcounted panel.
+ *
+ * @dev: struct device of the panel device
+ * @type: the type of the struct which contains struct &drm_panel
+ * @member: the name of the &drm_panel within @type
+ * @funcs: callbacks for this panel
+ * @connector_type: the connector type (DRM_MODE_CONNECTOR_*) corresponding to
+ * the panel interface
+ *
+ * Returns:
+ * Pointer to container structure embedding the panel, ERR_PTR on failure.
+ */
+#define devm_drm_panel_alloc(dev, type, member, funcs, connector_type) \
+       ((type *)__devm_drm_panel_alloc(dev, sizeof(type), \
+                                       offsetof(type, member), funcs, \
+                                       connector_type))
+
 void drm_panel_init(struct drm_panel *panel, struct device *dev,
                    const struct drm_panel_funcs *funcs,
                    int connector_type);