diff options
| author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-03-14 09:12:33 -0400 |
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-03-14 09:12:33 -0400 |
| commit | e1c1c69c8fc7656c33460c8e085ac0d0be22ac3b (patch) | |
| tree | 3199753118adf26baf52841cb913afa77f549829 | |
| parent | f5d6eba74b8aac7d4bf646c5445807aa6a247e6c (diff) | |
| parent | c0eb46766d395da8d62148bda2e59bad5e6ee2f2 (diff) | |
Merge remote-tracking branches 'regmap/topic/core' and 'regmap/topic/devm' into regmap-next
| -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 | ||||
| -rw-r--r-- | include/linux/regmap.h | 8 |
4 files changed, 81 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 253882d8392a..58f84c3a6fc1 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c | |||
| @@ -306,6 +306,45 @@ err: | |||
| 306 | } | 306 | } |
| 307 | EXPORT_SYMBOL_GPL(regmap_init); | 307 | EXPORT_SYMBOL_GPL(regmap_init); |
| 308 | 308 | ||
| 309 | static void devm_regmap_release(struct device *dev, void *res) | ||
| 310 | { | ||
| 311 | regmap_exit(*(struct regmap **)res); | ||
| 312 | } | ||
| 313 | |||
| 314 | /** | ||
| 315 | * devm_regmap_init(): Initialise managed register map | ||
| 316 | * | ||
| 317 | * @dev: Device that will be interacted with | ||
| 318 | * @bus: Bus-specific callbacks to use with device | ||
| 319 | * @config: Configuration for register map | ||
| 320 | * | ||
| 321 | * The return value will be an ERR_PTR() on error or a valid pointer | ||
| 322 | * to a struct regmap. This function should generally not be called | ||
| 323 | * directly, it should be called by bus-specific init functions. The | ||
| 324 | * map will be automatically freed by the device management code. | ||
| 325 | */ | ||
| 326 | struct regmap *devm_regmap_init(struct device *dev, | ||
| 327 | const struct regmap_bus *bus, | ||
| 328 | const struct regmap_config *config) | ||
| 329 | { | ||
| 330 | struct regmap **ptr, *regmap; | ||
| 331 | |||
| 332 | ptr = devres_alloc(devm_regmap_release, sizeof(*ptr), GFP_KERNEL); | ||
| 333 | if (!ptr) | ||
| 334 | return ERR_PTR(-ENOMEM); | ||
| 335 | |||
| 336 | regmap = regmap_init(dev, bus, config); | ||
| 337 | if (!IS_ERR(regmap)) { | ||
| 338 | *ptr = regmap; | ||
| 339 | devres_add(dev, ptr); | ||
| 340 | } else { | ||
| 341 | devres_free(ptr); | ||
| 342 | } | ||
| 343 | |||
| 344 | return regmap; | ||
| 345 | } | ||
| 346 | EXPORT_SYMBOL_GPL(devm_regmap_init); | ||
| 347 | |||
| 309 | /** | 348 | /** |
| 310 | * regmap_reinit_cache(): Reinitialise the current register cache | 349 | * regmap_reinit_cache(): Reinitialise the current register cache |
| 311 | * | 350 | * |
diff --git a/include/linux/regmap.h b/include/linux/regmap.h index 14b8252d8ed0..5b0908a7f5bf 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h | |||
| @@ -132,6 +132,14 @@ struct regmap *regmap_init_i2c(struct i2c_client *i2c, | |||
| 132 | struct regmap *regmap_init_spi(struct spi_device *dev, | 132 | struct regmap *regmap_init_spi(struct spi_device *dev, |
| 133 | const struct regmap_config *config); | 133 | const struct regmap_config *config); |
| 134 | 134 | ||
| 135 | struct regmap *devm_regmap_init(struct device *dev, | ||
| 136 | const struct regmap_bus *bus, | ||
| 137 | const struct regmap_config *config); | ||
| 138 | struct regmap *devm_regmap_init_i2c(struct i2c_client *i2c, | ||
| 139 | const struct regmap_config *config); | ||
| 140 | struct regmap *devm_regmap_init_spi(struct spi_device *dev, | ||
| 141 | const struct regmap_config *config); | ||
| 142 | |||
| 135 | void regmap_exit(struct regmap *map); | 143 | void regmap_exit(struct regmap *map); |
| 136 | int regmap_reinit_cache(struct regmap *map, | 144 | int regmap_reinit_cache(struct regmap *map, |
| 137 | const struct regmap_config *config); | 145 | const struct regmap_config *config); |
