summaryrefslogtreecommitdiff
path: root/drivers/regulator
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2014-01-22 18:21:49 +0530
committerLaxman Dewangan <ldewangan@nvidia.com>2014-01-27 21:48:07 -0800
commitbd2e9d53eedda5fab19b80b59f255798fd8730e3 (patch)
treeb54d97108e8a9ab1d65729e445503a8bef15789d /drivers/regulator
parent7570d8eb4838fdaded8a776fecafa84ba0894482 (diff)
regulator: core: support for state change from sysfs for gpio regulators
Add support to enable/disable from sysfs for gpio based fixed regulators. bug 1436543 Change-Id: Ic7d1d9fa73b40b1db8f7f824d4bb53624fae00dc Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Reviewed-on: http://git-master/r/358749 GVS: Gerrit_Virtual_Submit Reviewed-by: Pankaj Dabade <pdabade@nvidia.com> Tested-by: Pankaj Dabade <pdabade@nvidia.com>
Diffstat (limited to 'drivers/regulator')
-rw-r--r--drivers/regulator/core.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index bc57975d97e0..c76111c6aee9 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -463,18 +463,27 @@ static ssize_t regulator_state_set(struct device *dev,
mutex_lock(&rdev->mutex);
if (enabled) {
int delay = 0;
- if (!rdev->desc->ops->enable) {
+ if (!rdev->desc->ops->enable && !rdev->ena_pin) {
+ rdev_warn(rdev, "Ops not supported\n");
ret = -EINVAL;
goto end;
}
ret = _regulator_get_enable_time(rdev);
if (ret >= 0)
delay = ret;
- ret = rdev->desc->ops->enable(rdev);
- if (ret < 0) {
- rdev_warn(rdev, "enable() failed: %d\n", ret);
- goto end;
+
+ if (rdev->ena_pin) {
+ gpio_set_value_cansleep(rdev->ena_pin->gpio,
+ !rdev->ena_pin->ena_gpio_invert);
+ rdev->ena_gpio_state = 1;
+ } else if (rdev->desc->ops->enable) {
+ ret = rdev->desc->ops->enable(rdev);
+ if (ret < 0) {
+ rdev_warn(rdev, "enable() failed: %d\n", ret);
+ goto end;
+ }
}
+
if (delay >= 1000) {
mdelay(delay / 1000);
udelay(delay % 1000);
@@ -483,18 +492,27 @@ static ssize_t regulator_state_set(struct device *dev,
}
} else {
int delay = 0;
- if (!rdev->desc->ops->disable) {
+ if (!rdev->desc->ops->disable && !rdev->ena_pin) {
+ rdev_warn(rdev, "Ops not supported\n");
ret = -EINVAL;
goto end;
}
ret = _regulator_get_disable_time(rdev);
if (ret >= 0)
delay = ret;
- ret = rdev->desc->ops->disable(rdev);
- if (ret < 0) {
- rdev_warn(rdev, "disable() failed: %d\n", ret);
- goto end;
+
+ if (rdev->ena_pin) {
+ gpio_set_value_cansleep(rdev->ena_pin->gpio,
+ rdev->ena_pin->ena_gpio_invert);
+ rdev->ena_gpio_state = 0;
+ } else if (rdev->desc->ops->disable) {
+ ret = rdev->desc->ops->disable(rdev);
+ if (ret < 0) {
+ rdev_warn(rdev, "disable() failed: %d\n", ret);
+ goto end;
+ }
}
+
if (delay >= 1000) {
mdelay(delay / 1000);
udelay(delay % 1000);