aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/regmap/regmap.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2012-01-30 14:56:52 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-01-30 16:06:43 -0500
commitc0eb46766d395da8d62148bda2e59bad5e6ee2f2 (patch)
tree9b808ba04041f4f10d08b384b4ad8c608a86df4c /drivers/base/regmap/regmap.c
parent567e47935a7cddd8e823c73bb8ee0b2805cd4940 (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.c39
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}
259EXPORT_SYMBOL_GPL(regmap_init); 259EXPORT_SYMBOL_GPL(regmap_init);
260 260
261static 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 */
278struct 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}
298EXPORT_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 *