Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1657057 > unrolled thread
| Started by | Heiner Kallweit <hkallweit1@gmail.com> |
|---|---|
| First post | 2017-06-04 13:10 +0200 |
| Last post | 2017-06-07 18:20 +0200 |
| Articles | 2 — 2 participants |
Back to article view | Back to linux.kernel
[PATCH] nvmem: core: add managed version of nvmem_register Heiner Kallweit <hkallweit1@gmail.com> - 2017-06-04 13:10 +0200
Re: [PATCH] nvmem: core: add managed version of nvmem_register Srinivas Kandagatla <srinivas.kandagatla@linaro.org> - 2017-06-07 18:20 +0200
| From | Heiner Kallweit <hkallweit1@gmail.com> |
|---|---|
| Date | 2017-06-04 13:10 +0200 |
| Subject | [PATCH] nvmem: core: add managed version of nvmem_register |
| Message-ID | <tOBzX-4bP-9@gated-at.bofh.it> |
Add a device-managed version of nvmem_register.
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
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
[toc] | [next] | [standalone]
| From | Srinivas Kandagatla <srinivas.kandagatla@linaro.org> |
|---|---|
| Date | 2017-06-07 18:20 +0200 |
| Message-ID | <tPLQC-wa-31@gated-at.bofh.it> |
| In reply to | #1657057 |
On 04/06/17 12:06, Heiner Kallweit wrote:
> Add a device-managed version of nvmem_register.
>
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
> ---
> Documentation/nvmem/nvmem.txt | 1 +
> drivers/nvmem/core.c | 35 +++++++++++++++++++++++++++++++++++
> include/linux/nvmem-provider.h | 7 +++++++
> 3 files changed, 43 insertions(+)
>
Thanks for the patch, one comments..
> 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);
nvmem_unregister() can fail, how are you going to deal with this error
cases?
> +}
> +
> +/**
> + * 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)
For consistency reasons, devm versions of apis should always have dev at
as first argument.
> +{
> + 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);
> +
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web