nvmem_register() stores config->of_node (or config->dev->of_node) into nvmem->dev.of_node without taking its own reference. Callers that get the node via of_get_compatible_child() etc. and drop their reference right after registering leave nvmem->dev.of_node backed by no reference at all. Take an of_node_get() when assigning nvmem->dev.of_node and release it in nvmem_release(). Existing callers that hold their own get/put pair around the registration call need no changes, since get/put on a device_node is per-holder and independent of core now also holding one. Reviewed-by: Miquel Raynal Reviewed-by: Michael Walle Suggested-by: Michael Walle Signed-off-by: Manikandan Muralidharan --- drivers/nvmem/core.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index 7d4cce8e2742..2e07f95de7ff 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -571,6 +571,7 @@ static void nvmem_release(struct device *dev) nvmem_device_remove_all_cells(nvmem); ida_free(&nvmem_ida, nvmem->id); cleanup_srcu_struct(&nvmem->srcu); + of_node_put(nvmem->dev.of_node); kfree(nvmem); } @@ -973,9 +974,9 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) nvmem->keepout = config->keepout; nvmem->nkeepout = config->nkeepout; if (config->of_node) - nvmem->dev.of_node = config->of_node; + nvmem->dev.of_node = of_node_get(config->of_node); else - nvmem->dev.of_node = config->dev->of_node; + nvmem->dev.of_node = of_node_get(config->dev->of_node); switch (config->id) { case NVMEM_DEVID_NONE: -- 2.43.0