of: reserved_mem: Introduce devres-managed initialization function

Introduce devres-based helper for of_reserved_mem_device_init()
to help fight dangling references and ever so slightly reduce the
number of boilerplate deinitialization calls.

Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Mukesh Ojha <mukesh.ojha@oss.qualcomm.com>
Link: https://patch.msgid.link/20260730073214.1146432-1-mukesh.ojha@oss.qualcomm.com
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
This commit is contained in:
Konrad Dybcio
2026-07-30 13:02:14 +05:30
committed by Rob Herring (Arm)
parent f423482666
commit b71ace1a00
2 changed files with 51 additions and 0 deletions

View File

@@ -788,6 +788,50 @@ void of_reserved_mem_device_release(struct device *dev)
}
EXPORT_SYMBOL_GPL(of_reserved_mem_device_release);
static void devm_of_reserved_mem_device_release(struct device *dev, void *res)
{
of_reserved_mem_device_release(*(struct device **)res);
}
static int devm_of_reserved_mem_device_init_by_idx(struct device *dev,
struct device_node *np, int idx)
{
struct device **ptr;
int ret;
ptr = devres_alloc(devm_of_reserved_mem_device_release, sizeof(*ptr),
GFP_KERNEL);
if (!ptr)
return -ENOMEM;
ret = of_reserved_mem_device_init_by_idx(dev, np, idx);
if (ret) {
devres_free(ptr);
return ret;
}
*ptr = dev;
devres_add(dev, ptr);
return 0;
}
/**
* devm_of_reserved_mem_device_init() - Resource managed of_reserved_mem_device_init()
* @dev: Pointer to the device to configure
*
* This is a resource managed version of of_reserved_mem_device_init().
* The reserved memory region will be released automatically when the device
* is unbound.
*
* Returns: Negative errno on failure or zero on success.
*/
int devm_of_reserved_mem_device_init(struct device *dev)
{
return devm_of_reserved_mem_device_init_by_idx(dev, dev->of_node, 0);
}
EXPORT_SYMBOL_GPL(devm_of_reserved_mem_device_init);
/**
* of_reserved_mem_lookup() - acquire reserved_mem from a device node
* @np: node pointer of the desired reserved-memory region

View File

@@ -40,6 +40,8 @@ int of_reserved_mem_device_init_by_name(struct device *dev,
const char *name);
void of_reserved_mem_device_release(struct device *dev);
int devm_of_reserved_mem_device_init(struct device *dev);
struct reserved_mem *of_reserved_mem_lookup(struct device_node *np);
int of_reserved_mem_region_to_resource(const struct device_node *np,
unsigned int idx, struct resource *res);
@@ -68,6 +70,11 @@ static inline int of_reserved_mem_device_init_by_name(struct device *dev,
static inline void of_reserved_mem_device_release(struct device *pdev) { }
static inline int devm_of_reserved_mem_device_init(struct device *dev)
{
return -EOPNOTSUPP;
}
static inline struct reserved_mem *of_reserved_mem_lookup(struct device_node *np)
{
return NULL;