diff options
author | Laxman Dewangan <ldewangan@nvidia.com> | 2014-01-22 18:21:49 +0530 |
---|---|---|
committer | Laxman Dewangan <ldewangan@nvidia.com> | 2014-01-27 21:48:07 -0800 |
commit | bd2e9d53eedda5fab19b80b59f255798fd8730e3 (patch) | |
tree | b54d97108e8a9ab1d65729e445503a8bef15789d /drivers/regulator | |
parent | 7570d8eb4838fdaded8a776fecafa84ba0894482 (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.c | 38 |
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); |