]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
power: supply: sysfs: Add power_supply_show_enum_with_available() helper
authorHans de Goede <hdegoede@redhat.com>
Sat, 31 Aug 2024 14:20:37 +0000 (16:20 +0200)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Tue, 3 Sep 2024 21:20:27 +0000 (23:20 +0200)
Turn power_supply_charge_behaviour_show() into a generic function for
showing enum values with their available (for writing) values shown
and the current value shown surrounded by sqaure-brackets like
the show() output for "usb_type" and "charge_behaviour".

This is a preparation patch for refactoring the "usb_type" property
handling to use a bitmask indicating available usb-types + this new
generic function.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20240831142039.28830-5-hdegoede@redhat.com
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/power_supply_sysfs.c

index ff7e423edd575c3c13f9b8b07fd952cd0324534c..9f21b0b54caf76097031b24451600012246ba2ba 100644 (file)
@@ -518,31 +518,28 @@ out:
        return ret;
 }
 
-ssize_t power_supply_charge_behaviour_show(struct device *dev,
-                                          unsigned int available_behaviours,
-                                          enum power_supply_charge_behaviour current_behaviour,
-                                          char *buf)
+static ssize_t power_supply_show_enum_with_available(
+                       struct device *dev, const char * const labels[], int label_count,
+                       unsigned int available_values, int value, 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;
+       for (i = 0; i < label_count; i++) {
+               available = available_values & BIT(i);
+               active = i == value;
 
                if (available && active) {
-                       count += sysfs_emit_at(buf, count, "[%s] ",
-                                              POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT[i]);
+                       count += sysfs_emit_at(buf, count, "[%s] ", labels[i]);
                        match = true;
                } else if (available) {
-                       count += sysfs_emit_at(buf, count, "%s ",
-                                              POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT[i]);
+                       count += sysfs_emit_at(buf, count, "%s ", labels[i]);
                }
        }
 
        if (!match) {
-               dev_warn(dev, "driver reporting unsupported charge behaviour\n");
+               dev_warn(dev, "driver reporting unavailable enum value %d\n", value);
                return -EINVAL;
        }
 
@@ -551,6 +548,17 @@ ssize_t power_supply_charge_behaviour_show(struct device *dev,
 
        return count;
 }
+
+ssize_t power_supply_charge_behaviour_show(struct device *dev,
+                                          unsigned int available_behaviours,
+                                          enum power_supply_charge_behaviour current_behaviour,
+                                          char *buf)
+{
+       return power_supply_show_enum_with_available(
+                               dev, POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT,
+                               ARRAY_SIZE(POWER_SUPPLY_CHARGE_BEHAVIOUR_TEXT),
+                               available_behaviours, current_behaviour, buf);
+}
 EXPORT_SYMBOL_GPL(power_supply_charge_behaviour_show);
 
 int power_supply_charge_behaviour_parse(unsigned int available_behaviours, const char *buf)