From nobody Sun Feb 8 06:22:10 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8EDE72E1730 for ; Wed, 4 Feb 2026 05:42:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770183734; cv=none; b=MM/LPwctjs7jyGmLvJVpKZau+q0s9dOwikTJb6oMTZaW1yQFsQn2cvWeTU1tVZ+GN8E2OldTUYWNbKT6EyOXebpFLyJUOziQifH9vU76E2wyrYkQTZ0OoQdClunQb5m9CyjKFswEcz8/xl9xRBZuiC9m7XQeUiTkxy81g6GNSrc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770183734; c=relaxed/simple; bh=oIUaF/QJNL9/z+fgmZ6beiw/h0T+YfEu54qjHDcbuCE=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=OMTZCXGZEvmiHC3cFjZHkVhhOGKy/yeXjcdC5NRwbnsTaBaTA9mUp2QWOVhMbcn4+AUdSwCGAMmVL3aQYvywVZt8VVnt7LvFEMoqvV989cmD9wB25hVBv/oYxKmrdVYwO9WTbtPFahiszj/1LBuun6gxVevHM9NjlzqXPyAl0hk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=OyJAt/id; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Rt3njatt; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="OyJAt/id"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Rt3njatt" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6144Uv9E2053930 for ; Wed, 4 Feb 2026 05:42:13 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:message-id:mime-version :subject:to; s=qcppdkim1; bh=Vjdjz/Dh5zHN725zkxEBwsn1d6NO6EMDk0s q/lRFUCQ=; b=OyJAt/idZpvw6x7BOFF0w+Ac0Y9QzuDNO1vU0XzsX67JkFjgZz0 c90ftGdaPs9ofdv2e41U77jJ2nBFNH5RXDOeYsbGoSOJstcdiTWjoSMWt5lse/AX FCic1YxYJvReJ6zq01/0IqdtJm6xj3R9HsUAXNDl1TlM3F2zB0cQvkf58Sk1Kh1W jmf5xV5SEt+OeLyf1NZLQhFiGuexOs4TnyquW8OIq+meCaaLMyC/40XfPtF4tfz7 eQyn4rWpXDQVFdfb4tHRKAgsCTisFrk4mOREX6poH2coPK2aE43Ci/UVSy+DflVF w37vupsRzh+yNwJxOjtURjoiwHRX0FFSLwA== Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4c3gsr31dd-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 04 Feb 2026 05:42:13 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-352c7924ebcso6714613a91.3 for ; Tue, 03 Feb 2026 21:42:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1770183732; x=1770788532; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=Vjdjz/Dh5zHN725zkxEBwsn1d6NO6EMDk0sq/lRFUCQ=; b=Rt3njatt7IOfbOlDxXG4XrtGwG9qhjXCOycjiL4VoP+NoS167IXpOeFu0DOSD6KR19 rVBLSns9K5rSl+HPbsLz80Q+0ze+0ZvWD+3cy+fwurrP9v+GiveVAZ1AUK17f8AdkioX HrZUtkQLlNTz/50eNAmIvN8nO9WPVI8tlP3OMaT6cxVhKxABkluLIWTyABnBNdAvyS2W fdPiWXHA9F5IP+M01kqnJYOGP/nIydO75pxzD2vlWO3ukeJZ3zi+imvMKOz5cmu64tot ezj2YRJptON/iFKtNySYe0ZVzgMobqVPaFe+BLDukLmqVvwLATjtYtosBYjLJfHl8x8K 8TFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770183732; x=1770788532; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Vjdjz/Dh5zHN725zkxEBwsn1d6NO6EMDk0sq/lRFUCQ=; b=M8U14qot7MgYo53bFA61BV3m/DY/Za/ULD4L2aFp0H71DvT3rXskesOCUSjW3hejdk 1nBRpFvnYqChnIWiA7nH5bpiPK4io9SIV6UEckVmJFg36c+yNH1H+jYK3FbBAF3BwrNt Ac9s+UhoweCBnHSEmwoXZs1RXjOMEU+YYh2najGcP22jkoiBXt6xFWgEoPSUT8Qf/xXU hmER6qbBFO1bwYJJ33hJhysS1ICu7QCDYpF7zPUONupBU4cobeO28uqABqi0dtj4I0nl 9EMYR1cLJN4jnAgY0+TPhZaiLEIASu0Z+4vnvM7T8okhuZyZQb5sLBB7yZKCkAHmv1Yv 9evA== X-Forwarded-Encrypted: i=1; AJvYcCXjY11obA3yDpse9uy1zk0miB1DfL72EOBePaBmFrxm5r38Hb9s1XmiaKcS8ibjNuLG71EFveKtIFv9JgM=@vger.kernel.org X-Gm-Message-State: AOJu0YwP4QFppEgQJPQpzcnEgX33jpQ2clgP/yGn+3IyJHvVkZt7x/D8 o95OPKENSmwmzhyoTZ8sU5WuM4ly8uyovMPprOv61sSxDK3d5/CrDGoaaILfaTpNp5sCV/xv28e +DpPhCN62eszXaHVL62nwX9mMZG6qpszcKhr7TFNVHYE1rqunVK/5OhOPDGp1G8SCHUA= X-Gm-Gg: AZuq6aJbszbo1hQKwIGp2tTlrCzCgcaShv+HEa4WdRjKOLjkHfTpynrhtCUSrV8A+Hb z9vRRtGLvsl6BkSJGcA8o/2s9Oi0QywR6vzhA8EiwgjXxE+I/iNYVPgtF0xP1lCLrKdWnjHetup AG4dWKGx8hAhEv4/qvHCXZoJ4sqHztYx2Xs6FCW/dgK3YW7d23zy4t2llezXxpuGUSuYJ+fylT+ 5fCoubtvSgViSh/Re+NoR6eyHjPGO+9+sAm+1CxAWqtsnJ/zUV7fTh+Ru1IlZpnyIaNWhqA2mzz n2QGsM7GSHjXgE16iNssFFA7PluzX2ZrOsb8pwlEHalq6Vge1D6hzmTK9A9rRoG5HGYbIVNZDbe iBhZ6Ivi3lkHodx/z6KnFI+Ijql3zBytP2jX/oA== X-Received: by 2002:a17:90b:558e:b0:34c:75d1:6f90 with SMTP id 98e67ed59e1d1-354871ae618mr1838016a91.17.1770183731627; Tue, 03 Feb 2026 21:42:11 -0800 (PST) X-Received: by 2002:a17:90b:558e:b0:34c:75d1:6f90 with SMTP id 98e67ed59e1d1-354871ae618mr1837996a91.17.1770183731188; Tue, 03 Feb 2026 21:42:11 -0800 (PST) Received: from hu-prashk-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-354860fe962sm1208411a91.8.2026.02.03.21.42.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 21:42:10 -0800 (PST) From: Prashanth K To: Thinh Nguyen , Greg Kroah-Hartman Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Prashanth K , stable@vger.kernel.org, Samuel Wu Subject: [PATCH v3] usb: dwc3: gadget: Move vbus draw to workqueue context Date: Wed, 4 Feb 2026 11:11:55 +0530 Message-Id: <20260204054155.3063825-1-prashanth.k@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authority-Analysis: v=2.4 cv=A+9h/qWG c=1 sm=1 tr=0 ts=6982dc35 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=1XWaLZrsAAAA:8 a=jIQo8A4GAAAA:8 a=H-GNW7O56VsSoHbONaQA:9 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-ORIG-GUID: ut8Or7UhgE-LVU-aNzekSgSxGGCK7kTt X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjA0MDAzOSBTYWx0ZWRfX7892wyk7AZvm ULrpxToYANtso+fqEme9BhOJ1eVOZE83R5DezHxI0dvlebqv+gV6TfrT3fjZgdziUnhqVAGGrAC FVMCReynk8Px/ZyG16lDiZnHuBvT622dgCeKAEIEC8uotfNHagCD8KONpUgTEVydKxCn1/x/67m VARR+QLSXehgnMufrWmTkJAyWiYXPfEGzuUu/U53FuUdNitV2Q46IX4diNcHwjROr6Tzh8CHGOf hJm7zDLGEPk9A13x8nIkfuTwUkTS4Owyx2fQLT3H9rRLyP4IEFMT5njA0+WMhuCviwmkYHCZoT2 JaJGTEl5ktWFuppulJuoJPU/n2aSwm35po4PtDe37oS6iRmB7QQdyZ+cAollEEOMydhRqrfPn0K uR89JAfd2a0q/bloynFE2hgp6bwLadtCy5xTidszsrxaJlK9oiQ1x7OtwJvgIG9Vnhb8rVTo6FW 8x4s79vnubttk/67GrQ== X-Proofpoint-GUID: ut8Or7UhgE-LVU-aNzekSgSxGGCK7kTt X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-03_07,2026-02-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 adultscore=0 bulkscore=0 malwarescore=0 priorityscore=1501 clxscore=1015 impostorscore=0 suspectscore=0 lowpriorityscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602040039 Content-Type: text/plain; charset="utf-8" Currently dwc3_gadget_vbus_draw() can be called from atomic context, which in turn invokes power-supply-core APIs. And some these PMIC APIs have operations that may sleep, leading to kernel panic. Fix this by moving the vbus_draw into a workqueue context. Fixes: 99288de36020 ("usb: dwc3: add an alternate path in vbus_draw callbac= k") Cc: stable@vger.kernel.org Tested-by: Samuel Wu Acked-by: Thinh Nguyen Signed-off-by: Prashanth K --- Changes in v3: - Updated the documentation, and changed the fixed tag - Link to v2: https://lore.kernel.org/all/20260203050430.2211487-1-prashant= h.k@oss.qualcomm.com/ Changes in v2: - Renamed vbus_draw_to_current limit, and rearranged the new variables. - Link to v1: https://lore.kernel.org/all/20260129111403.3081730-1-prashant= h.k@oss.qualcomm.com/ drivers/usb/dwc3/core.c | 19 ++++++++++++++++++- drivers/usb/dwc3/core.h | 4 ++++ drivers/usb/dwc3/gadget.c | 8 +++----- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index f32b67bf73a4..cb5e829aaae8 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -2155,6 +2155,20 @@ static int dwc3_get_num_ports(struct dwc3 *dwc) return 0; } =20 +static void dwc3_vbus_draw_work(struct work_struct *work) +{ + struct dwc3 *dwc =3D container_of(work, struct dwc3, vbus_draw_work); + union power_supply_propval val =3D {0}; + int ret; + + val.intval =3D 1000 * (dwc->current_limit); + ret =3D power_supply_set_property(dwc->usb_psy, POWER_SUPPLY_PROP_INPUT_C= URRENT_LIMIT, &val); + + if (ret < 0) + dev_dbg(dwc->dev, "Error (%d) setting vbus draw (%d mA)\n", + ret, dwc->current_limit); +} + static struct power_supply *dwc3_get_usb_power_supply(struct dwc3 *dwc) { struct power_supply *usb_psy; @@ -2169,6 +2183,7 @@ static struct power_supply *dwc3_get_usb_power_supply= (struct dwc3 *dwc) if (!usb_psy) return ERR_PTR(-EPROBE_DEFER); =20 + INIT_WORK(&dwc->vbus_draw_work, dwc3_vbus_draw_work); return usb_psy; } =20 @@ -2395,8 +2410,10 @@ void dwc3_core_remove(struct dwc3 *dwc) =20 dwc3_free_event_buffers(dwc); =20 - if (dwc->usb_psy) + if (dwc->usb_psy) { + cancel_work_sync(&dwc->vbus_draw_work); power_supply_put(dwc->usb_psy); + } } EXPORT_SYMBOL_GPL(dwc3_core_remove); =20 diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 08cc6f2b5c23..a35b3db1f9f3 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -1058,6 +1058,8 @@ struct dwc3_glue_ops { * @role_switch_default_mode: default operation mode of controller while * usb role is USB_ROLE_NONE. * @usb_psy: pointer to power supply interface. + * @vbus_draw_work: Work to set the vbus drawing limit + * @current_limit: How much current to draw from vbus, in milliAmperes. * @usb2_phy: pointer to USB2 PHY * @usb3_phy: pointer to USB3 PHY * @usb2_generic_phy: pointer to array of USB2 PHYs @@ -1244,6 +1246,8 @@ struct dwc3 { enum usb_dr_mode role_switch_default_mode; =20 struct power_supply *usb_psy; + struct work_struct vbus_draw_work; + unsigned int current_limit; =20 u32 fladj; u32 ref_clk_per; diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 9355c952c140..8562cc358694 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -3124,8 +3124,6 @@ static void dwc3_gadget_set_ssp_rate(struct usb_gadge= t *g, static int dwc3_gadget_vbus_draw(struct usb_gadget *g, unsigned int mA) { struct dwc3 *dwc =3D gadget_to_dwc(g); - union power_supply_propval val =3D {0}; - int ret; =20 if (dwc->usb2_phy) return usb_phy_set_power(dwc->usb2_phy, mA); @@ -3133,10 +3131,10 @@ static int dwc3_gadget_vbus_draw(struct usb_gadget = *g, unsigned int mA) if (!dwc->usb_psy) return -EOPNOTSUPP; =20 - val.intval =3D 1000 * mA; - ret =3D power_supply_set_property(dwc->usb_psy, POWER_SUPPLY_PROP_INPUT_C= URRENT_LIMIT, &val); + dwc->current_limit =3D mA; + schedule_work(&dwc->vbus_draw_work); =20 - return ret; + return 0; } =20 /** --=20 2.34.1