]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
usb: typec: class: fix typec_altmode_put_partner to put plugs
authorRD Babiera <rdbabiera@google.com>
Wed, 29 Nov 2023 19:23:50 +0000 (19:23 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Dec 2023 17:36:48 +0000 (18:36 +0100)
commit b17b7fe6dd5c6ff74b38b0758ca799cdbb79e26e upstream.

When typec_altmode_put_partner is called by a plug altmode upon release,
the port altmode the plug belongs to will not remove its reference to the
plug. The check to see if the altmode being released evaluates against the
released altmode's partner instead of the calling altmode itself, so change
adev in typec_altmode_put_partner to properly refer to the altmode being
released.

typec_altmode_set_partner is not run for port altmodes, so also add a check
in typec_altmode_release to prevent typec_altmode_put_partner() calls on
port altmode release.

Fixes: 8a37d87d72f0 ("usb: typec: Bus type for alternate modes")
Cc: stable@vger.kernel.org
Signed-off-by: RD Babiera <rdbabiera@google.com>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20231129192349.1773623-2-rdbabiera@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/class.c

index 339752fef65e0da9d5c67aa34c65884ae378490d..ea86195c75b83d76524e8008178cab2d2c4bf88b 100644 (file)
@@ -265,7 +265,7 @@ static void typec_altmode_put_partner(struct altmode *altmode)
        if (!partner)
                return;
 
-       adev = &partner->adev;
+       adev = &altmode->adev;
 
        if (is_typec_plug(adev->dev.parent)) {
                struct typec_plug *plug = to_typec_plug(adev->dev.parent);
@@ -495,7 +495,8 @@ static void typec_altmode_release(struct device *dev)
 {
        struct altmode *alt = to_altmode(to_typec_altmode(dev));
 
-       typec_altmode_put_partner(alt);
+       if (!is_typec_port(dev->parent))
+               typec_altmode_put_partner(alt);
 
        altmode_id_remove(alt->adev.dev.parent, alt->id);
        kfree(alt);