|
@@ -14,6 +14,8 @@
|
|
|
#include <dm/uclass-id.h>
|
|
|
#include <fdtdec.h>
|
|
|
#include <linker_lists.h>
|
|
|
+#include <linux/compat.h>
|
|
|
+#include <linux/kernel.h>
|
|
|
#include <linux/list.h>
|
|
|
|
|
|
struct driver_info;
|
|
@@ -605,4 +607,46 @@ int devres_destroy(struct udevice *dev, dr_release_t release,
|
|
|
int devres_release(struct udevice *dev, dr_release_t release,
|
|
|
dr_match_t match, void *match_data);
|
|
|
|
|
|
+/* managed devm_k.alloc/kfree for device drivers */
|
|
|
+/**
|
|
|
+ * devm_kmalloc - Resource-managed kmalloc
|
|
|
+ * @dev: Device to allocate memory for
|
|
|
+ * @size: Allocation size
|
|
|
+ * @gfp: Allocation gfp flags
|
|
|
+ *
|
|
|
+ * Managed kmalloc. Memory allocated with this function is
|
|
|
+ * automatically freed on driver detach. Like all other devres
|
|
|
+ * resources, guaranteed alignment is unsigned long long.
|
|
|
+ *
|
|
|
+ * RETURNS:
|
|
|
+ * Pointer to allocated memory on success, NULL on failure.
|
|
|
+ */
|
|
|
+void *devm_kmalloc(struct udevice *dev, size_t size, gfp_t gfp);
|
|
|
+static inline void *devm_kzalloc(struct udevice *dev, size_t size, gfp_t gfp)
|
|
|
+{
|
|
|
+ return devm_kmalloc(dev, size, gfp | __GFP_ZERO);
|
|
|
+}
|
|
|
+static inline void *devm_kmalloc_array(struct udevice *dev,
|
|
|
+ size_t n, size_t size, gfp_t flags)
|
|
|
+{
|
|
|
+ if (size != 0 && n > SIZE_MAX / size)
|
|
|
+ return NULL;
|
|
|
+ return devm_kmalloc(dev, n * size, flags);
|
|
|
+}
|
|
|
+static inline void *devm_kcalloc(struct udevice *dev,
|
|
|
+ size_t n, size_t size, gfp_t flags)
|
|
|
+{
|
|
|
+ return devm_kmalloc_array(dev, n, size, flags | __GFP_ZERO);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * devm_kfree - Resource-managed kfree
|
|
|
+ * @dev: Device this memory belongs to
|
|
|
+ * @p: Memory to free
|
|
|
+ *
|
|
|
+ * Free memory allocated with devm_kmalloc().
|
|
|
+ */
|
|
|
+void devm_kfree(struct udevice *dev, void *p);
|
|
|
+
|
|
|
+
|
|
|
#endif
|