From nobody Sat Jul 25 05:29:57 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.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 A1C6037882A for ; Fri, 17 Jul 2026 09:58:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784282326; cv=none; b=ffUg+OGCENPbHJm+B7o+7s+g/cf4FFHBMcVcpdWpQyN7tCh249TR8pyAuKCYGeGHMOV/DpBXkHk/uN5BDBbtwmva6fUbMnSHcjR8NUDoPlAIDpSS466fQhgVq1Cm+i1/UOBpjuO8WfT2hgTtZ/ZMTiVUiA1neLUE3hH1DANh3d8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784282326; c=relaxed/simple; bh=P1Qbj/JFHFMO8P73x0LZ+S7oLzHtylxsVmlF1u/snvQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=j2MGibCm9JD+Azvg37OEuyAog1Or+2cnHnl9f4UeyCGN7iFn/mNBDWDaB8Gxxm3hDFk3rXJXH1+hAV4fzHfPzn4HCVSuYrk+58zhCpjJ7bAqxNelF6WrJ3Wn2mk2L7Ti8+jPnyy5mSptGln4s2k4AQKwD886IpaBwIFhAEFFekg= 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=RN0D3KyQ; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=IyMU1040; arc=none smtp.client-ip=205.220.168.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="RN0D3KyQ"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="IyMU1040" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66H6cFvv1160804 for ; Fri, 17 Jul 2026 09:58:42 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= z+VEJxZksuKjQPEcKoxqOAxex5MXE3UzHoNnHjJ3PSo=; b=RN0D3KyQhlnM0X6U vHL2tzYBsZlPp+rBZvyX8xywh3XGsuGSLf8gyVBhljYWQGGMQKFXpUb8ttZz640x xMnGv4WMhY8HsgpuUKx0dT1L/m4gV2zbALrIt8AgPzjkOvYdqnLaPDg9i5rqWUHk OMvQ3Ympz8GyOHBBORJp0+P4JfgIKPE2iF4nhzwY+i6d7vJM+VHQ7hfGzlG/XxN5 GAVjg+vepgOyIyW5VdAGkaCdjs13p0eSuCBH+/uJT2PI1LX6gGIzEGSnlzOp50Ss BJ0oSbVoWPBCo7gMAEndtTjj4Vzw8FmZHsyG4rmpMd01ZUz/7PcjcaWcrxZc7tw3 3p2hUA== Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ffd3as84n-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 17 Jul 2026 09:58:42 +0000 (GMT) Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-38d7fcd1f66so11312009a91.2 for ; Fri, 17 Jul 2026 02:58:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784282322; x=1784887122; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=z+VEJxZksuKjQPEcKoxqOAxex5MXE3UzHoNnHjJ3PSo=; b=IyMU1040AktRh7tkbpS7LRFLTnylo70c+qaTJOENbJbvkAgEdEtueKMNSs1ISWFtPr I91AU+6a9k1XJtEDsTgTeE36bf/e+pqCoEZ2NxMEl7uaelsLUdn2Q/okxRlGcwKHDHnv W5odZsdnCpnM/uu2awI8S+zMYHoLil8zNz18Rcrn7cWxs7DdE4VcnTvACLE55tAp9LsP o3Mndxo1bpz+iN4dJRi3ywck5a6+agbmvNX01POJVFld8e141GYMSK3PHY9qlcBBXCjl 63sIYBR2WTBzpSHPx/3QmFUypxIBomIUUHKjRD0CQoagO3gPpLFnPe/FedtFoFXmLIde 4g4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784282322; x=1784887122; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=z+VEJxZksuKjQPEcKoxqOAxex5MXE3UzHoNnHjJ3PSo=; b=kMO2PP3DTHvL2TwObaekYss6qnCXcNYEjiE6ZIYz2Z9eJnv7FMuVvYJ9jhsDOvTjy0 UaW30SPMqt6Eu2IoK5MyiuXjUrsOK7/CyBrNDMrdDuIH3HpQ+Y62GlqugG7FOfb319h1 YS7936fjqieYK6PYTx8LI8E/VATMsnrm27OHHvcv/eB9O19A5AwhJFin/6j2oP02s1rO kolw+7v5vn2b2F7FR0E2qzOa8KsNAbbmKTvcHzv7qpEmw89FRwmQyTPiHuEZg43PuLZa Yyw8qM9qGgQdIV4T1psudk6nqBXXhfD98CvWdcJkNGpnOxmhcEEQszmlGuRZE7DN8JVV HCoQ== X-Forwarded-Encrypted: i=1; AHgh+RquNnbebS6dU9nCSFnR+350D4skC24u4V3bRAbqNnLj5YW/nW0QudA+fShMcpoCKg9Lmz/lZJbgZ7DJW1c=@vger.kernel.org X-Gm-Message-State: AOJu0YwPsUdKzEsR6eaE7zoA0iaOEHsIpywNSmXoU+3bjy6kvqCLIzvN rcPRVLcFQ6ybWO9DK7qBhAzy7zd2GzehYUgNO5paoKsqeViLAJMwhtemWGtiTJMnFSAJ/FLvV0c FhpIo3A/aNuKiytQ4jB9x0mS6HCuDBtcfsA2t6DNm08Mepa76skNEindxEIuHRgAxq0E= X-Gm-Gg: AfdE7clpkaQWW1An6WFAfbN0KX0/nHEP0caYdXwOQOjs9yifsmJWNqzZjtMOz8MwIol NkchoyLYWkHOD3JwPIOXoyhIvqeHS0oj+qaErZ/WrK/eE57v8F7IYnGMPNXten3NPABOGDu4H9E X/O9rqQx7rgC28oa0WM5Vgm12qH06Q5JuJUEie4rZ99TZKGP7GaOZ4sZlTz9/x9YZCZmCvOa8pA HEUqIZAL7AliW7yAz8Q97/4/9MtQc9ZAepuMowS77MnvaxnXOAdOLq40uadqf0wijLo6A/7iCr+ JxHBxv4lj191COU5MxI9hiEK3/AgzUQD3oAGwgkVd8RgyphJGaqXfN6rFy45i1FYWXY9pn7t6pr ZEVDNQKBGjQ2cSKtDzCo6R+SQTEpElzqlAncsaY8403Frh8E= X-Received: by 2002:a17:90b:3dc8:b0:38e:e9b:ffa4 with SMTP id 98e67ed59e1d1-38e4b3e1419mr1736651a91.6.1784282321384; Fri, 17 Jul 2026 02:58:41 -0700 (PDT) X-Received: by 2002:a17:90b:3dc8:b0:38e:e9b:ffa4 with SMTP id 98e67ed59e1d1-38e4b3e1419mr1736630a91.6.1784282320868; Fri, 17 Jul 2026 02:58:40 -0700 (PDT) Received: from hu-qianyu-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3142a02b7f2sm5586375eec.13.2026.07.17.02.58.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 02:58:40 -0700 (PDT) From: Qiang Yu Date: Fri, 17 Jul 2026 02:58:33 -0700 Subject: [PATCH v5 1/3] dt-bindings: phy: qcom: Add Glymur QMP PCIe multiple link-mode PHY Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260717-glymur_linkmode_0717-v5-1-4f9e87a61463@oss.qualcomm.com> References: <20260717-glymur_linkmode_0717-v5-0-4f9e87a61463@oss.qualcomm.com> In-Reply-To: <20260717-glymur_linkmode_0717-v5-0-4f9e87a61463@oss.qualcomm.com> To: Vinod Koul , Neil Armstrong , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Manivannan Sadhasivam , Philipp Zabel , Bjorn Andersson , Konrad Dybcio Cc: Qiang Yu , linux-arm-msm@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1784282318; l=6354; i=qiang.yu@oss.qualcomm.com; s=20250513; h=from:subject:message-id; bh=P1Qbj/JFHFMO8P73x0LZ+S7oLzHtylxsVmlF1u/snvQ=; b=nxZrqHhffQuMJi6aerasNH23mT9WpofnKlw0P9qN1mdklH5XijrHhNugNOK+YCDxWjkt7LeK6 KWROGe7os7rBhGuHkbWgPZRG5SdBLGpyJfo+4gHmQWQtRd3YTI0BVwG X-Developer-Key: i=qiang.yu@oss.qualcomm.com; a=ed25519; pk=Rr94t+fykoieF1ngg/bXxEfr5KoQxeXPtYxM8fBQTAI= X-Proofpoint-Spam-Info: AW1haW4tMjYwNzE3MDA5OSBTYWx0ZWRfXxC2A/3dIGGwz WW/fwe0Xe8/cFvbt5OUDaWLoERwrbyRMiJ2d8f8rLLwJ1ejEdFYxL4HxA+nrmJTb6ge1faVy4Ea ZYNOKCh/HJjJZoXGBW+eHdniUmEFwWo= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzE3MDA5OSBTYWx0ZWRfX9ZP3q2u21f7y qCeAFV0vZuUQhHbS0Ov4a+Py6CvEfeUMsFixFY28BmIuVXjsaiYxG5L8WGdq6iNlsNK5nlHPHS9 REl/rlzVciCwjVHNbP0MZE6DPXcGzXsvRO3ZNhs54jkGc0LDWWb6mTwvgaVsO5OC/zhcvJOm8sd cgCG/BTf3HfX1ChxeEDOWRGGFlhHpWHaS6zq0lwZaksbMjOQvGk8rgVcVUIB3qhINrvoL6LTBlN ntZgZgG0ZtHe5Emw5/ng/IO6CNIXEMabsAOPH76DeGYdG/nOgkvluMQwwGr7MrhnLcw4gdbjkrI 8byXuBeXk4o8tVe3FFGmgp6B3lmxxl75CgROZ4KBhSOcyAFeoNFNZbMdIxb6oxzG3ejDaaLMTvP Cko3Lqw2Jv03APhk0kRkflCpMCSUzwwjSmCDlZiWmd9CrianECz7rA0wBY2meCrbpjLonPqa4Ou uVXpXNoKtNhV9hHiosg== X-Proofpoint-GUID: lKhVkdYk8gnnTtA0DC43x-ExJdryZW7P X-Proofpoint-ORIG-GUID: lKhVkdYk8gnnTtA0DC43x-ExJdryZW7P X-Authority-Analysis: v=2.4 cv=e/M2j6p/ c=1 sm=1 tr=0 ts=6a59fcd2 cx=c_pps a=0uOsjrqzRL749jD1oC5vDA==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=gEfo2CItAAAA:8 a=EUspDBNiAAAA:8 a=yAdxKSRqiqocnpK_7ewA:9 a=QEXdDO2ut3YA:10 a=mQ_c8vxmzFEMiUWkPHU9:22 a=sptkURWiP4Gy88Gu7hUp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-17_02,2026-07-15_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 suspectscore=0 phishscore=0 priorityscore=1501 spamscore=0 malwarescore=0 clxscore=1015 lowpriorityscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607170099 Add qcom,glymur-qmp-pcie-multiphy.yaml as a standalone binding for the Glymur Gen5 PCIe PHY hardware block. This block supports two link modes, selected at runtime via a TCSR syscon register: 1. x8 - a single 8-lane PHY instance is exposed 2. x4+x4 - two independent 4-lane PHY instances are exposed Keep this as a separate schema from qcom,sc8280xp-qmp-pcie-phy.yaml rather than folding it into the shared compatible list there, since the two PHY instances active in x8 mode require twice as many clocks, resets, and power-domains as any other entry in that file, and adding Glymur-specific properties like qcom,link-mode and reg-names there would only apply to this one compatible. Document the required clocks, resets, and power-domains for both PHY instances, and use #phy-cells =3D <1>, where the cell value is the PHY index within the active link mode. Signed-off-by: Qiang Yu --- .../phy/qcom,glymur-qmp-pcie-multiphy.yaml | 176 +++++++++++++++++= ++++ 1 file changed, 176 insertions(+) diff --git a/Documentation/devicetree/bindings/phy/qcom,glymur-qmp-pcie-mul= tiphy.yaml b/Documentation/devicetree/bindings/phy/qcom,glymur-qmp-pcie-mul= tiphy.yaml new file mode 100644 index 000000000000..73550f77e9b6 --- /dev/null +++ b/Documentation/devicetree/bindings/phy/qcom,glymur-qmp-pcie-multiphy.y= aml @@ -0,0 +1,176 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/phy/qcom,glymur-qmp-pcie-multiphy.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Qualcomm QMP PCIe multiple link-mode PHY controller (PCIe, Glymur) + +maintainers: + - Qiang Yu + - Manivannan Sadhasivam + +description: | + The Glymur SoC uses a single PCIe Gen5 PHY hardware block for the + PCIe3a/PCIe3b controllers. This block supports two link modes, selected + at runtime via a TCSR syscon register: + + 1. x8 - a single 8-lane PHY instance is exposed (PCIe3a only) + 2. x4+x4 - two independent 4-lane PHY instances are exposed (PCIe3a and + PCIe3b) + + The node always describes both PHY instances ("port a" and "port b"), + regardless of which link mode is active on the board. + +properties: + compatible: + enum: + - qcom,glymur-qmp-gen5x8-pcie-phy + + reg: + minItems: 2 + maxItems: 2 + + reg-names: + items: + - const: port_a + - const: port_b + + clocks: + minItems: 10 + maxItems: 10 + + clock-names: + items: + - const: aux + - const: cfg_ahb + - const: ref + - const: rchng + - const: pipe + - const: phy_b_aux + - const: cfg_ahb_b + - const: rchng_b + - const: pipe_b + - const: pipediv2_b + + power-domains: + minItems: 2 + maxItems: 2 + + power-domain-names: + items: + - const: phy_a_gdsc + - const: phy_b_gdsc + + resets: + minItems: 4 + maxItems: 4 + + reset-names: + items: + - const: phy_a + - const: phy_a_nocsr + - const: phy_b + - const: phy_b_nocsr + + vdda-phy-supply: true + + vdda-pll-supply: true + + vdda-refgen0p9-supply: true + + vdda-refgen1p2-supply: true + + qcom,link-mode: + description: + Reference to a register in the TCSR syscon that reports the link + mode the PCIe PHY is currently configured for, either a single x8 + link or two independent x4 links. The link mode is programmed by + firmware before Linux boots; this property is only used to read + the active link mode, specified as a phandle to the syscon and + the register offset. + $ref: /schemas/types.yaml#/definitions/phandle-array + items: + - items: + - description: phandle of TCSR syscon + - description: offset of link mode register + + "#clock-cells": + const: 1 + + clock-output-names: + items: + - description: Name of the PHY A pipe clock output. + - description: Name of the PHY B pipe clock output. + + "#phy-cells": + const: 1 + +required: + - compatible + - reg + - reg-names + - clocks + - clock-names + - power-domains + - power-domain-names + - resets + - reset-names + - vdda-phy-supply + - vdda-pll-supply + - vdda-refgen0p9-supply + - vdda-refgen1p2-supply + - qcom,link-mode + - "#clock-cells" + - clock-output-names + - "#phy-cells" + +additionalProperties: false + +examples: + - | + #include + #include + + pcie3_phy: phy@f00000 { + compatible =3D "qcom,glymur-qmp-gen5x8-pcie-phy"; + reg =3D <0x00f00000 0x10000>, <0x00f10000 0x10000>; + reg-names =3D "port_a", "port_b"; + + clocks =3D <&gcc GCC_PCIE_PHY_3A_AUX_CLK>, + <&gcc GCC_PCIE_3A_CFG_AHB_CLK>, + <&tcsr TCSR_PCIE_3_CLKREF_EN>, + <&gcc GCC_PCIE_3A_PHY_RCHNG_CLK>, + <&gcc GCC_PCIE_3A_PIPE_CLK>, + <&gcc GCC_PCIE_PHY_3B_AUX_CLK>, + <&gcc GCC_PCIE_3B_CFG_AHB_CLK>, + <&gcc GCC_PCIE_3B_PHY_RCHNG_CLK>, + <&gcc GCC_PCIE_3B_PIPE_CLK>, + <&gcc GCC_PCIE_3B_PIPE_DIV2_CLK>; + clock-names =3D "aux", "cfg_ahb", "ref", "rchng", "pipe", + "phy_b_aux", "cfg_ahb_b", "rchng_b", "pipe_b", + "pipediv2_b"; + + resets =3D <&gcc GCC_PCIE_3A_PHY_BCR>, + <&gcc GCC_PCIE_3A_NOCSR_COM_PHY_BCR>, + <&gcc GCC_PCIE_3B_PHY_BCR>, + <&gcc GCC_PCIE_3B_NOCSR_COM_PHY_BCR>; + reset-names =3D "phy_a", "phy_a_nocsr", "phy_b", "phy_b_nocsr"; + + power-domains =3D <&gcc GCC_PCIE_3A_PHY_GDSC>, + <&gcc GCC_PCIE_3B_PHY_GDSC>; + power-domain-names =3D "phy_a_gdsc", "phy_b_gdsc"; + + vdda-phy-supply =3D <&vreg_l3c>; + vdda-pll-supply =3D <&vreg_l2c>; + + vdda-refgen0p9-supply =3D <&vreg_l3c>; + vdda-refgen1p2-supply =3D <&vreg_l2c>; + + qcom,link-mode =3D <&tcsr 0x5000>; + + #clock-cells =3D <1>; + clock-output-names =3D "pcie3a_pipe_clk", "pcie3b_pipe_clk"; + + #phy-cells =3D <1>; + }; --=20 2.34.1 From nobody Sat Jul 25 05:29:57 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.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 539373DCDA3 for ; Fri, 17 Jul 2026 09:58:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784282331; cv=none; b=WGD97+UJ7MKknrVmreRRx+NvDASrijsH8Q0fhxXKbmLs+0T3XV9ITl8reexHuPFWdjhsgnlCF3cp8JuOSRFtjtRC9zq0Ql2pRC3QHgyMzz9pMcrqKa99B7shJmP3ccKV0LPSxn4C+gWLIqq00CYGPKM2fLkICol8st9qzag3ujk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784282331; c=relaxed/simple; bh=q1EiFxkJaT4Z23yESZhbCCIOkzXXr3f11mGRRTEbqTI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GFZF9WB7Fo+FWvrJT5NVbMDM7u4ud4xK0myBPrLNs6mF2wets89NoRdz5EGLvFBz/QeGS0wfxAaUeMYKVQjDyWU+C958LDSHgtVaIHt6aM+zEhuLoNH5KF6uuxc7QTMlgZBOFClxZBNqN1ElSoJzrTaUlPgpMN0TfQRhxu1qoxQ= 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=dWcGiQ+q; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=V+icxE/R; arc=none smtp.client-ip=205.220.168.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="dWcGiQ+q"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="V+icxE/R" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66H6d3nT821160 for ; Fri, 17 Jul 2026 09:58:44 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= cRmmpJFrMPan4EUP/lePPKYnmXbOjxD/SkRuul3w5rU=; b=dWcGiQ+qx18rfZKz tWZA5762qP2VcAQoHBN452lPPCJ1Hbv7xlSCcwbA4p5GRuA62vj3MPKRDvD0B4kl dWX4APLGGjEwhuOv7ZKQc7gcT9A3ghNhRKepU7ckbOTQsFF+3HfFl+1KFWr6ZvR7 e0hJR/pPn+t2CuRlCuOvYjafW29AwgCG8K+UMAiImVQH2b5bK2xkJPvrI8owwsF6 qMIQAoKC4vNKIaKQLRbZ6icIV4ceQWZndI8yNdzDXYFEYGFguXg7B7Bpb8so+Emf wkAVlXpKXdUR2YsUI/MO+/z2Jcxn1P6DlqQAXAMUYHKDxim9TDzVpUoVwtkMBhJp k9tbfw== Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fffag8qsj-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 17 Jul 2026 09:58:43 +0000 (GMT) Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-c88ab059052so1812099a12.1 for ; Fri, 17 Jul 2026 02:58:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784282323; x=1784887123; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=cRmmpJFrMPan4EUP/lePPKYnmXbOjxD/SkRuul3w5rU=; b=V+icxE/Rf6BHQTIdjwefaM3GTC5/PHjg7neSc7bPYAaJkujIm2mL09Crp+LW1g0PjO GR8EbqfUUhSaSiVVgSJ5C3L+AFcOlzXpUPYRN9RN4x3l7/13gbuhFWFiswIw5O4wCUVM JaHlvdzJvtPQ/CH/Tob0LHJC8nNFbQdiMa32xaX1WWiI6vxeHbQXGDJaAy54P2X74MPD TfB9JMyCZ6h0d2qtbYxl936gcdypXTB87kMnFNKpQUm+proFFDu2DAmASJ9HNap+Ua/C wANvHd5vOgcePD2Y52fwNZxZeQDKBrifFbpwS5cWrlbx9Ep5rwHUVYhltFxHonITAlca r5QQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784282323; x=1784887123; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=cRmmpJFrMPan4EUP/lePPKYnmXbOjxD/SkRuul3w5rU=; b=LrFLloBw1U4vHi6zY+jzLkDm+WgNTFOpMkvxgkc9DzApaYr5iZGPUYPZf7vfN0dQMq oUNkyNN8bUpvNSyE7dQ6ZXvrPgq7Op2MRgpak1wv/h928nhshwS4PHinGtya++Dpc8ib +6AZPZ4Pg8wICb5my9M4pnfw8s5OdNRuQBuEqK1V2p1P6H9eIbJEomJGtyb4mbqbqcwn Y7aT/Ksq3KSXLr2Be+I0oy3+wJnrsjjbOb0BZ64wyQNUpRulFLqvqI+J5z6YJNllsENB H7lUyu9idfRFApxDAqoW034+8+ZEK5QfzeCHhTZ2M7O0TMg05cREuT+CowNEPWHvIbd4 koYA== X-Forwarded-Encrypted: i=1; AHgh+RrZjkurudWColklbKGL49GZzMQqfmQ1xqykaUumkV/0LeCOv9RB1Q/xPqDgmX01XkB4lJZxHcx0kCfwfjc=@vger.kernel.org X-Gm-Message-State: AOJu0YyQ7Bjbwv6R7yqO/Nr0LTqG8RCVTU9GABRqE9ZwXgtUwYBaKqco ACfjp2+r/v9O1SsKj3b20TLb6bd/gGFAqFZJBkycQDAoYFHPq04Z6JZ3ACDcRCWKfMuSR71f3mo Nt6+6TlVll8+JpDAgFVcm9Qtz/QdGmEk4znZdH4jD4LtPl6QWe0n0HqDX2LeCuKiF3zc= X-Gm-Gg: AfdE7clkyhWWeU7UwQUVzJV5zxbMxR+YS6/WtafJsLkb8juYxvsxiQtkEd8N+lTFtxJ cIUBqrKlpypYer409VxKsv8n0qo9ZhLaR6oFXFMNe4I4zkFsi+PMydDPgoJk5i3CZXBFXdrTte4 cH29K9rihD7YkO9ioVcylS/BARgc9wQ/176EGOkmKfImjdeLjXsJ0v6Td70Wgx3ifqAFJIy4Otz lcRG1nNdTzWdc3+o7V2k2pkNbEs2Ya4lSV8WPMmG1MzTnjpyq6H9MtV81U4mb2kCa208rMEX03D Je3Ccd/M4KRpi9Gtkx7JewRQgpMh89trEwv10iPKMQKQV9xEOUL27aDBQeUy7nPqxQgnswociTD AX04/eI3z2LVj749Yg/yXAbo1QV0lvsoRZ71JLFzhA8kHPKQ= X-Received: by 2002:a17:90b:540f:b0:37f:e5b1:ec4b with SMTP id 98e67ed59e1d1-38e3d163538mr7217515a91.5.1784282322782; Fri, 17 Jul 2026 02:58:42 -0700 (PDT) X-Received: by 2002:a17:90b:540f:b0:37f:e5b1:ec4b with SMTP id 98e67ed59e1d1-38e3d163538mr7217475a91.5.1784282322200; Fri, 17 Jul 2026 02:58:42 -0700 (PDT) Received: from hu-qianyu-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3142a02b7f2sm5586375eec.13.2026.07.17.02.58.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 02:58:41 -0700 (PDT) From: Qiang Yu Date: Fri, 17 Jul 2026 02:58:34 -0700 Subject: [PATCH v5 2/3] phy: qcom: qmp-pcie: Add QMP PCIe Multi-PHY driver Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260717-glymur_linkmode_0717-v5-2-4f9e87a61463@oss.qualcomm.com> References: <20260717-glymur_linkmode_0717-v5-0-4f9e87a61463@oss.qualcomm.com> In-Reply-To: <20260717-glymur_linkmode_0717-v5-0-4f9e87a61463@oss.qualcomm.com> To: Vinod Koul , Neil Armstrong , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Manivannan Sadhasivam , Philipp Zabel , Bjorn Andersson , Konrad Dybcio Cc: Qiang Yu , linux-arm-msm@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1784282318; l=23112; i=qiang.yu@oss.qualcomm.com; s=20250513; h=from:subject:message-id; bh=q1EiFxkJaT4Z23yESZhbCCIOkzXXr3f11mGRRTEbqTI=; b=q1R5RPNqtTSwZyu8yBCJjLbVh/rkgmikC4IWThvpqXdpSTAovXepS0nKw71v3FKeZ7n7uqKap s+Z2cS3Enh6AmdBoGrbY9veQmwl8lyzABeodqC9k3M8QLTy5FWEVyEG X-Developer-Key: i=qiang.yu@oss.qualcomm.com; a=ed25519; pk=Rr94t+fykoieF1ngg/bXxEfr5KoQxeXPtYxM8fBQTAI= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzE3MDA5OSBTYWx0ZWRfX4CWnm+FB9lq5 x670Jn9DrqdDHreb90S50NLMUaHSwYJLc2oUV3TTbeRku9y+Tg0N3t+X5Zk3zZmhtLdrx2Z+g/S ZLuZ9w1VHYyucMqfasOkl7BHoM0yFQrK3ENXQTe4tbJVKRcXVdaArG9xOL85cqt4KPDuLzw6yGg 0hdAhtZbkv0sefY7dCu1+e58YgMZpKr7lKONa0hrgPZ4LmV8OnOPC0Hwtk591ynvcvV+ZXGvoxi Jpj08s9dM/0g12JlS+FcbBXYRYbjHVW8Uz9RCLQxxo2d2Lud8/fZavfSxja8UsV2wszqIGpxxyf 7t15JOkkUXwBwdfgqKnZu2O9eeOPyOx89Mm/M8AcCFm+xTzDVELy0w59j7A2BgohGBq6s3KQTAZ GSERPqfC6WBCx2hrK7JavkKasI+GVKCq308DQGdmYPMtCJMYYk+7sKfQWWai1TlrC2SaO0ObZIO Elc80imzqCbcXdN1x6A== X-Proofpoint-Spam-Info: AW1haW4tMjYwNzE3MDA5OSBTYWx0ZWRfX4qZkK1jFDoXI OYw3AA1gQ7NxwWs2aVsiCHGcSh6xXrYlF3EbJUhy/XxHvL3aWheByiRixeGQT0S4gZGny8OiVSA rYIVUyNhFZdopB7JPYejswrjj9/husM= X-Authority-Analysis: v=2.4 cv=KZfidwYD c=1 sm=1 tr=0 ts=6a59fcd3 cx=c_pps a=Oh5Dbbf/trHjhBongsHeRQ==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=mlzxmGbil-RpS_vCRPwA:9 a=QEXdDO2ut3YA:10 a=_Vgx9l1VpLgwpw_dHYaR:22 X-Proofpoint-GUID: fRfb2FzBN9uCU3wZR3f1BAsrSeH_7j6e X-Proofpoint-ORIG-GUID: fRfb2FzBN9uCU3wZR3f1BAsrSeH_7j6e X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-17_02,2026-07-15_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 clxscore=1015 malwarescore=0 spamscore=0 adultscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607170099 Some QMP PCIe PHY hardware blocks support multiple link topologies (e.g. x8 or x4+x4) selected via a TCSR register. The existing single-instance QMP PCIe PHY driver has no way to model this: it assumes a single cfg per DT node and instantiates exactly one PHY. Add a dedicated driver for this class of PHY. Match data carries a per-mode cfg table; qmp_pcie_multiphy_probe() reads the current link mode from the TCSR register pointed to by "qcom,link-mode", looks up the corresponding cfg array, and instantiates one qmp_pcie per sub-PHY required by that link mode, registering the clock and #phy-cells =3D <1> phy providers so consumers can address individual sub-PHYs by index. The driver inherits the phy setting and link-mode programmed by firmware, so only the no_csr reset is used and no phy setting tables are provided. Add the first match data and compatible, qcom,glymur-qmp-gen5x8-pcie-phy, for the Glymur Gen5 PCIe PHY that can bifurcate into two x4 links or operate as a single x8 link. Signed-off-by: Qiang Yu --- drivers/phy/qualcomm/Kconfig | 11 + drivers/phy/qualcomm/Makefile | 1 + drivers/phy/qualcomm/phy-qcom-qmp-pcie-multiphy.c | 770 ++++++++++++++++++= ++++ 3 files changed, 782 insertions(+) diff --git a/drivers/phy/qualcomm/Kconfig b/drivers/phy/qualcomm/Kconfig index 60a0ead127fa..31241d1bbef2 100644 --- a/drivers/phy/qualcomm/Kconfig +++ b/drivers/phy/qualcomm/Kconfig @@ -77,6 +77,17 @@ config PHY_QCOM_QMP_PCIE Enable this to support the QMP PCIe PHY transceiver that is used with PCIe controllers on Qualcomm chips. =20 +config PHY_QCOM_QMP_PCIE_MULTIPHY + tristate "Qualcomm QMP PCIe Multiple Link-mode PHY Driver" + depends on PCI || COMPILE_TEST + select GENERIC_PHY + default PHY_QCOM_QMP + help + Enable this to support the QMP PCIe PHY transceiver that is used + with PCIe controllers on Qualcomm chips. This PHY is a single + multi-lane QMP block that can be configured either as one wide + link or as multiple narrower independent links (bifurcation). + config PHY_QCOM_QMP_PCIE_8996 tristate "Qualcomm QMP PCIe 8996 PHY Driver" depends on PCI || COMPILE_TEST diff --git a/drivers/phy/qualcomm/Makefile b/drivers/phy/qualcomm/Makefile index b71a6a0bed3f..8bf887d58ee4 100644 --- a/drivers/phy/qualcomm/Makefile +++ b/drivers/phy/qualcomm/Makefile @@ -10,6 +10,7 @@ obj-$(CONFIG_PHY_QCOM_PCIE2) +=3D phy-qcom-pcie2.o =20 obj-$(CONFIG_PHY_QCOM_QMP_COMBO) +=3D phy-qcom-qmp-combo.o phy-qcom-qmp-us= bc.o obj-$(CONFIG_PHY_QCOM_QMP_PCIE) +=3D phy-qcom-qmp-pcie.o +obj-$(CONFIG_PHY_QCOM_QMP_PCIE_MULTIPHY) +=3D phy-qcom-qmp-pcie-multiphy.o obj-$(CONFIG_PHY_QCOM_QMP_PCIE_8996) +=3D phy-qcom-qmp-pcie-msm8996.o obj-$(CONFIG_PHY_QCOM_QMP_UFS) +=3D phy-qcom-qmp-ufs.o obj-$(CONFIG_PHY_QCOM_QMP_USB) +=3D phy-qcom-qmp-usb.o diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-pcie-multiphy.c b/drivers/ph= y/qualcomm/phy-qcom-qmp-pcie-multiphy.c new file mode 100644 index 000000000000..b79edf2b7d5f --- /dev/null +++ b/drivers/phy/qualcomm/phy-qcom-qmp-pcie-multiphy.c @@ -0,0 +1,770 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2026, Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "phy-qcom-qmp.h" + +#define PHY_INIT_COMPLETE_TIMEOUT 10000 + +enum qmp_pcie_glymur_link_mode { + QMP_PCIE_GLYMUR_MODE_X8, + QMP_PCIE_GLYMUR_MODE_X4X4, +}; + +enum qphy_reg_layout { + QPHY_PCS_STATUS, + QPHY_LAYOUT_SIZE +}; + +static const unsigned int pciephy_v8_50_regs_layout[QPHY_LAYOUT_SIZE] =3D { + [QPHY_PCS_STATUS] =3D QPHY_V8_50_PCS_STATUS1, +}; + +struct qmp_pcie_offsets { + u16 pcs; +}; + +struct qmp_phy_cfg { + const struct qmp_pcie_offsets *offsets; + + const char * const *reg_names; + int num_regs; + + const char * const *pd_names; + int num_pds; + + const char * const *nocsr_reset_list; + int num_nocsr_resets; + + const char * const *vreg_list; + int num_vregs; + + const unsigned int *regs; + + unsigned int phy_status; + + const char * const *clk_list; + int num_clks; + const char * const *pipe_clk_list; + + int num_pipe_clks; +}; + +struct qmp_pcie { + struct device *dev; + + const struct qmp_phy_cfg *cfg; + + void __iomem **base; + + struct clk_bulk_data *clks; + struct clk_bulk_data *pipe_clks; + + struct reset_control_bulk_data *nocsr_resets; + + struct regulator_bulk_data *vregs; + + struct device **pd_devs; + + struct clk_fixed_rate pipe_clk_fixed; +}; + +struct qmp_pcie_multiphy { + struct phy **phys; + const struct qmp_pcie_link_mode_cfg *mode_cfg; + + int num_pipe_outputs; + struct clk_fixed_rate *pipe_out_clks; +}; + +struct qmp_pcie_link_mode_cfg { + const struct qmp_phy_cfg * const *cfgs; + u32 num_phys; +}; + +struct qmp_pcie_match_data { + const struct qmp_pcie_link_mode_cfg *mode_cfgs; + u32 num_modes; +}; + +static const char * const glymur_pciephy_clk_l[] =3D { + "aux", "cfg_ahb", "ref", "rchng", "phy_b_aux", +}; + +static const char * const glymur_pciephy_a_clk_l[] =3D { + "aux", "cfg_ahb", "ref", "rchng", +}; + +static const char * const glymur_pciephy_b_clk_l[] =3D { + "phy_b_aux", "cfg_ahb_b", "ref", "rchng_b", +}; + +static const char * const glymur_pciephy_pipeclk_l[] =3D { + "pipe", +}; + +static const char * const glymur_pipephy_b_pipeclk_l[] =3D { + "pipe_b", "pipediv2_b", +}; + +static const char * const glymur_vreg_l[] =3D { + "vdda-phy", "vdda-pll", "vdda-refgen0p9", "vdda-refgen1p2", +}; + +static const char * const glymur_pciephy_a_reg_l[] =3D { + "port_a", +}; + +static const char * const glymur_pciephy_b_reg_l[] =3D { + "port_b", +}; + +static const char * const glymur_pciephy_reg_l[] =3D { + "port_a", "port_b", +}; + +static const char * const glymur_pciephy_a_pd_l[] =3D { + "phy_a_gdsc", +}; + +static const char * const glymur_pciephy_b_pd_l[] =3D { + "phy_b_gdsc", +}; + +static const char * const glymur_pciephy_pd_l[] =3D { + "phy_a_gdsc", "phy_b_gdsc", +}; + +static const char * const glymur_pciephy_a_nocsr_reset_l[] =3D { + "phy_a_nocsr", +}; + +static const char * const glymur_pciephy_nocsr_reset_l[] =3D { + "phy_a_nocsr", "phy_b_nocsr", +}; + +static const char * const glymur_pciephy_b_nocsr_reset_l[] =3D { + "phy_b_nocsr", +}; + +static const struct qmp_pcie_offsets glymur_pcie_offsets_v8_50 =3D { + .pcs =3D 0x9000, +}; + +static const struct qmp_phy_cfg glymur_qmp_gen5x4_pciephy_a_cfg =3D { + .offsets =3D &glymur_pcie_offsets_v8_50, + .reg_names =3D glymur_pciephy_a_reg_l, + .num_regs =3D ARRAY_SIZE(glymur_pciephy_a_reg_l), + .pd_names =3D glymur_pciephy_a_pd_l, + .num_pds =3D ARRAY_SIZE(glymur_pciephy_a_pd_l), + .nocsr_reset_list =3D glymur_pciephy_a_nocsr_reset_l, + .num_nocsr_resets =3D ARRAY_SIZE(glymur_pciephy_a_nocsr_reset_l), + .vreg_list =3D glymur_vreg_l, + .num_vregs =3D ARRAY_SIZE(glymur_vreg_l), + .regs =3D pciephy_v8_50_regs_layout, + .phy_status =3D PHYSTATUS_4_20, + .pipe_clk_list =3D glymur_pciephy_pipeclk_l, + .num_pipe_clks =3D ARRAY_SIZE(glymur_pciephy_pipeclk_l), + .clk_list =3D glymur_pciephy_a_clk_l, + .num_clks =3D ARRAY_SIZE(glymur_pciephy_a_clk_l), +}; + +static const struct qmp_phy_cfg glymur_qmp_gen5x4_pciephy_b_cfg =3D { + .offsets =3D &glymur_pcie_offsets_v8_50, + .reg_names =3D glymur_pciephy_b_reg_l, + .num_regs =3D ARRAY_SIZE(glymur_pciephy_b_reg_l), + .pd_names =3D glymur_pciephy_b_pd_l, + .num_pds =3D ARRAY_SIZE(glymur_pciephy_b_pd_l), + .nocsr_reset_list =3D glymur_pciephy_b_nocsr_reset_l, + .num_nocsr_resets =3D ARRAY_SIZE(glymur_pciephy_b_nocsr_reset_l), + .vreg_list =3D glymur_vreg_l, + .num_vregs =3D ARRAY_SIZE(glymur_vreg_l), + .regs =3D pciephy_v8_50_regs_layout, + .phy_status =3D PHYSTATUS_4_20, + .pipe_clk_list =3D glymur_pipephy_b_pipeclk_l, + .num_pipe_clks =3D ARRAY_SIZE(glymur_pipephy_b_pipeclk_l), + .clk_list =3D glymur_pciephy_b_clk_l, + .num_clks =3D ARRAY_SIZE(glymur_pciephy_b_clk_l), +}; + +static const struct qmp_phy_cfg glymur_qmp_gen5x8_pciephy_cfg =3D { + .offsets =3D &glymur_pcie_offsets_v8_50, + .reg_names =3D glymur_pciephy_reg_l, + .num_regs =3D ARRAY_SIZE(glymur_pciephy_reg_l), + .pd_names =3D glymur_pciephy_pd_l, + .num_pds =3D ARRAY_SIZE(glymur_pciephy_pd_l), + .nocsr_reset_list =3D glymur_pciephy_nocsr_reset_l, + .num_nocsr_resets =3D ARRAY_SIZE(glymur_pciephy_nocsr_reset_l), + .vreg_list =3D glymur_vreg_l, + .num_vregs =3D ARRAY_SIZE(glymur_vreg_l), + .regs =3D pciephy_v8_50_regs_layout, + .phy_status =3D PHYSTATUS_4_20, + .pipe_clk_list =3D glymur_pciephy_pipeclk_l, + .num_pipe_clks =3D ARRAY_SIZE(glymur_pciephy_pipeclk_l), + .clk_list =3D glymur_pciephy_clk_l, + .num_clks =3D ARRAY_SIZE(glymur_pciephy_clk_l), +}; + +static const struct qmp_phy_cfg * const glymur_qmp_gen5x8_mode_x8_cfgs[] = =3D { + &glymur_qmp_gen5x8_pciephy_cfg, +}; + +static const struct qmp_phy_cfg * const glymur_qmp_gen5x8_mode_x4x4_cfgs[]= =3D { + &glymur_qmp_gen5x4_pciephy_a_cfg, + &glymur_qmp_gen5x4_pciephy_b_cfg, +}; + +static const struct qmp_pcie_link_mode_cfg glymur_qmp_gen5x8_mode_cfgs[] = =3D { + [QMP_PCIE_GLYMUR_MODE_X8] =3D { + .cfgs =3D glymur_qmp_gen5x8_mode_x8_cfgs, + .num_phys =3D ARRAY_SIZE(glymur_qmp_gen5x8_mode_x8_cfgs), + }, + [QMP_PCIE_GLYMUR_MODE_X4X4] =3D { + .cfgs =3D glymur_qmp_gen5x8_mode_x4x4_cfgs, + .num_phys =3D ARRAY_SIZE(glymur_qmp_gen5x8_mode_x4x4_cfgs), + }, +}; + +static const struct qmp_pcie_match_data glymur_qmp_gen5x8_match_data =3D { + .mode_cfgs =3D glymur_qmp_gen5x8_mode_cfgs, + .num_modes =3D ARRAY_SIZE(glymur_qmp_gen5x8_mode_cfgs), +}; + +static int qmp_pcie_pd_power_on(struct qmp_pcie *qmp) +{ + const struct qmp_phy_cfg *cfg =3D qmp->cfg; + int i, ret; + + for (i =3D 0; i < cfg->num_pds; i++) { + ret =3D pm_runtime_get_sync(qmp->pd_devs[i]); + if (ret < 0) { + dev_err(qmp->dev, "failed to power on %s domain\n", + cfg->pd_names[i]); + goto err_power_off; + } + } + + return 0; + +err_power_off: + while (--i >=3D 0) + pm_runtime_put(qmp->pd_devs[i]); + + return ret; +} + +static void qmp_pcie_pd_power_off(struct qmp_pcie *qmp) +{ + const struct qmp_phy_cfg *cfg =3D qmp->cfg; + int i; + + for (i =3D cfg->num_pds - 1; i >=3D 0; i--) + pm_runtime_put(qmp->pd_devs[i]); +} + +static int qmp_pcie_init(struct phy *phy) +{ + struct qmp_pcie *qmp =3D phy_get_drvdata(phy); + const struct qmp_phy_cfg *cfg =3D qmp->cfg; + int ret; + + ret =3D qmp_pcie_pd_power_on(qmp); + if (ret) + return ret; + + ret =3D regulator_bulk_enable(cfg->num_vregs, qmp->vregs); + if (ret) { + dev_err(qmp->dev, "failed to enable regulators, err=3D%d\n", ret); + goto err_pd_power_off; + } + + ret =3D reset_control_bulk_assert(qmp->cfg->num_nocsr_resets, qmp->nocsr_= resets); + if (ret) { + dev_err(qmp->dev, "no-csr reset assert failed\n"); + goto err_disable_regulators; + } + + usleep_range(200, 300); + + ret =3D clk_bulk_prepare_enable(qmp->cfg->num_clks, qmp->clks); + if (ret) + goto err_disable_regulators; + + return 0; + +err_disable_regulators: + regulator_bulk_disable(cfg->num_vregs, qmp->vregs); +err_pd_power_off: + qmp_pcie_pd_power_off(qmp); + + return ret; +} + +static int qmp_pcie_exit(struct phy *phy) +{ + struct qmp_pcie *qmp =3D phy_get_drvdata(phy); + const struct qmp_phy_cfg *cfg =3D qmp->cfg; + + reset_control_bulk_assert(qmp->cfg->num_nocsr_resets, qmp->nocsr_resets); + + clk_bulk_disable_unprepare(qmp->cfg->num_clks, qmp->clks); + regulator_bulk_disable(cfg->num_vregs, qmp->vregs); + qmp_pcie_pd_power_off(qmp); + + return 0; +} + +static int qmp_pcie_power_on(struct phy *phy) +{ + struct qmp_pcie *qmp =3D phy_get_drvdata(phy); + const struct qmp_phy_cfg *cfg =3D qmp->cfg; + const struct qmp_pcie_offsets *offs =3D cfg->offsets; + void __iomem *status; + unsigned int val; + int i, ret; + + ret =3D clk_bulk_prepare_enable(qmp->cfg->num_pipe_clks, qmp->pipe_clks); + if (ret) + return ret; + + ret =3D reset_control_bulk_deassert(qmp->cfg->num_nocsr_resets, qmp->nocs= r_resets); + if (ret) { + dev_err(qmp->dev, "no-csr reset deassert failed\n"); + goto err_disable_pipe_clk; + } + + for (i =3D 0; i < cfg->num_regs; i++) { + status =3D qmp->base[i] + offs->pcs + cfg->regs[QPHY_PCS_STATUS]; + ret =3D readl_poll_timeout(status, val, !(val & cfg->phy_status), 200, + PHY_INIT_COMPLETE_TIMEOUT); + if (ret) { + dev_err(qmp->dev, "phy initialization timed-out (%s)\n", + cfg->reg_names[i]); + goto err_disable_pipe_clk; + } + } + + return 0; + +err_disable_pipe_clk: + clk_bulk_disable_unprepare(qmp->cfg->num_pipe_clks, qmp->pipe_clks); + + return ret; +} + + +static int qmp_pcie_power_off(struct phy *phy) +{ + struct qmp_pcie *qmp =3D phy_get_drvdata(phy); + + clk_bulk_disable_unprepare(qmp->cfg->num_pipe_clks, qmp->pipe_clks); + + return 0; +} + +static int qmp_pcie_enable(struct phy *phy) +{ + int ret; + + ret =3D qmp_pcie_init(phy); + if (ret) + return ret; + + ret =3D qmp_pcie_power_on(phy); + if (ret) + qmp_pcie_exit(phy); + + return ret; +} + +static int qmp_pcie_disable(struct phy *phy) +{ + int ret; + + ret =3D qmp_pcie_power_off(phy); + if (ret) + return ret; + + return qmp_pcie_exit(phy); +} + +static const struct phy_ops qmp_pcie_phy_ops =3D { + .power_on =3D qmp_pcie_enable, + .power_off =3D qmp_pcie_disable, + .owner =3D THIS_MODULE, +}; + +static void qmp_pcie_pd_detach(void *data) +{ + struct qmp_pcie *qmp =3D data; + const struct qmp_phy_cfg *cfg =3D qmp->cfg; + int i; + + for (i =3D 0; i < cfg->num_pds; i++) { + if (!IS_ERR_OR_NULL(qmp->pd_devs[i])) + dev_pm_domain_detach(qmp->pd_devs[i], true); + } +} + +static int qmp_pcie_pd_init(struct qmp_pcie *qmp) +{ + const struct qmp_phy_cfg *cfg =3D qmp->cfg; + struct device *dev =3D qmp->dev; + int i, ret; + + if (!cfg->num_pds) + return 0; + + qmp->pd_devs =3D devm_kcalloc(dev, cfg->num_pds, sizeof(*qmp->pd_devs), + GFP_KERNEL); + if (!qmp->pd_devs) + return -ENOMEM; + + for (i =3D 0; i < cfg->num_pds; i++) { + qmp->pd_devs[i] =3D dev_pm_domain_attach_by_name(dev, + cfg->pd_names[i]); + if (IS_ERR(qmp->pd_devs[i])) { + ret =3D PTR_ERR(qmp->pd_devs[i]); + goto err_detach; + } + } + + return devm_add_action_or_reset(dev, qmp_pcie_pd_detach, qmp); + +err_detach: + while (--i >=3D 0) + dev_pm_domain_detach(qmp->pd_devs[i], false); + + return ret; +} + +static int qmp_pcie_vreg_init(struct qmp_pcie *qmp) +{ + const struct qmp_phy_cfg *cfg =3D qmp->cfg; + struct device *dev =3D qmp->dev; + int i; + + qmp->vregs =3D devm_kcalloc(dev, cfg->num_vregs, sizeof(*qmp->vregs), + GFP_KERNEL); + if (!qmp->vregs) + return -ENOMEM; + + for (i =3D 0; i < cfg->num_vregs; i++) + qmp->vregs[i].supply =3D cfg->vreg_list[i]; + + return devm_regulator_bulk_get(dev, cfg->num_vregs, qmp->vregs); +} + +static int qmp_pcie_reset_init(struct qmp_pcie *qmp) +{ + const struct qmp_phy_cfg *cfg =3D qmp->cfg; + struct device *dev =3D qmp->dev; + int i, ret; + + qmp->nocsr_resets =3D devm_kcalloc(dev, cfg->num_nocsr_resets, + sizeof(*qmp->nocsr_resets), + GFP_KERNEL); + if (!qmp->nocsr_resets) + return -ENOMEM; + + for (i =3D 0; i < cfg->num_nocsr_resets; i++) + qmp->nocsr_resets[i].id =3D cfg->nocsr_reset_list[i]; + + ret =3D devm_reset_control_bulk_get_exclusive(dev, + cfg->num_nocsr_resets, + qmp->nocsr_resets); + if (ret) + return dev_err_probe(dev, ret, "failed to get no-csr resets\n"); + + return 0; +} + +static int qmp_pcie_clk_init(struct qmp_pcie *qmp) +{ + const struct qmp_phy_cfg *cfg =3D qmp->cfg; + struct device *dev =3D qmp->dev; + int i, ret; + + qmp->clks =3D devm_kcalloc(dev, cfg->num_clks, sizeof(*qmp->clks), + GFP_KERNEL); + if (!qmp->clks) + return -ENOMEM; + + for (i =3D 0; i < cfg->num_clks; i++) + qmp->clks[i].id =3D cfg->clk_list[i]; + + ret =3D devm_clk_bulk_get_optional(dev, cfg->num_clks, qmp->clks); + if (ret) + return ret; + + qmp->pipe_clks =3D devm_kcalloc(dev, cfg->num_pipe_clks, + sizeof(*qmp->pipe_clks), GFP_KERNEL); + if (!qmp->pipe_clks) + return -ENOMEM; + + for (i =3D 0; i < cfg->num_pipe_clks; i++) + qmp->pipe_clks[i].id =3D cfg->pipe_clk_list[i]; + + return devm_clk_bulk_get_optional(dev, cfg->num_pipe_clks, + qmp->pipe_clks); +} + +static int __phy_pipe_clk_register(struct device *dev, struct device_node = *np, + int idx, struct clk_fixed_rate *fixed) +{ + struct clk_init_data init =3D { }; + int ret; + + ret =3D of_property_read_string_index(np, "clock-output-names", idx, + &init.name); + if (ret) { + dev_err(dev, "%pOFn: No clock-output-names\n", np); + return ret; + } + + init.ops =3D &clk_fixed_rate_ops; + + if (!fixed->fixed_rate) + fixed->fixed_rate =3D 125000000; + + fixed->hw.init =3D &init; + + return devm_clk_hw_register(dev, &fixed->hw); +} + +static struct clk_hw *qmp_pcie_multiphy_clk_hw_get(struct of_phandle_args = *clkspec, + void *data) +{ + struct qmp_pcie_multiphy *qmp_data =3D data; + unsigned int idx =3D 0; + + if (clkspec->args_count) + idx =3D clkspec->args[0]; + + if (idx < (unsigned int)qmp_data->num_pipe_outputs) + return &qmp_data->pipe_out_clks[idx].hw; + + return ERR_PTR(-EINVAL); +} + +static int qmp_pcie_multiphy_register_clocks(struct device *dev, + struct device_node *np, + struct qmp_pcie_multiphy *qmp_data) +{ + int num_pipe_outputs; + int i, ret; + + num_pipe_outputs =3D of_property_count_strings(np, "clock-output-names"); + if (num_pipe_outputs < 0) + num_pipe_outputs =3D 1; + + qmp_data->num_pipe_outputs =3D num_pipe_outputs; + qmp_data->pipe_out_clks =3D devm_kcalloc(dev, num_pipe_outputs, + sizeof(*qmp_data->pipe_out_clks), + GFP_KERNEL); + if (!qmp_data->pipe_out_clks) + return -ENOMEM; + + for (i =3D 0; i < num_pipe_outputs; i++) { + ret =3D __phy_pipe_clk_register(dev, np, i, + &qmp_data->pipe_out_clks[i]); + if (ret) + return ret; + } + + return devm_of_clk_add_hw_provider(dev, qmp_pcie_multiphy_clk_hw_get, qmp= _data); +} + +static int qmp_pcie_get_mmio(struct qmp_pcie *qmp) +{ + struct platform_device *pdev =3D to_platform_device(qmp->dev); + const struct qmp_phy_cfg *cfg =3D qmp->cfg; + struct device *dev =3D qmp->dev; + void __iomem *base; + int i; + + qmp->base =3D devm_kcalloc(dev, cfg->num_regs, sizeof(*qmp->base), + GFP_KERNEL); + if (!qmp->base) + return -ENOMEM; + + for (i =3D 0; i < cfg->num_regs; i++) { + base =3D devm_platform_ioremap_resource_byname(pdev, cfg->reg_names[i]); + if (IS_ERR(base)) + return PTR_ERR(base); + + qmp->base[i] =3D base; + } + + return 0; +} + +static int qmp_pcie_read_link_mode(struct device *dev, unsigned int *link_= mode) +{ + struct regmap *map; + unsigned int args[1]; + int ret; + + map =3D syscon_regmap_lookup_by_phandle_args(dev->of_node, "qcom,link-mod= e", + ARRAY_SIZE(args), args); + if (IS_ERR(map)) + return PTR_ERR(map); + + ret =3D regmap_read(map, args[0], link_mode); + if (ret) + return ret; + + return 0; +} + +static struct phy *qmp_pcie_multiphy_xlate(struct device *dev, + const struct of_phandle_args *args) +{ + struct qmp_pcie_multiphy *qmp_data =3D dev_get_drvdata(dev); + unsigned int idx; + + if (!qmp_data || args->args_count < 1) + return ERR_PTR(-EINVAL); + + idx =3D args->args[0]; + + if (idx < (unsigned int)qmp_data->mode_cfg->num_phys) + return qmp_data->phys[idx] ?: ERR_PTR(-EINVAL); + + return ERR_PTR(-EINVAL); +} + +static int qmp_pcie_probe_phy(struct qmp_pcie *qmp, struct device_node *np, + struct phy **out_phy) +{ + int ret; + + ret =3D qmp_pcie_get_mmio(qmp); + if (ret) + return ret; + + ret =3D qmp_pcie_clk_init(qmp); + if (ret) + return ret; + + ret =3D qmp_pcie_reset_init(qmp); + if (ret) + return ret; + + ret =3D qmp_pcie_vreg_init(qmp); + if (ret) + return ret; + + ret =3D qmp_pcie_pd_init(qmp); + if (ret) + return ret; + + *out_phy =3D devm_phy_create(qmp->dev, np, &qmp_pcie_phy_ops); + if (IS_ERR(*out_phy)) + return PTR_ERR(*out_phy); + + phy_set_drvdata(*out_phy, qmp); + + return 0; +} + + +static int qmp_pcie_multiphy_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct phy_provider *phy_provider; + struct qmp_pcie_multiphy *qmp_data; + const struct qmp_pcie_match_data *match_data; + struct qmp_pcie *qmp; + struct phy **phys; + unsigned int link_mode; + int phy_index; + int ret; + + qmp_data =3D devm_kzalloc(dev, sizeof(*qmp_data), GFP_KERNEL); + + match_data =3D of_device_get_match_data(dev); + if (!match_data) + return -EINVAL; + + if (!qmp_data) + return -ENOMEM; + + ret =3D qmp_pcie_read_link_mode(dev, &link_mode); + if (ret) + return dev_err_probe(dev, ret, "failed to read qcom,link-mode\n"); + + if (link_mode >=3D match_data->num_modes) + return dev_err_probe(dev, -EINVAL, "invalid qcom,link-mode: %u\n", + link_mode); + + qmp_data->mode_cfg =3D &match_data->mode_cfgs[link_mode]; + + qmp =3D devm_kcalloc(dev, qmp_data->mode_cfg->num_phys, sizeof(*qmp), GFP= _KERNEL); + if (!qmp) + return -ENOMEM; + + phys =3D devm_kcalloc(dev, qmp_data->mode_cfg->num_phys, sizeof(*phys), G= FP_KERNEL); + if (!phys) + return -ENOMEM; + + qmp_data->phys =3D phys; + dev_set_drvdata(dev, qmp_data); + + for (phy_index =3D 0; phy_index < qmp_data->mode_cfg->num_phys; phy_index= ++) { + qmp[phy_index].dev =3D dev; + qmp[phy_index].cfg =3D qmp_data->mode_cfg->cfgs[phy_index]; + ret =3D qmp_pcie_probe_phy(&qmp[phy_index], dev->of_node, &phys[phy_inde= x]); + if (ret) + return ret; + } + + ret =3D qmp_pcie_multiphy_register_clocks(dev, dev->of_node, qmp_data); + if (ret) + return ret; + + phy_provider =3D devm_of_phy_provider_register(dev, qmp_pcie_multiphy_xla= te); + + return PTR_ERR_OR_ZERO(phy_provider); +} + +static const struct of_device_id qmp_pcie_multiphy_of_match_table[] =3D { + { + .compatible =3D "qcom,glymur-qmp-gen5x8-pcie-phy", + .data =3D &glymur_qmp_gen5x8_match_data, + }, + { } +}; +MODULE_DEVICE_TABLE(of, qmp_pcie_multiphy_of_match_table); + +static struct platform_driver qmp_pcie_multiphy_driver =3D { + .probe =3D qmp_pcie_multiphy_probe, + .driver =3D { + .name =3D "qcom-qmp-pcie-multiphy", + .of_match_table =3D qmp_pcie_multiphy_of_match_table, + }, +}; +module_platform_driver(qmp_pcie_multiphy_driver); + +MODULE_AUTHOR("Qiang Yu "); +MODULE_DESCRIPTION("Qualcomm QMP PCIe PHY driver for Glymur"); +MODULE_LICENSE("GPL"); --=20 2.34.1 From nobody Sat Jul 25 05:29:57 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.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 3182F3E6DCE for ; Fri, 17 Jul 2026 09:58:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784282330; cv=none; b=nuLD0CCGgf5WXYRntEJEVTQZ05ygB7EpQtHgHaR2zxFW8TDfgWRPrVLxvr3SD1p+tmyUKvSE+2Rxc6y6tmbAq/ONj2QZwUDR/z85EYXl01EghxuX8d9vZvosjaDSqJLcAT9ZdQsicTqg1w3UkBexTtpHmAQYcz6zYVZEhq1w9mU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784282330; c=relaxed/simple; bh=m4HovyWy/veIkkYmi9SC6EFbB2VJ3EZARceVbS+ZD4E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ELwzZfLQr6nq0kf7u1KFBJTsVn7aFnB8a0Vo6kFuAVXg+h1yiaZ1Cc990XiVxMsejcrwqdDwEA/soC5l5RZJ01Zhv5z1+zeCZ2P93XW81lSb7sFjJf+Uc6qIwkdHU1wvIt27z2QXzfcdYuG8B9iWOVHvU7h8FqeaefVf9j+9HZ8= 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=QwOymOkg; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=BogItI+N; arc=none smtp.client-ip=205.220.168.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="QwOymOkg"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="BogItI+N" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66H9uxNb1120401 for ; Fri, 17 Jul 2026 09:58:45 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= PPJVjnyQDhn0JypEbQRGL0icNioWZCkFKhWku4ucmng=; b=QwOymOkgC12iRr0l fj0exbUy9HCqL8n6nrU6YDOqjrflT+R1lXYK+OEGD2OXcuEpqTE506OFvKNKsEcx wtZ8ay65910xu6X/XWGGzRIiuKfHox4lGtPH7Ft4Ez1048ypyMSYGsAWdI5bx86p WkHQPRjLzKP5wgeu0KONfjO8xZHIlAI2nLMRgt3PrybVhGqqodRSItHM7Eb/bS/j wN5Twne6YjQtMiob/8+y4AIJaC0ldSEE3s1RYbV7PMzKV9IUVr5DsM5R8jgbAA2T Ph8X/Ffek0hWXpah/DyJp2YYN7WfeWUDHEL2uHNAR2WZtR/Dk03znqlKHZwANaIA iEpbtA== 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 4ffj78r071-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 17 Jul 2026 09:58:45 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-3823dcc1647so9961646a91.3 for ; Fri, 17 Jul 2026 02:58:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784282324; x=1784887124; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=PPJVjnyQDhn0JypEbQRGL0icNioWZCkFKhWku4ucmng=; b=BogItI+NSQMpDzdWl8GP8OgVX725a2BD8k4qClPWLF4y9leRgktAUTeSRpPz0QNFD8 vJlH3Cwn878g91IduU96L4BJd20/FziaX5n7l0znh4QNmmpv/bRCUQ3QWeEU3+l3zhYT 4SKsuKY/NWXdromHZK0N+eUhco5T/qX8FquqM1ASrmOlKhuNAXwKDP56eN/CAVWmSl5L J5aUUSr8xp87axu3X/JkzwUZHgCQqFOljO+mIoxmzlqvQvEUGrCejeyWRlMfvmt523Jn ywetmrxfChY05lSWLgMEAWbrW/rQBoQW3nc/w+fN+BQ4Lk7ecH+3wJuRWSemjTG9YwRH wxPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784282324; x=1784887124; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=PPJVjnyQDhn0JypEbQRGL0icNioWZCkFKhWku4ucmng=; b=KDnxaavFKC+fU7nNiUnkkC/vzFJ6GjicGqlpQhL27ypmHHWy13hl7oamK4rmKM9oPB V8pNY/vuMkHmfSR8/yXZ7N3udGROczlxTtrWK9x7Kf5l6Zg01xuZcQ/ywWNHMH/I2Knp L+T+Z7M02pvJBlGSbF4Bv7m7fjRzoLHLtXxw76aAqD6qBUNV7wOvZGVIiweI5kIIViNq YXBIsVTmEClg7mjkTRLZTQ6t6AP0tJ57BPurm5Qj73qTA9WXT6qRxLThxcbJD6kWaGC4 ll+6sW9gts17rRD+zUyn5j0kfPNmGMQ28LsAGcUInvHN9upTJTR0LnNw2SjTAJsc/s96 9Arw== X-Forwarded-Encrypted: i=1; AHgh+RqgM/AUjCp3PckUqNVvDys4KaFizV00KWGxSTlWB5IB82R2Wu6fPYbgqYhnDEwuQai4bNyKwTk6fW3ztzo=@vger.kernel.org X-Gm-Message-State: AOJu0YzvdKXqnlwNufhREDoZydmQeBIRRhS3umNFKhb3fWqExbQuKUtj nl9Fkz7xo2IuH6mMsjUTqDb9mV0888FxJ15hhVLxS0nYt4Ws4MO0dVmXxl8Wysk7Bkcr1tdj4GB QaONBM2W3sv2VTXg1FTqL0DADib5RiXMUlAlUL/IGRW1jSzV8EPVn0yp/fn/nMSDSGJY= X-Gm-Gg: AfdE7ckM9Z2p3FJoM/oIspQq9l98iDEFq7MU7R6tdhXTAw9YGbJ4ZwINXSvAnPyOzwm OLF8wBfxlqAYu/udGL8NxWEfqzc+141Q15BGf361ElRg+MVKC8OGil/iYatV7Wet1gdXjKaSj+B vKXLjc/JztqZOh6EEYSMVvv5wS3++pV3GbtJFZelh5A9q4wvrGwRQZXVBQNjSKY+EWtyEz5MA3i oPuEx0ky2wkzn4ISX6dz3lccOIUrJk7artalnu5nqH6p7pXRKSkOiIsCKcAlWdixKU7ym1mUO1P mcVyR+G1MhO+ITU0MQteAy3zECId5oGf9rT5AfpuvtH4h5VqI5wGDKGzxKLmwtgM5SGwE6Z9i5u aGaWE0bnf+6GGnP3gxr5s6N48Mq8MM1umohO2L6yuqkvlOtM= X-Received: by 2002:a17:90b:4ac3:b0:387:e0db:3d90 with SMTP id 98e67ed59e1d1-38e4b5b4f9cmr1534541a91.43.1784282324392; Fri, 17 Jul 2026 02:58:44 -0700 (PDT) X-Received: by 2002:a17:90b:4ac3:b0:387:e0db:3d90 with SMTP id 98e67ed59e1d1-38e4b5b4f9cmr1534521a91.43.1784282323865; Fri, 17 Jul 2026 02:58:43 -0700 (PDT) Received: from hu-qianyu-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3142a02b7f2sm5586375eec.13.2026.07.17.02.58.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 02:58:42 -0700 (PDT) From: Qiang Yu Date: Fri, 17 Jul 2026 02:58:35 -0700 Subject: [PATCH v5 3/3] arm64: dts: qcom: glymur: Wire PCIe3a/3b to shared Gen5x8 PHY Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260717-glymur_linkmode_0717-v5-3-4f9e87a61463@oss.qualcomm.com> References: <20260717-glymur_linkmode_0717-v5-0-4f9e87a61463@oss.qualcomm.com> In-Reply-To: <20260717-glymur_linkmode_0717-v5-0-4f9e87a61463@oss.qualcomm.com> To: Vinod Koul , Neil Armstrong , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Manivannan Sadhasivam , Philipp Zabel , Bjorn Andersson , Konrad Dybcio Cc: Qiang Yu , linux-arm-msm@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1784282318; l=11640; i=qiang.yu@oss.qualcomm.com; s=20250513; h=from:subject:message-id; bh=m4HovyWy/veIkkYmi9SC6EFbB2VJ3EZARceVbS+ZD4E=; b=HD0UVGjRsek1PVoI2sorzgNbtRuN54rynBGLy0XDzSOjhgV1tcyU1to2TqqnVDsiGW5XF25h6 vMoSlHgS5GpBgk2K1E41CWsOeO90+C29R6BCmpVRK2i1N684YwHtm2d X-Developer-Key: i=qiang.yu@oss.qualcomm.com; a=ed25519; pk=Rr94t+fykoieF1ngg/bXxEfr5KoQxeXPtYxM8fBQTAI= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzE3MDA5OCBTYWx0ZWRfX42RR9oDioTlz NWCHWJqBOSWOpIZQZknodRysVnPAiwuFKdS3hc0b2lgqT/H1BhbPiTHIagbOJ+p2Eo5wXJZRG8N Jnrr0oLxVHqlAqfctl2gQYtK05bmMog6qae7iHOaGVcYi8DocYvV54sbzDATDLe/cnDN7aCcqf3 YpDalFbQ3K6a4o56ZYKo8U51keXeIgKHRcuccqa7QGsRlWlboZrcx91jrMqFTWPqlXQoU5GEkw3 TpuJaHwNYScOFgyRJLo/y5hJrV1yB2ALo+G7ych9lITwnoG5ZOASocUrGrS3WyQ+ULXtDm/5zBv VMWS9HRhdgU1DQlo+76dM7ohWYXKZVEAdumSDhWNaz9HoeWStDjg3KbE44EB+OufM4+60eiaQhi oh6rgUjQuhCfn3T2j4mV59r4OeObO+kDh5amuNNESpCrbkRTNGqGWPjvzUEKblhyoma7XERV5p5 VQqbImtprqrD5lTkI7w== X-Proofpoint-ORIG-GUID: Fvvx5knneOx4dRHlyjXYroNos3yF8E6V X-Authority-Analysis: v=2.4 cv=U9Ciy+ru c=1 sm=1 tr=0 ts=6a59fcd5 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=YUm7fC5sK4fRCMULFa4A:9 a=QEXdDO2ut3YA:10 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-GUID: Fvvx5knneOx4dRHlyjXYroNos3yF8E6V X-Proofpoint-Spam-Info: AW1haW4tMjYwNzE3MDA5OCBTYWx0ZWRfX+pp2sphbaR4f tGVErQ1CteGncgNUZ4c2Io00kQcwghoGWA3Y8JPNcTzlDYj3QxxRzr3+wMY2//TXMt9Aei2y0Gr HuyQqJ8bd2qwORdEyBNl3xzYGF/Q7pg= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-17_02,2026-07-15_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 suspectscore=0 phishscore=0 spamscore=0 lowpriorityscore=0 clxscore=1015 priorityscore=1501 malwarescore=0 impostorscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607170098 Glymur's PCIe3a and PCIe3b controllers share a single Gen5x8 QMP PHY block that can be bifurcated into two independent x4 links, rather than each controller owning its own dedicated PHY. Add a pcie3_phy node describing the shared PHY block, add the missing PCIe3a controller node, and point both PCIe3a's and PCIe3b's port phys at &pcie3_phy (index 0 and 1 respectively) so each controller picks up its half of the bifurcated PHY. Update the GCC pipe clock parent array to reference the new PHY's clock outputs instead of the placeholders. Signed-off-by: Qiang Yu --- arch/arm64/boot/dts/qcom/glymur-crd.dtsi | 8 + arch/arm64/boot/dts/qcom/glymur.dtsi | 336 +++++++++++++++++++++++++++= +++- 2 files changed, 342 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/glymur-crd.dtsi b/arch/arm64/boot/dts= /qcom/glymur-crd.dtsi index c12808abbfe1..e8e81bf9a6a1 100644 --- a/arch/arm64/boot/dts/qcom/glymur-crd.dtsi +++ b/arch/arm64/boot/dts/qcom/glymur-crd.dtsi @@ -750,6 +750,14 @@ &pcie3b { pinctrl-names =3D "default"; }; =20 +&pcie3_phy { + vdda-phy-supply =3D <&vreg_l3c_e1_0p89>; + vdda-pll-supply =3D <&vreg_l2c_e1_1p14>; + + vdda-refgen0p9-supply =3D <&vreg_l1c_e1_0p82>; + vdda-refgen1p2-supply =3D <&vreg_l4f_e1_1p08>; +}; + &pcie3b_port0 { reset-gpios =3D <&tlmm 155 GPIO_ACTIVE_LOW>; wake-gpios =3D <&tlmm 157 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/qcom/glymur.dtsi b/arch/arm64/boot/dts/qco= m/glymur.dtsi index 6d058d591039..edd09b84b8b9 100644 --- a/arch/arm64/boot/dts/qcom/glymur.dtsi +++ b/arch/arm64/boot/dts/qcom/glymur.dtsi @@ -801,8 +801,8 @@ gcc: clock-controller@100000 { <0>, /* USB 2 Phy PCIE PIPEGMUX */ <0>, /* USB 2 Phy PIPEGMUX */ <0>, /* USB 2 Phy SYS PCIE PIPEGMUX */ - <0>, /* PCIe 3a */ - <0>, /* PCIe 3b */ + <&pcie3_phy 0>, /* PCIe 3a pipe */ + <&pcie3_phy 1>, /* PCIe 3b pipe */ <&pcie4_phy>, /* PCIe 4 */ <&pcie5_phy>, /* PCIe 5 */ <&pcie6_phy>, /* PCIe 6 */ @@ -2329,6 +2329,62 @@ &config_noc SLAVE_QUP_0 QCOM_ICC_TAG_ALWAYS>, }; }; =20 + pcie3_phy: phy@f00000 { + compatible =3D "qcom,glymur-qmp-gen5x8-pcie-phy"; + reg =3D <0x0 0x00f00000 0x0 0x10000>, + <0x0 0x00f10000 0x0 0x10000>; + reg-names =3D "port_a", + "port_b"; + + clocks =3D <&gcc GCC_PCIE_PHY_3A_AUX_CLK>, + <&gcc GCC_PCIE_3A_CFG_AHB_CLK>, + <&tcsr TCSR_PCIE_3_CLKREF_EN>, + <&gcc GCC_PCIE_3A_PHY_RCHNG_CLK>, + <&gcc GCC_PCIE_3A_PIPE_CLK>, + <&gcc GCC_PCIE_PHY_3B_AUX_CLK>, + <&gcc GCC_PCIE_3B_CFG_AHB_CLK>, + <&gcc GCC_PCIE_3B_PHY_RCHNG_CLK>, + <&gcc GCC_PCIE_3B_PIPE_CLK>, + <&gcc GCC_PCIE_3B_PIPE_DIV2_CLK>; + clock-names =3D "aux", + "cfg_ahb", + "ref", + "rchng", + "pipe", + "phy_b_aux", + "cfg_ahb_b", + "rchng_b", + "pipe_b", + "pipediv2_b"; + + resets =3D <&gcc GCC_PCIE_3A_PHY_BCR>, + <&gcc GCC_PCIE_3A_NOCSR_COM_PHY_BCR>, + <&gcc GCC_PCIE_3B_PHY_BCR>, + <&gcc GCC_PCIE_3B_NOCSR_COM_PHY_BCR>; + reset-names =3D "phy_a", + "phy_a_nocsr", + "phy_b", + "phy_b_nocsr"; + + assigned-clocks =3D <&gcc GCC_PCIE_3A_PHY_RCHNG_CLK>, + <&gcc GCC_PCIE_3B_PHY_RCHNG_CLK>; + assigned-clock-rates =3D <100000000>, <100000000>; + + power-domains =3D <&gcc GCC_PCIE_3A_PHY_GDSC>, + <&gcc GCC_PCIE_3B_PHY_GDSC>; + power-domain-names =3D "phy_a_gdsc", "phy_b_gdsc"; + + qcom,link-mode =3D <&tcsr 0x5000>; + + #clock-cells =3D <1>; + clock-output-names =3D "pcie3a_pipe_clk", + "pcie3b_pipe_clk"; + + #phy-cells =3D <1>; + + status =3D "disabled"; + }; + usb_hs_phy: phy@fa0000 { compatible =3D "qcom,glymur-m31-eusb2-phy", "qcom,sm8750-m31-eusb2-phy"; @@ -3691,6 +3747,282 @@ pcie3b_port0: pcie@0 { reg =3D <0x0 0x0 0x0 0x0 0x0>; bus-range =3D <0x01 0xff>; =20 + phys =3D <&pcie3_phy 1>; + + #address-cells =3D <3>; + #size-cells =3D <2>; + ranges; + }; + }; + + pcie3a: pci@1c10000 { + device_type =3D "pci"; + compatible =3D "qcom,glymur-pcie", "qcom,pcie-x1e80100"; + reg =3D <0x0 0x01c10000 0x0 0x3000>, + <0x0 0x70000000 0x0 0xf20>, + <0x0 0x70000f40 0x0 0xa8>, + <0x0 0x70001000 0x0 0x4000>, + <0x0 0x70100000 0x0 0x100000>, + <0x0 0x01c13000 0x0 0x1000>; + reg-names =3D "parf", + "dbi", + "elbi", + "atu", + "config", + "mhi"; + #address-cells =3D <3>; + #size-cells =3D <2>; + ranges =3D <0x01000000 0x0 0x00000000 0x0 0x70200000 0x0 0x100000>, + <0x02000000 0x0 0x70000000 0x0 0x70300000 0x0 0x3d00000>, + <0x03000000 0x7 0x00000000 0x7 0x00000000 0x0 0x40000000>, + <0x43000000 0x70 0x00000000 0x70 0x00000000 0x10 0x00000000>; + + bus-range =3D <0 0xff>; + + dma-coherent; + + linux,pci-domain =3D <3>; + num-lanes =3D <8>; + + operating-points-v2 =3D <&pcie3a_opp_table>; + + msi-map =3D <0x0 &gic_its 0xb0000 0x10000>; + iommu-map =3D <0x0 &pcie_smmu 0x30000 0x10000>; + + interrupts =3D , + , + , + , + , + , + , + , + ; + interrupt-names =3D "msi0", + "msi1", + "msi2", + "msi3", + "msi4", + "msi5", + "msi6", + "msi7", + "global"; + + #interrupt-cells =3D <1>; + interrupt-map-mask =3D <0 0 0 0x7>; + interrupt-map =3D <0 0 0 1 &intc 0 0 0 848 IRQ_TYPE_LEVEL_HIGH>, + <0 0 0 2 &intc 0 0 0 849 IRQ_TYPE_LEVEL_HIGH>, + <0 0 0 3 &intc 0 0 0 850 IRQ_TYPE_LEVEL_HIGH>, + <0 0 0 4 &intc 0 0 0 851 IRQ_TYPE_LEVEL_HIGH>; + + clocks =3D <&gcc GCC_PCIE_3A_AUX_CLK>, + <&gcc GCC_PCIE_3A_CFG_AHB_CLK>, + <&gcc GCC_PCIE_3A_MSTR_AXI_CLK>, + <&gcc GCC_PCIE_3A_SLV_AXI_CLK>, + <&gcc GCC_PCIE_3A_SLV_Q2A_AXI_CLK>, + <&gcc GCC_AGGRE_NOC_PCIE_3A_WEST_SF_AXI_CLK>; + clock-names =3D "aux", + "cfg", + "bus_master", + "bus_slave", + "slave_q2a", + "noc_aggr"; + + assigned-clocks =3D <&gcc GCC_PCIE_3A_AUX_CLK>; + assigned-clock-rates =3D <19200000>; + + interconnects =3D <&pcie_west_anoc MASTER_PCIE_3A QCOM_ICC_TAG_ALWAYS + &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>, + <&hsc_noc MASTER_APPSS_PROC QCOM_ICC_TAG_ALWAYS + &pcie_west_slv_noc SLAVE_PCIE_3A QCOM_ICC_TAG_ALWAYS>; + interconnect-names =3D "pcie-mem", + "cpu-pcie"; + + resets =3D <&gcc GCC_PCIE_3A_BCR>, + <&gcc GCC_PCIE_3A_LINK_DOWN_BCR>; + reset-names =3D "pci", + "link_down"; + + power-domains =3D <&gcc GCC_PCIE_3A_GDSC>; + + eq-presets-8gts =3D /bits/ 16 <0x5555 0x5555 0x5555 0x5555 + 0x5555 0x5555 0x5555 0x5555>; + eq-presets-16gts =3D /bits/ 8 <0x55 0x55 0x55 0x55 0x55 0x55 0x55 0x55>; + eq-presets-32gts =3D /bits/ 8 <0x55 0x55 0x55 0x55 0x55 0x55 0x55 0x55>; + + status =3D "disabled"; + + pcie3a_opp_table: opp-table { + compatible =3D "operating-points-v2"; + + /* GEN 1 x1 */ + opp-2500000-1 { + opp-hz =3D /bits/ 64 <2500000>; + required-opps =3D <&rpmhpd_opp_low_svs>; + opp-peak-kBps =3D <250000 1>; + opp-level =3D <1>; + }; + + /* GEN 1 x2 */ + opp-5000000-1 { + opp-hz =3D /bits/ 64 <5000000>; + required-opps =3D <&rpmhpd_opp_low_svs>; + opp-peak-kBps =3D <500000 1>; + opp-level =3D <1>; + }; + + /* GEN 1 x4 */ + opp-10000000-1 { + opp-hz =3D /bits/ 64 <10000000>; + required-opps =3D <&rpmhpd_opp_low_svs>; + opp-peak-kBps =3D <1000000 1>; + opp-level =3D <1>; + }; + + /* GEN 1 x8 */ + opp-20000000-1 { + opp-hz =3D /bits/ 64 <20000000>; + required-opps =3D <&rpmhpd_opp_low_svs>; + opp-peak-kBps =3D <2000000 1>; + opp-level =3D <1>; + }; + + /* GEN 2 x1 */ + opp-5000000-2 { + opp-hz =3D /bits/ 64 <5000000>; + required-opps =3D <&rpmhpd_opp_low_svs>; + opp-peak-kBps =3D <500000 1>; + opp-level =3D <2>; + }; + + /* GEN 2 x2 */ + opp-10000000-2 { + opp-hz =3D /bits/ 64 <10000000>; + required-opps =3D <&rpmhpd_opp_low_svs>; + opp-peak-kBps =3D <1000000 1>; + opp-level =3D <2>; + }; + + /* GEN 2 x4 */ + opp-20000000-2 { + opp-hz =3D /bits/ 64 <20000000>; + required-opps =3D <&rpmhpd_opp_low_svs>; + opp-peak-kBps =3D <2000000 1>; + opp-level =3D <2>; + }; + + /* GEN 2 x8 */ + opp-40000000-2 { + opp-hz =3D /bits/ 64 <40000000>; + required-opps =3D <&rpmhpd_opp_low_svs>; + opp-peak-kBps =3D <4000000 1>; + opp-level =3D <2>; + }; + + /* GEN 3 x1 */ + opp-8000000-3 { + opp-hz =3D /bits/ 64 <8000000>; + required-opps =3D <&rpmhpd_opp_low_svs>; + opp-peak-kBps =3D <984500 1>; + opp-level =3D <3>; + }; + + /* GEN 3 x2 */ + opp-16000000-3 { + opp-hz =3D /bits/ 64 <16000000>; + required-opps =3D <&rpmhpd_opp_low_svs>; + opp-peak-kBps =3D <1969000 1>; + opp-level =3D <3>; + }; + + /* GEN 3 x4 */ + opp-32000000-3 { + opp-hz =3D /bits/ 64 <32000000>; + required-opps =3D <&rpmhpd_opp_low_svs>; + opp-peak-kBps =3D <3938000 1>; + opp-level =3D <3>; + }; + + /* GEN 3 x8 */ + opp-64000000-3 { + opp-hz =3D /bits/ 64 <64000000>; + required-opps =3D <&rpmhpd_opp_low_svs>; + opp-peak-kBps =3D <7876000 1>; + opp-level =3D <3>; + }; + + /* GEN 4 x1 */ + opp-16000000-4 { + opp-hz =3D /bits/ 64 <16000000>; + required-opps =3D <&rpmhpd_opp_svs>; + opp-peak-kBps =3D <1969000 1>; + opp-level =3D <4>; + }; + + /* GEN 4 x2 */ + opp-32000000-4 { + opp-hz =3D /bits/ 64 <32000000>; + required-opps =3D <&rpmhpd_opp_svs>; + opp-peak-kBps =3D <3938000 1>; + opp-level =3D <4>; + }; + + /* GEN 4 x4 */ + opp-64000000-4 { + opp-hz =3D /bits/ 64 <64000000>; + required-opps =3D <&rpmhpd_opp_svs>; + opp-peak-kBps =3D <7876000 1>; + opp-level =3D <4>; + }; + + /* GEN 4 x8 */ + opp-128000000-4 { + opp-hz =3D /bits/ 64 <128000000>; + required-opps =3D <&rpmhpd_opp_svs>; + opp-peak-kBps =3D <15753000 1>; + opp-level =3D <4>; + }; + + /* GEN 5 x1 */ + opp-32000000-5 { + opp-hz =3D /bits/ 64 <32000000>; + required-opps =3D <&rpmhpd_opp_nom>; + opp-peak-kBps =3D <3938000 1>; + opp-level =3D <5>; + }; + + /* GEN 5 x2 */ + opp-64000000-5 { + opp-hz =3D /bits/ 64 <64000000>; + required-opps =3D <&rpmhpd_opp_nom>; + opp-peak-kBps =3D <7876000 1>; + opp-level =3D <5>; + }; + + /* GEN 5 x4 */ + opp-128000000-5 { + opp-hz =3D /bits/ 64 <128000000>; + required-opps =3D <&rpmhpd_opp_nom>; + opp-peak-kBps =3D <15753000 1>; + opp-level =3D <5>; + }; + + /* GEN 5 x8 */ + opp-256000000-5 { + opp-hz =3D /bits/ 64 <256000000>; + required-opps =3D <&rpmhpd_opp_nom>; + opp-peak-kBps =3D <31506000 1>; + opp-level =3D <5>; + }; + }; + + pcie3a_port0: pcie@0 { + device_type =3D "pci"; + reg =3D <0x0 0x0 0x0 0x0 0x0>; + bus-range =3D <0x01 0xff>; + + phys =3D <&pcie3_phy 0>; + #address-cells =3D <3>; #size-cells =3D <2>; ranges; --=20 2.34.1