aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2011-05-08 17:13:37 -0400
committerLiam Girdwood <lrg@slimlogic.co.uk>2011-05-27 05:34:37 -0400
commitbf5892a8167e4aa5a9a6d72f803fde850e0c5753 (patch)
tree41670ff93a8441ce155ba99cbfb684e5c52df4e7 /drivers
parent492c826b9facefa84995f4dea917e301b5ee0884 (diff)
regulator: Support voltage offsets to compensate for drops in system
Some systems, particularly physically large systems used for early prototyping, may experience substantial voltage drops between the regulator and the consumers as a result of long traces in the system. With these systems voltages may need to be set higher than requested in order to ensure reliable system operation. Allow systems to work around such hardware issues by allowing constraints to supply an offset to be applied to any requested and reported voltages. This is not ideal, especially since the voltage drop may be load dependant, but is sufficient for most affected systems, it is not expected to be used in production hardware. The offset is applied after all constraint processing so constraints should be specified in terms of consumer values not physically configured values. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/regulator/core.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 432faa5cb8af..58452ac0f165 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -724,6 +724,10 @@ static void print_constraints(struct regulator_dev *rdev)
724 count += sprintf(buf + count, "at %d mV ", ret / 1000); 724 count += sprintf(buf + count, "at %d mV ", ret / 1000);
725 } 725 }
726 726
727 if (constraints->uV_offset)
728 count += sprintf(buf, "%dmV offset ",
729 constraints->uV_offset / 1000);
730
727 if (constraints->min_uA && constraints->max_uA) { 731 if (constraints->min_uA && constraints->max_uA) {
728 if (constraints->min_uA == constraints->max_uA) 732 if (constraints->min_uA == constraints->max_uA)
729 count += sprintf(buf + count, "%d mA ", 733 count += sprintf(buf + count, "%d mA ",
@@ -1641,6 +1645,9 @@ static int _regulator_do_set_voltage(struct regulator_dev *rdev,
1641 1645
1642 trace_regulator_set_voltage(rdev_get_name(rdev), min_uV, max_uV); 1646 trace_regulator_set_voltage(rdev_get_name(rdev), min_uV, max_uV);
1643 1647
1648 min_uV += rdev->constraints->uV_offset;
1649 max_uV += rdev->constraints->uV_offset;
1650
1644 if (rdev->desc->ops->set_voltage) { 1651 if (rdev->desc->ops->set_voltage) {
1645 ret = rdev->desc->ops->set_voltage(rdev, min_uV, max_uV, 1652 ret = rdev->desc->ops->set_voltage(rdev, min_uV, max_uV,
1646 &selector); 1653 &selector);
@@ -1865,18 +1872,20 @@ EXPORT_SYMBOL_GPL(regulator_sync_voltage);
1865 1872
1866static int _regulator_get_voltage(struct regulator_dev *rdev) 1873static int _regulator_get_voltage(struct regulator_dev *rdev)
1867{ 1874{
1868 int sel; 1875 int sel, ret;
1869 1876
1870 if (rdev->desc->ops->get_voltage_sel) { 1877 if (rdev->desc->ops->get_voltage_sel) {
1871 sel = rdev->desc->ops->get_voltage_sel(rdev); 1878 sel = rdev->desc->ops->get_voltage_sel(rdev);
1872 if (sel < 0) 1879 if (sel < 0)
1873 return sel; 1880 return sel;
1874 return rdev->desc->ops->list_voltage(rdev, sel); 1881 ret = rdev->desc->ops->list_voltage(rdev, sel);
1875 } 1882 }
1876 if (rdev->desc->ops->get_voltage) 1883 if (rdev->desc->ops->get_voltage)
1877 return rdev->desc->ops->get_voltage(rdev); 1884 ret = rdev->desc->ops->get_voltage(rdev);
1878 else 1885 else
1879 return -EINVAL; 1886 return -EINVAL;
1887
1888 return ret - rdev->constraints->uV_offset;
1880} 1889}
1881 1890
1882/** 1891/**