power_supply: add SCOPE attribute to power supplies
authorJeremy Fitzhardinge <jeremy@goop.org>
Wed, 7 Dec 2011 19:24:20 +0000 (11:24 -0800)
committerJeremy Fitzhardinge <jeremy@goop.org>
Fri, 9 Dec 2011 17:42:05 +0000 (09:42 -0800)
This adds a "scope" attribute to a power_supply, which indicates how
much of the system it powers.  It appears in sysfs as "scope" or in
the uevent file as POWER_SUPPLY_SCOPE=.  There are presently three
possible values:
Unknown - unknown power topology
System - the power supply powers the whole system
Device - it powers a specific device, or tree of devices

A power supply which doesn't have a "scope" attribute should be assumed to
have "System" scope.

In general, usermode should assume that loss of all System-scoped power
supplies will power off the whole system, but any single one is sufficient
to power the system.

Signed-off-by: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Richard Hughes <richard@hughsie.com>
drivers/power/power_supply_sysfs.c
include/linux/power_supply.h

index e15d4c9d398842bf4609942da61e02448516da68..21178ebfe51aacb9d7996dcd6d15299aaa1547fb 100644 (file)
@@ -63,6 +63,9 @@ static ssize_t power_supply_show_property(struct device *dev,
        static char *capacity_level_text[] = {
                "Unknown", "Critical", "Low", "Normal", "High", "Full"
        };
+       static char *scope_text[] = {
+               "Unknown", "System", "Device"
+       };
        ssize_t ret = 0;
        struct power_supply *psy = dev_get_drvdata(dev);
        const ptrdiff_t off = attr - power_supply_attrs;
@@ -95,6 +98,8 @@ static ssize_t power_supply_show_property(struct device *dev,
                return sprintf(buf, "%s\n", capacity_level_text[value.intval]);
        else if (off == POWER_SUPPLY_PROP_TYPE)
                return sprintf(buf, "%s\n", type_text[value.intval]);
+       else if (off == POWER_SUPPLY_PROP_SCOPE)
+               return sprintf(buf, "%s\n", scope_text[value.intval]);
        else if (off >= POWER_SUPPLY_PROP_MODEL_NAME)
                return sprintf(buf, "%s\n", value.strval);
 
@@ -167,6 +172,7 @@ static struct device_attribute power_supply_attrs[] = {
        POWER_SUPPLY_ATTR(time_to_full_now),
        POWER_SUPPLY_ATTR(time_to_full_avg),
        POWER_SUPPLY_ATTR(type),
+       POWER_SUPPLY_ATTR(scope),
        /* Properties of type `const char *' */
        POWER_SUPPLY_ATTR(model_name),
        POWER_SUPPLY_ATTR(manufacturer),
index 204c18dfdc9e839a378cfd4200342784c22be5b7..040a7b08e7c71af58ef1a071d6b967bd449c7c0a 100644 (file)
@@ -74,6 +74,12 @@ enum {
        POWER_SUPPLY_CAPACITY_LEVEL_FULL,
 };
 
+enum {
+       POWER_SUPPLY_SCOPE_UNKNOWN = 0,
+       POWER_SUPPLY_SCOPE_SYSTEM,
+       POWER_SUPPLY_SCOPE_DEVICE,
+};
+
 enum power_supply_property {
        /* Properties of type `int' */
        POWER_SUPPLY_PROP_STATUS = 0,
@@ -116,6 +122,7 @@ enum power_supply_property {
        POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
        POWER_SUPPLY_PROP_TIME_TO_FULL_AVG,
        POWER_SUPPLY_PROP_TYPE, /* use power_supply.type instead */
+       POWER_SUPPLY_PROP_SCOPE,
        /* Properties of type `const char *' */
        POWER_SUPPLY_PROP_MODEL_NAME,
        POWER_SUPPLY_PROP_MANUFACTURER,