From nobody Fri Apr 3 06:11:23 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 7264336C9ED for ; Mon, 9 Mar 2026 20:33:45 +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=1773088427; cv=none; b=RzyATlul65Pdw1U27b3BqyOqSCOrPl+T8OUixjECdUd8kaCagTUGcci8ZLD3wvqCbxEs53+Dxa3CV1GKBOkSZRy0mmekK2DDvehJ6LQ4Z7MppAajcvgAPdnd5HgEBQ0AbMq11XehWtsxNLJh6WJRukU+82oPZuXcwRkqbkQY0FQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773088427; c=relaxed/simple; bh=K5zCrwyUodQrO/S0E+Ed2/TLcRf4SRw+FFja5CQCvCY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=CLmfpZRs7v/U+kx4Au76Cv5kYOR4s7P9coFZyAb9lgsKT9QRN9iQ+l3rTAFmmWk+j1Dv0YkCWgIyR1RAzOqmCii0OmP36uOSKxspmSA04f3yiMTQ7/cZBnKdXdG8Ez/4UHMDGfulIQeioW/u+XcjwjhVm2xiMh1hpFiSbkfQYI4= 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=VamMzwDA; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=WvAoScaM; 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="VamMzwDA"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="WvAoScaM" 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 629HBhOg1659813 for ; Mon, 9 Mar 2026 20:33:44 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=Tv7zku8qccC AqWcffUyfjdmURlu+0i433EEONBaxuaw=; b=VamMzwDA4934SEWfsBbgJPTLxAU m2+5vpQON3WbyzlrGRKlFK7Z/2FbIxML/TrQ9Fd5wlld8FlXd8pKmC8vZ6GjwJ/N VM7nFtK5tUl2soDLrGM67xObgukCVoygvsgIqSJeRIWlsIZF+iphSVy4ndvMOkn7 zJKD6iIqh0DXFJtMNyfqv20xzzYzRg0bN5bl3OG0PWWcZ4+O8EwlAlK0gKhqP+9R tJH2AMIte3/KqJdwWwKT4TkoQut07ip+Rhe2u3mmguHfIwXdEbnqade0EmTKuxgA 4lxQ7nSgH1/Izf4gx29C5NqvWD52kWb5b1vz46JrQyDcejRl2XYkhgtvMbA== Received: from mail-ot1-f72.google.com (mail-ot1-f72.google.com [209.85.210.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4csyr417nx-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 09 Mar 2026 20:33:44 +0000 (GMT) Received: by mail-ot1-f72.google.com with SMTP id 46e09a7af769-7d73e3cf94eso8149938a34.2 for ; Mon, 09 Mar 2026 13:33:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773088423; x=1773693223; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Tv7zku8qccCAqWcffUyfjdmURlu+0i433EEONBaxuaw=; b=WvAoScaMRDaZzX0ubVDr1DU7NFM05AVQM3hHAj3PD3V3Z2QybuojE5ru4/ehAyMkRS sZ9mo9wax5CNF3+ZTsepQngDC0ikuOOAb1bf4xBHwJ3RArl+j0ZwSbgfrVeARPuGoELC 71un3YGwVpQrjEmneCWhnfLRXscDqIxeU8vVttjwnU962p2J+hk52EWxRxjf9n5Uca/w oTboU8LFdyMHs/pktYDQR6lfj4tTxlDBsAeamOlxMut3p5rzAXY1PkobhxPF1KeeIWZF hhivFdGovXc/+lmZx2yDTsE9lkJPEjS5E+25YyJrVgiOOkY7vnzPwp2fli2d/A8WzW9u 3J1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773088423; x=1773693223; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Tv7zku8qccCAqWcffUyfjdmURlu+0i433EEONBaxuaw=; b=fa+VhT6NZQIR8Tu+XiRQZYHr1ovwKrW6tDhM8jZxr71Otk/DVaYNTPwlGgk7G5DDjV 1SWTXYANCC4tgbgAVjGYAxkZODR395m1dbOgInsZseDJnXtJq4KnlaJgu9SNiYSNgbns 2Q4jCg/ot0Juk58bDFytapNESt4PL7hpzONCLrb45l2zAhKTuUqS7HPwNn2qUg9KYFRK KlEAIny0No3qAZ8alZ+MFpXs6ADRWkB1XcZPoqkLhrDOHHuL98+aX4GL+k3+PP/sV9L2 eUVIiyopob88xbQx1AmnONYjsFw1EzsgH3hoLwSAN97xtFNSyqp56qpWoP5ANoa11cyh N/og== X-Forwarded-Encrypted: i=1; AJvYcCVmsJJ2XWOYnghI/DvEmF4lTFIzaKgdxwxrgy3yvq31US0tDy6X+yEP1qz3xx84kOweHONhCeMnrs3Ab7I=@vger.kernel.org X-Gm-Message-State: AOJu0Yxtcnt5Nv9+b7CA13uaSxhwki5yIjpDq1Abo9E3eqmZjynoIugu kaCB7RclE0G5MjRIxm8a0b9SbDoc8nFzptXz946txSil9FHZSuZwG9iFi6r5epBRAzX0aatJa0G NKessFXPR+n0B7HMXxxZWfn8iVGdTehj48Hb6CS0GzfkmURtJYAZLqEVbl5Lr0asgI/c= X-Gm-Gg: ATEYQzy342oPs6VkLErTIPToOY6QWtW7MOxuWDt1VYICckIL7vMY5MUeCV95I2vIPiI 5QUr0DJWcjUAqNPgkRLDLLMfh4UI03+P3swtbiufHCmoOQBgioYbHHae8JcFLob5v24wuvDPESE zgrypVDPUGT7sL+ZNg3ltKEFxBXjhLFQD3MhZjsf+9VSjqPN3l4j4obTkdY03gw81s8vOe7UH/C 0OiWnZGQqtAf9TpQvDFJhs7emm04UpzG7E+h2I0bNRUSMTOG97UH+kr/h51vmOVA9pm5EOmeS9g KmgwNLIucBEofSqj+jJRZfGVj9ExQA8vPuftoqmx1Fuz/jzMsDVLTVtsyhFxOnF2eslzZ68TwJN zWM+RSp5Rf+UxaKCdgYWZ+i0g8tH/KEJwUA+NQnSZV/7BnOW820g5F/6yMLq3Ek3r+Uotb2WIdJ Y= X-Received: by 2002:a05:6830:d18:b0:7ce:2b34:deca with SMTP id 46e09a7af769-7d72705979fmr7317833a34.28.1773088423471; Mon, 09 Mar 2026 13:33:43 -0700 (PDT) X-Received: by 2002:a05:6830:d18:b0:7ce:2b34:deca with SMTP id 46e09a7af769-7d72705979fmr7317804a34.28.1773088422943; Mon, 09 Mar 2026 13:33:42 -0700 (PDT) Received: from hu-eserrao-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7d74885b5a4sm3036494a34.23.2026.03.09.13.33.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Mar 2026 13:33:42 -0700 (PDT) From: Elson Serrao To: Greg Kroah-Hartman , Bjorn Andersson , Konrad Dybcio , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Souradeep Chowdhury Cc: linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH RFC v3 03/10] usb: misc: qcom_eud: add per-port High-Speed PHY control Date: Mon, 9 Mar 2026 13:33:30 -0700 Message-Id: <20260309203337.803986-4-elson.serrao@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260309203337.803986-1-elson.serrao@oss.qualcomm.com> References: <20260309203337.803986-1-elson.serrao@oss.qualcomm.com> 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: AW1haW4tMjYwMzA5MDE4MiBTYWx0ZWRfX2yG4iFBrxOI3 0+vXCCM9mEXRtdVRsEjbDic3LTv8DfxkGh+bbQqbTZWjZmuVdffX/Wh+Pri2QBpwOnSHpXn8HxC IyY1CjUV5RUlw94i4fPaTXacWtUofLPngulYi2TiJYDqCHtCUCKKJvYcT6XWGT9KCmNIBDdrpma PTI0JvLwk8kivwkWjLFSp6fMx7xOOohJWXPBpDiSmJ44t75O+5ncEP+I1IzB2ZSc6itXpYVJQbU ynA8xHhzjiCSD4vGpw6ScnidbYoN2CWyDZMEDCrhFbvnL/IiBN2gKAKjaoqiKvFQjW7z8VvWZm4 46InsdjMbN4ZVtZJqTnOgyw2stKqfB2rHe20Tq8qJbVh1PMfINAY5GHBCWExov2ciuPdu1BAGAO KEixXmtuKuE8V+KLPGsQf4EGHew1/6dnB7rxTZD7SsJ2UjdnNJ6Z/IdjAlW1YmIMWO61hPu3DYi jIE/dfFFama5t5CXYDg== X-Proofpoint-GUID: Nvmoy-qwabB57HxqTI9mk6XCA3PiRX1U X-Proofpoint-ORIG-GUID: Nvmoy-qwabB57HxqTI9mk6XCA3PiRX1U X-Authority-Analysis: v=2.4 cv=KNRXzVFo c=1 sm=1 tr=0 ts=69af2ea8 cx=c_pps a=+3WqYijBVYhDct2f5Fivkw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=EUspDBNiAAAA:8 a=U2yq5S0A3DoD2uQntOoA:9 a=eYe2g0i6gJ5uXG_o6N4q:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-09_05,2026-03-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 spamscore=0 bulkscore=0 priorityscore=1501 suspectscore=0 clxscore=1015 lowpriorityscore=0 malwarescore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2603090182 Content-Type: text/plain; charset="utf-8" EUD hardware can support multiple High-Speed USB ports, each routed through its own PHY. The active port is selected in hardware via the EUD_PORT_SEL register. As a High-Speed hub, EUD requires access to the High-Speed PHY associated with the active port. To support this multi-port capability, the driver must manage PHY resources on a per-port basis, ensuring that the PHY for the currently selected port is properly initialized and powered. This patch adds per-port PHY management to the driver. The driver now powers the appropriate PHY based on the selected and enabled port, ensuring correct operation when EUD is enabled. Historically, EUD appeared to work on single-port systems because the USB controller kept the PHY initialized. However, EUD is designed to operate independently of the USB controller and therefore requires explicit PHY control for proper operation. Signed-off-by: Elson Serrao --- drivers/usb/misc/Kconfig | 1 + drivers/usb/misc/qcom_eud.c | 103 +++++++++++++++++++++++++++++++++++- 2 files changed, 103 insertions(+), 1 deletion(-) diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig index 0b56b773dbdf..2d9190c756f9 100644 --- a/drivers/usb/misc/Kconfig +++ b/drivers/usb/misc/Kconfig @@ -147,6 +147,7 @@ config USB_APPLEDISPLAY config USB_QCOM_EUD tristate "QCOM Embedded USB Debugger(EUD) Driver" depends on ARCH_QCOM || COMPILE_TEST + depends on OF select QCOM_SCM select USB_ROLE_SWITCH help diff --git a/drivers/usb/misc/qcom_eud.c b/drivers/usb/misc/qcom_eud.c index 1a136f8f1ae5..b042e01c6ca2 100644 --- a/drivers/usb/misc/qcom_eud.c +++ b/drivers/usb/misc/qcom_eud.c @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include #include @@ -37,23 +39,75 @@ struct eud_chip { struct device *dev; struct usb_role_switch *role_sw; + struct phy *phy[EUD_MAX_PORTS]; void __iomem *base; phys_addr_t mode_mgr; unsigned int int_status; int irq; bool enabled; bool usb_attached; + bool phy_enabled; u8 port_idx; }; =20 +static int eud_phy_enable(struct eud_chip *chip) +{ + struct phy *phy; + int ret; + + if (chip->phy_enabled) + return 0; + + phy =3D chip->phy[chip->port_idx]; + + ret =3D phy_init(phy); + if (ret) { + dev_err(chip->dev, "Failed to initialize USB2 PHY for port %u: %d\n", + chip->port_idx, ret); + return ret; + } + + ret =3D phy_power_on(phy); + if (ret) { + dev_err(chip->dev, "Failed to power on USB2 PHY for port %u: %d\n", + chip->port_idx, ret); + phy_exit(phy); + return ret; + } + + chip->phy_enabled =3D true; + + return 0; +} + +static void eud_phy_disable(struct eud_chip *chip) +{ + struct phy *phy; + + if (!chip->phy_enabled) + return; + + phy =3D chip->phy[chip->port_idx]; + + phy_power_off(phy); + phy_exit(phy); + chip->phy_enabled =3D false; +} + static int enable_eud(struct eud_chip *priv) { int ret; =20 - ret =3D qcom_scm_io_writel(priv->mode_mgr + EUD_REG_EUD_EN2, 1); + ret =3D eud_phy_enable(priv); if (ret) return ret; =20 + ret =3D qcom_scm_io_writel(priv->mode_mgr + EUD_REG_EUD_EN2, 1); + if (ret) { + eud_phy_disable(priv); + return ret; + } + writel(EUD_ENABLE, priv->base + EUD_REG_CSR_EUD_EN); writel(EUD_INT_VBUS | EUD_INT_SAFE_MODE, priv->base + EUD_REG_INT1_EN_MASK); @@ -70,6 +124,8 @@ static int disable_eud(struct eud_chip *priv) return ret; =20 writel(0, priv->base + EUD_REG_CSR_EUD_EN); + eud_phy_disable(priv); + return 0; } =20 @@ -132,6 +188,11 @@ static ssize_t port_store(struct device *dev, if (port >=3D EUD_MAX_PORTS) return -EINVAL; =20 + if (!chip->phy[port]) { + dev_err(chip->dev, "EUD not supported on selected port\n"); + return -EOPNOTSUPP; + } + /* Port selection must be done before enabling EUD */ if (chip->enabled) { dev_err(chip->dev, "Cannot change port while EUD is enabled\n"); @@ -224,6 +285,35 @@ static irqreturn_t handle_eud_irq_thread(int irq, void= *data) return IRQ_HANDLED; } =20 +static int eud_parse_dt_port(struct eud_chip *chip, u8 port_id) +{ + struct device_node *controller_node; + struct phy *phy; + + /* + * Multiply port_id by 2 to get controller port number: + * port_id 0 -> port@0 (primary USB controller) + * port_id 1 -> port@2 (secondary USB controller) + */ + controller_node =3D of_graph_get_remote_node(chip->dev->of_node, + port_id * 2, -1); + if (!controller_node) + return dev_err_probe(chip->dev, -ENODEV, + "failed to get controller node for port %u\n", port_id); + + phy =3D devm_of_phy_get_by_index(chip->dev, controller_node, 0); + if (IS_ERR(phy)) { + of_node_put(controller_node); + return dev_err_probe(chip->dev, PTR_ERR(phy), + "failed to get HS PHY for port %u\n", port_id); + } + chip->phy[port_id] =3D phy; + + of_node_put(controller_node); + + return 0; +} + static void eud_role_switch_release(void *data) { struct eud_chip *chip =3D data; @@ -243,6 +333,17 @@ static int eud_probe(struct platform_device *pdev) =20 chip->dev =3D &pdev->dev; =20 + /* + * Parse the DT resources for primary port. + * This is the default EUD port and is mandatory. + */ + ret =3D eud_parse_dt_port(chip, 0); + if (ret) + return ret; + + /* Secondary port is optional */ + eud_parse_dt_port(chip, 1); + chip->role_sw =3D usb_role_switch_get(&pdev->dev); if (IS_ERR(chip->role_sw)) return dev_err_probe(chip->dev, PTR_ERR(chip->role_sw), --=20 2.34.1