Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'phy-for-6.6' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy

Pull phy updates from Vinod Koul:
"As usual a couple of new drivers, a bunch of new device support and
few updates to existing drivers

New Support:
- Starfive dphy rx, JH7110 usb and pcie support
- Rockchip rv1126 inno-dsi phy, rk3588 usb and pcie support
- Qualcomm sa8775p PCIe support, M31 USB PHY driver
- Samsung Exynos850 usb support

Updates:
- Mediatek dsi driver clock updates
- Qualcomm sm8150 combo phy with reworking of qmp pcie driver
- Xilinx zynqmp runtime PM support"

* tag 'phy-for-6.6' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy: (83 commits)
phy: exynos5-usbdrd: Add Exynos850 support
phy: exynos5-usbdrd: Add 26MHz ref clk support
phy: exynos5-usbdrd: Make it possible to pass custom phy ops
dt-bindings: phy: samsung,usb3-drd-phy: Add Exynos850 support
phy: qcom-qmp-combo: fix clock probing
phy: qcom-qmp-pcie: support SM8150 PCIe QMP PHYs
phy: qcom-qmp-pcie: populate offsets configuration
phy: qcom-qmp-pcie: simplify clock handling
phy: qcom-qmp-pcie: keep offset tables sorted
phy: qcom-qmp-pcie: drop ln_shrd from v5_20 config
dt-bindings: phy: qcom,qmp-pcie: describe SM8150 PCIe PHYs
dt-bindings: phy: migrate QMP PCIe PHY bindings to qcom,sc8280xp-qmp-pcie-phy.yaml
phy: fsl-imx8mq-usb: add dev_err_probe if getting vbus failed
phy: qcom: Introduce M31 USB PHY driver
dt-bindings: phy: qcom,m31: Document qcom,m31 USB phy
phy: rockchip: inno-dsidphy: Add rv1126 support
dt-bindings: phy: rockchip-inno-dsidphy: Document rv1126
dt-bindings: phy: mediatek,tphy: allow simple nodename pattern
phy: amlogic: meson-g12a-usb2: fix Wvoid-pointer-to-enum-cast warning
phy: marvell pxa-usb: fix Wvoid-pointer-to-enum-cast warning
...

+5243 -3183
+1 -1
Documentation/devicetree/bindings/phy/mediatek,tphy.yaml
··· 64 64 65 65 properties: 66 66 $nodename: 67 - pattern: "^t-phy@[0-9a-f]+$" 67 + pattern: "^t-phy(@[0-9a-f]+)?$" 68 68 69 69 compatible: 70 70 oneOf:
+59
Documentation/devicetree/bindings/phy/qcom,ipq5332-usb-hsphy.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/phy/qcom,ipq5332-usb-hsphy.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: M31 USB PHY 8 + 9 + maintainers: 10 + - Sricharan Ramabadhran <quic_srichara@quicinc.com> 11 + - Varadarajan Narayanan <quic_varada@quicinc.com> 12 + 13 + description: 14 + USB M31 PHY (https://www.m31tech.com) found in Qualcomm 15 + IPQ5018, IPQ5332 SoCs. 16 + 17 + properties: 18 + compatible: 19 + items: 20 + - const: qcom,ipq5332-usb-hsphy 21 + 22 + "#phy-cells": 23 + const: 0 24 + 25 + reg: 26 + maxItems: 1 27 + 28 + clocks: 29 + maxItems: 1 30 + 31 + clock-names: 32 + items: 33 + - const: cfg_ahb 34 + 35 + resets: 36 + maxItems: 1 37 + 38 + vdd-supply: 39 + description: 40 + Phandle to 5V regulator supply to PHY digital circuit. 41 + 42 + additionalProperties: false 43 + 44 + examples: 45 + - | 46 + #include <dt-bindings/clock/qcom,ipq5332-gcc.h> 47 + usb-phy@7b000 { 48 + compatible = "qcom,ipq5332-usb-hsphy"; 49 + reg = <0x0007b000 0x12c>; 50 + 51 + clocks = <&gcc GCC_USB0_PHY_CFG_AHB_CLK>; 52 + clock-names = "cfg_ahb"; 53 + 54 + #phy-cells = <0>; 55 + 56 + resets = <&gcc GCC_QUSB2_0_PHY_BCR>; 57 + 58 + vdd-supply = <&regulator_fixed_5p0>; 59 + };
+35 -243
Documentation/devicetree/bindings/phy/qcom,ipq8074-qmp-pcie-phy.yaml
··· 13 13 QMP PHY controller supports physical layer functionality for a number of 14 14 controllers on Qualcomm chipsets, such as, PCIe, UFS, and USB. 15 15 16 - Note that these bindings are for SoCs up to SC8180X. For newer SoCs, see 17 - qcom,sc8280xp-qmp-pcie-phy.yaml. 18 - 19 16 properties: 20 17 compatible: 21 18 enum: 22 19 - qcom,ipq6018-qmp-pcie-phy 23 20 - qcom,ipq8074-qmp-gen3-pcie-phy 24 21 - qcom,ipq8074-qmp-pcie-phy 25 - - qcom,msm8998-qmp-pcie-phy 26 - - qcom,sc8180x-qmp-pcie-phy 27 - - qcom,sdm845-qhp-pcie-phy 28 - - qcom,sdm845-qmp-pcie-phy 29 - - qcom,sdx55-qmp-pcie-phy 30 - - qcom,sm8250-qmp-gen3x1-pcie-phy 31 - - qcom,sm8250-qmp-gen3x2-pcie-phy 32 - - qcom,sm8250-qmp-modem-pcie-phy 33 - - qcom,sm8450-qmp-gen3x1-pcie-phy 34 - - qcom,sm8450-qmp-gen4x2-pcie-phy 35 22 36 23 reg: 37 24 items: 38 25 - description: serdes 39 26 40 - "#address-cells": 41 - enum: [ 1, 2 ] 42 - 43 - "#size-cells": 44 - enum: [ 1, 2 ] 45 - 46 - ranges: true 47 - 48 27 clocks: 49 - minItems: 2 50 - maxItems: 4 28 + maxItems: 3 51 29 52 30 clock-names: 53 - minItems: 2 54 - maxItems: 4 31 + items: 32 + - const: aux 33 + - const: cfg_ahb 34 + - const: pipe 55 35 56 36 resets: 57 - minItems: 1 58 37 maxItems: 2 59 38 60 39 reset-names: 61 - minItems: 1 62 - maxItems: 2 40 + items: 41 + - const: phy 42 + - const: common 63 43 64 - vdda-phy-supply: true 44 + "#clock-cells": 45 + const: 0 65 46 66 - vdda-pll-supply: true 47 + clock-output-names: 48 + maxItems: 1 67 49 68 - vddp-ref-clk-supply: true 69 - 70 - patternProperties: 71 - "^phy@[0-9a-f]+$": 72 - type: object 73 - description: single PHY-provider child node 74 - properties: 75 - reg: 76 - minItems: 3 77 - maxItems: 6 78 - 79 - clocks: 80 - items: 81 - - description: PIPE clock 82 - 83 - clock-names: 84 - deprecated: true 85 - items: 86 - - const: pipe0 87 - 88 - "#clock-cells": 89 - const: 0 90 - 91 - clock-output-names: 92 - maxItems: 1 93 - 94 - "#phy-cells": 95 - const: 0 96 - 97 - required: 98 - - reg 99 - - clocks 100 - - "#clock-cells" 101 - - clock-output-names 102 - - "#phy-cells" 103 - 104 - additionalProperties: false 50 + "#phy-cells": 51 + const: 0 105 52 106 53 required: 107 54 - compatible 108 55 - reg 109 - - "#address-cells" 110 - - "#size-cells" 111 - - ranges 112 56 - clocks 113 57 - clock-names 114 58 - resets 115 59 - reset-names 60 + - "#clock-cells" 61 + - clock-output-names 62 + - "#phy-cells" 116 63 117 64 additionalProperties: false 118 65 119 - allOf: 120 - - if: 121 - properties: 122 - compatible: 123 - contains: 124 - enum: 125 - - qcom,msm8998-qmp-pcie-phy 126 - then: 127 - properties: 128 - clocks: 129 - maxItems: 3 130 - clock-names: 131 - items: 132 - - const: aux 133 - - const: cfg_ahb 134 - - const: ref 135 - resets: 136 - maxItems: 2 137 - reset-names: 138 - items: 139 - - const: phy 140 - - const: common 141 - required: 142 - - vdda-phy-supply 143 - - vdda-pll-supply 144 - 145 - - if: 146 - properties: 147 - compatible: 148 - contains: 149 - enum: 150 - - qcom,ipq6018-qmp-pcie-phy 151 - - qcom,ipq8074-qmp-gen3-pcie-phy 152 - - qcom,ipq8074-qmp-pcie-phy 153 - then: 154 - properties: 155 - clocks: 156 - maxItems: 2 157 - clock-names: 158 - items: 159 - - const: aux 160 - - const: cfg_ahb 161 - resets: 162 - maxItems: 2 163 - reset-names: 164 - items: 165 - - const: phy 166 - - const: common 167 - 168 - - if: 169 - properties: 170 - compatible: 171 - contains: 172 - enum: 173 - - qcom,sc8180x-qmp-pcie-phy 174 - - qcom,sdm845-qhp-pcie-phy 175 - - qcom,sdm845-qmp-pcie-phy 176 - - qcom,sdx55-qmp-pcie-phy 177 - - qcom,sm8250-qmp-gen3x1-pcie-phy 178 - - qcom,sm8250-qmp-gen3x2-pcie-phy 179 - - qcom,sm8250-qmp-modem-pcie-phy 180 - - qcom,sm8450-qmp-gen3x1-pcie-phy 181 - - qcom,sm8450-qmp-gen4x2-pcie-phy 182 - then: 183 - properties: 184 - clocks: 185 - maxItems: 4 186 - clock-names: 187 - items: 188 - - const: aux 189 - - const: cfg_ahb 190 - - const: ref 191 - - const: refgen 192 - resets: 193 - maxItems: 1 194 - reset-names: 195 - items: 196 - - const: phy 197 - required: 198 - - vdda-phy-supply 199 - - vdda-pll-supply 200 - 201 - - if: 202 - properties: 203 - compatible: 204 - contains: 205 - enum: 206 - - qcom,sc8180x-qmp-pcie-phy 207 - - qcom,sm8250-qmp-gen3x2-pcie-phy 208 - - qcom,sm8250-qmp-modem-pcie-phy 209 - - qcom,sm8450-qmp-gen4x2-pcie-phy 210 - then: 211 - patternProperties: 212 - "^phy@[0-9a-f]+$": 213 - properties: 214 - reg: 215 - items: 216 - - description: TX lane 1 217 - - description: RX lane 1 218 - - description: PCS 219 - - description: TX lane 2 220 - - description: RX lane 2 221 - - description: PCS_MISC 222 - 223 - - if: 224 - properties: 225 - compatible: 226 - contains: 227 - enum: 228 - - qcom,sdm845-qmp-pcie-phy 229 - - qcom,sdx55-qmp-pcie-phy 230 - - qcom,sm8250-qmp-gen3x1-pcie-phy 231 - - qcom,sm8450-qmp-gen3x1-pcie-phy 232 - then: 233 - patternProperties: 234 - "^phy@[0-9a-f]+$": 235 - properties: 236 - reg: 237 - items: 238 - - description: TX 239 - - description: RX 240 - - description: PCS 241 - - description: PCS_MISC 242 - 243 - - if: 244 - properties: 245 - compatible: 246 - contains: 247 - enum: 248 - - qcom,ipq6018-qmp-pcie-phy 249 - - qcom,ipq8074-qmp-pcie-phy 250 - - qcom,msm8998-qmp-pcie-phy 251 - - qcom,sdm845-qhp-pcie-phy 252 - then: 253 - patternProperties: 254 - "^phy@[0-9a-f]+$": 255 - properties: 256 - reg: 257 - items: 258 - - description: TX 259 - - description: RX 260 - - description: PCS 261 - 262 66 examples: 263 67 - | 264 - #include <dt-bindings/clock/qcom,gcc-sm8250.h> 265 - phy-wrapper@1c0e000 { 266 - compatible = "qcom,sm8250-qmp-gen3x2-pcie-phy"; 267 - reg = <0x01c0e000 0x1c0>; 268 - #address-cells = <1>; 269 - #size-cells = <1>; 270 - ranges = <0x0 0x01c0e000 0x1000>; 68 + #include <dt-bindings/clock/qcom,gcc-ipq6018.h> 69 + #include <dt-bindings/reset/qcom,gcc-ipq6018.h> 271 70 272 - clocks = <&gcc GCC_PCIE_PHY_AUX_CLK>, 273 - <&gcc GCC_PCIE_1_CFG_AHB_CLK>, 274 - <&gcc GCC_PCIE_WIGIG_CLKREF_EN>, 275 - <&gcc GCC_PCIE1_PHY_REFGEN_CLK>; 276 - clock-names = "aux", "cfg_ahb", "ref", "refgen"; 71 + phy@84000 { 72 + compatible = "qcom,ipq6018-qmp-pcie-phy"; 73 + reg = <0x0 0x00084000 0x0 0x1000>; 277 74 278 - resets = <&gcc GCC_PCIE_1_PHY_BCR>; 279 - reset-names = "phy"; 75 + clocks = <&gcc GCC_PCIE0_AUX_CLK>, 76 + <&gcc GCC_PCIE0_AHB_CLK>, 77 + <&gcc GCC_PCIE0_PIPE_CLK>; 78 + clock-names = "aux", 79 + "cfg_ahb", 80 + "pipe"; 280 81 281 - vdda-phy-supply = <&vreg_l10c_0p88>; 282 - vdda-pll-supply = <&vreg_l6b_1p2>; 82 + clock-output-names = "gcc_pcie0_pipe_clk_src"; 83 + #clock-cells = <0>; 283 84 284 - phy@200 { 285 - reg = <0x200 0x170>, 286 - <0x400 0x200>, 287 - <0xa00 0x1f0>, 288 - <0x600 0x170>, 289 - <0x800 0x200>, 290 - <0xe00 0xf4>; 85 + #phy-cells = <0>; 291 86 292 - clocks = <&gcc GCC_PCIE_1_PIPE_CLK>; 293 - 294 - #clock-cells = <0>; 295 - clock-output-names = "pcie_1_pipe_clk"; 296 - 297 - #phy-cells = <0>; 298 - }; 87 + resets = <&gcc GCC_PCIE0_PHY_BCR>, 88 + <&gcc GCC_PCIE0PHY_PHY_BCR>; 89 + reset-names = "phy", 90 + "common"; 299 91 };
-228
Documentation/devicetree/bindings/phy/qcom,msm8996-qmp-ufs-phy.yaml
··· 1 - # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 - %YAML 1.2 3 - --- 4 - $id: http://devicetree.org/schemas/phy/qcom,msm8996-qmp-ufs-phy.yaml# 5 - $schema: http://devicetree.org/meta-schemas/core.yaml# 6 - 7 - title: Qualcomm QMP PHY controller (UFS, MSM8996) 8 - 9 - maintainers: 10 - - Vinod Koul <vkoul@kernel.org> 11 - 12 - description: 13 - QMP PHY controller supports physical layer functionality for a number of 14 - controllers on Qualcomm chipsets, such as, PCIe, UFS, and USB. 15 - 16 - Note that these bindings are for SoCs up to SC8180X. For newer SoCs, see 17 - qcom,sc8280xp-qmp-ufs-phy.yaml. 18 - 19 - properties: 20 - compatible: 21 - enum: 22 - - qcom,msm8996-qmp-ufs-phy 23 - - qcom,msm8998-qmp-ufs-phy 24 - - qcom,sc8180x-qmp-ufs-phy 25 - - qcom,sdm845-qmp-ufs-phy 26 - - qcom,sm6115-qmp-ufs-phy 27 - - qcom,sm6350-qmp-ufs-phy 28 - - qcom,sm8150-qmp-ufs-phy 29 - - qcom,sm8250-qmp-ufs-phy 30 - - qcom,sm8350-qmp-ufs-phy 31 - - qcom,sm8450-qmp-ufs-phy 32 - 33 - reg: 34 - items: 35 - - description: serdes 36 - 37 - "#address-cells": 38 - enum: [ 1, 2 ] 39 - 40 - "#size-cells": 41 - enum: [ 1, 2 ] 42 - 43 - ranges: true 44 - 45 - clocks: 46 - minItems: 1 47 - maxItems: 3 48 - 49 - clock-names: 50 - minItems: 1 51 - maxItems: 3 52 - 53 - power-domains: 54 - maxItems: 1 55 - 56 - resets: 57 - maxItems: 1 58 - 59 - reset-names: 60 - items: 61 - - const: ufsphy 62 - 63 - vdda-phy-supply: true 64 - 65 - vdda-pll-supply: true 66 - 67 - vddp-ref-clk-supply: true 68 - 69 - patternProperties: 70 - "^phy@[0-9a-f]+$": 71 - type: object 72 - description: single PHY-provider child node 73 - properties: 74 - reg: 75 - minItems: 3 76 - maxItems: 6 77 - 78 - "#clock-cells": 79 - const: 1 80 - 81 - "#phy-cells": 82 - const: 0 83 - 84 - required: 85 - - reg 86 - - "#phy-cells" 87 - 88 - additionalProperties: false 89 - 90 - required: 91 - - compatible 92 - - reg 93 - - "#address-cells" 94 - - "#size-cells" 95 - - ranges 96 - - clocks 97 - - clock-names 98 - - resets 99 - - reset-names 100 - - vdda-phy-supply 101 - - vdda-pll-supply 102 - 103 - additionalProperties: false 104 - 105 - allOf: 106 - - if: 107 - properties: 108 - compatible: 109 - contains: 110 - enum: 111 - - qcom,msm8996-qmp-ufs-phy 112 - then: 113 - properties: 114 - clocks: 115 - maxItems: 1 116 - clock-names: 117 - items: 118 - - const: ref 119 - 120 - - if: 121 - properties: 122 - compatible: 123 - contains: 124 - enum: 125 - - qcom,msm8998-qmp-ufs-phy 126 - - qcom,sc8180x-qmp-ufs-phy 127 - - qcom,sdm845-qmp-ufs-phy 128 - - qcom,sm6115-qmp-ufs-phy 129 - - qcom,sm6350-qmp-ufs-phy 130 - - qcom,sm8150-qmp-ufs-phy 131 - - qcom,sm8250-qmp-ufs-phy 132 - then: 133 - properties: 134 - clocks: 135 - maxItems: 2 136 - clock-names: 137 - items: 138 - - const: ref 139 - - const: ref_aux 140 - 141 - - if: 142 - properties: 143 - compatible: 144 - contains: 145 - enum: 146 - - qcom,sm8450-qmp-ufs-phy 147 - then: 148 - properties: 149 - clocks: 150 - maxItems: 3 151 - clock-names: 152 - items: 153 - - const: ref 154 - - const: ref_aux 155 - - const: qref 156 - 157 - - if: 158 - properties: 159 - compatible: 160 - contains: 161 - enum: 162 - - qcom,msm8998-qmp-ufs-phy 163 - - qcom,sc8180x-qmp-ufs-phy 164 - - qcom,sdm845-qmp-ufs-phy 165 - - qcom,sm6350-qmp-ufs-phy 166 - - qcom,sm8150-qmp-ufs-phy 167 - - qcom,sm8250-qmp-ufs-phy 168 - - qcom,sm8350-qmp-ufs-phy 169 - - qcom,sm8450-qmp-ufs-phy 170 - then: 171 - patternProperties: 172 - "^phy@[0-9a-f]+$": 173 - properties: 174 - reg: 175 - items: 176 - - description: TX lane 1 177 - - description: RX lane 1 178 - - description: PCS 179 - - description: TX lane 2 180 - - description: RX lane 2 181 - 182 - - if: 183 - properties: 184 - compatible: 185 - contains: 186 - enum: 187 - - qcom,msm8996-qmp-ufs-phy 188 - - qcom,sm6115-qmp-ufs-phy 189 - then: 190 - patternProperties: 191 - "^phy@[0-9a-f]+$": 192 - properties: 193 - reg: 194 - items: 195 - - description: TX 196 - - description: RX 197 - - description: PCS 198 - 199 - examples: 200 - - | 201 - #include <dt-bindings/clock/qcom,gcc-sm8250.h> 202 - #include <dt-bindings/clock/qcom,rpmh.h> 203 - 204 - phy-wrapper@1d87000 { 205 - compatible = "qcom,sm8250-qmp-ufs-phy"; 206 - reg = <0x01d87000 0x1c0>; 207 - #address-cells = <1>; 208 - #size-cells = <1>; 209 - ranges = <0x0 0x01d87000 0x1000>; 210 - 211 - clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GCC_UFS_PHY_PHY_AUX_CLK>; 212 - clock-names = "ref", "ref_aux"; 213 - 214 - resets = <&ufs_mem_hc 0>; 215 - reset-names = "ufsphy"; 216 - 217 - vdda-phy-supply = <&vreg_l6b>; 218 - vdda-pll-supply = <&vreg_l3b>; 219 - 220 - phy@400 { 221 - reg = <0x400 0x108>, 222 - <0x600 0x1e0>, 223 - <0xc00 0x1dc>, 224 - <0x800 0x108>, 225 - <0xa00 0x1e0>; 226 - #phy-cells = <0>; 227 - }; 228 - };
-80
Documentation/devicetree/bindings/phy/qcom,msm8996-qmp-usb3-phy.yaml
··· 23 23 - qcom,ipq8074-qmp-usb3-phy 24 24 - qcom,msm8996-qmp-usb3-phy 25 25 - qcom,msm8998-qmp-usb3-phy 26 - - qcom,sc7180-qmp-usb3-phy 27 - - qcom,sc8180x-qmp-usb3-phy 28 - - qcom,sdm845-qmp-usb3-phy 29 26 - qcom,sdm845-qmp-usb3-uni-phy 30 27 - qcom,sdx55-qmp-usb3-uni-phy 31 28 - qcom,sdx65-qmp-usb3-uni-phy 32 - - qcom,sm8150-qmp-usb3-phy 33 29 - qcom,sm8150-qmp-usb3-uni-phy 34 - - qcom,sm8250-qmp-usb3-phy 35 30 - qcom,sm8250-qmp-usb3-uni-phy 36 - - qcom,sm8350-qmp-usb3-phy 37 31 - qcom,sm8350-qmp-usb3-uni-phy 38 - - qcom,sm8450-qmp-usb3-phy 39 32 40 33 reg: 41 - minItems: 1 42 34 items: 43 35 - description: serdes 44 - - description: DP_COM 45 36 46 37 "#address-cells": 47 38 enum: [ 1, 2 ] ··· 122 131 compatible: 123 132 contains: 124 133 enum: 125 - - qcom,sc7180-qmp-usb3-phy 126 - then: 127 - properties: 128 - clocks: 129 - maxItems: 4 130 - clock-names: 131 - items: 132 - - const: aux 133 - - const: cfg_ahb 134 - - const: ref 135 - - const: com_aux 136 - resets: 137 - maxItems: 1 138 - reset-names: 139 - items: 140 - - const: phy 141 - 142 - - if: 143 - properties: 144 - compatible: 145 - contains: 146 - enum: 147 134 - qcom,sdm845-qmp-usb3-uni-phy 148 135 then: 149 136 properties: ··· 171 202 compatible: 172 203 contains: 173 204 enum: 174 - - qcom,sm8150-qmp-usb3-phy 175 205 - qcom,sm8150-qmp-usb3-uni-phy 176 206 - qcom,sm8250-qmp-usb3-uni-phy 177 207 - qcom,sm8350-qmp-usb3-uni-phy ··· 190 222 items: 191 223 - const: phy 192 224 - const: common 193 - 194 - - if: 195 - properties: 196 - compatible: 197 - contains: 198 - enum: 199 - - qcom,sm8250-qmp-usb3-phy 200 - - qcom,sm8350-qmp-usb3-phy 201 - then: 202 - properties: 203 - clocks: 204 - maxItems: 3 205 - clock-names: 206 - items: 207 - - const: aux 208 - - const: ref_clk_src 209 - - const: com_aux 210 - resets: 211 - maxItems: 2 212 - reset-names: 213 - items: 214 - - const: phy 215 - - const: common 216 - 217 - - if: 218 - properties: 219 - compatible: 220 - contains: 221 - enum: 222 - - qcom,sdm845-qmp-usb3-phy 223 - - qcom,sm8150-qmp-usb3-phy 224 - - qcom,sm8350-qmp-usb3-phy 225 - - qcom,sm8450-qmp-usb3-phy 226 - then: 227 - patternProperties: 228 - "^phy@[0-9a-f]+$": 229 - properties: 230 - reg: 231 - items: 232 - - description: TX lane 1 233 - - description: RX lane 1 234 - - description: PCS 235 - - description: TX lane 2 236 - - description: RX lane 2 237 - - description: PCS_MISC 238 225 239 226 - if: 240 227 properties: ··· 216 293 enum: 217 294 - qcom,ipq6018-qmp-usb3-phy 218 295 - qcom,ipq8074-qmp-usb3-phy 219 - - qcom,sc7180-qmp-usb3-phy 220 - - qcom,sc8180x-qmp-usb3-phy 221 296 - qcom,sdx55-qmp-usb3-uni-phy 222 297 - qcom,sdx65-qmp-usb3-uni-phy 223 298 - qcom,sm8150-qmp-usb3-uni-phy 224 - - qcom,sm8250-qmp-usb3-phy 225 299 then: 226 300 patternProperties: 227 301 "^phy@[0-9a-f]+$":
+97
Documentation/devicetree/bindings/phy/qcom,msm8998-qmp-pcie-phy.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/phy/qcom,msm8998-qmp-pcie-phy.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm QMP PHY controller (PCIe, MSM8998) 8 + 9 + maintainers: 10 + - Vinod Koul <vkoul@kernel.org> 11 + 12 + description: 13 + The QMP PHY controller supports physical layer functionality for a number of 14 + controllers on Qualcomm chipsets, such as, PCIe, UFS, and USB. 15 + 16 + properties: 17 + compatible: 18 + const: qcom,msm8998-qmp-pcie-phy 19 + 20 + reg: 21 + items: 22 + - description: serdes 23 + 24 + clocks: 25 + maxItems: 4 26 + 27 + clock-names: 28 + items: 29 + - const: aux 30 + - const: cfg_ahb 31 + - const: ref 32 + - const: pipe 33 + 34 + resets: 35 + maxItems: 2 36 + 37 + reset-names: 38 + items: 39 + - const: phy 40 + - const: common 41 + 42 + vdda-phy-supply: true 43 + 44 + vdda-pll-supply: true 45 + 46 + "#clock-cells": 47 + const: 0 48 + 49 + clock-output-names: 50 + maxItems: 1 51 + 52 + "#phy-cells": 53 + const: 0 54 + 55 + required: 56 + - compatible 57 + - reg 58 + - clocks 59 + - clock-names 60 + - resets 61 + - reset-names 62 + - vdda-phy-supply 63 + - vdda-pll-supply 64 + - "#clock-cells" 65 + - clock-output-names 66 + - "#phy-cells" 67 + 68 + additionalProperties: false 69 + 70 + examples: 71 + - | 72 + #include <dt-bindings/clock/qcom,gcc-msm8998.h> 73 + 74 + phy@1c18000 { 75 + compatible = "qcom,msm8998-qmp-pcie-phy"; 76 + reg = <0x01c06000 0x1000>; 77 + 78 + clocks = <&gcc GCC_PCIE_PHY_AUX_CLK>, 79 + <&gcc GCC_PCIE_0_CFG_AHB_CLK>, 80 + <&gcc GCC_PCIE_CLKREF_CLK>, 81 + <&gcc GCC_PCIE_0_PIPE_CLK>; 82 + clock-names = "aux", 83 + "cfg_ahb", 84 + "ref", 85 + "pipe"; 86 + 87 + clock-output-names = "pcie_0_pipe_clk_src"; 88 + #clock-cells = <0>; 89 + 90 + #phy-cells = <0>; 91 + 92 + resets = <&gcc GCC_PCIE_0_PHY_BCR>, <&gcc GCC_PCIE_PHY_BCR>; 93 + reset-names = "phy", "common"; 94 + 95 + vdda-phy-supply = <&vreg_l1a_0p875>; 96 + vdda-pll-supply = <&vreg_l2a_1p2>; 97 + };
-282
Documentation/devicetree/bindings/phy/qcom,sc7180-qmp-usb3-dp-phy.yaml
··· 1 - # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 - 3 - %YAML 1.2 4 - --- 5 - $id: http://devicetree.org/schemas/phy/qcom,sc7180-qmp-usb3-dp-phy.yaml# 6 - $schema: http://devicetree.org/meta-schemas/core.yaml# 7 - 8 - title: Qualcomm QMP USB3 DP PHY controller (SC7180) 9 - 10 - description: 11 - The QMP PHY controller supports physical layer functionality for a number of 12 - controllers on Qualcomm chipsets, such as, PCIe, UFS and USB. 13 - 14 - Note that these bindings are for SoCs up to SC8180X. For newer SoCs, see 15 - qcom,sc8280xp-qmp-usb43dp-phy.yaml. 16 - 17 - maintainers: 18 - - Wesley Cheng <quic_wcheng@quicinc.com> 19 - 20 - properties: 21 - compatible: 22 - oneOf: 23 - - enum: 24 - - qcom,sc7180-qmp-usb3-dp-phy 25 - - qcom,sc8180x-qmp-usb3-dp-phy 26 - - qcom,sdm845-qmp-usb3-dp-phy 27 - - qcom,sm8250-qmp-usb3-dp-phy 28 - - items: 29 - - enum: 30 - - qcom,sc7280-qmp-usb3-dp-phy 31 - - const: qcom,sm8250-qmp-usb3-dp-phy 32 - 33 - reg: 34 - items: 35 - - description: Address and length of PHY's USB serdes block. 36 - - description: Address and length of the DP_COM control block. 37 - - description: Address and length of PHY's DP serdes block. 38 - 39 - reg-names: 40 - items: 41 - - const: usb 42 - - const: dp_com 43 - - const: dp 44 - 45 - "#address-cells": 46 - enum: [ 1, 2 ] 47 - 48 - "#size-cells": 49 - enum: [ 1, 2 ] 50 - 51 - ranges: true 52 - 53 - clocks: 54 - minItems: 3 55 - maxItems: 4 56 - 57 - clock-names: 58 - minItems: 3 59 - maxItems: 4 60 - 61 - power-domains: 62 - maxItems: 1 63 - 64 - orientation-switch: 65 - description: Flag the port as possible handler of orientation switching 66 - type: boolean 67 - 68 - resets: 69 - items: 70 - - description: reset of phy block. 71 - - description: phy common block reset. 72 - 73 - reset-names: 74 - items: 75 - - const: phy 76 - - const: common 77 - 78 - vdda-phy-supply: 79 - description: 80 - Phandle to a regulator supply to PHY core block. 81 - 82 - vdda-pll-supply: 83 - description: 84 - Phandle to 1.8V regulator supply to PHY refclk pll block. 85 - 86 - vddp-ref-clk-supply: 87 - description: 88 - Phandle to a regulator supply to any specific refclk pll block. 89 - 90 - # Required nodes: 91 - patternProperties: 92 - "^usb3-phy@[0-9a-f]+$": 93 - type: object 94 - additionalProperties: false 95 - description: 96 - The USB3 PHY. 97 - 98 - properties: 99 - reg: 100 - items: 101 - - description: Address and length of TX. 102 - - description: Address and length of RX. 103 - - description: Address and length of PCS. 104 - - description: Address and length of TX2. 105 - - description: Address and length of RX2. 106 - - description: Address and length of pcs_misc. 107 - 108 - clocks: 109 - items: 110 - - description: pipe clock 111 - 112 - clock-names: 113 - deprecated: true 114 - items: 115 - - const: pipe0 116 - 117 - clock-output-names: 118 - items: 119 - - const: usb3_phy_pipe_clk_src 120 - 121 - '#clock-cells': 122 - const: 0 123 - 124 - '#phy-cells': 125 - const: 0 126 - 127 - required: 128 - - reg 129 - - clocks 130 - - '#clock-cells' 131 - - '#phy-cells' 132 - 133 - "^dp-phy@[0-9a-f]+$": 134 - type: object 135 - additionalProperties: false 136 - description: 137 - The DP PHY. 138 - 139 - properties: 140 - reg: 141 - items: 142 - - description: Address and length of TX. 143 - - description: Address and length of RX. 144 - - description: Address and length of PCS. 145 - - description: Address and length of TX2. 146 - - description: Address and length of RX2. 147 - 148 - '#clock-cells': 149 - const: 1 150 - 151 - '#phy-cells': 152 - const: 0 153 - 154 - required: 155 - - reg 156 - - '#clock-cells' 157 - - '#phy-cells' 158 - 159 - required: 160 - - compatible 161 - - reg 162 - - "#address-cells" 163 - - "#size-cells" 164 - - ranges 165 - - clocks 166 - - clock-names 167 - - resets 168 - - reset-names 169 - - vdda-phy-supply 170 - - vdda-pll-supply 171 - 172 - allOf: 173 - - if: 174 - properties: 175 - compatible: 176 - enum: 177 - - qcom,sc7180-qmp-usb3-dp-phy 178 - - qcom,sdm845-qmp-usb3-dp-phy 179 - then: 180 - properties: 181 - clocks: 182 - items: 183 - - description: Phy aux clock 184 - - description: Phy config clock 185 - - description: 19.2 MHz ref clk 186 - - description: Phy common block aux clock 187 - clock-names: 188 - items: 189 - - const: aux 190 - - const: cfg_ahb 191 - - const: ref 192 - - const: com_aux 193 - 194 - - if: 195 - properties: 196 - compatible: 197 - enum: 198 - - qcom,sc8180x-qmp-usb3-dp-phy 199 - then: 200 - properties: 201 - clocks: 202 - items: 203 - - description: Phy aux clock 204 - - description: 19.2 MHz ref clk 205 - - description: Phy common block aux clock 206 - clock-names: 207 - items: 208 - - const: aux 209 - - const: ref 210 - - const: com_aux 211 - 212 - - if: 213 - properties: 214 - compatible: 215 - enum: 216 - - qcom,sm8250-qmp-usb3-dp-phy 217 - then: 218 - properties: 219 - clocks: 220 - items: 221 - - description: Phy aux clock 222 - - description: Board XO source 223 - - description: Phy common block aux clock 224 - clock-names: 225 - items: 226 - - const: aux 227 - - const: ref_clk_src 228 - - const: com_aux 229 - 230 - additionalProperties: false 231 - 232 - examples: 233 - - | 234 - #include <dt-bindings/clock/qcom,gcc-sdm845.h> 235 - usb_1_qmpphy: phy-wrapper@88e9000 { 236 - compatible = "qcom,sdm845-qmp-usb3-dp-phy"; 237 - reg = <0x088e9000 0x18c>, 238 - <0x088e8000 0x10>, 239 - <0x088ea000 0x40>; 240 - reg-names = "usb", "dp_com", "dp"; 241 - #address-cells = <1>; 242 - #size-cells = <1>; 243 - ranges = <0x0 0x088e9000 0x2000>; 244 - 245 - clocks = <&gcc GCC_USB3_PRIM_PHY_AUX_CLK>, 246 - <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>, 247 - <&gcc GCC_USB3_PRIM_CLKREF_CLK>, 248 - <&gcc GCC_USB3_PRIM_PHY_COM_AUX_CLK>; 249 - clock-names = "aux", "cfg_ahb", "ref", "com_aux"; 250 - 251 - resets = <&gcc GCC_USB3_PHY_PRIM_BCR>, 252 - <&gcc GCC_USB3_DP_PHY_PRIM_BCR>; 253 - reset-names = "phy", "common"; 254 - 255 - vdda-phy-supply = <&vdda_usb2_ss_1p2>; 256 - vdda-pll-supply = <&vdda_usb2_ss_core>; 257 - 258 - orientation-switch; 259 - 260 - usb3-phy@200 { 261 - reg = <0x200 0x128>, 262 - <0x400 0x200>, 263 - <0xc00 0x218>, 264 - <0x600 0x128>, 265 - <0x800 0x200>, 266 - <0xa00 0x100>; 267 - #clock-cells = <0>; 268 - #phy-cells = <0>; 269 - clocks = <&gcc GCC_USB3_PRIM_PHY_PIPE_CLK>; 270 - clock-output-names = "usb3_phy_pipe_clk_src"; 271 - }; 272 - 273 - dp-phy@88ea200 { 274 - reg = <0xa200 0x200>, 275 - <0xa400 0x200>, 276 - <0xaa00 0x200>, 277 - <0xa600 0x200>, 278 - <0xa800 0x200>; 279 - #clock-cells = <1>; 280 - #phy-cells = <0>; 281 - }; 282 - };
+51 -4
Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-pcie-phy.yaml
··· 16 16 properties: 17 17 compatible: 18 18 enum: 19 + - qcom,sa8775p-qmp-gen4x2-pcie-phy 20 + - qcom,sa8775p-qmp-gen4x4-pcie-phy 21 + - qcom,sc8180x-qmp-pcie-phy 19 22 - qcom,sc8280xp-qmp-gen3x1-pcie-phy 20 23 - qcom,sc8280xp-qmp-gen3x2-pcie-phy 21 24 - qcom,sc8280xp-qmp-gen3x4-pcie-phy 25 + - qcom,sdm845-qhp-pcie-phy 26 + - qcom,sdm845-qmp-pcie-phy 27 + - qcom,sdx55-qmp-pcie-phy 22 28 - qcom,sdx65-qmp-gen4x2-pcie-phy 29 + - qcom,sm8150-qmp-gen3x1-pcie-phy 30 + - qcom,sm8150-qmp-gen3x2-pcie-phy 31 + - qcom,sm8250-qmp-gen3x1-pcie-phy 32 + - qcom,sm8250-qmp-gen3x2-pcie-phy 33 + - qcom,sm8250-qmp-modem-pcie-phy 23 34 - qcom,sm8350-qmp-gen3x1-pcie-phy 35 + - qcom,sm8450-qmp-gen3x1-pcie-phy 36 + - qcom,sm8450-qmp-gen4x2-pcie-phy 24 37 - qcom,sm8550-qmp-gen3x2-pcie-phy 25 38 - qcom,sm8550-qmp-gen4x2-pcie-phy 26 39 ··· 43 30 44 31 clocks: 45 32 minItems: 5 46 - maxItems: 6 33 + maxItems: 7 47 34 48 35 clock-names: 49 36 minItems: 5 ··· 51 38 - const: aux 52 39 - const: cfg_ahb 53 40 - const: ref 54 - - const: rchng 41 + - enum: [rchng, refgen] 55 42 - const: pipe 56 43 - const: pipediv2 44 + - const: phy_aux 57 45 58 46 power-domains: 59 47 maxItems: 1 ··· 98 84 - reg 99 85 - clocks 100 86 - clock-names 101 - - power-domains 102 87 - resets 103 88 - reset-names 104 89 - vdda-phy-supply ··· 133 120 compatible: 134 121 contains: 135 122 enum: 123 + - qcom,sc8180x-qmp-pcie-phy 124 + - qcom,sdm845-qhp-pcie-phy 125 + - qcom,sdm845-qmp-pcie-phy 126 + - qcom,sdx55-qmp-pcie-phy 127 + - qcom,sm8150-qmp-gen3x1-pcie-phy 128 + - qcom,sm8150-qmp-gen3x2-pcie-phy 129 + - qcom,sm8250-qmp-gen3x1-pcie-phy 130 + - qcom,sm8250-qmp-gen3x2-pcie-phy 131 + - qcom,sm8250-qmp-modem-pcie-phy 136 132 - qcom,sm8350-qmp-gen3x1-pcie-phy 133 + - qcom,sm8450-qmp-gen3x1-pcie-phy 134 + - qcom,sm8450-qmp-gen3x2-pcie-phy 137 135 - qcom,sm8550-qmp-gen3x2-pcie-phy 138 136 - qcom,sm8550-qmp-gen4x2-pcie-phy 139 137 then: ··· 153 129 maxItems: 5 154 130 clock-names: 155 131 maxItems: 5 156 - else: 132 + 133 + - if: 134 + properties: 135 + compatible: 136 + contains: 137 + enum: 138 + - qcom,sc8280xp-qmp-gen3x1-pcie-phy 139 + - qcom,sc8280xp-qmp-gen3x2-pcie-phy 140 + - qcom,sc8280xp-qmp-gen3x4-pcie-phy 141 + then: 157 142 properties: 158 143 clocks: 159 144 minItems: 6 160 145 clock-names: 161 146 minItems: 6 147 + 148 + - if: 149 + properties: 150 + compatible: 151 + contains: 152 + enum: 153 + - qcom,sa8775p-qmp-gen4x2-pcie-phy 154 + - qcom,sa8775p-qmp-gen4x4-pcie-phy 155 + then: 156 + properties: 157 + clocks: 158 + minItems: 7 159 + clock-names: 160 + minItems: 7 162 161 163 162 - if: 164 163 properties:
+45 -3
Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-ufs-phy.yaml
··· 16 16 properties: 17 17 compatible: 18 18 enum: 19 + - qcom,msm8996-qmp-ufs-phy 20 + - qcom,msm8998-qmp-ufs-phy 19 21 - qcom,sa8775p-qmp-ufs-phy 22 + - qcom,sc8180x-qmp-ufs-phy 20 23 - qcom,sc8280xp-qmp-ufs-phy 24 + - qcom,sdm845-qmp-ufs-phy 25 + - qcom,sm6115-qmp-ufs-phy 21 26 - qcom,sm6125-qmp-ufs-phy 27 + - qcom,sm6350-qmp-ufs-phy 22 28 - qcom,sm7150-qmp-ufs-phy 29 + - qcom,sm8150-qmp-ufs-phy 30 + - qcom,sm8250-qmp-ufs-phy 31 + - qcom,sm8350-qmp-ufs-phy 32 + - qcom,sm8450-qmp-ufs-phy 23 33 - qcom,sm8550-qmp-ufs-phy 24 34 25 35 reg: 26 36 maxItems: 1 27 37 28 38 clocks: 29 - minItems: 2 39 + minItems: 1 30 40 maxItems: 3 31 41 32 42 clock-names: 33 - minItems: 2 43 + minItems: 1 34 44 items: 35 45 - const: ref 36 46 - const: ref_aux ··· 85 75 contains: 86 76 enum: 87 77 - qcom,sa8775p-qmp-ufs-phy 78 + - qcom,sm8450-qmp-ufs-phy 88 79 then: 89 80 properties: 90 81 clocks: 91 82 minItems: 3 92 83 clock-names: 93 84 minItems: 3 94 - else: 85 + 86 + - if: 87 + properties: 88 + compatible: 89 + contains: 90 + enum: 91 + - qcom,msm8998-qmp-ufs-phy 92 + - qcom,sc8180x-qmp-ufs-phy 93 + - qcom,sc8280xp-qmp-ufs-phy 94 + - qcom,sdm845-qmp-ufs-phy 95 + - qcom,sm6115-qmp-ufs-phy 96 + - qcom,sm6125-qmp-ufs-phy 97 + - qcom,sm6350-qmp-ufs-phy 98 + - qcom,sm7150-qmp-ufs-phy 99 + - qcom,sm8150-qmp-ufs-phy 100 + - qcom,sm8250-qmp-ufs-phy 101 + - qcom,sm8350-qmp-ufs-phy 102 + - qcom,sm8550-qmp-ufs-phy 103 + then: 95 104 properties: 96 105 clocks: 97 106 maxItems: 2 98 107 clock-names: 99 108 maxItems: 2 109 + 110 + - if: 111 + properties: 112 + compatible: 113 + contains: 114 + enum: 115 + - qcom,msm8996-qmp-ufs-phy 116 + then: 117 + properties: 118 + clocks: 119 + maxItems: 1 120 + clock-names: 121 + maxItems: 1 100 122 101 123 additionalProperties: false 102 124
+44 -2
Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-usb43dp-phy.yaml
··· 16 16 properties: 17 17 compatible: 18 18 enum: 19 + - qcom,sc7180-qmp-usb3-dp-phy 20 + - qcom,sc7280-qmp-usb3-dp-phy 21 + - qcom,sc8180x-qmp-usb3-dp-phy 19 22 - qcom,sc8280xp-qmp-usb43dp-phy 23 + - qcom,sdm845-qmp-usb3-dp-phy 20 24 - qcom,sm6350-qmp-usb3-dp-phy 25 + - qcom,sm8150-qmp-usb3-dp-phy 26 + - qcom,sm8250-qmp-usb3-dp-phy 21 27 - qcom,sm8350-qmp-usb3-dp-phy 22 28 - qcom,sm8450-qmp-usb3-dp-phy 23 29 - qcom,sm8550-qmp-usb3-dp-phy ··· 32 26 maxItems: 1 33 27 34 28 clocks: 35 - maxItems: 4 29 + minItems: 4 30 + maxItems: 5 36 31 37 32 clock-names: 33 + minItems: 4 38 34 items: 39 35 - const: aux 40 36 - const: ref 41 37 - const: com_aux 42 38 - const: usb3_pipe 39 + - const: cfg_ahb 43 40 44 41 power-domains: 45 42 maxItems: 1 ··· 94 85 - reg 95 86 - clocks 96 87 - clock-names 97 - - power-domains 98 88 - resets 99 89 - reset-names 100 90 - vdda-phy-supply 101 91 - vdda-pll-supply 102 92 - "#clock-cells" 103 93 - "#phy-cells" 94 + 95 + allOf: 96 + - if: 97 + properties: 98 + compatible: 99 + enum: 100 + - qcom,sc7180-qmp-usb3-dp-phy 101 + - qcom,sdm845-qmp-usb3-dp-phy 102 + then: 103 + properties: 104 + clocks: 105 + maxItems: 5 106 + clock-names: 107 + maxItems: 5 108 + else: 109 + properties: 110 + clocks: 111 + maxItems: 4 112 + clock-names: 113 + maxItems: 4 114 + 115 + - if: 116 + properties: 117 + compatible: 118 + enum: 119 + - qcom,sc8280xp-qmp-usb43dp-phy 120 + - qcom,sm6350-qmp-usb3-dp-phy 121 + - qcom,sm8550-qmp-usb3-dp-phy 122 + then: 123 + required: 124 + - power-domains 125 + else: 126 + properties: 127 + power-domains: false 104 128 105 129 additionalProperties: false 106 130
+6 -1
Documentation/devicetree/bindings/phy/qcom,snps-eusb2-repeater.yaml
··· 15 15 16 16 properties: 17 17 compatible: 18 - const: qcom,pm8550b-eusb2-repeater 18 + oneOf: 19 + - items: 20 + - enum: 21 + - qcom,pm7550ba-eusb2-repeater 22 + - const: qcom,pm8550b-eusb2-repeater 23 + - const: qcom,pm8550b-eusb2-repeater 19 24 20 25 reg: 21 26 maxItems: 1
+18 -3
Documentation/devicetree/bindings/phy/rockchip,inno-usb2phy.yaml
··· 20 20 - rockchip,rk3366-usb2phy 21 21 - rockchip,rk3399-usb2phy 22 22 - rockchip,rk3568-usb2phy 23 + - rockchip,rk3588-usb2phy 23 24 - rockchip,rv1108-usb2phy 24 25 25 26 reg: ··· 56 55 interrupts: 57 56 description: Muxed interrupt for both ports 58 57 maxItems: 1 58 + 59 + resets: 60 + maxItems: 2 61 + 62 + reset-names: 63 + items: 64 + - const: phy 65 + - const: apb 59 66 60 67 rockchip,usbgrf: 61 68 $ref: /schemas/types.yaml#/definitions/phandle ··· 129 120 - reg 130 121 - clock-output-names 131 122 - "#clock-cells" 132 - - host-port 133 - - otg-port 123 + 124 + anyOf: 125 + - required: 126 + - otg-port 127 + - required: 128 + - host-port 134 129 135 130 allOf: 136 131 - if: 137 132 properties: 138 133 compatible: 139 134 contains: 140 - const: rockchip,rk3568-usb2phy 135 + enum: 136 + - rockchip,rk3568-usb2phy 137 + - rockchip,rk3588-usb2phy 141 138 142 139 then: 143 140 properties:
+28 -5
Documentation/devicetree/bindings/phy/rockchip,pcie3-phy.yaml
··· 13 13 compatible: 14 14 enum: 15 15 - rockchip,rk3568-pcie3-phy 16 + - rockchip,rk3588-pcie3-phy 16 17 17 18 reg: 18 19 maxItems: 1 19 20 20 21 clocks: 21 - minItems: 3 22 + minItems: 1 22 23 maxItems: 3 23 24 24 25 clock-names: 25 - items: 26 - - const: refclk_m 27 - - const: refclk_n 28 - - const: pclk 26 + minItems: 1 27 + maxItems: 3 29 28 30 29 data-lanes: 31 30 description: which lanes (by position) should be mapped to which ··· 59 60 - reg 60 61 - rockchip,phy-grf 61 62 - "#phy-cells" 63 + 64 + allOf: 65 + - if: 66 + properties: 67 + compatible: 68 + enum: 69 + - rockchip,rk3588-pcie3-phy 70 + then: 71 + properties: 72 + clocks: 73 + maxItems: 1 74 + clock-names: 75 + items: 76 + - const: pclk 77 + else: 78 + properties: 79 + clocks: 80 + minItems: 3 81 + 82 + clock-names: 83 + items: 84 + - const: refclk_m 85 + - const: refclk_n 86 + - const: pclk 62 87 63 88 additionalProperties: false 64 89
+1
Documentation/devicetree/bindings/phy/rockchip,px30-dsi-dphy.yaml
··· 19 19 - rockchip,rk3128-dsi-dphy 20 20 - rockchip,rk3368-dsi-dphy 21 21 - rockchip,rk3568-dsi-dphy 22 + - rockchip,rv1126-dsi-dphy 22 23 23 24 reg: 24 25 maxItems: 1
+1
Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
··· 29 29 - samsung,exynos5420-usbdrd-phy 30 30 - samsung,exynos5433-usbdrd-phy 31 31 - samsung,exynos7-usbdrd-phy 32 + - samsung,exynos850-usbdrd-phy 32 33 33 34 clocks: 34 35 minItems: 2
+71
Documentation/devicetree/bindings/phy/starfive,jh7110-dphy-rx.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/phy/starfive,jh7110-dphy-rx.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: StarFive SoC JH7110 MIPI D-PHY Rx Controller 8 + 9 + maintainers: 10 + - Jack Zhu <jack.zhu@starfivetech.com> 11 + - Changhuang Liang <changhuang.liang@starfivetech.com> 12 + 13 + description: 14 + StarFive SoCs contain a MIPI CSI D-PHY based on M31 IP, used to 15 + transfer CSI camera data. 16 + 17 + properties: 18 + compatible: 19 + const: starfive,jh7110-dphy-rx 20 + 21 + reg: 22 + maxItems: 1 23 + 24 + clocks: 25 + items: 26 + - description: config clock 27 + - description: reference clock 28 + - description: escape mode transmit clock 29 + 30 + clock-names: 31 + items: 32 + - const: cfg 33 + - const: ref 34 + - const: tx 35 + 36 + resets: 37 + items: 38 + - description: DPHY_HW reset 39 + - description: DPHY_B09_ALWAYS_ON reset 40 + 41 + power-domains: 42 + maxItems: 1 43 + 44 + "#phy-cells": 45 + const: 0 46 + 47 + required: 48 + - compatible 49 + - reg 50 + - clocks 51 + - clock-names 52 + - resets 53 + - power-domains 54 + - "#phy-cells" 55 + 56 + additionalProperties: false 57 + 58 + examples: 59 + - | 60 + phy@19820000 { 61 + compatible = "starfive,jh7110-dphy-rx"; 62 + reg = <0x19820000 0x10000>; 63 + clocks = <&ispcrg 3>, 64 + <&ispcrg 4>, 65 + <&ispcrg 5>; 66 + clock-names = "cfg", "ref", "tx"; 67 + resets = <&ispcrg 2>, 68 + <&ispcrg 3>; 69 + power-domains = <&aon_syscon 1>; 70 + #phy-cells = <0>; 71 + };
+58
Documentation/devicetree/bindings/phy/starfive,jh7110-pcie-phy.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/phy/starfive,jh7110-pcie-phy.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: StarFive JH7110 PCIe 2.0 PHY 8 + 9 + maintainers: 10 + - Minda Chen <minda.chen@starfivetech.com> 11 + 12 + properties: 13 + compatible: 14 + const: starfive,jh7110-pcie-phy 15 + 16 + reg: 17 + maxItems: 1 18 + 19 + "#phy-cells": 20 + const: 0 21 + 22 + starfive,sys-syscon: 23 + $ref: /schemas/types.yaml#/definitions/phandle-array 24 + items: 25 + - items: 26 + - description: phandle to System Register Controller sys_syscon node. 27 + - description: PHY connect offset of SYS_SYSCONSAIF__SYSCFG register for USB PHY. 28 + description: 29 + The phandle to System Register Controller syscon node and the PHY connect offset 30 + of SYS_SYSCONSAIF__SYSCFG register. Connect PHY to USB3 controller. 31 + 32 + starfive,stg-syscon: 33 + $ref: /schemas/types.yaml#/definitions/phandle-array 34 + items: 35 + - items: 36 + - description: phandle to System Register Controller stg_syscon node. 37 + - description: PHY mode offset of STG_SYSCONSAIF__SYSCFG register. 38 + - description: PHY enable for USB offset of STG_SYSCONSAIF__SYSCFG register. 39 + description: 40 + The phandle to System Register Controller syscon node and the offset 41 + of STG_SYSCONSAIF__SYSCFG register for PCIe PHY. Total 2 regsisters offset. 42 + 43 + required: 44 + - compatible 45 + - reg 46 + - "#phy-cells" 47 + 48 + additionalProperties: false 49 + 50 + examples: 51 + - | 52 + phy@10210000 { 53 + compatible = "starfive,jh7110-pcie-phy"; 54 + reg = <0x10210000 0x10000>; 55 + #phy-cells = <0>; 56 + starfive,sys-syscon = <&sys_syscon 0x18>; 57 + starfive,stg-syscon = <&stg_syscon 0x148 0x1f4>; 58 + };
+50
Documentation/devicetree/bindings/phy/starfive,jh7110-usb-phy.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/phy/starfive,jh7110-usb-phy.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: StarFive JH7110 USB 2.0 PHY 8 + 9 + maintainers: 10 + - Minda Chen <minda.chen@starfivetech.com> 11 + 12 + properties: 13 + compatible: 14 + const: starfive,jh7110-usb-phy 15 + 16 + reg: 17 + maxItems: 1 18 + 19 + "#phy-cells": 20 + const: 0 21 + 22 + clocks: 23 + items: 24 + - description: PHY 125m 25 + - description: app 125m 26 + 27 + clock-names: 28 + items: 29 + - const: 125m 30 + - const: app_125m 31 + 32 + required: 33 + - compatible 34 + - reg 35 + - clocks 36 + - clock-names 37 + - "#phy-cells" 38 + 39 + additionalProperties: false 40 + 41 + examples: 42 + - | 43 + phy@10200000 { 44 + compatible = "starfive,jh7110-usb-phy"; 45 + reg = <0x10200000 0x10000>; 46 + clocks = <&syscrg 95>, 47 + <&stgcrg 6>; 48 + clock-names = "125m", "app_125m"; 49 + #phy-cells = <0>; 50 + };
+15
MAINTAINERS
··· 20419 20419 F: Documentation/devicetree/bindings/net/starfive,jh7110-dwmac.yaml 20420 20420 F: drivers/net/ethernet/stmicro/stmmac/dwmac-starfive.c 20421 20421 20422 + STARFIVE JH7110 DPHY RX DRIVER 20423 + M: Jack Zhu <jack.zhu@starfivetech.com> 20424 + M: Changhuang Liang <changhuang.liang@starfivetech.com> 20425 + S: Supported 20426 + F: Documentation/devicetree/bindings/phy/starfive,jh7110-dphy-rx.yaml 20427 + F: drivers/phy/starfive/phy-jh7110-dphy-rx.c 20428 + 20422 20429 STARFIVE JH7110 MMC/SD/SDIO DRIVER 20423 20430 M: William Qiu <william.qiu@starfivetech.com> 20424 20431 S: Supported ··· 20508 20501 S: Supported 20509 20502 F: Documentation/devicetree/bindings/watchdog/starfive* 20510 20503 F: drivers/watchdog/starfive-wdt.c 20504 + 20505 + STARFIVE JH71X0 PCIE AND USB PHY DRIVER 20506 + M: Minda Chen <minda.chen@starfivetech.com> 20507 + S: Supported 20508 + F: Documentation/devicetree/bindings/phy/starfive,jh7110-pcie-phy.yaml 20509 + F: Documentation/devicetree/bindings/phy/starfive,jh7110-usb-phy.yaml 20510 + F: drivers/phy/starfive/phy-jh7110-pcie.c 20511 + F: drivers/phy/starfive/phy-jh7110-usb.c 20511 20512 20512 20513 STATIC BRANCH/CALL 20513 20514 M: Peter Zijlstra <peterz@infradead.org>
+1
drivers/phy/Kconfig
··· 93 93 source "drivers/phy/samsung/Kconfig" 94 94 source "drivers/phy/socionext/Kconfig" 95 95 source "drivers/phy/st/Kconfig" 96 + source "drivers/phy/starfive/Kconfig" 96 97 source "drivers/phy/sunplus/Kconfig" 97 98 source "drivers/phy/tegra/Kconfig" 98 99 source "drivers/phy/ti/Kconfig"
+1
drivers/phy/Makefile
··· 32 32 samsung/ \ 33 33 socionext/ \ 34 34 st/ \ 35 + starfive/ \ 35 36 sunplus/ \ 36 37 tegra/ \ 37 38 ti/ \
-2
drivers/phy/allwinner/phy-sun4i-usb.c
··· 23 23 #include <linux/module.h> 24 24 #include <linux/mutex.h> 25 25 #include <linux/of.h> 26 - #include <linux/of_address.h> 27 - #include <linux/of_device.h> 28 26 #include <linux/of_gpio.h> 29 27 #include <linux/phy/phy.h> 30 28 #include <linux/phy/phy-sun4i-usb.h>
+1
drivers/phy/allwinner/phy-sun50i-usb3.c
··· 16 16 #include <linux/clk.h> 17 17 #include <linux/err.h> 18 18 #include <linux/io.h> 19 + #include <linux/mod_devicetable.h> 19 20 #include <linux/module.h> 20 21 #include <linux/phy/phy.h> 21 22 #include <linux/platform_device.h>
+1 -1
drivers/phy/amlogic/phy-meson-axg-mipi-dphy.c
··· 13 13 #include <linux/clk.h> 14 14 #include <linux/delay.h> 15 15 #include <linux/io.h> 16 + #include <linux/mod_devicetable.h> 16 17 #include <linux/module.h> 17 - #include <linux/of_device.h> 18 18 #include <linux/regmap.h> 19 19 #include <linux/reset.h> 20 20 #include <linux/phy/phy.h>
+1
drivers/phy/amlogic/phy-meson-axg-mipi-pcie-analog.c
··· 11 11 #include <linux/regmap.h> 12 12 #include <linux/delay.h> 13 13 #include <linux/mfd/syscon.h> 14 + #include <linux/of.h> 14 15 #include <linux/platform_device.h> 15 16 #include <dt-bindings/phy/phy.h> 16 17
+1
drivers/phy/amlogic/phy-meson-axg-pcie.c
··· 4 4 * 5 5 * Copyright (C) 2020 Remi Pommarel <repk@triplefau.lt> 6 6 */ 7 + #include <linux/mod_devicetable.h> 7 8 #include <linux/module.h> 8 9 #include <linux/phy/phy.h> 9 10 #include <linux/regmap.h>
+1
drivers/phy/amlogic/phy-meson-g12a-mipi-dphy-analog.c
··· 13 13 #include <linux/regmap.h> 14 14 #include <linux/delay.h> 15 15 #include <linux/mfd/syscon.h> 16 + #include <linux/of.h> 16 17 #include <linux/platform_device.h> 17 18 #include <dt-bindings/phy/phy.h> 18 19
+2 -2
drivers/phy/amlogic/phy-meson-g12a-usb2.c
··· 14 14 #include <linux/delay.h> 15 15 #include <linux/io.h> 16 16 #include <linux/module.h> 17 - #include <linux/of_device.h> 17 + #include <linux/of.h> 18 18 #include <linux/regmap.h> 19 19 #include <linux/reset.h> 20 20 #include <linux/phy/phy.h> ··· 319 319 if (IS_ERR(base)) 320 320 return PTR_ERR(base); 321 321 322 - priv->soc_id = (enum meson_soc_id)of_device_get_match_data(&pdev->dev); 322 + priv->soc_id = (uintptr_t)of_device_get_match_data(&pdev->dev); 323 323 324 324 priv->regmap = devm_regmap_init_mmio(dev, base, 325 325 &phy_meson_g12a_usb2_regmap_conf);
+1 -1
drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c
··· 11 11 #include <linux/bitops.h> 12 12 #include <linux/clk.h> 13 13 #include <linux/module.h> 14 - #include <linux/of_device.h> 14 + #include <linux/of.h> 15 15 #include <linux/phy/phy.h> 16 16 #include <linux/regmap.h> 17 17 #include <linux/reset.h>
+1 -1
drivers/phy/amlogic/phy-meson-gxl-usb2.c
··· 8 8 #include <linux/clk.h> 9 9 #include <linux/delay.h> 10 10 #include <linux/io.h> 11 + #include <linux/mod_devicetable.h> 11 12 #include <linux/module.h> 12 - #include <linux/of_device.h> 13 13 #include <linux/regmap.h> 14 14 #include <linux/reset.h> 15 15 #include <linux/phy/phy.h>
+1 -1
drivers/phy/amlogic/phy-meson8-hdmi-tx.c
··· 10 10 #include <linux/clk.h> 11 11 #include <linux/mfd/syscon.h> 12 12 #include <linux/module.h> 13 - #include <linux/of_device.h> 13 + #include <linux/of.h> 14 14 #include <linux/phy/phy.h> 15 15 #include <linux/platform_device.h> 16 16 #include <linux/property.h>
+1 -1
drivers/phy/amlogic/phy-meson8b-usb2.c
··· 8 8 #include <linux/clk.h> 9 9 #include <linux/delay.h> 10 10 #include <linux/io.h> 11 + #include <linux/mod_devicetable.h> 11 12 #include <linux/module.h> 12 - #include <linux/of_device.h> 13 13 #include <linux/property.h> 14 14 #include <linux/regmap.h> 15 15 #include <linux/reset.h>
+1 -1
drivers/phy/broadcom/phy-bcm-ns-usb3.c
··· 206 206 of_id = of_match_device(bcm_ns_usb3_id_table, dev); 207 207 if (!of_id) 208 208 return -EINVAL; 209 - usb3->family = (enum bcm_ns_family)of_id->data; 209 + usb3->family = (uintptr_t)of_id->data; 210 210 211 211 syscon_np = of_parse_phandle(dev->of_node, "usb3-dmp-syscon", 0); 212 212 err = of_address_to_resource(syscon_np, 0, &res);
+1 -1
drivers/phy/broadcom/phy-bcm-sr-usb.c
··· 311 311 312 312 of_id = of_match_node(bcm_usb_phy_of_match, dn); 313 313 if (of_id) 314 - version = (enum bcm_usb_phy_version)of_id->data; 314 + version = (uintptr_t)of_id->data; 315 315 else 316 316 return -ENODEV; 317 317
+1
drivers/phy/broadcom/phy-bcm63xx-usbh.c
··· 17 17 #include <linux/clk.h> 18 18 #include <linux/io.h> 19 19 #include <linux/module.h> 20 + #include <linux/of.h> 20 21 #include <linux/phy/phy.h> 21 22 #include <linux/platform_device.h> 22 23 #include <linux/reset.h>
+1 -1
drivers/phy/broadcom/phy-brcm-sata.c
··· 772 772 773 773 of_id = of_match_node(brcm_sata_phy_of_match, dn); 774 774 if (of_id) 775 - priv->version = (enum brcm_sata_phy_version)of_id->data; 775 + priv->version = (uintptr_t)of_id->data; 776 776 else 777 777 priv->version = BRCM_SATA_PHY_STB_28NM; 778 778
-1
drivers/phy/broadcom/phy-brcm-usb.c
··· 11 11 #include <linux/io.h> 12 12 #include <linux/module.h> 13 13 #include <linux/of.h> 14 - #include <linux/of_device.h> 15 14 #include <linux/phy/phy.h> 16 15 #include <linux/platform_device.h> 17 16 #include <linux/interrupt.h>
+1
drivers/phy/cadence/cdns-dphy-rx.c
··· 7 7 #include <linux/bitops.h> 8 8 #include <linux/io.h> 9 9 #include <linux/iopoll.h> 10 + #include <linux/mod_devicetable.h> 10 11 #include <linux/module.h> 11 12 #include <linux/phy/phy.h> 12 13 #include <linux/phy/phy-mipi-dphy.h>
+1 -2
drivers/phy/cadence/cdns-dphy.c
··· 9 9 #include <linux/io.h> 10 10 #include <linux/iopoll.h> 11 11 #include <linux/module.h> 12 - #include <linux/of_address.h> 13 - #include <linux/of_device.h> 12 + #include <linux/of.h> 14 13 #include <linux/platform_device.h> 15 14 #include <linux/reset.h> 16 15
+98
drivers/phy/cadence/phy-cadence-sierra.c
··· 30 30 #define SIERRA_COMMON_CDB_OFFSET 0x0 31 31 #define SIERRA_MACRO_ID_REG 0x0 32 32 #define SIERRA_CMN_PLLLC_GEN_PREG 0x42 33 + #define SIERRA_CMN_PLLLC_FBDIV_INT_MODE0_PREG 0x43 34 + #define SIERRA_CMN_PLLLC_DCOCAL_CTRL_PREG 0x45 35 + #define SIERRA_CMN_PLLLC_INIT_PREG 0x46 36 + #define SIERRA_CMN_PLLLC_ITERTMR_PREG 0x47 33 37 #define SIERRA_CMN_PLLLC_MODE_PREG 0x48 34 38 #define SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG 0x49 35 39 #define SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG 0x4A 36 40 #define SIERRA_CMN_PLLLC_LOCK_CNTSTART_PREG 0x4B 41 + #define SIERRA_CMN_PLLLC_LOCKSEARCH_PREG 0x4C 37 42 #define SIERRA_CMN_PLLLC_CLK1_PREG 0x4D 43 + #define SIERRA_CMN_PLLLC_CLK0_PREG 0x4E 38 44 #define SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG 0x4F 39 45 #define SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG 0x50 40 46 #define SIERRA_CMN_PLLLC_DSMCORR_PREG 0x51 41 47 #define SIERRA_CMN_PLLLC_SS_PREG 0x52 42 48 #define SIERRA_CMN_PLLLC_SS_AMP_STEP_SIZE_PREG 0x53 43 49 #define SIERRA_CMN_PLLLC_SSTWOPT_PREG 0x54 50 + #define SIERRA_CMN_PLLCSM_PLLEN_TMR_PREG 0x5D 51 + #define SIERRA_CMN_PLLCSM_PLLPRE_TMR_PREG 0x5E 44 52 #define SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG 0x62 45 53 #define SIERRA_CMN_PLLLC_LOCK_DELAY_CTRL_PREG 0x63 54 + #define SIERRA_SDOSCCAL_CLK_CNT_PREG 0x6E 46 55 #define SIERRA_CMN_REFRCV_PREG 0x98 56 + #define SIERRA_CMN_RESCAL_CTRLA_PREG 0xA0 47 57 #define SIERRA_CMN_REFRCV1_PREG 0xB8 48 58 #define SIERRA_CMN_PLLLC1_GEN_PREG 0xC2 49 59 #define SIERRA_CMN_PLLLC1_FBDIV_INT_PREG 0xC3 60 + #define SIERRA_CMN_PLLLC1_DCOCAL_CTRL_PREG 0xC5 50 61 #define SIERRA_CMN_PLLLC1_LF_COEFF_MODE0_PREG 0xCA 51 62 #define SIERRA_CMN_PLLLC1_CLK0_PREG 0xCE 52 63 #define SIERRA_CMN_PLLLC1_BWCAL_MODE0_PREG 0xD0 ··· 97 86 #define SIERRA_DFE_BIASTRIM_PREG 0x04C 98 87 #define SIERRA_DRVCTRL_ATTEN_PREG 0x06A 99 88 #define SIERRA_DRVCTRL_BOOST_PREG 0x06F 89 + #define SIERRA_LANE_TX_RECEIVER_DETECT_PREG 0x071 100 90 #define SIERRA_TX_RCVDET_OVRD_PREG 0x072 101 91 #define SIERRA_CLKPATHCTRL_TMR_PREG 0x081 102 92 #define SIERRA_RX_CREQ_FLTR_A_MODE3_PREG 0x085 ··· 113 101 #define SIERRA_CREQ_SPARE_PREG 0x096 114 102 #define SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG 0x097 115 103 #define SIERRA_CTLELUT_CTRL_PREG 0x098 104 + #define SIERRA_DEQ_BLK_TAU_CTRL1_PREG 0x0AC 105 + #define SIERRA_DEQ_BLK_TAU_CTRL4_PREG 0x0AF 116 106 #define SIERRA_DFE_ECMP_RATESEL_PREG 0x0C0 117 107 #define SIERRA_DFE_SMP_RATESEL_PREG 0x0C1 118 108 #define SIERRA_DEQ_PHALIGN_CTRL 0x0C4 ··· 143 129 #define SIERRA_DEQ_GLUT14 0x0F6 144 130 #define SIERRA_DEQ_GLUT15 0x0F7 145 131 #define SIERRA_DEQ_GLUT16 0x0F8 132 + #define SIERRA_POSTPRECUR_EN_CEPH_CTRL_PREG 0x0F9 133 + #define SIERRA_TAU_EN_CEPH2TO0_PREG 0x0FB 134 + #define SIERRA_TAU_EN_CEPH5TO3_PREG 0x0FC 146 135 #define SIERRA_DEQ_ALUT0 0x108 147 136 #define SIERRA_DEQ_ALUT1 0x109 148 137 #define SIERRA_DEQ_ALUT2 0x10A ··· 160 143 #define SIERRA_DEQ_ALUT11 0x113 161 144 #define SIERRA_DEQ_ALUT12 0x114 162 145 #define SIERRA_DEQ_ALUT13 0x115 146 + #define SIERRA_OEPH_EN_CTRL_PREG 0x124 163 147 #define SIERRA_DEQ_DFETAP_CTRL_PREG 0x128 164 148 #define SIERRA_DEQ_DFETAP0 0x129 165 149 #define SIERRA_DEQ_DFETAP1 0x12B ··· 175 157 #define SIERRA_DEQ_TAU_CTRL2_PREG 0x151 176 158 #define SIERRA_DEQ_TAU_CTRL3_PREG 0x152 177 159 #define SIERRA_DEQ_OPENEYE_CTRL_PREG 0x158 160 + #define SIERRA_DEQ_CONCUR_EPIOFFSET_MODE_PREG 0x159 178 161 #define SIERRA_DEQ_PICTRL_PREG 0x161 179 162 #define SIERRA_CPICAL_TMRVAL_MODE1_PREG 0x170 180 163 #define SIERRA_CPICAL_TMRVAL_MODE0_PREG 0x171 ··· 184 165 #define SIERRA_CPI_RESBIAS_BIN_PREG 0x17E 185 166 #define SIERRA_CPI_TRIM_PREG 0x17F 186 167 #define SIERRA_CPICAL_RES_STARTCODE_MODE23_PREG 0x183 168 + #define SIERRA_CPICAL_RES_STARTCODE_MODE01_PREG 0x184 187 169 #define SIERRA_EPI_CTRL_PREG 0x187 188 170 #define SIERRA_LFPSDET_SUPPORT_PREG 0x188 189 171 #define SIERRA_LFPSFILT_NS_PREG 0x18A ··· 196 176 #define SIERRA_RXBUFFER_CTLECTRL_PREG 0x19E 197 177 #define SIERRA_RXBUFFER_RCDFECTRL_PREG 0x19F 198 178 #define SIERRA_RXBUFFER_DFECTRL_PREG 0x1A0 179 + #define SIERRA_LN_SPARE_REG_PREG 0x1B0 199 180 #define SIERRA_DEQ_TAU_CTRL1_FAST_MAINT_PREG 0x14F 200 181 #define SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG 0x150 201 182 ··· 2423 2402 .num_regs = ARRAY_SIZE(cdns_usb_ln_regs_ext_ssc), 2424 2403 }; 2425 2404 2405 + /* SGMII PHY common configuration */ 2406 + static const struct cdns_reg_pairs sgmii_pma_cmn_vals[] = { 2407 + {0x0180, SIERRA_SDOSCCAL_CLK_CNT_PREG}, 2408 + {0x6000, SIERRA_CMN_REFRCV_PREG}, 2409 + {0x0031, SIERRA_CMN_RESCAL_CTRLA_PREG}, 2410 + {0x001C, SIERRA_CMN_PLLLC_FBDIV_INT_MODE0_PREG}, 2411 + {0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG}, 2412 + {0x0000, SIERRA_CMN_PLLLC_LOCKSEARCH_PREG}, 2413 + {0x8103, SIERRA_CMN_PLLLC_CLK0_PREG}, 2414 + {0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG}, 2415 + {0x0027, SIERRA_CMN_PLLCSM_PLLEN_TMR_PREG}, 2416 + {0x0062, SIERRA_CMN_PLLCSM_PLLPRE_TMR_PREG}, 2417 + {0x0800, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG}, 2418 + {0x0000, SIERRA_CMN_PLLLC_INIT_PREG}, 2419 + {0x0000, SIERRA_CMN_PLLLC_ITERTMR_PREG}, 2420 + {0x0020, SIERRA_CMN_PLLLC_LOCK_CNTSTART_PREG}, 2421 + {0x0013, SIERRA_CMN_PLLLC_DCOCAL_CTRL_PREG}, 2422 + {0x0013, SIERRA_CMN_PLLLC1_DCOCAL_CTRL_PREG}, 2423 + }; 2424 + 2425 + static struct cdns_sierra_vals sgmii_cmn_vals = { 2426 + .reg_pairs = sgmii_pma_cmn_vals, 2427 + .num_regs = ARRAY_SIZE(sgmii_pma_cmn_vals), 2428 + }; 2429 + 2430 + /* SGMII PHY lane configuration */ 2431 + static const struct cdns_reg_pairs sgmii_ln_regs[] = { 2432 + {0x691E, SIERRA_DET_STANDEC_D_PREG}, 2433 + {0x0FFE, SIERRA_PSC_RX_A0_PREG}, 2434 + {0x0104, SIERRA_PLLCTRL_FBDIV_MODE01_PREG}, 2435 + {0x0013, SIERRA_PLLCTRL_SUBRATE_PREG}, 2436 + {0x0106, SIERRA_PLLCTRL_GEN_D_PREG}, 2437 + {0x5234, SIERRA_PLLCTRL_CPGAIN_MODE_PREG}, 2438 + {0x0000, SIERRA_DRVCTRL_ATTEN_PREG}, 2439 + {0x00AB, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, 2440 + {0x3C0E, SIERRA_CREQ_CCLKDET_MODE01_PREG}, 2441 + {0x3220, SIERRA_CREQ_FSMCLK_SEL_PREG}, 2442 + {0x0000, SIERRA_CREQ_EQ_CTRL_PREG}, 2443 + {0x6320, SIERRA_DEQ_CONCUR_EPIOFFSET_MODE_PREG}, 2444 + {0x0000, SIERRA_CPI_OUTBUF_RATESEL_PREG}, 2445 + {0x15A2, SIERRA_LN_SPARE_REG_PREG}, 2446 + {0x7900, SIERRA_DEQ_BLK_TAU_CTRL1_PREG}, 2447 + {0x2202, SIERRA_DEQ_BLK_TAU_CTRL4_PREG}, 2448 + {0x2206, SIERRA_DEQ_TAU_CTRL2_PREG}, 2449 + {0x0005, SIERRA_LANE_TX_RECEIVER_DETECT_PREG}, 2450 + {0x8001, SIERRA_CREQ_SPARE_PREG}, 2451 + {0x0000, SIERRA_DEQ_CONCUR_CTRL1_PREG}, 2452 + {0xD004, SIERRA_DEQ_CONCUR_CTRL2_PREG}, 2453 + {0x0101, SIERRA_DEQ_GLUT9}, 2454 + {0x0101, SIERRA_DEQ_GLUT10}, 2455 + {0x0101, SIERRA_DEQ_GLUT11}, 2456 + {0x0101, SIERRA_DEQ_GLUT12}, 2457 + {0x0000, SIERRA_DEQ_GLUT13}, 2458 + {0x0000, SIERRA_DEQ_GLUT16}, 2459 + {0x0000, SIERRA_POSTPRECUR_EN_CEPH_CTRL_PREG}, 2460 + {0x0000, SIERRA_TAU_EN_CEPH2TO0_PREG}, 2461 + {0x0003, SIERRA_TAU_EN_CEPH5TO3_PREG}, 2462 + {0x0101, SIERRA_DEQ_ALUT8}, 2463 + {0x0101, SIERRA_DEQ_ALUT9}, 2464 + {0x0100, SIERRA_DEQ_ALUT10}, 2465 + {0x0000, SIERRA_OEPH_EN_CTRL_PREG}, 2466 + {0x5425, SIERRA_DEQ_OPENEYE_CTRL_PREG}, 2467 + {0x7458, SIERRA_CPICAL_RES_STARTCODE_MODE23_PREG}, 2468 + {0x321F, SIERRA_CPICAL_RES_STARTCODE_MODE01_PREG}, 2469 + }; 2470 + 2471 + static struct cdns_sierra_vals sgmii_pma_ln_vals = { 2472 + .reg_pairs = sgmii_ln_regs, 2473 + .num_regs = ARRAY_SIZE(sgmii_ln_regs), 2474 + }; 2475 + 2426 2476 static const struct cdns_sierra_data cdns_map_sierra = { 2427 2477 .id_value = SIERRA_MACRO_ID, 2428 2478 .block_offset_shift = 0x2, ··· 2541 2449 }, 2542 2450 }, 2543 2451 [TYPE_SGMII] = { 2452 + [TYPE_NONE] = { 2453 + [NO_SSC] = &sgmii_cmn_vals, 2454 + }, 2544 2455 [TYPE_PCIE] = { 2545 2456 [NO_SSC] = &sgmii_100_no_ssc_plllc1_opt3_cmn_vals, 2546 2457 [EXTERNAL_SSC] = &sgmii_100_no_ssc_plllc1_opt3_cmn_vals, ··· 2582 2487 }, 2583 2488 }, 2584 2489 [TYPE_SGMII] = { 2490 + [TYPE_NONE] = { 2491 + [NO_SSC] = &sgmii_pma_ln_vals, 2492 + }, 2585 2493 [TYPE_PCIE] = { 2586 2494 [NO_SSC] = &sgmii_100_no_ssc_plllc1_opt3_ln_vals, 2587 2495 [EXTERNAL_SSC] = &sgmii_100_no_ssc_plllc1_opt3_ln_vals,
+632 -1102
drivers/phy/cadence/phy-cadence-torrent.c
··· 17 17 #include <linux/kernel.h> 18 18 #include <linux/module.h> 19 19 #include <linux/of.h> 20 - #include <linux/of_address.h> 21 - #include <linux/of_device.h> 22 20 #include <linux/phy/phy.h> 23 21 #include <linux/platform_device.h> 24 22 #include <linux/reset.h> ··· 25 27 #define REF_CLK_19_2MHZ 19200000 26 28 #define REF_CLK_25MHZ 25000000 27 29 #define REF_CLK_100MHZ 100000000 30 + #define REF_CLK_156_25MHZ 156250000 28 31 29 32 #define MAX_NUM_LANES 4 30 33 #define DEFAULT_MAX_BIT_RATE 8100 /* in Mbps */ 31 - 32 - #define NUM_SSC_MODE 3 33 - #define NUM_REF_CLK 3 34 - #define NUM_PHY_TYPE 6 35 34 36 35 #define POLL_TIMEOUT_US 5000 37 36 #define PLL_LOCK_TIMEOUT 100000 ··· 101 106 #define CMN_PLL0_HIGH_THR_M0 0x0093U 102 107 #define CMN_PLL0_DSM_DIAG_M0 0x0094U 103 108 #define CMN_PLL0_DSM_FBH_OVRD_M0 0x0095U 109 + #define CMN_PLL0_DSM_FBL_OVRD_M0 0x0096U 104 110 #define CMN_PLL0_SS_CTRL1_M0 0x0098U 105 111 #define CMN_PLL0_SS_CTRL2_M0 0x0099U 106 112 #define CMN_PLL0_SS_CTRL3_M0 0x009AU ··· 192 196 #define RX_PSC_A2 0x0002U 193 197 #define RX_PSC_A3 0x0003U 194 198 #define RX_PSC_CAL 0x0006U 199 + #define RX_SDCAL0_INIT_TMR 0x0044U 200 + #define RX_SDCAL0_ITER_TMR 0x0045U 201 + #define RX_SDCAL1_INIT_TMR 0x004CU 202 + #define RX_SDCAL1_ITER_TMR 0x004DU 195 203 #define RX_CDRLF_CNFG 0x0080U 196 204 #define RX_CDRLF_CNFG3 0x0082U 197 205 #define RX_SIGDET_HL_FILT_TMR 0x0090U ··· 294 294 TYPE_SGMII, 295 295 TYPE_QSGMII, 296 296 TYPE_USB, 297 + TYPE_USXGMII, 297 298 }; 298 299 299 300 enum cdns_torrent_ref_clk { 300 301 CLK_19_2_MHZ, 301 302 CLK_25_MHZ, 302 - CLK_100_MHZ 303 + CLK_100_MHZ, 304 + CLK_156_25_MHZ, 305 + CLK_ANY, 303 306 }; 304 307 305 308 enum cdns_torrent_ssc_mode { 306 309 NO_SSC, 307 310 EXTERNAL_SSC, 308 - INTERNAL_SSC 311 + INTERNAL_SSC, 312 + ANY_SSC, 309 313 }; 314 + 315 + /* Unique key id for vals table entry 316 + * REFCLK0_RATE | REFCLK1_RATE | LINK0_TYPE | LINK1_TYPE | SSC_TYPE 317 + */ 318 + #define REFCLK0_SHIFT 12 319 + #define REFCLK0_MASK GENMASK(14, 12) 320 + #define REFCLK1_SHIFT 9 321 + #define REFCLK1_MASK GENMASK(11, 9) 322 + #define LINK0_SHIFT 6 323 + #define LINK0_MASK GENMASK(8, 6) 324 + #define LINK1_SHIFT 3 325 + #define LINK1_MASK GENMASK(5, 3) 326 + #define SSC_SHIFT 0 327 + #define SSC_MASK GENMASK(2, 0) 328 + 329 + #define CDNS_TORRENT_KEY(refclk0, refclk1, link0, link1, ssc) \ 330 + ((((refclk0) << REFCLK0_SHIFT) & REFCLK0_MASK) | \ 331 + (((refclk1) << REFCLK1_SHIFT) & REFCLK1_MASK) | \ 332 + (((link0) << LINK0_SHIFT) & LINK0_MASK) | \ 333 + (((link1) << LINK1_SHIFT) & LINK1_MASK) | \ 334 + (((ssc) << SSC_SHIFT) & SSC_MASK)) 335 + 336 + #define CDNS_TORRENT_KEY_ANYCLK(link0, link1) \ 337 + CDNS_TORRENT_KEY(CLK_ANY, CLK_ANY, \ 338 + (link0), (link1), ANY_SSC) 310 339 311 340 struct cdns_torrent_inst { 312 341 struct phy *phy; ··· 423 394 u32 num_regs; 424 395 }; 425 396 397 + struct cdns_torrent_vals_entry { 398 + u32 key; 399 + struct cdns_torrent_vals *vals; 400 + }; 401 + 402 + struct cdns_torrent_vals_table { 403 + struct cdns_torrent_vals_entry *entries; 404 + u32 num_entries; 405 + }; 406 + 426 407 struct cdns_torrent_data { 427 408 u8 block_offset_shift; 428 409 u8 reg_offset_shift; 429 - struct cdns_torrent_vals *link_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE] 430 - [NUM_SSC_MODE]; 431 - struct cdns_torrent_vals *xcvr_diag_vals[NUM_PHY_TYPE][NUM_PHY_TYPE] 432 - [NUM_SSC_MODE]; 433 - struct cdns_torrent_vals *pcs_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE] 434 - [NUM_SSC_MODE]; 435 - struct cdns_torrent_vals *cmn_vals[NUM_REF_CLK][NUM_PHY_TYPE] 436 - [NUM_PHY_TYPE][NUM_SSC_MODE]; 437 - struct cdns_torrent_vals *tx_ln_vals[NUM_REF_CLK][NUM_PHY_TYPE] 438 - [NUM_PHY_TYPE][NUM_SSC_MODE]; 439 - struct cdns_torrent_vals *rx_ln_vals[NUM_REF_CLK][NUM_PHY_TYPE] 440 - [NUM_PHY_TYPE][NUM_SSC_MODE]; 410 + struct cdns_torrent_vals_table link_cmn_vals_tbl; 411 + struct cdns_torrent_vals_table xcvr_diag_vals_tbl; 412 + struct cdns_torrent_vals_table pcs_cmn_vals_tbl; 413 + struct cdns_torrent_vals_table phy_pma_cmn_vals_tbl; 414 + struct cdns_torrent_vals_table cmn_vals_tbl; 415 + struct cdns_torrent_vals_table tx_ln_vals_tbl; 416 + struct cdns_torrent_vals_table rx_ln_vals_tbl; 441 417 }; 442 418 443 419 struct cdns_regmap_cdb_context { ··· 450 416 void __iomem *base; 451 417 u8 reg_offset_shift; 452 418 }; 419 + 420 + static struct cdns_torrent_vals *cdns_torrent_get_tbl_vals(const struct cdns_torrent_vals_table *tbl, 421 + enum cdns_torrent_ref_clk refclk0, 422 + enum cdns_torrent_ref_clk refclk1, 423 + enum cdns_torrent_phy_type link0, 424 + enum cdns_torrent_phy_type link1, 425 + enum cdns_torrent_ssc_mode ssc) 426 + { 427 + int i; 428 + u32 key = CDNS_TORRENT_KEY(refclk0, refclk1, link0, link1, ssc); 429 + 430 + for (i = 0; i < tbl->num_entries; i++) { 431 + if (tbl->entries[i].key == key) 432 + return tbl->entries[i].vals; 433 + } 434 + 435 + return NULL; 436 + } 453 437 454 438 static int cdns_regmap_write(void *context, unsigned int reg, unsigned int val) 455 439 { ··· 696 644 return "QSGMII"; 697 645 case TYPE_USB: 698 646 return "USB"; 647 + case TYPE_USXGMII: 648 + return "USXGMII"; 699 649 default: 700 650 return "None"; 701 651 } ··· 2298 2244 struct cdns_torrent_inst *inst = phy_get_drvdata(phy); 2299 2245 enum cdns_torrent_phy_type phy_type = inst->phy_type; 2300 2246 enum cdns_torrent_ssc_mode ssc = inst->ssc_mode; 2247 + struct cdns_torrent_vals *phy_pma_cmn_vals; 2301 2248 struct cdns_torrent_vals *pcs_cmn_vals; 2302 2249 struct cdns_reg_pairs *reg_pairs; 2303 2250 struct regmap *regmap; ··· 2313 2258 2314 2259 /** 2315 2260 * Spread spectrum generation is not required or supported 2316 - * for SGMII/QSGMII 2261 + * for SGMII/QSGMII/USXGMII 2317 2262 */ 2318 - if (phy_type == TYPE_SGMII || phy_type == TYPE_QSGMII) 2263 + if (phy_type == TYPE_SGMII || phy_type == TYPE_QSGMII || phy_type == TYPE_USXGMII) 2319 2264 ssc = NO_SSC; 2320 2265 2321 2266 /* PHY configuration specific registers for single link */ 2322 - link_cmn_vals = init_data->link_cmn_vals[phy_type][TYPE_NONE][ssc]; 2267 + link_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->link_cmn_vals_tbl, 2268 + CLK_ANY, CLK_ANY, 2269 + phy_type, TYPE_NONE, 2270 + ANY_SSC); 2323 2271 if (link_cmn_vals) { 2324 2272 reg_pairs = link_cmn_vals->reg_pairs; 2325 2273 num_regs = link_cmn_vals->num_regs; ··· 2339 2281 reg_pairs[i].val); 2340 2282 } 2341 2283 2342 - xcvr_diag_vals = init_data->xcvr_diag_vals[phy_type][TYPE_NONE][ssc]; 2284 + xcvr_diag_vals = cdns_torrent_get_tbl_vals(&init_data->xcvr_diag_vals_tbl, 2285 + CLK_ANY, CLK_ANY, 2286 + phy_type, TYPE_NONE, 2287 + ANY_SSC); 2343 2288 if (xcvr_diag_vals) { 2344 2289 reg_pairs = xcvr_diag_vals->reg_pairs; 2345 2290 num_regs = xcvr_diag_vals->num_regs; ··· 2355 2294 } 2356 2295 2357 2296 /* PHY PCS common registers configurations */ 2358 - pcs_cmn_vals = init_data->pcs_cmn_vals[phy_type][TYPE_NONE][ssc]; 2297 + pcs_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->pcs_cmn_vals_tbl, 2298 + CLK_ANY, CLK_ANY, 2299 + phy_type, TYPE_NONE, 2300 + ANY_SSC); 2359 2301 if (pcs_cmn_vals) { 2360 2302 reg_pairs = pcs_cmn_vals->reg_pairs; 2361 2303 num_regs = pcs_cmn_vals->num_regs; ··· 2368 2304 reg_pairs[i].val); 2369 2305 } 2370 2306 2307 + /* PHY PMA common registers configurations */ 2308 + phy_pma_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->phy_pma_cmn_vals_tbl, 2309 + CLK_ANY, CLK_ANY, 2310 + phy_type, TYPE_NONE, 2311 + ANY_SSC); 2312 + if (phy_pma_cmn_vals) { 2313 + reg_pairs = phy_pma_cmn_vals->reg_pairs; 2314 + num_regs = phy_pma_cmn_vals->num_regs; 2315 + regmap = cdns_phy->regmap_phy_pma_common_cdb; 2316 + for (i = 0; i < num_regs; i++) 2317 + regmap_write(regmap, reg_pairs[i].off, 2318 + reg_pairs[i].val); 2319 + } 2320 + 2371 2321 /* PMA common registers configurations */ 2372 - cmn_vals = init_data->cmn_vals[ref_clk][phy_type][TYPE_NONE][ssc]; 2322 + cmn_vals = cdns_torrent_get_tbl_vals(&init_data->cmn_vals_tbl, 2323 + ref_clk, ref_clk, 2324 + phy_type, TYPE_NONE, 2325 + ssc); 2373 2326 if (cmn_vals) { 2374 2327 reg_pairs = cmn_vals->reg_pairs; 2375 2328 num_regs = cmn_vals->num_regs; ··· 2397 2316 } 2398 2317 2399 2318 /* PMA TX lane registers configurations */ 2400 - tx_ln_vals = init_data->tx_ln_vals[ref_clk][phy_type][TYPE_NONE][ssc]; 2319 + tx_ln_vals = cdns_torrent_get_tbl_vals(&init_data->tx_ln_vals_tbl, 2320 + ref_clk, ref_clk, 2321 + phy_type, TYPE_NONE, 2322 + ssc); 2401 2323 if (tx_ln_vals) { 2402 2324 reg_pairs = tx_ln_vals->reg_pairs; 2403 2325 num_regs = tx_ln_vals->num_regs; ··· 2413 2329 } 2414 2330 2415 2331 /* PMA RX lane registers configurations */ 2416 - rx_ln_vals = init_data->rx_ln_vals[ref_clk][phy_type][TYPE_NONE][ssc]; 2332 + rx_ln_vals = cdns_torrent_get_tbl_vals(&init_data->rx_ln_vals_tbl, 2333 + ref_clk, ref_clk, 2334 + phy_type, TYPE_NONE, 2335 + ssc); 2417 2336 if (rx_ln_vals) { 2418 2337 reg_pairs = rx_ln_vals->reg_pairs; 2419 2338 num_regs = rx_ln_vals->num_regs; ··· 2505 2418 * being configured, but these can be different for particular 2506 2419 * PHY type and are per lane. 2507 2420 */ 2508 - link_cmn_vals = init_data->link_cmn_vals[phy_t1][phy_t2][ssc]; 2421 + link_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->link_cmn_vals_tbl, 2422 + CLK_ANY, CLK_ANY, 2423 + phy_t1, phy_t2, ANY_SSC); 2509 2424 if (link_cmn_vals) { 2510 2425 reg_pairs = link_cmn_vals->reg_pairs; 2511 2426 num_regs = link_cmn_vals->num_regs; ··· 2525 2436 reg_pairs[i].val); 2526 2437 } 2527 2438 2528 - xcvr_diag_vals = init_data->xcvr_diag_vals[phy_t1][phy_t2][ssc]; 2439 + xcvr_diag_vals = cdns_torrent_get_tbl_vals(&init_data->xcvr_diag_vals_tbl, 2440 + CLK_ANY, CLK_ANY, 2441 + phy_t1, phy_t2, ANY_SSC); 2529 2442 if (xcvr_diag_vals) { 2530 2443 reg_pairs = xcvr_diag_vals->reg_pairs; 2531 2444 num_regs = xcvr_diag_vals->num_regs; ··· 2540 2449 } 2541 2450 2542 2451 /* PHY PCS common registers configurations */ 2543 - pcs_cmn_vals = init_data->pcs_cmn_vals[phy_t1][phy_t2][ssc]; 2452 + pcs_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->pcs_cmn_vals_tbl, 2453 + CLK_ANY, CLK_ANY, 2454 + phy_t1, phy_t2, ANY_SSC); 2544 2455 if (pcs_cmn_vals) { 2545 2456 reg_pairs = pcs_cmn_vals->reg_pairs; 2546 2457 num_regs = pcs_cmn_vals->num_regs; ··· 2553 2460 } 2554 2461 2555 2462 /* PMA common registers configurations */ 2556 - cmn_vals = init_data->cmn_vals[ref_clk][phy_t1][phy_t2][ssc]; 2463 + cmn_vals = cdns_torrent_get_tbl_vals(&init_data->cmn_vals_tbl, 2464 + ref_clk, ref_clk, 2465 + phy_t1, phy_t2, ssc); 2557 2466 if (cmn_vals) { 2558 2467 reg_pairs = cmn_vals->reg_pairs; 2559 2468 num_regs = cmn_vals->num_regs; ··· 2566 2471 } 2567 2472 2568 2473 /* PMA TX lane registers configurations */ 2569 - tx_ln_vals = init_data->tx_ln_vals[ref_clk][phy_t1][phy_t2][ssc]; 2474 + tx_ln_vals = cdns_torrent_get_tbl_vals(&init_data->tx_ln_vals_tbl, 2475 + ref_clk, ref_clk, 2476 + phy_t1, phy_t2, ssc); 2570 2477 if (tx_ln_vals) { 2571 2478 reg_pairs = tx_ln_vals->reg_pairs; 2572 2479 num_regs = tx_ln_vals->num_regs; ··· 2581 2484 } 2582 2485 2583 2486 /* PMA RX lane registers configurations */ 2584 - rx_ln_vals = init_data->rx_ln_vals[ref_clk][phy_t1][phy_t2][ssc]; 2487 + rx_ln_vals = cdns_torrent_get_tbl_vals(&init_data->rx_ln_vals_tbl, 2488 + ref_clk, ref_clk, 2489 + phy_t1, phy_t2, ssc); 2585 2490 if (rx_ln_vals) { 2586 2491 reg_pairs = rx_ln_vals->reg_pairs; 2587 2492 num_regs = rx_ln_vals->num_regs; ··· 2716 2617 case REF_CLK_100MHZ: 2717 2618 cdns_phy->ref_clk_rate = CLK_100_MHZ; 2718 2619 break; 2620 + case REF_CLK_156_25MHZ: 2621 + cdns_phy->ref_clk_rate = CLK_156_25_MHZ; 2622 + break; 2719 2623 default: 2720 2624 dev_err(cdns_phy->dev, "Invalid Ref Clock Rate\n"); 2721 2625 clk_disable_unprepare(cdns_phy->clk); ··· 2837 2735 break; 2838 2736 case PHY_TYPE_USB3: 2839 2737 cdns_phy->phys[node].phy_type = TYPE_USB; 2738 + break; 2739 + case PHY_TYPE_USXGMII: 2740 + cdns_phy->phys[node].phy_type = TYPE_USXGMII; 2840 2741 break; 2841 2742 default: 2842 2743 dev_err(dev, "Unsupported protocol\n"); ··· 3032 2927 static struct cdns_torrent_vals dp_usb_xcvr_diag_ln_vals = { 3033 2928 .reg_pairs = dp_usb_xcvr_diag_ln_regs, 3034 2929 .num_regs = ARRAY_SIZE(dp_usb_xcvr_diag_ln_regs), 2930 + }; 2931 + 2932 + /* TI USXGMII configuration: Enable cmn_refclk_rcv_out_en */ 2933 + static struct cdns_reg_pairs ti_usxgmii_phy_pma_cmn_regs[] = { 2934 + {0x0040, PHY_PMA_CMN_CTRL1}, 2935 + }; 2936 + 2937 + static struct cdns_torrent_vals ti_usxgmii_phy_pma_cmn_vals = { 2938 + .reg_pairs = ti_usxgmii_phy_pma_cmn_regs, 2939 + .num_regs = ARRAY_SIZE(ti_usxgmii_phy_pma_cmn_regs), 2940 + }; 2941 + 2942 + /* Single USXGMII link configuration */ 2943 + static struct cdns_reg_pairs sl_usxgmii_link_cmn_regs[] = { 2944 + {0x0000, PHY_PLL_CFG}, 2945 + {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M0} 2946 + }; 2947 + 2948 + static struct cdns_reg_pairs sl_usxgmii_xcvr_diag_ln_regs[] = { 2949 + {0x0000, XCVR_DIAG_HSCLK_SEL}, 2950 + {0x0001, XCVR_DIAG_HSCLK_DIV}, 2951 + {0x0001, XCVR_DIAG_PLLDRC_CTRL} 2952 + }; 2953 + 2954 + static struct cdns_torrent_vals sl_usxgmii_link_cmn_vals = { 2955 + .reg_pairs = sl_usxgmii_link_cmn_regs, 2956 + .num_regs = ARRAY_SIZE(sl_usxgmii_link_cmn_regs), 2957 + }; 2958 + 2959 + static struct cdns_torrent_vals sl_usxgmii_xcvr_diag_ln_vals = { 2960 + .reg_pairs = sl_usxgmii_xcvr_diag_ln_regs, 2961 + .num_regs = ARRAY_SIZE(sl_usxgmii_xcvr_diag_ln_regs), 2962 + }; 2963 + 2964 + /* Single link USXGMII, 156.25 MHz Ref clk, no SSC */ 2965 + static struct cdns_reg_pairs sl_usxgmii_156_25_no_ssc_cmn_regs[] = { 2966 + {0x0014, CMN_SSM_BIAS_TMR}, 2967 + {0x0028, CMN_PLLSM0_PLLPRE_TMR}, 2968 + {0x00A4, CMN_PLLSM0_PLLLOCK_TMR}, 2969 + {0x0028, CMN_PLLSM1_PLLPRE_TMR}, 2970 + {0x00A4, CMN_PLLSM1_PLLLOCK_TMR}, 2971 + {0x0062, CMN_BGCAL_INIT_TMR}, 2972 + {0x0062, CMN_BGCAL_ITER_TMR}, 2973 + {0x0014, CMN_IBCAL_INIT_TMR}, 2974 + {0x0018, CMN_TXPUCAL_INIT_TMR}, 2975 + {0x0005, CMN_TXPUCAL_ITER_TMR}, 2976 + {0x0018, CMN_TXPDCAL_INIT_TMR}, 2977 + {0x0005, CMN_TXPDCAL_ITER_TMR}, 2978 + {0x024A, CMN_RXCAL_INIT_TMR}, 2979 + {0x0005, CMN_RXCAL_ITER_TMR}, 2980 + {0x000B, CMN_SD_CAL_REFTIM_START}, 2981 + {0x0132, CMN_SD_CAL_PLLCNT_START}, 2982 + {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0}, 2983 + {0x0014, CMN_PLL0_DSM_FBH_OVRD_M0}, 2984 + {0x0014, CMN_PLL1_DSM_FBH_OVRD_M0}, 2985 + {0x0005, CMN_PLL0_DSM_FBL_OVRD_M0}, 2986 + {0x0005, CMN_PLL1_DSM_FBL_OVRD_M0}, 2987 + {0x061B, CMN_PLL0_VCOCAL_INIT_TMR}, 2988 + {0x061B, CMN_PLL1_VCOCAL_INIT_TMR}, 2989 + {0x0019, CMN_PLL0_VCOCAL_ITER_TMR}, 2990 + {0x0019, CMN_PLL1_VCOCAL_ITER_TMR}, 2991 + {0x1354, CMN_PLL0_VCOCAL_REFTIM_START}, 2992 + {0x1354, CMN_PLL1_VCOCAL_REFTIM_START}, 2993 + {0x1354, CMN_PLL0_VCOCAL_PLLCNT_START}, 2994 + {0x1354, CMN_PLL1_VCOCAL_PLLCNT_START}, 2995 + {0x0003, CMN_PLL0_VCOCAL_TCTRL}, 2996 + {0x0003, CMN_PLL1_VCOCAL_TCTRL}, 2997 + {0x0138, CMN_PLL0_LOCK_REFCNT_START}, 2998 + {0x0138, CMN_PLL1_LOCK_REFCNT_START}, 2999 + {0x0138, CMN_PLL0_LOCK_PLLCNT_START}, 3000 + {0x0138, CMN_PLL1_LOCK_PLLCNT_START} 3001 + }; 3002 + 3003 + static struct cdns_reg_pairs usxgmii_156_25_no_ssc_tx_ln_regs[] = { 3004 + {0x07A2, TX_RCVDET_ST_TMR}, 3005 + {0x00F3, TX_PSC_A0}, 3006 + {0x04A2, TX_PSC_A2}, 3007 + {0x04A2, TX_PSC_A3}, 3008 + {0x0000, TX_TXCC_CPOST_MULT_00}, 3009 + {0x0000, XCVR_DIAG_PSC_OVRD} 3010 + }; 3011 + 3012 + static struct cdns_reg_pairs usxgmii_156_25_no_ssc_rx_ln_regs[] = { 3013 + {0x0014, RX_SDCAL0_INIT_TMR}, 3014 + {0x0062, RX_SDCAL0_ITER_TMR}, 3015 + {0x0014, RX_SDCAL1_INIT_TMR}, 3016 + {0x0062, RX_SDCAL1_ITER_TMR}, 3017 + {0x091D, RX_PSC_A0}, 3018 + {0x0900, RX_PSC_A2}, 3019 + {0x0100, RX_PSC_A3}, 3020 + {0x0030, RX_REE_SMGM_CTRL1}, 3021 + {0x03C7, RX_REE_GCSM1_EQENM_PH1}, 3022 + {0x01C7, RX_REE_GCSM1_EQENM_PH2}, 3023 + {0x0000, RX_DIAG_DFE_CTRL}, 3024 + {0x0019, RX_REE_TAP1_CLIP}, 3025 + {0x0019, RX_REE_TAP2TON_CLIP}, 3026 + {0x00B9, RX_DIAG_NQST_CTRL}, 3027 + {0x0C21, RX_DIAG_DFE_AMP_TUNE_2}, 3028 + {0x0002, RX_DIAG_DFE_AMP_TUNE_3}, 3029 + {0x0033, RX_DIAG_PI_RATE}, 3030 + {0x0001, RX_DIAG_ACYA}, 3031 + {0x018C, RX_CDRLF_CNFG} 3032 + }; 3033 + 3034 + static struct cdns_torrent_vals sl_usxgmii_156_25_no_ssc_cmn_vals = { 3035 + .reg_pairs = sl_usxgmii_156_25_no_ssc_cmn_regs, 3036 + .num_regs = ARRAY_SIZE(sl_usxgmii_156_25_no_ssc_cmn_regs), 3037 + }; 3038 + 3039 + static struct cdns_torrent_vals usxgmii_156_25_no_ssc_tx_ln_vals = { 3040 + .reg_pairs = usxgmii_156_25_no_ssc_tx_ln_regs, 3041 + .num_regs = ARRAY_SIZE(usxgmii_156_25_no_ssc_tx_ln_regs), 3042 + }; 3043 + 3044 + static struct cdns_torrent_vals usxgmii_156_25_no_ssc_rx_ln_vals = { 3045 + .reg_pairs = usxgmii_156_25_no_ssc_rx_ln_regs, 3046 + .num_regs = ARRAY_SIZE(usxgmii_156_25_no_ssc_rx_ln_regs), 3035 3047 }; 3036 3048 3037 3049 /* PCIe and DP link configuration */ ··· 4156 3934 .num_regs = ARRAY_SIZE(pcie_100_ext_no_ssc_rx_ln_regs), 4157 3935 }; 4158 3936 3937 + static struct cdns_torrent_vals_entry link_cmn_vals_entries[] = { 3938 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_NONE), &sl_dp_link_cmn_vals}, 3939 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_PCIE), &pcie_dp_link_cmn_vals}, 3940 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_USB), &usb_dp_link_cmn_vals}, 3941 + 3942 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_NONE), NULL}, 3943 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_SGMII), &pcie_sgmii_link_cmn_vals}, 3944 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_QSGMII), &pcie_sgmii_link_cmn_vals}, 3945 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_USB), &pcie_usb_link_cmn_vals}, 3946 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_DP), &pcie_dp_link_cmn_vals}, 3947 + 3948 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_NONE), &sl_sgmii_link_cmn_vals}, 3949 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_PCIE), &pcie_sgmii_link_cmn_vals}, 3950 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_USB), &usb_sgmii_link_cmn_vals}, 3951 + 3952 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_NONE), &sl_sgmii_link_cmn_vals}, 3953 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_PCIE), &pcie_sgmii_link_cmn_vals}, 3954 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_USB), &usb_sgmii_link_cmn_vals}, 3955 + 3956 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_NONE), &sl_usb_link_cmn_vals}, 3957 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_PCIE), &pcie_usb_link_cmn_vals}, 3958 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_SGMII), &usb_sgmii_link_cmn_vals}, 3959 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_QSGMII), &usb_sgmii_link_cmn_vals}, 3960 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_DP), &usb_dp_link_cmn_vals}, 3961 + 3962 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_NONE), &sl_usxgmii_link_cmn_vals}, 3963 + }; 3964 + 3965 + static struct cdns_torrent_vals_entry xcvr_diag_vals_entries[] = { 3966 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_NONE), &sl_dp_xcvr_diag_ln_vals}, 3967 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_PCIE), &dp_pcie_xcvr_diag_ln_vals}, 3968 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_USB), &dp_usb_xcvr_diag_ln_vals}, 3969 + 3970 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_NONE), NULL}, 3971 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_SGMII), &pcie_sgmii_xcvr_diag_ln_vals}, 3972 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_QSGMII), &pcie_sgmii_xcvr_diag_ln_vals}, 3973 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_USB), &pcie_usb_xcvr_diag_ln_vals}, 3974 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_DP), &pcie_dp_xcvr_diag_ln_vals}, 3975 + 3976 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_NONE), &sl_sgmii_xcvr_diag_ln_vals}, 3977 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_PCIE), &sgmii_pcie_xcvr_diag_ln_vals}, 3978 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_USB), &sgmii_usb_xcvr_diag_ln_vals}, 3979 + 3980 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_NONE), &sl_sgmii_xcvr_diag_ln_vals}, 3981 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_PCIE), &sgmii_pcie_xcvr_diag_ln_vals}, 3982 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_USB), &sgmii_usb_xcvr_diag_ln_vals}, 3983 + 3984 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_NONE), &sl_usb_xcvr_diag_ln_vals}, 3985 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_PCIE), &usb_pcie_xcvr_diag_ln_vals}, 3986 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_SGMII), &usb_sgmii_xcvr_diag_ln_vals}, 3987 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_QSGMII), &usb_sgmii_xcvr_diag_ln_vals}, 3988 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_DP), &usb_dp_xcvr_diag_ln_vals}, 3989 + 3990 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_NONE), &sl_usxgmii_xcvr_diag_ln_vals}, 3991 + }; 3992 + 3993 + static struct cdns_torrent_vals_entry pcs_cmn_vals_entries[] = { 3994 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_NONE), &usb_phy_pcs_cmn_vals}, 3995 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_PCIE), &usb_phy_pcs_cmn_vals}, 3996 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_SGMII), &usb_phy_pcs_cmn_vals}, 3997 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_QSGMII), &usb_phy_pcs_cmn_vals}, 3998 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_DP), &usb_phy_pcs_cmn_vals}, 3999 + }; 4000 + 4001 + static struct cdns_torrent_vals_entry cmn_vals_entries[] = { 4002 + {CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_cmn_vals}, 4003 + {CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_cmn_vals}, 4004 + 4005 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_cmn_vals}, 4006 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_cmn_vals}, 4007 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &sl_dp_100_no_ssc_cmn_vals}, 4008 + 4009 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), NULL}, 4010 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), NULL}, 4011 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), &sl_pcie_100_int_ssc_cmn_vals}, 4012 + 4013 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), &pcie_100_no_ssc_cmn_vals}, 4014 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals}, 4015 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals}, 4016 + 4017 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), &pcie_100_no_ssc_cmn_vals}, 4018 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals}, 4019 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals}, 4020 + 4021 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), &pcie_100_no_ssc_cmn_vals}, 4022 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals}, 4023 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals}, 4024 + 4025 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), NULL}, 4026 + 4027 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &sl_sgmii_100_no_ssc_cmn_vals}, 4028 + 4029 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &sgmii_100_no_ssc_cmn_vals}, 4030 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals}, 4031 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &sgmii_100_int_ssc_cmn_vals}, 4032 + 4033 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &sgmii_100_no_ssc_cmn_vals}, 4034 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals}, 4035 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals}, 4036 + 4037 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &sl_qsgmii_100_no_ssc_cmn_vals}, 4038 + 4039 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &qsgmii_100_no_ssc_cmn_vals}, 4040 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals}, 4041 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &qsgmii_100_int_ssc_cmn_vals}, 4042 + 4043 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &qsgmii_100_no_ssc_cmn_vals}, 4044 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals}, 4045 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals}, 4046 + 4047 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &sl_usb_100_no_ssc_cmn_vals}, 4048 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals}, 4049 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals}, 4050 + 4051 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_cmn_vals}, 4052 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_cmn_vals}, 4053 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_int_ssc_cmn_vals}, 4054 + 4055 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &sl_usb_100_no_ssc_cmn_vals}, 4056 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals}, 4057 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals}, 4058 + 4059 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &sl_usb_100_no_ssc_cmn_vals}, 4060 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals}, 4061 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals}, 4062 + 4063 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_cmn_vals}, 4064 + 4065 + {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &sl_usxgmii_156_25_no_ssc_cmn_vals}, 4066 + }; 4067 + 4068 + static struct cdns_torrent_vals_entry cdns_tx_ln_vals_entries[] = { 4069 + {CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_tx_ln_vals}, 4070 + {CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_tx_ln_vals}, 4071 + 4072 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_tx_ln_vals}, 4073 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_tx_ln_vals}, 4074 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &dp_100_no_ssc_tx_ln_vals}, 4075 + 4076 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), NULL}, 4077 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), NULL}, 4078 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), NULL}, 4079 + 4080 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), NULL}, 4081 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), NULL}, 4082 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), NULL}, 4083 + 4084 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), NULL}, 4085 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), NULL}, 4086 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), NULL}, 4087 + 4088 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), NULL}, 4089 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), NULL}, 4090 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), NULL}, 4091 + 4092 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), NULL}, 4093 + 4094 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &sgmii_100_no_ssc_tx_ln_vals}, 4095 + 4096 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &sgmii_100_no_ssc_tx_ln_vals}, 4097 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &sgmii_100_no_ssc_tx_ln_vals}, 4098 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &sgmii_100_no_ssc_tx_ln_vals}, 4099 + 4100 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &sgmii_100_no_ssc_tx_ln_vals}, 4101 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &sgmii_100_no_ssc_tx_ln_vals}, 4102 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &sgmii_100_no_ssc_tx_ln_vals}, 4103 + 4104 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &qsgmii_100_no_ssc_tx_ln_vals}, 4105 + 4106 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &qsgmii_100_no_ssc_tx_ln_vals}, 4107 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &qsgmii_100_no_ssc_tx_ln_vals}, 4108 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &qsgmii_100_no_ssc_tx_ln_vals}, 4109 + 4110 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &qsgmii_100_no_ssc_tx_ln_vals}, 4111 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &qsgmii_100_no_ssc_tx_ln_vals}, 4112 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &qsgmii_100_no_ssc_tx_ln_vals}, 4113 + 4114 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &usb_100_no_ssc_tx_ln_vals}, 4115 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4116 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4117 + 4118 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_tx_ln_vals}, 4119 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4120 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4121 + 4122 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals}, 4123 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4124 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4125 + 4126 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals}, 4127 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4128 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4129 + 4130 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_tx_ln_vals}, 4131 + 4132 + {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &usxgmii_156_25_no_ssc_tx_ln_vals}, 4133 + }; 4134 + 4135 + static struct cdns_torrent_vals_entry cdns_rx_ln_vals_entries[] = { 4136 + {CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_rx_ln_vals}, 4137 + {CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_rx_ln_vals}, 4138 + 4139 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_rx_ln_vals}, 4140 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_rx_ln_vals}, 4141 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &dp_100_no_ssc_rx_ln_vals}, 4142 + 4143 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), &pcie_100_no_ssc_rx_ln_vals}, 4144 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals}, 4145 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals}, 4146 + 4147 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals}, 4148 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals}, 4149 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals}, 4150 + 4151 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals}, 4152 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals}, 4153 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals}, 4154 + 4155 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), &pcie_100_no_ssc_rx_ln_vals}, 4156 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals}, 4157 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals}, 4158 + 4159 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), &pcie_100_no_ssc_rx_ln_vals}, 4160 + 4161 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals}, 4162 + 4163 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals}, 4164 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals}, 4165 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals}, 4166 + 4167 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals}, 4168 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals}, 4169 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals}, 4170 + 4171 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals}, 4172 + 4173 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals}, 4174 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals}, 4175 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals}, 4176 + 4177 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals}, 4178 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals}, 4179 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals}, 4180 + 4181 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &usb_100_no_ssc_rx_ln_vals}, 4182 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals}, 4183 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals}, 4184 + 4185 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_rx_ln_vals}, 4186 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals}, 4187 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals}, 4188 + 4189 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &usb_100_no_ssc_rx_ln_vals}, 4190 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals}, 4191 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals}, 4192 + 4193 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &usb_100_no_ssc_rx_ln_vals}, 4194 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals}, 4195 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals}, 4196 + 4197 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_rx_ln_vals}, 4198 + 4199 + {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &usxgmii_156_25_no_ssc_rx_ln_vals}, 4200 + }; 4201 + 4159 4202 static const struct cdns_torrent_data cdns_map_torrent = { 4160 4203 .block_offset_shift = 0x2, 4161 4204 .reg_offset_shift = 0x2, 4162 - .link_cmn_vals = { 4163 - [TYPE_DP] = { 4164 - [TYPE_NONE] = { 4165 - [NO_SSC] = &sl_dp_link_cmn_vals, 4166 - }, 4167 - [TYPE_PCIE] = { 4168 - [NO_SSC] = &pcie_dp_link_cmn_vals, 4169 - }, 4170 - [TYPE_USB] = { 4171 - [NO_SSC] = &usb_dp_link_cmn_vals, 4172 - }, 4173 - }, 4174 - [TYPE_PCIE] = { 4175 - [TYPE_NONE] = { 4176 - [NO_SSC] = NULL, 4177 - [EXTERNAL_SSC] = NULL, 4178 - [INTERNAL_SSC] = NULL, 4179 - }, 4180 - [TYPE_SGMII] = { 4181 - [NO_SSC] = &pcie_sgmii_link_cmn_vals, 4182 - [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4183 - [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4184 - }, 4185 - [TYPE_QSGMII] = { 4186 - [NO_SSC] = &pcie_sgmii_link_cmn_vals, 4187 - [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4188 - [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4189 - }, 4190 - [TYPE_USB] = { 4191 - [NO_SSC] = &pcie_usb_link_cmn_vals, 4192 - [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4193 - [INTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4194 - }, 4195 - [TYPE_DP] = { 4196 - [NO_SSC] = &pcie_dp_link_cmn_vals, 4197 - }, 4198 - }, 4199 - [TYPE_SGMII] = { 4200 - [TYPE_NONE] = { 4201 - [NO_SSC] = &sl_sgmii_link_cmn_vals, 4202 - }, 4203 - [TYPE_PCIE] = { 4204 - [NO_SSC] = &pcie_sgmii_link_cmn_vals, 4205 - [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4206 - [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4207 - }, 4208 - [TYPE_USB] = { 4209 - [NO_SSC] = &usb_sgmii_link_cmn_vals, 4210 - [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4211 - [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4212 - }, 4213 - }, 4214 - [TYPE_QSGMII] = { 4215 - [TYPE_NONE] = { 4216 - [NO_SSC] = &sl_sgmii_link_cmn_vals, 4217 - }, 4218 - [TYPE_PCIE] = { 4219 - [NO_SSC] = &pcie_sgmii_link_cmn_vals, 4220 - [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4221 - [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4222 - }, 4223 - [TYPE_USB] = { 4224 - [NO_SSC] = &usb_sgmii_link_cmn_vals, 4225 - [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4226 - [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4227 - }, 4228 - }, 4229 - [TYPE_USB] = { 4230 - [TYPE_NONE] = { 4231 - [NO_SSC] = &sl_usb_link_cmn_vals, 4232 - [EXTERNAL_SSC] = &sl_usb_link_cmn_vals, 4233 - [INTERNAL_SSC] = &sl_usb_link_cmn_vals, 4234 - }, 4235 - [TYPE_PCIE] = { 4236 - [NO_SSC] = &pcie_usb_link_cmn_vals, 4237 - [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4238 - [INTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4239 - }, 4240 - [TYPE_SGMII] = { 4241 - [NO_SSC] = &usb_sgmii_link_cmn_vals, 4242 - [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4243 - [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4244 - }, 4245 - [TYPE_QSGMII] = { 4246 - [NO_SSC] = &usb_sgmii_link_cmn_vals, 4247 - [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4248 - [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4249 - }, 4250 - [TYPE_DP] = { 4251 - [NO_SSC] = &usb_dp_link_cmn_vals, 4252 - }, 4253 - }, 4205 + .link_cmn_vals_tbl = { 4206 + .entries = link_cmn_vals_entries, 4207 + .num_entries = ARRAY_SIZE(link_cmn_vals_entries), 4254 4208 }, 4255 - .xcvr_diag_vals = { 4256 - [TYPE_DP] = { 4257 - [TYPE_NONE] = { 4258 - [NO_SSC] = &sl_dp_xcvr_diag_ln_vals, 4259 - }, 4260 - [TYPE_PCIE] = { 4261 - [NO_SSC] = &dp_pcie_xcvr_diag_ln_vals, 4262 - }, 4263 - [TYPE_USB] = { 4264 - [NO_SSC] = &dp_usb_xcvr_diag_ln_vals, 4265 - }, 4266 - }, 4267 - [TYPE_PCIE] = { 4268 - [TYPE_NONE] = { 4269 - [NO_SSC] = NULL, 4270 - [EXTERNAL_SSC] = NULL, 4271 - [INTERNAL_SSC] = NULL, 4272 - }, 4273 - [TYPE_SGMII] = { 4274 - [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4275 - [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4276 - [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4277 - }, 4278 - [TYPE_QSGMII] = { 4279 - [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4280 - [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4281 - [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4282 - }, 4283 - [TYPE_USB] = { 4284 - [NO_SSC] = &pcie_usb_xcvr_diag_ln_vals, 4285 - [EXTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals, 4286 - [INTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals, 4287 - }, 4288 - [TYPE_DP] = { 4289 - [NO_SSC] = &pcie_dp_xcvr_diag_ln_vals, 4290 - }, 4291 - }, 4292 - [TYPE_SGMII] = { 4293 - [TYPE_NONE] = { 4294 - [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals, 4295 - }, 4296 - [TYPE_PCIE] = { 4297 - [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4298 - [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4299 - [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4300 - }, 4301 - [TYPE_USB] = { 4302 - [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4303 - [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4304 - [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4305 - }, 4306 - }, 4307 - [TYPE_QSGMII] = { 4308 - [TYPE_NONE] = { 4309 - [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals, 4310 - }, 4311 - [TYPE_PCIE] = { 4312 - [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4313 - [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4314 - [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4315 - }, 4316 - [TYPE_USB] = { 4317 - [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4318 - [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4319 - [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4320 - }, 4321 - }, 4322 - [TYPE_USB] = { 4323 - [TYPE_NONE] = { 4324 - [NO_SSC] = &sl_usb_xcvr_diag_ln_vals, 4325 - [EXTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals, 4326 - [INTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals, 4327 - }, 4328 - [TYPE_PCIE] = { 4329 - [NO_SSC] = &usb_pcie_xcvr_diag_ln_vals, 4330 - [EXTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals, 4331 - [INTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals, 4332 - }, 4333 - [TYPE_SGMII] = { 4334 - [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4335 - [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4336 - [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4337 - }, 4338 - [TYPE_QSGMII] = { 4339 - [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4340 - [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4341 - [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4342 - }, 4343 - [TYPE_DP] = { 4344 - [NO_SSC] = &usb_dp_xcvr_diag_ln_vals, 4345 - }, 4346 - }, 4209 + .xcvr_diag_vals_tbl = { 4210 + .entries = xcvr_diag_vals_entries, 4211 + .num_entries = ARRAY_SIZE(xcvr_diag_vals_entries), 4347 4212 }, 4348 - .pcs_cmn_vals = { 4349 - [TYPE_USB] = { 4350 - [TYPE_NONE] = { 4351 - [NO_SSC] = &usb_phy_pcs_cmn_vals, 4352 - [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4353 - [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4354 - }, 4355 - [TYPE_PCIE] = { 4356 - [NO_SSC] = &usb_phy_pcs_cmn_vals, 4357 - [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4358 - [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4359 - }, 4360 - [TYPE_SGMII] = { 4361 - [NO_SSC] = &usb_phy_pcs_cmn_vals, 4362 - [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4363 - [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4364 - }, 4365 - [TYPE_QSGMII] = { 4366 - [NO_SSC] = &usb_phy_pcs_cmn_vals, 4367 - [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4368 - [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4369 - }, 4370 - [TYPE_DP] = { 4371 - [NO_SSC] = &usb_phy_pcs_cmn_vals, 4372 - }, 4373 - }, 4213 + .pcs_cmn_vals_tbl = { 4214 + .entries = pcs_cmn_vals_entries, 4215 + .num_entries = ARRAY_SIZE(pcs_cmn_vals_entries), 4374 4216 }, 4375 - .cmn_vals = { 4376 - [CLK_19_2_MHZ] = { 4377 - [TYPE_DP] = { 4378 - [TYPE_NONE] = { 4379 - [NO_SSC] = &sl_dp_19_2_no_ssc_cmn_vals, 4380 - }, 4381 - }, 4382 - }, 4383 - [CLK_25_MHZ] = { 4384 - [TYPE_DP] = { 4385 - [TYPE_NONE] = { 4386 - [NO_SSC] = &sl_dp_25_no_ssc_cmn_vals, 4387 - }, 4388 - }, 4389 - }, 4390 - [CLK_100_MHZ] = { 4391 - [TYPE_DP] = { 4392 - [TYPE_NONE] = { 4393 - [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals, 4394 - }, 4395 - [TYPE_PCIE] = { 4396 - [NO_SSC] = &dp_100_no_ssc_cmn_vals, 4397 - }, 4398 - [TYPE_USB] = { 4399 - [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals, 4400 - }, 4401 - }, 4402 - [TYPE_PCIE] = { 4403 - [TYPE_NONE] = { 4404 - [NO_SSC] = NULL, 4405 - [EXTERNAL_SSC] = NULL, 4406 - [INTERNAL_SSC] = &sl_pcie_100_int_ssc_cmn_vals, 4407 - }, 4408 - [TYPE_SGMII] = { 4409 - [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 4410 - [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals, 4411 - [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 4412 - }, 4413 - [TYPE_QSGMII] = { 4414 - [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 4415 - [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals, 4416 - [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 4417 - }, 4418 - [TYPE_USB] = { 4419 - [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 4420 - [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals, 4421 - [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 4422 - }, 4423 - [TYPE_DP] = { 4424 - [NO_SSC] = NULL, 4425 - }, 4426 - }, 4427 - [TYPE_SGMII] = { 4428 - [TYPE_NONE] = { 4429 - [NO_SSC] = &sl_sgmii_100_no_ssc_cmn_vals, 4430 - }, 4431 - [TYPE_PCIE] = { 4432 - [NO_SSC] = &sgmii_100_no_ssc_cmn_vals, 4433 - [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals, 4434 - [INTERNAL_SSC] = &sgmii_100_int_ssc_cmn_vals, 4435 - }, 4436 - [TYPE_USB] = { 4437 - [NO_SSC] = &sgmii_100_no_ssc_cmn_vals, 4438 - [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals, 4439 - [INTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals, 4440 - }, 4441 - }, 4442 - [TYPE_QSGMII] = { 4443 - [TYPE_NONE] = { 4444 - [NO_SSC] = &sl_qsgmii_100_no_ssc_cmn_vals, 4445 - }, 4446 - [TYPE_PCIE] = { 4447 - [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4448 - [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4449 - [INTERNAL_SSC] = &qsgmii_100_int_ssc_cmn_vals, 4450 - }, 4451 - [TYPE_USB] = { 4452 - [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4453 - [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4454 - [INTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4455 - }, 4456 - }, 4457 - [TYPE_USB] = { 4458 - [TYPE_NONE] = { 4459 - [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4460 - [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4461 - [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals, 4462 - }, 4463 - [TYPE_PCIE] = { 4464 - [NO_SSC] = &usb_100_no_ssc_cmn_vals, 4465 - [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals, 4466 - [INTERNAL_SSC] = &usb_100_int_ssc_cmn_vals, 4467 - }, 4468 - [TYPE_SGMII] = { 4469 - [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4470 - [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4471 - [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals, 4472 - }, 4473 - [TYPE_QSGMII] = { 4474 - [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4475 - [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4476 - [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals, 4477 - }, 4478 - [TYPE_DP] = { 4479 - [NO_SSC] = &usb_100_no_ssc_cmn_vals, 4480 - }, 4481 - }, 4482 - }, 4217 + .cmn_vals_tbl = { 4218 + .entries = cmn_vals_entries, 4219 + .num_entries = ARRAY_SIZE(cmn_vals_entries), 4483 4220 }, 4484 - .tx_ln_vals = { 4485 - [CLK_19_2_MHZ] = { 4486 - [TYPE_DP] = { 4487 - [TYPE_NONE] = { 4488 - [NO_SSC] = &sl_dp_19_2_no_ssc_tx_ln_vals, 4489 - }, 4490 - }, 4491 - }, 4492 - [CLK_25_MHZ] = { 4493 - [TYPE_DP] = { 4494 - [TYPE_NONE] = { 4495 - [NO_SSC] = &sl_dp_25_no_ssc_tx_ln_vals, 4496 - }, 4497 - }, 4498 - }, 4499 - [CLK_100_MHZ] = { 4500 - [TYPE_DP] = { 4501 - [TYPE_NONE] = { 4502 - [NO_SSC] = &sl_dp_100_no_ssc_tx_ln_vals, 4503 - }, 4504 - [TYPE_PCIE] = { 4505 - [NO_SSC] = &dp_100_no_ssc_tx_ln_vals, 4506 - }, 4507 - [TYPE_USB] = { 4508 - [NO_SSC] = &dp_100_no_ssc_tx_ln_vals, 4509 - }, 4510 - }, 4511 - [TYPE_PCIE] = { 4512 - [TYPE_NONE] = { 4513 - [NO_SSC] = NULL, 4514 - [EXTERNAL_SSC] = NULL, 4515 - [INTERNAL_SSC] = NULL, 4516 - }, 4517 - [TYPE_SGMII] = { 4518 - [NO_SSC] = NULL, 4519 - [EXTERNAL_SSC] = NULL, 4520 - [INTERNAL_SSC] = NULL, 4521 - }, 4522 - [TYPE_QSGMII] = { 4523 - [NO_SSC] = NULL, 4524 - [EXTERNAL_SSC] = NULL, 4525 - [INTERNAL_SSC] = NULL, 4526 - }, 4527 - [TYPE_USB] = { 4528 - [NO_SSC] = NULL, 4529 - [EXTERNAL_SSC] = NULL, 4530 - [INTERNAL_SSC] = NULL, 4531 - }, 4532 - [TYPE_DP] = { 4533 - [NO_SSC] = NULL, 4534 - }, 4535 - }, 4536 - [TYPE_SGMII] = { 4537 - [TYPE_NONE] = { 4538 - [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4539 - }, 4540 - [TYPE_PCIE] = { 4541 - [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4542 - [EXTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4543 - [INTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4544 - }, 4545 - [TYPE_USB] = { 4546 - [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4547 - [EXTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4548 - [INTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4549 - }, 4550 - }, 4551 - [TYPE_QSGMII] = { 4552 - [TYPE_NONE] = { 4553 - [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4554 - }, 4555 - [TYPE_PCIE] = { 4556 - [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4557 - [EXTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4558 - [INTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4559 - }, 4560 - [TYPE_USB] = { 4561 - [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4562 - [EXTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4563 - [INTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4564 - }, 4565 - }, 4566 - [TYPE_USB] = { 4567 - [TYPE_NONE] = { 4568 - [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4569 - [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4570 - [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4571 - }, 4572 - [TYPE_PCIE] = { 4573 - [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4574 - [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4575 - [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4576 - }, 4577 - [TYPE_SGMII] = { 4578 - [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4579 - [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4580 - [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4581 - }, 4582 - [TYPE_QSGMII] = { 4583 - [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4584 - [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4585 - [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4586 - }, 4587 - [TYPE_DP] = { 4588 - [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4589 - }, 4590 - }, 4591 - }, 4221 + .tx_ln_vals_tbl = { 4222 + .entries = cdns_tx_ln_vals_entries, 4223 + .num_entries = ARRAY_SIZE(cdns_tx_ln_vals_entries), 4592 4224 }, 4593 - .rx_ln_vals = { 4594 - [CLK_19_2_MHZ] = { 4595 - [TYPE_DP] = { 4596 - [TYPE_NONE] = { 4597 - [NO_SSC] = &sl_dp_19_2_no_ssc_rx_ln_vals, 4598 - }, 4599 - }, 4600 - }, 4601 - [CLK_25_MHZ] = { 4602 - [TYPE_DP] = { 4603 - [TYPE_NONE] = { 4604 - [NO_SSC] = &sl_dp_25_no_ssc_rx_ln_vals, 4605 - }, 4606 - }, 4607 - }, 4608 - [CLK_100_MHZ] = { 4609 - [TYPE_DP] = { 4610 - [TYPE_NONE] = { 4611 - [NO_SSC] = &sl_dp_100_no_ssc_rx_ln_vals, 4612 - }, 4613 - [TYPE_PCIE] = { 4614 - [NO_SSC] = &dp_100_no_ssc_rx_ln_vals, 4615 - }, 4616 - [TYPE_USB] = { 4617 - [NO_SSC] = &dp_100_no_ssc_rx_ln_vals, 4618 - }, 4619 - }, 4620 - [TYPE_PCIE] = { 4621 - [TYPE_NONE] = { 4622 - [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4623 - [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4624 - [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4625 - }, 4626 - [TYPE_SGMII] = { 4627 - [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4628 - [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4629 - [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4630 - }, 4631 - [TYPE_QSGMII] = { 4632 - [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4633 - [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4634 - [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4635 - }, 4636 - [TYPE_USB] = { 4637 - [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4638 - [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4639 - [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4640 - }, 4641 - [TYPE_DP] = { 4642 - [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4643 - }, 4644 - }, 4645 - [TYPE_SGMII] = { 4646 - [TYPE_NONE] = { 4647 - [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4648 - }, 4649 - [TYPE_PCIE] = { 4650 - [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4651 - [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4652 - [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4653 - }, 4654 - [TYPE_USB] = { 4655 - [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4656 - [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4657 - [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4658 - }, 4659 - }, 4660 - [TYPE_QSGMII] = { 4661 - [TYPE_NONE] = { 4662 - [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4663 - }, 4664 - [TYPE_PCIE] = { 4665 - [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4666 - [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4667 - [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4668 - }, 4669 - [TYPE_USB] = { 4670 - [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4671 - [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4672 - [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4673 - }, 4674 - }, 4675 - [TYPE_USB] = { 4676 - [TYPE_NONE] = { 4677 - [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 4678 - [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4679 - [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4680 - }, 4681 - [TYPE_PCIE] = { 4682 - [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 4683 - [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4684 - [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4685 - }, 4686 - [TYPE_SGMII] = { 4687 - [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 4688 - [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4689 - [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4690 - }, 4691 - [TYPE_QSGMII] = { 4692 - [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 4693 - [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4694 - [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4695 - }, 4696 - [TYPE_DP] = { 4697 - [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 4698 - }, 4699 - }, 4700 - }, 4225 + .rx_ln_vals_tbl = { 4226 + .entries = cdns_rx_ln_vals_entries, 4227 + .num_entries = ARRAY_SIZE(cdns_rx_ln_vals_entries), 4701 4228 }, 4229 + }; 4230 + 4231 + static struct cdns_torrent_vals_entry j721e_phy_pma_cmn_vals_entries[] = { 4232 + {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_NONE), &ti_usxgmii_phy_pma_cmn_vals}, 4233 + }; 4234 + 4235 + static struct cdns_torrent_vals_entry ti_tx_ln_vals_entries[] = { 4236 + {CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_tx_ln_vals}, 4237 + {CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_tx_ln_vals}, 4238 + 4239 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_tx_ln_vals}, 4240 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_tx_ln_vals}, 4241 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &dp_100_no_ssc_tx_ln_vals}, 4242 + 4243 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), NULL}, 4244 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), NULL}, 4245 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), NULL}, 4246 + 4247 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), NULL}, 4248 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), NULL}, 4249 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), NULL}, 4250 + 4251 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), NULL}, 4252 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), NULL}, 4253 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), NULL}, 4254 + 4255 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), NULL}, 4256 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), NULL}, 4257 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), NULL}, 4258 + 4259 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), NULL}, 4260 + 4261 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals}, 4262 + 4263 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals}, 4264 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals}, 4265 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals}, 4266 + 4267 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals}, 4268 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals}, 4269 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals}, 4270 + 4271 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals}, 4272 + 4273 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals}, 4274 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals}, 4275 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals}, 4276 + 4277 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals}, 4278 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals}, 4279 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals}, 4280 + 4281 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &usb_100_no_ssc_tx_ln_vals}, 4282 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4283 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4284 + 4285 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_tx_ln_vals}, 4286 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4287 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4288 + 4289 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals}, 4290 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4291 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4292 + 4293 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals}, 4294 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4295 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals}, 4296 + 4297 + {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_tx_ln_vals}, 4298 + 4299 + {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &usxgmii_156_25_no_ssc_tx_ln_vals}, 4702 4300 }; 4703 4301 4704 4302 static const struct cdns_torrent_data ti_j721e_map_torrent = { 4705 4303 .block_offset_shift = 0x0, 4706 4304 .reg_offset_shift = 0x1, 4707 - .link_cmn_vals = { 4708 - [TYPE_DP] = { 4709 - [TYPE_NONE] = { 4710 - [NO_SSC] = &sl_dp_link_cmn_vals, 4711 - }, 4712 - [TYPE_PCIE] = { 4713 - [NO_SSC] = &pcie_dp_link_cmn_vals, 4714 - }, 4715 - [TYPE_USB] = { 4716 - [NO_SSC] = &usb_dp_link_cmn_vals, 4717 - }, 4718 - }, 4719 - [TYPE_PCIE] = { 4720 - [TYPE_NONE] = { 4721 - [NO_SSC] = NULL, 4722 - [EXTERNAL_SSC] = NULL, 4723 - [INTERNAL_SSC] = NULL, 4724 - }, 4725 - [TYPE_SGMII] = { 4726 - [NO_SSC] = &pcie_sgmii_link_cmn_vals, 4727 - [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4728 - [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4729 - }, 4730 - [TYPE_QSGMII] = { 4731 - [NO_SSC] = &pcie_sgmii_link_cmn_vals, 4732 - [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4733 - [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4734 - }, 4735 - [TYPE_USB] = { 4736 - [NO_SSC] = &pcie_usb_link_cmn_vals, 4737 - [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4738 - [INTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4739 - }, 4740 - [TYPE_DP] = { 4741 - [NO_SSC] = &pcie_dp_link_cmn_vals, 4742 - }, 4743 - }, 4744 - [TYPE_SGMII] = { 4745 - [TYPE_NONE] = { 4746 - [NO_SSC] = &sl_sgmii_link_cmn_vals, 4747 - }, 4748 - [TYPE_PCIE] = { 4749 - [NO_SSC] = &pcie_sgmii_link_cmn_vals, 4750 - [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4751 - [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4752 - }, 4753 - [TYPE_USB] = { 4754 - [NO_SSC] = &usb_sgmii_link_cmn_vals, 4755 - [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4756 - [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4757 - }, 4758 - }, 4759 - [TYPE_QSGMII] = { 4760 - [TYPE_NONE] = { 4761 - [NO_SSC] = &sl_sgmii_link_cmn_vals, 4762 - }, 4763 - [TYPE_PCIE] = { 4764 - [NO_SSC] = &pcie_sgmii_link_cmn_vals, 4765 - [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4766 - [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4767 - }, 4768 - [TYPE_USB] = { 4769 - [NO_SSC] = &usb_sgmii_link_cmn_vals, 4770 - [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4771 - [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4772 - }, 4773 - }, 4774 - [TYPE_USB] = { 4775 - [TYPE_NONE] = { 4776 - [NO_SSC] = &sl_usb_link_cmn_vals, 4777 - [EXTERNAL_SSC] = &sl_usb_link_cmn_vals, 4778 - [INTERNAL_SSC] = &sl_usb_link_cmn_vals, 4779 - }, 4780 - [TYPE_PCIE] = { 4781 - [NO_SSC] = &pcie_usb_link_cmn_vals, 4782 - [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4783 - [INTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4784 - }, 4785 - [TYPE_SGMII] = { 4786 - [NO_SSC] = &usb_sgmii_link_cmn_vals, 4787 - [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4788 - [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4789 - }, 4790 - [TYPE_QSGMII] = { 4791 - [NO_SSC] = &usb_sgmii_link_cmn_vals, 4792 - [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4793 - [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4794 - }, 4795 - [TYPE_DP] = { 4796 - [NO_SSC] = &usb_dp_link_cmn_vals, 4797 - }, 4798 - }, 4305 + .link_cmn_vals_tbl = { 4306 + .entries = link_cmn_vals_entries, 4307 + .num_entries = ARRAY_SIZE(link_cmn_vals_entries), 4799 4308 }, 4800 - .xcvr_diag_vals = { 4801 - [TYPE_DP] = { 4802 - [TYPE_NONE] = { 4803 - [NO_SSC] = &sl_dp_xcvr_diag_ln_vals, 4804 - }, 4805 - [TYPE_PCIE] = { 4806 - [NO_SSC] = &dp_pcie_xcvr_diag_ln_vals, 4807 - }, 4808 - [TYPE_USB] = { 4809 - [NO_SSC] = &dp_usb_xcvr_diag_ln_vals, 4810 - }, 4811 - }, 4812 - [TYPE_PCIE] = { 4813 - [TYPE_NONE] = { 4814 - [NO_SSC] = NULL, 4815 - [EXTERNAL_SSC] = NULL, 4816 - [INTERNAL_SSC] = NULL, 4817 - }, 4818 - [TYPE_SGMII] = { 4819 - [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4820 - [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4821 - [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4822 - }, 4823 - [TYPE_QSGMII] = { 4824 - [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4825 - [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4826 - [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4827 - }, 4828 - [TYPE_USB] = { 4829 - [NO_SSC] = &pcie_usb_xcvr_diag_ln_vals, 4830 - [EXTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals, 4831 - [INTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals, 4832 - }, 4833 - [TYPE_DP] = { 4834 - [NO_SSC] = &pcie_dp_xcvr_diag_ln_vals, 4835 - }, 4836 - }, 4837 - [TYPE_SGMII] = { 4838 - [TYPE_NONE] = { 4839 - [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals, 4840 - }, 4841 - [TYPE_PCIE] = { 4842 - [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4843 - [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4844 - [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4845 - }, 4846 - [TYPE_USB] = { 4847 - [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4848 - [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4849 - [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4850 - }, 4851 - }, 4852 - [TYPE_QSGMII] = { 4853 - [TYPE_NONE] = { 4854 - [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals, 4855 - }, 4856 - [TYPE_PCIE] = { 4857 - [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4858 - [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4859 - [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4860 - }, 4861 - [TYPE_USB] = { 4862 - [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4863 - [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4864 - [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4865 - }, 4866 - }, 4867 - [TYPE_USB] = { 4868 - [TYPE_NONE] = { 4869 - [NO_SSC] = &sl_usb_xcvr_diag_ln_vals, 4870 - [EXTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals, 4871 - [INTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals, 4872 - }, 4873 - [TYPE_PCIE] = { 4874 - [NO_SSC] = &usb_pcie_xcvr_diag_ln_vals, 4875 - [EXTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals, 4876 - [INTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals, 4877 - }, 4878 - [TYPE_SGMII] = { 4879 - [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4880 - [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4881 - [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4882 - }, 4883 - [TYPE_QSGMII] = { 4884 - [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4885 - [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4886 - [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4887 - }, 4888 - [TYPE_DP] = { 4889 - [NO_SSC] = &usb_dp_xcvr_diag_ln_vals, 4890 - }, 4891 - }, 4309 + .xcvr_diag_vals_tbl = { 4310 + .entries = xcvr_diag_vals_entries, 4311 + .num_entries = ARRAY_SIZE(xcvr_diag_vals_entries), 4892 4312 }, 4893 - .pcs_cmn_vals = { 4894 - [TYPE_USB] = { 4895 - [TYPE_NONE] = { 4896 - [NO_SSC] = &usb_phy_pcs_cmn_vals, 4897 - [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4898 - [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4899 - }, 4900 - [TYPE_PCIE] = { 4901 - [NO_SSC] = &usb_phy_pcs_cmn_vals, 4902 - [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4903 - [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4904 - }, 4905 - [TYPE_SGMII] = { 4906 - [NO_SSC] = &usb_phy_pcs_cmn_vals, 4907 - [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4908 - [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4909 - }, 4910 - [TYPE_QSGMII] = { 4911 - [NO_SSC] = &usb_phy_pcs_cmn_vals, 4912 - [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4913 - [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4914 - }, 4915 - [TYPE_DP] = { 4916 - [NO_SSC] = &usb_phy_pcs_cmn_vals, 4917 - }, 4918 - }, 4313 + .pcs_cmn_vals_tbl = { 4314 + .entries = pcs_cmn_vals_entries, 4315 + .num_entries = ARRAY_SIZE(pcs_cmn_vals_entries), 4919 4316 }, 4920 - .cmn_vals = { 4921 - [CLK_19_2_MHZ] = { 4922 - [TYPE_DP] = { 4923 - [TYPE_NONE] = { 4924 - [NO_SSC] = &sl_dp_19_2_no_ssc_cmn_vals, 4925 - }, 4926 - }, 4927 - }, 4928 - [CLK_25_MHZ] = { 4929 - [TYPE_DP] = { 4930 - [TYPE_NONE] = { 4931 - [NO_SSC] = &sl_dp_25_no_ssc_cmn_vals, 4932 - }, 4933 - }, 4934 - }, 4935 - [CLK_100_MHZ] = { 4936 - [TYPE_DP] = { 4937 - [TYPE_NONE] = { 4938 - [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals, 4939 - }, 4940 - [TYPE_PCIE] = { 4941 - [NO_SSC] = &dp_100_no_ssc_cmn_vals, 4942 - }, 4943 - [TYPE_USB] = { 4944 - [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals, 4945 - }, 4946 - }, 4947 - [TYPE_PCIE] = { 4948 - [TYPE_NONE] = { 4949 - [NO_SSC] = NULL, 4950 - [EXTERNAL_SSC] = NULL, 4951 - [INTERNAL_SSC] = &sl_pcie_100_int_ssc_cmn_vals, 4952 - }, 4953 - [TYPE_SGMII] = { 4954 - [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 4955 - [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals, 4956 - [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 4957 - }, 4958 - [TYPE_QSGMII] = { 4959 - [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 4960 - [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals, 4961 - [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 4962 - }, 4963 - [TYPE_USB] = { 4964 - [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 4965 - [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals, 4966 - [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 4967 - }, 4968 - [TYPE_DP] = { 4969 - [NO_SSC] = NULL, 4970 - }, 4971 - }, 4972 - [TYPE_SGMII] = { 4973 - [TYPE_NONE] = { 4974 - [NO_SSC] = &sl_sgmii_100_no_ssc_cmn_vals, 4975 - }, 4976 - [TYPE_PCIE] = { 4977 - [NO_SSC] = &sgmii_100_no_ssc_cmn_vals, 4978 - [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals, 4979 - [INTERNAL_SSC] = &sgmii_100_int_ssc_cmn_vals, 4980 - }, 4981 - [TYPE_USB] = { 4982 - [NO_SSC] = &sgmii_100_no_ssc_cmn_vals, 4983 - [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals, 4984 - [INTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals, 4985 - }, 4986 - }, 4987 - [TYPE_QSGMII] = { 4988 - [TYPE_NONE] = { 4989 - [NO_SSC] = &sl_qsgmii_100_no_ssc_cmn_vals, 4990 - }, 4991 - [TYPE_PCIE] = { 4992 - [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4993 - [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4994 - [INTERNAL_SSC] = &qsgmii_100_int_ssc_cmn_vals, 4995 - }, 4996 - [TYPE_USB] = { 4997 - [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4998 - [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4999 - [INTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals, 5000 - }, 5001 - }, 5002 - [TYPE_USB] = { 5003 - [TYPE_NONE] = { 5004 - [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals, 5005 - [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals, 5006 - [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals, 5007 - }, 5008 - [TYPE_PCIE] = { 5009 - [NO_SSC] = &usb_100_no_ssc_cmn_vals, 5010 - [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals, 5011 - [INTERNAL_SSC] = &usb_100_int_ssc_cmn_vals, 5012 - }, 5013 - [TYPE_SGMII] = { 5014 - [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals, 5015 - [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals, 5016 - [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals, 5017 - }, 5018 - [TYPE_QSGMII] = { 5019 - [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals, 5020 - [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals, 5021 - [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals, 5022 - }, 5023 - [TYPE_DP] = { 5024 - [NO_SSC] = &usb_100_no_ssc_cmn_vals, 5025 - }, 5026 - }, 5027 - }, 4317 + .phy_pma_cmn_vals_tbl = { 4318 + .entries = j721e_phy_pma_cmn_vals_entries, 4319 + .num_entries = ARRAY_SIZE(j721e_phy_pma_cmn_vals_entries), 5028 4320 }, 5029 - .tx_ln_vals = { 5030 - [CLK_19_2_MHZ] = { 5031 - [TYPE_DP] = { 5032 - [TYPE_NONE] = { 5033 - [NO_SSC] = &sl_dp_19_2_no_ssc_tx_ln_vals, 5034 - }, 5035 - }, 5036 - }, 5037 - [CLK_25_MHZ] = { 5038 - [TYPE_DP] = { 5039 - [TYPE_NONE] = { 5040 - [NO_SSC] = &sl_dp_25_no_ssc_tx_ln_vals, 5041 - }, 5042 - }, 5043 - }, 5044 - [CLK_100_MHZ] = { 5045 - [TYPE_DP] = { 5046 - [TYPE_NONE] = { 5047 - [NO_SSC] = &sl_dp_100_no_ssc_tx_ln_vals, 5048 - }, 5049 - [TYPE_PCIE] = { 5050 - [NO_SSC] = &dp_100_no_ssc_tx_ln_vals, 5051 - }, 5052 - [TYPE_USB] = { 5053 - [NO_SSC] = &dp_100_no_ssc_tx_ln_vals, 5054 - }, 5055 - }, 5056 - [TYPE_PCIE] = { 5057 - [TYPE_NONE] = { 5058 - [NO_SSC] = NULL, 5059 - [EXTERNAL_SSC] = NULL, 5060 - [INTERNAL_SSC] = NULL, 5061 - }, 5062 - [TYPE_SGMII] = { 5063 - [NO_SSC] = NULL, 5064 - [EXTERNAL_SSC] = NULL, 5065 - [INTERNAL_SSC] = NULL, 5066 - }, 5067 - [TYPE_QSGMII] = { 5068 - [NO_SSC] = NULL, 5069 - [EXTERNAL_SSC] = NULL, 5070 - [INTERNAL_SSC] = NULL, 5071 - }, 5072 - [TYPE_USB] = { 5073 - [NO_SSC] = NULL, 5074 - [EXTERNAL_SSC] = NULL, 5075 - [INTERNAL_SSC] = NULL, 5076 - }, 5077 - [TYPE_DP] = { 5078 - [NO_SSC] = NULL, 5079 - }, 5080 - }, 5081 - [TYPE_SGMII] = { 5082 - [TYPE_NONE] = { 5083 - [NO_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 5084 - }, 5085 - [TYPE_PCIE] = { 5086 - [NO_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 5087 - [EXTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 5088 - [INTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 5089 - }, 5090 - [TYPE_USB] = { 5091 - [NO_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 5092 - [EXTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 5093 - [INTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 5094 - }, 5095 - }, 5096 - [TYPE_QSGMII] = { 5097 - [TYPE_NONE] = { 5098 - [NO_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 5099 - }, 5100 - [TYPE_PCIE] = { 5101 - [NO_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 5102 - [EXTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 5103 - [INTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 5104 - }, 5105 - [TYPE_USB] = { 5106 - [NO_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 5107 - [EXTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 5108 - [INTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 5109 - }, 5110 - }, 5111 - [TYPE_USB] = { 5112 - [TYPE_NONE] = { 5113 - [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 5114 - [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 5115 - [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 5116 - }, 5117 - [TYPE_PCIE] = { 5118 - [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 5119 - [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 5120 - [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 5121 - }, 5122 - [TYPE_SGMII] = { 5123 - [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 5124 - [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 5125 - [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 5126 - }, 5127 - [TYPE_QSGMII] = { 5128 - [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 5129 - [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 5130 - [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 5131 - }, 5132 - [TYPE_DP] = { 5133 - [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 5134 - }, 5135 - }, 5136 - }, 4321 + .cmn_vals_tbl = { 4322 + .entries = cmn_vals_entries, 4323 + .num_entries = ARRAY_SIZE(cmn_vals_entries), 5137 4324 }, 5138 - .rx_ln_vals = { 5139 - [CLK_19_2_MHZ] = { 5140 - [TYPE_DP] = { 5141 - [TYPE_NONE] = { 5142 - [NO_SSC] = &sl_dp_19_2_no_ssc_rx_ln_vals, 5143 - }, 5144 - }, 5145 - }, 5146 - [CLK_25_MHZ] = { 5147 - [TYPE_DP] = { 5148 - [TYPE_NONE] = { 5149 - [NO_SSC] = &sl_dp_25_no_ssc_rx_ln_vals, 5150 - }, 5151 - }, 5152 - }, 5153 - [CLK_100_MHZ] = { 5154 - [TYPE_DP] = { 5155 - [TYPE_NONE] = { 5156 - [NO_SSC] = &sl_dp_100_no_ssc_rx_ln_vals, 5157 - }, 5158 - [TYPE_PCIE] = { 5159 - [NO_SSC] = &dp_100_no_ssc_rx_ln_vals, 5160 - }, 5161 - [TYPE_USB] = { 5162 - [NO_SSC] = &dp_100_no_ssc_rx_ln_vals, 5163 - }, 5164 - }, 5165 - [TYPE_PCIE] = { 5166 - [TYPE_NONE] = { 5167 - [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 5168 - [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 5169 - [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 5170 - }, 5171 - [TYPE_SGMII] = { 5172 - [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 5173 - [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 5174 - [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 5175 - }, 5176 - [TYPE_QSGMII] = { 5177 - [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 5178 - [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 5179 - [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 5180 - }, 5181 - [TYPE_USB] = { 5182 - [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 5183 - [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 5184 - [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 5185 - }, 5186 - [TYPE_DP] = { 5187 - [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 5188 - }, 5189 - }, 5190 - [TYPE_SGMII] = { 5191 - [TYPE_NONE] = { 5192 - [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 5193 - }, 5194 - [TYPE_PCIE] = { 5195 - [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 5196 - [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 5197 - [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 5198 - }, 5199 - [TYPE_USB] = { 5200 - [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 5201 - [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 5202 - [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 5203 - }, 5204 - }, 5205 - [TYPE_QSGMII] = { 5206 - [TYPE_NONE] = { 5207 - [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 5208 - }, 5209 - [TYPE_PCIE] = { 5210 - [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 5211 - [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 5212 - [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 5213 - }, 5214 - [TYPE_USB] = { 5215 - [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 5216 - [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 5217 - [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 5218 - }, 5219 - }, 5220 - [TYPE_USB] = { 5221 - [TYPE_NONE] = { 5222 - [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 5223 - [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5224 - [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5225 - }, 5226 - [TYPE_PCIE] = { 5227 - [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 5228 - [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5229 - [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5230 - }, 5231 - [TYPE_SGMII] = { 5232 - [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 5233 - [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5234 - [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5235 - }, 5236 - [TYPE_QSGMII] = { 5237 - [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 5238 - [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5239 - [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5240 - }, 5241 - [TYPE_DP] = { 5242 - [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 5243 - }, 5244 - }, 5245 - }, 4325 + .tx_ln_vals_tbl = { 4326 + .entries = ti_tx_ln_vals_entries, 4327 + .num_entries = ARRAY_SIZE(ti_tx_ln_vals_entries), 4328 + }, 4329 + .rx_ln_vals_tbl = { 4330 + .entries = cdns_rx_ln_vals_entries, 4331 + .num_entries = ARRAY_SIZE(cdns_rx_ln_vals_entries), 5246 4332 }, 5247 4333 }; 5248 4334
+1 -1
drivers/phy/freescale/phy-fsl-imx8m-pcie.c
··· 11 11 #include <linux/mfd/syscon.h> 12 12 #include <linux/mfd/syscon/imx7-iomuxc-gpr.h> 13 13 #include <linux/module.h> 14 - #include <linux/of_device.h> 14 + #include <linux/of.h> 15 15 #include <linux/phy/phy.h> 16 16 #include <linux/platform_device.h> 17 17 #include <linux/regmap.h>
+2 -2
drivers/phy/freescale/phy-fsl-imx8mq-usb.c
··· 6 6 #include <linux/delay.h> 7 7 #include <linux/io.h> 8 8 #include <linux/module.h> 9 - #include <linux/of_platform.h> 9 + #include <linux/of.h> 10 10 #include <linux/phy/phy.h> 11 11 #include <linux/platform_device.h> 12 12 #include <linux/regulator/consumer.h> ··· 394 394 395 395 imx_phy->vbus = devm_regulator_get(dev, "vbus"); 396 396 if (IS_ERR(imx_phy->vbus)) 397 - return PTR_ERR(imx_phy->vbus); 397 + return dev_err_probe(dev, PTR_ERR(imx_phy->vbus), "failed to get vbus\n"); 398 398 399 399 phy_set_drvdata(imx_phy->phy, imx_phy); 400 400
+1
drivers/phy/freescale/phy-fsl-lynx-28g.c
··· 2 2 /* Copyright (c) 2021-2022 NXP. */ 3 3 4 4 #include <linux/module.h> 5 + #include <linux/of.h> 5 6 #include <linux/phy.h> 6 7 #include <linux/phy/phy.h> 7 8 #include <linux/platform_device.h>
+1
drivers/phy/hisilicon/phy-hi3660-usb3.c
··· 11 11 #include <linux/kernel.h> 12 12 #include <linux/mfd/syscon.h> 13 13 #include <linux/module.h> 14 + #include <linux/of.h> 14 15 #include <linux/phy/phy.h> 15 16 #include <linux/platform_device.h> 16 17 #include <linux/regmap.h>
+1
drivers/phy/hisilicon/phy-hi3670-usb3.c
··· 13 13 #include <linux/kernel.h> 14 14 #include <linux/mfd/syscon.h> 15 15 #include <linux/module.h> 16 + #include <linux/of.h> 16 17 #include <linux/phy/phy.h> 17 18 #include <linux/platform_device.h> 18 19 #include <linux/regmap.h>
+1
drivers/phy/hisilicon/phy-hi6220-usb.c
··· 5 5 */ 6 6 7 7 #include <linux/mfd/syscon.h> 8 + #include <linux/mod_devicetable.h> 8 9 #include <linux/module.h> 9 10 #include <linux/platform_device.h> 10 11 #include <linux/phy/phy.h>
+2 -1
drivers/phy/hisilicon/phy-hisi-inno-usb2.c
··· 9 9 #include <linux/delay.h> 10 10 #include <linux/io.h> 11 11 #include <linux/module.h> 12 - #include <linux/of_device.h> 12 + #include <linux/of.h> 13 13 #include <linux/phy/phy.h> 14 + #include <linux/platform_device.h> 14 15 #include <linux/reset.h> 15 16 16 17 #define INNO_PHY_PORT_NUM 2
+2 -1
drivers/phy/hisilicon/phy-histb-combphy.c
··· 13 13 #include <linux/kernel.h> 14 14 #include <linux/mfd/syscon.h> 15 15 #include <linux/module.h> 16 - #include <linux/of_device.h> 16 + #include <linux/of.h> 17 17 #include <linux/phy/phy.h> 18 + #include <linux/platform_device.h> 18 19 #include <linux/regmap.h> 19 20 #include <linux/reset.h> 20 21 #include <dt-bindings/phy/phy.h>
+1
drivers/phy/hisilicon/phy-hix5hd2-sata.c
··· 8 8 #include <linux/io.h> 9 9 #include <linux/mfd/syscon.h> 10 10 #include <linux/module.h> 11 + #include <linux/of.h> 11 12 #include <linux/phy/phy.h> 12 13 #include <linux/platform_device.h> 13 14 #include <linux/regmap.h>
+1
drivers/phy/ingenic/phy-ingenic-usb.c
··· 11 11 #include <linux/delay.h> 12 12 #include <linux/io.h> 13 13 #include <linux/module.h> 14 + #include <linux/of.h> 14 15 #include <linux/phy/phy.h> 15 16 #include <linux/platform_device.h> 16 17 #include <linux/regulator/consumer.h>
-1
drivers/phy/lantiq/phy-lantiq-rcu-usb2.c
··· 12 12 #include <linux/module.h> 13 13 #include <linux/of.h> 14 14 #include <linux/of_address.h> 15 - #include <linux/of_device.h> 16 15 #include <linux/phy/phy.h> 17 16 #include <linux/platform_device.h> 18 17 #include <linux/property.h>
+1
drivers/phy/marvell/phy-armada38x-comphy.c
··· 8 8 #include <linux/delay.h> 9 9 #include <linux/iopoll.h> 10 10 #include <linux/module.h> 11 + #include <linux/of.h> 11 12 #include <linux/phy/phy.h> 12 13 #include <linux/phy.h> 13 14 #include <linux/platform_device.h>
+1
drivers/phy/marvell/phy-berlin-sata.c
··· 9 9 10 10 #include <linux/clk.h> 11 11 #include <linux/module.h> 12 + #include <linux/of.h> 12 13 #include <linux/phy/phy.h> 13 14 #include <linux/io.h> 14 15 #include <linux/platform_device.h>
+1
drivers/phy/marvell/phy-mmp3-hsic.c
··· 5 5 6 6 #include <linux/delay.h> 7 7 #include <linux/io.h> 8 + #include <linux/mod_devicetable.h> 8 9 #include <linux/module.h> 9 10 #include <linux/phy/phy.h> 10 11 #include <linux/platform_device.h>
+1
drivers/phy/marvell/phy-mmp3-usb.c
··· 6 6 7 7 #include <linux/delay.h> 8 8 #include <linux/io.h> 9 + #include <linux/mod_devicetable.h> 9 10 #include <linux/module.h> 10 11 #include <linux/phy/phy.h> 11 12 #include <linux/platform_device.h>
+1
drivers/phy/marvell/phy-mvebu-a3700-comphy.c
··· 19 19 #include <linux/iopoll.h> 20 20 #include <linux/mfd/syscon.h> 21 21 #include <linux/module.h> 22 + #include <linux/of.h> 22 23 #include <linux/phy.h> 23 24 #include <linux/phy/phy.h> 24 25 #include <linux/platform_device.h>
+1 -1
drivers/phy/marvell/phy-mvebu-a3700-utmi.c
··· 13 13 #include <linux/iopoll.h> 14 14 #include <linux/mfd/syscon.h> 15 15 #include <linux/module.h> 16 - #include <linux/of_device.h> 16 + #include <linux/of.h> 17 17 #include <linux/phy/phy.h> 18 18 #include <linux/platform_device.h> 19 19 #include <linux/regmap.h>
+2 -2
drivers/phy/marvell/phy-mvebu-cp110-comphy.c
··· 11 11 #include <linux/iopoll.h> 12 12 #include <linux/mfd/syscon.h> 13 13 #include <linux/module.h> 14 + #include <linux/of.h> 14 15 #include <linux/phy.h> 15 16 #include <linux/phy/phy.h> 16 17 #include <linux/platform_device.h> ··· 1012 1011 "marvell,system-controller"); 1013 1012 if (IS_ERR(priv->regmap)) 1014 1013 return PTR_ERR(priv->regmap); 1015 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1016 - priv->base = devm_ioremap_resource(&pdev->dev, res); 1014 + priv->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); 1017 1015 if (IS_ERR(priv->base)) 1018 1016 return PTR_ERR(priv->base); 1019 1017
+1 -1
drivers/phy/marvell/phy-mvebu-cp110-utmi.c
··· 12 12 #include <linux/iopoll.h> 13 13 #include <linux/mfd/syscon.h> 14 14 #include <linux/module.h> 15 - #include <linux/of_device.h> 15 + #include <linux/of.h> 16 16 #include <linux/phy/phy.h> 17 17 #include <linux/platform_device.h> 18 18 #include <linux/regmap.h>
+1
drivers/phy/marvell/phy-mvebu-sata.c
··· 10 10 #include <linux/clk.h> 11 11 #include <linux/phy/phy.h> 12 12 #include <linux/io.h> 13 + #include <linux/mod_devicetable.h> 13 14 #include <linux/platform_device.h> 14 15 15 16 struct priv {
-1
drivers/phy/marvell/phy-pxa-28nm-usb2.c
··· 11 11 #include <linux/delay.h> 12 12 #include <linux/slab.h> 13 13 #include <linux/of.h> 14 - #include <linux/of_device.h> 15 14 #include <linux/io.h> 16 15 #include <linux/iopoll.h> 17 16 #include <linux/err.h>
+1 -1
drivers/phy/marvell/phy-pxa-usb.c
··· 296 296 297 297 of_id = of_match_node(pxa_usb_phy_of_match, dev->of_node); 298 298 if (of_id) 299 - pxa_usb_phy->version = (enum pxa_usb_phy_version)of_id->data; 299 + pxa_usb_phy->version = (uintptr_t)of_id->data; 300 300 else 301 301 pxa_usb_phy->version = PXA_USB_PHY_MMP2; 302 302
-1
drivers/phy/mediatek/phy-mtk-hdmi.h
··· 11 11 #include <linux/delay.h> 12 12 #include <linux/mfd/syscon.h> 13 13 #include <linux/module.h> 14 - #include <linux/of_device.h> 15 14 #include <linux/phy/phy.h> 16 15 #include <linux/platform_device.h> 17 16 #include <linux/types.h>
+10 -20
drivers/phy/mediatek/phy-mtk-mipi-dsi.c
··· 36 36 int ret; 37 37 38 38 /* Power up core and enable PLL */ 39 - ret = clk_prepare_enable(mipi_tx->pll); 39 + ret = clk_prepare_enable(mipi_tx->pll_hw.clk); 40 40 if (ret < 0) 41 41 return ret; 42 42 ··· 53 53 mipi_tx->driver_data->mipi_tx_disable_signal(phy); 54 54 55 55 /* Disable PLL and power down core */ 56 - clk_disable_unprepare(mipi_tx->pll); 56 + clk_disable_unprepare(mipi_tx->pll_hw.clk); 57 57 58 58 return 0; 59 59 } ··· 158 158 clk_init.ops = mipi_tx->driver_data->mipi_tx_clk_ops; 159 159 160 160 mipi_tx->pll_hw.init = &clk_init; 161 - mipi_tx->pll = devm_clk_register(dev, &mipi_tx->pll_hw); 162 - if (IS_ERR(mipi_tx->pll)) 163 - return dev_err_probe(dev, PTR_ERR(mipi_tx->pll), "Failed to register PLL\n"); 161 + ret = devm_clk_hw_register(dev, &mipi_tx->pll_hw); 162 + if (ret) 163 + return dev_err_probe(dev, ret, "Failed to register PLL\n"); 164 164 165 165 phy = devm_phy_create(dev, NULL, &mtk_mipi_tx_ops); 166 166 if (IS_ERR(phy)) ··· 176 176 177 177 mtk_mipi_tx_get_calibration_datal(mipi_tx); 178 178 179 - return of_clk_add_provider(dev->of_node, of_clk_src_simple_get, 180 - mipi_tx->pll); 181 - } 182 - 183 - static void mtk_mipi_tx_remove(struct platform_device *pdev) 184 - { 185 - of_clk_del_provider(pdev->dev.of_node); 179 + return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, &mipi_tx->pll_hw); 186 180 } 187 181 188 182 static const struct of_device_id mtk_mipi_tx_match[] = { 189 - { .compatible = "mediatek,mt2701-mipi-tx", 190 - .data = &mt2701_mipitx_data }, 191 - { .compatible = "mediatek,mt8173-mipi-tx", 192 - .data = &mt8173_mipitx_data }, 193 - { .compatible = "mediatek,mt8183-mipi-tx", 194 - .data = &mt8183_mipitx_data }, 195 - { }, 183 + { .compatible = "mediatek,mt2701-mipi-tx", .data = &mt2701_mipitx_data }, 184 + { .compatible = "mediatek,mt8173-mipi-tx", .data = &mt8173_mipitx_data }, 185 + { .compatible = "mediatek,mt8183-mipi-tx", .data = &mt8183_mipitx_data }, 186 + { /* sentinel */ } 196 187 }; 197 188 MODULE_DEVICE_TABLE(of, mtk_mipi_tx_match); 198 189 199 190 static struct platform_driver mtk_mipi_tx_driver = { 200 191 .probe = mtk_mipi_tx_probe, 201 - .remove_new = mtk_mipi_tx_remove, 202 192 .driver = { 203 193 .name = "mediatek-mipi-tx", 204 194 .of_match_table = mtk_mipi_tx_match,
-2
drivers/phy/mediatek/phy-mtk-mipi-dsi.h
··· 12 12 #include <linux/delay.h> 13 13 #include <linux/module.h> 14 14 #include <linux/nvmem-consumer.h> 15 - #include <linux/of_device.h> 16 15 #include <linux/platform_device.h> 17 16 #include <linux/phy/phy.h> 18 17 #include <linux/slab.h> ··· 31 32 u32 rt_code[5]; 32 33 const struct mtk_mipitx_data *driver_data; 33 34 struct clk_hw pll_hw; 34 - struct clk *pll; 35 35 }; 36 36 37 37 struct mtk_mipi_tx *mtk_mipi_tx_from_clk_hw(struct clk_hw *hw);
+1 -1
drivers/phy/mediatek/phy-mtk-pcie.c
··· 7 7 #include <linux/bitfield.h> 8 8 #include <linux/module.h> 9 9 #include <linux/nvmem-consumer.h> 10 - #include <linux/of_device.h> 10 + #include <linux/of.h> 11 11 #include <linux/phy/phy.h> 12 12 #include <linux/platform_device.h> 13 13 #include <linux/slab.h>
+1 -1
drivers/phy/mediatek/phy-mtk-tphy.c
··· 13 13 #include <linux/mfd/syscon.h> 14 14 #include <linux/module.h> 15 15 #include <linux/nvmem-consumer.h> 16 + #include <linux/of.h> 16 17 #include <linux/of_address.h> 17 - #include <linux/of_device.h> 18 18 #include <linux/phy/phy.h> 19 19 #include <linux/platform_device.h> 20 20 #include <linux/regmap.h>
+1
drivers/phy/mediatek/phy-mtk-ufs.c
··· 7 7 #include <linux/clk.h> 8 8 #include <linux/delay.h> 9 9 #include <linux/io.h> 10 + #include <linux/mod_devicetable.h> 10 11 #include <linux/module.h> 11 12 #include <linux/phy/phy.h> 12 13 #include <linux/platform_device.h>
+1
drivers/phy/phy-can-transceiver.c
··· 5 5 * Copyright (C) 2021 Texas Instruments Incorporated - https://www.ti.com 6 6 * 7 7 */ 8 + #include <linux/of.h> 8 9 #include<linux/phy/phy.h> 9 10 #include<linux/platform_device.h> 10 11 #include<linux/module.h>
+1
drivers/phy/phy-xgene.c
··· 39 39 * Currently, this driver only supports Gen3 SATA mode with external clock. 40 40 */ 41 41 #include <linux/module.h> 42 + #include <linux/of.h> 42 43 #include <linux/platform_device.h> 43 44 #include <linux/io.h> 44 45 #include <linux/delay.h>
+21
drivers/phy/qualcomm/Kconfig
··· 102 102 Enable this to support the QMP USB PHY transceiver that is used 103 103 with USB3 controllers on Qualcomm chips. 104 104 105 + config PHY_QCOM_QMP_USB_LEGACY 106 + tristate "Qualcomm QMP legacy USB PHY Driver" 107 + select GENERIC_PHY 108 + default n 109 + help 110 + Enable this legacy driver to support the QMP USB+DisplayPort Combo 111 + PHY transceivers working only in USB3 mode on Qualcomm chips. This 112 + driver exists only for compatibility with older device trees, 113 + existing users have been migrated to PHY_QCOM_QMP_COMBO driver. 114 + 105 115 endif # PHY_QCOM_QMP 106 116 107 117 config PHY_QCOM_QUSB2 ··· 142 132 Enable support for the USB high-speed SNPS eUSB2 repeater on Qualcomm 143 133 PMICs. The repeater is paired with a Synopsys eUSB2 Phy 144 134 on Qualcomm SOCs. 135 + 136 + config PHY_QCOM_M31_USB 137 + tristate "Qualcomm M31 HS PHY driver support" 138 + depends on USB && (ARCH_QCOM || COMPILE_TEST) 139 + select GENERIC_PHY 140 + help 141 + Enable this to support M31 HS PHY transceivers on Qualcomm chips 142 + with DWC3 USB core. It handles PHY initialization, clock 143 + management required after resetting the hardware and power 144 + management. This driver is required even for peripheral only or 145 + host only mode configurations. 145 146 146 147 config PHY_QCOM_USB_HS 147 148 tristate "Qualcomm USB HS PHY module"
+2
drivers/phy/qualcomm/Makefile
··· 4 4 obj-$(CONFIG_PHY_QCOM_EDP) += phy-qcom-edp.o 5 5 obj-$(CONFIG_PHY_QCOM_IPQ4019_USB) += phy-qcom-ipq4019-usb.o 6 6 obj-$(CONFIG_PHY_QCOM_IPQ806X_SATA) += phy-qcom-ipq806x-sata.o 7 + obj-$(CONFIG_PHY_QCOM_M31_USB) += phy-qcom-m31.o 7 8 obj-$(CONFIG_PHY_QCOM_PCIE2) += phy-qcom-pcie2.o 8 9 9 10 obj-$(CONFIG_PHY_QCOM_QMP_COMBO) += phy-qcom-qmp-combo.o ··· 12 11 obj-$(CONFIG_PHY_QCOM_QMP_PCIE_8996) += phy-qcom-qmp-pcie-msm8996.o 13 12 obj-$(CONFIG_PHY_QCOM_QMP_UFS) += phy-qcom-qmp-ufs.o 14 13 obj-$(CONFIG_PHY_QCOM_QMP_USB) += phy-qcom-qmp-usb.o 14 + obj-$(CONFIG_PHY_QCOM_QMP_USB_LEGACY) += phy-qcom-qmp-usb-legacy.o 15 15 16 16 obj-$(CONFIG_PHY_QCOM_QUSB2) += phy-qcom-qusb2.o 17 17 obj-$(CONFIG_PHY_QCOM_SNPS_EUSB2) += phy-qcom-snps-eusb2.o
+1
drivers/phy/qualcomm/phy-ath79-usb.c
··· 5 5 * Copyright (C) 2015-2018 Alban Bedel <albeu@free.fr> 6 6 */ 7 7 8 + #include <linux/mod_devicetable.h> 8 9 #include <linux/module.h> 9 10 #include <linux/platform_device.h> 10 11 #include <linux/phy/phy.h>
-2
drivers/phy/qualcomm/phy-qcom-edp.c
··· 13 13 #include <linux/kernel.h> 14 14 #include <linux/module.h> 15 15 #include <linux/of.h> 16 - #include <linux/of_device.h> 17 - #include <linux/of_address.h> 18 16 #include <linux/phy/phy.h> 19 17 #include <linux/platform_device.h> 20 18 #include <linux/regulator/consumer.h>
-1
drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c
··· 8 8 #include <linux/regulator/consumer.h> 9 9 #include <linux/regmap.h> 10 10 #include <linux/of.h> 11 - #include <linux/of_device.h> 12 11 #include <linux/phy/phy.h> 13 12 14 13 /* eUSB2 status registers */
+1 -2
drivers/phy/qualcomm/phy-qcom-ipq4019-usb.c
··· 13 13 #include <linux/kernel.h> 14 14 #include <linux/module.h> 15 15 #include <linux/mutex.h> 16 - #include <linux/of_platform.h> 17 - #include <linux/of_device.h> 16 + #include <linux/of.h> 18 17 #include <linux/phy/phy.h> 19 18 #include <linux/platform_device.h> 20 19 #include <linux/reset.h>
+1 -1
drivers/phy/qualcomm/phy-qcom-ipq806x-usb.c
··· 4 4 #include <linux/err.h> 5 5 #include <linux/io.h> 6 6 #include <linux/module.h> 7 - #include <linux/of_device.h> 7 + #include <linux/of.h> 8 8 #include <linux/phy/phy.h> 9 9 #include <linux/platform_device.h> 10 10 #include <linux/delay.h>
+294
drivers/phy/qualcomm/phy-qcom-m31.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Copyright (c) 2014-2023, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #include <linux/clk.h> 7 + #include <linux/delay.h> 8 + #include <linux/err.h> 9 + #include <linux/io.h> 10 + #include <linux/kernel.h> 11 + #include <linux/module.h> 12 + #include <linux/of.h> 13 + #include <linux/phy/phy.h> 14 + #include <linux/platform_device.h> 15 + #include <linux/reset.h> 16 + #include <linux/slab.h> 17 + 18 + #define USB2PHY_PORT_UTMI_CTRL1 0x40 19 + 20 + #define USB2PHY_PORT_UTMI_CTRL2 0x44 21 + #define UTMI_ULPI_SEL BIT(7) 22 + #define UTMI_TEST_MUX_SEL BIT(6) 23 + 24 + #define HS_PHY_CTRL_REG 0x10 25 + #define UTMI_OTG_VBUS_VALID BIT(20) 26 + #define SW_SESSVLD_SEL BIT(28) 27 + 28 + #define USB_PHY_UTMI_CTRL0 0x3c 29 + 30 + #define USB_PHY_UTMI_CTRL5 0x50 31 + #define POR_EN BIT(1) 32 + 33 + #define USB_PHY_HS_PHY_CTRL_COMMON0 0x54 34 + #define COMMONONN BIT(7) 35 + #define FSEL BIT(4) 36 + #define RETENABLEN BIT(3) 37 + #define FREQ_24MHZ (BIT(6) | BIT(4)) 38 + 39 + #define USB_PHY_HS_PHY_CTRL2 0x64 40 + #define USB2_SUSPEND_N_SEL BIT(3) 41 + #define USB2_SUSPEND_N BIT(2) 42 + #define USB2_UTMI_CLK_EN BIT(1) 43 + 44 + #define USB_PHY_CFG0 0x94 45 + #define UTMI_PHY_OVERRIDE_EN BIT(1) 46 + 47 + #define USB_PHY_REFCLK_CTRL 0xa0 48 + #define CLKCORE BIT(1) 49 + 50 + #define USB2PHY_PORT_POWERDOWN 0xa4 51 + #define POWER_UP BIT(0) 52 + #define POWER_DOWN 0 53 + 54 + #define USB_PHY_FSEL_SEL 0xb8 55 + #define FREQ_SEL BIT(0) 56 + 57 + #define USB2PHY_USB_PHY_M31_XCFGI_1 0xbc 58 + #define USB2_0_TX_ENABLE BIT(2) 59 + 60 + #define USB2PHY_USB_PHY_M31_XCFGI_4 0xc8 61 + #define HSTX_SLEW_RATE_565PS GENMASK(1, 0) 62 + #define PLL_CHARGING_PUMP_CURRENT_35UA GENMASK(4, 3) 63 + #define ODT_VALUE_38_02_OHM GENMASK(7, 6) 64 + 65 + #define USB2PHY_USB_PHY_M31_XCFGI_5 0xcc 66 + #define ODT_VALUE_45_02_OHM BIT(2) 67 + #define HSTX_PRE_EMPHASIS_LEVEL_0_55MA BIT(0) 68 + 69 + #define USB2PHY_USB_PHY_M31_XCFGI_11 0xe4 70 + #define XCFG_COARSE_TUNE_NUM BIT(1) 71 + #define XCFG_FINE_TUNE_NUM BIT(3) 72 + 73 + struct m31_phy_regs { 74 + u32 off; 75 + u32 val; 76 + u32 delay; 77 + }; 78 + 79 + struct m31_priv_data { 80 + bool ulpi_mode; 81 + const struct m31_phy_regs *regs; 82 + unsigned int nregs; 83 + }; 84 + 85 + struct m31_phy_regs m31_ipq5332_regs[] = { 86 + { 87 + USB_PHY_CFG0, 88 + UTMI_PHY_OVERRIDE_EN, 89 + 0 90 + }, 91 + { 92 + USB_PHY_UTMI_CTRL5, 93 + POR_EN, 94 + 15 95 + }, 96 + { 97 + USB_PHY_FSEL_SEL, 98 + FREQ_SEL, 99 + 0 100 + }, 101 + { 102 + USB_PHY_HS_PHY_CTRL_COMMON0, 103 + COMMONONN | FREQ_24MHZ | RETENABLEN, 104 + 0 105 + }, 106 + { 107 + USB_PHY_UTMI_CTRL5, 108 + POR_EN, 109 + 0 110 + }, 111 + { 112 + USB_PHY_HS_PHY_CTRL2, 113 + USB2_SUSPEND_N_SEL | USB2_SUSPEND_N | USB2_UTMI_CLK_EN, 114 + 0 115 + }, 116 + { 117 + USB2PHY_USB_PHY_M31_XCFGI_11, 118 + XCFG_COARSE_TUNE_NUM | XCFG_FINE_TUNE_NUM, 119 + 0 120 + }, 121 + { 122 + USB2PHY_USB_PHY_M31_XCFGI_4, 123 + HSTX_SLEW_RATE_565PS | PLL_CHARGING_PUMP_CURRENT_35UA | ODT_VALUE_38_02_OHM, 124 + 0 125 + }, 126 + { 127 + USB2PHY_USB_PHY_M31_XCFGI_1, 128 + USB2_0_TX_ENABLE, 129 + 0 130 + }, 131 + { 132 + USB2PHY_USB_PHY_M31_XCFGI_5, 133 + ODT_VALUE_45_02_OHM | HSTX_PRE_EMPHASIS_LEVEL_0_55MA, 134 + 4 135 + }, 136 + { 137 + USB_PHY_UTMI_CTRL5, 138 + 0x0, 139 + 0 140 + }, 141 + { 142 + USB_PHY_HS_PHY_CTRL2, 143 + USB2_SUSPEND_N | USB2_UTMI_CLK_EN, 144 + 0 145 + }, 146 + }; 147 + 148 + struct m31usb_phy { 149 + struct phy *phy; 150 + void __iomem *base; 151 + const struct m31_phy_regs *regs; 152 + int nregs; 153 + 154 + struct regulator *vreg; 155 + struct clk *clk; 156 + struct reset_control *reset; 157 + 158 + bool ulpi_mode; 159 + }; 160 + 161 + static int m31usb_phy_init(struct phy *phy) 162 + { 163 + struct m31usb_phy *qphy = phy_get_drvdata(phy); 164 + const struct m31_phy_regs *regs = qphy->regs; 165 + int i, ret; 166 + 167 + ret = regulator_enable(qphy->vreg); 168 + if (ret) { 169 + dev_err(&phy->dev, "failed to enable regulator, %d\n", ret); 170 + return ret; 171 + } 172 + 173 + ret = clk_prepare_enable(qphy->clk); 174 + if (ret) { 175 + if (qphy->vreg) 176 + regulator_disable(qphy->vreg); 177 + dev_err(&phy->dev, "failed to enable cfg ahb clock, %d\n", ret); 178 + return ret; 179 + } 180 + 181 + /* Perform phy reset */ 182 + reset_control_assert(qphy->reset); 183 + udelay(5); 184 + reset_control_deassert(qphy->reset); 185 + 186 + /* configure for ULPI mode if requested */ 187 + if (qphy->ulpi_mode) 188 + writel(0x0, qphy->base + USB2PHY_PORT_UTMI_CTRL2); 189 + 190 + /* Enable the PHY */ 191 + writel(POWER_UP, qphy->base + USB2PHY_PORT_POWERDOWN); 192 + 193 + /* Turn on phy ref clock */ 194 + for (i = 0; i < qphy->nregs; i++) { 195 + writel(regs[i].val, qphy->base + regs[i].off); 196 + if (regs[i].delay) 197 + udelay(regs[i].delay); 198 + } 199 + 200 + return 0; 201 + } 202 + 203 + static int m31usb_phy_shutdown(struct phy *phy) 204 + { 205 + struct m31usb_phy *qphy = phy_get_drvdata(phy); 206 + 207 + /* Disable the PHY */ 208 + writel_relaxed(POWER_DOWN, qphy->base + USB2PHY_PORT_POWERDOWN); 209 + 210 + clk_disable_unprepare(qphy->clk); 211 + 212 + regulator_disable(qphy->vreg); 213 + 214 + return 0; 215 + } 216 + 217 + static const struct phy_ops m31usb_phy_gen_ops = { 218 + .power_on = m31usb_phy_init, 219 + .power_off = m31usb_phy_shutdown, 220 + .owner = THIS_MODULE, 221 + }; 222 + 223 + static int m31usb_phy_probe(struct platform_device *pdev) 224 + { 225 + struct phy_provider *phy_provider; 226 + const struct m31_priv_data *data; 227 + struct device *dev = &pdev->dev; 228 + struct m31usb_phy *qphy; 229 + 230 + qphy = devm_kzalloc(dev, sizeof(*qphy), GFP_KERNEL); 231 + if (!qphy) 232 + return -ENOMEM; 233 + 234 + qphy->base = devm_platform_ioremap_resource(pdev, 0); 235 + if (IS_ERR(qphy->base)) 236 + return PTR_ERR(qphy->base); 237 + 238 + qphy->reset = devm_reset_control_get_exclusive_by_index(dev, 0); 239 + if (IS_ERR(qphy->reset)) 240 + return PTR_ERR(qphy->reset); 241 + 242 + qphy->clk = devm_clk_get(dev, NULL); 243 + if (IS_ERR(qphy->clk)) 244 + return dev_err_probe(dev, PTR_ERR(qphy->clk), 245 + "failed to get clk\n"); 246 + 247 + data = of_device_get_match_data(dev); 248 + qphy->regs = data->regs; 249 + qphy->nregs = data->nregs; 250 + qphy->ulpi_mode = data->ulpi_mode; 251 + 252 + qphy->phy = devm_phy_create(dev, NULL, &m31usb_phy_gen_ops); 253 + if (IS_ERR(qphy->phy)) 254 + return dev_err_probe(dev, PTR_ERR(qphy->phy), 255 + "failed to create phy\n"); 256 + 257 + qphy->vreg = devm_regulator_get(dev, "vdda-phy"); 258 + if (IS_ERR(qphy->vreg)) 259 + return dev_err_probe(dev, PTR_ERR(qphy->phy), 260 + "failed to get vreg\n"); 261 + 262 + phy_set_drvdata(qphy->phy, qphy); 263 + 264 + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); 265 + if (!IS_ERR(phy_provider)) 266 + dev_info(dev, "Registered M31 USB phy\n"); 267 + 268 + return PTR_ERR_OR_ZERO(phy_provider); 269 + } 270 + 271 + static const struct m31_priv_data m31_ipq5332_data = { 272 + .ulpi_mode = false, 273 + .regs = m31_ipq5332_regs, 274 + .nregs = ARRAY_SIZE(m31_ipq5332_regs), 275 + }; 276 + 277 + static const struct of_device_id m31usb_phy_id_table[] = { 278 + { .compatible = "qcom,ipq5332-usb-hsphy", .data = &m31_ipq5332_data }, 279 + { }, 280 + }; 281 + MODULE_DEVICE_TABLE(of, m31usb_phy_id_table); 282 + 283 + static struct platform_driver m31usb_phy_driver = { 284 + .probe = m31usb_phy_probe, 285 + .driver = { 286 + .name = "qcom-m31usb-phy", 287 + .of_match_table = m31usb_phy_id_table, 288 + }, 289 + }; 290 + 291 + module_platform_driver(m31usb_phy_driver); 292 + 293 + MODULE_DESCRIPTION("USB2 Qualcomm M31 HSPHY driver"); 294 + MODULE_LICENSE("GPL");
+301 -381
drivers/phy/qualcomm/phy-qcom-qmp-combo.c
··· 12 12 #include <linux/kernel.h> 13 13 #include <linux/module.h> 14 14 #include <linux/of.h> 15 - #include <linux/of_device.h> 16 15 #include <linux/of_address.h> 17 16 #include <linux/phy/phy.h> 18 17 #include <linux/platform_device.h> ··· 105 106 QPHY_PCS_AUTONOMOUS_MODE_CTRL, 106 107 QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR, 107 108 QPHY_PCS_POWER_DOWN_CONTROL, 109 + 110 + QPHY_COM_RESETSM_CNTRL, 111 + QPHY_COM_C_READY_STATUS, 112 + QPHY_COM_CMN_STATUS, 113 + QPHY_COM_BIAS_EN_CLKBUFLR_EN, 114 + 115 + QPHY_DP_PHY_STATUS, 116 + 117 + QPHY_TX_TX_POL_INV, 118 + QPHY_TX_TX_DRV_LVL, 119 + QPHY_TX_TX_EMP_POST1_LVL, 120 + QPHY_TX_HIGHZ_DRVR_EN, 121 + QPHY_TX_TRANSCEIVER_BIAS_EN, 122 + 108 123 /* Keep last to ensure regs_layout arrays are properly initialized */ 109 124 QPHY_LAYOUT_SIZE 110 125 }; ··· 130 117 [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V3_PCS_POWER_DOWN_CONTROL, 131 118 [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V3_PCS_AUTONOMOUS_MODE_CTRL, 132 119 [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V3_PCS_LFPS_RXTERM_IRQ_CLEAR, 120 + 121 + [QPHY_COM_RESETSM_CNTRL] = QSERDES_V3_COM_RESETSM_CNTRL, 122 + [QPHY_COM_C_READY_STATUS] = QSERDES_V3_COM_C_READY_STATUS, 123 + [QPHY_COM_CMN_STATUS] = QSERDES_V3_COM_CMN_STATUS, 124 + [QPHY_COM_BIAS_EN_CLKBUFLR_EN] = QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 125 + 126 + [QPHY_DP_PHY_STATUS] = QSERDES_V3_DP_PHY_STATUS, 127 + 128 + [QPHY_TX_TX_POL_INV] = QSERDES_V3_TX_TX_POL_INV, 129 + [QPHY_TX_TX_DRV_LVL] = QSERDES_V3_TX_TX_DRV_LVL, 130 + [QPHY_TX_TX_EMP_POST1_LVL] = QSERDES_V3_TX_TX_EMP_POST1_LVL, 131 + [QPHY_TX_HIGHZ_DRVR_EN] = QSERDES_V3_TX_HIGHZ_DRVR_EN, 132 + [QPHY_TX_TRANSCEIVER_BIAS_EN] = QSERDES_V3_TX_TRANSCEIVER_BIAS_EN, 133 133 }; 134 134 135 - static const unsigned int qmp_v4_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = { 135 + static const unsigned int qmp_v45_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = { 136 136 [QPHY_SW_RESET] = QPHY_V4_PCS_SW_RESET, 137 137 [QPHY_START_CTRL] = QPHY_V4_PCS_START_CONTROL, 138 138 [QPHY_PCS_STATUS] = QPHY_V4_PCS_PCS_STATUS1, ··· 154 128 /* In PCS_USB */ 155 129 [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V4_PCS_USB3_AUTONOMOUS_MODE_CTRL, 156 130 [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V4_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR, 131 + 132 + [QPHY_COM_RESETSM_CNTRL] = QSERDES_V4_COM_RESETSM_CNTRL, 133 + [QPHY_COM_C_READY_STATUS] = QSERDES_V4_COM_C_READY_STATUS, 134 + [QPHY_COM_CMN_STATUS] = QSERDES_V4_COM_CMN_STATUS, 135 + [QPHY_COM_BIAS_EN_CLKBUFLR_EN] = QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN, 136 + 137 + [QPHY_DP_PHY_STATUS] = QSERDES_V4_DP_PHY_STATUS, 138 + 139 + [QPHY_TX_TX_POL_INV] = QSERDES_V4_TX_TX_POL_INV, 140 + [QPHY_TX_TX_DRV_LVL] = QSERDES_V4_TX_TX_DRV_LVL, 141 + [QPHY_TX_TX_EMP_POST1_LVL] = QSERDES_V4_TX_TX_EMP_POST1_LVL, 142 + [QPHY_TX_HIGHZ_DRVR_EN] = QSERDES_V4_TX_HIGHZ_DRVR_EN, 143 + [QPHY_TX_TRANSCEIVER_BIAS_EN] = QSERDES_V4_TX_TRANSCEIVER_BIAS_EN, 144 + }; 145 + 146 + static const unsigned int qmp_v5_5nm_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = { 147 + [QPHY_SW_RESET] = QPHY_V5_PCS_SW_RESET, 148 + [QPHY_START_CTRL] = QPHY_V5_PCS_START_CONTROL, 149 + [QPHY_PCS_STATUS] = QPHY_V5_PCS_PCS_STATUS1, 150 + [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V5_PCS_POWER_DOWN_CONTROL, 151 + 152 + /* In PCS_USB */ 153 + [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V5_PCS_USB3_AUTONOMOUS_MODE_CTRL, 154 + [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V5_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR, 155 + 156 + [QPHY_COM_RESETSM_CNTRL] = QSERDES_V5_COM_RESETSM_CNTRL, 157 + [QPHY_COM_C_READY_STATUS] = QSERDES_V5_COM_C_READY_STATUS, 158 + [QPHY_COM_CMN_STATUS] = QSERDES_V5_COM_CMN_STATUS, 159 + [QPHY_COM_BIAS_EN_CLKBUFLR_EN] = QSERDES_V5_COM_BIAS_EN_CLKBUFLR_EN, 160 + 161 + [QPHY_DP_PHY_STATUS] = QSERDES_V5_DP_PHY_STATUS, 162 + 163 + [QPHY_TX_TX_POL_INV] = QSERDES_V5_5NM_TX_TX_POL_INV, 164 + [QPHY_TX_TX_DRV_LVL] = QSERDES_V5_5NM_TX_TX_DRV_LVL, 165 + [QPHY_TX_TX_EMP_POST1_LVL] = QSERDES_V5_5NM_TX_TX_EMP_POST1_LVL, 166 + [QPHY_TX_HIGHZ_DRVR_EN] = QSERDES_V5_5NM_TX_HIGHZ_DRVR_EN, 167 + [QPHY_TX_TRANSCEIVER_BIAS_EN] = QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN, 168 + }; 169 + 170 + static const unsigned int qmp_v6_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = { 171 + [QPHY_SW_RESET] = QPHY_V5_PCS_SW_RESET, 172 + [QPHY_START_CTRL] = QPHY_V5_PCS_START_CONTROL, 173 + [QPHY_PCS_STATUS] = QPHY_V5_PCS_PCS_STATUS1, 174 + [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V5_PCS_POWER_DOWN_CONTROL, 175 + 176 + /* In PCS_USB */ 177 + [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V5_PCS_USB3_AUTONOMOUS_MODE_CTRL, 178 + [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V5_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR, 179 + 180 + [QPHY_COM_RESETSM_CNTRL] = QSERDES_V6_COM_RESETSM_CNTRL, 181 + [QPHY_COM_C_READY_STATUS] = QSERDES_V6_COM_C_READY_STATUS, 182 + [QPHY_COM_CMN_STATUS] = QSERDES_V6_COM_CMN_STATUS, 183 + [QPHY_COM_BIAS_EN_CLKBUFLR_EN] = QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN, 184 + 185 + [QPHY_DP_PHY_STATUS] = QSERDES_V6_DP_PHY_STATUS, 186 + 187 + [QPHY_TX_TX_POL_INV] = QSERDES_V6_TX_TX_POL_INV, 188 + [QPHY_TX_TX_DRV_LVL] = QSERDES_V6_TX_TX_DRV_LVL, 189 + [QPHY_TX_TX_EMP_POST1_LVL] = QSERDES_V6_TX_TX_EMP_POST1_LVL, 190 + [QPHY_TX_HIGHZ_DRVR_EN] = QSERDES_V6_TX_HIGHZ_DRVR_EN, 191 + [QPHY_TX_TRANSCEIVER_BIAS_EN] = QSERDES_V6_TX_TRANSCEIVER_BIAS_EN, 157 192 }; 158 193 159 194 static const struct qmp_phy_init_tbl qmp_v3_usb3_serdes_tbl[] = { ··· 1358 1271 int (*calibrate_dp_phy)(struct qmp_combo *qmp); 1359 1272 void (*dp_aux_init)(struct qmp_combo *qmp); 1360 1273 1361 - /* clock ids to be requested */ 1362 - const char * const *clk_list; 1363 - int num_clks; 1364 1274 /* resets to be requested */ 1365 1275 const char * const *reset_list; 1366 1276 int num_resets; ··· 1399 1315 1400 1316 struct clk *pipe_clk; 1401 1317 struct clk_bulk_data *clks; 1318 + int num_clks; 1402 1319 struct reset_control_bulk_data *resets; 1403 1320 struct regulator_bulk_data *vregs; 1404 1321 ··· 1435 1350 static int qmp_v4_configure_dp_phy(struct qmp_combo *qmp); 1436 1351 static int qmp_v4_calibrate_dp_phy(struct qmp_combo *qmp); 1437 1352 1438 - static int qmp_v5_configure_dp_phy(struct qmp_combo *qmp); 1439 - 1440 - static void qmp_v6_dp_aux_init(struct qmp_combo *qmp); 1441 - static int qmp_v6_configure_dp_phy(struct qmp_combo *qmp); 1442 - 1443 1353 static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val) 1444 1354 { 1445 1355 u32 reg; ··· 1460 1380 } 1461 1381 1462 1382 /* list of clocks required by phy */ 1463 - static const char * const qmp_v3_phy_clk_l[] = { 1383 + static const char * const qmp_combo_phy_clk_l[] = { 1464 1384 "aux", "cfg_ahb", "ref", "com_aux", 1465 - }; 1466 - 1467 - static const char * const qmp_v4_phy_clk_l[] = { 1468 - "aux", "ref", "com_aux", 1469 - }; 1470 - 1471 - /* the primary usb3 phy on sm8250 doesn't have a ref clock */ 1472 - static const char * const qmp_v4_sm8250_usbphy_clk_l[] = { 1473 - "aux", "ref_clk_src", "com_aux" 1474 1385 }; 1475 1386 1476 1387 /* list of resets */ ··· 1504 1433 }; 1505 1434 1506 1435 static const struct qmp_phy_cfg sc7180_usb3dpphy_cfg = { 1436 + .offsets = &qmp_combo_offsets_v3, 1437 + 1507 1438 .serdes_tbl = qmp_v3_usb3_serdes_tbl, 1508 1439 .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl), 1509 1440 .tx_tbl = qmp_v3_usb3_tx_tbl, ··· 1539 1466 .configure_dp_phy = qmp_v3_configure_dp_phy, 1540 1467 .calibrate_dp_phy = qmp_v3_calibrate_dp_phy, 1541 1468 1542 - .clk_list = qmp_v3_phy_clk_l, 1543 - .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l), 1544 1469 .reset_list = sc7180_usb3phy_reset_l, 1545 1470 .num_resets = ARRAY_SIZE(sc7180_usb3phy_reset_l), 1546 1471 .vreg_list = qmp_phy_vreg_l, ··· 1549 1478 }; 1550 1479 1551 1480 static const struct qmp_phy_cfg sdm845_usb3dpphy_cfg = { 1481 + .offsets = &qmp_combo_offsets_v3, 1482 + 1552 1483 .serdes_tbl = qmp_v3_usb3_serdes_tbl, 1553 1484 .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl), 1554 1485 .tx_tbl = qmp_v3_usb3_tx_tbl, ··· 1584 1511 .configure_dp_phy = qmp_v3_configure_dp_phy, 1585 1512 .calibrate_dp_phy = qmp_v3_calibrate_dp_phy, 1586 1513 1587 - .clk_list = qmp_v3_phy_clk_l, 1588 - .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l), 1589 1514 .reset_list = msm8996_usb3phy_reset_l, 1590 1515 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 1591 1516 .vreg_list = qmp_phy_vreg_l, ··· 1594 1523 }; 1595 1524 1596 1525 static const struct qmp_phy_cfg sc8180x_usb3dpphy_cfg = { 1526 + .offsets = &qmp_combo_offsets_v3, 1527 + 1597 1528 .serdes_tbl = sm8150_usb3_serdes_tbl, 1598 1529 .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl), 1599 1530 .tx_tbl = sm8150_usb3_tx_tbl, ··· 1631 1558 .configure_dp_phy = qmp_v4_configure_dp_phy, 1632 1559 .calibrate_dp_phy = qmp_v4_calibrate_dp_phy, 1633 1560 1634 - .clk_list = qmp_v4_phy_clk_l, 1635 - .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l), 1636 1561 .reset_list = msm8996_usb3phy_reset_l, 1637 1562 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 1638 1563 .vreg_list = qmp_phy_vreg_l, 1639 1564 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1640 - .regs = qmp_v4_usb3phy_regs_layout, 1565 + .regs = qmp_v45_usb3phy_regs_layout, 1641 1566 .pcs_usb_offset = 0x300, 1642 1567 1643 1568 .has_pwrdn_delay = true, ··· 1674 1603 1675 1604 .dp_aux_init = qmp_v4_dp_aux_init, 1676 1605 .configure_dp_tx = qmp_v4_configure_dp_tx, 1677 - .configure_dp_phy = qmp_v5_configure_dp_phy, 1606 + .configure_dp_phy = qmp_v4_configure_dp_phy, 1678 1607 .calibrate_dp_phy = qmp_v4_calibrate_dp_phy, 1679 1608 1680 - .clk_list = qmp_v4_phy_clk_l, 1681 - .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l), 1682 1609 .reset_list = msm8996_usb3phy_reset_l, 1683 1610 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 1684 1611 .vreg_list = qmp_phy_vreg_l, 1685 1612 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1686 - .regs = qmp_v4_usb3phy_regs_layout, 1613 + .regs = qmp_v5_5nm_usb3phy_regs_layout, 1687 1614 }; 1688 1615 1689 1616 static const struct qmp_phy_cfg sm6350_usb3dpphy_cfg = { ··· 1720 1651 .configure_dp_phy = qmp_v3_configure_dp_phy, 1721 1652 .calibrate_dp_phy = qmp_v3_calibrate_dp_phy, 1722 1653 1723 - .clk_list = qmp_v4_phy_clk_l, 1724 - .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l), 1725 1654 .reset_list = msm8996_usb3phy_reset_l, 1726 1655 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 1727 1656 .vreg_list = qmp_phy_vreg_l, ··· 1728 1661 }; 1729 1662 1730 1663 static const struct qmp_phy_cfg sm8250_usb3dpphy_cfg = { 1664 + .offsets = &qmp_combo_offsets_v3, 1665 + 1731 1666 .serdes_tbl = sm8150_usb3_serdes_tbl, 1732 1667 .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl), 1733 1668 .tx_tbl = sm8250_usb3_tx_tbl, ··· 1765 1696 .configure_dp_phy = qmp_v4_configure_dp_phy, 1766 1697 .calibrate_dp_phy = qmp_v4_calibrate_dp_phy, 1767 1698 1768 - .clk_list = qmp_v4_sm8250_usbphy_clk_l, 1769 - .num_clks = ARRAY_SIZE(qmp_v4_sm8250_usbphy_clk_l), 1770 1699 .reset_list = msm8996_usb3phy_reset_l, 1771 1700 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 1772 1701 .vreg_list = qmp_phy_vreg_l, 1773 1702 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1774 - .regs = qmp_v4_usb3phy_regs_layout, 1703 + .regs = qmp_v45_usb3phy_regs_layout, 1775 1704 .pcs_usb_offset = 0x300, 1776 1705 1777 1706 .has_pwrdn_delay = true, ··· 1813 1746 .configure_dp_phy = qmp_v4_configure_dp_phy, 1814 1747 .calibrate_dp_phy = qmp_v4_calibrate_dp_phy, 1815 1748 1816 - .clk_list = qmp_v4_phy_clk_l, 1817 - .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l), 1818 1749 .reset_list = msm8996_usb3phy_reset_l, 1819 1750 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 1820 1751 .vreg_list = qmp_phy_vreg_l, 1821 1752 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1822 - .regs = qmp_v4_usb3phy_regs_layout, 1753 + .regs = qmp_v45_usb3phy_regs_layout, 1823 1754 1824 1755 .has_pwrdn_delay = true, 1825 1756 }; ··· 1855 1790 .swing_hbr3_hbr2 = &qmp_dp_v5_voltage_swing_hbr3_hbr2, 1856 1791 .pre_emphasis_hbr3_hbr2 = &qmp_dp_v5_pre_emphasis_hbr3_hbr2, 1857 1792 1858 - .dp_aux_init = qmp_v6_dp_aux_init, 1793 + .dp_aux_init = qmp_v4_dp_aux_init, 1859 1794 .configure_dp_tx = qmp_v4_configure_dp_tx, 1860 - .configure_dp_phy = qmp_v6_configure_dp_phy, 1795 + .configure_dp_phy = qmp_v4_configure_dp_phy, 1861 1796 .calibrate_dp_phy = qmp_v4_calibrate_dp_phy, 1862 1797 1863 - .regs = qmp_v4_usb3phy_regs_layout, 1864 - .clk_list = qmp_v4_phy_clk_l, 1865 - .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l), 1798 + .regs = qmp_v6_usb3phy_regs_layout, 1866 1799 .reset_list = msm8996_usb3phy_reset_l, 1867 1800 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 1868 1801 .vreg_list = qmp_phy_vreg_l, ··· 1928 1865 1929 1866 static void qmp_v3_dp_aux_init(struct qmp_combo *qmp) 1930 1867 { 1868 + const struct qmp_phy_cfg *cfg = qmp->cfg; 1869 + 1931 1870 writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN | 1932 1871 DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN, 1933 1872 qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL); ··· 1937 1872 /* Turn on BIAS current for PHY/PLL */ 1938 1873 writel(QSERDES_V3_COM_BIAS_EN | QSERDES_V3_COM_BIAS_EN_MUX | 1939 1874 QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL, 1940 - qmp->dp_serdes + QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN); 1875 + qmp->dp_serdes + cfg->regs[QPHY_COM_BIAS_EN_CLKBUFLR_EN]); 1941 1876 1942 1877 writel(DP_PHY_PD_CTL_PSR_PWRDN, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL); 1943 1878 ··· 1951 1886 QSERDES_V3_COM_BIAS_EN_MUX | QSERDES_V3_COM_CLKBUF_R_EN | 1952 1887 QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL | 1953 1888 QSERDES_V3_COM_CLKBUF_RX_DRIVE_L, 1954 - qmp->dp_serdes + QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN); 1889 + qmp->dp_serdes + cfg->regs[QPHY_COM_BIAS_EN_CLKBUFLR_EN]); 1955 1890 1956 1891 writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0); 1957 1892 writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1); ··· 1971 1906 qmp->dp_dp_phy + QSERDES_V3_DP_PHY_AUX_INTERRUPT_MASK); 1972 1907 } 1973 1908 1974 - static int qmp_combo_configure_dp_swing(struct qmp_combo *qmp, 1975 - unsigned int drv_lvl_reg, unsigned int emp_post_reg) 1909 + static int qmp_combo_configure_dp_swing(struct qmp_combo *qmp) 1976 1910 { 1977 1911 const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; 1978 1912 const struct qmp_phy_cfg *cfg = qmp->cfg; ··· 2000 1936 voltage_swing_cfg |= DP_PHY_TXn_TX_DRV_LVL_MUX_EN; 2001 1937 pre_emphasis_cfg |= DP_PHY_TXn_TX_EMP_POST1_LVL_MUX_EN; 2002 1938 2003 - writel(voltage_swing_cfg, qmp->dp_tx + drv_lvl_reg); 2004 - writel(pre_emphasis_cfg, qmp->dp_tx + emp_post_reg); 2005 - writel(voltage_swing_cfg, qmp->dp_tx2 + drv_lvl_reg); 2006 - writel(pre_emphasis_cfg, qmp->dp_tx2 + emp_post_reg); 1939 + writel(voltage_swing_cfg, qmp->dp_tx + cfg->regs[QPHY_TX_TX_DRV_LVL]); 1940 + writel(pre_emphasis_cfg, qmp->dp_tx + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]); 1941 + writel(voltage_swing_cfg, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_DRV_LVL]); 1942 + writel(pre_emphasis_cfg, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]); 2007 1943 2008 1944 return 0; 2009 1945 } ··· 2013 1949 const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; 2014 1950 u32 bias_en, drvr_en; 2015 1951 2016 - if (qmp_combo_configure_dp_swing(qmp, QSERDES_V3_TX_TX_DRV_LVL, 2017 - QSERDES_V3_TX_TX_EMP_POST1_LVL) < 0) 1952 + if (qmp_combo_configure_dp_swing(qmp) < 0) 2018 1953 return; 2019 1954 2020 1955 if (dp_opts->lanes == 1) { ··· 2054 1991 return reverse; 2055 1992 } 2056 1993 2057 - static int qmp_v3_configure_dp_phy(struct qmp_combo *qmp) 1994 + static int qmp_combo_configure_dp_clocks(struct qmp_combo *qmp) 2058 1995 { 2059 1996 const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; 2060 - u32 phy_vco_div, status; 1997 + u32 phy_vco_div; 2061 1998 unsigned long pixel_freq; 2062 - 2063 - qmp_combo_configure_dp_mode(qmp); 2064 - 2065 - writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX0_TX1_LANE_CTL); 2066 - writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX2_TX3_LANE_CTL); 2067 - 2068 - switch (dp_opts->link_rate) { 2069 - case 1620: 2070 - phy_vco_div = 0x1; 2071 - pixel_freq = 1620000000UL / 2; 2072 - break; 2073 - case 2700: 2074 - phy_vco_div = 0x1; 2075 - pixel_freq = 2700000000UL / 2; 2076 - break; 2077 - case 5400: 2078 - phy_vco_div = 0x2; 2079 - pixel_freq = 5400000000UL / 4; 2080 - break; 2081 - case 8100: 2082 - phy_vco_div = 0x0; 2083 - pixel_freq = 8100000000UL / 6; 2084 - break; 2085 - default: 2086 - /* Other link rates aren't supported */ 2087 - return -EINVAL; 2088 - } 2089 - writel(phy_vco_div, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_VCO_DIV); 2090 - 2091 - clk_set_rate(qmp->dp_link_hw.clk, dp_opts->link_rate * 100000); 2092 - clk_set_rate(qmp->dp_pixel_hw.clk, pixel_freq); 2093 - 2094 - writel(0x04, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2); 2095 - writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2096 - writel(0x05, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2097 - writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2098 - writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2099 - 2100 - writel(0x20, qmp->dp_serdes + QSERDES_V3_COM_RESETSM_CNTRL); 2101 - 2102 - if (readl_poll_timeout(qmp->dp_serdes + QSERDES_V3_COM_C_READY_STATUS, 2103 - status, 2104 - ((status & BIT(0)) > 0), 2105 - 500, 2106 - 10000)) 2107 - return -ETIMEDOUT; 2108 - 2109 - writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2110 - 2111 - if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V3_DP_PHY_STATUS, 2112 - status, 2113 - ((status & BIT(1)) > 0), 2114 - 500, 2115 - 10000)) 2116 - return -ETIMEDOUT; 2117 - 2118 - writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2119 - udelay(2000); 2120 - writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2121 - 2122 - return readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V3_DP_PHY_STATUS, 2123 - status, 2124 - ((status & BIT(1)) > 0), 2125 - 500, 2126 - 10000); 2127 - } 2128 - 2129 - /* 2130 - * We need to calibrate the aux setting here as many times 2131 - * as the caller tries 2132 - */ 2133 - static int qmp_v3_calibrate_dp_phy(struct qmp_combo *qmp) 2134 - { 2135 - static const u8 cfg1_settings[] = { 0x13, 0x23, 0x1d }; 2136 - u8 val; 2137 - 2138 - qmp->dp_aux_cfg++; 2139 - qmp->dp_aux_cfg %= ARRAY_SIZE(cfg1_settings); 2140 - val = cfg1_settings[qmp->dp_aux_cfg]; 2141 - 2142 - writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1); 2143 - 2144 - return 0; 2145 - } 2146 - 2147 - static void qmp_v4_dp_aux_init(struct qmp_combo *qmp) 2148 - { 2149 - writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_PSR_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN | 2150 - DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN, 2151 - qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL); 2152 - 2153 - /* Turn on BIAS current for PHY/PLL */ 2154 - writel(0x17, qmp->dp_serdes + QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN); 2155 - 2156 - writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0); 2157 - writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1); 2158 - writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2); 2159 - writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG3); 2160 - writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG4); 2161 - writel(0x26, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG5); 2162 - writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG6); 2163 - writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG7); 2164 - writel(0xb7, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG8); 2165 - writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG9); 2166 - qmp->dp_aux_cfg = 0; 2167 - 2168 - writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK | 2169 - PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK | 2170 - PHY_AUX_REQ_ERR_MASK, 2171 - qmp->dp_dp_phy + QSERDES_V4_DP_PHY_AUX_INTERRUPT_MASK); 2172 - } 2173 - 2174 - static void qmp_v6_dp_aux_init(struct qmp_combo *qmp) 2175 - { 2176 - writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_PSR_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN | 2177 - DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN, 2178 - qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL); 2179 - 2180 - /* Turn on BIAS current for PHY/PLL */ 2181 - writel(0x17, qmp->dp_serdes + QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN); 2182 - 2183 - writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0); 2184 - writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1); 2185 - writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2); 2186 - writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG3); 2187 - writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG4); 2188 - writel(0x26, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG5); 2189 - writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG6); 2190 - writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG7); 2191 - writel(0xb7, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG8); 2192 - writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG9); 2193 - qmp->dp_aux_cfg = 0; 2194 - 2195 - writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK | 2196 - PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK | 2197 - PHY_AUX_REQ_ERR_MASK, 2198 - qmp->dp_dp_phy + QSERDES_V4_DP_PHY_AUX_INTERRUPT_MASK); 2199 - } 2200 - 2201 - static void qmp_v4_configure_dp_tx(struct qmp_combo *qmp) 2202 - { 2203 - /* Program default values before writing proper values */ 2204 - writel(0x27, qmp->dp_tx + QSERDES_V4_TX_TX_DRV_LVL); 2205 - writel(0x27, qmp->dp_tx2 + QSERDES_V4_TX_TX_DRV_LVL); 2206 - 2207 - writel(0x20, qmp->dp_tx + QSERDES_V4_TX_TX_EMP_POST1_LVL); 2208 - writel(0x20, qmp->dp_tx2 + QSERDES_V4_TX_TX_EMP_POST1_LVL); 2209 - 2210 - qmp_combo_configure_dp_swing(qmp, QSERDES_V4_TX_TX_DRV_LVL, 2211 - QSERDES_V4_TX_TX_EMP_POST1_LVL); 2212 - } 2213 - 2214 - static int qmp_v456_configure_dp_phy(struct qmp_combo *qmp, 2215 - unsigned int com_resetm_ctrl_reg, 2216 - unsigned int com_c_ready_status_reg, 2217 - unsigned int com_cmn_status_reg, 2218 - unsigned int dp_phy_status_reg) 2219 - { 2220 - const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; 2221 - u32 phy_vco_div, status; 2222 - unsigned long pixel_freq; 2223 - 2224 - writel(0x0f, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_CFG_1); 2225 - 2226 - qmp_combo_configure_dp_mode(qmp); 2227 - 2228 - writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1); 2229 - writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2); 2230 - 2231 - writel(0x05, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_TX0_TX1_LANE_CTL); 2232 - writel(0x05, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_TX2_TX3_LANE_CTL); 2233 1999 2234 2000 switch (dp_opts->link_rate) { 2235 2001 case 1620: ··· 2086 2194 clk_set_rate(qmp->dp_link_hw.clk, dp_opts->link_rate * 100000); 2087 2195 clk_set_rate(qmp->dp_pixel_hw.clk, pixel_freq); 2088 2196 2197 + return 0; 2198 + } 2199 + 2200 + static int qmp_v3_configure_dp_phy(struct qmp_combo *qmp) 2201 + { 2202 + const struct qmp_phy_cfg *cfg = qmp->cfg; 2203 + u32 status; 2204 + int ret; 2205 + 2206 + qmp_combo_configure_dp_mode(qmp); 2207 + 2208 + writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX0_TX1_LANE_CTL); 2209 + writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX2_TX3_LANE_CTL); 2210 + 2211 + ret = qmp_combo_configure_dp_clocks(qmp); 2212 + if (ret) 2213 + return ret; 2214 + 2215 + writel(0x04, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2); 2089 2216 writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2090 2217 writel(0x05, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2091 2218 writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2092 2219 writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2093 2220 2094 - writel(0x20, qmp->dp_serdes + com_resetm_ctrl_reg); 2221 + writel(0x20, qmp->dp_serdes + cfg->regs[QPHY_COM_RESETSM_CNTRL]); 2095 2222 2096 - if (readl_poll_timeout(qmp->dp_serdes + com_c_ready_status_reg, 2223 + if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_C_READY_STATUS], 2097 2224 status, 2098 2225 ((status & BIT(0)) > 0), 2099 2226 500, 2100 2227 10000)) 2101 2228 return -ETIMEDOUT; 2102 2229 2103 - if (readl_poll_timeout(qmp->dp_serdes + com_cmn_status_reg, 2230 + writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2231 + 2232 + if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS], 2233 + status, 2234 + ((status & BIT(1)) > 0), 2235 + 500, 2236 + 10000)) 2237 + return -ETIMEDOUT; 2238 + 2239 + writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2240 + udelay(2000); 2241 + writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2242 + 2243 + return readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS], 2244 + status, 2245 + ((status & BIT(1)) > 0), 2246 + 500, 2247 + 10000); 2248 + } 2249 + 2250 + /* 2251 + * We need to calibrate the aux setting here as many times 2252 + * as the caller tries 2253 + */ 2254 + static int qmp_v3_calibrate_dp_phy(struct qmp_combo *qmp) 2255 + { 2256 + static const u8 cfg1_settings[] = { 0x13, 0x23, 0x1d }; 2257 + u8 val; 2258 + 2259 + qmp->dp_aux_cfg++; 2260 + qmp->dp_aux_cfg %= ARRAY_SIZE(cfg1_settings); 2261 + val = cfg1_settings[qmp->dp_aux_cfg]; 2262 + 2263 + writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1); 2264 + 2265 + return 0; 2266 + } 2267 + 2268 + static void qmp_v4_dp_aux_init(struct qmp_combo *qmp) 2269 + { 2270 + const struct qmp_phy_cfg *cfg = qmp->cfg; 2271 + 2272 + writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_PSR_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN | 2273 + DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN, 2274 + qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL); 2275 + 2276 + /* Turn on BIAS current for PHY/PLL */ 2277 + writel(0x17, qmp->dp_serdes + cfg->regs[QPHY_COM_BIAS_EN_CLKBUFLR_EN]); 2278 + 2279 + writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0); 2280 + writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1); 2281 + writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2); 2282 + writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG3); 2283 + writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG4); 2284 + writel(0x26, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG5); 2285 + writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG6); 2286 + writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG7); 2287 + writel(0xb7, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG8); 2288 + writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG9); 2289 + qmp->dp_aux_cfg = 0; 2290 + 2291 + writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK | 2292 + PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK | 2293 + PHY_AUX_REQ_ERR_MASK, 2294 + qmp->dp_dp_phy + QSERDES_V4_DP_PHY_AUX_INTERRUPT_MASK); 2295 + } 2296 + 2297 + static void qmp_v4_configure_dp_tx(struct qmp_combo *qmp) 2298 + { 2299 + const struct qmp_phy_cfg *cfg = qmp->cfg; 2300 + 2301 + /* Program default values before writing proper values */ 2302 + writel(0x27, qmp->dp_tx + cfg->regs[QPHY_TX_TX_DRV_LVL]); 2303 + writel(0x27, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_DRV_LVL]); 2304 + 2305 + writel(0x20, qmp->dp_tx + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]); 2306 + writel(0x20, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]); 2307 + 2308 + qmp_combo_configure_dp_swing(qmp); 2309 + } 2310 + 2311 + static int qmp_v456_configure_dp_phy(struct qmp_combo *qmp) 2312 + { 2313 + const struct qmp_phy_cfg *cfg = qmp->cfg; 2314 + u32 status; 2315 + int ret; 2316 + 2317 + writel(0x0f, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_CFG_1); 2318 + 2319 + qmp_combo_configure_dp_mode(qmp); 2320 + 2321 + writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1); 2322 + writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2); 2323 + 2324 + writel(0x05, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_TX0_TX1_LANE_CTL); 2325 + writel(0x05, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_TX2_TX3_LANE_CTL); 2326 + 2327 + ret = qmp_combo_configure_dp_clocks(qmp); 2328 + if (ret) 2329 + return ret; 2330 + 2331 + writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2332 + writel(0x05, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2333 + writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2334 + writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2335 + 2336 + writel(0x20, qmp->dp_serdes + cfg->regs[QPHY_COM_RESETSM_CNTRL]); 2337 + 2338 + if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_C_READY_STATUS], 2104 2339 status, 2105 2340 ((status & BIT(0)) > 0), 2106 2341 500, 2107 2342 10000)) 2108 2343 return -ETIMEDOUT; 2109 2344 2110 - if (readl_poll_timeout(qmp->dp_serdes + com_cmn_status_reg, 2345 + if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_CMN_STATUS], 2346 + status, 2347 + ((status & BIT(0)) > 0), 2348 + 500, 2349 + 10000)) 2350 + return -ETIMEDOUT; 2351 + 2352 + if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_CMN_STATUS], 2111 2353 status, 2112 2354 ((status & BIT(1)) > 0), 2113 2355 500, ··· 2250 2224 2251 2225 writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2252 2226 2253 - if (readl_poll_timeout(qmp->dp_dp_phy + dp_phy_status_reg, 2227 + if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS], 2254 2228 status, 2255 2229 ((status & BIT(0)) > 0), 2256 2230 500, 2257 2231 10000)) 2258 2232 return -ETIMEDOUT; 2259 2233 2260 - if (readl_poll_timeout(qmp->dp_dp_phy + dp_phy_status_reg, 2234 + if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS], 2261 2235 status, 2262 2236 ((status & BIT(1)) > 0), 2263 2237 500, ··· 2269 2243 2270 2244 static int qmp_v4_configure_dp_phy(struct qmp_combo *qmp) 2271 2245 { 2246 + const struct qmp_phy_cfg *cfg = qmp->cfg; 2272 2247 bool reverse = (qmp->orientation == TYPEC_ORIENTATION_REVERSE); 2273 2248 const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; 2274 2249 u32 bias0_en, drvr0_en, bias1_en, drvr1_en; 2275 2250 u32 status; 2276 2251 int ret; 2277 2252 2278 - ret = qmp_v456_configure_dp_phy(qmp, QSERDES_V4_COM_RESETSM_CNTRL, 2279 - QSERDES_V4_COM_C_READY_STATUS, 2280 - QSERDES_V4_COM_CMN_STATUS, 2281 - QSERDES_V4_DP_PHY_STATUS); 2253 + ret = qmp_v456_configure_dp_phy(qmp); 2282 2254 if (ret < 0) 2283 2255 return ret; 2284 2256 ··· 2302 2278 drvr1_en = 0x10; 2303 2279 } 2304 2280 2305 - writel(drvr0_en, qmp->dp_tx + QSERDES_V4_TX_HIGHZ_DRVR_EN); 2306 - writel(bias0_en, qmp->dp_tx + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN); 2307 - writel(drvr1_en, qmp->dp_tx2 + QSERDES_V4_TX_HIGHZ_DRVR_EN); 2308 - writel(bias1_en, qmp->dp_tx2 + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN); 2281 + writel(drvr0_en, qmp->dp_tx + cfg->regs[QPHY_TX_HIGHZ_DRVR_EN]); 2282 + writel(bias0_en, qmp->dp_tx + cfg->regs[QPHY_TX_TRANSCEIVER_BIAS_EN]); 2283 + writel(drvr1_en, qmp->dp_tx2 + cfg->regs[QPHY_TX_HIGHZ_DRVR_EN]); 2284 + writel(bias1_en, qmp->dp_tx2 + cfg->regs[QPHY_TX_TRANSCEIVER_BIAS_EN]); 2309 2285 2310 2286 writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2311 2287 udelay(2000); 2312 2288 writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2313 2289 2314 - if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V4_DP_PHY_STATUS, 2290 + if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS], 2315 2291 status, 2316 2292 ((status & BIT(1)) > 0), 2317 2293 500, 2318 2294 10000)) 2319 2295 return -ETIMEDOUT; 2320 2296 2321 - writel(0x0a, qmp->dp_tx + QSERDES_V4_TX_TX_POL_INV); 2322 - writel(0x0a, qmp->dp_tx2 + QSERDES_V4_TX_TX_POL_INV); 2297 + writel(0x0a, qmp->dp_tx + cfg->regs[QPHY_TX_TX_POL_INV]); 2298 + writel(0x0a, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_POL_INV]); 2323 2299 2324 - writel(0x27, qmp->dp_tx + QSERDES_V4_TX_TX_DRV_LVL); 2325 - writel(0x27, qmp->dp_tx2 + QSERDES_V4_TX_TX_DRV_LVL); 2300 + writel(0x27, qmp->dp_tx + cfg->regs[QPHY_TX_TX_DRV_LVL]); 2301 + writel(0x27, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_DRV_LVL]); 2326 2302 2327 - writel(0x20, qmp->dp_tx + QSERDES_V4_TX_TX_EMP_POST1_LVL); 2328 - writel(0x20, qmp->dp_tx2 + QSERDES_V4_TX_TX_EMP_POST1_LVL); 2329 - 2330 - return 0; 2331 - } 2332 - 2333 - static int qmp_v5_configure_dp_phy(struct qmp_combo *qmp) 2334 - { 2335 - bool reverse = (qmp->orientation == TYPEC_ORIENTATION_REVERSE); 2336 - const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; 2337 - u32 bias0_en, drvr0_en, bias1_en, drvr1_en; 2338 - u32 status; 2339 - int ret; 2340 - 2341 - ret = qmp_v456_configure_dp_phy(qmp, QSERDES_V4_COM_RESETSM_CNTRL, 2342 - QSERDES_V4_COM_C_READY_STATUS, 2343 - QSERDES_V4_COM_CMN_STATUS, 2344 - QSERDES_V4_DP_PHY_STATUS); 2345 - if (ret < 0) 2346 - return ret; 2347 - 2348 - if (dp_opts->lanes == 1) { 2349 - bias0_en = reverse ? 0x3e : 0x1a; 2350 - drvr0_en = reverse ? 0x13 : 0x10; 2351 - bias1_en = reverse ? 0x15 : 0x3e; 2352 - drvr1_en = reverse ? 0x10 : 0x13; 2353 - } else if (dp_opts->lanes == 2) { 2354 - bias0_en = reverse ? 0x3f : 0x15; 2355 - drvr0_en = 0x10; 2356 - bias1_en = reverse ? 0x15 : 0x3f; 2357 - drvr1_en = 0x10; 2358 - } else { 2359 - bias0_en = 0x3f; 2360 - bias1_en = 0x3f; 2361 - drvr0_en = 0x10; 2362 - drvr1_en = 0x10; 2363 - } 2364 - 2365 - writel(drvr0_en, qmp->dp_tx + QSERDES_V5_5NM_TX_HIGHZ_DRVR_EN); 2366 - writel(bias0_en, qmp->dp_tx + QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN); 2367 - writel(drvr1_en, qmp->dp_tx2 + QSERDES_V5_5NM_TX_HIGHZ_DRVR_EN); 2368 - writel(bias1_en, qmp->dp_tx2 + QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN); 2369 - 2370 - writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2371 - udelay(2000); 2372 - writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2373 - 2374 - if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V4_DP_PHY_STATUS, 2375 - status, 2376 - ((status & BIT(1)) > 0), 2377 - 500, 2378 - 10000)) 2379 - return -ETIMEDOUT; 2380 - 2381 - writel(0x0a, qmp->dp_tx + QSERDES_V5_5NM_TX_TX_POL_INV); 2382 - writel(0x0a, qmp->dp_tx2 + QSERDES_V5_5NM_TX_TX_POL_INV); 2383 - 2384 - writel(0x27, qmp->dp_tx + QSERDES_V5_5NM_TX_TX_DRV_LVL); 2385 - writel(0x27, qmp->dp_tx2 + QSERDES_V5_5NM_TX_TX_DRV_LVL); 2386 - 2387 - writel(0x20, qmp->dp_tx + QSERDES_V5_5NM_TX_TX_EMP_POST1_LVL); 2388 - writel(0x20, qmp->dp_tx2 + QSERDES_V5_5NM_TX_TX_EMP_POST1_LVL); 2303 + writel(0x20, qmp->dp_tx + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]); 2304 + writel(0x20, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]); 2389 2305 2390 2306 return 0; 2391 - } 2392 - 2393 - static int qmp_v6_configure_dp_phy(struct qmp_combo *qmp) 2394 - { 2395 - bool reverse = (qmp->orientation == TYPEC_ORIENTATION_REVERSE); 2396 - const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts; 2397 - u32 bias0_en, drvr0_en, bias1_en, drvr1_en; 2398 - u32 status; 2399 - int ret; 2400 - 2401 - ret = qmp_v456_configure_dp_phy(qmp, QSERDES_V6_COM_RESETSM_CNTRL, 2402 - QSERDES_V6_COM_C_READY_STATUS, 2403 - QSERDES_V6_COM_CMN_STATUS, 2404 - QSERDES_V6_DP_PHY_STATUS); 2405 - if (ret < 0) 2406 - return ret; 2407 - 2408 - if (dp_opts->lanes == 1) { 2409 - bias0_en = reverse ? 0x3e : 0x1a; 2410 - drvr0_en = reverse ? 0x13 : 0x10; 2411 - bias1_en = reverse ? 0x15 : 0x3e; 2412 - drvr1_en = reverse ? 0x10 : 0x13; 2413 - } else if (dp_opts->lanes == 2) { 2414 - bias0_en = reverse ? 0x3f : 0x15; 2415 - drvr0_en = 0x10; 2416 - bias1_en = reverse ? 0x15 : 0x3f; 2417 - drvr1_en = 0x10; 2418 - } else { 2419 - bias0_en = 0x3f; 2420 - bias1_en = 0x3f; 2421 - drvr0_en = 0x10; 2422 - drvr1_en = 0x10; 2423 - } 2424 - 2425 - writel(drvr0_en, qmp->dp_tx + QSERDES_V4_TX_HIGHZ_DRVR_EN); 2426 - writel(bias0_en, qmp->dp_tx + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN); 2427 - writel(drvr1_en, qmp->dp_tx2 + QSERDES_V4_TX_HIGHZ_DRVR_EN); 2428 - writel(bias1_en, qmp->dp_tx2 + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN); 2429 - 2430 - writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2431 - udelay(2000); 2432 - writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG); 2433 - 2434 - if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V6_DP_PHY_STATUS, 2435 - status, 2436 - ((status & BIT(1)) > 0), 2437 - 500, 2438 - 10000)) 2439 - return -ETIMEDOUT; 2440 - 2441 - writel(0x0a, qmp->dp_tx + QSERDES_V4_TX_TX_POL_INV); 2442 - writel(0x0a, qmp->dp_tx2 + QSERDES_V4_TX_TX_POL_INV); 2443 - 2444 - writel(0x27, qmp->dp_tx + QSERDES_V4_TX_TX_DRV_LVL); 2445 - writel(0x27, qmp->dp_tx2 + QSERDES_V4_TX_TX_DRV_LVL); 2446 - 2447 - writel(0x20, qmp->dp_tx + QSERDES_V4_TX_TX_EMP_POST1_LVL); 2448 - writel(0x20, qmp->dp_tx2 + QSERDES_V4_TX_TX_EMP_POST1_LVL); 2449 2307 2450 2308 return 0; 2451 2309 } ··· 2413 2507 goto err_disable_regulators; 2414 2508 } 2415 2509 2416 - ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks); 2510 + ret = clk_bulk_prepare_enable(qmp->num_clks, qmp->clks); 2417 2511 if (ret) 2418 2512 goto err_assert_reset; 2419 2513 ··· 2463 2557 2464 2558 reset_control_bulk_assert(cfg->num_resets, qmp->resets); 2465 2559 2466 - clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks); 2560 + clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks); 2467 2561 2468 2562 regulator_bulk_disable(cfg->num_vregs, qmp->vregs); 2469 2563 ··· 2742 2836 static int __maybe_unused qmp_combo_runtime_suspend(struct device *dev) 2743 2837 { 2744 2838 struct qmp_combo *qmp = dev_get_drvdata(dev); 2745 - const struct qmp_phy_cfg *cfg = qmp->cfg; 2746 2839 2747 2840 dev_vdbg(dev, "Suspending QMP phy, mode:%d\n", qmp->mode); 2748 2841 ··· 2753 2848 qmp_combo_enable_autonomous_mode(qmp); 2754 2849 2755 2850 clk_disable_unprepare(qmp->pipe_clk); 2756 - clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks); 2851 + clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks); 2757 2852 2758 2853 return 0; 2759 2854 } ··· 2761 2856 static int __maybe_unused qmp_combo_runtime_resume(struct device *dev) 2762 2857 { 2763 2858 struct qmp_combo *qmp = dev_get_drvdata(dev); 2764 - const struct qmp_phy_cfg *cfg = qmp->cfg; 2765 2859 int ret = 0; 2766 2860 2767 2861 dev_vdbg(dev, "Resuming QMP phy, mode:%d\n", qmp->mode); ··· 2770 2866 return 0; 2771 2867 } 2772 2868 2773 - ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks); 2869 + ret = clk_bulk_prepare_enable(qmp->num_clks, qmp->clks); 2774 2870 if (ret) 2775 2871 return ret; 2776 2872 2777 2873 ret = clk_prepare_enable(qmp->pipe_clk); 2778 2874 if (ret) { 2779 2875 dev_err(dev, "pipe_clk enable failed, err=%d\n", ret); 2780 - clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks); 2876 + clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks); 2781 2877 return ret; 2782 2878 } 2783 2879 ··· 2848 2944 2849 2945 static int qmp_combo_clk_init(struct qmp_combo *qmp) 2850 2946 { 2851 - const struct qmp_phy_cfg *cfg = qmp->cfg; 2852 2947 struct device *dev = qmp->dev; 2853 - int num = cfg->num_clks; 2948 + int num = ARRAY_SIZE(qmp_combo_phy_clk_l); 2854 2949 int i; 2855 2950 2856 2951 qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL); ··· 2857 2954 return -ENOMEM; 2858 2955 2859 2956 for (i = 0; i < num; i++) 2860 - qmp->clks[i].id = cfg->clk_list[i]; 2957 + qmp->clks[i].id = qmp_combo_phy_clk_l[i]; 2861 2958 2862 - return devm_clk_bulk_get(dev, num, qmp->clks); 2959 + qmp->num_clks = num; 2960 + 2961 + return devm_clk_bulk_get_optional(dev, num, qmp->clks); 2863 2962 } 2864 2963 2865 2964 static void phy_clk_release_provider(void *res) ··· 3326 3421 if (ret) 3327 3422 return ret; 3328 3423 3424 + ret = devm_clk_bulk_get_all(qmp->dev, &qmp->clks); 3425 + if (ret < 0) 3426 + return ret; 3427 + 3428 + qmp->num_clks = ret; 3429 + 3329 3430 return 0; 3330 3431 } 3331 3432 ··· 3342 3431 const struct qmp_combo_offsets *offs = cfg->offsets; 3343 3432 struct device *dev = qmp->dev; 3344 3433 void __iomem *base; 3434 + int ret; 3345 3435 3346 3436 if (!offs) 3347 3437 return -EINVAL; ··· 3371 3459 qmp->dp_tx2 = base + offs->txb; 3372 3460 } 3373 3461 qmp->dp_dp_phy = base + offs->dp_dp_phy; 3462 + 3463 + ret = qmp_combo_clk_init(qmp); 3464 + if (ret) 3465 + return ret; 3374 3466 3375 3467 qmp->pipe_clk = devm_clk_get(dev, "usb3_pipe"); 3376 3468 if (IS_ERR(qmp->pipe_clk)) { ··· 3423 3507 return -EINVAL; 3424 3508 3425 3509 mutex_init(&qmp->phy_mutex); 3426 - 3427 - ret = qmp_combo_clk_init(qmp); 3428 - if (ret) 3429 - return ret; 3430 3510 3431 3511 ret = qmp_combo_reset_init(qmp); 3432 3512 if (ret) ··· 3515 3603 .data = &sc7180_usb3dpphy_cfg, 3516 3604 }, 3517 3605 { 3606 + .compatible = "qcom,sc7280-qmp-usb3-dp-phy", 3607 + .data = &sm8250_usb3dpphy_cfg, 3608 + }, 3609 + { 3518 3610 .compatible = "qcom,sc8180x-qmp-usb3-dp-phy", 3519 3611 .data = &sc8180x_usb3dpphy_cfg, 3520 3612 }, ··· 3533 3617 { 3534 3618 .compatible = "qcom,sm6350-qmp-usb3-dp-phy", 3535 3619 .data = &sm6350_usb3dpphy_cfg, 3620 + }, 3621 + { 3622 + .compatible = "qcom,sm8150-qmp-usb3-dp-phy", 3623 + .data = &sc8180x_usb3dpphy_cfg, 3536 3624 }, 3537 3625 { 3538 3626 .compatible = "qcom,sm8250-qmp-usb3-dp-phy",
-1
drivers/phy/qualcomm/phy-qcom-qmp-pcie-msm8996.c
··· 12 12 #include <linux/kernel.h> 13 13 #include <linux/module.h> 14 14 #include <linux/of.h> 15 - #include <linux/of_device.h> 16 15 #include <linux/of_address.h> 17 16 #include <linux/phy/phy.h> 18 17 #include <linux/platform_device.h>
+419 -64
drivers/phy/qualcomm/phy-qcom-qmp-pcie.c
··· 13 13 #include <linux/mfd/syscon.h> 14 14 #include <linux/module.h> 15 15 #include <linux/of.h> 16 - #include <linux/of_device.h> 17 16 #include <linux/of_address.h> 18 17 #include <linux/phy/pcie.h> 19 18 #include <linux/phy/phy.h> ··· 1909 1910 QMP_PHY_INIT_CFG(QPHY_PCIE_V6_20_PCS_G4_FOM_EQ_CONFIG5, 0xf2), 1910 1911 }; 1911 1912 1913 + static const struct qmp_phy_init_tbl sa8775p_qmp_gen4x2_pcie_serdes_alt_tbl[] = { 1914 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIAS_EN_CLKBUFLR_EN, 0x14), 1915 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_IVCO, 0x0f), 1916 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP_EN, 0x46), 1917 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP_CFG, 0x04), 1918 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAP, 0x02), 1919 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_SEL, 0x12), 1920 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_HS_SWITCH_SEL, 0x00), 1921 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORECLK_DIV_MODE0, 0x0a), 1922 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORECLK_DIV_MODE1, 0x04), 1923 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CMN_MISC1, 0x88), 1924 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORE_CLK_EN, 0x60), 1925 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CMN_CONFIG, 0x06), 1926 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CMN_MODE, 0x14), 1927 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_DC_LEVEL_CTRL, 0x0f), 1928 + }; 1929 + 1930 + static const struct qmp_phy_init_tbl sa8775p_qmp_gen4x2_pcie_rc_serdes_alt_tbl[] = { 1931 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_EN_CENTER, 0x00), 1932 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER1, 0x31), 1933 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER2, 0x01), 1934 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE1_MODE0, 0xde), 1935 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE2_MODE0, 0x07), 1936 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE1_MODE1, 0x97), 1937 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE2_MODE1, 0x0c), 1938 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CLK_ENABLE1, 0x90), 1939 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE0, 0x06), 1940 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE1, 0x06), 1941 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE0, 0x16), 1942 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE1, 0x16), 1943 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE0, 0x36), 1944 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE1, 0x36), 1945 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_EN_SEL, 0x08), 1946 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE0, 0x0a), 1947 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE0, 0x1a), 1948 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE1, 0x14), 1949 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE1, 0x34), 1950 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE0, 0x82), 1951 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE1, 0xd0), 1952 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START1_MODE0, 0x55), 1953 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START2_MODE0, 0x55), 1954 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START3_MODE0, 0x03), 1955 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START1_MODE1, 0x55), 1956 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START2_MODE1, 0x55), 1957 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START3_MODE1, 0x05), 1958 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CLK_SELECT, 0x34), 1959 + }; 1960 + 1961 + static const struct qmp_phy_init_tbl sa8775p_qmp_gen4x2_pcie_rx_alt_tbl[] = { 1962 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_UCDR_PI_CONTROLS, 0x16), 1963 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38), 1964 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B0, 0x9a), 1965 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B1, 0xb0), 1966 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B2, 0x92), 1967 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B3, 0xf0), 1968 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B4, 0x42), 1969 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B5, 0x99), 1970 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B6, 0x29), 1971 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B0, 0x9a), 1972 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B1, 0xfb), 1973 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B2, 0x92), 1974 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B3, 0xec), 1975 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B4, 0x43), 1976 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B5, 0xdd), 1977 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B6, 0x0d), 1978 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B0, 0xf3), 1979 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B1, 0xf8), 1980 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B2, 0xec), 1981 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B3, 0xd6), 1982 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B4, 0x83), 1983 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B5, 0xf5), 1984 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B6, 0x5e), 1985 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_PHPRE_CTRL, 0x20), 1986 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_AUX_DATA_THRESH_BIN_RATE_0_1, 0x3f), 1987 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_AUX_DATA_THRESH_BIN_RATE_2_3, 0x37), 1988 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_DFE_3, 0x00), 1989 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH1_RATE3, 0x1f), 1990 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH2_RATE3, 0x1f), 1991 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH3_RATE3, 0x1f), 1992 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH4_RATE3, 0x1f), 1993 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH5_RATE3, 0x1f), 1994 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH6_RATE3, 0x1f), 1995 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH1_RATE210, 0x1f), 1996 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH2_RATE210, 0x1f), 1997 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH3_RATE210, 0x1f), 1998 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_Q_PI_INTRINSIC_BIAS_RATE32, 0x09), 1999 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_UCDR_FO_GAIN_RATE2, 0x0c), 2000 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_UCDR_FO_GAIN_RATE3, 0x08), 2001 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_UCDR_SO_GAIN_RATE3, 0x04), 2002 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_VGA_CAL_CNTRL1, 0x04), 2003 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_VGA_CAL_MAN_VAL, 0x08), 2004 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0b), 2005 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x7c), 2006 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_IDAC_SAOFFSET, 0x10), 2007 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_DFE_DAC_ENABLE1, 0x00), 2008 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_GM_CAL, 0x05), 2009 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_TX_ADAPT_POST_THRESH1, 0x00), 2010 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_TX_ADAPT_POST_THRESH2, 0x1f), 2011 + }; 2012 + 2013 + static const struct qmp_phy_init_tbl sa8775p_qmp_gen4_pcie_tx_tbl[] = { 2014 + QMP_PHY_INIT_CFG(QSERDES_V5_20_TX_RES_CODE_LANE_OFFSET_TX, 0x1f), 2015 + QMP_PHY_INIT_CFG(QSERDES_V5_20_TX_RES_CODE_LANE_OFFSET_RX, 0x07), 2016 + QMP_PHY_INIT_CFG(QSERDES_V5_20_TX_LANE_MODE_1, 0x05), 2017 + QMP_PHY_INIT_CFG(QSERDES_V5_20_TX_LANE_MODE_2, 0xf6), 2018 + QMP_PHY_INIT_CFG(QSERDES_V5_20_TX_LANE_MODE_3, 0x0f), 2019 + }; 2020 + 2021 + static const struct qmp_phy_init_tbl sa8775p_qmp_gen4_pcie_pcs_misc_tbl[] = { 2022 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_PCIE_EQ_CONFIG1, 0x16), 2023 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_PCIE_G4_EQ_CONFIG5, 0x02), 2024 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_PCIE_G4_PRE_GAIN, 0x2e), 2025 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_PCIE_RX_MARGINING_CONFIG3, 0x28), 2026 + }; 2027 + 2028 + static const struct qmp_phy_init_tbl sa8775p_qmp_gen4_pcie_rc_pcs_misc_tbl[] = { 2029 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_PCIE_POWER_STATE_CONFIG2, 0x1d), 2030 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_PCIE_ENDPOINT_REFCLK_DRIVE, 0xc1), 2031 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_PCIE_OSC_DTCT_ACTIONS, 0x00), 2032 + }; 2033 + 2034 + static const struct qmp_phy_init_tbl sa8775p_qmp_gen4x2_pcie_pcs_alt_tbl[] = { 2035 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_EQ_CONFIG4, 0x16), 2036 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_EQ_CONFIG5, 0x22), 2037 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_LANE1_INSIG_SW_CTRL2, 0x00), 2038 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_LANE1_INSIG_MX_CTRL2, 0x00), 2039 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_G3S2_PRE_GAIN, 0x2e), 2040 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_RX_SIGDET_LVL, 0x66), 2041 + }; 2042 + 2043 + static const struct qmp_phy_init_tbl sa8775p_qmp_gen4x4_pcie_rx_alt_tbl[] = { 2044 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_AUX_DATA_THRESH_BIN_RATE_0_1, 0x3f), 2045 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_AUX_DATA_THRESH_BIN_RATE_2_3, 0x37), 2046 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_DFE_3, 0x00), 2047 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38), 2048 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_DFE_DAC_ENABLE1, 0x00), 2049 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_GM_CAL, 0x05), 2050 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_PHPRE_CTRL, 0x20), 2051 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0b), 2052 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x7c), 2053 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_IDAC_SAOFFSET, 0x10), 2054 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH1_RATE210, 0x1f), 2055 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH1_RATE3, 0x1f), 2056 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH2_RATE210, 0x1f), 2057 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH2_RATE3, 0x1f), 2058 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH3_RATE210, 0x1f), 2059 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH3_RATE3, 0x1f), 2060 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH4_RATE3, 0x1f), 2061 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH5_RATE3, 0x1f), 2062 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH6_RATE3, 0x1f), 2063 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_Q_PI_INTRINSIC_BIAS_RATE32, 0x09), 2064 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B0, 0x99), 2065 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B1, 0xb0), 2066 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B2, 0x92), 2067 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B3, 0xf0), 2068 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B4, 0x42), 2069 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B5, 0x00), 2070 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE_0_1_B6, 0x20), 2071 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B0, 0x9a), 2072 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B1, 0xb6), 2073 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B2, 0x92), 2074 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B3, 0xf0), 2075 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B4, 0x43), 2076 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B5, 0xdd), 2077 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE2_B6, 0x0d), 2078 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B0, 0xf3), 2079 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B1, 0xf6), 2080 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B2, 0xee), 2081 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B3, 0xd2), 2082 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B4, 0x83), 2083 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B5, 0xf9), 2084 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_RX_MODE_RATE3_B6, 0x3d), 2085 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_TX_ADAPT_POST_THRESH1, 0x00), 2086 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_TX_ADAPT_POST_THRESH2, 0x1f), 2087 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_UCDR_FO_GAIN_RATE2, 0x0c), 2088 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_UCDR_FO_GAIN_RATE3, 0x08), 2089 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_UCDR_SO_GAIN_RATE3, 0x04), 2090 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_UCDR_PI_CONTROLS, 0x16), 2091 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_VGA_CAL_CNTRL1, 0x04), 2092 + QMP_PHY_INIT_CFG(QSERDES_V5_20_RX_VGA_CAL_MAN_VAL, 0x08), 2093 + }; 2094 + 2095 + static const struct qmp_phy_init_tbl sa8775p_qmp_gen4x4_pcie_pcs_alt_tbl[] = { 2096 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_EQ_CONFIG4, 0x16), 2097 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_EQ_CONFIG5, 0x22), 2098 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_G3S2_PRE_GAIN, 0x2e), 2099 + QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_RX_SIGDET_LVL, 0x66), 2100 + }; 2101 + 2102 + static const struct qmp_phy_init_tbl sa8775p_qmp_gen4x4_pcie_serdes_alt_tbl[] = { 2103 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_IVCO, 0x0f), 2104 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE0, 0x36), 2105 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE1, 0x36), 2106 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP_EN, 0x46), 2107 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP_CFG, 0x04), 2108 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAP, 0x02), 2109 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_SEL, 0x12), 2110 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_HS_SWITCH_SEL, 0x00), 2111 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORECLK_DIV_MODE0, 0x0a), 2112 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORECLK_DIV_MODE1, 0x04), 2113 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CMN_MISC1, 0x88), 2114 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORE_CLK_EN, 0x60), 2115 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CMN_CONFIG, 0x06), 2116 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CMN_MODE, 0x14), 2117 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_DC_LEVEL_CTRL, 0x0f), 2118 + }; 2119 + 2120 + 2121 + static const struct qmp_phy_init_tbl sa8775p_qmp_gen4x4_pcie_rc_serdes_alt_tbl[] = { 2122 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_EN_CENTER, 0x00), 2123 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER1, 0x31), 2124 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER2, 0x01), 2125 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE1_MODE0, 0xde), 2126 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE2_MODE0, 0x07), 2127 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE1_MODE1, 0x97), 2128 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE2_MODE1, 0x0c), 2129 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIAS_EN_CLKBUFLR_EN, 0x1c), 2130 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CLK_ENABLE1, 0x90), 2131 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE0, 0x06), 2132 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE1, 0x06), 2133 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE0, 0x16), 2134 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE1, 0x16), 2135 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_EN_SEL, 0x08), 2136 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE0, 0x0a), 2137 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE0, 0x1a), 2138 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE1, 0x14), 2139 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE1, 0x34), 2140 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE0, 0x82), 2141 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE1, 0xd0), 2142 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START1_MODE0, 0x55), 2143 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START2_MODE0, 0x55), 2144 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START3_MODE0, 0x03), 2145 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START1_MODE1, 0x55), 2146 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START2_MODE1, 0x55), 2147 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START3_MODE1, 0x05), 2148 + QMP_PHY_INIT_CFG(QSERDES_V5_COM_CLK_SELECT, 0x34), 2149 + }; 2150 + 1912 2151 struct qmp_pcie_offsets { 1913 2152 u16 serdes; 1914 2153 u16 pcs; ··· 2194 1957 const struct qmp_phy_init_tbl *serdes_4ln_tbl; 2195 1958 int serdes_4ln_num; 2196 1959 2197 - /* clock ids to be requested */ 2198 - const char * const *clk_list; 2199 - int num_clks; 2200 1960 /* resets to be requested */ 2201 1961 const char * const *reset_list; 2202 1962 int num_resets; ··· 2272 2038 } 2273 2039 2274 2040 /* list of clocks required by phy */ 2275 - static const char * const ipq8074_pciephy_clk_l[] = { 2276 - "aux", "cfg_ahb", 2277 - }; 2278 - 2279 - static const char * const msm8996_phy_clk_l[] = { 2280 - "aux", "cfg_ahb", "ref", 2281 - }; 2282 - 2283 - static const char * const sc8280xp_pciephy_clk_l[] = { 2284 - "aux", "cfg_ahb", "ref", "rchng", 2285 - }; 2286 - 2287 - static const char * const sdm845_pciephy_clk_l[] = { 2288 - "aux", "cfg_ahb", "ref", "refgen", 2041 + static const char * const qmp_pciephy_clk_l[] = { 2042 + "aux", "cfg_ahb", "ref", "refgen", "rchng", "phy_aux", 2289 2043 }; 2290 2044 2291 2045 /* list of regulators */ ··· 2294 2072 "phy", 2295 2073 }; 2296 2074 2075 + static const struct qmp_pcie_offsets qmp_pcie_offsets_qhp = { 2076 + .serdes = 0, 2077 + .pcs = 0x1800, 2078 + .tx = 0x0800, 2079 + /* no .rx for QHP */ 2080 + }; 2081 + 2082 + static const struct qmp_pcie_offsets qmp_pcie_offsets_v2 = { 2083 + .serdes = 0, 2084 + .pcs = 0x0800, 2085 + .tx = 0x0200, 2086 + .rx = 0x0400, 2087 + }; 2088 + 2089 + static const struct qmp_pcie_offsets qmp_pcie_offsets_v3 = { 2090 + .serdes = 0, 2091 + .pcs = 0x0800, 2092 + .pcs_misc = 0x0600, 2093 + .tx = 0x0200, 2094 + .rx = 0x0400, 2095 + }; 2096 + 2097 + static const struct qmp_pcie_offsets qmp_pcie_offsets_v4x1 = { 2098 + .serdes = 0, 2099 + .pcs = 0x0800, 2100 + .pcs_misc = 0x0c00, 2101 + .tx = 0x0200, 2102 + .rx = 0x0400, 2103 + }; 2104 + 2105 + static const struct qmp_pcie_offsets qmp_pcie_offsets_v4x2 = { 2106 + .serdes = 0, 2107 + .pcs = 0x0a00, 2108 + .pcs_misc = 0x0e00, 2109 + .tx = 0x0200, 2110 + .rx = 0x0400, 2111 + .tx2 = 0x0600, 2112 + .rx2 = 0x0800, 2113 + }; 2114 + 2115 + static const struct qmp_pcie_offsets qmp_pcie_offsets_v4_20 = { 2116 + .serdes = 0x1000, 2117 + .pcs = 0x1200, 2118 + .pcs_misc = 0x1600, 2119 + .tx = 0x0000, 2120 + .rx = 0x0200, 2121 + .tx2 = 0x0800, 2122 + .rx2 = 0x0a00, 2123 + }; 2124 + 2297 2125 static const struct qmp_pcie_offsets qmp_pcie_offsets_v5 = { 2298 2126 .serdes = 0, 2299 2127 .pcs = 0x0200, ··· 2352 2080 .rx = 0x1000, 2353 2081 .tx2 = 0x1600, 2354 2082 .rx2 = 0x1800, 2083 + }; 2084 + 2085 + static const struct qmp_pcie_offsets qmp_pcie_offsets_v5_20 = { 2086 + .serdes = 0x1000, 2087 + .pcs = 0x1200, 2088 + .pcs_misc = 0x1400, 2089 + .tx = 0x0000, 2090 + .rx = 0x0200, 2091 + .tx2 = 0x0800, 2092 + .rx2 = 0x0a00, 2093 + }; 2094 + 2095 + static const struct qmp_pcie_offsets qmp_pcie_offsets_v5_30 = { 2096 + .serdes = 0x2000, 2097 + .pcs = 0x2200, 2098 + .pcs_misc = 0x2400, 2099 + .tx = 0x0, 2100 + .rx = 0x0200, 2101 + .tx2 = 0x3800, 2102 + .rx2 = 0x3a00, 2355 2103 }; 2356 2104 2357 2105 static const struct qmp_pcie_offsets qmp_pcie_offsets_v6_20 = { ··· 2388 2096 static const struct qmp_phy_cfg ipq8074_pciephy_cfg = { 2389 2097 .lanes = 1, 2390 2098 2099 + .offsets = &qmp_pcie_offsets_v2, 2100 + 2391 2101 .tbls = { 2392 2102 .serdes = ipq8074_pcie_serdes_tbl, 2393 2103 .serdes_num = ARRAY_SIZE(ipq8074_pcie_serdes_tbl), ··· 2400 2106 .pcs = ipq8074_pcie_pcs_tbl, 2401 2107 .pcs_num = ARRAY_SIZE(ipq8074_pcie_pcs_tbl), 2402 2108 }, 2403 - .clk_list = ipq8074_pciephy_clk_l, 2404 - .num_clks = ARRAY_SIZE(ipq8074_pciephy_clk_l), 2405 2109 .reset_list = ipq8074_pciephy_reset_l, 2406 2110 .num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l), 2407 2111 .vreg_list = NULL, ··· 2413 2121 static const struct qmp_phy_cfg ipq8074_pciephy_gen3_cfg = { 2414 2122 .lanes = 1, 2415 2123 2124 + .offsets = &qmp_pcie_offsets_v4x1, 2125 + 2416 2126 .tbls = { 2417 2127 .serdes = ipq8074_pcie_gen3_serdes_tbl, 2418 2128 .serdes_num = ARRAY_SIZE(ipq8074_pcie_gen3_serdes_tbl), ··· 2427 2133 .pcs_misc = ipq8074_pcie_gen3_pcs_misc_tbl, 2428 2134 .pcs_misc_num = ARRAY_SIZE(ipq8074_pcie_gen3_pcs_misc_tbl), 2429 2135 }, 2430 - .clk_list = ipq8074_pciephy_clk_l, 2431 - .num_clks = ARRAY_SIZE(ipq8074_pciephy_clk_l), 2432 2136 .reset_list = ipq8074_pciephy_reset_l, 2433 2137 .num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l), 2434 2138 .vreg_list = NULL, ··· 2442 2150 static const struct qmp_phy_cfg ipq6018_pciephy_cfg = { 2443 2151 .lanes = 1, 2444 2152 2153 + .offsets = &qmp_pcie_offsets_v4x1, 2154 + 2445 2155 .tbls = { 2446 2156 .serdes = ipq6018_pcie_serdes_tbl, 2447 2157 .serdes_num = ARRAY_SIZE(ipq6018_pcie_serdes_tbl), ··· 2456 2162 .pcs_misc = ipq6018_pcie_pcs_misc_tbl, 2457 2163 .pcs_misc_num = ARRAY_SIZE(ipq6018_pcie_pcs_misc_tbl), 2458 2164 }, 2459 - .clk_list = ipq8074_pciephy_clk_l, 2460 - .num_clks = ARRAY_SIZE(ipq8074_pciephy_clk_l), 2461 2165 .reset_list = ipq8074_pciephy_reset_l, 2462 2166 .num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l), 2463 2167 .vreg_list = NULL, ··· 2469 2177 static const struct qmp_phy_cfg sdm845_qmp_pciephy_cfg = { 2470 2178 .lanes = 1, 2471 2179 2180 + .offsets = &qmp_pcie_offsets_v3, 2181 + 2472 2182 .tbls = { 2473 2183 .serdes = sdm845_qmp_pcie_serdes_tbl, 2474 2184 .serdes_num = ARRAY_SIZE(sdm845_qmp_pcie_serdes_tbl), ··· 2483 2189 .pcs_misc = sdm845_qmp_pcie_pcs_misc_tbl, 2484 2190 .pcs_misc_num = ARRAY_SIZE(sdm845_qmp_pcie_pcs_misc_tbl), 2485 2191 }, 2486 - .clk_list = sdm845_pciephy_clk_l, 2487 - .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l), 2488 2192 .reset_list = sdm845_pciephy_reset_l, 2489 2193 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2490 2194 .vreg_list = qmp_phy_vreg_l, ··· 2496 2204 static const struct qmp_phy_cfg sdm845_qhp_pciephy_cfg = { 2497 2205 .lanes = 1, 2498 2206 2207 + .offsets = &qmp_pcie_offsets_qhp, 2208 + 2499 2209 .tbls = { 2500 2210 .serdes = sdm845_qhp_pcie_serdes_tbl, 2501 2211 .serdes_num = ARRAY_SIZE(sdm845_qhp_pcie_serdes_tbl), ··· 2506 2212 .pcs = sdm845_qhp_pcie_pcs_tbl, 2507 2213 .pcs_num = ARRAY_SIZE(sdm845_qhp_pcie_pcs_tbl), 2508 2214 }, 2509 - .clk_list = sdm845_pciephy_clk_l, 2510 - .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l), 2511 2215 .reset_list = sdm845_pciephy_reset_l, 2512 2216 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2513 2217 .vreg_list = qmp_phy_vreg_l, ··· 2518 2226 2519 2227 static const struct qmp_phy_cfg sm8250_qmp_gen3x1_pciephy_cfg = { 2520 2228 .lanes = 1, 2229 + 2230 + .offsets = &qmp_pcie_offsets_v4x1, 2521 2231 2522 2232 .tbls = { 2523 2233 .serdes = sm8250_qmp_pcie_serdes_tbl, ··· 2543 2249 .pcs_misc = sm8250_qmp_gen3x1_pcie_pcs_misc_tbl, 2544 2250 .pcs_misc_num = ARRAY_SIZE(sm8250_qmp_gen3x1_pcie_pcs_misc_tbl), 2545 2251 }, 2546 - .clk_list = sdm845_pciephy_clk_l, 2547 - .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l), 2548 2252 .reset_list = sdm845_pciephy_reset_l, 2549 2253 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2550 2254 .vreg_list = qmp_phy_vreg_l, ··· 2555 2263 2556 2264 static const struct qmp_phy_cfg sm8250_qmp_gen3x2_pciephy_cfg = { 2557 2265 .lanes = 2, 2266 + 2267 + .offsets = &qmp_pcie_offsets_v4x2, 2558 2268 2559 2269 .tbls = { 2560 2270 .serdes = sm8250_qmp_pcie_serdes_tbl, ··· 2580 2286 .pcs_misc = sm8250_qmp_gen3x2_pcie_pcs_misc_tbl, 2581 2287 .pcs_misc_num = ARRAY_SIZE(sm8250_qmp_gen3x2_pcie_pcs_misc_tbl), 2582 2288 }, 2583 - .clk_list = sdm845_pciephy_clk_l, 2584 - .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l), 2585 2289 .reset_list = sdm845_pciephy_reset_l, 2586 2290 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2587 2291 .vreg_list = qmp_phy_vreg_l, ··· 2593 2301 static const struct qmp_phy_cfg msm8998_pciephy_cfg = { 2594 2302 .lanes = 1, 2595 2303 2304 + .offsets = &qmp_pcie_offsets_v3, 2305 + 2596 2306 .tbls = { 2597 2307 .serdes = msm8998_pcie_serdes_tbl, 2598 2308 .serdes_num = ARRAY_SIZE(msm8998_pcie_serdes_tbl), ··· 2605 2311 .pcs = msm8998_pcie_pcs_tbl, 2606 2312 .pcs_num = ARRAY_SIZE(msm8998_pcie_pcs_tbl), 2607 2313 }, 2608 - .clk_list = msm8996_phy_clk_l, 2609 - .num_clks = ARRAY_SIZE(msm8996_phy_clk_l), 2610 2314 .reset_list = ipq8074_pciephy_reset_l, 2611 2315 .num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l), 2612 2316 .vreg_list = qmp_phy_vreg_l, ··· 2620 2328 static const struct qmp_phy_cfg sc8180x_pciephy_cfg = { 2621 2329 .lanes = 2, 2622 2330 2331 + .offsets = &qmp_pcie_offsets_v4x2, 2332 + 2623 2333 .tbls = { 2624 2334 .serdes = sc8180x_qmp_pcie_serdes_tbl, 2625 2335 .serdes_num = ARRAY_SIZE(sc8180x_qmp_pcie_serdes_tbl), ··· 2634 2340 .pcs_misc = sc8180x_qmp_pcie_pcs_misc_tbl, 2635 2341 .pcs_misc_num = ARRAY_SIZE(sc8180x_qmp_pcie_pcs_misc_tbl), 2636 2342 }, 2637 - .clk_list = sdm845_pciephy_clk_l, 2638 - .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l), 2639 2343 .reset_list = sdm845_pciephy_reset_l, 2640 2344 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2641 2345 .vreg_list = qmp_phy_vreg_l, ··· 2667 2375 .serdes_num = ARRAY_SIZE(sc8280xp_qmp_gen3x1_pcie_rc_serdes_tbl), 2668 2376 }, 2669 2377 2670 - .clk_list = sc8280xp_pciephy_clk_l, 2671 - .num_clks = ARRAY_SIZE(sc8280xp_pciephy_clk_l), 2672 2378 .reset_list = sdm845_pciephy_reset_l, 2673 2379 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2674 2380 .vreg_list = qmp_phy_vreg_l, ··· 2700 2410 .serdes_num = ARRAY_SIZE(sc8280xp_qmp_gen3x2_pcie_rc_serdes_tbl), 2701 2411 }, 2702 2412 2703 - .clk_list = sc8280xp_pciephy_clk_l, 2704 - .num_clks = ARRAY_SIZE(sc8280xp_pciephy_clk_l), 2705 2413 .reset_list = sdm845_pciephy_reset_l, 2706 2414 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2707 2415 .vreg_list = qmp_phy_vreg_l, ··· 2736 2448 .serdes_4ln_tbl = sc8280xp_qmp_gen3x4_pcie_serdes_4ln_tbl, 2737 2449 .serdes_4ln_num = ARRAY_SIZE(sc8280xp_qmp_gen3x4_pcie_serdes_4ln_tbl), 2738 2450 2739 - .clk_list = sc8280xp_pciephy_clk_l, 2740 - .num_clks = ARRAY_SIZE(sc8280xp_pciephy_clk_l), 2741 2451 .reset_list = sdm845_pciephy_reset_l, 2742 2452 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2743 2453 .vreg_list = qmp_phy_vreg_l, ··· 2748 2462 2749 2463 static const struct qmp_phy_cfg sdx55_qmp_pciephy_cfg = { 2750 2464 .lanes = 2, 2465 + 2466 + .offsets = &qmp_pcie_offsets_v4_20, 2751 2467 2752 2468 .tbls = { 2753 2469 .serdes = sdx55_qmp_pcie_serdes_tbl, ··· 2778 2490 .pcs_misc_num = ARRAY_SIZE(sdx55_qmp_pcie_ep_pcs_misc_tbl), 2779 2491 }, 2780 2492 2781 - .clk_list = sdm845_pciephy_clk_l, 2782 - .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l), 2783 2493 .reset_list = sdm845_pciephy_reset_l, 2784 2494 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2785 2495 .vreg_list = qmp_phy_vreg_l, ··· 2813 2527 .rx_num = ARRAY_SIZE(sm8350_qmp_gen3x1_pcie_rc_rx_tbl), 2814 2528 }, 2815 2529 2816 - .clk_list = sc8280xp_pciephy_clk_l, 2817 - .num_clks = ARRAY_SIZE(sc8280xp_pciephy_clk_l), 2818 2530 .reset_list = sdm845_pciephy_reset_l, 2819 2531 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2820 2532 .vreg_list = qmp_phy_vreg_l, ··· 2848 2564 .pcs_num = ARRAY_SIZE(sm8350_qmp_gen3x2_pcie_rc_pcs_tbl), 2849 2565 }, 2850 2566 2851 - .clk_list = sc8280xp_pciephy_clk_l, 2852 - .num_clks = ARRAY_SIZE(sc8280xp_pciephy_clk_l), 2853 2567 .reset_list = sdm845_pciephy_reset_l, 2854 2568 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2855 2569 .vreg_list = qmp_phy_vreg_l, ··· 2875 2593 .pcs_misc = sdx65_qmp_pcie_pcs_misc_tbl, 2876 2594 .pcs_misc_num = ARRAY_SIZE(sdx65_qmp_pcie_pcs_misc_tbl), 2877 2595 }, 2878 - .clk_list = sdm845_pciephy_clk_l, 2879 - .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l), 2880 2596 .reset_list = sdm845_pciephy_reset_l, 2881 2597 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2882 2598 .vreg_list = qmp_phy_vreg_l, ··· 2887 2607 2888 2608 static const struct qmp_phy_cfg sm8450_qmp_gen3x1_pciephy_cfg = { 2889 2609 .lanes = 1, 2610 + 2611 + .offsets = &qmp_pcie_offsets_v5, 2890 2612 2891 2613 .tbls = { 2892 2614 .serdes = sm8450_qmp_gen3_pcie_serdes_tbl, ··· 2910 2628 .rx_num = ARRAY_SIZE(sm8450_qmp_gen3x1_pcie_rc_rx_tbl), 2911 2629 }, 2912 2630 2913 - .clk_list = sdm845_pciephy_clk_l, 2914 - .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l), 2915 2631 .reset_list = sdm845_pciephy_reset_l, 2916 2632 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2917 2633 .vreg_list = qmp_phy_vreg_l, ··· 2922 2642 2923 2643 static const struct qmp_phy_cfg sm8450_qmp_gen4x2_pciephy_cfg = { 2924 2644 .lanes = 2, 2645 + 2646 + .offsets = &qmp_pcie_offsets_v5_20, 2925 2647 2926 2648 .tbls = { 2927 2649 .serdes = sm8450_qmp_gen4x2_pcie_serdes_tbl, ··· 2952 2670 .pcs_misc_num = ARRAY_SIZE(sm8450_qmp_gen4x2_pcie_ep_pcs_misc_tbl), 2953 2671 }, 2954 2672 2955 - .clk_list = sdm845_pciephy_clk_l, 2956 - .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l), 2957 2673 .reset_list = sdm845_pciephy_reset_l, 2958 2674 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2959 2675 .vreg_list = qmp_phy_vreg_l, ··· 2979 2699 .pcs_misc = sm8550_qmp_gen3x2_pcie_pcs_misc_tbl, 2980 2700 .pcs_misc_num = ARRAY_SIZE(sm8550_qmp_gen3x2_pcie_pcs_misc_tbl), 2981 2701 }, 2982 - .clk_list = sc8280xp_pciephy_clk_l, 2983 - .num_clks = ARRAY_SIZE(sc8280xp_pciephy_clk_l), 2984 2702 .reset_list = sdm845_pciephy_reset_l, 2985 2703 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2986 2704 .vreg_list = qmp_phy_vreg_l, ··· 3008 2730 .ln_shrd = sm8550_qmp_gen4x2_pcie_ln_shrd_tbl, 3009 2731 .ln_shrd_num = ARRAY_SIZE(sm8550_qmp_gen4x2_pcie_ln_shrd_tbl), 3010 2732 }, 3011 - .clk_list = sc8280xp_pciephy_clk_l, 3012 - .num_clks = ARRAY_SIZE(sc8280xp_pciephy_clk_l), 3013 2733 .reset_list = sdm845_pciephy_reset_l, 3014 2734 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 3015 2735 .vreg_list = sm8550_qmp_phy_vreg_l, ··· 3017 2741 .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL, 3018 2742 .phy_status = PHYSTATUS_4_20, 3019 2743 .has_nocsr_reset = true, 2744 + }; 2745 + 2746 + static const struct qmp_phy_cfg sa8775p_qmp_gen4x2_pciephy_cfg = { 2747 + .lanes = 2, 2748 + .offsets = &qmp_pcie_offsets_v5_20, 2749 + 2750 + .tbls = { 2751 + .serdes = sa8775p_qmp_gen4x2_pcie_serdes_alt_tbl, 2752 + .serdes_num = ARRAY_SIZE(sa8775p_qmp_gen4x2_pcie_serdes_alt_tbl), 2753 + .tx = sa8775p_qmp_gen4_pcie_tx_tbl, 2754 + .tx_num = ARRAY_SIZE(sa8775p_qmp_gen4_pcie_tx_tbl), 2755 + .rx = sa8775p_qmp_gen4x2_pcie_rx_alt_tbl, 2756 + .rx_num = ARRAY_SIZE(sa8775p_qmp_gen4x2_pcie_rx_alt_tbl), 2757 + .pcs = sa8775p_qmp_gen4x2_pcie_pcs_alt_tbl, 2758 + .pcs_num = ARRAY_SIZE(sa8775p_qmp_gen4x2_pcie_pcs_alt_tbl), 2759 + .pcs_misc = sa8775p_qmp_gen4_pcie_pcs_misc_tbl, 2760 + .pcs_misc_num = ARRAY_SIZE(sa8775p_qmp_gen4_pcie_pcs_misc_tbl), 2761 + }, 2762 + 2763 + .tbls_rc = &(const struct qmp_phy_cfg_tbls) { 2764 + .serdes = sa8775p_qmp_gen4x2_pcie_rc_serdes_alt_tbl, 2765 + .serdes_num = ARRAY_SIZE(sa8775p_qmp_gen4x2_pcie_rc_serdes_alt_tbl), 2766 + .pcs_misc = sa8775p_qmp_gen4_pcie_rc_pcs_misc_tbl, 2767 + .pcs_misc_num = ARRAY_SIZE(sa8775p_qmp_gen4_pcie_rc_pcs_misc_tbl), 2768 + }, 2769 + 2770 + .reset_list = sdm845_pciephy_reset_l, 2771 + .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2772 + .vreg_list = qmp_phy_vreg_l, 2773 + .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 2774 + .regs = pciephy_v5_regs_layout, 2775 + 2776 + .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL, 2777 + .phy_status = PHYSTATUS_4_20, 2778 + }; 2779 + 2780 + static const struct qmp_phy_cfg sa8775p_qmp_gen4x4_pciephy_cfg = { 2781 + .lanes = 4, 2782 + .offsets = &qmp_pcie_offsets_v5_30, 2783 + 2784 + .tbls = { 2785 + .serdes = sa8775p_qmp_gen4x4_pcie_serdes_alt_tbl, 2786 + .serdes_num = ARRAY_SIZE(sa8775p_qmp_gen4x4_pcie_serdes_alt_tbl), 2787 + .tx = sa8775p_qmp_gen4_pcie_tx_tbl, 2788 + .tx_num = ARRAY_SIZE(sa8775p_qmp_gen4_pcie_tx_tbl), 2789 + .rx = sa8775p_qmp_gen4x4_pcie_rx_alt_tbl, 2790 + .rx_num = ARRAY_SIZE(sa8775p_qmp_gen4x4_pcie_rx_alt_tbl), 2791 + .pcs = sa8775p_qmp_gen4x4_pcie_pcs_alt_tbl, 2792 + .pcs_num = ARRAY_SIZE(sa8775p_qmp_gen4x4_pcie_pcs_alt_tbl), 2793 + .pcs_misc = sa8775p_qmp_gen4_pcie_pcs_misc_tbl, 2794 + .pcs_misc_num = ARRAY_SIZE(sa8775p_qmp_gen4_pcie_pcs_misc_tbl), 2795 + }, 2796 + 2797 + .tbls_rc = &(const struct qmp_phy_cfg_tbls) { 2798 + .serdes = sa8775p_qmp_gen4x4_pcie_rc_serdes_alt_tbl, 2799 + .serdes_num = ARRAY_SIZE(sa8775p_qmp_gen4x4_pcie_rc_serdes_alt_tbl), 2800 + .pcs_misc = sa8775p_qmp_gen4_pcie_rc_pcs_misc_tbl, 2801 + .pcs_misc_num = ARRAY_SIZE(sa8775p_qmp_gen4_pcie_rc_pcs_misc_tbl), 2802 + }, 2803 + 2804 + .reset_list = sdm845_pciephy_reset_l, 2805 + .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l), 2806 + .vreg_list = qmp_phy_vreg_l, 2807 + .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 2808 + .regs = pciephy_v5_regs_layout, 2809 + 2810 + .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL, 2811 + .phy_status = PHYSTATUS_4_20, 3020 2812 }; 3021 2813 3022 2814 static void qmp_pcie_configure_lane(void __iomem *base, ··· 3199 2855 goto err_assert_reset; 3200 2856 } 3201 2857 3202 - ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks); 2858 + ret = clk_bulk_prepare_enable(ARRAY_SIZE(qmp_pciephy_clk_l), qmp->clks); 3203 2859 if (ret) 3204 2860 goto err_assert_reset; 3205 2861 ··· 3220 2876 3221 2877 reset_control_bulk_assert(cfg->num_resets, qmp->resets); 3222 2878 3223 - clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks); 2879 + clk_bulk_disable_unprepare(ARRAY_SIZE(qmp_pciephy_clk_l), qmp->clks); 3224 2880 3225 2881 regulator_bulk_disable(cfg->num_vregs, qmp->vregs); 3226 2882 ··· 3403 3059 3404 3060 static int qmp_pcie_clk_init(struct qmp_pcie *qmp) 3405 3061 { 3406 - const struct qmp_phy_cfg *cfg = qmp->cfg; 3407 3062 struct device *dev = qmp->dev; 3408 - int num = cfg->num_clks; 3063 + int num = ARRAY_SIZE(qmp_pciephy_clk_l); 3409 3064 int i; 3410 3065 3411 3066 qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL); ··· 3412 3069 return -ENOMEM; 3413 3070 3414 3071 for (i = 0; i < num; i++) 3415 - qmp->clks[i].id = cfg->clk_list[i]; 3072 + qmp->clks[i].id = qmp_pciephy_clk_l[i]; 3416 3073 3417 - return devm_clk_bulk_get(dev, num, qmp->clks); 3074 + return devm_clk_bulk_get_optional(dev, num, qmp->clks); 3418 3075 } 3419 3076 3420 3077 static void phy_clk_release_provider(void *res) ··· 3721 3378 .compatible = "qcom,msm8998-qmp-pcie-phy", 3722 3379 .data = &msm8998_pciephy_cfg, 3723 3380 }, { 3381 + .compatible = "qcom,sa8775p-qmp-gen4x2-pcie-phy", 3382 + .data = &sa8775p_qmp_gen4x2_pciephy_cfg, 3383 + }, { 3384 + .compatible = "qcom,sa8775p-qmp-gen4x4-pcie-phy", 3385 + .data = &sa8775p_qmp_gen4x4_pciephy_cfg, 3386 + }, { 3724 3387 .compatible = "qcom,sc8180x-qmp-pcie-phy", 3725 3388 .data = &sc8180x_pciephy_cfg, 3726 3389 }, { ··· 3750 3401 }, { 3751 3402 .compatible = "qcom,sdx65-qmp-gen4x2-pcie-phy", 3752 3403 .data = &sdx65_qmp_pciephy_cfg, 3404 + }, { 3405 + .compatible = "qcom,sm8150-qmp-gen3x1-pcie-phy", 3406 + .data = &sm8250_qmp_gen3x1_pciephy_cfg, 3407 + }, { 3408 + .compatible = "qcom,sm8150-qmp-gen3x2-pcie-phy", 3409 + .data = &sm8250_qmp_gen3x2_pciephy_cfg, 3753 3410 }, { 3754 3411 .compatible = "qcom,sm8250-qmp-gen3x1-pcie-phy", 3755 3412 .data = &sm8250_qmp_gen3x1_pciephy_cfg,
+1
drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v5_20.h
··· 7 7 #define QCOM_PHY_QMP_PCS_PCIE_V5_20_H_ 8 8 9 9 /* Only for QMP V5_20 PHY - PCIe PCS registers */ 10 + #define QPHY_V5_20_PCS_PCIE_POWER_STATE_CONFIG2 0x00c 10 11 #define QPHY_V5_20_PCS_PCIE_ENDPOINT_REFCLK_DRIVE 0x01c 11 12 #define QPHY_V5_20_PCS_PCIE_OSC_DTCT_MODE2_CONFIG5 0x084 12 13 #define QPHY_V5_20_PCS_PCIE_OSC_DTCT_ACTIONS 0x090
+2
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v5_20.h
··· 19 19 /* Only for QMP V5_20 PHY - RX registers */ 20 20 #define QSERDES_V5_20_RX_UCDR_FO_GAIN_RATE2 0x008 21 21 #define QSERDES_V5_20_RX_UCDR_FO_GAIN_RATE3 0x00c 22 + #define QSERDES_V5_20_RX_UCDR_SO_GAIN_RATE3 0x01c 22 23 #define QSERDES_V5_20_RX_UCDR_PI_CONTROLS 0x020 23 24 #define QSERDES_V5_20_RX_AUX_DATA_THRESH_BIN_RATE_0_1 0x02c 24 25 #define QSERDES_V5_20_RX_AUX_DATA_THRESH_BIN_RATE_2_3 0x030 ··· 81 80 #define QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH4_RATE3 0x210 82 81 #define QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH5_RATE3 0x218 83 82 #define QSERDES_V5_20_RX_RX_MARG_COARSE_THRESH6_RATE3 0x220 83 + #define QSERDES_V5_20_RX_Q_PI_INTRINSIC_BIAS_RATE32 0x238 84 84 85 85 #endif
+5
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v6.h
··· 7 7 #define QCOM_PHY_QMP_QSERDES_TXRX_USB_V6_H_ 8 8 9 9 #define QSERDES_V6_TX_CLKBUF_ENABLE 0x08 10 + #define QSERDES_V6_TX_TX_EMP_POST1_LVL 0x0c 11 + #define QSERDES_V6_TX_TX_DRV_LVL 0x14 10 12 #define QSERDES_V6_TX_RESET_TSYNC_EN 0x1c 11 13 #define QSERDES_V6_TX_PRE_STALL_LDO_BOOST_EN 0x20 12 14 #define QSERDES_V6_TX_TX_BAND 0x24 ··· 17 15 #define QSERDES_V6_TX_RES_CODE_LANE_RX 0x38 18 16 #define QSERDES_V6_TX_RES_CODE_LANE_OFFSET_TX 0x3c 19 17 #define QSERDES_V6_TX_RES_CODE_LANE_OFFSET_RX 0x40 18 + #define QSERDES_V6_TX_TRANSCEIVER_BIAS_EN 0x54 19 + #define QSERDES_V6_TX_HIGHZ_DRVR_EN 0x58 20 + #define QSERDES_V6_TX_TX_POL_INV 0x5c 20 21 #define QSERDES_V6_TX_PARRATE_REC_DETECT_IDLE_EN 0x60 21 22 #define QSERDES_V6_TX_BIST_PATTERN7 0x7c 22 23 #define QSERDES_V6_TX_LANE_MODE_1 0x84
+12 -1
drivers/phy/qualcomm/phy-qcom-qmp-ufs.c
··· 12 12 #include <linux/kernel.h> 13 13 #include <linux/module.h> 14 14 #include <linux/of.h> 15 - #include <linux/of_device.h> 16 15 #include <linux/of_address.h> 17 16 #include <linux/phy/phy.h> 18 17 #include <linux/platform_device.h> ··· 832 833 static const struct qmp_phy_cfg msm8996_ufsphy_cfg = { 833 834 .lanes = 1, 834 835 836 + .offsets = &qmp_ufs_offsets, 837 + 835 838 .tbls = { 836 839 .serdes = msm8996_ufsphy_serdes, 837 840 .serdes_num = ARRAY_SIZE(msm8996_ufsphy_serdes), ··· 925 924 static const struct qmp_phy_cfg sdm845_ufsphy_cfg = { 926 925 .lanes = 2, 927 926 927 + .offsets = &qmp_ufs_offsets, 928 + 928 929 .tbls = { 929 930 .serdes = sdm845_ufsphy_serdes, 930 931 .serdes_num = ARRAY_SIZE(sdm845_ufsphy_serdes), ··· 1009 1006 static const struct qmp_phy_cfg sm8150_ufsphy_cfg = { 1010 1007 .lanes = 2, 1011 1008 1009 + .offsets = &qmp_ufs_offsets, 1010 + 1012 1011 .tbls = { 1013 1012 .serdes = sm8150_ufsphy_serdes, 1014 1013 .serdes_num = ARRAY_SIZE(sm8150_ufsphy_serdes), ··· 1042 1037 1043 1038 static const struct qmp_phy_cfg sm8250_ufsphy_cfg = { 1044 1039 .lanes = 2, 1040 + 1041 + .offsets = &qmp_ufs_offsets, 1045 1042 1046 1043 .tbls = { 1047 1044 .serdes = sm8150_ufsphy_serdes, ··· 1077 1070 static const struct qmp_phy_cfg sm8350_ufsphy_cfg = { 1078 1071 .lanes = 2, 1079 1072 1073 + .offsets = &qmp_ufs_offsets, 1074 + 1080 1075 .tbls = { 1081 1076 .serdes = sm8350_ufsphy_serdes, 1082 1077 .serdes_num = ARRAY_SIZE(sm8350_ufsphy_serdes), ··· 1110 1101 1111 1102 static const struct qmp_phy_cfg sm8450_ufsphy_cfg = { 1112 1103 .lanes = 2, 1104 + 1105 + .offsets = &qmp_ufs_offsets, 1113 1106 1114 1107 .tbls = { 1115 1108 .serdes = sm8350_ufsphy_serdes,
+1407
drivers/phy/qualcomm/phy-qcom-qmp-usb-legacy.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (c) 2017, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #include <linux/clk.h> 7 + #include <linux/clk-provider.h> 8 + #include <linux/delay.h> 9 + #include <linux/err.h> 10 + #include <linux/io.h> 11 + #include <linux/iopoll.h> 12 + #include <linux/kernel.h> 13 + #include <linux/module.h> 14 + #include <linux/of.h> 15 + #include <linux/of_device.h> 16 + #include <linux/of_address.h> 17 + #include <linux/phy/phy.h> 18 + #include <linux/platform_device.h> 19 + #include <linux/regulator/consumer.h> 20 + #include <linux/reset.h> 21 + #include <linux/slab.h> 22 + 23 + #include "phy-qcom-qmp.h" 24 + #include "phy-qcom-qmp-pcs-misc-v3.h" 25 + #include "phy-qcom-qmp-pcs-usb-v4.h" 26 + #include "phy-qcom-qmp-pcs-usb-v5.h" 27 + 28 + /* QPHY_SW_RESET bit */ 29 + #define SW_RESET BIT(0) 30 + /* QPHY_POWER_DOWN_CONTROL */ 31 + #define SW_PWRDN BIT(0) 32 + /* QPHY_START_CONTROL bits */ 33 + #define SERDES_START BIT(0) 34 + #define PCS_START BIT(1) 35 + /* QPHY_PCS_STATUS bit */ 36 + #define PHYSTATUS BIT(6) 37 + 38 + /* QPHY_V3_DP_COM_RESET_OVRD_CTRL register bits */ 39 + /* DP PHY soft reset */ 40 + #define SW_DPPHY_RESET BIT(0) 41 + /* mux to select DP PHY reset control, 0:HW control, 1: software reset */ 42 + #define SW_DPPHY_RESET_MUX BIT(1) 43 + /* USB3 PHY soft reset */ 44 + #define SW_USB3PHY_RESET BIT(2) 45 + /* mux to select USB3 PHY reset control, 0:HW control, 1: software reset */ 46 + #define SW_USB3PHY_RESET_MUX BIT(3) 47 + 48 + /* QPHY_V3_DP_COM_PHY_MODE_CTRL register bits */ 49 + #define USB3_MODE BIT(0) /* enables USB3 mode */ 50 + #define DP_MODE BIT(1) /* enables DP mode */ 51 + 52 + /* QPHY_PCS_AUTONOMOUS_MODE_CTRL register bits */ 53 + #define ARCVR_DTCT_EN BIT(0) 54 + #define ALFPS_DTCT_EN BIT(1) 55 + #define ARCVR_DTCT_EVENT_SEL BIT(4) 56 + 57 + /* QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR register bits */ 58 + #define IRQ_CLEAR BIT(0) 59 + 60 + /* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */ 61 + #define CLAMP_EN BIT(0) /* enables i/o clamp_n */ 62 + 63 + #define PHY_INIT_COMPLETE_TIMEOUT 10000 64 + 65 + struct qmp_phy_init_tbl { 66 + unsigned int offset; 67 + unsigned int val; 68 + /* 69 + * mask of lanes for which this register is written 70 + * for cases when second lane needs different values 71 + */ 72 + u8 lane_mask; 73 + }; 74 + 75 + #define QMP_PHY_INIT_CFG(o, v) \ 76 + { \ 77 + .offset = o, \ 78 + .val = v, \ 79 + .lane_mask = 0xff, \ 80 + } 81 + 82 + #define QMP_PHY_INIT_CFG_LANE(o, v, l) \ 83 + { \ 84 + .offset = o, \ 85 + .val = v, \ 86 + .lane_mask = l, \ 87 + } 88 + 89 + /* set of registers with offsets different per-PHY */ 90 + enum qphy_reg_layout { 91 + /* PCS registers */ 92 + QPHY_SW_RESET, 93 + QPHY_START_CTRL, 94 + QPHY_PCS_STATUS, 95 + QPHY_PCS_AUTONOMOUS_MODE_CTRL, 96 + QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR, 97 + QPHY_PCS_POWER_DOWN_CONTROL, 98 + /* Keep last to ensure regs_layout arrays are properly initialized */ 99 + QPHY_LAYOUT_SIZE 100 + }; 101 + 102 + static const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = { 103 + [QPHY_SW_RESET] = QPHY_V3_PCS_SW_RESET, 104 + [QPHY_START_CTRL] = QPHY_V3_PCS_START_CONTROL, 105 + [QPHY_PCS_STATUS] = QPHY_V3_PCS_PCS_STATUS, 106 + [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V3_PCS_AUTONOMOUS_MODE_CTRL, 107 + [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V3_PCS_LFPS_RXTERM_IRQ_CLEAR, 108 + [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V3_PCS_POWER_DOWN_CONTROL, 109 + }; 110 + 111 + static const unsigned int qmp_v4_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = { 112 + [QPHY_SW_RESET] = QPHY_V4_PCS_SW_RESET, 113 + [QPHY_START_CTRL] = QPHY_V4_PCS_START_CONTROL, 114 + [QPHY_PCS_STATUS] = QPHY_V4_PCS_PCS_STATUS1, 115 + [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V4_PCS_POWER_DOWN_CONTROL, 116 + 117 + /* In PCS_USB */ 118 + [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V4_PCS_USB3_AUTONOMOUS_MODE_CTRL, 119 + [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V4_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR, 120 + }; 121 + 122 + static const unsigned int qmp_v5_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = { 123 + [QPHY_SW_RESET] = QPHY_V5_PCS_SW_RESET, 124 + [QPHY_START_CTRL] = QPHY_V5_PCS_START_CONTROL, 125 + [QPHY_PCS_STATUS] = QPHY_V5_PCS_PCS_STATUS1, 126 + [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V5_PCS_POWER_DOWN_CONTROL, 127 + 128 + /* In PCS_USB */ 129 + [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V5_PCS_USB3_AUTONOMOUS_MODE_CTRL, 130 + [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V5_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR, 131 + }; 132 + 133 + static const struct qmp_phy_init_tbl qmp_v3_usb3_serdes_tbl[] = { 134 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07), 135 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14), 136 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x08), 137 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30), 138 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02), 139 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08), 140 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x16), 141 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01), 142 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80), 143 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82), 144 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab), 145 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea), 146 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02), 147 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06), 148 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16), 149 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36), 150 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00), 151 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f), 152 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01), 153 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9), 154 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a), 155 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00), 156 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34), 157 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15), 158 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04), 159 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00), 160 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00), 161 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00), 162 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x0a), 163 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01), 164 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31), 165 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01), 166 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00), 167 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00), 168 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85), 169 + QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07), 170 + }; 171 + 172 + static const struct qmp_phy_init_tbl qmp_v3_usb3_tx_tbl[] = { 173 + QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10), 174 + QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12), 175 + QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x16), 176 + QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x09), 177 + QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06), 178 + }; 179 + 180 + static const struct qmp_phy_init_tbl qmp_v3_usb3_rx_tbl[] = { 181 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b), 182 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 183 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e), 184 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18), 185 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77), 186 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80), 187 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03), 188 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16), 189 + QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75), 190 + }; 191 + 192 + static const struct qmp_phy_init_tbl qmp_v3_usb3_pcs_tbl[] = { 193 + /* FLL settings */ 194 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83), 195 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09), 196 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2), 197 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40), 198 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02), 199 + 200 + /* Lock Det settings */ 201 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1), 202 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f), 203 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47), 204 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b), 205 + 206 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xba), 207 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f), 208 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f), 209 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7), 210 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e), 211 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65), 212 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b), 213 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15), 214 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d), 215 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15), 216 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d), 217 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15), 218 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d), 219 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15), 220 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d), 221 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15), 222 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d), 223 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15), 224 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d), 225 + 226 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02), 227 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04), 228 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44), 229 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04), 230 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7), 231 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03), 232 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40), 233 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00), 234 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75), 235 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86), 236 + QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13), 237 + }; 238 + 239 + static const struct qmp_phy_init_tbl sm8150_usb3_serdes_tbl[] = { 240 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01), 241 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31), 242 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER2, 0x01), 243 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE0, 0xde), 244 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE0, 0x07), 245 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE1, 0xde), 246 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE1, 0x07), 247 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x0a), 248 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_IPTRIM, 0x20), 249 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06), 250 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06), 251 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16), 252 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16), 253 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36), 254 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36), 255 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x1a), 256 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04), 257 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x14), 258 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x34), 259 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x34), 260 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x82), 261 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82), 262 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x82), 263 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0xab), 264 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0xea), 265 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x02), 266 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02), 267 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE1, 0xab), 268 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE1, 0xea), 269 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE1, 0x02), 270 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE0, 0x24), 271 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE1, 0x24), 272 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE2_MODE1, 0x02), 273 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01), 274 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x08), 275 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca), 276 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e), 277 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xca), 278 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x1e), 279 + QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11), 280 + }; 281 + 282 + static const struct qmp_phy_init_tbl sm8150_usb3_tx_tbl[] = { 283 + QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x00), 284 + QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x00), 285 + QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5), 286 + QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12), 287 + QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x20), 288 + }; 289 + 290 + static const struct qmp_phy_init_tbl sm8150_usb3_rx_tbl[] = { 291 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x05), 292 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f), 293 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f), 294 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff), 295 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f), 296 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99), 297 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04), 298 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08), 299 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05), 300 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05), 301 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54), 302 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0e), 303 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 304 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a), 305 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a), 306 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0), 307 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00), 308 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77), 309 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04), 310 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e), 311 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xbf), 312 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xbf), 313 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x3f), 314 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f), 315 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x94), 316 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc), 317 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc), 318 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c), 319 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x0b), 320 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb3), 321 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04), 322 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38), 323 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0), 324 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c), 325 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f), 326 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10), 327 + }; 328 + 329 + static const struct qmp_phy_init_tbl sm8150_usb3_pcs_tbl[] = { 330 + /* Lock Det settings */ 331 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0), 332 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07), 333 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13), 334 + 335 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21), 336 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa), 337 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a), 338 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88), 339 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13), 340 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c), 341 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b), 342 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10), 343 + }; 344 + 345 + static const struct qmp_phy_init_tbl sm8150_usb3_pcs_usb_tbl[] = { 346 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8), 347 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07), 348 + }; 349 + 350 + static const struct qmp_phy_init_tbl sm8250_usb3_tx_tbl[] = { 351 + QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x60), 352 + QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x60), 353 + QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11), 354 + QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x02), 355 + QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5), 356 + QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12), 357 + QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x40, 1), 358 + QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x54, 2), 359 + }; 360 + 361 + static const struct qmp_phy_init_tbl sm8250_usb3_rx_tbl[] = { 362 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x06), 363 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f), 364 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f), 365 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff), 366 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f), 367 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99), 368 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04), 369 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08), 370 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05), 371 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05), 372 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54), 373 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c), 374 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 375 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a), 376 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a), 377 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0), 378 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00), 379 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77), 380 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04), 381 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e), 382 + QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0xff, 1), 383 + QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0x7f, 2), 384 + QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x7f, 1), 385 + QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xff, 2), 386 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x7f), 387 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f), 388 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x97), 389 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc), 390 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc), 391 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c), 392 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x7b), 393 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb4), 394 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04), 395 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38), 396 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0), 397 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c), 398 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f), 399 + QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10), 400 + }; 401 + 402 + static const struct qmp_phy_init_tbl sm8250_usb3_pcs_tbl[] = { 403 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0), 404 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07), 405 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20), 406 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13), 407 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21), 408 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xa9), 409 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a), 410 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88), 411 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13), 412 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c), 413 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b), 414 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10), 415 + }; 416 + 417 + static const struct qmp_phy_init_tbl sm8250_usb3_pcs_usb_tbl[] = { 418 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8), 419 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07), 420 + }; 421 + 422 + static const struct qmp_phy_init_tbl sm8350_usb3_tx_tbl[] = { 423 + QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_TX, 0x00), 424 + QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_RX, 0x00), 425 + QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x16), 426 + QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x0e), 427 + QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0x35), 428 + QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_3, 0x3f), 429 + QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_4, 0x7f), 430 + QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_5, 0x3f), 431 + QMP_PHY_INIT_CFG(QSERDES_V5_TX_RCV_DETECT_LVL_2, 0x12), 432 + QMP_PHY_INIT_CFG(QSERDES_V5_TX_PI_QEC_CTRL, 0x21), 433 + }; 434 + 435 + static const struct qmp_phy_init_tbl sm8350_usb3_rx_tbl[] = { 436 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0a), 437 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x05), 438 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f), 439 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f), 440 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff), 441 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f), 442 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0x99), 443 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH1, 0x08), 444 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH2, 0x08), 445 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN1, 0x00), 446 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN2, 0x04), 447 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL1, 0x54), 448 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x0f), 449 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 450 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a), 451 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a), 452 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_LOW, 0xc0), 453 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_HIGH, 0x00), 454 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47), 455 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_CNTRL, 0x04), 456 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_DEGLITCH_CNTRL, 0x0e), 457 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0xbb), 458 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0x7b), 459 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xbb), 460 + QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3d, 1), 461 + QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3c, 2), 462 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0xdb), 463 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0x64), 464 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0x24), 465 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH2, 0xd2), 466 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH3, 0x13), 467 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0xa9), 468 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_EN_TIMER, 0x04), 469 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38), 470 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_AUX_DATA_TCOARSE_TFINE, 0xa0), 471 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_DCC_CTRL1, 0x0c), 472 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_GM_CAL, 0x00), 473 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_VTH_CODE, 0x10), 474 + }; 475 + 476 + static const struct qmp_phy_init_tbl sm8350_usb3_pcs_tbl[] = { 477 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7), 478 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03), 479 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0), 480 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07), 481 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20), 482 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13), 483 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21), 484 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa), 485 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a), 486 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88), 487 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13), 488 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c), 489 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b), 490 + QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10), 491 + }; 492 + 493 + static const struct qmp_phy_init_tbl sm8350_usb3_pcs_usb_tbl[] = { 494 + QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40), 495 + QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_H, 0x00), 496 + QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8), 497 + QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07), 498 + }; 499 + 500 + struct qmp_usb_legacy_offsets { 501 + u16 serdes; 502 + u16 pcs; 503 + u16 pcs_usb; 504 + u16 tx; 505 + u16 rx; 506 + }; 507 + 508 + /* struct qmp_phy_cfg - per-PHY initialization config */ 509 + struct qmp_phy_cfg { 510 + int lanes; 511 + 512 + const struct qmp_usb_legacy_offsets *offsets; 513 + 514 + /* Init sequence for PHY blocks - serdes, tx, rx, pcs */ 515 + const struct qmp_phy_init_tbl *serdes_tbl; 516 + int serdes_tbl_num; 517 + const struct qmp_phy_init_tbl *tx_tbl; 518 + int tx_tbl_num; 519 + const struct qmp_phy_init_tbl *rx_tbl; 520 + int rx_tbl_num; 521 + const struct qmp_phy_init_tbl *pcs_tbl; 522 + int pcs_tbl_num; 523 + const struct qmp_phy_init_tbl *pcs_usb_tbl; 524 + int pcs_usb_tbl_num; 525 + 526 + /* clock ids to be requested */ 527 + const char * const *clk_list; 528 + int num_clks; 529 + /* resets to be requested */ 530 + const char * const *reset_list; 531 + int num_resets; 532 + /* regulators to be requested */ 533 + const char * const *vreg_list; 534 + int num_vregs; 535 + 536 + /* array of registers with different offsets */ 537 + const unsigned int *regs; 538 + 539 + /* Offset from PCS to PCS_USB region */ 540 + unsigned int pcs_usb_offset; 541 + }; 542 + 543 + struct qmp_usb { 544 + struct device *dev; 545 + 546 + const struct qmp_phy_cfg *cfg; 547 + 548 + void __iomem *serdes; 549 + void __iomem *pcs; 550 + void __iomem *pcs_misc; 551 + void __iomem *pcs_usb; 552 + void __iomem *tx; 553 + void __iomem *rx; 554 + void __iomem *tx2; 555 + void __iomem *rx2; 556 + 557 + void __iomem *dp_com; 558 + 559 + struct clk *pipe_clk; 560 + struct clk_bulk_data *clks; 561 + struct reset_control_bulk_data *resets; 562 + struct regulator_bulk_data *vregs; 563 + 564 + enum phy_mode mode; 565 + 566 + struct phy *phy; 567 + 568 + struct clk_fixed_rate pipe_clk_fixed; 569 + }; 570 + 571 + static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val) 572 + { 573 + u32 reg; 574 + 575 + reg = readl(base + offset); 576 + reg |= val; 577 + writel(reg, base + offset); 578 + 579 + /* ensure that above write is through */ 580 + readl(base + offset); 581 + } 582 + 583 + static inline void qphy_clrbits(void __iomem *base, u32 offset, u32 val) 584 + { 585 + u32 reg; 586 + 587 + reg = readl(base + offset); 588 + reg &= ~val; 589 + writel(reg, base + offset); 590 + 591 + /* ensure that above write is through */ 592 + readl(base + offset); 593 + } 594 + 595 + /* list of clocks required by phy */ 596 + static const char * const qmp_v3_phy_clk_l[] = { 597 + "aux", "cfg_ahb", "ref", "com_aux", 598 + }; 599 + 600 + static const char * const qmp_v4_ref_phy_clk_l[] = { 601 + "aux", "ref_clk_src", "ref", "com_aux", 602 + }; 603 + 604 + /* the primary usb3 phy on sm8250 doesn't have a ref clock */ 605 + static const char * const qmp_v4_sm8250_usbphy_clk_l[] = { 606 + "aux", "ref_clk_src", "com_aux" 607 + }; 608 + 609 + /* list of resets */ 610 + static const char * const msm8996_usb3phy_reset_l[] = { 611 + "phy", "common", 612 + }; 613 + 614 + static const char * const sc7180_usb3phy_reset_l[] = { 615 + "phy", 616 + }; 617 + 618 + /* list of regulators */ 619 + static const char * const qmp_phy_vreg_l[] = { 620 + "vdda-phy", "vdda-pll", 621 + }; 622 + 623 + static const struct qmp_phy_cfg qmp_v3_usb3phy_cfg = { 624 + .lanes = 2, 625 + 626 + .serdes_tbl = qmp_v3_usb3_serdes_tbl, 627 + .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl), 628 + .tx_tbl = qmp_v3_usb3_tx_tbl, 629 + .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl), 630 + .rx_tbl = qmp_v3_usb3_rx_tbl, 631 + .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_rx_tbl), 632 + .pcs_tbl = qmp_v3_usb3_pcs_tbl, 633 + .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl), 634 + .clk_list = qmp_v3_phy_clk_l, 635 + .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l), 636 + .reset_list = msm8996_usb3phy_reset_l, 637 + .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 638 + .vreg_list = qmp_phy_vreg_l, 639 + .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 640 + .regs = qmp_v3_usb3phy_regs_layout, 641 + }; 642 + 643 + static const struct qmp_phy_cfg sc7180_usb3phy_cfg = { 644 + .lanes = 2, 645 + 646 + .serdes_tbl = qmp_v3_usb3_serdes_tbl, 647 + .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl), 648 + .tx_tbl = qmp_v3_usb3_tx_tbl, 649 + .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl), 650 + .rx_tbl = qmp_v3_usb3_rx_tbl, 651 + .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_rx_tbl), 652 + .pcs_tbl = qmp_v3_usb3_pcs_tbl, 653 + .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl), 654 + .clk_list = qmp_v3_phy_clk_l, 655 + .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l), 656 + .reset_list = sc7180_usb3phy_reset_l, 657 + .num_resets = ARRAY_SIZE(sc7180_usb3phy_reset_l), 658 + .vreg_list = qmp_phy_vreg_l, 659 + .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 660 + .regs = qmp_v3_usb3phy_regs_layout, 661 + }; 662 + 663 + static const struct qmp_phy_cfg sm8150_usb3phy_cfg = { 664 + .lanes = 2, 665 + 666 + .serdes_tbl = sm8150_usb3_serdes_tbl, 667 + .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl), 668 + .tx_tbl = sm8150_usb3_tx_tbl, 669 + .tx_tbl_num = ARRAY_SIZE(sm8150_usb3_tx_tbl), 670 + .rx_tbl = sm8150_usb3_rx_tbl, 671 + .rx_tbl_num = ARRAY_SIZE(sm8150_usb3_rx_tbl), 672 + .pcs_tbl = sm8150_usb3_pcs_tbl, 673 + .pcs_tbl_num = ARRAY_SIZE(sm8150_usb3_pcs_tbl), 674 + .pcs_usb_tbl = sm8150_usb3_pcs_usb_tbl, 675 + .pcs_usb_tbl_num = ARRAY_SIZE(sm8150_usb3_pcs_usb_tbl), 676 + .clk_list = qmp_v4_ref_phy_clk_l, 677 + .num_clks = ARRAY_SIZE(qmp_v4_ref_phy_clk_l), 678 + .reset_list = msm8996_usb3phy_reset_l, 679 + .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 680 + .vreg_list = qmp_phy_vreg_l, 681 + .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 682 + .regs = qmp_v4_usb3phy_regs_layout, 683 + .pcs_usb_offset = 0x300, 684 + }; 685 + 686 + static const struct qmp_phy_cfg sm8250_usb3phy_cfg = { 687 + .lanes = 2, 688 + 689 + .serdes_tbl = sm8150_usb3_serdes_tbl, 690 + .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl), 691 + .tx_tbl = sm8250_usb3_tx_tbl, 692 + .tx_tbl_num = ARRAY_SIZE(sm8250_usb3_tx_tbl), 693 + .rx_tbl = sm8250_usb3_rx_tbl, 694 + .rx_tbl_num = ARRAY_SIZE(sm8250_usb3_rx_tbl), 695 + .pcs_tbl = sm8250_usb3_pcs_tbl, 696 + .pcs_tbl_num = ARRAY_SIZE(sm8250_usb3_pcs_tbl), 697 + .pcs_usb_tbl = sm8250_usb3_pcs_usb_tbl, 698 + .pcs_usb_tbl_num = ARRAY_SIZE(sm8250_usb3_pcs_usb_tbl), 699 + .clk_list = qmp_v4_sm8250_usbphy_clk_l, 700 + .num_clks = ARRAY_SIZE(qmp_v4_sm8250_usbphy_clk_l), 701 + .reset_list = msm8996_usb3phy_reset_l, 702 + .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 703 + .vreg_list = qmp_phy_vreg_l, 704 + .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 705 + .regs = qmp_v4_usb3phy_regs_layout, 706 + .pcs_usb_offset = 0x300, 707 + }; 708 + 709 + static const struct qmp_phy_cfg sm8350_usb3phy_cfg = { 710 + .lanes = 2, 711 + 712 + .serdes_tbl = sm8150_usb3_serdes_tbl, 713 + .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl), 714 + .tx_tbl = sm8350_usb3_tx_tbl, 715 + .tx_tbl_num = ARRAY_SIZE(sm8350_usb3_tx_tbl), 716 + .rx_tbl = sm8350_usb3_rx_tbl, 717 + .rx_tbl_num = ARRAY_SIZE(sm8350_usb3_rx_tbl), 718 + .pcs_tbl = sm8350_usb3_pcs_tbl, 719 + .pcs_tbl_num = ARRAY_SIZE(sm8350_usb3_pcs_tbl), 720 + .pcs_usb_tbl = sm8350_usb3_pcs_usb_tbl, 721 + .pcs_usb_tbl_num = ARRAY_SIZE(sm8350_usb3_pcs_usb_tbl), 722 + .clk_list = qmp_v4_sm8250_usbphy_clk_l, 723 + .num_clks = ARRAY_SIZE(qmp_v4_sm8250_usbphy_clk_l), 724 + .reset_list = msm8996_usb3phy_reset_l, 725 + .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 726 + .vreg_list = qmp_phy_vreg_l, 727 + .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 728 + .regs = qmp_v5_usb3phy_regs_layout, 729 + .pcs_usb_offset = 0x300, 730 + }; 731 + 732 + static void qmp_usb_legacy_configure_lane(void __iomem *base, 733 + const struct qmp_phy_init_tbl tbl[], 734 + int num, 735 + u8 lane_mask) 736 + { 737 + int i; 738 + const struct qmp_phy_init_tbl *t = tbl; 739 + 740 + if (!t) 741 + return; 742 + 743 + for (i = 0; i < num; i++, t++) { 744 + if (!(t->lane_mask & lane_mask)) 745 + continue; 746 + 747 + writel(t->val, base + t->offset); 748 + } 749 + } 750 + 751 + static void qmp_usb_legacy_configure(void __iomem *base, 752 + const struct qmp_phy_init_tbl tbl[], 753 + int num) 754 + { 755 + qmp_usb_legacy_configure_lane(base, tbl, num, 0xff); 756 + } 757 + 758 + static int qmp_usb_legacy_serdes_init(struct qmp_usb *qmp) 759 + { 760 + const struct qmp_phy_cfg *cfg = qmp->cfg; 761 + void __iomem *serdes = qmp->serdes; 762 + const struct qmp_phy_init_tbl *serdes_tbl = cfg->serdes_tbl; 763 + int serdes_tbl_num = cfg->serdes_tbl_num; 764 + 765 + qmp_usb_legacy_configure(serdes, serdes_tbl, serdes_tbl_num); 766 + 767 + return 0; 768 + } 769 + 770 + static void qmp_usb_legacy_init_dp_com(struct phy *phy) 771 + { 772 + struct qmp_usb *qmp = phy_get_drvdata(phy); 773 + void __iomem *dp_com = qmp->dp_com; 774 + 775 + qphy_setbits(dp_com, QPHY_V3_DP_COM_POWER_DOWN_CTRL, 776 + SW_PWRDN); 777 + /* override hardware control for reset of qmp phy */ 778 + qphy_setbits(dp_com, QPHY_V3_DP_COM_RESET_OVRD_CTRL, 779 + SW_DPPHY_RESET_MUX | SW_DPPHY_RESET | 780 + SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET); 781 + 782 + /* Default type-c orientation, i.e CC1 */ 783 + qphy_setbits(dp_com, QPHY_V3_DP_COM_TYPEC_CTRL, 0x02); 784 + 785 + qphy_setbits(dp_com, QPHY_V3_DP_COM_PHY_MODE_CTRL, 786 + USB3_MODE | DP_MODE); 787 + 788 + /* bring both QMP USB and QMP DP PHYs PCS block out of reset */ 789 + qphy_clrbits(dp_com, QPHY_V3_DP_COM_RESET_OVRD_CTRL, 790 + SW_DPPHY_RESET_MUX | SW_DPPHY_RESET | 791 + SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET); 792 + 793 + qphy_clrbits(dp_com, QPHY_V3_DP_COM_SWI_CTRL, 0x03); 794 + qphy_clrbits(dp_com, QPHY_V3_DP_COM_SW_RESET, SW_RESET); 795 + } 796 + 797 + static int qmp_usb_legacy_init(struct phy *phy) 798 + { 799 + struct qmp_usb *qmp = phy_get_drvdata(phy); 800 + const struct qmp_phy_cfg *cfg = qmp->cfg; 801 + void __iomem *pcs = qmp->pcs; 802 + int ret; 803 + 804 + ret = regulator_bulk_enable(cfg->num_vregs, qmp->vregs); 805 + if (ret) { 806 + dev_err(qmp->dev, "failed to enable regulators, err=%d\n", ret); 807 + return ret; 808 + } 809 + 810 + ret = reset_control_bulk_assert(cfg->num_resets, qmp->resets); 811 + if (ret) { 812 + dev_err(qmp->dev, "reset assert failed\n"); 813 + goto err_disable_regulators; 814 + } 815 + 816 + ret = reset_control_bulk_deassert(cfg->num_resets, qmp->resets); 817 + if (ret) { 818 + dev_err(qmp->dev, "reset deassert failed\n"); 819 + goto err_disable_regulators; 820 + } 821 + 822 + ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks); 823 + if (ret) 824 + goto err_assert_reset; 825 + 826 + qmp_usb_legacy_init_dp_com(phy); 827 + 828 + qphy_setbits(pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL], SW_PWRDN); 829 + 830 + return 0; 831 + 832 + err_assert_reset: 833 + reset_control_bulk_assert(cfg->num_resets, qmp->resets); 834 + err_disable_regulators: 835 + regulator_bulk_disable(cfg->num_vregs, qmp->vregs); 836 + 837 + return ret; 838 + } 839 + 840 + static int qmp_usb_legacy_exit(struct phy *phy) 841 + { 842 + struct qmp_usb *qmp = phy_get_drvdata(phy); 843 + const struct qmp_phy_cfg *cfg = qmp->cfg; 844 + 845 + reset_control_bulk_assert(cfg->num_resets, qmp->resets); 846 + 847 + clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks); 848 + 849 + regulator_bulk_disable(cfg->num_vregs, qmp->vregs); 850 + 851 + return 0; 852 + } 853 + 854 + static int qmp_usb_legacy_power_on(struct phy *phy) 855 + { 856 + struct qmp_usb *qmp = phy_get_drvdata(phy); 857 + const struct qmp_phy_cfg *cfg = qmp->cfg; 858 + void __iomem *tx = qmp->tx; 859 + void __iomem *rx = qmp->rx; 860 + void __iomem *pcs = qmp->pcs; 861 + void __iomem *status; 862 + unsigned int val; 863 + int ret; 864 + 865 + qmp_usb_legacy_serdes_init(qmp); 866 + 867 + ret = clk_prepare_enable(qmp->pipe_clk); 868 + if (ret) { 869 + dev_err(qmp->dev, "pipe_clk enable failed err=%d\n", ret); 870 + return ret; 871 + } 872 + 873 + /* Tx, Rx, and PCS configurations */ 874 + qmp_usb_legacy_configure_lane(tx, cfg->tx_tbl, cfg->tx_tbl_num, 1); 875 + qmp_usb_legacy_configure_lane(rx, cfg->rx_tbl, cfg->rx_tbl_num, 1); 876 + 877 + if (cfg->lanes >= 2) { 878 + qmp_usb_legacy_configure_lane(qmp->tx2, cfg->tx_tbl, cfg->tx_tbl_num, 2); 879 + qmp_usb_legacy_configure_lane(qmp->rx2, cfg->rx_tbl, cfg->rx_tbl_num, 2); 880 + } 881 + 882 + qmp_usb_legacy_configure(pcs, cfg->pcs_tbl, cfg->pcs_tbl_num); 883 + 884 + usleep_range(10, 20); 885 + 886 + /* Pull PHY out of reset state */ 887 + qphy_clrbits(pcs, cfg->regs[QPHY_SW_RESET], SW_RESET); 888 + 889 + /* start SerDes and Phy-Coding-Sublayer */ 890 + qphy_setbits(pcs, cfg->regs[QPHY_START_CTRL], SERDES_START | PCS_START); 891 + 892 + status = pcs + cfg->regs[QPHY_PCS_STATUS]; 893 + ret = readl_poll_timeout(status, val, !(val & PHYSTATUS), 200, 894 + PHY_INIT_COMPLETE_TIMEOUT); 895 + if (ret) { 896 + dev_err(qmp->dev, "phy initialization timed-out\n"); 897 + goto err_disable_pipe_clk; 898 + } 899 + 900 + return 0; 901 + 902 + err_disable_pipe_clk: 903 + clk_disable_unprepare(qmp->pipe_clk); 904 + 905 + return ret; 906 + } 907 + 908 + static int qmp_usb_legacy_power_off(struct phy *phy) 909 + { 910 + struct qmp_usb *qmp = phy_get_drvdata(phy); 911 + const struct qmp_phy_cfg *cfg = qmp->cfg; 912 + 913 + clk_disable_unprepare(qmp->pipe_clk); 914 + 915 + /* PHY reset */ 916 + qphy_setbits(qmp->pcs, cfg->regs[QPHY_SW_RESET], SW_RESET); 917 + 918 + /* stop SerDes and Phy-Coding-Sublayer */ 919 + qphy_clrbits(qmp->pcs, cfg->regs[QPHY_START_CTRL], 920 + SERDES_START | PCS_START); 921 + 922 + /* Put PHY into POWER DOWN state: active low */ 923 + qphy_clrbits(qmp->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL], 924 + SW_PWRDN); 925 + 926 + return 0; 927 + } 928 + 929 + static int qmp_usb_legacy_enable(struct phy *phy) 930 + { 931 + int ret; 932 + 933 + ret = qmp_usb_legacy_init(phy); 934 + if (ret) 935 + return ret; 936 + 937 + ret = qmp_usb_legacy_power_on(phy); 938 + if (ret) 939 + qmp_usb_legacy_exit(phy); 940 + 941 + return ret; 942 + } 943 + 944 + static int qmp_usb_legacy_disable(struct phy *phy) 945 + { 946 + int ret; 947 + 948 + ret = qmp_usb_legacy_power_off(phy); 949 + if (ret) 950 + return ret; 951 + return qmp_usb_legacy_exit(phy); 952 + } 953 + 954 + static int qmp_usb_legacy_set_mode(struct phy *phy, enum phy_mode mode, int submode) 955 + { 956 + struct qmp_usb *qmp = phy_get_drvdata(phy); 957 + 958 + qmp->mode = mode; 959 + 960 + return 0; 961 + } 962 + 963 + static const struct phy_ops qmp_usb_legacy_phy_ops = { 964 + .init = qmp_usb_legacy_enable, 965 + .exit = qmp_usb_legacy_disable, 966 + .set_mode = qmp_usb_legacy_set_mode, 967 + .owner = THIS_MODULE, 968 + }; 969 + 970 + static void qmp_usb_legacy_enable_autonomous_mode(struct qmp_usb *qmp) 971 + { 972 + const struct qmp_phy_cfg *cfg = qmp->cfg; 973 + void __iomem *pcs_usb = qmp->pcs_usb ?: qmp->pcs; 974 + void __iomem *pcs_misc = qmp->pcs_misc; 975 + u32 intr_mask; 976 + 977 + if (qmp->mode == PHY_MODE_USB_HOST_SS || 978 + qmp->mode == PHY_MODE_USB_DEVICE_SS) 979 + intr_mask = ARCVR_DTCT_EN | ALFPS_DTCT_EN; 980 + else 981 + intr_mask = ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL; 982 + 983 + /* Clear any pending interrupts status */ 984 + qphy_setbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR); 985 + /* Writing 1 followed by 0 clears the interrupt */ 986 + qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR); 987 + 988 + qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL], 989 + ARCVR_DTCT_EN | ALFPS_DTCT_EN | ARCVR_DTCT_EVENT_SEL); 990 + 991 + /* Enable required PHY autonomous mode interrupts */ 992 + qphy_setbits(pcs_usb, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL], intr_mask); 993 + 994 + /* Enable i/o clamp_n for autonomous mode */ 995 + if (pcs_misc) 996 + qphy_clrbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN); 997 + } 998 + 999 + static void qmp_usb_legacy_disable_autonomous_mode(struct qmp_usb *qmp) 1000 + { 1001 + const struct qmp_phy_cfg *cfg = qmp->cfg; 1002 + void __iomem *pcs_usb = qmp->pcs_usb ?: qmp->pcs; 1003 + void __iomem *pcs_misc = qmp->pcs_misc; 1004 + 1005 + /* Disable i/o clamp_n on resume for normal mode */ 1006 + if (pcs_misc) 1007 + qphy_setbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN); 1008 + 1009 + qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL], 1010 + ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL | ALFPS_DTCT_EN); 1011 + 1012 + qphy_setbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR); 1013 + /* Writing 1 followed by 0 clears the interrupt */ 1014 + qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR); 1015 + } 1016 + 1017 + static int __maybe_unused qmp_usb_legacy_runtime_suspend(struct device *dev) 1018 + { 1019 + struct qmp_usb *qmp = dev_get_drvdata(dev); 1020 + const struct qmp_phy_cfg *cfg = qmp->cfg; 1021 + 1022 + dev_vdbg(dev, "Suspending QMP phy, mode:%d\n", qmp->mode); 1023 + 1024 + if (!qmp->phy->init_count) { 1025 + dev_vdbg(dev, "PHY not initialized, bailing out\n"); 1026 + return 0; 1027 + } 1028 + 1029 + qmp_usb_legacy_enable_autonomous_mode(qmp); 1030 + 1031 + clk_disable_unprepare(qmp->pipe_clk); 1032 + clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks); 1033 + 1034 + return 0; 1035 + } 1036 + 1037 + static int __maybe_unused qmp_usb_legacy_runtime_resume(struct device *dev) 1038 + { 1039 + struct qmp_usb *qmp = dev_get_drvdata(dev); 1040 + const struct qmp_phy_cfg *cfg = qmp->cfg; 1041 + int ret = 0; 1042 + 1043 + dev_vdbg(dev, "Resuming QMP phy, mode:%d\n", qmp->mode); 1044 + 1045 + if (!qmp->phy->init_count) { 1046 + dev_vdbg(dev, "PHY not initialized, bailing out\n"); 1047 + return 0; 1048 + } 1049 + 1050 + ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks); 1051 + if (ret) 1052 + return ret; 1053 + 1054 + ret = clk_prepare_enable(qmp->pipe_clk); 1055 + if (ret) { 1056 + dev_err(dev, "pipe_clk enable failed, err=%d\n", ret); 1057 + clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks); 1058 + return ret; 1059 + } 1060 + 1061 + qmp_usb_legacy_disable_autonomous_mode(qmp); 1062 + 1063 + return 0; 1064 + } 1065 + 1066 + static const struct dev_pm_ops qmp_usb_legacy_pm_ops = { 1067 + SET_RUNTIME_PM_OPS(qmp_usb_legacy_runtime_suspend, 1068 + qmp_usb_legacy_runtime_resume, NULL) 1069 + }; 1070 + 1071 + static int qmp_usb_legacy_vreg_init(struct qmp_usb *qmp) 1072 + { 1073 + const struct qmp_phy_cfg *cfg = qmp->cfg; 1074 + struct device *dev = qmp->dev; 1075 + int num = cfg->num_vregs; 1076 + int i; 1077 + 1078 + qmp->vregs = devm_kcalloc(dev, num, sizeof(*qmp->vregs), GFP_KERNEL); 1079 + if (!qmp->vregs) 1080 + return -ENOMEM; 1081 + 1082 + for (i = 0; i < num; i++) 1083 + qmp->vregs[i].supply = cfg->vreg_list[i]; 1084 + 1085 + return devm_regulator_bulk_get(dev, num, qmp->vregs); 1086 + } 1087 + 1088 + static int qmp_usb_legacy_reset_init(struct qmp_usb *qmp) 1089 + { 1090 + const struct qmp_phy_cfg *cfg = qmp->cfg; 1091 + struct device *dev = qmp->dev; 1092 + int i; 1093 + int ret; 1094 + 1095 + qmp->resets = devm_kcalloc(dev, cfg->num_resets, 1096 + sizeof(*qmp->resets), GFP_KERNEL); 1097 + if (!qmp->resets) 1098 + return -ENOMEM; 1099 + 1100 + for (i = 0; i < cfg->num_resets; i++) 1101 + qmp->resets[i].id = cfg->reset_list[i]; 1102 + 1103 + ret = devm_reset_control_bulk_get_exclusive(dev, cfg->num_resets, qmp->resets); 1104 + if (ret) 1105 + return dev_err_probe(dev, ret, "failed to get resets\n"); 1106 + 1107 + return 0; 1108 + } 1109 + 1110 + static int qmp_usb_legacy_clk_init(struct qmp_usb *qmp) 1111 + { 1112 + const struct qmp_phy_cfg *cfg = qmp->cfg; 1113 + struct device *dev = qmp->dev; 1114 + int num = cfg->num_clks; 1115 + int i; 1116 + 1117 + qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL); 1118 + if (!qmp->clks) 1119 + return -ENOMEM; 1120 + 1121 + for (i = 0; i < num; i++) 1122 + qmp->clks[i].id = cfg->clk_list[i]; 1123 + 1124 + return devm_clk_bulk_get(dev, num, qmp->clks); 1125 + } 1126 + 1127 + static void phy_clk_release_provider(void *res) 1128 + { 1129 + of_clk_del_provider(res); 1130 + } 1131 + 1132 + /* 1133 + * Register a fixed rate pipe clock. 1134 + * 1135 + * The <s>_pipe_clksrc generated by PHY goes to the GCC that gate 1136 + * controls it. The <s>_pipe_clk coming out of the GCC is requested 1137 + * by the PHY driver for its operations. 1138 + * We register the <s>_pipe_clksrc here. The gcc driver takes care 1139 + * of assigning this <s>_pipe_clksrc as parent to <s>_pipe_clk. 1140 + * Below picture shows this relationship. 1141 + * 1142 + * +---------------+ 1143 + * | PHY block |<<---------------------------------------+ 1144 + * | | | 1145 + * | +-------+ | +-----+ | 1146 + * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+ 1147 + * clk | +-------+ | +-----+ 1148 + * +---------------+ 1149 + */ 1150 + static int phy_pipe_clk_register(struct qmp_usb *qmp, struct device_node *np) 1151 + { 1152 + struct clk_fixed_rate *fixed = &qmp->pipe_clk_fixed; 1153 + struct clk_init_data init = { }; 1154 + int ret; 1155 + 1156 + ret = of_property_read_string(np, "clock-output-names", &init.name); 1157 + if (ret) { 1158 + dev_err(qmp->dev, "%pOFn: No clock-output-names\n", np); 1159 + return ret; 1160 + } 1161 + 1162 + init.ops = &clk_fixed_rate_ops; 1163 + 1164 + /* controllers using QMP phys use 125MHz pipe clock interface */ 1165 + fixed->fixed_rate = 125000000; 1166 + fixed->hw.init = &init; 1167 + 1168 + ret = devm_clk_hw_register(qmp->dev, &fixed->hw); 1169 + if (ret) 1170 + return ret; 1171 + 1172 + ret = of_clk_add_hw_provider(np, of_clk_hw_simple_get, &fixed->hw); 1173 + if (ret) 1174 + return ret; 1175 + 1176 + /* 1177 + * Roll a devm action because the clock provider is the child node, but 1178 + * the child node is not actually a device. 1179 + */ 1180 + return devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, np); 1181 + } 1182 + 1183 + static void __iomem *qmp_usb_legacy_iomap(struct device *dev, struct device_node *np, 1184 + int index, bool exclusive) 1185 + { 1186 + struct resource res; 1187 + 1188 + if (!exclusive) { 1189 + if (of_address_to_resource(np, index, &res)) 1190 + return IOMEM_ERR_PTR(-EINVAL); 1191 + 1192 + return devm_ioremap(dev, res.start, resource_size(&res)); 1193 + } 1194 + 1195 + return devm_of_iomap(dev, np, index, NULL); 1196 + } 1197 + 1198 + static int qmp_usb_legacy_parse_dt_legacy(struct qmp_usb *qmp, struct device_node *np) 1199 + { 1200 + struct platform_device *pdev = to_platform_device(qmp->dev); 1201 + const struct qmp_phy_cfg *cfg = qmp->cfg; 1202 + struct device *dev = qmp->dev; 1203 + bool exclusive = true; 1204 + 1205 + qmp->serdes = devm_platform_ioremap_resource(pdev, 0); 1206 + if (IS_ERR(qmp->serdes)) 1207 + return PTR_ERR(qmp->serdes); 1208 + 1209 + qmp->dp_com = devm_platform_ioremap_resource(pdev, 1); 1210 + if (IS_ERR(qmp->dp_com)) 1211 + return PTR_ERR(qmp->dp_com); 1212 + 1213 + /* 1214 + * Get memory resources for the PHY: 1215 + * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2. 1216 + * For dual lane PHYs: tx2 -> 3, rx2 -> 4, pcs_misc (optional) -> 5 1217 + * For single lane PHYs: pcs_misc (optional) -> 3. 1218 + */ 1219 + qmp->tx = devm_of_iomap(dev, np, 0, NULL); 1220 + if (IS_ERR(qmp->tx)) 1221 + return PTR_ERR(qmp->tx); 1222 + 1223 + qmp->rx = devm_of_iomap(dev, np, 1, NULL); 1224 + if (IS_ERR(qmp->rx)) 1225 + return PTR_ERR(qmp->rx); 1226 + 1227 + qmp->pcs = qmp_usb_legacy_iomap(dev, np, 2, exclusive); 1228 + if (IS_ERR(qmp->pcs)) 1229 + return PTR_ERR(qmp->pcs); 1230 + 1231 + if (cfg->pcs_usb_offset) 1232 + qmp->pcs_usb = qmp->pcs + cfg->pcs_usb_offset; 1233 + 1234 + if (cfg->lanes >= 2) { 1235 + qmp->tx2 = devm_of_iomap(dev, np, 3, NULL); 1236 + if (IS_ERR(qmp->tx2)) 1237 + return PTR_ERR(qmp->tx2); 1238 + 1239 + qmp->rx2 = devm_of_iomap(dev, np, 4, NULL); 1240 + if (IS_ERR(qmp->rx2)) 1241 + return PTR_ERR(qmp->rx2); 1242 + 1243 + qmp->pcs_misc = devm_of_iomap(dev, np, 5, NULL); 1244 + } else { 1245 + qmp->pcs_misc = devm_of_iomap(dev, np, 3, NULL); 1246 + } 1247 + 1248 + if (IS_ERR(qmp->pcs_misc)) { 1249 + dev_vdbg(dev, "PHY pcs_misc-reg not used\n"); 1250 + qmp->pcs_misc = NULL; 1251 + } 1252 + 1253 + qmp->pipe_clk = devm_get_clk_from_child(dev, np, NULL); 1254 + if (IS_ERR(qmp->pipe_clk)) { 1255 + return dev_err_probe(dev, PTR_ERR(qmp->pipe_clk), 1256 + "failed to get pipe clock\n"); 1257 + } 1258 + 1259 + return 0; 1260 + } 1261 + 1262 + static int qmp_usb_legacy_parse_dt(struct qmp_usb *qmp) 1263 + { 1264 + struct platform_device *pdev = to_platform_device(qmp->dev); 1265 + const struct qmp_phy_cfg *cfg = qmp->cfg; 1266 + const struct qmp_usb_legacy_offsets *offs = cfg->offsets; 1267 + struct device *dev = qmp->dev; 1268 + void __iomem *base; 1269 + 1270 + if (!offs) 1271 + return -EINVAL; 1272 + 1273 + base = devm_platform_ioremap_resource(pdev, 0); 1274 + if (IS_ERR(base)) 1275 + return PTR_ERR(base); 1276 + 1277 + qmp->serdes = base + offs->serdes; 1278 + qmp->pcs = base + offs->pcs; 1279 + qmp->pcs_usb = base + offs->pcs_usb; 1280 + qmp->tx = base + offs->tx; 1281 + qmp->rx = base + offs->rx; 1282 + 1283 + qmp->pipe_clk = devm_clk_get(dev, "pipe"); 1284 + if (IS_ERR(qmp->pipe_clk)) { 1285 + return dev_err_probe(dev, PTR_ERR(qmp->pipe_clk), 1286 + "failed to get pipe clock\n"); 1287 + } 1288 + 1289 + return 0; 1290 + } 1291 + 1292 + static int qmp_usb_legacy_probe(struct platform_device *pdev) 1293 + { 1294 + struct device *dev = &pdev->dev; 1295 + struct phy_provider *phy_provider; 1296 + struct device_node *np; 1297 + struct qmp_usb *qmp; 1298 + int ret; 1299 + 1300 + qmp = devm_kzalloc(dev, sizeof(*qmp), GFP_KERNEL); 1301 + if (!qmp) 1302 + return -ENOMEM; 1303 + 1304 + qmp->dev = dev; 1305 + 1306 + qmp->cfg = of_device_get_match_data(dev); 1307 + if (!qmp->cfg) 1308 + return -EINVAL; 1309 + 1310 + ret = qmp_usb_legacy_clk_init(qmp); 1311 + if (ret) 1312 + return ret; 1313 + 1314 + ret = qmp_usb_legacy_reset_init(qmp); 1315 + if (ret) 1316 + return ret; 1317 + 1318 + ret = qmp_usb_legacy_vreg_init(qmp); 1319 + if (ret) 1320 + return ret; 1321 + 1322 + /* Check for legacy binding with child node. */ 1323 + np = of_get_next_available_child(dev->of_node, NULL); 1324 + if (np) { 1325 + ret = qmp_usb_legacy_parse_dt_legacy(qmp, np); 1326 + } else { 1327 + np = of_node_get(dev->of_node); 1328 + ret = qmp_usb_legacy_parse_dt(qmp); 1329 + } 1330 + if (ret) 1331 + goto err_node_put; 1332 + 1333 + pm_runtime_set_active(dev); 1334 + ret = devm_pm_runtime_enable(dev); 1335 + if (ret) 1336 + goto err_node_put; 1337 + /* 1338 + * Prevent runtime pm from being ON by default. Users can enable 1339 + * it using power/control in sysfs. 1340 + */ 1341 + pm_runtime_forbid(dev); 1342 + 1343 + ret = phy_pipe_clk_register(qmp, np); 1344 + if (ret) 1345 + goto err_node_put; 1346 + 1347 + qmp->phy = devm_phy_create(dev, np, &qmp_usb_legacy_phy_ops); 1348 + if (IS_ERR(qmp->phy)) { 1349 + ret = PTR_ERR(qmp->phy); 1350 + dev_err(dev, "failed to create PHY: %d\n", ret); 1351 + goto err_node_put; 1352 + } 1353 + 1354 + phy_set_drvdata(qmp->phy, qmp); 1355 + 1356 + of_node_put(np); 1357 + 1358 + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); 1359 + 1360 + return PTR_ERR_OR_ZERO(phy_provider); 1361 + 1362 + err_node_put: 1363 + of_node_put(np); 1364 + return ret; 1365 + } 1366 + 1367 + static const struct of_device_id qmp_usb_legacy_of_match_table[] = { 1368 + { 1369 + .compatible = "qcom,sc7180-qmp-usb3-phy", 1370 + .data = &sc7180_usb3phy_cfg, 1371 + }, { 1372 + .compatible = "qcom,sc8180x-qmp-usb3-phy", 1373 + .data = &sm8150_usb3phy_cfg, 1374 + }, { 1375 + .compatible = "qcom,sdm845-qmp-usb3-phy", 1376 + .data = &qmp_v3_usb3phy_cfg, 1377 + }, { 1378 + .compatible = "qcom,sm8150-qmp-usb3-phy", 1379 + .data = &sm8150_usb3phy_cfg, 1380 + }, { 1381 + .compatible = "qcom,sm8250-qmp-usb3-phy", 1382 + .data = &sm8250_usb3phy_cfg, 1383 + }, { 1384 + .compatible = "qcom,sm8350-qmp-usb3-phy", 1385 + .data = &sm8350_usb3phy_cfg, 1386 + }, { 1387 + .compatible = "qcom,sm8450-qmp-usb3-phy", 1388 + .data = &sm8350_usb3phy_cfg, 1389 + }, 1390 + { }, 1391 + }; 1392 + MODULE_DEVICE_TABLE(of, qmp_usb_legacy_of_match_table); 1393 + 1394 + static struct platform_driver qmp_usb_legacy_driver = { 1395 + .probe = qmp_usb_legacy_probe, 1396 + .driver = { 1397 + .name = "qcom-qmp-usb-legacy-phy", 1398 + .pm = &qmp_usb_legacy_pm_ops, 1399 + .of_match_table = qmp_usb_legacy_of_match_table, 1400 + }, 1401 + }; 1402 + 1403 + module_platform_driver(qmp_usb_legacy_driver); 1404 + 1405 + MODULE_AUTHOR("Vivek Gautam <vivek.gautam@codeaurora.org>"); 1406 + MODULE_DESCRIPTION("Qualcomm QMP legacy USB+DP PHY driver"); 1407 + MODULE_LICENSE("GPL v2");
-557
drivers/phy/qualcomm/phy-qcom-qmp-usb.c
··· 12 12 #include <linux/kernel.h> 13 13 #include <linux/module.h> 14 14 #include <linux/of.h> 15 - #include <linux/of_device.h> 16 15 #include <linux/of_address.h> 17 16 #include <linux/phy/phy.h> 18 17 #include <linux/platform_device.h> ··· 366 367 QMP_PHY_INIT_CFG(QPHY_V2_PCS_POWER_STATE_CONFIG2, 0x08), 367 368 }; 368 369 369 - static const struct qmp_phy_init_tbl qmp_v3_usb3_serdes_tbl[] = { 370 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07), 371 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14), 372 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x08), 373 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30), 374 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02), 375 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08), 376 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x16), 377 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01), 378 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80), 379 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82), 380 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab), 381 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea), 382 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02), 383 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06), 384 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16), 385 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36), 386 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00), 387 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f), 388 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01), 389 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9), 390 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a), 391 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00), 392 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34), 393 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15), 394 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04), 395 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00), 396 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00), 397 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00), 398 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x0a), 399 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01), 400 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31), 401 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01), 402 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00), 403 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00), 404 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85), 405 - QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07), 406 - }; 407 - 408 - static const struct qmp_phy_init_tbl qmp_v3_usb3_tx_tbl[] = { 409 - QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10), 410 - QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12), 411 - QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x16), 412 - QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x09), 413 - QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06), 414 - }; 415 - 416 - static const struct qmp_phy_init_tbl qmp_v3_usb3_rx_tbl[] = { 417 - QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b), 418 - QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 419 - QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e), 420 - QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18), 421 - QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77), 422 - QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80), 423 - QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03), 424 - QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16), 425 - QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75), 426 - }; 427 - 428 - static const struct qmp_phy_init_tbl qmp_v3_usb3_pcs_tbl[] = { 429 - /* FLL settings */ 430 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83), 431 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09), 432 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2), 433 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40), 434 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02), 435 - 436 - /* Lock Det settings */ 437 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1), 438 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f), 439 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47), 440 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b), 441 - 442 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xba), 443 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f), 444 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f), 445 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7), 446 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e), 447 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65), 448 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b), 449 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15), 450 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d), 451 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15), 452 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d), 453 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15), 454 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d), 455 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15), 456 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d), 457 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15), 458 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d), 459 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15), 460 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d), 461 - 462 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02), 463 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04), 464 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44), 465 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04), 466 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7), 467 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03), 468 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40), 469 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00), 470 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75), 471 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86), 472 - QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13), 473 - }; 474 - 475 370 static const struct qmp_phy_init_tbl qmp_v3_usb3_uniphy_serdes_tbl[] = { 476 371 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07), 477 372 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14), ··· 586 693 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13), 587 694 }; 588 695 589 - static const struct qmp_phy_init_tbl sm8150_usb3_serdes_tbl[] = { 590 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01), 591 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31), 592 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER2, 0x01), 593 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE0, 0xde), 594 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE0, 0x07), 595 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE1, 0xde), 596 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE1, 0x07), 597 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x0a), 598 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_IPTRIM, 0x20), 599 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06), 600 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06), 601 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16), 602 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16), 603 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36), 604 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36), 605 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x1a), 606 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04), 607 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x14), 608 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x34), 609 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x34), 610 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x82), 611 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82), 612 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x82), 613 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0xab), 614 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0xea), 615 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x02), 616 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02), 617 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE1, 0xab), 618 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE1, 0xea), 619 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE1, 0x02), 620 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE0, 0x24), 621 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE1, 0x24), 622 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE2_MODE1, 0x02), 623 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01), 624 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x08), 625 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca), 626 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e), 627 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xca), 628 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x1e), 629 - QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11), 630 - }; 631 - 632 - static const struct qmp_phy_init_tbl sm8150_usb3_tx_tbl[] = { 633 - QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x00), 634 - QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x00), 635 - QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5), 636 - QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12), 637 - QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x20), 638 - }; 639 - 640 - static const struct qmp_phy_init_tbl sm8150_usb3_rx_tbl[] = { 641 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x05), 642 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f), 643 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f), 644 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff), 645 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f), 646 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99), 647 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04), 648 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08), 649 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05), 650 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05), 651 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54), 652 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0e), 653 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 654 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a), 655 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a), 656 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0), 657 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00), 658 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77), 659 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04), 660 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e), 661 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xbf), 662 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xbf), 663 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x3f), 664 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f), 665 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x94), 666 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc), 667 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc), 668 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c), 669 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x0b), 670 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb3), 671 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04), 672 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38), 673 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0), 674 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c), 675 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f), 676 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10), 677 - }; 678 - 679 - static const struct qmp_phy_init_tbl sm8150_usb3_pcs_tbl[] = { 680 - /* Lock Det settings */ 681 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0), 682 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07), 683 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13), 684 - 685 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21), 686 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa), 687 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a), 688 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88), 689 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13), 690 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c), 691 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b), 692 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10), 693 - }; 694 - 695 - static const struct qmp_phy_init_tbl sm8150_usb3_pcs_usb_tbl[] = { 696 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8), 697 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07), 698 - }; 699 - 700 696 static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_serdes_tbl[] = { 701 697 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x1a), 702 698 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11), ··· 693 911 }; 694 912 695 913 static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_pcs_usb_tbl[] = { 696 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8), 697 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07), 698 - }; 699 - 700 - static const struct qmp_phy_init_tbl sm8250_usb3_tx_tbl[] = { 701 - QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x60), 702 - QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x60), 703 - QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11), 704 - QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x02), 705 - QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5), 706 - QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12), 707 - QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x40, 1), 708 - QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x54, 2), 709 - }; 710 - 711 - static const struct qmp_phy_init_tbl sm8250_usb3_rx_tbl[] = { 712 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x06), 713 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f), 714 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f), 715 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff), 716 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f), 717 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99), 718 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04), 719 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08), 720 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05), 721 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05), 722 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54), 723 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c), 724 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 725 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a), 726 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a), 727 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0), 728 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00), 729 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77), 730 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04), 731 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e), 732 - QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0xff, 1), 733 - QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0x7f, 2), 734 - QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x7f, 1), 735 - QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xff, 2), 736 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x7f), 737 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f), 738 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x97), 739 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc), 740 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc), 741 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c), 742 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x7b), 743 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb4), 744 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04), 745 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38), 746 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0), 747 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c), 748 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f), 749 - QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10), 750 - }; 751 - 752 - static const struct qmp_phy_init_tbl sm8250_usb3_pcs_tbl[] = { 753 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0), 754 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07), 755 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20), 756 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13), 757 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21), 758 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xa9), 759 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a), 760 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88), 761 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13), 762 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c), 763 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b), 764 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10), 765 - }; 766 - 767 - static const struct qmp_phy_init_tbl sm8250_usb3_pcs_usb_tbl[] = { 768 914 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8), 769 915 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07), 770 916 }; ··· 856 1146 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x05), 857 1147 QMP_PHY_INIT_CFG(QSERDES_V5_RX_GM_CAL, 0x00), 858 1148 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_ENABLES, 0x00), 859 - }; 860 - 861 - static const struct qmp_phy_init_tbl sm8350_usb3_tx_tbl[] = { 862 - QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_TX, 0x00), 863 - QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_RX, 0x00), 864 - QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x16), 865 - QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x0e), 866 - QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0x35), 867 - QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_3, 0x3f), 868 - QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_4, 0x7f), 869 - QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_5, 0x3f), 870 - QMP_PHY_INIT_CFG(QSERDES_V5_TX_RCV_DETECT_LVL_2, 0x12), 871 - QMP_PHY_INIT_CFG(QSERDES_V5_TX_PI_QEC_CTRL, 0x21), 872 - }; 873 - 874 - static const struct qmp_phy_init_tbl sm8350_usb3_rx_tbl[] = { 875 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0a), 876 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x05), 877 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f), 878 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f), 879 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff), 880 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f), 881 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0x99), 882 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH1, 0x08), 883 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH2, 0x08), 884 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN1, 0x00), 885 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN2, 0x04), 886 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL1, 0x54), 887 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x0f), 888 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), 889 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a), 890 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a), 891 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_LOW, 0xc0), 892 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_HIGH, 0x00), 893 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47), 894 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_CNTRL, 0x04), 895 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_DEGLITCH_CNTRL, 0x0e), 896 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0xbb), 897 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0x7b), 898 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xbb), 899 - QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3d, 1), 900 - QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3c, 2), 901 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0xdb), 902 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0x64), 903 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0x24), 904 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH2, 0xd2), 905 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH3, 0x13), 906 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0xa9), 907 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_EN_TIMER, 0x04), 908 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38), 909 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_AUX_DATA_TCOARSE_TFINE, 0xa0), 910 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_DCC_CTRL1, 0x0c), 911 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_GM_CAL, 0x00), 912 - QMP_PHY_INIT_CFG(QSERDES_V5_RX_VTH_CODE, 0x10), 913 - }; 914 - 915 - static const struct qmp_phy_init_tbl sm8350_usb3_pcs_tbl[] = { 916 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7), 917 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03), 918 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0), 919 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07), 920 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20), 921 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13), 922 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21), 923 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa), 924 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a), 925 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88), 926 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13), 927 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c), 928 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b), 929 - QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10), 930 - }; 931 - 932 - static const struct qmp_phy_init_tbl sm8350_usb3_pcs_usb_tbl[] = { 933 - QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40), 934 - QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_H, 0x00), 935 - QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8), 936 - QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07), 937 1149 }; 938 1150 939 1151 static const struct qmp_phy_init_tbl sm8350_usb3_uniphy_tx_tbl[] = { ··· 1188 1556 /* true, if PHY needs delay after POWER_DOWN */ 1189 1557 bool has_pwrdn_delay; 1190 1558 1191 - /* true, if PHY has a separate DP_COM control block */ 1192 - bool has_phy_dp_com_ctrl; 1193 - 1194 1559 /* Offset from PCS to PCS_USB region */ 1195 1560 unsigned int pcs_usb_offset; 1196 1561 }; ··· 1205 1576 void __iomem *rx; 1206 1577 void __iomem *tx2; 1207 1578 void __iomem *rx2; 1208 - 1209 - void __iomem *dp_com; 1210 1579 1211 1580 struct clk *pipe_clk; 1212 1581 struct clk_bulk_data *clks; ··· 1259 1632 "aux", "ref_clk_src", "ref", "com_aux", 1260 1633 }; 1261 1634 1262 - /* the primary usb3 phy on sm8250 doesn't have a ref clock */ 1263 - static const char * const qmp_v4_sm8250_usbphy_clk_l[] = { 1264 - "aux", "ref_clk_src", "com_aux" 1265 - }; 1266 - 1267 1635 /* usb3 phy on sdx55 doesn't have com_aux clock */ 1268 1636 static const char * const qmp_v4_sdx55_usbphy_clk_l[] = { 1269 1637 "aux", "cfg_ahb", "ref" ··· 1271 1649 /* list of resets */ 1272 1650 static const char * const msm8996_usb3phy_reset_l[] = { 1273 1651 "phy", "common", 1274 - }; 1275 - 1276 - static const char * const sc7180_usb3phy_reset_l[] = { 1277 - "phy", 1278 1652 }; 1279 1653 1280 1654 static const char * const qcm2290_usb3phy_reset_l[] = { ··· 1370 1752 .regs = qmp_v2_usb3phy_regs_layout, 1371 1753 }; 1372 1754 1373 - static const struct qmp_phy_cfg qmp_v3_usb3phy_cfg = { 1374 - .lanes = 2, 1375 - 1376 - .serdes_tbl = qmp_v3_usb3_serdes_tbl, 1377 - .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl), 1378 - .tx_tbl = qmp_v3_usb3_tx_tbl, 1379 - .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl), 1380 - .rx_tbl = qmp_v3_usb3_rx_tbl, 1381 - .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_rx_tbl), 1382 - .pcs_tbl = qmp_v3_usb3_pcs_tbl, 1383 - .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl), 1384 - .clk_list = qmp_v3_phy_clk_l, 1385 - .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l), 1386 - .reset_list = msm8996_usb3phy_reset_l, 1387 - .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 1388 - .vreg_list = qmp_phy_vreg_l, 1389 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1390 - .regs = qmp_v3_usb3phy_regs_layout, 1391 - 1392 - .has_pwrdn_delay = true, 1393 - .has_phy_dp_com_ctrl = true, 1394 - }; 1395 - 1396 1755 static const struct qmp_phy_cfg sa8775p_usb3_uniphy_cfg = { 1397 1756 .lanes = 1, 1398 1757 ··· 1390 1795 .vreg_list = qmp_phy_vreg_l, 1391 1796 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1392 1797 .regs = qmp_v5_usb3phy_regs_layout, 1393 - }; 1394 - 1395 - static const struct qmp_phy_cfg sc7180_usb3phy_cfg = { 1396 - .lanes = 2, 1397 - 1398 - .serdes_tbl = qmp_v3_usb3_serdes_tbl, 1399 - .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl), 1400 - .tx_tbl = qmp_v3_usb3_tx_tbl, 1401 - .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl), 1402 - .rx_tbl = qmp_v3_usb3_rx_tbl, 1403 - .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_rx_tbl), 1404 - .pcs_tbl = qmp_v3_usb3_pcs_tbl, 1405 - .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl), 1406 - .clk_list = qmp_v3_phy_clk_l, 1407 - .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l), 1408 - .reset_list = sc7180_usb3phy_reset_l, 1409 - .num_resets = ARRAY_SIZE(sc7180_usb3phy_reset_l), 1410 - .vreg_list = qmp_phy_vreg_l, 1411 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1412 - .regs = qmp_v3_usb3phy_regs_layout, 1413 - 1414 - .has_pwrdn_delay = true, 1415 - .has_phy_dp_com_ctrl = true, 1416 1798 }; 1417 1799 1418 1800 static const struct qmp_phy_cfg sc8280xp_usb3_uniphy_cfg = { ··· 1456 1884 .regs = qmp_v3_usb3phy_regs_layout, 1457 1885 }; 1458 1886 1459 - static const struct qmp_phy_cfg sm8150_usb3phy_cfg = { 1460 - .lanes = 2, 1461 - 1462 - .serdes_tbl = sm8150_usb3_serdes_tbl, 1463 - .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl), 1464 - .tx_tbl = sm8150_usb3_tx_tbl, 1465 - .tx_tbl_num = ARRAY_SIZE(sm8150_usb3_tx_tbl), 1466 - .rx_tbl = sm8150_usb3_rx_tbl, 1467 - .rx_tbl_num = ARRAY_SIZE(sm8150_usb3_rx_tbl), 1468 - .pcs_tbl = sm8150_usb3_pcs_tbl, 1469 - .pcs_tbl_num = ARRAY_SIZE(sm8150_usb3_pcs_tbl), 1470 - .pcs_usb_tbl = sm8150_usb3_pcs_usb_tbl, 1471 - .pcs_usb_tbl_num = ARRAY_SIZE(sm8150_usb3_pcs_usb_tbl), 1472 - .clk_list = qmp_v4_ref_phy_clk_l, 1473 - .num_clks = ARRAY_SIZE(qmp_v4_ref_phy_clk_l), 1474 - .reset_list = msm8996_usb3phy_reset_l, 1475 - .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 1476 - .vreg_list = qmp_phy_vreg_l, 1477 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1478 - .regs = qmp_v4_usb3phy_regs_layout, 1479 - .pcs_usb_offset = 0x300, 1480 - 1481 - .has_pwrdn_delay = true, 1482 - .has_phy_dp_com_ctrl = true, 1483 - }; 1484 - 1485 1887 static const struct qmp_phy_cfg sm8150_usb3_uniphy_cfg = { 1486 1888 .lanes = 1, 1487 1889 ··· 1479 1933 .pcs_usb_offset = 0x600, 1480 1934 1481 1935 .has_pwrdn_delay = true, 1482 - }; 1483 - 1484 - static const struct qmp_phy_cfg sm8250_usb3phy_cfg = { 1485 - .lanes = 2, 1486 - 1487 - .serdes_tbl = sm8150_usb3_serdes_tbl, 1488 - .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl), 1489 - .tx_tbl = sm8250_usb3_tx_tbl, 1490 - .tx_tbl_num = ARRAY_SIZE(sm8250_usb3_tx_tbl), 1491 - .rx_tbl = sm8250_usb3_rx_tbl, 1492 - .rx_tbl_num = ARRAY_SIZE(sm8250_usb3_rx_tbl), 1493 - .pcs_tbl = sm8250_usb3_pcs_tbl, 1494 - .pcs_tbl_num = ARRAY_SIZE(sm8250_usb3_pcs_tbl), 1495 - .pcs_usb_tbl = sm8250_usb3_pcs_usb_tbl, 1496 - .pcs_usb_tbl_num = ARRAY_SIZE(sm8250_usb3_pcs_usb_tbl), 1497 - .clk_list = qmp_v4_sm8250_usbphy_clk_l, 1498 - .num_clks = ARRAY_SIZE(qmp_v4_sm8250_usbphy_clk_l), 1499 - .reset_list = msm8996_usb3phy_reset_l, 1500 - .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 1501 - .vreg_list = qmp_phy_vreg_l, 1502 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1503 - .regs = qmp_v4_usb3phy_regs_layout, 1504 - .pcs_usb_offset = 0x300, 1505 - 1506 - .has_pwrdn_delay = true, 1507 - .has_phy_dp_com_ctrl = true, 1508 1936 }; 1509 1937 1510 1938 static const struct qmp_phy_cfg sm8250_usb3_uniphy_cfg = { ··· 1554 2034 .pcs_usb_offset = 0x1000, 1555 2035 1556 2036 .has_pwrdn_delay = true, 1557 - }; 1558 - 1559 - static const struct qmp_phy_cfg sm8350_usb3phy_cfg = { 1560 - .lanes = 2, 1561 - 1562 - .serdes_tbl = sm8150_usb3_serdes_tbl, 1563 - .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl), 1564 - .tx_tbl = sm8350_usb3_tx_tbl, 1565 - .tx_tbl_num = ARRAY_SIZE(sm8350_usb3_tx_tbl), 1566 - .rx_tbl = sm8350_usb3_rx_tbl, 1567 - .rx_tbl_num = ARRAY_SIZE(sm8350_usb3_rx_tbl), 1568 - .pcs_tbl = sm8350_usb3_pcs_tbl, 1569 - .pcs_tbl_num = ARRAY_SIZE(sm8350_usb3_pcs_tbl), 1570 - .pcs_usb_tbl = sm8350_usb3_pcs_usb_tbl, 1571 - .pcs_usb_tbl_num = ARRAY_SIZE(sm8350_usb3_pcs_usb_tbl), 1572 - .clk_list = qmp_v4_sm8250_usbphy_clk_l, 1573 - .num_clks = ARRAY_SIZE(qmp_v4_sm8250_usbphy_clk_l), 1574 - .reset_list = msm8996_usb3phy_reset_l, 1575 - .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l), 1576 - .vreg_list = qmp_phy_vreg_l, 1577 - .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1578 - .regs = qmp_v5_usb3phy_regs_layout, 1579 - .pcs_usb_offset = 0x300, 1580 - 1581 - .has_pwrdn_delay = true, 1582 - .has_phy_dp_com_ctrl = true, 1583 2037 }; 1584 2038 1585 2039 static const struct qmp_phy_cfg sm8350_usb3_uniphy_cfg = { ··· 1646 2152 struct qmp_usb *qmp = phy_get_drvdata(phy); 1647 2153 const struct qmp_phy_cfg *cfg = qmp->cfg; 1648 2154 void __iomem *pcs = qmp->pcs; 1649 - void __iomem *dp_com = qmp->dp_com; 1650 2155 int ret; 1651 2156 1652 2157 ret = regulator_bulk_enable(cfg->num_vregs, qmp->vregs); ··· 1669 2176 ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks); 1670 2177 if (ret) 1671 2178 goto err_assert_reset; 1672 - 1673 - if (cfg->has_phy_dp_com_ctrl) { 1674 - qphy_setbits(dp_com, QPHY_V3_DP_COM_POWER_DOWN_CTRL, 1675 - SW_PWRDN); 1676 - /* override hardware control for reset of qmp phy */ 1677 - qphy_setbits(dp_com, QPHY_V3_DP_COM_RESET_OVRD_CTRL, 1678 - SW_DPPHY_RESET_MUX | SW_DPPHY_RESET | 1679 - SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET); 1680 - 1681 - /* Default type-c orientation, i.e CC1 */ 1682 - qphy_setbits(dp_com, QPHY_V3_DP_COM_TYPEC_CTRL, 0x02); 1683 - 1684 - qphy_setbits(dp_com, QPHY_V3_DP_COM_PHY_MODE_CTRL, 1685 - USB3_MODE | DP_MODE); 1686 - 1687 - /* bring both QMP USB and QMP DP PHYs PCS block out of reset */ 1688 - qphy_clrbits(dp_com, QPHY_V3_DP_COM_RESET_OVRD_CTRL, 1689 - SW_DPPHY_RESET_MUX | SW_DPPHY_RESET | 1690 - SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET); 1691 - 1692 - qphy_clrbits(dp_com, QPHY_V3_DP_COM_SWI_CTRL, 0x03); 1693 - qphy_clrbits(dp_com, QPHY_V3_DP_COM_SW_RESET, SW_RESET); 1694 - } 1695 2179 1696 2180 qphy_setbits(pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL], SW_PWRDN); 1697 2181 ··· 2052 2582 if (IS_ERR(qmp->serdes)) 2053 2583 return PTR_ERR(qmp->serdes); 2054 2584 2055 - if (cfg->has_phy_dp_com_ctrl) { 2056 - qmp->dp_com = devm_platform_ioremap_resource(pdev, 1); 2057 - if (IS_ERR(qmp->dp_com)) 2058 - return PTR_ERR(qmp->dp_com); 2059 - } 2060 - 2061 2585 /* 2062 2586 * FIXME: These bindings should be fixed to not rely on overlapping 2063 2587 * mappings for PCS. ··· 2244 2780 .compatible = "qcom,sa8775p-qmp-usb3-uni-phy", 2245 2781 .data = &sa8775p_usb3_uniphy_cfg, 2246 2782 }, { 2247 - .compatible = "qcom,sc7180-qmp-usb3-phy", 2248 - .data = &sc7180_usb3phy_cfg, 2249 - }, { 2250 - .compatible = "qcom,sc8180x-qmp-usb3-phy", 2251 - .data = &sm8150_usb3phy_cfg, 2252 - }, { 2253 2783 .compatible = "qcom,sc8280xp-qmp-usb3-uni-phy", 2254 2784 .data = &sc8280xp_usb3_uniphy_cfg, 2255 - }, { 2256 - .compatible = "qcom,sdm845-qmp-usb3-phy", 2257 - .data = &qmp_v3_usb3phy_cfg, 2258 2785 }, { 2259 2786 .compatible = "qcom,sdm845-qmp-usb3-uni-phy", 2260 2787 .data = &qmp_v3_usb3_uniphy_cfg, ··· 2259 2804 .compatible = "qcom,sm6115-qmp-usb3-phy", 2260 2805 .data = &qcm2290_usb3phy_cfg, 2261 2806 }, { 2262 - .compatible = "qcom,sm8150-qmp-usb3-phy", 2263 - .data = &sm8150_usb3phy_cfg, 2264 - }, { 2265 2807 .compatible = "qcom,sm8150-qmp-usb3-uni-phy", 2266 2808 .data = &sm8150_usb3_uniphy_cfg, 2267 - }, { 2268 - .compatible = "qcom,sm8250-qmp-usb3-phy", 2269 - .data = &sm8250_usb3phy_cfg, 2270 2809 }, { 2271 2810 .compatible = "qcom,sm8250-qmp-usb3-uni-phy", 2272 2811 .data = &sm8250_usb3_uniphy_cfg, 2273 2812 }, { 2274 - .compatible = "qcom,sm8350-qmp-usb3-phy", 2275 - .data = &sm8350_usb3phy_cfg, 2276 - }, { 2277 2813 .compatible = "qcom,sm8350-qmp-usb3-uni-phy", 2278 2814 .data = &sm8350_usb3_uniphy_cfg, 2279 - }, { 2280 - .compatible = "qcom,sm8450-qmp-usb3-phy", 2281 - .data = &sm8350_usb3phy_cfg, 2282 2815 }, 2283 2816 { }, 2284 2817 };
+2
drivers/phy/qualcomm/phy-qcom-qmp.h
··· 134 134 #define QPHY_V4_PCS_MISC_TYPEC_STATUS 0x10 135 135 #define QPHY_V4_PCS_MISC_PLACEHOLDER_STATUS 0x14 136 136 137 + #define QSERDES_V5_DP_PHY_STATUS 0x0dc 138 + 137 139 /* Only for QMP V6 PHY - DP PHY registers */ 138 140 #define QSERDES_V6_DP_PHY_AUX_INTERRUPT_STATUS 0x0e0 139 141 #define QSERDES_V6_DP_PHY_STATUS 0x0e4
-1
drivers/phy/qualcomm/phy-qcom-qusb2.c
··· 12 12 #include <linux/module.h> 13 13 #include <linux/nvmem-consumer.h> 14 14 #include <linux/of.h> 15 - #include <linux/of_device.h> 16 15 #include <linux/phy/phy.h> 17 16 #include <linux/platform_device.h> 18 17 #include <linux/regmap.h>
+1
drivers/phy/qualcomm/phy-qcom-snps-eusb2.c
··· 7 7 #include <linux/clk.h> 8 8 #include <linux/delay.h> 9 9 #include <linux/iopoll.h> 10 + #include <linux/mod_devicetable.h> 10 11 #include <linux/phy/phy.h> 11 12 #include <linux/platform_device.h> 12 13 #include <linux/regulator/consumer.h>
-1
drivers/phy/qualcomm/phy-qcom-snps-femto-v2.c
··· 10 10 #include <linux/kernel.h> 11 11 #include <linux/module.h> 12 12 #include <linux/of.h> 13 - #include <linux/of_device.h> 14 13 #include <linux/phy/phy.h> 15 14 #include <linux/platform_device.h> 16 15 #include <linux/regmap.h>
+1 -1
drivers/phy/qualcomm/phy-qcom-usb-hs.c
··· 7 7 #include <linux/ulpi/regs.h> 8 8 #include <linux/clk.h> 9 9 #include <linux/regulator/consumer.h> 10 - #include <linux/of_device.h> 10 + #include <linux/of.h> 11 11 #include <linux/phy/phy.h> 12 12 #include <linux/reset.h> 13 13 #include <linux/extcon.h>
+1 -2
drivers/phy/ralink/phy-mt7621-pci.c
··· 9 9 #include <linux/bitfield.h> 10 10 #include <linux/bitops.h> 11 11 #include <linux/module.h> 12 - #include <linux/of_address.h> 13 - #include <linux/of_device.h> 12 + #include <linux/of.h> 14 13 #include <linux/phy/phy.h> 15 14 #include <linux/platform_device.h> 16 15 #include <linux/regmap.h>
-1
drivers/phy/renesas/phy-rcar-gen2.c
··· 16 16 #include <linux/platform_device.h> 17 17 #include <linux/spinlock.h> 18 18 #include <linux/atomic.h> 19 - #include <linux/of_device.h> 20 19 21 20 #define USBHS_LPSTS 0x02 22 21 #define USBHS_UGCTRL 0x80
-1
drivers/phy/renesas/phy-rcar-gen3-pcie.c
··· 10 10 #include <linux/module.h> 11 11 #include <linux/of.h> 12 12 #include <linux/phy/phy.h> 13 - #include <linux/of_device.h> 14 13 #include <linux/platform_device.h> 15 14 #include <linux/spinlock.h> 16 15
-2
drivers/phy/renesas/phy-rcar-gen3-usb2.c
··· 15 15 #include <linux/module.h> 16 16 #include <linux/mutex.h> 17 17 #include <linux/of.h> 18 - #include <linux/of_address.h> 19 - #include <linux/of_device.h> 20 18 #include <linux/phy/phy.h> 21 19 #include <linux/platform_device.h> 22 20 #include <linux/pm_runtime.h>
+2 -8
drivers/phy/renesas/r8a779f0-ether-serdes.c
··· 8 8 #include <linux/err.h> 9 9 #include <linux/iopoll.h> 10 10 #include <linux/kernel.h> 11 + #include <linux/of.h> 11 12 #include <linux/phy.h> 12 13 #include <linux/phy/phy.h> 13 14 #include <linux/platform_device.h> ··· 340 339 { 341 340 struct r8a779f0_eth_serdes_drv_data *dd; 342 341 struct phy_provider *provider; 343 - struct resource *res; 344 342 int i; 345 - 346 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 347 - if (!res) { 348 - dev_err(&pdev->dev, "invalid resource\n"); 349 - return -EINVAL; 350 - } 351 343 352 344 dd = devm_kzalloc(&pdev->dev, sizeof(*dd), GFP_KERNEL); 353 345 if (!dd) ··· 348 354 349 355 platform_set_drvdata(pdev, dd); 350 356 dd->pdev = pdev; 351 - dd->addr = devm_ioremap_resource(&pdev->dev, res); 357 + dd->addr = devm_platform_ioremap_resource(pdev, 0); 352 358 if (IS_ERR(dd->addr)) 353 359 return PTR_ERR(dd->addr); 354 360
-1
drivers/phy/rockchip/phy-rockchip-dphy-rx0.c
··· 21 21 #include <linux/mfd/syscon.h> 22 22 #include <linux/module.h> 23 23 #include <linux/of.h> 24 - #include <linux/of_device.h> 25 24 #include <linux/phy/phy.h> 26 25 #include <linux/phy/phy-mipi-dphy.h> 27 26 #include <linux/platform_device.h>
+4 -1
drivers/phy/rockchip/phy-rockchip-inno-dsidphy.c
··· 14 14 #include <linux/init.h> 15 15 #include <linux/mfd/syscon.h> 16 16 #include <linux/module.h> 17 - #include <linux/of_device.h> 17 + #include <linux/of.h> 18 18 #include <linux/platform_device.h> 19 19 #include <linux/pm_runtime.h> 20 20 #include <linux/reset.h> ··· 769 769 .data = &max_1ghz_video_phy_plat_data, 770 770 }, { 771 771 .compatible = "rockchip,rk3568-dsi-dphy", 772 + .data = &max_2_5ghz_video_phy_plat_data, 773 + }, { 774 + .compatible = "rockchip,rv1126-dsi-dphy", 772 775 .data = &max_2_5ghz_video_phy_plat_data, 773 776 }, 774 777 {}
+198 -37
drivers/phy/rockchip/phy-rockchip-inno-hdmi.c
··· 15 15 #include <linux/module.h> 16 16 #include <linux/nvmem-consumer.h> 17 17 #include <linux/of.h> 18 - #include <linux/of_device.h> 19 18 #include <linux/platform_device.h> 20 19 #include <linux/regmap.h> 21 20 #include <linux/phy/phy.h> ··· 244 245 struct clk_hw hw; 245 246 struct clk *phyclk; 246 247 unsigned long pixclock; 248 + unsigned long tmdsclock; 247 249 }; 248 250 249 251 struct pre_pll_config { ··· 291 291 }; 292 292 293 293 static const struct pre_pll_config pre_pll_cfg_table[] = { 294 - { 27000000, 27000000, 1, 90, 3, 2, 2, 10, 3, 3, 4, 0, 0}, 295 - { 27000000, 33750000, 1, 90, 1, 3, 3, 10, 3, 3, 4, 0, 0}, 296 - { 40000000, 40000000, 1, 80, 2, 2, 2, 12, 2, 2, 2, 0, 0}, 297 - { 59341000, 59341000, 1, 98, 3, 1, 2, 1, 3, 3, 4, 0, 0xE6AE6B}, 298 - { 59400000, 59400000, 1, 99, 3, 1, 1, 1, 3, 3, 4, 0, 0}, 299 - { 59341000, 74176250, 1, 98, 0, 3, 3, 1, 3, 3, 4, 0, 0xE6AE6B}, 300 - { 59400000, 74250000, 1, 99, 1, 2, 2, 1, 3, 3, 4, 0, 0}, 301 - { 74176000, 74176000, 1, 98, 1, 2, 2, 1, 2, 3, 4, 0, 0xE6AE6B}, 302 - { 74250000, 74250000, 1, 99, 1, 2, 2, 1, 2, 3, 4, 0, 0}, 303 - { 74176000, 92720000, 4, 494, 1, 2, 2, 1, 3, 3, 4, 0, 0x816817}, 304 - { 74250000, 92812500, 4, 495, 1, 2, 2, 1, 3, 3, 4, 0, 0}, 305 - {148352000, 148352000, 1, 98, 1, 1, 1, 1, 2, 2, 2, 0, 0xE6AE6B}, 306 - {148500000, 148500000, 1, 99, 1, 1, 1, 1, 2, 2, 2, 0, 0}, 307 - {148352000, 185440000, 4, 494, 0, 2, 2, 1, 3, 2, 2, 0, 0x816817}, 308 - {148500000, 185625000, 4, 495, 0, 2, 2, 1, 3, 2, 2, 0, 0}, 309 - {296703000, 296703000, 1, 98, 0, 1, 1, 1, 0, 2, 2, 0, 0xE6AE6B}, 310 - {297000000, 297000000, 1, 99, 0, 1, 1, 1, 0, 2, 2, 0, 0}, 311 - {296703000, 370878750, 4, 494, 1, 2, 0, 1, 3, 1, 1, 0, 0x816817}, 312 - {297000000, 371250000, 4, 495, 1, 2, 0, 1, 3, 1, 1, 0, 0}, 313 - {593407000, 296703500, 1, 98, 0, 1, 1, 1, 0, 2, 1, 0, 0xE6AE6B}, 314 - {594000000, 297000000, 1, 99, 0, 1, 1, 1, 0, 2, 1, 0, 0}, 315 - {593407000, 370879375, 4, 494, 1, 2, 0, 1, 3, 1, 1, 1, 0x816817}, 316 - {594000000, 371250000, 4, 495, 1, 2, 0, 1, 3, 1, 1, 1, 0}, 317 - {593407000, 593407000, 1, 98, 0, 2, 0, 1, 0, 1, 1, 0, 0xE6AE6B}, 318 - {594000000, 594000000, 1, 99, 0, 2, 0, 1, 0, 1, 1, 0, 0}, 294 + { 25175000, 25175000, 3, 125, 3, 1, 1, 1, 3, 3, 4, 0, 0xe00000}, 295 + { 25175000, 31468750, 1, 41, 0, 3, 3, 1, 3, 3, 4, 0, 0xf5554f}, 296 + { 27000000, 27000000, 1, 36, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, 297 + { 27000000, 33750000, 1, 45, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, 298 + { 31500000, 31500000, 1, 42, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, 299 + { 31500000, 39375000, 1, 105, 1, 3, 3, 10, 0, 3, 4, 0, 0x0}, 300 + { 33750000, 33750000, 1, 45, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, 301 + { 33750000, 42187500, 1, 169, 2, 3, 3, 15, 0, 3, 4, 0, 0x0}, 302 + { 35500000, 35500000, 1, 71, 2, 2, 2, 6, 0, 3, 4, 0, 0x0}, 303 + { 35500000, 44375000, 1, 74, 3, 1, 1, 25, 0, 1, 1, 0, 0x0}, 304 + { 36000000, 36000000, 1, 36, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, 305 + { 36000000, 45000000, 1, 45, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, 306 + { 40000000, 40000000, 1, 40, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, 307 + { 40000000, 50000000, 1, 50, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, 308 + { 49500000, 49500000, 1, 66, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, 309 + { 49500000, 61875000, 1, 165, 1, 3, 3, 10, 0, 3, 4, 0, 0x0}, 310 + { 50000000, 50000000, 1, 50, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, 311 + { 50000000, 62500000, 1, 125, 2, 2, 2, 15, 0, 2, 2, 0, 0x0}, 312 + { 54000000, 54000000, 1, 36, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 313 + { 54000000, 67500000, 1, 45, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, 314 + { 56250000, 56250000, 1, 75, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, 315 + { 56250000, 70312500, 1, 117, 3, 1, 1, 25, 0, 1, 1, 0, 0x0}, 316 + { 59341000, 59341000, 1, 118, 2, 2, 2, 6, 0, 3, 4, 0, 0xae978d}, 317 + { 59341000, 74176250, 2, 148, 2, 1, 1, 15, 0, 1, 1, 0, 0x5a3d70}, 318 + { 59400000, 59400000, 1, 99, 3, 1, 1, 1, 3, 3, 4, 0, 0x0}, 319 + { 59400000, 74250000, 1, 99, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, 320 + { 65000000, 65000000, 1, 65, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, 321 + { 65000000, 81250000, 3, 325, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, 322 + { 68250000, 68250000, 1, 91, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, 323 + { 68250000, 85312500, 1, 142, 3, 1, 1, 25, 0, 1, 1, 0, 0x0}, 324 + { 71000000, 71000000, 1, 71, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, 325 + { 71000000, 88750000, 3, 355, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, 326 + { 72000000, 72000000, 1, 36, 2, 0, 0, 1, 1, 2, 2, 0, 0x0}, 327 + { 72000000, 90000000, 1, 60, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, 328 + { 73250000, 73250000, 3, 293, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, 329 + { 73250000, 91562500, 1, 61, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, 330 + { 74176000, 74176000, 1, 37, 2, 0, 0, 1, 1, 2, 2, 0, 0x16872b}, 331 + { 74176000, 92720000, 2, 185, 2, 1, 1, 15, 0, 1, 1, 0, 0x70a3d7}, 332 + { 74250000, 74250000, 1, 99, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, 333 + { 74250000, 92812500, 4, 495, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, 334 + { 75000000, 75000000, 1, 50, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 335 + { 75000000, 93750000, 1, 125, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, 336 + { 78750000, 78750000, 1, 105, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, 337 + { 78750000, 98437500, 1, 164, 3, 1, 1, 25, 0, 1, 1, 0, 0x0}, 338 + { 79500000, 79500000, 1, 53, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 339 + { 79500000, 99375000, 1, 199, 2, 2, 2, 15, 0, 2, 2, 0, 0x0}, 340 + { 83500000, 83500000, 2, 167, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, 341 + { 83500000, 104375000, 1, 104, 2, 1, 1, 15, 0, 1, 1, 0, 0x600000}, 342 + { 85500000, 85500000, 1, 57, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 343 + { 85500000, 106875000, 1, 178, 3, 1, 1, 25, 0, 1, 1, 0, 0x0}, 344 + { 85750000, 85750000, 3, 343, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, 345 + { 85750000, 107187500, 1, 143, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, 346 + { 88750000, 88750000, 3, 355, 0, 3, 3, 1, 2, 3, 4, 0, 0x0}, 347 + { 88750000, 110937500, 1, 110, 2, 1, 1, 15, 0, 1, 1, 0, 0xf00000}, 348 + { 94500000, 94500000, 1, 63, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 349 + { 94500000, 118125000, 1, 197, 3, 1, 1, 25, 0, 1, 1, 0, 0x0}, 350 + {101000000, 101000000, 1, 101, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, 351 + {101000000, 126250000, 1, 42, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 352 + {102250000, 102250000, 4, 409, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, 353 + {102250000, 127812500, 1, 128, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, 354 + {106500000, 106500000, 1, 71, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 355 + {106500000, 133125000, 1, 133, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, 356 + {108000000, 108000000, 1, 36, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 357 + {108000000, 135000000, 1, 45, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 358 + {115500000, 115500000, 1, 77, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 359 + {115500000, 144375000, 1, 48, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 360 + {117500000, 117500000, 2, 235, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, 361 + {117500000, 146875000, 1, 49, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 362 + {119000000, 119000000, 1, 119, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, 363 + {119000000, 148750000, 3, 148, 0, 1, 1, 1, 3, 1, 1, 0, 0xc00000}, 364 + {121750000, 121750000, 4, 487, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, 365 + {121750000, 152187500, 1, 203, 0, 3, 3, 1, 3, 3, 4, 0, 0x0}, 366 + {122500000, 122500000, 2, 245, 2, 1, 1, 1, 1, 3, 4, 0, 0x0}, 367 + {122500000, 153125000, 1, 51, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 368 + {135000000, 135000000, 1, 45, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 369 + {135000000, 168750000, 1, 169, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, 370 + {136750000, 136750000, 1, 68, 2, 0, 0, 1, 1, 2, 2, 0, 0x600000}, 371 + {136750000, 170937500, 1, 113, 0, 2, 2, 1, 3, 2, 2, 0, 0xf5554f}, 372 + {140250000, 140250000, 2, 187, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 373 + {140250000, 175312500, 1, 117, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, 374 + {146250000, 146250000, 2, 195, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 375 + {146250000, 182812500, 1, 61, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 376 + {148250000, 148250000, 3, 222, 2, 0, 0, 1, 1, 2, 2, 0, 0x600000}, 377 + {148250000, 185312500, 1, 123, 0, 2, 2, 1, 3, 2, 2, 0, 0x8aaab0}, 378 + {148352000, 148352000, 2, 148, 2, 0, 0, 1, 1, 2, 2, 0, 0x5a1cac}, 379 + {148352000, 185440000, 3, 185, 0, 1, 1, 1, 3, 1, 1, 0, 0x70a3d7}, 380 + {148500000, 148500000, 1, 99, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 381 + {148500000, 185625000, 4, 495, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, 382 + {154000000, 154000000, 1, 77, 2, 0, 0, 1, 1, 2, 2, 0, 0x0}, 383 + {154000000, 192500000, 1, 64, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 384 + {156000000, 156000000, 1, 52, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 385 + {156000000, 195000000, 1, 65, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 386 + {156750000, 156750000, 2, 209, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 387 + {156750000, 195937500, 1, 196, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, 388 + {157000000, 157000000, 2, 157, 2, 0, 0, 1, 1, 2, 2, 0, 0x0}, 389 + {157000000, 196250000, 1, 131, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, 390 + {157500000, 157500000, 1, 105, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 391 + {157500000, 196875000, 1, 197, 2, 1, 1, 15, 0, 1, 1, 0, 0x0}, 392 + {162000000, 162000000, 1, 54, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 393 + {162000000, 202500000, 2, 135, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 394 + {175500000, 175500000, 1, 117, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 395 + {175500000, 219375000, 1, 73, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 396 + {179500000, 179500000, 3, 359, 0, 2, 2, 1, 0, 3, 4, 0, 0x0}, 397 + {179500000, 224375000, 1, 75, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 398 + {182750000, 182750000, 1, 91, 2, 0, 0, 1, 1, 2, 2, 0, 0x600000}, 399 + {182750000, 228437500, 1, 152, 0, 2, 2, 1, 3, 2, 2, 0, 0x4aaab0}, 400 + {182750000, 228437500, 1, 152, 0, 2, 2, 1, 3, 2, 2, 0, 0x4aaab0}, 401 + {187000000, 187000000, 2, 187, 2, 0, 0, 1, 1, 2, 2, 0, 0x0}, 402 + {187000000, 233750000, 1, 39, 0, 0, 0, 1, 3, 0, 0, 1, 0x0}, 403 + {187250000, 187250000, 3, 280, 2, 0, 0, 1, 1, 2, 2, 0, 0xe00000}, 404 + {187250000, 234062500, 1, 156, 0, 2, 2, 1, 3, 2, 2, 0, 0xaaab0}, 405 + {189000000, 189000000, 1, 63, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 406 + {189000000, 236250000, 1, 79, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 407 + {193250000, 193250000, 3, 289, 2, 0, 0, 1, 1, 2, 2, 0, 0xe00000}, 408 + {193250000, 241562500, 1, 161, 0, 2, 2, 1, 3, 2, 2, 0, 0xaaab0}, 409 + {202500000, 202500000, 2, 135, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 410 + {202500000, 253125000, 1, 169, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, 411 + {204750000, 204750000, 4, 273, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 412 + {204750000, 255937500, 1, 171, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, 413 + {208000000, 208000000, 1, 104, 2, 0, 0, 1, 1, 2, 2, 0, 0x0}, 414 + {208000000, 260000000, 1, 173, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, 415 + {214750000, 214750000, 1, 107, 2, 0, 0, 1, 1, 2, 2, 0, 0x600000}, 416 + {214750000, 268437500, 1, 178, 0, 2, 2, 1, 3, 2, 2, 0, 0xf5554f}, 417 + {218250000, 218250000, 4, 291, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 418 + {218250000, 272812500, 1, 91, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 419 + {229500000, 229500000, 2, 153, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 420 + {229500000, 286875000, 1, 191, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, 421 + {234000000, 234000000, 1, 39, 0, 0, 0, 1, 0, 1, 1, 0, 0x0}, 422 + {234000000, 292500000, 1, 195, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, 423 + {241500000, 241500000, 2, 161, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 424 + {241500000, 301875000, 1, 201, 0, 2, 2, 1, 3, 2, 2, 0, 0x0}, 425 + {245250000, 245250000, 4, 327, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 426 + {245250000, 306562500, 1, 51, 0, 0, 0, 1, 3, 0, 0, 1, 0x0}, 427 + {245500000, 245500000, 4, 491, 2, 0, 0, 1, 1, 2, 2, 0, 0x0}, 428 + {245500000, 306875000, 1, 51, 0, 0, 0, 1, 3, 0, 0, 1, 0x0}, 429 + {261000000, 261000000, 1, 87, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 430 + {261000000, 326250000, 1, 109, 0, 1, 1, 1, 3, 1, 1, 0, 0x0}, 431 + {268250000, 268250000, 9, 402, 0, 0, 0, 1, 0, 1, 1, 0, 0x600000}, 432 + {268250000, 335312500, 1, 111, 0, 1, 1, 1, 3, 1, 1, 0, 0xc5554f}, 433 + {268500000, 268500000, 2, 179, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 434 + {268500000, 335625000, 1, 56, 0, 0, 0, 1, 3, 0, 0, 1, 0x0}, 435 + {281250000, 281250000, 4, 375, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 436 + {281250000, 351562500, 1, 117, 0, 3, 1, 1, 3, 1, 1, 0, 0x0}, 437 + {288000000, 288000000, 1, 48, 0, 0, 0, 1, 0, 1, 1, 0, 0x0}, 438 + {288000000, 360000000, 1, 60, 0, 2, 0, 1, 3, 0, 0, 1, 0x0}, 439 + {296703000, 296703000, 1, 49, 0, 0, 0, 1, 0, 1, 1, 0, 0x7353f7}, 440 + {296703000, 370878750, 1, 123, 0, 3, 1, 1, 3, 1, 1, 0, 0xa051eb}, 441 + {297000000, 297000000, 1, 99, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 442 + {297000000, 371250000, 4, 495, 0, 3, 1, 1, 3, 1, 1, 0, 0x0}, 443 + {312250000, 312250000, 9, 468, 0, 0, 0, 1, 0, 1, 1, 0, 0x600000}, 444 + {312250000, 390312500, 1, 130, 0, 3, 1, 1, 3, 1, 1, 0, 0x1aaab0}, 445 + {317000000, 317000000, 3, 317, 0, 1, 1, 1, 0, 2, 2, 0, 0x0}, 446 + {317000000, 396250000, 1, 66, 0, 2, 0, 1, 3, 0, 0, 1, 0x0}, 447 + {319750000, 319750000, 3, 159, 0, 0, 0, 1, 0, 1, 1, 0, 0xe00000}, 448 + {319750000, 399687500, 3, 199, 0, 2, 0, 1, 3, 0, 0, 1, 0xd80000}, 449 + {333250000, 333250000, 9, 499, 0, 0, 0, 1, 0, 1, 1, 0, 0xe00000}, 450 + {333250000, 416562500, 1, 138, 0, 3, 1, 1, 3, 1, 1, 0, 0xdaaab0}, 451 + {348500000, 348500000, 9, 522, 0, 2, 0, 1, 0, 1, 1, 0, 0xc00000}, 452 + {348500000, 435625000, 1, 145, 0, 3, 1, 1, 3, 1, 1, 0, 0x35554f}, 453 + {356500000, 356500000, 9, 534, 0, 2, 0, 1, 0, 1, 1, 0, 0xc00000}, 454 + {356500000, 445625000, 1, 148, 0, 3, 1, 1, 3, 1, 1, 0, 0x8aaab0}, 455 + {380500000, 380500000, 9, 570, 0, 2, 0, 1, 0, 1, 1, 0, 0xc00000}, 456 + {380500000, 475625000, 1, 158, 0, 3, 1, 1, 3, 1, 1, 0, 0x8aaab0}, 457 + {443250000, 443250000, 1, 73, 0, 2, 0, 1, 0, 1, 1, 0, 0xe00000}, 458 + {443250000, 554062500, 1, 92, 0, 2, 0, 1, 3, 0, 0, 1, 0x580000}, 459 + {505250000, 505250000, 9, 757, 0, 2, 0, 1, 0, 1, 1, 0, 0xe00000}, 460 + {552750000, 552750000, 3, 276, 0, 2, 0, 1, 0, 1, 1, 0, 0x600000}, 461 + {593407000, 296703500, 3, 296, 0, 1, 1, 1, 0, 1, 1, 0, 0xb41893}, 462 + {593407000, 370879375, 4, 494, 0, 3, 1, 1, 3, 0, 0, 1, 0x817e4a}, 463 + {593407000, 593407000, 3, 296, 0, 2, 0, 1, 0, 1, 1, 0, 0xb41893}, 464 + {594000000, 297000000, 1, 99, 0, 1, 1, 1, 0, 1, 1, 0, 0x0}, 465 + {594000000, 371250000, 4, 495, 0, 3, 1, 1, 3, 0, 0, 1, 0x0}, 466 + {594000000, 594000000, 1, 99, 0, 2, 0, 1, 0, 1, 1, 0, 0x0}, 319 467 { /* sentinel */ } 320 468 }; 321 469 ··· 633 485 634 486 dev_dbg(inno->dev, "Inno HDMI PHY Power On\n"); 635 487 488 + inno->plat_data->clk_ops->set_rate(&inno->hw, inno->pixclock, 24000000); 489 + 636 490 ret = clk_prepare_enable(inno->phyclk); 637 491 if (ret) 638 492 return ret; ··· 658 508 inno->plat_data->ops->power_off(inno); 659 509 660 510 clk_disable_unprepare(inno->phyclk); 511 + 512 + inno->tmdsclock = 0; 661 513 662 514 dev_dbg(inno->dev, "Inno HDMI PHY Power Off\n"); 663 515 ··· 780 628 dev_dbg(inno->dev, "%s rate %lu tmdsclk %lu\n", 781 629 __func__, rate, tmdsclock); 782 630 631 + if (inno->pixclock == rate && inno->tmdsclock == tmdsclock) 632 + return 0; 633 + 783 634 cfg = inno_hdmi_phy_get_pre_pll_cfg(inno, rate); 784 635 if (IS_ERR(cfg)) 785 636 return PTR_ERR(cfg); ··· 825 670 } 826 671 827 672 inno->pixclock = rate; 673 + inno->tmdsclock = tmdsclock; 828 674 829 675 return 0; 830 676 } ··· 870 714 { 871 715 struct inno_hdmi_phy *inno = to_inno_hdmi_phy(hw); 872 716 unsigned long frac; 873 - u8 nd, no_a, no_b, no_c, no_d; 717 + u8 nd, no_a, no_b, no_d; 874 718 u64 vco; 875 719 u16 nf; 876 720 ··· 893 737 no_b = inno_read(inno, 0xa5) & RK3328_PRE_PLL_PCLK_DIV_B_MASK; 894 738 no_b >>= RK3328_PRE_PLL_PCLK_DIV_B_SHIFT; 895 739 no_b += 2; 896 - no_c = inno_read(inno, 0xa6) & RK3328_PRE_PLL_PCLK_DIV_C_MASK; 897 - no_c >>= RK3328_PRE_PLL_PCLK_DIV_C_SHIFT; 898 - no_c = 1 << no_c; 899 740 no_d = inno_read(inno, 0xa6) & RK3328_PRE_PLL_PCLK_DIV_D_MASK; 900 741 901 742 do_div(vco, (nd * (no_a == 1 ? no_b : no_a) * no_d * 2)); 902 743 } 903 744 904 - inno->pixclock = vco; 905 - dev_dbg(inno->dev, "%s rate %lu\n", __func__, inno->pixclock); 745 + inno->pixclock = DIV_ROUND_CLOSEST((unsigned long)vco, 1000) * 1000; 906 746 907 - return vco; 747 + dev_dbg(inno->dev, "%s rate %lu vco %llu\n", 748 + __func__, inno->pixclock, vco); 749 + 750 + return inno->pixclock; 908 751 } 909 752 910 753 static long inno_hdmi_phy_rk3328_clk_round_rate(struct clk_hw *hw, ··· 937 782 dev_dbg(inno->dev, "%s rate %lu tmdsclk %lu\n", 938 783 __func__, rate, tmdsclock); 939 784 785 + if (inno->pixclock == rate && inno->tmdsclock == tmdsclock) 786 + return 0; 787 + 940 788 cfg = inno_hdmi_phy_get_pre_pll_cfg(inno, rate); 941 789 if (IS_ERR(cfg)) 942 790 return PTR_ERR(cfg); ··· 948 790 RK3328_PRE_PLL_POWER_DOWN); 949 791 950 792 /* Configure pre-pll */ 951 - inno_update_bits(inno, 0xa0, RK3228_PCLK_VCO_DIV_5_MASK, 952 - RK3228_PCLK_VCO_DIV_5(cfg->vco_div_5_en)); 793 + inno_update_bits(inno, 0xa0, RK3328_PCLK_VCO_DIV_5_MASK, 794 + RK3328_PCLK_VCO_DIV_5(cfg->vco_div_5_en)); 953 795 inno_write(inno, 0xa1, RK3328_PRE_PLL_PRE_DIV(cfg->prediv)); 954 796 955 797 val = RK3328_SPREAD_SPECTRUM_MOD_DISABLE; ··· 979 821 } 980 822 981 823 inno->pixclock = rate; 824 + inno->tmdsclock = tmdsclock; 982 825 983 826 return 0; 984 827 } ··· 1180 1021 1181 1022 inno_write(inno, 0xac, RK3328_POST_PLL_FB_DIV_7_0(cfg->fbdiv)); 1182 1023 if (cfg->postdiv == 1) { 1183 - inno_write(inno, 0xaa, RK3328_POST_PLL_REFCLK_SEL_TMDS); 1184 1024 inno_write(inno, 0xab, RK3328_POST_PLL_FB_DIV_8(cfg->fbdiv) | 1185 1025 RK3328_POST_PLL_PRE_DIV(cfg->prediv)); 1026 + inno_write(inno, 0xaa, RK3328_POST_PLL_REFCLK_SEL_TMDS | 1027 + RK3328_POST_PLL_POWER_DOWN); 1186 1028 } else { 1187 1029 v = (cfg->postdiv / 2) - 1; 1188 1030 v &= RK3328_POST_PLL_POST_DIV_MASK; ··· 1191 1031 inno_write(inno, 0xab, RK3328_POST_PLL_FB_DIV_8(cfg->fbdiv) | 1192 1032 RK3328_POST_PLL_PRE_DIV(cfg->prediv)); 1193 1033 inno_write(inno, 0xaa, RK3328_POST_PLL_POST_DIV_ENABLE | 1194 - RK3328_POST_PLL_REFCLK_SEL_TMDS); 1034 + RK3328_POST_PLL_REFCLK_SEL_TMDS | 1035 + RK3328_POST_PLL_POWER_DOWN); 1195 1036 } 1196 1037 1197 1038 for (v = 0; v < 14; v++)
+321 -36
drivers/phy/rockchip/phy-rockchip-inno-usb2.c
··· 24 24 #include <linux/platform_device.h> 25 25 #include <linux/power_supply.h> 26 26 #include <linux/regmap.h> 27 + #include <linux/reset.h> 27 28 #include <linux/mfd/syscon.h> 28 29 #include <linux/usb/of.h> 29 30 #include <linux/usb/otg.h> ··· 32 31 #define BIT_WRITEABLE_SHIFT 16 33 32 #define SCHEDULE_DELAY (60 * HZ) 34 33 #define OTG_SCHEDULE_DELAY (2 * HZ) 34 + 35 + struct rockchip_usb2phy; 35 36 36 37 enum rockchip_usb2phy_port_id { 37 38 USB2PHY_PORT_OTG, ··· 119 116 * @bvalid_det_en: vbus valid rise detection enable register. 120 117 * @bvalid_det_st: vbus valid rise detection status register. 121 118 * @bvalid_det_clr: vbus valid rise detection clear register. 119 + * @disfall_en: host disconnect fall edge detection enable. 120 + * @disfall_st: host disconnect fall edge detection state. 121 + * @disfall_clr: host disconnect fall edge detection clear. 122 + * @disrise_en: host disconnect rise edge detection enable. 123 + * @disrise_st: host disconnect rise edge detection state. 124 + * @disrise_clr: host disconnect rise edge detection clear. 122 125 * @id_det_en: id detection enable register. 123 126 * @id_det_st: id detection state register. 124 127 * @id_det_clr: id detection clear register. ··· 142 133 struct usb2phy_reg bvalid_det_en; 143 134 struct usb2phy_reg bvalid_det_st; 144 135 struct usb2phy_reg bvalid_det_clr; 136 + struct usb2phy_reg disfall_en; 137 + struct usb2phy_reg disfall_st; 138 + struct usb2phy_reg disfall_clr; 139 + struct usb2phy_reg disrise_en; 140 + struct usb2phy_reg disrise_st; 141 + struct usb2phy_reg disrise_clr; 145 142 struct usb2phy_reg id_det_en; 146 143 struct usb2phy_reg id_det_st; 147 144 struct usb2phy_reg id_det_clr; ··· 165 150 * struct rockchip_usb2phy_cfg - usb-phy configuration. 166 151 * @reg: the address offset of grf for usb-phy config. 167 152 * @num_ports: specify how many ports that the phy has. 153 + * @phy_tuning: phy default parameters tuning. 168 154 * @clkout_ctl: keep on/turn off output clk of phy. 169 155 * @port_cfgs: usb-phy port configurations. 170 156 * @chg_det: charger detection registers. ··· 173 157 struct rockchip_usb2phy_cfg { 174 158 unsigned int reg; 175 159 unsigned int num_ports; 160 + int (*phy_tuning)(struct rockchip_usb2phy *rphy); 176 161 struct usb2phy_reg clkout_ctl; 177 162 const struct rockchip_usb2phy_port_cfg port_cfgs[USB2PHY_NUM_PORTS]; 178 163 const struct rockchip_chg_det_reg chg_det; ··· 185 168 * @port_id: flag for otg port or host port. 186 169 * @suspended: phy suspended flag. 187 170 * @vbus_attached: otg device vbus status. 171 + * @host_disconnect: usb host disconnect status. 188 172 * @bvalid_irq: IRQ number assigned for vbus valid rise detection. 189 173 * @id_irq: IRQ number assigned for ID pin detection. 190 174 * @ls_irq: IRQ number assigned for linestate detection. ··· 205 187 unsigned int port_id; 206 188 bool suspended; 207 189 bool vbus_attached; 190 + bool host_disconnect; 208 191 int bvalid_irq; 209 192 int id_irq; 210 193 int ls_irq; ··· 228 209 * @clk: clock struct of phy input clk. 229 210 * @clk480m: clock struct of phy output clk. 230 211 * @clk480m_hw: clock struct of phy output clk management. 212 + * @phy_reset: phy reset control. 231 213 * @chg_state: states involved in USB charger detection. 232 214 * @chg_type: USB charger types. 233 215 * @dcd_retries: The retry count used to track Data contact ··· 245 225 struct clk *clk; 246 226 struct clk *clk480m; 247 227 struct clk_hw clk480m_hw; 228 + struct reset_control *phy_reset; 248 229 enum usb_chg_state chg_state; 249 230 enum power_supply_type chg_type; 250 231 u8 dcd_retries; ··· 285 264 286 265 tmp = (orig & mask) >> reg->bitstart; 287 266 return tmp != reg->disable; 267 + } 268 + 269 + static int rockchip_usb2phy_reset(struct rockchip_usb2phy *rphy) 270 + { 271 + int ret; 272 + 273 + ret = reset_control_assert(rphy->phy_reset); 274 + if (ret) 275 + return ret; 276 + 277 + udelay(10); 278 + 279 + ret = reset_control_deassert(rphy->phy_reset); 280 + if (ret) 281 + return ret; 282 + 283 + usleep_range(100, 200); 284 + 285 + return 0; 288 286 } 289 287 290 288 static int rockchip_usb2phy_clk480m_prepare(struct clk_hw *hw) ··· 445 405 return 0; 446 406 } 447 407 408 + static int rockchip_usb2phy_enable_host_disc_irq(struct rockchip_usb2phy *rphy, 409 + struct rockchip_usb2phy_port *rport, 410 + bool en) 411 + { 412 + int ret; 413 + 414 + ret = property_enable(rphy->grf, &rport->port_cfg->disfall_clr, true); 415 + if (ret) 416 + return ret; 417 + 418 + ret = property_enable(rphy->grf, &rport->port_cfg->disfall_en, en); 419 + if (ret) 420 + return ret; 421 + 422 + ret = property_enable(rphy->grf, &rport->port_cfg->disrise_clr, true); 423 + if (ret) 424 + return ret; 425 + 426 + return property_enable(rphy->grf, &rport->port_cfg->disrise_en, en); 427 + } 428 + 448 429 static int rockchip_usb2phy_init(struct phy *phy) 449 430 { 450 431 struct rockchip_usb2phy_port *rport = phy_get_drvdata(phy); ··· 510 449 dev_dbg(&rport->phy->dev, "mode %d\n", rport->mode); 511 450 } 512 451 } else if (rport->port_id == USB2PHY_PORT_HOST) { 452 + if (rport->port_cfg->disfall_en.offset) { 453 + rport->host_disconnect = true; 454 + ret = rockchip_usb2phy_enable_host_disc_irq(rphy, rport, true); 455 + if (ret) { 456 + dev_err(rphy->dev, "failed to enable disconnect irq\n"); 457 + goto out; 458 + } 459 + } 460 + 513 461 /* clear linestate and enable linestate detect irq */ 514 462 ret = property_enable(rphy->grf, 515 463 &rport->port_cfg->ls_det_clr, true); ··· 559 489 clk_disable_unprepare(rphy->clk480m); 560 490 return ret; 561 491 } 492 + 493 + /* 494 + * For rk3588, it needs to reset phy when exit from 495 + * suspend mode with common_on_n 1'b1(aka REFCLK_LOGIC, 496 + * Bias, and PLL blocks are powered down) for lower 497 + * power consumption. If you don't want to reset phy, 498 + * please keep the common_on_n 1'b0 to set these blocks 499 + * remain powered. 500 + */ 501 + ret = rockchip_usb2phy_reset(rphy); 502 + if (ret) 503 + return ret; 562 504 563 505 /* waiting for the utmi_clk to become stable */ 564 506 usleep_range(1500, 2000); ··· 892 810 struct rockchip_usb2phy_port *rport = 893 811 container_of(work, struct rockchip_usb2phy_port, sm_work.work); 894 812 struct rockchip_usb2phy *rphy = dev_get_drvdata(rport->phy->dev.parent); 895 - unsigned int sh = rport->port_cfg->utmi_hstdet.bitend - 896 - rport->port_cfg->utmi_hstdet.bitstart + 1; 897 - unsigned int ul, uhd, state; 813 + unsigned int sh, ul, uhd, state; 898 814 unsigned int ul_mask, uhd_mask; 899 815 int ret; 900 816 ··· 902 822 if (ret < 0) 903 823 goto next_schedule; 904 824 905 - ret = regmap_read(rphy->grf, rport->port_cfg->utmi_hstdet.offset, &uhd); 906 - if (ret < 0) 907 - goto next_schedule; 908 - 909 - uhd_mask = GENMASK(rport->port_cfg->utmi_hstdet.bitend, 910 - rport->port_cfg->utmi_hstdet.bitstart); 911 825 ul_mask = GENMASK(rport->port_cfg->utmi_ls.bitend, 912 826 rport->port_cfg->utmi_ls.bitstart); 913 827 914 - /* stitch on utmi_ls and utmi_hstdet as phy state */ 915 - state = ((uhd & uhd_mask) >> rport->port_cfg->utmi_hstdet.bitstart) | 916 - (((ul & ul_mask) >> rport->port_cfg->utmi_ls.bitstart) << sh); 828 + if (rport->port_cfg->utmi_hstdet.offset) { 829 + ret = regmap_read(rphy->grf, rport->port_cfg->utmi_hstdet.offset, &uhd); 830 + if (ret < 0) 831 + goto next_schedule; 832 + 833 + uhd_mask = GENMASK(rport->port_cfg->utmi_hstdet.bitend, 834 + rport->port_cfg->utmi_hstdet.bitstart); 835 + 836 + sh = rport->port_cfg->utmi_hstdet.bitend - 837 + rport->port_cfg->utmi_hstdet.bitstart + 1; 838 + /* stitch on utmi_ls and utmi_hstdet as phy state */ 839 + state = ((uhd & uhd_mask) >> rport->port_cfg->utmi_hstdet.bitstart) | 840 + (((ul & ul_mask) >> rport->port_cfg->utmi_ls.bitstart) << sh); 841 + } else { 842 + state = ((ul & ul_mask) >> rport->port_cfg->utmi_ls.bitstart) << 1 | 843 + rport->host_disconnect; 844 + } 917 845 918 846 switch (state) { 919 847 case PHY_STATE_HS_ONLINE: ··· 1054 966 return ret; 1055 967 } 1056 968 969 + static irqreturn_t rockchip_usb2phy_host_disc_irq(int irq, void *data) 970 + { 971 + struct rockchip_usb2phy_port *rport = data; 972 + struct rockchip_usb2phy *rphy = dev_get_drvdata(rport->phy->dev.parent); 973 + 974 + if (!property_enabled(rphy->grf, &rport->port_cfg->disfall_st) && 975 + !property_enabled(rphy->grf, &rport->port_cfg->disrise_st)) 976 + return IRQ_NONE; 977 + 978 + mutex_lock(&rport->mutex); 979 + 980 + /* clear disconnect fall or rise detect irq pending status */ 981 + if (property_enabled(rphy->grf, &rport->port_cfg->disfall_st)) { 982 + property_enable(rphy->grf, &rport->port_cfg->disfall_clr, true); 983 + rport->host_disconnect = false; 984 + } else if (property_enabled(rphy->grf, &rport->port_cfg->disrise_st)) { 985 + property_enable(rphy->grf, &rport->port_cfg->disrise_clr, true); 986 + rport->host_disconnect = true; 987 + } 988 + 989 + mutex_unlock(&rport->mutex); 990 + 991 + return IRQ_HANDLED; 992 + } 993 + 1057 994 static irqreturn_t rockchip_usb2phy_irq(int irq, void *data) 1058 995 { 1059 996 struct rockchip_usb2phy *rphy = data; ··· 1090 977 rport = &rphy->ports[index]; 1091 978 if (!rport->phy) 1092 979 continue; 980 + 981 + if (rport->port_id == USB2PHY_PORT_HOST && 982 + rport->port_cfg->disfall_en.offset) 983 + ret |= rockchip_usb2phy_host_disc_irq(irq, rport); 1093 984 1094 985 switch (rport->port_id) { 1095 986 case USB2PHY_PORT_OTG: ··· 1305 1188 struct phy_provider *provider; 1306 1189 struct rockchip_usb2phy *rphy; 1307 1190 const struct rockchip_usb2phy_cfg *phy_cfgs; 1308 - const struct of_device_id *match; 1309 1191 unsigned int reg; 1310 1192 int index, ret; 1311 1193 1312 1194 rphy = devm_kzalloc(dev, sizeof(*rphy), GFP_KERNEL); 1313 1195 if (!rphy) 1314 1196 return -ENOMEM; 1315 - 1316 - match = of_match_device(dev->driver->of_match_table, dev); 1317 - if (!match || !match->data) { 1318 - dev_err(dev, "phy configs are not assigned!\n"); 1319 - return -EINVAL; 1320 - } 1321 1197 1322 1198 if (!dev->parent || !dev->parent->of_node) { 1323 1199 rphy->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,usbgrf"); ··· 1343 1233 } 1344 1234 1345 1235 /* support address_cells=2 */ 1346 - if (reg == 0) { 1236 + if (of_property_count_u32_elems(np, "reg") > 2 && reg == 0) { 1347 1237 if (of_property_read_u32_index(np, "reg", 1, &reg)) { 1348 1238 dev_err(dev, "the reg property is not assigned in %pOFn node\n", 1349 1239 np); ··· 1352 1242 } 1353 1243 1354 1244 rphy->dev = dev; 1355 - phy_cfgs = match->data; 1245 + phy_cfgs = device_get_match_data(dev); 1356 1246 rphy->chg_state = USB_CHG_STATE_UNDEFINED; 1357 1247 rphy->chg_type = POWER_SUPPLY_TYPE_UNKNOWN; 1358 1248 rphy->irq = platform_get_irq_optional(pdev, 0); 1359 1249 platform_set_drvdata(pdev, rphy); 1250 + 1251 + if (!phy_cfgs) 1252 + return dev_err_probe(dev, -EINVAL, "phy configs are not assigned!\n"); 1360 1253 1361 1254 ret = rockchip_usb2phy_extcon_register(rphy); 1362 1255 if (ret) ··· 1367 1254 1368 1255 /* find out a proper config which can be matched with dt. */ 1369 1256 index = 0; 1370 - while (phy_cfgs[index].reg) { 1257 + do { 1371 1258 if (phy_cfgs[index].reg == reg) { 1372 1259 rphy->phy_cfg = &phy_cfgs[index]; 1373 1260 break; 1374 1261 } 1375 1262 1376 1263 ++index; 1377 - } 1264 + } while (phy_cfgs[index].reg); 1378 1265 1379 1266 if (!rphy->phy_cfg) { 1380 - dev_err(dev, "no phy-config can be matched with %pOFn node\n", 1381 - np); 1267 + dev_err(dev, "could not find phy config for reg=0x%08x\n", reg); 1382 1268 return -EINVAL; 1383 1269 } 1384 1270 1385 - rphy->clk = of_clk_get_by_name(np, "phyclk"); 1386 - if (!IS_ERR(rphy->clk)) { 1387 - clk_prepare_enable(rphy->clk); 1388 - } else { 1389 - dev_info(&pdev->dev, "no phyclk specified\n"); 1390 - rphy->clk = NULL; 1271 + rphy->phy_reset = devm_reset_control_get_optional(dev, "phy"); 1272 + if (IS_ERR(rphy->phy_reset)) 1273 + return PTR_ERR(rphy->phy_reset); 1274 + 1275 + rphy->clk = devm_clk_get_optional_enabled(dev, "phyclk"); 1276 + if (IS_ERR(rphy->clk)) { 1277 + return dev_err_probe(&pdev->dev, PTR_ERR(rphy->clk), 1278 + "failed to get phyclk\n"); 1391 1279 } 1392 1280 1393 1281 ret = rockchip_usb2phy_clk480m_register(rphy); 1394 1282 if (ret) { 1395 1283 dev_err(dev, "failed to register 480m output clock\n"); 1396 - goto disable_clks; 1284 + return ret; 1285 + } 1286 + 1287 + if (rphy->phy_cfg->phy_tuning) { 1288 + ret = rphy->phy_cfg->phy_tuning(rphy); 1289 + if (ret) 1290 + return ret; 1397 1291 } 1398 1292 1399 1293 index = 0; ··· 1463 1343 1464 1344 put_child: 1465 1345 of_node_put(child_np); 1466 - disable_clks: 1467 - if (rphy->clk) { 1468 - clk_disable_unprepare(rphy->clk); 1469 - clk_put(rphy->clk); 1346 + return ret; 1347 + } 1348 + 1349 + static int rk3588_usb2phy_tuning(struct rockchip_usb2phy *rphy) 1350 + { 1351 + int ret; 1352 + bool usb3otg = false; 1353 + /* 1354 + * utmi_termselect = 1'b1 (en FS terminations) 1355 + * utmi_xcvrselect = 2'b01 (FS transceiver) 1356 + */ 1357 + int suspend_cfg = 0x14; 1358 + 1359 + if (rphy->phy_cfg->reg == 0x0000 || rphy->phy_cfg->reg == 0x4000) { 1360 + /* USB2 config for USB3_0 and USB3_1 */ 1361 + suspend_cfg |= 0x01; /* utmi_opmode = 2'b01 (no-driving) */ 1362 + usb3otg = true; 1363 + } else if (rphy->phy_cfg->reg == 0x8000 || rphy->phy_cfg->reg == 0xc000) { 1364 + /* USB2 config for USB2_0 and USB2_1 */ 1365 + suspend_cfg |= 0x00; /* utmi_opmode = 2'b00 (normal) */ 1366 + } else { 1367 + return -EINVAL; 1470 1368 } 1369 + 1370 + /* Deassert SIDDQ to power on analog block */ 1371 + ret = regmap_write(rphy->grf, 0x0008, GENMASK(29, 29) | 0x0000); 1372 + if (ret) 1373 + return ret; 1374 + 1375 + /* Do reset after exit IDDQ mode */ 1376 + ret = rockchip_usb2phy_reset(rphy); 1377 + if (ret) 1378 + return ret; 1379 + 1380 + /* suspend configuration */ 1381 + ret |= regmap_write(rphy->grf, 0x000c, GENMASK(20, 16) | suspend_cfg); 1382 + 1383 + /* HS DC Voltage Level Adjustment 4'b1001 : +5.89% */ 1384 + ret |= regmap_write(rphy->grf, 0x0004, GENMASK(27, 24) | 0x0900); 1385 + 1386 + /* HS Transmitter Pre-Emphasis Current Control 2'b10 : 2x */ 1387 + ret |= regmap_write(rphy->grf, 0x0008, GENMASK(20, 19) | 0x0010); 1388 + 1389 + if (!usb3otg) 1390 + return ret; 1391 + 1392 + /* Pullup iddig pin for USB3_0 OTG mode */ 1393 + ret |= regmap_write(rphy->grf, 0x0010, GENMASK(17, 16) | 0x0003); 1394 + 1471 1395 return ret; 1472 1396 } 1473 1397 ··· 1828 1664 { /* sentinel */ } 1829 1665 }; 1830 1666 1667 + static const struct rockchip_usb2phy_cfg rk3588_phy_cfgs[] = { 1668 + { 1669 + .reg = 0x0000, 1670 + .num_ports = 1, 1671 + .phy_tuning = rk3588_usb2phy_tuning, 1672 + .clkout_ctl = { 0x0000, 0, 0, 1, 0 }, 1673 + .port_cfgs = { 1674 + [USB2PHY_PORT_OTG] = { 1675 + .phy_sus = { 0x000c, 11, 11, 0, 1 }, 1676 + .bvalid_det_en = { 0x0080, 1, 1, 0, 1 }, 1677 + .bvalid_det_st = { 0x0084, 1, 1, 0, 1 }, 1678 + .bvalid_det_clr = { 0x0088, 1, 1, 0, 1 }, 1679 + .ls_det_en = { 0x0080, 0, 0, 0, 1 }, 1680 + .ls_det_st = { 0x0084, 0, 0, 0, 1 }, 1681 + .ls_det_clr = { 0x0088, 0, 0, 0, 1 }, 1682 + .disfall_en = { 0x0080, 6, 6, 0, 1 }, 1683 + .disfall_st = { 0x0084, 6, 6, 0, 1 }, 1684 + .disfall_clr = { 0x0088, 6, 6, 0, 1 }, 1685 + .disrise_en = { 0x0080, 5, 5, 0, 1 }, 1686 + .disrise_st = { 0x0084, 5, 5, 0, 1 }, 1687 + .disrise_clr = { 0x0088, 5, 5, 0, 1 }, 1688 + .utmi_avalid = { 0x00c0, 7, 7, 0, 1 }, 1689 + .utmi_bvalid = { 0x00c0, 6, 6, 0, 1 }, 1690 + .utmi_ls = { 0x00c0, 10, 9, 0, 1 }, 1691 + } 1692 + }, 1693 + .chg_det = { 1694 + .cp_det = { 0x00c0, 0, 0, 0, 1 }, 1695 + .dcp_det = { 0x00c0, 0, 0, 0, 1 }, 1696 + .dp_det = { 0x00c0, 1, 1, 1, 0 }, 1697 + .idm_sink_en = { 0x0008, 5, 5, 1, 0 }, 1698 + .idp_sink_en = { 0x0008, 5, 5, 0, 1 }, 1699 + .idp_src_en = { 0x0008, 14, 14, 0, 1 }, 1700 + .rdm_pdwn_en = { 0x0008, 14, 14, 0, 1 }, 1701 + .vdm_src_en = { 0x0008, 7, 6, 0, 3 }, 1702 + .vdp_src_en = { 0x0008, 7, 6, 0, 3 }, 1703 + }, 1704 + }, 1705 + { 1706 + .reg = 0x4000, 1707 + .num_ports = 1, 1708 + .phy_tuning = rk3588_usb2phy_tuning, 1709 + .clkout_ctl = { 0x0000, 0, 0, 1, 0 }, 1710 + .port_cfgs = { 1711 + [USB2PHY_PORT_OTG] = { 1712 + .phy_sus = { 0x000c, 11, 11, 0, 1 }, 1713 + .bvalid_det_en = { 0x0080, 1, 1, 0, 1 }, 1714 + .bvalid_det_st = { 0x0084, 1, 1, 0, 1 }, 1715 + .bvalid_det_clr = { 0x0088, 1, 1, 0, 1 }, 1716 + .ls_det_en = { 0x0080, 0, 0, 0, 1 }, 1717 + .ls_det_st = { 0x0084, 0, 0, 0, 1 }, 1718 + .ls_det_clr = { 0x0088, 0, 0, 0, 1 }, 1719 + .disfall_en = { 0x0080, 6, 6, 0, 1 }, 1720 + .disfall_st = { 0x0084, 6, 6, 0, 1 }, 1721 + .disfall_clr = { 0x0088, 6, 6, 0, 1 }, 1722 + .disrise_en = { 0x0080, 5, 5, 0, 1 }, 1723 + .disrise_st = { 0x0084, 5, 5, 0, 1 }, 1724 + .disrise_clr = { 0x0088, 5, 5, 0, 1 }, 1725 + .utmi_avalid = { 0x00c0, 7, 7, 0, 1 }, 1726 + .utmi_bvalid = { 0x00c0, 6, 6, 0, 1 }, 1727 + .utmi_ls = { 0x00c0, 10, 9, 0, 1 }, 1728 + } 1729 + }, 1730 + .chg_det = { 1731 + .cp_det = { 0x00c0, 0, 0, 0, 1 }, 1732 + .dcp_det = { 0x00c0, 0, 0, 0, 1 }, 1733 + .dp_det = { 0x00c0, 1, 1, 1, 0 }, 1734 + .idm_sink_en = { 0x0008, 5, 5, 1, 0 }, 1735 + .idp_sink_en = { 0x0008, 5, 5, 0, 1 }, 1736 + .idp_src_en = { 0x0008, 14, 14, 0, 1 }, 1737 + .rdm_pdwn_en = { 0x0008, 14, 14, 0, 1 }, 1738 + .vdm_src_en = { 0x0008, 7, 6, 0, 3 }, 1739 + .vdp_src_en = { 0x0008, 7, 6, 0, 3 }, 1740 + }, 1741 + }, 1742 + { 1743 + .reg = 0x8000, 1744 + .num_ports = 1, 1745 + .phy_tuning = rk3588_usb2phy_tuning, 1746 + .clkout_ctl = { 0x0000, 0, 0, 1, 0 }, 1747 + .port_cfgs = { 1748 + [USB2PHY_PORT_HOST] = { 1749 + .phy_sus = { 0x0008, 2, 2, 0, 1 }, 1750 + .ls_det_en = { 0x0080, 0, 0, 0, 1 }, 1751 + .ls_det_st = { 0x0084, 0, 0, 0, 1 }, 1752 + .ls_det_clr = { 0x0088, 0, 0, 0, 1 }, 1753 + .disfall_en = { 0x0080, 6, 6, 0, 1 }, 1754 + .disfall_st = { 0x0084, 6, 6, 0, 1 }, 1755 + .disfall_clr = { 0x0088, 6, 6, 0, 1 }, 1756 + .disrise_en = { 0x0080, 5, 5, 0, 1 }, 1757 + .disrise_st = { 0x0084, 5, 5, 0, 1 }, 1758 + .disrise_clr = { 0x0088, 5, 5, 0, 1 }, 1759 + .utmi_ls = { 0x00c0, 10, 9, 0, 1 }, 1760 + } 1761 + }, 1762 + }, 1763 + { 1764 + .reg = 0xc000, 1765 + .num_ports = 1, 1766 + .phy_tuning = rk3588_usb2phy_tuning, 1767 + .clkout_ctl = { 0x0000, 0, 0, 1, 0 }, 1768 + .port_cfgs = { 1769 + [USB2PHY_PORT_HOST] = { 1770 + .phy_sus = { 0x0008, 2, 2, 0, 1 }, 1771 + .ls_det_en = { 0x0080, 0, 0, 0, 1 }, 1772 + .ls_det_st = { 0x0084, 0, 0, 0, 1 }, 1773 + .ls_det_clr = { 0x0088, 0, 0, 0, 1 }, 1774 + .disfall_en = { 0x0080, 6, 6, 0, 1 }, 1775 + .disfall_st = { 0x0084, 6, 6, 0, 1 }, 1776 + .disfall_clr = { 0x0088, 6, 6, 0, 1 }, 1777 + .disrise_en = { 0x0080, 5, 5, 0, 1 }, 1778 + .disrise_st = { 0x0084, 5, 5, 0, 1 }, 1779 + .disrise_clr = { 0x0088, 5, 5, 0, 1 }, 1780 + .utmi_ls = { 0x00c0, 10, 9, 0, 1 }, 1781 + } 1782 + }, 1783 + }, 1784 + { /* sentinel */ } 1785 + }; 1786 + 1831 1787 static const struct rockchip_usb2phy_cfg rv1108_phy_cfgs[] = { 1832 1788 { 1833 1789 .reg = 0x100, ··· 1998 1714 { .compatible = "rockchip,rk3366-usb2phy", .data = &rk3366_phy_cfgs }, 1999 1715 { .compatible = "rockchip,rk3399-usb2phy", .data = &rk3399_phy_cfgs }, 2000 1716 { .compatible = "rockchip,rk3568-usb2phy", .data = &rk3568_phy_cfgs }, 1717 + { .compatible = "rockchip,rk3588-usb2phy", .data = &rk3588_phy_cfgs }, 2001 1718 { .compatible = "rockchip,rv1108-usb2phy", .data = &rv1108_phy_cfgs }, 2002 1719 {} 2003 1720 };
+2 -1
drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
··· 8 8 #include <dt-bindings/phy/phy.h> 9 9 #include <linux/clk.h> 10 10 #include <linux/mfd/syscon.h> 11 - #include <linux/of_device.h> 11 + #include <linux/of.h> 12 12 #include <linux/phy/phy.h> 13 + #include <linux/platform_device.h> 13 14 #include <linux/regmap.h> 14 15 #include <linux/reset.h> 15 16 #include <linux/units.h>
+2 -1
drivers/phy/rockchip/phy-rockchip-snps-pcie3.c
··· 12 12 #include <linux/kernel.h> 13 13 #include <linux/mfd/syscon.h> 14 14 #include <linux/module.h> 15 - #include <linux/of_device.h> 15 + #include <linux/of.h> 16 16 #include <linux/phy/pcie.h> 17 17 #include <linux/phy/phy.h> 18 + #include <linux/platform_device.h> 18 19 #include <linux/regmap.h> 19 20 #include <linux/reset.h> 20 21
+1 -2
drivers/phy/rockchip/phy-rockchip-typec.c
··· 1116 1116 return -EINVAL; 1117 1117 } 1118 1118 1119 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1120 - tcphy->base = devm_ioremap_resource(dev, res); 1119 + tcphy->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); 1121 1120 if (IS_ERR(tcphy->base)) 1122 1121 return PTR_ERR(tcphy->base); 1123 1122
-2
drivers/phy/samsung/phy-exynos-dp-video.c
··· 12 12 #include <linux/module.h> 13 13 #include <linux/mfd/syscon.h> 14 14 #include <linux/of.h> 15 - #include <linux/of_address.h> 16 - #include <linux/of_device.h> 17 15 #include <linux/phy/phy.h> 18 16 #include <linux/platform_device.h> 19 17 #include <linux/regmap.h>
+1 -2
drivers/phy/samsung/phy-exynos-mipi-video.c
··· 11 11 #include <linux/kernel.h> 12 12 #include <linux/module.h> 13 13 #include <linux/of.h> 14 - #include <linux/of_address.h> 15 - #include <linux/of_device.h> 16 14 #include <linux/phy/phy.h> 15 + #include <linux/platform_device.h> 17 16 #include <linux/regmap.h> 18 17 #include <linux/spinlock.h> 19 18 #include <linux/soc/samsung/exynos-regs-pmu.h>
+180 -4
drivers/phy/samsung/phy-exynos5-usbdrd.c
··· 14 14 #include <linux/kernel.h> 15 15 #include <linux/module.h> 16 16 #include <linux/of.h> 17 - #include <linux/of_address.h> 18 - #include <linux/of_device.h> 19 17 #include <linux/iopoll.h> 20 18 #include <linux/phy/phy.h> 21 19 #include <linux/platform_device.h> ··· 30 32 #define EXYNOS5_FSEL_19MHZ2 0x3 31 33 #define EXYNOS5_FSEL_20MHZ 0x4 32 34 #define EXYNOS5_FSEL_24MHZ 0x5 35 + #define EXYNOS5_FSEL_26MHZ 0x82 33 36 #define EXYNOS5_FSEL_50MHZ 0x7 34 37 35 38 /* Exynos5: USB 3.0 DRD PHY registers */ ··· 145 146 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_62M5 (0x20 << 4) 146 147 #define LANE0_TX_DEBUG_RXDET_MEAS_TIME_96M_100M (0x40 << 4) 147 148 149 + /* Exynos850: USB DRD PHY registers */ 150 + #define EXYNOS850_DRD_LINKCTRL 0x04 151 + #define LINKCTRL_BUS_FILTER_BYPASS(_x) ((_x) << 4) 152 + #define LINKCTRL_FORCE_QACT BIT(8) 153 + 154 + #define EXYNOS850_DRD_CLKRST 0x20 155 + #define CLKRST_LINK_SW_RST BIT(0) 156 + #define CLKRST_PORT_RST BIT(1) 157 + #define CLKRST_PHY_SW_RST BIT(3) 158 + 159 + #define EXYNOS850_DRD_UTMI 0x50 160 + #define UTMI_FORCE_SLEEP BIT(0) 161 + #define UTMI_FORCE_SUSPEND BIT(1) 162 + #define UTMI_DM_PULLDOWN BIT(2) 163 + #define UTMI_DP_PULLDOWN BIT(3) 164 + #define UTMI_FORCE_BVALID BIT(4) 165 + #define UTMI_FORCE_VBUSVALID BIT(5) 166 + 167 + #define EXYNOS850_DRD_HSP 0x54 168 + #define HSP_COMMONONN BIT(8) 169 + #define HSP_EN_UTMISUSPEND BIT(9) 170 + #define HSP_VBUSVLDEXT BIT(12) 171 + #define HSP_VBUSVLDEXTSEL BIT(13) 172 + #define HSP_FSV_OUT_EN BIT(24) 173 + 174 + #define EXYNOS850_DRD_HSP_TEST 0x5c 175 + #define HSP_TEST_SIDDQ BIT(24) 176 + 148 177 #define KHZ 1000 149 178 #define MHZ (KHZ * KHZ) 150 179 ··· 194 167 195 168 struct exynos5_usbdrd_phy_drvdata { 196 169 const struct exynos5_usbdrd_phy_config *phy_cfg; 170 + const struct phy_ops *phy_ops; 197 171 u32 pmu_offset_usbdrd0_phy; 198 172 u32 pmu_offset_usbdrd1_phy; 199 173 bool has_common_clk_gate; ··· 272 244 break; 273 245 case 24 * MHZ: 274 246 *reg = EXYNOS5_FSEL_24MHZ; 247 + break; 248 + case 26 * MHZ: 249 + *reg = EXYNOS5_FSEL_26MHZ; 275 250 break; 276 251 case 50 * MHZ: 277 252 *reg = EXYNOS5_FSEL_50MHZ; ··· 744 713 .owner = THIS_MODULE, 745 714 }; 746 715 716 + static void exynos850_usbdrd_utmi_init(struct exynos5_usbdrd_phy *phy_drd) 717 + { 718 + void __iomem *regs_base = phy_drd->reg_phy; 719 + u32 reg; 720 + 721 + /* 722 + * Disable HWACG (hardware auto clock gating control). This will force 723 + * QACTIVE signal in Q-Channel interface to HIGH level, to make sure 724 + * the PHY clock is not gated by the hardware. 725 + */ 726 + reg = readl(regs_base + EXYNOS850_DRD_LINKCTRL); 727 + reg |= LINKCTRL_FORCE_QACT; 728 + writel(reg, regs_base + EXYNOS850_DRD_LINKCTRL); 729 + 730 + /* Start PHY Reset (POR=high) */ 731 + reg = readl(regs_base + EXYNOS850_DRD_CLKRST); 732 + reg |= CLKRST_PHY_SW_RST; 733 + writel(reg, regs_base + EXYNOS850_DRD_CLKRST); 734 + 735 + /* Enable UTMI+ */ 736 + reg = readl(regs_base + EXYNOS850_DRD_UTMI); 737 + reg &= ~(UTMI_FORCE_SUSPEND | UTMI_FORCE_SLEEP | UTMI_DP_PULLDOWN | 738 + UTMI_DM_PULLDOWN); 739 + writel(reg, regs_base + EXYNOS850_DRD_UTMI); 740 + 741 + /* Set PHY clock and control HS PHY */ 742 + reg = readl(regs_base + EXYNOS850_DRD_HSP); 743 + reg |= HSP_EN_UTMISUSPEND | HSP_COMMONONN; 744 + writel(reg, regs_base + EXYNOS850_DRD_HSP); 745 + 746 + /* Set VBUS Valid and D+ pull-up control by VBUS pad usage */ 747 + reg = readl(regs_base + EXYNOS850_DRD_LINKCTRL); 748 + reg |= LINKCTRL_BUS_FILTER_BYPASS(0xf); 749 + writel(reg, regs_base + EXYNOS850_DRD_LINKCTRL); 750 + 751 + reg = readl(regs_base + EXYNOS850_DRD_UTMI); 752 + reg |= UTMI_FORCE_BVALID | UTMI_FORCE_VBUSVALID; 753 + writel(reg, regs_base + EXYNOS850_DRD_UTMI); 754 + 755 + reg = readl(regs_base + EXYNOS850_DRD_HSP); 756 + reg |= HSP_VBUSVLDEXT | HSP_VBUSVLDEXTSEL; 757 + writel(reg, regs_base + EXYNOS850_DRD_HSP); 758 + 759 + /* Power up PHY analog blocks */ 760 + reg = readl(regs_base + EXYNOS850_DRD_HSP_TEST); 761 + reg &= ~HSP_TEST_SIDDQ; 762 + writel(reg, regs_base + EXYNOS850_DRD_HSP_TEST); 763 + 764 + /* Finish PHY reset (POR=low) */ 765 + udelay(10); /* required before doing POR=low */ 766 + reg = readl(regs_base + EXYNOS850_DRD_CLKRST); 767 + reg &= ~(CLKRST_PHY_SW_RST | CLKRST_PORT_RST); 768 + writel(reg, regs_base + EXYNOS850_DRD_CLKRST); 769 + udelay(75); /* required after POR=low for guaranteed PHY clock */ 770 + 771 + /* Disable single ended signal out */ 772 + reg = readl(regs_base + EXYNOS850_DRD_HSP); 773 + reg &= ~HSP_FSV_OUT_EN; 774 + writel(reg, regs_base + EXYNOS850_DRD_HSP); 775 + } 776 + 777 + static int exynos850_usbdrd_phy_init(struct phy *phy) 778 + { 779 + struct phy_usb_instance *inst = phy_get_drvdata(phy); 780 + struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst); 781 + int ret; 782 + 783 + ret = clk_prepare_enable(phy_drd->clk); 784 + if (ret) 785 + return ret; 786 + 787 + /* UTMI or PIPE3 specific init */ 788 + inst->phy_cfg->phy_init(phy_drd); 789 + 790 + clk_disable_unprepare(phy_drd->clk); 791 + 792 + return 0; 793 + } 794 + 795 + static int exynos850_usbdrd_phy_exit(struct phy *phy) 796 + { 797 + struct phy_usb_instance *inst = phy_get_drvdata(phy); 798 + struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst); 799 + void __iomem *regs_base = phy_drd->reg_phy; 800 + u32 reg; 801 + int ret; 802 + 803 + ret = clk_prepare_enable(phy_drd->clk); 804 + if (ret) 805 + return ret; 806 + 807 + /* Set PHY clock and control HS PHY */ 808 + reg = readl(regs_base + EXYNOS850_DRD_UTMI); 809 + reg &= ~(UTMI_DP_PULLDOWN | UTMI_DM_PULLDOWN); 810 + reg |= UTMI_FORCE_SUSPEND | UTMI_FORCE_SLEEP; 811 + writel(reg, regs_base + EXYNOS850_DRD_UTMI); 812 + 813 + /* Power down PHY analog blocks */ 814 + reg = readl(regs_base + EXYNOS850_DRD_HSP_TEST); 815 + reg |= HSP_TEST_SIDDQ; 816 + writel(reg, regs_base + EXYNOS850_DRD_HSP_TEST); 817 + 818 + /* Link reset */ 819 + reg = readl(regs_base + EXYNOS850_DRD_CLKRST); 820 + reg |= CLKRST_LINK_SW_RST; 821 + writel(reg, regs_base + EXYNOS850_DRD_CLKRST); 822 + udelay(10); /* required before doing POR=low */ 823 + reg &= ~CLKRST_LINK_SW_RST; 824 + writel(reg, regs_base + EXYNOS850_DRD_CLKRST); 825 + 826 + clk_disable_unprepare(phy_drd->clk); 827 + 828 + return 0; 829 + } 830 + 831 + static const struct phy_ops exynos850_usbdrd_phy_ops = { 832 + .init = exynos850_usbdrd_phy_init, 833 + .exit = exynos850_usbdrd_phy_exit, 834 + .power_on = exynos5_usbdrd_phy_power_on, 835 + .power_off = exynos5_usbdrd_phy_power_off, 836 + .owner = THIS_MODULE, 837 + }; 838 + 747 839 static int exynos5_usbdrd_phy_clk_handle(struct exynos5_usbdrd_phy *phy_drd) 748 840 { 749 841 unsigned long ref_rate; ··· 933 779 }, 934 780 }; 935 781 782 + static const struct exynos5_usbdrd_phy_config phy_cfg_exynos850[] = { 783 + { 784 + .id = EXYNOS5_DRDPHY_UTMI, 785 + .phy_isol = exynos5_usbdrd_phy_isol, 786 + .phy_init = exynos850_usbdrd_utmi_init, 787 + }, 788 + }; 789 + 936 790 static const struct exynos5_usbdrd_phy_drvdata exynos5420_usbdrd_phy = { 937 791 .phy_cfg = phy_cfg_exynos5, 792 + .phy_ops = &exynos5_usbdrd_phy_ops, 938 793 .pmu_offset_usbdrd0_phy = EXYNOS5_USBDRD_PHY_CONTROL, 939 794 .pmu_offset_usbdrd1_phy = EXYNOS5420_USBDRD1_PHY_CONTROL, 940 795 .has_common_clk_gate = true, ··· 951 788 952 789 static const struct exynos5_usbdrd_phy_drvdata exynos5250_usbdrd_phy = { 953 790 .phy_cfg = phy_cfg_exynos5, 791 + .phy_ops = &exynos5_usbdrd_phy_ops, 954 792 .pmu_offset_usbdrd0_phy = EXYNOS5_USBDRD_PHY_CONTROL, 955 793 .has_common_clk_gate = true, 956 794 }; 957 795 958 796 static const struct exynos5_usbdrd_phy_drvdata exynos5433_usbdrd_phy = { 959 797 .phy_cfg = phy_cfg_exynos5, 798 + .phy_ops = &exynos5_usbdrd_phy_ops, 960 799 .pmu_offset_usbdrd0_phy = EXYNOS5_USBDRD_PHY_CONTROL, 961 800 .pmu_offset_usbdrd1_phy = EXYNOS5433_USBHOST30_PHY_CONTROL, 962 801 .has_common_clk_gate = false, ··· 966 801 967 802 static const struct exynos5_usbdrd_phy_drvdata exynos7_usbdrd_phy = { 968 803 .phy_cfg = phy_cfg_exynos5, 804 + .phy_ops = &exynos5_usbdrd_phy_ops, 969 805 .pmu_offset_usbdrd0_phy = EXYNOS5_USBDRD_PHY_CONTROL, 970 806 .has_common_clk_gate = false, 807 + }; 808 + 809 + static const struct exynos5_usbdrd_phy_drvdata exynos850_usbdrd_phy = { 810 + .phy_cfg = phy_cfg_exynos850, 811 + .phy_ops = &exynos850_usbdrd_phy_ops, 812 + .pmu_offset_usbdrd0_phy = EXYNOS5_USBDRD_PHY_CONTROL, 813 + .has_common_clk_gate = true, 971 814 }; 972 815 973 816 static const struct of_device_id exynos5_usbdrd_phy_of_match[] = { ··· 991 818 }, { 992 819 .compatible = "samsung,exynos7-usbdrd-phy", 993 820 .data = &exynos7_usbdrd_phy 821 + }, { 822 + .compatible = "samsung,exynos850-usbdrd-phy", 823 + .data = &exynos850_usbdrd_phy 994 824 }, 995 825 { }, 996 826 }; ··· 1084 908 dev_vdbg(dev, "Creating usbdrd_phy phy\n"); 1085 909 1086 910 for (i = 0; i < EXYNOS5_DRDPHYS_NUM; i++) { 1087 - struct phy *phy = devm_phy_create(dev, NULL, 1088 - &exynos5_usbdrd_phy_ops); 911 + struct phy *phy = devm_phy_create(dev, NULL, drv_data->phy_ops); 912 + 1089 913 if (IS_ERR(phy)) { 1090 914 dev_err(dev, "Failed to create usbdrd_phy phy\n"); 1091 915 return PTR_ERR(phy);
-2
drivers/phy/samsung/phy-samsung-usb2.c
··· 10 10 #include <linux/mfd/syscon.h> 11 11 #include <linux/module.h> 12 12 #include <linux/of.h> 13 - #include <linux/of_address.h> 14 - #include <linux/of_device.h> 15 13 #include <linux/phy/phy.h> 16 14 #include <linux/platform_device.h> 17 15 #include <linux/spinlock.h>
+1 -1
drivers/phy/socionext/phy-uniphier-pcie.c
··· 11 11 #include <linux/iopoll.h> 12 12 #include <linux/mfd/syscon.h> 13 13 #include <linux/module.h> 14 - #include <linux/of_device.h> 14 + #include <linux/of.h> 15 15 #include <linux/phy/phy.h> 16 16 #include <linux/platform_device.h> 17 17 #include <linux/regmap.h>
+2 -1
drivers/phy/st/phy-spear1310-miphy.c
··· 13 13 #include <linux/kernel.h> 14 14 #include <linux/mfd/syscon.h> 15 15 #include <linux/module.h> 16 - #include <linux/of_device.h> 16 + #include <linux/of.h> 17 17 #include <linux/phy/phy.h> 18 + #include <linux/platform_device.h> 18 19 #include <linux/regmap.h> 19 20 20 21 /* SPEAr1310 Registers */
+2 -1
drivers/phy/st/phy-spear1340-miphy.c
··· 13 13 #include <linux/kernel.h> 14 14 #include <linux/mfd/syscon.h> 15 15 #include <linux/module.h> 16 - #include <linux/of_device.h> 16 + #include <linux/of.h> 17 17 #include <linux/phy/phy.h> 18 + #include <linux/platform_device.h> 18 19 #include <linux/regmap.h> 19 20 20 21 /* SPEAr1340 Registers */
+2 -1
drivers/phy/st/phy-stm32-usbphyc.c
··· 12 12 #include <linux/iopoll.h> 13 13 #include <linux/kernel.h> 14 14 #include <linux/module.h> 15 - #include <linux/of_platform.h> 15 + #include <linux/of.h> 16 16 #include <linux/phy/phy.h> 17 + #include <linux/platform_device.h> 17 18 #include <linux/reset.h> 18 19 #include <linux/units.h> 19 20
+38
drivers/phy/starfive/Kconfig
··· 1 + # SPDX-License-Identifier: GPL-2.0-only 2 + # 3 + # Phy drivers for StarFive platforms 4 + # 5 + 6 + if ARCH_STARFIVE || COMPILE_TEST 7 + 8 + config PHY_STARFIVE_JH7110_DPHY_RX 9 + tristate "StarFive JH7110 D-PHY RX support" 10 + depends on HAS_IOMEM 11 + select GENERIC_PHY 12 + select GENERIC_PHY_MIPI_DPHY 13 + help 14 + Choose this option if you have a StarFive D-PHY in your 15 + system. If M is selected, the module will be called 16 + phy-jh7110-dphy-rx.ko. 17 + 18 + config PHY_STARFIVE_JH7110_PCIE 19 + tristate "Starfive JH7110 PCIE 2.0/USB 3.0 PHY support" 20 + depends on HAS_IOMEM 21 + select GENERIC_PHY 22 + help 23 + Enable this to support the StarFive PCIe 2.0 PHY, 24 + or used as USB 3.0 PHY. 25 + If M is selected, the module will be called 26 + phy-jh7110-pcie.ko. 27 + 28 + config PHY_STARFIVE_JH7110_USB 29 + tristate "Starfive JH7110 USB 2.0 PHY support" 30 + depends on USB_SUPPORT 31 + select GENERIC_PHY 32 + help 33 + Enable this to support the StarFive USB 2.0 PHY, 34 + used with the Cadence USB controller. 35 + If M is selected, the module will be called 36 + phy-jh7110-usb.ko. 37 + 38 + endif # ARCH_STARFIVE || COMPILE_TEST
+4
drivers/phy/starfive/Makefile
··· 1 + # SPDX-License-Identifier: GPL-2.0 2 + obj-$(CONFIG_PHY_STARFIVE_JH7110_DPHY_RX) += phy-jh7110-dphy-rx.o 3 + obj-$(CONFIG_PHY_STARFIVE_JH7110_PCIE) += phy-jh7110-pcie.o 4 + obj-$(CONFIG_PHY_STARFIVE_JH7110_USB) += phy-jh7110-usb.o
+232
drivers/phy/starfive/phy-jh7110-dphy-rx.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * StarFive JH7110 DPHY RX driver 4 + * 5 + * Copyright (C) 2023 StarFive Technology Co., Ltd. 6 + * Author: Jack Zhu <jack.zhu@starfivetech.com> 7 + * Author: Changhuang Liang <changhuang.liang@starfivetech.com> 8 + */ 9 + 10 + #include <linux/bitfield.h> 11 + #include <linux/bitops.h> 12 + #include <linux/clk.h> 13 + #include <linux/io.h> 14 + #include <linux/module.h> 15 + #include <linux/of.h> 16 + #include <linux/phy/phy.h> 17 + #include <linux/platform_device.h> 18 + #include <linux/pm_runtime.h> 19 + #include <linux/reset.h> 20 + 21 + #define STF_DPHY_APBCFGSAIF_SYSCFG(x) (x) 22 + 23 + #define STF_DPHY_ENABLE_CLK BIT(6) 24 + #define STF_DPHY_ENABLE_CLK1 BIT(7) 25 + #define STF_DPHY_ENABLE_LAN0 BIT(8) 26 + #define STF_DPHY_ENABLE_LAN1 BIT(9) 27 + #define STF_DPHY_ENABLE_LAN2 BIT(10) 28 + #define STF_DPHY_ENABLE_LAN3 BIT(11) 29 + #define STF_DPHY_LANE_SWAP_CLK GENMASK(22, 20) 30 + #define STF_DPHY_LANE_SWAP_CLK1 GENMASK(25, 23) 31 + #define STF_DPHY_LANE_SWAP_LAN0 GENMASK(28, 26) 32 + #define STF_DPHY_LANE_SWAP_LAN1 GENMASK(31, 29) 33 + 34 + #define STF_DPHY_LANE_SWAP_LAN2 GENMASK(2, 0) 35 + #define STF_DPHY_LANE_SWAP_LAN3 GENMASK(5, 3) 36 + #define STF_DPHY_PLL_CLK_SEL GENMASK(21, 12) 37 + #define STF_DPHY_PRECOUNTER_IN_CLK GENMASK(29, 22) 38 + 39 + #define STF_DPHY_PRECOUNTER_IN_CLK1 GENMASK(7, 0) 40 + #define STF_DPHY_PRECOUNTER_IN_LAN0 GENMASK(15, 8) 41 + #define STF_DPHY_PRECOUNTER_IN_LAN1 GENMASK(23, 16) 42 + #define STF_DPHY_PRECOUNTER_IN_LAN2 GENMASK(31, 24) 43 + 44 + #define STF_DPHY_PRECOUNTER_IN_LAN3 GENMASK(7, 0) 45 + #define STF_DPHY_RX_1C2C_SEL BIT(8) 46 + 47 + #define STF_MAP_LANES_NUM 6 48 + 49 + struct regval { 50 + u32 addr; 51 + u32 val; 52 + }; 53 + 54 + struct stf_dphy_info { 55 + /** 56 + * @maps: 57 + * 58 + * Physical lanes and logic lanes mapping table. 59 + * 60 + * The default order is: 61 + * [clk lane0, data lane 0, data lane 1, data lane 2, date lane 3, clk lane 1] 62 + */ 63 + u8 maps[STF_MAP_LANES_NUM]; 64 + }; 65 + 66 + struct stf_dphy { 67 + struct device *dev; 68 + void __iomem *regs; 69 + struct clk *cfg_clk; 70 + struct clk *ref_clk; 71 + struct clk *tx_clk; 72 + struct reset_control *rstc; 73 + struct regulator *mipi_0p9; 74 + struct phy *phy; 75 + const struct stf_dphy_info *info; 76 + }; 77 + 78 + static int stf_dphy_configure(struct phy *phy, union phy_configure_opts *opts) 79 + { 80 + struct stf_dphy *dphy = phy_get_drvdata(phy); 81 + const struct stf_dphy_info *info = dphy->info; 82 + 83 + writel(FIELD_PREP(STF_DPHY_ENABLE_CLK, 1) | 84 + FIELD_PREP(STF_DPHY_ENABLE_CLK1, 1) | 85 + FIELD_PREP(STF_DPHY_ENABLE_LAN0, 1) | 86 + FIELD_PREP(STF_DPHY_ENABLE_LAN1, 1) | 87 + FIELD_PREP(STF_DPHY_ENABLE_LAN2, 1) | 88 + FIELD_PREP(STF_DPHY_ENABLE_LAN3, 1) | 89 + FIELD_PREP(STF_DPHY_LANE_SWAP_CLK, info->maps[0]) | 90 + FIELD_PREP(STF_DPHY_LANE_SWAP_CLK1, info->maps[5]) | 91 + FIELD_PREP(STF_DPHY_LANE_SWAP_LAN0, info->maps[1]) | 92 + FIELD_PREP(STF_DPHY_LANE_SWAP_LAN1, info->maps[2]), 93 + dphy->regs + STF_DPHY_APBCFGSAIF_SYSCFG(188)); 94 + 95 + writel(FIELD_PREP(STF_DPHY_LANE_SWAP_LAN2, info->maps[3]) | 96 + FIELD_PREP(STF_DPHY_LANE_SWAP_LAN3, info->maps[4]) | 97 + FIELD_PREP(STF_DPHY_PRECOUNTER_IN_CLK, 8), 98 + dphy->regs + STF_DPHY_APBCFGSAIF_SYSCFG(192)); 99 + 100 + writel(FIELD_PREP(STF_DPHY_PRECOUNTER_IN_CLK1, 8) | 101 + FIELD_PREP(STF_DPHY_PRECOUNTER_IN_LAN0, 7) | 102 + FIELD_PREP(STF_DPHY_PRECOUNTER_IN_LAN1, 7) | 103 + FIELD_PREP(STF_DPHY_PRECOUNTER_IN_LAN2, 7), 104 + dphy->regs + STF_DPHY_APBCFGSAIF_SYSCFG(196)); 105 + 106 + writel(FIELD_PREP(STF_DPHY_PRECOUNTER_IN_LAN3, 7), 107 + dphy->regs + STF_DPHY_APBCFGSAIF_SYSCFG(200)); 108 + 109 + return 0; 110 + } 111 + 112 + static int stf_dphy_power_on(struct phy *phy) 113 + { 114 + struct stf_dphy *dphy = phy_get_drvdata(phy); 115 + int ret; 116 + 117 + ret = pm_runtime_resume_and_get(dphy->dev); 118 + if (ret < 0) 119 + return ret; 120 + 121 + ret = regulator_enable(dphy->mipi_0p9); 122 + if (ret) { 123 + pm_runtime_put(dphy->dev); 124 + return ret; 125 + } 126 + 127 + clk_set_rate(dphy->cfg_clk, 99000000); 128 + clk_set_rate(dphy->ref_clk, 49500000); 129 + clk_set_rate(dphy->tx_clk, 19800000); 130 + reset_control_deassert(dphy->rstc); 131 + 132 + return 0; 133 + } 134 + 135 + static int stf_dphy_power_off(struct phy *phy) 136 + { 137 + struct stf_dphy *dphy = phy_get_drvdata(phy); 138 + 139 + reset_control_assert(dphy->rstc); 140 + 141 + regulator_disable(dphy->mipi_0p9); 142 + 143 + pm_runtime_put_sync(dphy->dev); 144 + 145 + return 0; 146 + } 147 + 148 + static const struct phy_ops stf_dphy_ops = { 149 + .configure = stf_dphy_configure, 150 + .power_on = stf_dphy_power_on, 151 + .power_off = stf_dphy_power_off, 152 + }; 153 + 154 + static int stf_dphy_probe(struct platform_device *pdev) 155 + { 156 + struct phy_provider *phy_provider; 157 + struct stf_dphy *dphy; 158 + 159 + dphy = devm_kzalloc(&pdev->dev, sizeof(*dphy), GFP_KERNEL); 160 + if (!dphy) 161 + return -ENOMEM; 162 + 163 + dphy->info = of_device_get_match_data(&pdev->dev); 164 + 165 + dev_set_drvdata(&pdev->dev, dphy); 166 + dphy->dev = &pdev->dev; 167 + 168 + dphy->regs = devm_platform_ioremap_resource(pdev, 0); 169 + if (IS_ERR(dphy->regs)) 170 + return PTR_ERR(dphy->regs); 171 + 172 + dphy->cfg_clk = devm_clk_get(&pdev->dev, "cfg"); 173 + if (IS_ERR(dphy->cfg_clk)) 174 + return PTR_ERR(dphy->cfg_clk); 175 + 176 + dphy->ref_clk = devm_clk_get(&pdev->dev, "ref"); 177 + if (IS_ERR(dphy->ref_clk)) 178 + return PTR_ERR(dphy->ref_clk); 179 + 180 + dphy->tx_clk = devm_clk_get(&pdev->dev, "tx"); 181 + if (IS_ERR(dphy->tx_clk)) 182 + return PTR_ERR(dphy->tx_clk); 183 + 184 + dphy->rstc = devm_reset_control_array_get_exclusive(&pdev->dev); 185 + if (IS_ERR(dphy->rstc)) 186 + return PTR_ERR(dphy->rstc); 187 + 188 + dphy->mipi_0p9 = devm_regulator_get(&pdev->dev, "mipi_0p9"); 189 + if (IS_ERR(dphy->mipi_0p9)) 190 + return PTR_ERR(dphy->mipi_0p9); 191 + 192 + dphy->phy = devm_phy_create(&pdev->dev, NULL, &stf_dphy_ops); 193 + if (IS_ERR(dphy->phy)) { 194 + dev_err(&pdev->dev, "Failed to create PHY\n"); 195 + return PTR_ERR(dphy->phy); 196 + } 197 + 198 + pm_runtime_enable(&pdev->dev); 199 + 200 + phy_set_drvdata(dphy->phy, dphy); 201 + phy_provider = devm_of_phy_provider_register(&pdev->dev, 202 + of_phy_simple_xlate); 203 + 204 + return PTR_ERR_OR_ZERO(phy_provider); 205 + } 206 + 207 + static const struct stf_dphy_info starfive_dphy_info = { 208 + .maps = {4, 0, 1, 2, 3, 5}, 209 + }; 210 + 211 + static const struct of_device_id stf_dphy_dt_ids[] = { 212 + { 213 + .compatible = "starfive,jh7110-dphy-rx", 214 + .data = &starfive_dphy_info, 215 + }, 216 + { /* sentinel */ }, 217 + }; 218 + MODULE_DEVICE_TABLE(of, stf_dphy_dt_ids); 219 + 220 + static struct platform_driver stf_dphy_driver = { 221 + .probe = stf_dphy_probe, 222 + .driver = { 223 + .name = "starfive-dphy-rx", 224 + .of_match_table = stf_dphy_dt_ids, 225 + }, 226 + }; 227 + module_platform_driver(stf_dphy_driver); 228 + 229 + MODULE_AUTHOR("Jack Zhu <jack.zhu@starfivetech.com>"); 230 + MODULE_AUTHOR("Changhuang Liang <changhuang.liang@starfivetech.com>"); 231 + MODULE_DESCRIPTION("StarFive JH7110 DPHY RX driver"); 232 + MODULE_LICENSE("GPL");
+204
drivers/phy/starfive/phy-jh7110-pcie.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * StarFive JH7110 PCIe 2.0 PHY driver 4 + * 5 + * Copyright (C) 2023 StarFive Technology Co., Ltd. 6 + * Author: Minda Chen <minda.chen@starfivetech.com> 7 + */ 8 + 9 + #include <linux/bits.h> 10 + #include <linux/clk.h> 11 + #include <linux/err.h> 12 + #include <linux/io.h> 13 + #include <linux/module.h> 14 + #include <linux/mfd/syscon.h> 15 + #include <linux/phy/phy.h> 16 + #include <linux/platform_device.h> 17 + #include <linux/regmap.h> 18 + 19 + #define PCIE_KVCO_LEVEL_OFF 0x28 20 + #define PCIE_USB3_PHY_PLL_CTL_OFF 0x7c 21 + #define PCIE_KVCO_TUNE_SIGNAL_OFF 0x80 22 + #define PCIE_USB3_PHY_ENABLE BIT(4) 23 + #define PHY_KVCO_FINE_TUNE_LEVEL 0x91 24 + #define PHY_KVCO_FINE_TUNE_SIGNALS 0xc 25 + 26 + #define USB_PDRSTN_SPLIT BIT(17) 27 + 28 + #define PCIE_PHY_MODE BIT(20) 29 + #define PCIE_PHY_MODE_MASK GENMASK(21, 20) 30 + #define PCIE_USB3_BUS_WIDTH_MASK GENMASK(3, 2) 31 + #define PCIE_USB3_BUS_WIDTH BIT(3) 32 + #define PCIE_USB3_RATE_MASK GENMASK(6, 5) 33 + #define PCIE_USB3_RX_STANDBY_MASK BIT(7) 34 + #define PCIE_USB3_PHY_ENABLE BIT(4) 35 + 36 + struct jh7110_pcie_phy { 37 + struct phy *phy; 38 + struct regmap *stg_syscon; 39 + struct regmap *sys_syscon; 40 + void __iomem *regs; 41 + u32 sys_phy_connect; 42 + u32 stg_pcie_mode; 43 + u32 stg_pcie_usb; 44 + enum phy_mode mode; 45 + }; 46 + 47 + static int phy_usb3_mode_set(struct jh7110_pcie_phy *data) 48 + { 49 + if (!data->stg_syscon || !data->sys_syscon) { 50 + dev_err(&data->phy->dev, "doesn't support usb3 mode\n"); 51 + return -EINVAL; 52 + } 53 + 54 + regmap_update_bits(data->stg_syscon, data->stg_pcie_mode, 55 + PCIE_PHY_MODE_MASK, PCIE_PHY_MODE); 56 + regmap_update_bits(data->stg_syscon, data->stg_pcie_usb, 57 + PCIE_USB3_BUS_WIDTH_MASK, 0); 58 + regmap_update_bits(data->stg_syscon, data->stg_pcie_usb, 59 + PCIE_USB3_PHY_ENABLE, PCIE_USB3_PHY_ENABLE); 60 + 61 + /* Connect usb 3.0 phy mode */ 62 + regmap_update_bits(data->sys_syscon, data->sys_phy_connect, 63 + USB_PDRSTN_SPLIT, 0); 64 + 65 + /* Configuare spread-spectrum mode: down-spread-spectrum */ 66 + writel(PCIE_USB3_PHY_ENABLE, data->regs + PCIE_USB3_PHY_PLL_CTL_OFF); 67 + 68 + return 0; 69 + } 70 + 71 + static void phy_pcie_mode_set(struct jh7110_pcie_phy *data) 72 + { 73 + u32 val; 74 + 75 + /* default is PCIe mode */ 76 + if (!data->stg_syscon || !data->sys_syscon) 77 + return; 78 + 79 + regmap_update_bits(data->stg_syscon, data->stg_pcie_mode, 80 + PCIE_PHY_MODE_MASK, 0); 81 + regmap_update_bits(data->stg_syscon, data->stg_pcie_usb, 82 + PCIE_USB3_BUS_WIDTH_MASK, 83 + PCIE_USB3_BUS_WIDTH); 84 + regmap_update_bits(data->stg_syscon, data->stg_pcie_usb, 85 + PCIE_USB3_PHY_ENABLE, 0); 86 + 87 + regmap_update_bits(data->sys_syscon, data->sys_phy_connect, 88 + USB_PDRSTN_SPLIT, 0); 89 + 90 + val = readl(data->regs + PCIE_USB3_PHY_PLL_CTL_OFF); 91 + val &= ~PCIE_USB3_PHY_ENABLE; 92 + writel(val, data->regs + PCIE_USB3_PHY_PLL_CTL_OFF); 93 + } 94 + 95 + static void phy_kvco_gain_set(struct jh7110_pcie_phy *phy) 96 + { 97 + /* PCIe Multi-PHY PLL KVCO Gain fine tune settings: */ 98 + writel(PHY_KVCO_FINE_TUNE_LEVEL, phy->regs + PCIE_KVCO_LEVEL_OFF); 99 + writel(PHY_KVCO_FINE_TUNE_SIGNALS, phy->regs + PCIE_KVCO_TUNE_SIGNAL_OFF); 100 + } 101 + 102 + static int jh7110_pcie_phy_set_mode(struct phy *_phy, 103 + enum phy_mode mode, int submode) 104 + { 105 + struct jh7110_pcie_phy *phy = phy_get_drvdata(_phy); 106 + int ret; 107 + 108 + if (mode == phy->mode) 109 + return 0; 110 + 111 + switch (mode) { 112 + case PHY_MODE_USB_HOST: 113 + case PHY_MODE_USB_DEVICE: 114 + case PHY_MODE_USB_OTG: 115 + ret = phy_usb3_mode_set(phy); 116 + if (ret) 117 + return ret; 118 + break; 119 + case PHY_MODE_PCIE: 120 + phy_pcie_mode_set(phy); 121 + break; 122 + default: 123 + return -EINVAL; 124 + } 125 + 126 + dev_dbg(&_phy->dev, "Changing phy mode to %d\n", mode); 127 + phy->mode = mode; 128 + 129 + return 0; 130 + } 131 + 132 + static const struct phy_ops jh7110_pcie_phy_ops = { 133 + .set_mode = jh7110_pcie_phy_set_mode, 134 + .owner = THIS_MODULE, 135 + }; 136 + 137 + static int jh7110_pcie_phy_probe(struct platform_device *pdev) 138 + { 139 + struct jh7110_pcie_phy *phy; 140 + struct device *dev = &pdev->dev; 141 + struct phy_provider *phy_provider; 142 + u32 args[2]; 143 + 144 + phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); 145 + if (!phy) 146 + return -ENOMEM; 147 + 148 + phy->regs = devm_platform_ioremap_resource(pdev, 0); 149 + if (IS_ERR(phy->regs)) 150 + return PTR_ERR(phy->regs); 151 + 152 + phy->phy = devm_phy_create(dev, NULL, &jh7110_pcie_phy_ops); 153 + if (IS_ERR(phy->phy)) 154 + return dev_err_probe(dev, PTR_ERR(phy->phy), 155 + "Failed to map phy base\n"); 156 + 157 + phy->sys_syscon = 158 + syscon_regmap_lookup_by_phandle_args(pdev->dev.of_node, 159 + "starfive,sys-syscon", 160 + 1, args); 161 + 162 + if (!IS_ERR_OR_NULL(phy->sys_syscon)) 163 + phy->sys_phy_connect = args[0]; 164 + else 165 + phy->sys_syscon = NULL; 166 + 167 + phy->stg_syscon = 168 + syscon_regmap_lookup_by_phandle_args(pdev->dev.of_node, 169 + "starfive,stg-syscon", 170 + 2, args); 171 + 172 + if (!IS_ERR_OR_NULL(phy->stg_syscon)) { 173 + phy->stg_pcie_mode = args[0]; 174 + phy->stg_pcie_usb = args[1]; 175 + } else { 176 + phy->stg_syscon = NULL; 177 + } 178 + 179 + phy_kvco_gain_set(phy); 180 + 181 + phy_set_drvdata(phy->phy, phy); 182 + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); 183 + 184 + return PTR_ERR_OR_ZERO(phy_provider); 185 + } 186 + 187 + static const struct of_device_id jh7110_pcie_phy_of_match[] = { 188 + { .compatible = "starfive,jh7110-pcie-phy" }, 189 + { /* sentinel */ }, 190 + }; 191 + MODULE_DEVICE_TABLE(of, jh7110_pcie_phy_of_match); 192 + 193 + static struct platform_driver jh7110_pcie_phy_driver = { 194 + .probe = jh7110_pcie_phy_probe, 195 + .driver = { 196 + .of_match_table = jh7110_pcie_phy_of_match, 197 + .name = "jh7110-pcie-phy", 198 + } 199 + }; 200 + module_platform_driver(jh7110_pcie_phy_driver); 201 + 202 + MODULE_DESCRIPTION("StarFive JH7110 PCIe 2.0 PHY driver"); 203 + MODULE_AUTHOR("Minda Chen <minda.chen@starfivetech.com>"); 204 + MODULE_LICENSE("GPL");
+152
drivers/phy/starfive/phy-jh7110-usb.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * StarFive JH7110 USB 2.0 PHY driver 4 + * 5 + * Copyright (C) 2023 StarFive Technology Co., Ltd. 6 + * Author: Minda Chen <minda.chen@starfivetech.com> 7 + */ 8 + 9 + #include <linux/bits.h> 10 + #include <linux/clk.h> 11 + #include <linux/err.h> 12 + #include <linux/io.h> 13 + #include <linux/module.h> 14 + #include <linux/phy/phy.h> 15 + #include <linux/platform_device.h> 16 + #include <linux/usb/of.h> 17 + 18 + #define USB_125M_CLK_RATE 125000000 19 + #define USB_LS_KEEPALIVE_OFF 0x4 20 + #define USB_LS_KEEPALIVE_ENABLE BIT(4) 21 + 22 + struct jh7110_usb2_phy { 23 + struct phy *phy; 24 + void __iomem *regs; 25 + struct clk *usb_125m_clk; 26 + struct clk *app_125m; 27 + enum phy_mode mode; 28 + }; 29 + 30 + static void usb2_set_ls_keepalive(struct jh7110_usb2_phy *phy, bool set) 31 + { 32 + unsigned int val; 33 + 34 + /* Host mode enable the LS speed keep-alive signal */ 35 + val = readl(phy->regs + USB_LS_KEEPALIVE_OFF); 36 + if (set) 37 + val |= USB_LS_KEEPALIVE_ENABLE; 38 + else 39 + val &= ~USB_LS_KEEPALIVE_ENABLE; 40 + 41 + writel(val, phy->regs + USB_LS_KEEPALIVE_OFF); 42 + } 43 + 44 + static int usb2_phy_set_mode(struct phy *_phy, 45 + enum phy_mode mode, int submode) 46 + { 47 + struct jh7110_usb2_phy *phy = phy_get_drvdata(_phy); 48 + 49 + switch (mode) { 50 + case PHY_MODE_USB_HOST: 51 + case PHY_MODE_USB_DEVICE: 52 + case PHY_MODE_USB_OTG: 53 + break; 54 + default: 55 + return -EINVAL; 56 + } 57 + 58 + if (mode != phy->mode) { 59 + dev_dbg(&_phy->dev, "Changing phy to %d\n", mode); 60 + phy->mode = mode; 61 + usb2_set_ls_keepalive(phy, (mode != PHY_MODE_USB_DEVICE)); 62 + } 63 + 64 + return 0; 65 + } 66 + 67 + static int jh7110_usb2_phy_init(struct phy *_phy) 68 + { 69 + struct jh7110_usb2_phy *phy = phy_get_drvdata(_phy); 70 + int ret; 71 + 72 + ret = clk_set_rate(phy->usb_125m_clk, USB_125M_CLK_RATE); 73 + if (ret) 74 + return ret; 75 + 76 + ret = clk_prepare_enable(phy->app_125m); 77 + if (ret) 78 + return ret; 79 + 80 + return 0; 81 + } 82 + 83 + static int jh7110_usb2_phy_exit(struct phy *_phy) 84 + { 85 + struct jh7110_usb2_phy *phy = phy_get_drvdata(_phy); 86 + 87 + clk_disable_unprepare(phy->app_125m); 88 + 89 + return 0; 90 + } 91 + 92 + static const struct phy_ops jh7110_usb2_phy_ops = { 93 + .init = jh7110_usb2_phy_init, 94 + .exit = jh7110_usb2_phy_exit, 95 + .set_mode = usb2_phy_set_mode, 96 + .owner = THIS_MODULE, 97 + }; 98 + 99 + static int jh7110_usb_phy_probe(struct platform_device *pdev) 100 + { 101 + struct jh7110_usb2_phy *phy; 102 + struct device *dev = &pdev->dev; 103 + struct phy_provider *phy_provider; 104 + 105 + phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); 106 + if (!phy) 107 + return -ENOMEM; 108 + 109 + phy->usb_125m_clk = devm_clk_get(dev, "125m"); 110 + if (IS_ERR(phy->usb_125m_clk)) 111 + return dev_err_probe(dev, PTR_ERR(phy->usb_125m_clk), 112 + "Failed to get 125m clock\n"); 113 + 114 + phy->app_125m = devm_clk_get(dev, "app_125m"); 115 + if (IS_ERR(phy->app_125m)) 116 + return dev_err_probe(dev, PTR_ERR(phy->app_125m), 117 + "Failed to get app 125m clock\n"); 118 + 119 + phy->regs = devm_platform_ioremap_resource(pdev, 0); 120 + if (IS_ERR(phy->regs)) 121 + return dev_err_probe(dev, PTR_ERR(phy->regs), 122 + "Failed to map phy base\n"); 123 + 124 + phy->phy = devm_phy_create(dev, NULL, &jh7110_usb2_phy_ops); 125 + if (IS_ERR(phy->phy)) 126 + return dev_err_probe(dev, PTR_ERR(phy->phy), 127 + "Failed to create phy\n"); 128 + 129 + phy_set_drvdata(phy->phy, phy); 130 + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); 131 + 132 + return PTR_ERR_OR_ZERO(phy_provider); 133 + } 134 + 135 + static const struct of_device_id jh7110_usb_phy_of_match[] = { 136 + { .compatible = "starfive,jh7110-usb-phy" }, 137 + { /* sentinel */ }, 138 + }; 139 + MODULE_DEVICE_TABLE(of, jh7110_usb_phy_of_match); 140 + 141 + static struct platform_driver jh7110_usb_phy_driver = { 142 + .probe = jh7110_usb_phy_probe, 143 + .driver = { 144 + .of_match_table = jh7110_usb_phy_of_match, 145 + .name = "jh7110-usb-phy", 146 + } 147 + }; 148 + module_platform_driver(jh7110_usb_phy_driver); 149 + 150 + MODULE_DESCRIPTION("StarFive JH7110 USB 2.0 PHY driver"); 151 + MODULE_AUTHOR("Minda Chen <minda.chen@starfivetech.com>"); 152 + MODULE_LICENSE("GPL");
+1 -1
drivers/phy/sunplus/phy-sunplus-usb2.c
··· 16 16 #include <linux/io.h> 17 17 #include <linux/module.h> 18 18 #include <linux/nvmem-consumer.h> 19 - #include <linux/of_platform.h> 19 + #include <linux/of.h> 20 20 #include <linux/phy/phy.h> 21 21 #include <linux/platform_device.h> 22 22 #include <linux/reset.h>
+1 -1
drivers/phy/tegra/phy-tegra194-p2u.c
··· 11 11 #include <linux/io.h> 12 12 #include <linux/module.h> 13 13 #include <linux/of.h> 14 - #include <linux/of_platform.h> 15 14 #include <linux/phy/phy.h> 15 + #include <linux/platform_device.h> 16 16 17 17 #define P2U_CONTROL_CMN 0x74 18 18 #define P2U_CONTROL_CMN_ENABLE_L2_EXIT_RATE_CHANGE BIT(13)
+1 -1
drivers/phy/tegra/xusb.c
··· 8 8 #include <linux/mailbox_client.h> 9 9 #include <linux/module.h> 10 10 #include <linux/of.h> 11 - #include <linux/of_device.h> 11 + #include <linux/of_platform.h> 12 12 #include <linux/phy/phy.h> 13 13 #include <linux/phy/tegra/xusb.h> 14 14 #include <linux/platform_device.h>
+6 -3
drivers/phy/ti/phy-gmii-sel.c
··· 465 465 466 466 priv->regmap = syscon_node_to_regmap(node->parent); 467 467 if (IS_ERR(priv->regmap)) { 468 - ret = PTR_ERR(priv->regmap); 469 - dev_err(dev, "Failed to get syscon %d\n", ret); 470 - return ret; 468 + priv->regmap = device_node_to_regmap(node); 469 + if (IS_ERR(priv->regmap)) { 470 + ret = PTR_ERR(priv->regmap); 471 + dev_err(dev, "Failed to get syscon %d\n", ret); 472 + return ret; 473 + } 471 474 } 472 475 473 476 ret = phy_gmii_sel_init_ports(priv);
+1
drivers/phy/ti/phy-tusb1210.c
··· 14 14 #include <linux/gpio/consumer.h> 15 15 #include <linux/phy/ulpi_phy.h> 16 16 #include <linux/power_supply.h> 17 + #include <linux/property.h> 17 18 #include <linux/workqueue.h> 18 19 19 20 #define TUSB1211_POWER_CONTROL 0x3d
+1
drivers/phy/ti/phy-twl4030-usb.c
··· 14 14 #include <linux/module.h> 15 15 #include <linux/init.h> 16 16 #include <linux/interrupt.h> 17 + #include <linux/of.h> 17 18 #include <linux/platform_device.h> 18 19 #include <linux/workqueue.h> 19 20 #include <linux/io.h>
+44 -51
drivers/phy/xilinx/phy-zynqmp.c
··· 20 20 #include <linux/of.h> 21 21 #include <linux/phy/phy.h> 22 22 #include <linux/platform_device.h> 23 + #include <linux/pm_runtime.h> 23 24 #include <linux/slab.h> 24 25 25 26 #include <dt-bindings/phy/phy.h> ··· 572 571 573 572 mutex_lock(&gtr_dev->gtr_mutex); 574 573 574 + /* Configure and enable the clock when peripheral phy_init call */ 575 + if (clk_prepare_enable(gtr_dev->clk[gtr_phy->lane])) 576 + goto out; 577 + 575 578 /* Skip initialization if not required. */ 576 579 if (!xpsgtr_phy_init_required(gtr_phy)) 577 580 goto out; ··· 620 615 static int xpsgtr_phy_exit(struct phy *phy) 621 616 { 622 617 struct xpsgtr_phy *gtr_phy = phy_get_drvdata(phy); 618 + struct xpsgtr_dev *gtr_dev = gtr_phy->dev; 623 619 624 620 gtr_phy->skip_phy_init = false; 621 + 622 + /* Ensure that disable clock only, which configure for lane */ 623 + clk_disable_unprepare(gtr_dev->clk[gtr_phy->lane]); 625 624 626 625 return 0; 627 626 } ··· 829 820 * Power Management 830 821 */ 831 822 832 - static int __maybe_unused xpsgtr_suspend(struct device *dev) 823 + static int xpsgtr_runtime_suspend(struct device *dev) 833 824 { 834 825 struct xpsgtr_dev *gtr_dev = dev_get_drvdata(dev); 835 - unsigned int i; 836 826 837 827 /* Save the snapshot ICM_CFG registers. */ 838 828 gtr_dev->saved_icm_cfg0 = xpsgtr_read(gtr_dev, ICM_CFG0); 839 829 gtr_dev->saved_icm_cfg1 = xpsgtr_read(gtr_dev, ICM_CFG1); 840 830 841 - for (i = 0; i < ARRAY_SIZE(gtr_dev->clk); i++) 842 - clk_disable_unprepare(gtr_dev->clk[i]); 843 - 844 831 return 0; 845 832 } 846 833 847 - static int __maybe_unused xpsgtr_resume(struct device *dev) 834 + static int xpsgtr_runtime_resume(struct device *dev) 848 835 { 849 836 struct xpsgtr_dev *gtr_dev = dev_get_drvdata(dev); 850 837 unsigned int icm_cfg0, icm_cfg1; 851 838 unsigned int i; 852 839 bool skip_phy_init; 853 - int err; 854 - 855 - for (i = 0; i < ARRAY_SIZE(gtr_dev->clk); i++) { 856 - err = clk_prepare_enable(gtr_dev->clk[i]); 857 - if (err) 858 - goto err_clk_put; 859 - } 860 840 861 841 icm_cfg0 = xpsgtr_read(gtr_dev, ICM_CFG0); 862 842 icm_cfg1 = xpsgtr_read(gtr_dev, ICM_CFG1); ··· 866 868 gtr_dev->phys[i].skip_phy_init = skip_phy_init; 867 869 868 870 return 0; 869 - 870 - err_clk_put: 871 - while (i--) 872 - clk_disable_unprepare(gtr_dev->clk[i]); 873 - 874 - return err; 875 871 } 876 872 877 - static const struct dev_pm_ops xpsgtr_pm_ops = { 878 - SET_SYSTEM_SLEEP_PM_OPS(xpsgtr_suspend, xpsgtr_resume) 879 - }; 880 - 873 + static DEFINE_RUNTIME_DEV_PM_OPS(xpsgtr_pm_ops, xpsgtr_runtime_suspend, 874 + xpsgtr_runtime_resume, NULL); 881 875 /* 882 876 * Probe & Platform Driver 883 877 */ ··· 877 887 static int xpsgtr_get_ref_clocks(struct xpsgtr_dev *gtr_dev) 878 888 { 879 889 unsigned int refclk; 880 - int ret; 881 890 882 891 for (refclk = 0; refclk < ARRAY_SIZE(gtr_dev->refclk_sscs); ++refclk) { 883 892 unsigned long rate; ··· 887 898 snprintf(name, sizeof(name), "ref%u", refclk); 888 899 clk = devm_clk_get_optional(gtr_dev->dev, name); 889 900 if (IS_ERR(clk)) { 890 - ret = dev_err_probe(gtr_dev->dev, PTR_ERR(clk), 891 - "Failed to get reference clock %u\n", 892 - refclk); 893 - goto err_clk_put; 901 + return dev_err_probe(gtr_dev->dev, PTR_ERR(clk), 902 + "Failed to get ref clock %u\n", 903 + refclk); 894 904 } 895 905 896 906 if (!clk) 897 907 continue; 898 - 899 - ret = clk_prepare_enable(clk); 900 - if (ret) 901 - goto err_clk_put; 902 908 903 909 gtr_dev->clk[refclk] = clk; 904 910 ··· 904 920 rate = clk_get_rate(clk); 905 921 906 922 for (i = 0 ; i < ARRAY_SIZE(ssc_lookup); i++) { 907 - if (rate == ssc_lookup[i].refclk_rate) { 923 + /* Allow an error of 100 ppm */ 924 + unsigned long error = ssc_lookup[i].refclk_rate / 10000; 925 + 926 + if (abs(rate - ssc_lookup[i].refclk_rate) < error) { 908 927 gtr_dev->refclk_sscs[refclk] = &ssc_lookup[i]; 909 928 break; 910 929 } ··· 917 930 dev_err(gtr_dev->dev, 918 931 "Invalid rate %lu for reference clock %u\n", 919 932 rate, refclk); 920 - ret = -EINVAL; 921 - goto err_clk_put; 933 + return -EINVAL; 922 934 } 923 935 } 924 936 925 937 return 0; 926 - 927 - err_clk_put: 928 - while (refclk--) 929 - clk_disable_unprepare(gtr_dev->clk[refclk]); 930 - 931 - return ret; 932 938 } 933 939 934 940 static int xpsgtr_probe(struct platform_device *pdev) ··· 930 950 struct xpsgtr_dev *gtr_dev; 931 951 struct phy_provider *provider; 932 952 unsigned int port; 933 - unsigned int i; 934 953 int ret; 935 954 936 955 gtr_dev = devm_kzalloc(&pdev->dev, sizeof(*gtr_dev), GFP_KERNEL); ··· 969 990 phy = devm_phy_create(&pdev->dev, np, &xpsgtr_phyops); 970 991 if (IS_ERR(phy)) { 971 992 dev_err(&pdev->dev, "failed to create PHY\n"); 972 - ret = PTR_ERR(phy); 973 - goto err_clk_put; 993 + return PTR_ERR(phy); 974 994 } 975 995 976 996 gtr_phy->phy = phy; ··· 980 1002 provider = devm_of_phy_provider_register(&pdev->dev, xpsgtr_xlate); 981 1003 if (IS_ERR(provider)) { 982 1004 dev_err(&pdev->dev, "registering provider failed\n"); 983 - ret = PTR_ERR(provider); 984 - goto err_clk_put; 1005 + return PTR_ERR(provider); 985 1006 } 1007 + 1008 + pm_runtime_set_active(gtr_dev->dev); 1009 + pm_runtime_enable(gtr_dev->dev); 1010 + 1011 + ret = pm_runtime_resume_and_get(gtr_dev->dev); 1012 + if (ret < 0) { 1013 + pm_runtime_disable(gtr_dev->dev); 1014 + return ret; 1015 + } 1016 + 986 1017 return 0; 1018 + } 987 1019 988 - err_clk_put: 989 - for (i = 0; i < ARRAY_SIZE(gtr_dev->clk); i++) 990 - clk_disable_unprepare(gtr_dev->clk[i]); 1020 + static int xpsgtr_remove(struct platform_device *pdev) 1021 + { 1022 + struct xpsgtr_dev *gtr_dev = platform_get_drvdata(pdev); 991 1023 992 - return ret; 1024 + pm_runtime_disable(gtr_dev->dev); 1025 + pm_runtime_put_noidle(gtr_dev->dev); 1026 + pm_runtime_set_suspended(gtr_dev->dev); 1027 + 1028 + return 0; 993 1029 } 994 1030 995 1031 static const struct of_device_id xpsgtr_of_match[] = { ··· 1015 1023 1016 1024 static struct platform_driver xpsgtr_driver = { 1017 1025 .probe = xpsgtr_probe, 1026 + .remove = xpsgtr_remove, 1018 1027 .driver = { 1019 1028 .name = "xilinx-psgtr", 1020 1029 .of_match_table = xpsgtr_of_match, 1021 - .pm = &xpsgtr_pm_ops, 1030 + .pm = pm_ptr(&xpsgtr_pm_ops), 1022 1031 }, 1023 1032 }; 1024 1033