Merge 5.17-rc6 into char-misc-next
[linux-2.6-microblaze.git] / drivers / nvmem / core.c
index 9fd1602..f58d9bc 100644 (file)
@@ -903,13 +903,14 @@ static void nvmem_device_release(struct kref *kref)
  */
 void nvmem_unregister(struct nvmem_device *nvmem)
 {
-       kref_put(&nvmem->refcnt, nvmem_device_release);
+       if (nvmem)
+               kref_put(&nvmem->refcnt, nvmem_device_release);
 }
 EXPORT_SYMBOL_GPL(nvmem_unregister);
 
-static void devm_nvmem_release(struct device *dev, void *res)
+static void devm_nvmem_unregister(void *nvmem)
 {
-       nvmem_unregister(*(struct nvmem_device **)res);
+       nvmem_unregister(nvmem);
 }
 
 /**
@@ -926,47 +927,21 @@ static void devm_nvmem_release(struct device *dev, void *res)
 struct nvmem_device *devm_nvmem_register(struct device *dev,
                                         const struct nvmem_config *config)
 {
-       struct nvmem_device **ptr, *nvmem;
-
-       ptr = devres_alloc(devm_nvmem_release, sizeof(*ptr), GFP_KERNEL);
-       if (!ptr)
-               return ERR_PTR(-ENOMEM);
+       struct nvmem_device *nvmem;
+       int ret;
 
        nvmem = nvmem_register(config);
+       if (IS_ERR(nvmem))
+               return nvmem;
 
-       if (!IS_ERR(nvmem)) {
-               *ptr = nvmem;
-               devres_add(dev, ptr);
-       } else {
-               devres_free(ptr);
-       }
+       ret = devm_add_action_or_reset(dev, devm_nvmem_unregister, nvmem);
+       if (ret)
+               return ERR_PTR(ret);
 
        return nvmem;
 }
 EXPORT_SYMBOL_GPL(devm_nvmem_register);
 
-static int devm_nvmem_match(struct device *dev, void *res, void *data)
-{
-       struct nvmem_device **r = res;
-
-       return *r == data;
-}
-
-/**
- * devm_nvmem_unregister() - Unregister previously registered managed nvmem
- * device.
- *
- * @dev: Device that uses the nvmem device.
- * @nvmem: Pointer to previously registered nvmem device.
- *
- * Return: Will be negative on error or zero on success.
- */
-int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem)
-{
-       return devres_release(dev, devm_nvmem_release, devm_nvmem_match, nvmem);
-}
-EXPORT_SYMBOL(devm_nvmem_unregister);
-
 static struct nvmem_device *__nvmem_device_get(void *data,
                        int (*match)(struct device *dev, const void *data))
 {