regulator: Add devm_regulator_get()
Add a resource managed regulator_get() to simplify regulator usage in drivers. This allows driver authors to "get and forget" about their regulators by automatically calling regulator_put() when the driver is detached. [Fixed up a couple of coding style issues -- broonie] Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
dcd6c92267
commit
070b907922
|
@ -267,3 +267,6 @@ IOMAP
|
||||||
pcim_iounmap()
|
pcim_iounmap()
|
||||||
pcim_iomap_table() : array of mapped addresses indexed by BAR
|
pcim_iomap_table() : array of mapped addresses indexed by BAR
|
||||||
pcim_iomap_regions() : do request_region() and iomap() on multiple BARs
|
pcim_iomap_regions() : do request_region() and iomap() on multiple BARs
|
||||||
|
|
||||||
|
REGULATOR
|
||||||
|
devm_regulator_get()
|
||||||
|
|
|
@ -1320,6 +1320,40 @@ struct regulator *regulator_get(struct device *dev, const char *id)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(regulator_get);
|
EXPORT_SYMBOL_GPL(regulator_get);
|
||||||
|
|
||||||
|
static void devm_regulator_release(struct device *dev, void *res)
|
||||||
|
{
|
||||||
|
regulator_put(*(struct regulator **)res);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* devm_regulator_get - Resource managed regulator_get()
|
||||||
|
* @dev: device for regulator "consumer"
|
||||||
|
* @id: Supply name or regulator ID.
|
||||||
|
*
|
||||||
|
* Managed regulator_get(). Regulators returned from this function are
|
||||||
|
* automatically regulator_put() on driver detach. See regulator_get() for more
|
||||||
|
* information.
|
||||||
|
*/
|
||||||
|
struct regulator *devm_regulator_get(struct device *dev, const char *id)
|
||||||
|
{
|
||||||
|
struct regulator **ptr, *regulator;
|
||||||
|
|
||||||
|
ptr = devres_alloc(devm_regulator_release, sizeof(*ptr), GFP_KERNEL);
|
||||||
|
if (!ptr)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
regulator = regulator_get(dev, id);
|
||||||
|
if (!IS_ERR(regulator)) {
|
||||||
|
*ptr = regulator;
|
||||||
|
devres_add(dev, ptr);
|
||||||
|
} else {
|
||||||
|
devres_free(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return regulator;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(devm_regulator_get);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* regulator_get_exclusive - obtain exclusive access to a regulator.
|
* regulator_get_exclusive - obtain exclusive access to a regulator.
|
||||||
* @dev: device for regulator "consumer"
|
* @dev: device for regulator "consumer"
|
||||||
|
|
|
@ -132,6 +132,8 @@ struct regulator_bulk_data {
|
||||||
/* regulator get and put */
|
/* regulator get and put */
|
||||||
struct regulator *__must_check regulator_get(struct device *dev,
|
struct regulator *__must_check regulator_get(struct device *dev,
|
||||||
const char *id);
|
const char *id);
|
||||||
|
struct regulator *__must_check devm_regulator_get(struct device *dev,
|
||||||
|
const char *id);
|
||||||
struct regulator *__must_check regulator_get_exclusive(struct device *dev,
|
struct regulator *__must_check regulator_get_exclusive(struct device *dev,
|
||||||
const char *id);
|
const char *id);
|
||||||
void regulator_put(struct regulator *regulator);
|
void regulator_put(struct regulator *regulator);
|
||||||
|
@ -200,6 +202,13 @@ static inline struct regulator *__must_check regulator_get(struct device *dev,
|
||||||
*/
|
*/
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct regulator *__must_check
|
||||||
|
devm_regulator_get(struct device *dev, const char *id)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void regulator_put(struct regulator *regulator)
|
static inline void regulator_put(struct regulator *regulator)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue