From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751181AbdFDLGr (ORCPT ); Sun, 4 Jun 2017 07:06:47 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:35689 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751027AbdFDLGl (ORCPT ); Sun, 4 Jun 2017 07:06:41 -0400 To: Srinivas Kandagatla Cc: Linux Kernel Mailing List From: Heiner Kallweit Subject: [PATCH] nvmem: core: add managed version of nvmem_register Message-ID: <36f1f675-fe7c-fc6a-78ae-adc42a23e403@gmail.com> Date: Sun, 4 Jun 2017 13:06:29 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.1.1 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add a device-managed version of nvmem_register. Signed-off-by: Heiner Kallweit --- Documentation/nvmem/nvmem.txt | 1 + drivers/nvmem/core.c | 35 +++++++++++++++++++++++++++++++++++ include/linux/nvmem-provider.h | 7 +++++++ 3 files changed, 43 insertions(+) diff --git a/Documentation/nvmem/nvmem.txt b/Documentation/nvmem/nvmem.txt index dbd40d87..b4ff7862 100644 --- a/Documentation/nvmem/nvmem.txt +++ b/Documentation/nvmem/nvmem.txt @@ -37,6 +37,7 @@ and write the non-volatile memory. A NVMEM provider can register with NVMEM core by supplying relevant nvmem configuration to nvmem_register(), on success core would return a valid nvmem_device pointer. +devm_nvmem_register() is a device-managed version of nvmem_register. nvmem_unregister(nvmem) is used to unregister a previously registered provider. diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index 783eb431..55db219f 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -531,6 +531,41 @@ int nvmem_unregister(struct nvmem_device *nvmem) } EXPORT_SYMBOL_GPL(nvmem_unregister); +static void devm_nvmem_release(struct device *dev, void *res) +{ + nvmem_unregister(*(struct nvmem_device **)res); +} + +/** + * devm_nvmem_register() - managed version of nvmem_register + * + * @config: nvmem device configuration with which nvmem device is created. + * + * Return: Will be an ERR_PTR() on error or a valid pointer to nvmem_device + * on success. + */ + +struct nvmem_device *devm_nvmem_register(const struct nvmem_config *config) +{ + struct nvmem_device *nv, **dr; + + dr = devres_alloc(devm_nvmem_release, sizeof(*dr), GFP_KERNEL); + if (!dr) + return ERR_PTR(-ENOMEM); + + nv = nvmem_register(config); + if (IS_ERR(nv)) { + devres_free(dr); + return nv; + } + + *dr = nv; + devres_add(config->dev, dr); + + return nv; +} +EXPORT_SYMBOL_GPL(devm_nvmem_register); + static struct nvmem_device *__nvmem_device_get(struct device_node *np, struct nvmem_cell **cellp, const char *cell_id) diff --git a/include/linux/nvmem-provider.h b/include/linux/nvmem-provider.h index cd93416d..4b92066d 100644 --- a/include/linux/nvmem-provider.h +++ b/include/linux/nvmem-provider.h @@ -42,6 +42,7 @@ struct nvmem_config { #if IS_ENABLED(CONFIG_NVMEM) struct nvmem_device *nvmem_register(const struct nvmem_config *cfg); +struct nvmem_device *devm_nvmem_register(const struct nvmem_config *cfg); int nvmem_unregister(struct nvmem_device *nvmem); #else @@ -51,6 +52,12 @@ static inline struct nvmem_device *nvmem_register(const struct nvmem_config *c) return ERR_PTR(-ENOSYS); } +static inline struct nvmem_device * + devm_nvmem_register(const struct nvmem_config *c) +{ + return ERR_PTR(-ENOSYS); +} + static inline int nvmem_unregister(struct nvmem_device *nvmem) { return -ENOSYS; -- 2.13.0