Skip to content

Commit

Permalink
usb: typec: class: fix typec_altmode_put_partner to put plugs
Browse files Browse the repository at this point in the history
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: 8a37d87 ("usb: typec: Bus type for alternate modes")
Cc: [email protected]
Signed-off-by: RD Babiera <[email protected]>
Reviewed-by: Heikki Krogerus <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
RD Babiera authored and gregkh committed Dec 4, 2023
1 parent 73ea73a commit b17b7fe
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions drivers/usb/typec/class.c
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,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);
Expand Down Expand Up @@ -497,7 +497,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);
Expand Down

0 comments on commit b17b7fe

Please sign in to comment.