diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-01-30 14:56:52 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-01-30 16:06:43 -0500 |
commit | c0eb46766d395da8d62148bda2e59bad5e6ee2f2 (patch) | |
tree | 9b808ba04041f4f10d08b384b4ad8c608a86df4c /drivers/base/regmap/regmap.c | |
parent | 567e47935a7cddd8e823c73bb8ee0b2805cd4940 (diff) |
regmap: Implement managed regmap_init()
Save error handling and unwinding code in drivers by providing managed
versions of the regmap init functions, simplifying usage.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/base/regmap/regmap.c')
-rw-r--r-- | drivers/base/regmap/regmap.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index be10a4ff660..839cc82bd17 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c | |||
@@ -258,6 +258,45 @@ err: | |||
258 | } | 258 | } |
259 | EXPORT_SYMBOL_GPL(regmap_init); | 259 | EXPORT_SYMBOL_GPL(regmap_init); |
260 | 260 | ||
261 | static void devm_regmap_release(struct device *dev, void *res) | ||
262 | { | ||
263 | regmap_exit(*(struct regmap **)res); | ||
264 | } | ||
265 | |||
266 | /** | ||
267 | * devm_regmap_init(): Initialise managed register map | ||
268 | * | ||
269 | * @dev: Device that will be interacted with | ||
270 | * @bus: Bus-specific callbacks to use with device | ||
271 | * @config: Configuration for register map | ||
272 | * | ||
273 | * The return value will be an ERR_PTR() on error or a valid pointer | ||
274 | * to a struct regmap. This function should generally not be called | ||
275 | * directly, it should be called by bus-specific init functions. The | ||
276 | * map will be automatically freed by the device management code. | ||
277 | */ | ||
278 | struct regmap *devm_regmap_init(struct device *dev, | ||
279 | const struct regmap_bus *bus, | ||
280 | const struct regmap_config *config) | ||
281 | { | ||
282 | struct regmap **ptr, *regmap; | ||
283 | |||
284 | ptr = devres_alloc(devm_regmap_release, sizeof(*ptr), GFP_KERNEL); | ||
285 | if (!ptr) | ||
286 | return ERR_PTR(-ENOMEM); | ||
287 | |||
288 | regmap = regmap_init(dev, bus, config); | ||
289 | if (!IS_ERR(regmap)) { | ||
290 | *ptr = regmap; | ||
291 | devres_add(dev, ptr); | ||
292 | } else { | ||
293 | devres_free(ptr); | ||
294 | } | ||
295 | |||
296 | return regmap; | ||
297 | } | ||
298 | EXPORT_SYMBOL_GPL(devm_regmap_init); | ||
299 | |||
261 | /** | 300 | /** |
262 | * regmap_reinit_cache(): Reinitialise the current register cache | 301 | * regmap_reinit_cache(): Reinitialise the current register cache |
263 | * | 302 | * |