lkml.org 
[lkml]   [2021]   [Nov]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/4] power: supply: add helpers for charge_behaviour sysfs
    Date
    These helper functions can be used by drivers to implement their own
    sysfs-attributes.
    This is useful for ACPI-drivers extending the default ACPI-battery with
    their own charge_behaviour attributes.

    Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
    ---
    drivers/power/supply/power_supply_sysfs.c | 51 +++++++++++++++++++++++
    include/linux/power_supply.h | 9 ++++
    2 files changed, 60 insertions(+)

    diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c
    index c3d7cbcd4fad..171341bcef1d 100644
    --- a/drivers/power/supply/power_supply_sysfs.c
    +++ b/drivers/power/supply/power_supply_sysfs.c
    @@ -133,6 +133,12 @@ static const char * const POWER_SUPPLY_SCOPE_TEXT[] = {
    [POWER_SUPPLY_SCOPE_DEVICE] = "Device",
    };

    +static const char * const POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT[] = {
    + [POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO] = "auto",
    + [POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE] = "inhibit-charge",
    + [POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE] = "force-discharge",
    +};
    +
    static struct power_supply_attr power_supply_attrs[] = {
    /* Properties of type `int' */
    POWER_SUPPLY_ENUM_ATTR(STATUS),
    @@ -226,6 +232,51 @@ static enum power_supply_property dev_attr_psp(struct device_attribute *attr)
    return to_ps_attr(attr) - power_supply_attrs;
    }

    +ssize_t power_supply_charge_behaviour_show(struct device *dev,
    + unsigned int available_behaviours,
    + enum power_supply_charge_behaviour current_behaviour,
    + char *buf)
    +{
    + bool match = false, available, active;
    + ssize_t count = 0;
    + int i;
    +
    + for (i = 0; i < ARRAY_SIZE(POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT); i++) {
    + available = available_behaviours & BIT(i);
    + active = i == current_behaviour;
    +
    + if (available && active) {
    + count += sprintf(buf + count, "[%s] ",
    + POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT[i]);
    + match = true;
    + } else if (available) {
    + count += sprintf(buf + count, "%s ",
    + POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT[i]);
    + }
    + }
    +
    + if (!match) {
    + dev_warn(dev, "driver reporting unsupported charge behaviour\n");
    + return -EINVAL;
    + }
    +
    + if (count)
    + buf[count - 1] = '\n';
    +
    + return count;
    +}
    +EXPORT_SYMBOL_GPL(power_supply_charge_behaviour_show);
    +
    +int power_supply_charge_behaviour_parse(unsigned int available_behaviours, const char *buf)
    +{
    + int i = sysfs_match_string(POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT, buf);
    +
    + if (available_behaviours & BIT(i))
    + return i;
    + return -EINVAL;
    +}
    +EXPORT_SYMBOL_GPL(power_supply_charge_behaviour_parse);
    +
    static ssize_t power_supply_show_usb_type(struct device *dev,
    const struct power_supply_desc *desc,
    union power_supply_propval *value,
    diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
    index 70c333e86293..71f0379c2af8 100644
    --- a/include/linux/power_supply.h
    +++ b/include/linux/power_supply.h
    @@ -546,4 +546,13 @@ static inline
    void power_supply_remove_hwmon_sysfs(struct power_supply *psy) {}
    #endif

    +#ifdef CONFIG_SYSFS
    +ssize_t power_supply_charge_behaviour_show(struct device *dev,
    + unsigned int available_behaviours,
    + enum power_supply_charge_behaviour behaviour,
    + char *buf);
    +
    +int power_supply_charge_behaviour_parse(unsigned int available_behaviours, const char *buf);
    +#endif
    +
    #endif /* __LINUX_POWER_SUPPLY_H__ */
    --
    2.33.1
    \
     
     \ /
      Last update: 2021-11-13 11:43    [W:3.408 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site