summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrishna Kurapati <krishna.kurapati@oss.qualcomm.com>2026-07-23 16:24:56 +0530
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2026-09-01 16:26:02 +0200
commitbe7b1c68cd3e4fc0f5a4e1b85696de1052f21f2f (patch)
treefcfa5449aba0e16728a2811943070f8d8ba99509
parent84b002612b900352eb90e71842c8e1e11f078b81 (diff)
downloadlinux-next-be7b1c68cd3e4fc0f5a4e1b85696de1052f21f2f.tar.gz
linux-next-be7b1c68cd3e4fc0f5a4e1b85696de1052f21f2f.zip
usb: dwc3: qcom: Add support to skip phy management by USB core
DWC3 driver does manage phys itself sufficiently for Qualcomm platforms. If xhci-skip-phy-init is not set, the HCD core does a phy_init and phy_ exit is done only when roothub is being destroyed. Due to this, during system suspend in host mode, although phy_exit is done by DWC3 core, the init_count on phy is never down to zero since HCD core also did an init. consequently causing phy's exit routine to not be called. Hence, add support to skip phy management by USB core. Some Exynos platforms still do rely on USB core for phy_calibrate calls, hence disable USB core management for Qualcomm platforms only. Signed-off-by: Krishna Kurapati <krishna.kurapati@oss.qualcomm.com> Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com> Link: https://patch.msgid.link/20260723-dwc3-skip-init-quirk-v1-1-97682bb44ebd@oss.qualcomm.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/usb/dwc3/dwc3-qcom.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c
index ac68b4218b56..ba26e61df915 100644
--- a/drivers/usb/dwc3/dwc3-qcom.c
+++ b/drivers/usb/dwc3/dwc3-qcom.c
@@ -19,6 +19,7 @@
#include <linux/iopoll.h>
#include <linux/usb/hcd.h>
#include <linux/usb.h>
+#include <linux/property.h>
#include "core.h"
#include "glue.h"
@@ -419,6 +420,16 @@ static irqreturn_t qcom_dwc3_resume_irq(int irq, void *data)
return IRQ_HANDLED;
}
+static int dwc3_qcom_set_swnode(struct device *dev)
+{
+ const struct property_entry props[] = {
+ PROPERTY_ENTRY_BOOL("xhci-skip-phy-init-quirk"),
+ {}
+ };
+
+ return device_create_managed_software_node(dev, props, NULL);
+}
+
static void dwc3_qcom_select_utmi_clk(struct dwc3_qcom *qcom)
{
/* Configure dwc3 to use UTMI clock as PIPE clock not present */
@@ -683,6 +694,10 @@ static int dwc3_qcom_probe(struct platform_device *pdev)
if (ignore_pipe_clk)
dwc3_qcom_select_utmi_clk(qcom);
+ ret = dwc3_qcom_set_swnode(dev);
+ if (ret)
+ goto clk_disable;
+
qcom->mode = usb_get_dr_mode(dev);
if (qcom->mode == USB_DR_MODE_HOST) {