|
@@ -549,6 +549,65 @@ int nvmem_unregister(struct nvmem_device *nvmem)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(nvmem_unregister);
|
|
|
|
|
|
+static void devm_nvmem_release(struct device *dev, void *res)
|
|
|
+{
|
|
|
+ WARN_ON(nvmem_unregister(*(struct nvmem_device **)res));
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * devm_nvmem_register() - Register a managed nvmem device for given
|
|
|
+ * nvmem_config.
|
|
|
+ * Also creates an binary entry in /sys/bus/nvmem/devices/dev-name/nvmem
|
|
|
+ *
|
|
|
+ * @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(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);
|
|
|
+
|
|
|
+ nvmem = nvmem_register(config);
|
|
|
+
|
|
|
+ if (!IS_ERR(nvmem)) {
|
|
|
+ *ptr = nvmem;
|
|
|
+ devres_add(dev, ptr);
|
|
|
+ } else {
|
|
|
+ devres_free(ptr);
|
|
|
+ }
|
|
|
+
|
|
|
+ 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.
|
|
|
+ *
|
|
|
+ * @nvmem: Pointer to previously registered nvmem device.
|
|
|
+ *
|
|
|
+ * Return: Will be an negative on error or a 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(struct device_node *np,
|
|
|
struct nvmem_cell **cellp,
|
|
|
const char *cell_id)
|