regulator: add get_status()
Based on previous LKML discussions: * Update docs for regulator sysfs class attributes to highlight the fact that all current attributes are intended to be control inputs, including notably "state" and "opmode" which previously implied otherwise. * Define a new regulator driver get_status() method, which is the first method reporting regulator outputs instead of inputs. It can report on/off and error status; or instead of simply "on", report the actual operating mode. For the moment, this is a sysfs-only interface, not accessible to regulator clients. Such clients can use the current notification interfaces to detect errors, if the regulator reports them. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
This commit is contained in:
committed by
Liam Girdwood
parent
93e14baa44
commit
853116a105
@@ -312,6 +312,47 @@ static ssize_t regulator_state_show(struct device *dev,
|
||||
}
|
||||
static DEVICE_ATTR(state, 0444, regulator_state_show, NULL);
|
||||
|
||||
static ssize_t regulator_status_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct regulator_dev *rdev = dev_get_drvdata(dev);
|
||||
int status;
|
||||
char *label;
|
||||
|
||||
status = rdev->desc->ops->get_status(rdev);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
switch (status) {
|
||||
case REGULATOR_STATUS_OFF:
|
||||
label = "off";
|
||||
break;
|
||||
case REGULATOR_STATUS_ON:
|
||||
label = "on";
|
||||
break;
|
||||
case REGULATOR_STATUS_ERROR:
|
||||
label = "error";
|
||||
break;
|
||||
case REGULATOR_STATUS_FAST:
|
||||
label = "fast";
|
||||
break;
|
||||
case REGULATOR_STATUS_NORMAL:
|
||||
label = "normal";
|
||||
break;
|
||||
case REGULATOR_STATUS_IDLE:
|
||||
label = "idle";
|
||||
break;
|
||||
case REGULATOR_STATUS_STANDBY:
|
||||
label = "standby";
|
||||
break;
|
||||
default:
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
return sprintf(buf, "%s\n", label);
|
||||
}
|
||||
static DEVICE_ATTR(status, 0444, regulator_status_show, NULL);
|
||||
|
||||
static ssize_t regulator_min_uA_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
@@ -1744,6 +1785,11 @@ static int add_regulator_attributes(struct regulator_dev *rdev)
|
||||
if (status < 0)
|
||||
return status;
|
||||
}
|
||||
if (ops->get_status) {
|
||||
status = device_create_file(dev, &dev_attr_status);
|
||||
if (status < 0)
|
||||
return status;
|
||||
}
|
||||
|
||||
/* some attributes are type-specific */
|
||||
if (rdev->desc->type == REGULATOR_CURRENT) {
|
||||
|
Reference in New Issue
Block a user