|
@@ -258,6 +258,45 @@ err:
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(regmap_init);
|
|
EXPORT_SYMBOL_GPL(regmap_init);
|
|
|
|
|
|
|
|
+static void devm_regmap_release(struct device *dev, void *res)
|
|
|
|
+{
|
|
|
|
+ regmap_exit(*(struct regmap **)res);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * devm_regmap_init(): Initialise managed register map
|
|
|
|
+ *
|
|
|
|
+ * @dev: Device that will be interacted with
|
|
|
|
+ * @bus: Bus-specific callbacks to use with device
|
|
|
|
+ * @config: Configuration for register map
|
|
|
|
+ *
|
|
|
|
+ * The return value will be an ERR_PTR() on error or a valid pointer
|
|
|
|
+ * to a struct regmap. This function should generally not be called
|
|
|
|
+ * directly, it should be called by bus-specific init functions. The
|
|
|
|
+ * map will be automatically freed by the device management code.
|
|
|
|
+ */
|
|
|
|
+struct regmap *devm_regmap_init(struct device *dev,
|
|
|
|
+ const struct regmap_bus *bus,
|
|
|
|
+ const struct regmap_config *config)
|
|
|
|
+{
|
|
|
|
+ struct regmap **ptr, *regmap;
|
|
|
|
+
|
|
|
|
+ ptr = devres_alloc(devm_regmap_release, sizeof(*ptr), GFP_KERNEL);
|
|
|
|
+ if (!ptr)
|
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
+
|
|
|
|
+ regmap = regmap_init(dev, bus, config);
|
|
|
|
+ if (!IS_ERR(regmap)) {
|
|
|
|
+ *ptr = regmap;
|
|
|
|
+ devres_add(dev, ptr);
|
|
|
|
+ } else {
|
|
|
|
+ devres_free(ptr);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return regmap;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(devm_regmap_init);
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* regmap_reinit_cache(): Reinitialise the current register cache
|
|
* regmap_reinit_cache(): Reinitialise the current register cache
|
|
*
|
|
*
|