summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRD Babiera <rdbabiera@google.com>2023-11-29 19:23:50 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-12-13 18:27:05 +0100
commit713f6ff32651d4da07790cce55ab9d5dea9ca3d7 (patch)
treea69334bbb56da7f5536a1c20cbed8a44f64eb5b1
parentf16d5355aab7c370824a760832935fa734598040 (diff)
downloadlinux-713f6ff32651d4da07790cce55ab9d5dea9ca3d7.tar.gz
linux-713f6ff32651d4da07790cce55ab9d5dea9ca3d7.tar.bz2
linux-713f6ff32651d4da07790cce55ab9d5dea9ca3d7.zip
usb: typec: class: fix typec_altmode_put_partner to put plugs
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>
-rw-r--r--drivers/usb/typec/class.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
index 9d3a35b2046d..18b35e817361 100644
--- a/drivers/usb/typec/class.c
+++ b/drivers/usb/typec/class.c
@@ -194,7 +194,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);
@@ -424,7 +424,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);