diff options
Diffstat (limited to 'drivers/regulator')
-rw-r--r-- | drivers/regulator/core.c | 59 |
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 | } |
1410 | EXPORT_SYMBOL_GPL(regulator_get_exclusive); | 1410 | EXPORT_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 | */ | ||
1435 | struct regulator *regulator_get_optional(struct device *dev, const char *id) | ||
1436 | { | ||
1437 | return _regulator_get(dev, id, 0); | ||
1438 | } | ||
1439 | EXPORT_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 | */ | ||
1450 | struct 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 | } | ||
1469 | EXPORT_SYMBOL_GPL(devm_regulator_get_optional); | ||
1470 | |||
1412 | /* Locks held by regulator_put() */ | 1471 | /* Locks held by regulator_put() */ |
1413 | static void _regulator_put(struct regulator *regulator) | 1472 | static void _regulator_put(struct regulator *regulator) |
1414 | { | 1473 | { |