]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: typec: ucsi: yoga_c630: Remove redundant duplicate altmode handling
authorChia-Lin Kao (AceLan) <acelan.kao@canonical.com>
Mon, 13 Jul 2026 08:43:23 +0000 (16:43 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 16 Jul 2026 15:14:34 +0000 (17:14 +0200)
This reverts commit e0c48e42d818 ("usb: typec: ucsi: yoga-c630: remove
duplicate AltModes").

The yoga_c630 driver previously implemented its own duplicate altmode
detection in yoga_c630_ucsi_update_altmodes() to work around buggy EC
firmware that returns duplicate AltModes instead of empty ones.

With the introduction of the common ucsi_altmode_is_duplicate() helper
in both the standard and nvidia registration paths, duplicate detection
is now handled automatically in the core UCSI code. This makes the
yoga_c630-specific implementation added in commit e0c48e42d818 ("usb:
typec: ucsi: yoga-c630: remove duplicate AltModes") redundant.

Remove yoga_c630_ucsi_update_altmodes() and its callback to eliminate
code duplication and simplify the driver. Note that this causes the
driver to switch back from the nvidia registration path to the standard
path, which is the original behavior before commit e0c48e42d818 ("usb:
typec: ucsi: yoga-c630: remove duplicate AltModes"). Both paths now
include duplicate detection, ensuring the firmware bug is still properly
handled.

Signed-off-by: Chia-Lin Kao (AceLan) <acelan.kao@canonical.com>
Link: https://patch.msgid.link/20260713084323.287516-3-acelan.kao@canonical.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/ucsi/ucsi_yoga_c630.c

index 1be18d10184264d0a273f65388180ede5fffe302..bb7b09bc7c1c1f89c946c48a2ed0bcd5e8fac8f6 100644 (file)
@@ -139,28 +139,6 @@ static int yoga_c630_ucsi_sync_control(struct ucsi *ucsi,
        return ret;
 }
 
-static bool yoga_c630_ucsi_update_altmodes(struct ucsi *ucsi,
-                                          u8 recipient,
-                                          struct ucsi_altmode *orig,
-                                          struct ucsi_altmode *updated)
-{
-       int i;
-
-       if (orig[0].svid == 0 || recipient != UCSI_RECIPIENT_SOP)
-               return false;
-
-       /* EC is nice and repeats altmodes again and again. Ignore copies. */
-       for (i = 1; i < UCSI_MAX_ALTMODES; i++) {
-               if (orig[i].svid == orig[0].svid) {
-                       dev_dbg(ucsi->dev, "Found duplicate altmodes, starting from %d\n", i);
-                       memset(&orig[i], 0, (UCSI_MAX_ALTMODES - i) * sizeof(*orig));
-                       break;
-               }
-       }
-
-       return false;
-}
-
 static void yoga_c630_ucsi_update_connector(struct ucsi_connector *con)
 {
        if (con->num == 1)
@@ -174,7 +152,6 @@ static const struct ucsi_operations yoga_c630_ucsi_ops = {
        .read_message_in = yoga_c630_ucsi_read_message_in,
        .sync_control = yoga_c630_ucsi_sync_control,
        .async_control = yoga_c630_ucsi_async_control,
-       .update_altmodes = yoga_c630_ucsi_update_altmodes,
        .update_connector = yoga_c630_ucsi_update_connector,
 };