aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/regulator
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-07-29 16:42:42 -0400
committerMark Brown <broonie@linaro.org>2013-07-31 04:56:39 -0400
commitde1dd9fd2156874b45803299b3b27e65d5defdd9 (patch)
tree031b04b662f93f38aab24fc4273376e07558327e /drivers/regulator
parent4bdfb2729c3a396fe7400c9332c49aee2b971bd8 (diff)
regulator: core: Provide hints to the core about optional supplies
While the majority of supplies on devices are mandatory and can't be physically omitted for electrical reasons some devices do have optional supplies and need to know if they are missing, MMC being the most common of these. Currently the core accurately reports all errors when regulators are requested since it does not know if the supply is one that must be provided even if by a regulator software does not know about or if it is one that may genuinely be disconnected. In order to allow this behaviour to be changed and stub regulators to be provided in the former case add a new regulator request function regulator_get_optional() which provides a hint to the core that the regulator may genuinely not be connected. Currently the implementation is identical to the current behaviour, future patches will add support in the core for returning stub regulators in the case where normal regulator_get() fails and the board has requested it. Signed-off-by: Mark Brown <broonie@linaro.org> Acked-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'drivers/regulator')
-rw-r--r--drivers/regulator/core.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 288c75abc190..a27a5b6267dd 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1409,6 +1409,65 @@ struct regulator *regulator_get_exclusive(struct device *dev, const char *id)
1409} 1409}
1410EXPORT_SYMBOL_GPL(regulator_get_exclusive); 1410EXPORT_SYMBOL_GPL(regulator_get_exclusive);
1411 1411
1412/**
1413 * regulator_get_optional - obtain optional access to a regulator.
1414 * @dev: device for regulator "consumer"
1415 * @id: Supply name or regulator ID.
1416 *
1417 * Returns a struct regulator corresponding to the regulator producer,
1418 * or IS_ERR() condition containing errno. Other consumers will be
1419 * unable to obtain this reference is held and the use count for the
1420 * regulator will be initialised to reflect the current state of the
1421 * regulator.
1422 *
1423 * This is intended for use by consumers for devices which can have
1424 * some supplies unconnected in normal use, such as some MMC devices.
1425 * It can allow the regulator core to provide stub supplies for other
1426 * supplies requested using normal regulator_get() calls without
1427 * disrupting the operation of drivers that can handle absent
1428 * supplies.
1429 *
1430 * Use of supply names configured via regulator_set_device_supply() is
1431 * strongly encouraged. It is recommended that the supply name used
1432 * should match the name used for the supply and/or the relevant
1433 * device pins in the datasheet.
1434 */
1435struct regulator *regulator_get_optional(struct device *dev, const char *id)
1436{
1437 return _regulator_get(dev, id, 0);
1438}
1439EXPORT_SYMBOL_GPL(regulator_get_optional);
1440
1441/**
1442 * devm_regulator_get_optional - Resource managed regulator_get_optional()
1443 * @dev: device for regulator "consumer"
1444 * @id: Supply name or regulator ID.
1445 *
1446 * Managed regulator_get_optional(). Regulators returned from this
1447 * function are automatically regulator_put() on driver detach. See
1448 * regulator_get_optional() for more information.
1449 */
1450struct regulator *devm_regulator_get_optional(struct device *dev,
1451 const char *id)
1452{
1453 struct regulator **ptr, *regulator;
1454
1455 ptr = devres_alloc(devm_regulator_release, sizeof(*ptr), GFP_KERNEL);
1456 if (!ptr)
1457 return ERR_PTR(-ENOMEM);
1458
1459 regulator = regulator_get_optional(dev, id);
1460 if (!IS_ERR(regulator)) {
1461 *ptr = regulator;
1462 devres_add(dev, ptr);
1463 } else {
1464 devres_free(ptr);
1465 }
1466
1467 return regulator;
1468}
1469EXPORT_SYMBOL_GPL(devm_regulator_get_optional);
1470
1412/* Locks held by regulator_put() */ 1471/* Locks held by regulator_put() */
1413static void _regulator_put(struct regulator *regulator) 1472static void _regulator_put(struct regulator *regulator)
1414{ 1473{