aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/regulator
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/regulator')
-rw-r--r--drivers/regulator/core.c63
1 files changed, 39 insertions, 24 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index b362dbde80f7..23c5f7c80bff 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -83,6 +83,8 @@ static int _regulator_get_current_limit(struct regulator_dev *rdev);
83static unsigned int _regulator_get_mode(struct regulator_dev *rdev); 83static unsigned int _regulator_get_mode(struct regulator_dev *rdev);
84static void _notifier_call_chain(struct regulator_dev *rdev, 84static void _notifier_call_chain(struct regulator_dev *rdev,
85 unsigned long event, void *data); 85 unsigned long event, void *data);
86static int _regulator_do_set_voltage(struct regulator_dev *rdev,
87 int min_uV, int max_uV);
86 88
87static const char *rdev_get_name(struct regulator_dev *rdev) 89static const char *rdev_get_name(struct regulator_dev *rdev)
88{ 90{
@@ -745,22 +747,19 @@ static int machine_constraints_voltage(struct regulator_dev *rdev,
745{ 747{
746 struct regulator_ops *ops = rdev->desc->ops; 748 struct regulator_ops *ops = rdev->desc->ops;
747 int ret; 749 int ret;
748 unsigned selector;
749 750
750 /* do we need to apply the constraint voltage */ 751 /* do we need to apply the constraint voltage */
751 if (rdev->constraints->apply_uV && 752 if (rdev->constraints->apply_uV &&
752 rdev->constraints->min_uV == rdev->constraints->max_uV && 753 rdev->constraints->min_uV == rdev->constraints->max_uV) {
753 ops->set_voltage) { 754 ret = _regulator_do_set_voltage(rdev,
754 ret = ops->set_voltage(rdev, 755 rdev->constraints->min_uV,
755 rdev->constraints->min_uV, 756 rdev->constraints->max_uV);
756 rdev->constraints->max_uV, 757 if (ret < 0) {
757 &selector); 758 rdev_err(rdev, "failed to apply %duV constraint\n",
758 if (ret < 0) { 759 rdev->constraints->min_uV);
759 rdev_err(rdev, "failed to apply %duV constraint\n", 760 rdev->constraints = NULL;
760 rdev->constraints->min_uV); 761 return ret;
761 rdev->constraints = NULL; 762 }
762 return ret;
763 }
764 } 763 }
765 764
766 /* constrain machine-level voltage specs to fit 765 /* constrain machine-level voltage specs to fit
@@ -1621,6 +1620,32 @@ int regulator_is_supported_voltage(struct regulator *regulator,
1621 return 0; 1620 return 0;
1622} 1621}
1623 1622
1623static int _regulator_do_set_voltage(struct regulator_dev *rdev,
1624 int min_uV, int max_uV)
1625{
1626 int ret;
1627 unsigned int selector;
1628
1629 trace_regulator_set_voltage(rdev_get_name(rdev), min_uV, max_uV);
1630
1631 if (rdev->desc->ops->set_voltage) {
1632 ret = rdev->desc->ops->set_voltage(rdev, min_uV, max_uV,
1633 &selector);
1634
1635 if (rdev->desc->ops->list_voltage)
1636 selector = rdev->desc->ops->list_voltage(rdev,
1637 selector);
1638 else
1639 selector = -1;
1640 } else {
1641 ret = -EINVAL;
1642 }
1643
1644 trace_regulator_set_voltage_complete(rdev_get_name(rdev), selector);
1645
1646 return ret;
1647}
1648
1624/** 1649/**
1625 * regulator_set_voltage - set regulator output voltage 1650 * regulator_set_voltage - set regulator output voltage
1626 * @regulator: regulator source 1651 * @regulator: regulator source
@@ -1643,7 +1668,6 @@ int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV)
1643{ 1668{
1644 struct regulator_dev *rdev = regulator->rdev; 1669 struct regulator_dev *rdev = regulator->rdev;
1645 int ret; 1670 int ret;
1646 unsigned selector;
1647 1671
1648 mutex_lock(&rdev->mutex); 1672 mutex_lock(&rdev->mutex);
1649 1673
@@ -1664,16 +1688,7 @@ int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV)
1664 if (ret < 0) 1688 if (ret < 0)
1665 goto out; 1689 goto out;
1666 1690
1667 trace_regulator_set_voltage(rdev_get_name(rdev), min_uV, max_uV); 1691 ret = _regulator_do_set_voltage(rdev, min_uV, max_uV);
1668
1669 ret = rdev->desc->ops->set_voltage(rdev, min_uV, max_uV, &selector);
1670
1671 if (rdev->desc->ops->list_voltage)
1672 selector = rdev->desc->ops->list_voltage(rdev, selector);
1673 else
1674 selector = -1;
1675
1676 trace_regulator_set_voltage_complete(rdev_get_name(rdev), selector);
1677 1692
1678out: 1693out:
1679 _notifier_call_chain(rdev, REGULATOR_EVENT_VOLTAGE_CHANGE, NULL); 1694 _notifier_call_chain(rdev, REGULATOR_EVENT_VOLTAGE_CHANGE, NULL);