]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
power: supply: ucs1002: Adjust ucs1002_set_usb_type() to accept string values
authorHans de Goede <hdegoede@redhat.com>
Sat, 31 Aug 2024 14:20:35 +0000 (16:20 +0200)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Tue, 3 Sep 2024 21:20:27 +0000 (23:20 +0200)
power_supply_sysfs.c accept wrrites of strings to "usb_type" for strings
values matching an entry in POWER_SUPPLY_USB_TYPE_TEXT[]. If such a
string value is written then the int value passed to ucs1002_set_property()
will be an enum power_supply_usb_type value.

Before this change ucs1002_set_usb_type() expected the value to be an index
into ucs1002_usb_types[]. Adjust ucs1002_set_usb_type() to use the enum
value directly so that writing string values works.

The list of supported types in ucs1002_usb_types[] is: PD, SDP, DCP, CDP.
The [POWER_SUPPLY_USB_TYPE_]SDP, DCP and CDP enum labels have a value of
1, 2 and 3. So userspace selecting SDP, DCP or CDP by writing 1, 2 or 3
will keep working. POWER_SUPPLY_USB_TYPE_PD which is mapped to the ucs1002
dedicated mode however has a value of 6. Before this change writing 0 would
select the dedicated mode. To preserve userspace API compatibility also map
POWER_SUPPLY_USB_TYPE_UNKNOWN (which is 0) to the dedicated mode.

Cc: Enric Balletbo Serra <enric.balletbo@collabora.com>
Cc: Andrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20240831142039.28830-3-hdegoede@redhat.com
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/ucs1002_power.c

index 7970843a4f480d70999cf54449360aedf85f9598..b67d5b03d93e5f36d8633c43a8a6d9b19e35aa43 100644 (file)
@@ -308,10 +308,13 @@ static int ucs1002_set_usb_type(struct ucs1002_info *info, int val)
 {
        unsigned int mode;
 
-       if (val < 0 || val >= ARRAY_SIZE(ucs1002_usb_types))
-               return -EINVAL;
-
-       switch (ucs1002_usb_types[val]) {
+       switch (val) {
+       /*
+        * POWER_SUPPLY_USB_TYPE_UNKNOWN == 0, map this to dedicated for
+        * userspace API compatibility with older versions of this driver
+        * which mapped 0 to dedicated.
+        */
+       case POWER_SUPPLY_USB_TYPE_UNKNOWN:
        case POWER_SUPPLY_USB_TYPE_PD:
                mode = V_SET_ACTIVE_MODE_DEDICATED;
                break;