diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-02-20 16:21:25 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-02-20 16:21:25 -0500 |
commit | 3bf06a1ad9b147ca3a64b119d70c4a7c0ace3695 (patch) | |
tree | 7e3e546895c3734bfcf36b237aa6609576a8586d /drivers/base | |
parent | b01543dfe67bb1d191998e90d20534dc354de059 (diff) | |
parent | c0eb46766d395da8d62148bda2e59bad5e6ee2f2 (diff) |
Merge branch 'topic/devm' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap into regmap-drivers
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/regmap/regmap-i2c.c | 17 | ||||
-rw-r--r-- | drivers/base/regmap/regmap-spi.c | 17 | ||||
-rw-r--r-- | drivers/base/regmap/regmap.c | 39 |
3 files changed, 73 insertions, 0 deletions
diff --git a/drivers/base/regmap/regmap-i2c.c b/drivers/base/regmap/regmap-i2c.c index 38621ec87c05..9a3a8c564389 100644 --- a/drivers/base/regmap/regmap-i2c.c +++ b/drivers/base/regmap/regmap-i2c.c | |||
@@ -111,4 +111,21 @@ struct regmap *regmap_init_i2c(struct i2c_client *i2c, | |||
111 | } | 111 | } |
112 | EXPORT_SYMBOL_GPL(regmap_init_i2c); | 112 | EXPORT_SYMBOL_GPL(regmap_init_i2c); |
113 | 113 | ||
114 | /** | ||
115 | * devm_regmap_init_i2c(): Initialise managed register map | ||
116 | * | ||
117 | * @i2c: Device that will be interacted with | ||
118 | * @config: Configuration for register map | ||
119 | * | ||
120 | * The return value will be an ERR_PTR() on error or a valid pointer | ||
121 | * to a struct regmap. The regmap will be automatically freed by the | ||
122 | * device management code. | ||
123 | */ | ||
124 | struct regmap *devm_regmap_init_i2c(struct i2c_client *i2c, | ||
125 | const struct regmap_config *config) | ||
126 | { | ||
127 | return devm_regmap_init(&i2c->dev, ®map_i2c, config); | ||
128 | } | ||
129 | EXPORT_SYMBOL_GPL(devm_regmap_init_i2c); | ||
130 | |||
114 | MODULE_LICENSE("GPL"); | 131 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/base/regmap/regmap-spi.c b/drivers/base/regmap/regmap-spi.c index 2560658de344..7c0c35a39c33 100644 --- a/drivers/base/regmap/regmap-spi.c +++ b/drivers/base/regmap/regmap-spi.c | |||
@@ -70,4 +70,21 @@ struct regmap *regmap_init_spi(struct spi_device *spi, | |||
70 | } | 70 | } |
71 | EXPORT_SYMBOL_GPL(regmap_init_spi); | 71 | EXPORT_SYMBOL_GPL(regmap_init_spi); |
72 | 72 | ||
73 | /** | ||
74 | * devm_regmap_init_spi(): Initialise register map | ||
75 | * | ||
76 | * @spi: Device that will be interacted with | ||
77 | * @config: Configuration for register map | ||
78 | * | ||
79 | * The return value will be an ERR_PTR() on error or a valid pointer | ||
80 | * to a struct regmap. The map will be automatically freed by the | ||
81 | * device management code. | ||
82 | */ | ||
83 | struct regmap *devm_regmap_init_spi(struct spi_device *spi, | ||
84 | const struct regmap_config *config) | ||
85 | { | ||
86 | return devm_regmap_init(&spi->dev, ®map_spi, config); | ||
87 | } | ||
88 | EXPORT_SYMBOL_GPL(devm_regmap_init_spi); | ||
89 | |||
73 | MODULE_LICENSE("GPL"); | 90 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 65558034318f..677aeab24f75 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 | * |