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 --- Changes since v2: * Moved changelog under "Signed-off-by" tag
Changes since v1: * Changed commit message for clarity * Added check to typec_altmode_release to only call put_partner if altmode belongs to port partner or plug --- drivers/usb/typec/class.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c index 2e0451bd336e..16a670828dde 100644 --- a/drivers/usb/typec/class.c +++ b/drivers/usb/typec/class.c @@ -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); @@ -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);
base-commit: 24af68a0ed53629bdde7b53ef8c2be72580d293b
On Wed, Nov 29, 2023 at 07:23:50PM +0000, RD Babiera wrote:
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
Changes since v2:
- Moved changelog under "Signed-off-by" tag
Changes since v1:
- Changed commit message for clarity
- Added check to typec_altmode_release to only call put_partner if altmode
belongs to port partner or plug
drivers/usb/typec/class.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c index 2e0451bd336e..16a670828dde 100644 --- a/drivers/usb/typec/class.c +++ b/drivers/usb/typec/class.c @@ -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); @@ -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);
base-commit: 24af68a0ed53629bdde7b53ef8c2be72580d293b
2.43.0.rc1.413.gea7ed67945-goog
linux-stable-mirror@lists.linaro.org