]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
platform/x86: dell-laptop: Use power_supply_charge_types_show/_parse() helpers
authorHans de Goede <hdegoede@redhat.com>
Sat, 21 Dec 2024 12:51:40 +0000 (13:51 +0100)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Thu, 2 Jan 2025 23:48:45 +0000 (00:48 +0100)
Make battery_modes a map between tokens and enum power_supply_charge_type
values instead of between tokens and strings and use the new
power_supply_charge_types_show/_parse() helpers for show()/store()
to ensure that things are handled in the same way as in other drivers.

This also changes battery_supported_modes to be a bitmap of charge-types
(enum power_supply_charge_type values) rather then a bitmap of indices
into battery_modes[].

Reviewed-by: Thomas Weißschuh <linux@weissschuh.net>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://lore.kernel.org/r/20241221125140.345776-2-hdegoede@redhat.com
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/platform/x86/dell/dell-laptop.c

index 5671bd0deee7d1602284ba1b47cfa223a23b9c5f..e6da468daf83692a0c7b4205979b3c6570b89b41 100644 (file)
@@ -103,15 +103,15 @@ static bool mute_led_registered;
 
 struct battery_mode_info {
        int token;
-       const char *label;
+       enum power_supply_charge_type charge_type;
 };
 
 static const struct battery_mode_info battery_modes[] = {
-       { BAT_PRI_AC_MODE_TOKEN,   "Trickle" },
-       { BAT_EXPRESS_MODE_TOKEN,  "Fast" },
-       { BAT_STANDARD_MODE_TOKEN, "Standard" },
-       { BAT_ADAPTIVE_MODE_TOKEN, "Adaptive" },
-       { BAT_CUSTOM_MODE_TOKEN,   "Custom" },
+       { BAT_PRI_AC_MODE_TOKEN,   POWER_SUPPLY_CHARGE_TYPE_TRICKLE },
+       { BAT_EXPRESS_MODE_TOKEN,  POWER_SUPPLY_CHARGE_TYPE_FAST },
+       { BAT_STANDARD_MODE_TOKEN, POWER_SUPPLY_CHARGE_TYPE_STANDARD },
+       { BAT_ADAPTIVE_MODE_TOKEN, POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE },
+       { BAT_CUSTOM_MODE_TOKEN,   POWER_SUPPLY_CHARGE_TYPE_CUSTOM },
 };
 static u32 battery_supported_modes;
 
@@ -2261,46 +2261,42 @@ static ssize_t charge_types_show(struct device *dev,
                struct device_attribute *attr,
                char *buf)
 {
-       ssize_t count = 0;
+       enum power_supply_charge_type charge_type;
        int i;
 
        for (i = 0; i < ARRAY_SIZE(battery_modes); i++) {
-               bool active;
+               charge_type = battery_modes[i].charge_type;
 
-               if (!(battery_supported_modes & BIT(i)))
+               if (!(battery_supported_modes & BIT(charge_type)))
                        continue;
 
-               active = dell_battery_mode_is_active(battery_modes[i].token);
-               count += sysfs_emit_at(buf, count, active ? "[%s] " : "%s ",
-                               battery_modes[i].label);
-       }
+               if (!dell_battery_mode_is_active(battery_modes[i].token))
+                       continue;
 
-       /* convert the last space to a newline */
-       if (count > 0)
-               count--;
-       count += sysfs_emit_at(buf, count, "\n");
+               return power_supply_charge_types_show(dev, battery_supported_modes,
+                                                     charge_type, buf);
+       }
 
-       return count;
+       /* No active mode found */
+       return -EIO;
 }
 
 static ssize_t charge_types_store(struct device *dev,
                struct device_attribute *attr,
                const char *buf, size_t size)
 {
-       bool matched = false;
-       int err, i;
+       int charge_type, err, i;
 
-       for (i = 0; i < ARRAY_SIZE(battery_modes); i++) {
-               if (!(battery_supported_modes & BIT(i)))
-                       continue;
+       charge_type = power_supply_charge_types_parse(battery_supported_modes, buf);
+       if (charge_type < 0)
+               return charge_type;
 
-               if (sysfs_streq(battery_modes[i].label, buf)) {
-                       matched = true;
+       for (i = 0; i < ARRAY_SIZE(battery_modes); i++) {
+               if (battery_modes[i].charge_type == charge_type)
                        break;
-               }
        }
-       if (!matched)
-               return -EINVAL;
+       if (i == ARRAY_SIZE(battery_modes))
+               return -ENOENT;
 
        err = dell_battery_set_mode(battery_modes[i].token);
        if (err)
@@ -2430,7 +2426,7 @@ static u32 __init battery_get_supported_modes(void)
 
        for (i = 0; i < ARRAY_SIZE(battery_modes); i++) {
                if (dell_smbios_find_token(battery_modes[i].token))
-                       modes |= BIT(i);
+                       modes |= BIT(battery_modes[i].charge_type);
        }
 
        return modes;