From nobody Sun Feb 8 06:22:47 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 1CB3D3806A7 for ; Thu, 29 Jan 2026 11:14:11 +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=1769685253; cv=none; b=a8g+HvsspM9BdE4oHipouP1BmPTDYwQ8U/3Y8JrH8zu5jIABvF7M5uuanCb5PcDIUIkhSWa+nbuHtbxuEbvB75rdlsGLEvwm94gi37CcJBjgS+ABytMqoxPxSE9o4jdcHtiws3582qCppL2Y9UNU5xxH6JYOjlrrfKOLxE+88DU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769685253; c=relaxed/simple; bh=gv29jU9yC6reY0wiHhfJCVIvhWk6C66NRxUhKVYRvxo=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=gLnC6rOtahy+oB9p/zchRm91RZtSr76vWyvFzOi9NIOieKXo9I28cOs7tmIvYg3sOBpDzT8ZDWX/NxLhcQjx4hMDuuwxXL9zf91di+o/KI6HLkq4Ckkg9G3lTyREVWi8V96WWGJQqK5z/frklyQJt6AxBVREJzxVvWxYommIndA= 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=ZPmlYnFK; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=b6ZYfxnU; 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="ZPmlYnFK"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="b6ZYfxnU" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 60TALFTF2033483 for ; Thu, 29 Jan 2026 11:14:11 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=K+VcBVORyVtu3fsMHfWEPWjAAg/2TKDQXow O+1KDx5g=; b=ZPmlYnFKn8gzsL6akJQDp74crTRdALNofKyUMwKeR0pkC9Af9P1 EAItNm8Vmr0UuKKYOY7Oiy5+nc/ba2fMbctPByewtayQutry4U/5lVpElRB7uCKx PWim4DTTGaf33nGRUutqFypPDiGEGEuwGtXVw7DVTnnT8gIAxQ0LcHqCDSmrLdZz nuTvWLeq8pXkQ1gWynLU29+cSZxE6t9TvPE33E8oM/h0RBu9poaa9hgyVrbiSK1b cnLYPV2d034dAtFHKaymFI7M9/RIw6OZ0pmDRbPbcQSSfHsLFUR6brMrHFCpuyfn 1obVLsilNcPkP833y8/y3YnZXd3dX6+Np6Q== Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bytqy27rb-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 29 Jan 2026 11:14:11 +0000 (GMT) Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2a0d058fc56so6671125ad.3 for ; Thu, 29 Jan 2026 03:14:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1769685250; x=1770290050; 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=K+VcBVORyVtu3fsMHfWEPWjAAg/2TKDQXowO+1KDx5g=; b=b6ZYfxnUxG5biuzzAFB3qd2c/woJ6DGePuK3tR3yMwkWXHOX+dl8J65S2l/jbsxXGW HEEOo1ny9Yv0a/EKnBLtbStqw4Xu0hIg6k+66R7gqToWtTEaGM19JFgZYbnn91NYB+sQ CSV3734x12rM6DHXi4PFgu0UThxnrMQ9C16dGVJF/Y6ZXoSujvt7RKrDeeuqMvH4X30H HGznpv0Fv4VjtAV/+Oq/90DL7eOGaflMwsboEp5eTqUCJ3Mcmdvz59V9XxygnZnT2a/a N6bN9kr83P6QfXBP/3RqDy4man5I72Fg5c6Dp7OtCnOYK3Og6HNbhYfe55K9g7Mw7908 KDoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769685250; x=1770290050; 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=K+VcBVORyVtu3fsMHfWEPWjAAg/2TKDQXowO+1KDx5g=; b=qp6vb2KcpPGSIDJHuYWSFTXTheiY0qkuP3sJSqP/9/1ReQeW7asLrd+oiwoSdrrUOG e8TjhP/ZoHIy2Eg3r7oylWBl5kf5iJv4tdrLHcmvB1r0sD5/J7hyKV64oxsya6N6cBsM NMdSBmDW0xJerNIvaoWo4DD2b4E0WlG5aq4cw5elopwVIWrNkKpPtP7pmHNXcu8FaFBu c5W96FSioCNqAYphKTe95qGfTAax8c32Nj/U0RpqCH1YnsTxvqdRXh3Ag6oRfH0839Sg l+WrO5RN2cX6t56sJKohTI7wPU0JO1dS9EMZ3tRkdo+2y+5ibWbZz4hsT3qZxwEwlowt Lskg== X-Forwarded-Encrypted: i=1; AJvYcCUhuTsXkBOcb/t+Mlfzh1OXGGMGjRUD39zV0R6dJFqv7dkK+5f88ZpzdXr412YB9xOvZyneFJ3sJwKC3D0=@vger.kernel.org X-Gm-Message-State: AOJu0YyPp9uvznXSBXFDUL8pMZ5ZOwOpJMa34ENwR8Ui9NmXZmVQtiSp zhzaBjyjclKL8lqYjyLWHKyyGhfhPx+bIDVp5jtolxWtrzu3yyin2i0TgqKA2nqQdc3T64g/66p xX9UgV8azJvI5JTqmdTbef2TEP28+/OaUNDWfrJWhJ07uVMm2E9SEmpglgL/uk4+CMIC5/Q44wW A= X-Gm-Gg: AZuq6aLIEjfqTmEZzoOh9HxaIJ8mo1s735eHnBeJvSHmtVEdwiKlpsxte9DbUdjM1+X hK2p8YFHqeUorIqG4dstiwb8stDNY5XDOgr8DFzDjHCD0FMdjr+20U8WBIy/rTiC3gWJdI1bKVb 348JScHt7vRdZAD3ETuOZAe4hHynkdnj0Yr8aR+tByYLjdQBwiXVE1soFgNgRtzcbSYtGvft1Z5 K4zaHKXkepw5o/liePr+Si3VyvVBG5bObBa1TgnTWsYy8tDg9RzBq3HTbpZCmZ9GplPRaZgS8+B F1WVUdkhuBCvKuXmcIf6XK1Z9lXbD2JI+W/payhErkAU6nNOdZcZmH1C1cpczQlIQVcUtawFgyb Rqr+DGu2NwH/va8JeeI13PdywF4r3kkTIR3Ebjw== X-Received: by 2002:a17:902:ce83:b0:2a7:99c9:1086 with SMTP id d9443c01a7336-2a870e18d55mr83113055ad.47.1769685249833; Thu, 29 Jan 2026 03:14:09 -0800 (PST) X-Received: by 2002:a17:902:ce83:b0:2a7:99c9:1086 with SMTP id d9443c01a7336-2a870e18d55mr83112865ad.47.1769685249313; Thu, 29 Jan 2026 03:14:09 -0800 (PST) Received: from hu-prashk-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a88b4153e4sm50783985ad.39.2026.01.29.03.14.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Jan 2026 03:14:08 -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 Subject: [PATCH] usb: dwc3: gadget: Move vbus draw to workqueue context Date: Thu, 29 Jan 2026 16:44:03 +0530 Message-Id: <20260129111403.3081730-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-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI5MDA3NSBTYWx0ZWRfXyG/51gauHlz2 4k3Ln2nxIB84mwT29vclBlZ1pItboUHymlUcW7iixkcCn63yFYKXLJ1J4Iwc1YBCnSsUB4pDbWb cf+rgZQm/7xo7VAZudPE/kBC8JbN01gPh4tCa73MmItw8XodoSC23KIwPjLEvWAKkmbqGGL4eAU OpDLN7Aigv/FNdzOn6eBtPqGIg1EI76eDK3c2AE4uaCIQ9YBeOZj3jeMaU6e9Wm/Jknc7puWcD4 7+9+iAKcGWww3v3/BBOX6naHobKOpyQFmZZdV0t5AxyxXYBu3joj/jqWlpvxRGnLWvJvIR4wJ2i 89EdxCGG0E+/f82Zq6x6k+WZ2u3SPTNcXkRZE0Oc+UR1fAlAp+BJDd8MCIjUqI4NOKwrcjxYw6H VZ6ophl4MwGtQ3qF+7Vup6y210G6HbTvJ1wk/Ejt0IwNMa1MIv/GBsZnhIDHAOQ6sdFzJbgUvWl 66QBg/0pczu9JO+s76Q== X-Authority-Analysis: v=2.4 cv=Je2xbEKV c=1 sm=1 tr=0 ts=697b4103 cx=c_pps a=IZJwPbhc+fLeJZngyXXI0A==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=6A1mROMnV1P-AVbdKekA:9 a=uG9DUKGECoFWVXl0Dc02:22 X-Proofpoint-ORIG-GUID: Eao6d0NGBVlWV3iGhMud0RxP48Y9jqrq X-Proofpoint-GUID: Eao6d0NGBVlWV3iGhMud0RxP48Y9jqrq 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-01-29_02,2026-01-28_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 priorityscore=1501 phishscore=0 lowpriorityscore=0 spamscore=0 impostorscore=0 clxscore=1015 bulkscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2601290075 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: 66e0ea341a2a ("usb: dwc3: core: Defer the probe until USB power supp= ly ready") Cc: stable@vger.kernel.org Signed-off-by: Prashanth K Tested-by: Samuel Wu --- 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..c9af126b9695 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->vbus_draw_current); + 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->vbus_draw_current); +} + 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..052fb18c6b5c 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -1178,6 +1178,8 @@ struct dwc3_glue_ops { * @wakeup_pending_funcs: Indicates whether any interface has requested for * function wakeup in bitmap format where bit position * represents interface_id. + * @vbus_draw_work: Workqueue used for scheduling vbus draw work + * @vbus_draw_current: How much current to draw from vbus, in milliAmperes. */ struct dwc3 { struct work_struct drd_work; @@ -1413,6 +1415,8 @@ struct dwc3 { struct dentry *debug_root; u32 gsbuscfg0_reqinfo; u32 wakeup_pending_funcs; + struct work_struct vbus_draw_work; + unsigned int vbus_draw_current; }; =20 #define INCRX_BURST_MODE 0 diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 9355c952c140..03d8a3a151e0 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->vbus_draw_current =3D mA; + schedule_work(&dwc->vbus_draw_work); =20 - return ret; + return 0; } =20 /** --=20 2.34.1