summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorPhilippe Langlais <philippe.langlais@linaro.org>2011-03-24 14:12:01 +0100
committerUlf Hansson <ulf.hansson@stericsson.com>2011-09-19 15:14:38 +0200
commit898e4bba23a5a4ff05471a9f3ae01c85d3fd5505 (patch)
tree002e06c0bdf041c025fdf2bf122257775ac3bf7d /drivers
parentf0b0debd8d92cb224169f6e15ee4df00eabefe70 (diff)
Regulators: show consumers that holds a regulator
To locate the consumer(s) that currently holds (ie have enabled) a regulator, a new sysfs entry is created. The consumer(s) are published in /sys/class/regulator/regulator.<#>/use Signed-off-by: Martin Persson <martin.persson@stericsson.com> Change-Id: Ief78276c9685d0bf5688294b9aed9e0698c3475f Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/6549 Reviewed-by: Bengt JONSSON <bengt.g.jonsson@stericsson.com> Conflicts: drivers/regulator/core.c
Diffstat (limited to 'drivers')
-rw-r--r--drivers/regulator/core.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index d3e38790906..a47238d1fe1 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -78,6 +78,7 @@ struct regulator {
char *supply_name;
struct device_attribute dev_attr;
struct regulator_dev *rdev;
+ int use;
};
static int _regulator_is_enabled(struct regulator_dev *rdev);
@@ -563,6 +564,32 @@ static ssize_t regulator_suspend_standby_state_show(struct device *dev,
static DEVICE_ATTR(suspend_standby_state, 0444,
regulator_suspend_standby_state_show, NULL);
+static ssize_t regulator_use_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct regulator_dev *rdev = dev_get_drvdata(dev);
+ struct regulator *reg;
+ size_t size = 0;
+
+ if (rdev->use_count == 0)
+ return sprintf(buf, "no users\n");
+
+ list_for_each_entry(reg, &rdev->consumer_list, list) {
+ if (!reg->use)
+ continue;
+
+ if (reg->dev != NULL)
+ size += sprintf((buf + size), "%s (%d) ",
+ dev_name(reg->dev), reg->use);
+ else
+ size += sprintf((buf + size), "unknown (%d) ",
+ reg->use);
+ }
+ size += sprintf((buf + size), "\n");
+
+ return size;
+}
+static DEVICE_ATTR(use, 0444, regulator_use_show, NULL);
/*
* These are the only attributes are present for all regulators.
@@ -1391,6 +1418,9 @@ int regulator_enable(struct regulator *regulator)
mutex_lock(&rdev->mutex);
ret = _regulator_enable(rdev);
mutex_unlock(&rdev->mutex);
+ if (ret == 0)
+ regulator->use++;
+
return ret;
}
EXPORT_SYMBOL_GPL(regulator_enable);
@@ -1474,6 +1504,9 @@ int regulator_disable(struct regulator *regulator)
mutex_unlock(&rdev->mutex);
}
+ if (ret == 0)
+ regulator->use--;
+
return ret;
}
EXPORT_SYMBOL_GPL(regulator_disable);
@@ -2408,6 +2441,10 @@ static int add_regulator_attributes(struct regulator_dev *rdev)
struct regulator_ops *ops = rdev->desc->ops;
int status = 0;
+ status = device_create_file(dev, &dev_attr_use);
+ if (status < 0)
+ dev_warn(dev, "Create sysfs file \"use\" failed");
+
/* some attributes need specific methods to be displayed */
if (ops->get_voltage || ops->get_voltage_sel) {
status = device_create_file(dev, &dev_attr_microvolts);