[PATCH v2] usb: typec: ucsi: destroy work queue on fwnode_usb_role_switch_get() fails

From: Haoxiang Li

Date: Wed Jun 24 2026 - 21:17:01 EST


Call destroy_workqueue() if fwnode_usb_role_switch_get() fails
to destroy the work queue con->wq.

Fixes: 3c162511530c ("usb: typec: ucsi: Wait for the USB role switches")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Haoxiang Li <haoxiang_li2024@xxxxxxx>
---
Changes in v2:
- Use a common err_destroy_workqueue error path. Thanks, Heikki!
---
drivers/usb/typec/ucsi/ucsi.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index 61cb24ed820f..4503661b85d5 100644
--- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -1663,9 +1663,12 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)

cap->fwnode = ucsi_find_fwnode(con);
con->usb_role_sw = fwnode_usb_role_switch_get(cap->fwnode);
- if (IS_ERR(con->usb_role_sw))
- return dev_err_probe(ucsi->dev, PTR_ERR(con->usb_role_sw),
- "con%d: failed to get usb role switch\n", con->num);
+ if (IS_ERR(con->usb_role_sw)) {
+ ret = PTR_ERR(con->usb_role_sw);
+ dev_err(ucsi->dev, "con%d: failed to get usb role switch\n",
+ con->num);
+ goto err_destroy_workqueue;
+ }

/* Delay other interactions with the con until registration is complete */
mutex_lock(&con->lock);
@@ -1803,7 +1806,7 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
fwnode_handle_put(cap->fwnode);
out_unlock:
mutex_unlock(&con->lock);
-
+err_destroy_workqueue:
if (ret && con->wq) {
destroy_workqueue(con->wq);
con->wq = NULL;
--
2.25.1