mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-28 13:22:57 +00:00
phy-for-6.3
- Core support - New devm_of_phy_optional_get() API with users and conversion - New support: - Mediatek MT7986 tphy support - Qualcomm SM8550 UFS, PCIe, combo phy support, SM6115 / SM4250 USB3 phy support, SM6350 combo phy support, SM6125 UFS PHY support amd SM8350 & SM8450 combo phy support - Qualcomm SNPS eUSB2 eUSB2 repeater drivers - Allwinner F1C100s USB PHY support - Tegra xusb support for Tegra234 - Updates: - Yaml conversion for Qualcomm pcie2 phy and usb-hsic-phy - G4 mode support in Qualcomm UFS phy and support for various SoCs - Yaml conversion for Meson usb2 phy - TI Type C support for usb phy for j721 - Yaml conversion for Tegra xusb binding -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE+vs47OPLdNbVcHzyfBQHDyUjg0cFAmP4vg0ACgkQfBQHDyUj g0dJYxAA0DL9X6IFeK8U5blp/ZWmXBqbhRmnsf0KGsSRJMSgHkPruhOWfTCAvXnc 2+xp8wiE0MdLI7xseJWZi7Q2r10f5LtU55rzbL3mI7MWd/g2WTlKiXCDrpa4fY/Z pxo+892vUJh3+I2+Sjf0JnIY89MV/sqSLXsFeKDtvp7J9lMjA98TV6m+YDVTXn22 SW3hjaB8ochSQV1HEMdEJWsrZc3lmszLdQM+qz3PafyQRbhc1A98Vkf0X/sWR/Ot p0FCXlNnY3O272dnrU0V5yv7wwWqjVDN5+Q3vk3AbSlo9ERLVwchayUzxi8EIS7t cPmxhsyMoEmsSIPx4z47vLt1NQoqiaKNM7XCrn13Z0fE9fbTW8Trx8VBXcIUsE98 hT6IxrjRFGJOta8koOssBqSjuwP4QBIZiwXL2YEujj3hGqyRefOCN5XBek7dVyDe ctwJsIKBCG8Wh87dFldYLrJgQKR9svZXDjxVADpYMUpPM2v02DCWhUyM50ODowZf Yl7bP8dXtn2UBIybbhNTZg29PbrATk73tcr73GZeX8JTOK2vpsZ3+fUsdxPYzed3 lF2vw361E2ry1DtgmH7XMXevDFvKJ/aks5FIAKebc1tlAPPGYVIkBqyQprAQmlS3 tDQ+6+jQLAr14iSaVQd9MC3obNqbJYHf1WEU3rKtDy3MB0flbqo= =2g27 -----END PGP SIGNATURE----- Merge tag 'phy-for-6.3' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy Pull phy updates from Vinod Koul: "This features a bunch of new device support, a couple of new drivers, yaml conversion and updates of a few drivers. Core support: - New devm_of_phy_optional_get() API with users and conversion New hardware support: - Mediatek MT7986 phy support - Qualcomm SM8550 UFS, PCIe, combo phy support, SM6115 / SM4250 USB3 phy support, SM6350 combo phy support, SM6125 UFS PHY support amd SM8350 & SM8450 combo phy support - Qualcomm SNPS eUSB2 eUSB2 repeater drivers - Allwinner F1C100s USB PHY support - Tegra xusb support for Tegra234 Updates: - Yaml conversion for Qualcomm pcie2 phy and usb-hsic-phy - G4 mode support in Qualcomm UFS phy and support for various SoCs - Yaml conversion for Meson usb2 phy - TI Type C support for usb phy for j721 - Yaml conversion for Tegra xusb binding" * tag 'phy-for-6.3' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy: (106 commits) phy: qcom: phy-qcom-snps-eusb2: Add support for eUSB2 repeater phy: qcom: Add QCOM SNPS eUSB2 repeater driver dt-bindings: phy: qcom,snps-eusb2-phy: Add phys property for the repeater dt-bindings: phy: Add qcom,snps-eusb2-repeater schema file dt-bindings: phy: amlogic,g12a-usb3-pcie-phy: add missing optional phy-supply property phy: rockchip-typec: Fix unsigned comparison with less than zero phy: rockchip-typec: fix tcphy_get_mode error case phy: qcom: snps-eusb2: Add missing headers phy: qcom-qmp-combo: Add support for SM8550 phy: qcom-qmp: Add v6 DP register offsets phy: qcom-qmp: pcs-usb: Add v6 register offsets dt-bindings: phy: qcom,sc8280xp-qmp-usb43dp: Document SM8550 compatible phy: qcom: Add QCOM SNPS eUSB2 driver dt-bindings: phy: Add qcom,snps-eusb2-phy schema file phy: qcom-qmp-pcie: Add support for SM8550 g3x2 and g4x2 PCIEs phy: qcom-qmp: qserdes-lane-shared: Add v6 register offsets phy: qcom-qmp: qserdes-txrx: Add v6.20 register offsets phy: qcom-qmp: pcs-pcie: Add v6.20 register offsets phy: qcom-qmp: pcs-pcie: Add v6 register offsets phy: qcom-qmp: pcs: Add v6.20 register offsets ...
This commit is contained in:
commit
8ff99ad04c
69 changed files with 6570 additions and 1491 deletions
|
@ -0,0 +1,83 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/phy/allwinner,suniv-f1c100s-usb-phy.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Allwinner F1C100s USB PHY
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
compatible:
|
||||||
|
const: allwinner,suniv-f1c100s-usb-phy
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
description: PHY Control registers
|
||||||
|
|
||||||
|
reg-names:
|
||||||
|
const: phy_ctrl
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
maxItems: 1
|
||||||
|
description: USB OTG PHY bus clock
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
const: usb0_phy
|
||||||
|
|
||||||
|
resets:
|
||||||
|
maxItems: 1
|
||||||
|
description: USB OTG reset
|
||||||
|
|
||||||
|
reset-names:
|
||||||
|
const: usb0_reset
|
||||||
|
|
||||||
|
usb0_id_det-gpios:
|
||||||
|
maxItems: 1
|
||||||
|
description: GPIO to the USB OTG ID pin
|
||||||
|
|
||||||
|
usb0_vbus_det-gpios:
|
||||||
|
maxItems: 1
|
||||||
|
description: GPIO to the USB OTG VBUS detect pin
|
||||||
|
|
||||||
|
usb0_vbus_power-supply:
|
||||||
|
description: Power supply to detect the USB OTG VBUS
|
||||||
|
|
||||||
|
usb0_vbus-supply:
|
||||||
|
description: Regulator controlling USB OTG VBUS
|
||||||
|
|
||||||
|
required:
|
||||||
|
- "#phy-cells"
|
||||||
|
- compatible
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
- reg
|
||||||
|
- reg-names
|
||||||
|
- resets
|
||||||
|
- reset-names
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
|
#include <dt-bindings/clock/suniv-ccu-f1c100s.h>
|
||||||
|
#include <dt-bindings/reset/suniv-ccu-f1c100s.h>
|
||||||
|
|
||||||
|
phy@1c13400 {
|
||||||
|
compatible = "allwinner,suniv-f1c100s-usb-phy";
|
||||||
|
reg = <0x01c13400 0x10>;
|
||||||
|
reg-names = "phy_ctrl";
|
||||||
|
clocks = <&ccu CLK_USB_PHY0>;
|
||||||
|
clock-names = "usb0_phy";
|
||||||
|
resets = <&ccu RST_USB_PHY0>;
|
||||||
|
reset-names = "usb0_reset";
|
||||||
|
#phy-cells = <1>;
|
||||||
|
usb0_id_det-gpios = <&pio 4 2 GPIO_ACTIVE_HIGH>;
|
||||||
|
};
|
|
@ -35,6 +35,11 @@ properties:
|
||||||
"#phy-cells":
|
"#phy-cells":
|
||||||
const: 1
|
const: 1
|
||||||
|
|
||||||
|
phy-supply:
|
||||||
|
description:
|
||||||
|
Phandle to a regulator that provides power to the PHY. This
|
||||||
|
regulator will be managed during the PHY power on/off sequence.
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
- reg
|
- reg
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/phy/amlogic,meson-gxl-usb2-phy.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Amlogic Meson GXL USB2 PHY
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Neil Armstrong <neil.armstrong@linaro.org>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: amlogic,meson-gxl-usb2-phy
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: phy
|
||||||
|
|
||||||
|
resets:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
reset-names:
|
||||||
|
items:
|
||||||
|
- const: phy
|
||||||
|
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
phy-supply: true
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- "#phy-cells"
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
phy@78000 {
|
||||||
|
compatible = "amlogic,meson-gxl-usb2-phy";
|
||||||
|
reg = <0x78000 0x20>;
|
||||||
|
clocks = <&xtal>;
|
||||||
|
clock-names = "phy";
|
||||||
|
resets = <&phy_reset>;
|
||||||
|
reset-names = "phy";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
phy-supply = <&usb2_supply>;
|
||||||
|
};
|
|
@ -79,6 +79,7 @@ properties:
|
||||||
- enum:
|
- enum:
|
||||||
- mediatek,mt2712-tphy
|
- mediatek,mt2712-tphy
|
||||||
- mediatek,mt7629-tphy
|
- mediatek,mt7629-tphy
|
||||||
|
- mediatek,mt7986-tphy
|
||||||
- mediatek,mt8183-tphy
|
- mediatek,mt8183-tphy
|
||||||
- mediatek,mt8186-tphy
|
- mediatek,mt8186-tphy
|
||||||
- mediatek,mt8192-tphy
|
- mediatek,mt8192-tphy
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
* Amlogic Meson GXL and GXM USB2 PHY binding
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible: Should be "amlogic,meson-gxl-usb2-phy"
|
|
||||||
- reg: The base address and length of the registers
|
|
||||||
- #phys-cells: must be 0 (see phy-bindings.txt in this directory)
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
- clocks: a phandle to the clock of this PHY
|
|
||||||
- clock-names: must be "phy"
|
|
||||||
- resets: a phandle to the reset line of this PHY
|
|
||||||
- reset-names: must be "phy"
|
|
||||||
- phy-supply: see phy-bindings.txt in this directory
|
|
||||||
|
|
||||||
|
|
||||||
Example:
|
|
||||||
usb2_phy0: phy@78000 {
|
|
||||||
compatible = "amlogic,meson-gxl-usb2-phy";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
reg = <0x0 0x78000 0x0 0x20>;
|
|
||||||
};
|
|
|
@ -1,779 +0,0 @@
|
||||||
Device tree binding for NVIDIA Tegra XUSB pad controller
|
|
||||||
========================================================
|
|
||||||
|
|
||||||
The Tegra XUSB pad controller manages a set of I/O lanes (with differential
|
|
||||||
signals) which connect directly to pins/pads on the SoC package. Each lane
|
|
||||||
is controlled by a HW block referred to as a "pad" in the Tegra hardware
|
|
||||||
documentation. Each such "pad" may control either one or multiple lanes,
|
|
||||||
and thus contains any logic common to all its lanes. Each lane can be
|
|
||||||
separately configured and powered up.
|
|
||||||
|
|
||||||
Some of the lanes are high-speed lanes, which can be used for PCIe, SATA or
|
|
||||||
super-speed USB. Other lanes are for various types of low-speed, full-speed
|
|
||||||
or high-speed USB (such as UTMI, ULPI and HSIC). The XUSB pad controller
|
|
||||||
contains a software-configurable mux that sits between the I/O controller
|
|
||||||
ports (e.g. PCIe) and the lanes.
|
|
||||||
|
|
||||||
In addition to per-lane configuration, USB 3.0 ports may require additional
|
|
||||||
settings on a per-board basis.
|
|
||||||
|
|
||||||
Pads will be represented as children of the top-level XUSB pad controller
|
|
||||||
device tree node. Each lane exposed by the pad will be represented by its
|
|
||||||
own subnode and can be referenced by users of the lane using the standard
|
|
||||||
PHY bindings, as described by the phy-bindings.txt file in this directory.
|
|
||||||
|
|
||||||
The Tegra hardware documentation refers to the connection between the XUSB
|
|
||||||
pad controller and the XUSB controller as "ports". This is confusing since
|
|
||||||
"port" is typically used to denote the physical USB receptacle. The device
|
|
||||||
tree binding in this document uses the term "port" to refer to the logical
|
|
||||||
abstraction of the signals that are routed to a USB receptacle (i.e. a PHY
|
|
||||||
for the USB signal, the VBUS power supply, the USB 2.0 companion port for
|
|
||||||
USB 3.0 receptacles, ...).
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
--------------------
|
|
||||||
- compatible: Must be:
|
|
||||||
- Tegra124: "nvidia,tegra124-xusb-padctl"
|
|
||||||
- Tegra132: "nvidia,tegra132-xusb-padctl", "nvidia,tegra124-xusb-padctl"
|
|
||||||
- Tegra210: "nvidia,tegra210-xusb-padctl"
|
|
||||||
- Tegra186: "nvidia,tegra186-xusb-padctl"
|
|
||||||
- Tegra194: "nvidia,tegra194-xusb-padctl"
|
|
||||||
- reg: Physical base address and length of the controller's registers.
|
|
||||||
- resets: Must contain an entry for each entry in reset-names.
|
|
||||||
- reset-names: Must include the following entries:
|
|
||||||
- "padctl"
|
|
||||||
|
|
||||||
For Tegra124:
|
|
||||||
- avdd-pll-utmip-supply: UTMI PLL power supply. Must supply 1.8 V.
|
|
||||||
- avdd-pll-erefe-supply: PLLE reference PLL power supply. Must supply 1.05 V.
|
|
||||||
- avdd-pex-pll-supply: PCIe/USB3 PLL power supply. Must supply 1.05 V.
|
|
||||||
- hvdd-pex-pll-e-supply: High-voltage PLLE power supply. Must supply 3.3 V.
|
|
||||||
|
|
||||||
For Tegra210:
|
|
||||||
- avdd-pll-utmip-supply: UTMI PLL power supply. Must supply 1.8 V.
|
|
||||||
- avdd-pll-uerefe-supply: PLLE reference PLL power supply. Must supply 1.05 V.
|
|
||||||
- dvdd-pex-pll-supply: PCIe/USB3 PLL power supply. Must supply 1.05 V.
|
|
||||||
- hvdd-pex-pll-e-supply: High-voltage PLLE power supply. Must supply 1.8 V.
|
|
||||||
- nvidia,pmc: phandle and specifier referring to the Tegra210 PMC node.
|
|
||||||
|
|
||||||
For Tegra186:
|
|
||||||
- avdd-pll-erefeut-supply: UPHY brick and reference clock as well as UTMI PHY
|
|
||||||
power supply. Must supply 1.8 V.
|
|
||||||
- avdd-usb-supply: USB I/Os, VBUS, ID, REXT, D+/D- power supply. Must supply
|
|
||||||
3.3 V.
|
|
||||||
- vclamp-usb-supply: Bias rail for USB pad. Must supply 1.8 V.
|
|
||||||
- vddio-hsic-supply: HSIC PHY power supply. Must supply 1.2 V.
|
|
||||||
|
|
||||||
For Tegra194:
|
|
||||||
- avdd-usb-supply: USB I/Os, VBUS, ID, REXT, D+/D- power supply. Must supply
|
|
||||||
3.3 V.
|
|
||||||
- vclamp-usb-supply: Bias rail for USB pad. Must supply 1.8 V.
|
|
||||||
|
|
||||||
Pad nodes:
|
|
||||||
==========
|
|
||||||
|
|
||||||
A required child node named "pads" contains a list of subnodes, one for each
|
|
||||||
of the pads exposed by the XUSB pad controller. Each pad may need additional
|
|
||||||
resources that can be referenced in its pad node.
|
|
||||||
|
|
||||||
The "status" property is used to enable or disable the use of a pad. If set
|
|
||||||
to "disabled", the pad will not be used on the given board. In order to use
|
|
||||||
the pad and any of its lanes, this property must be set to "okay".
|
|
||||||
|
|
||||||
For Tegra124 and Tegra132, the following pads exist: usb2, ulpi, hsic, pcie
|
|
||||||
and sata. No extra resources are required for operation of these pads.
|
|
||||||
|
|
||||||
For Tegra210, the following pads exist: usb2, hsic, pcie and sata. Below is
|
|
||||||
a description of the properties of each pad.
|
|
||||||
|
|
||||||
UTMI pad:
|
|
||||||
---------
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- clocks: Must contain an entry for each entry in clock-names.
|
|
||||||
- clock-names: Must contain the following entries:
|
|
||||||
- "trk": phandle and specifier referring to the USB2 tracking clock
|
|
||||||
|
|
||||||
HSIC pad:
|
|
||||||
---------
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- clocks: Must contain an entry for each entry in clock-names.
|
|
||||||
- clock-names: Must contain the following entries:
|
|
||||||
- "trk": phandle and specifier referring to the HSIC tracking clock
|
|
||||||
|
|
||||||
PCIe pad:
|
|
||||||
---------
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- clocks: Must contain an entry for each entry in clock-names.
|
|
||||||
- clock-names: Must contain the following entries:
|
|
||||||
- "pll": phandle and specifier referring to the PLLE
|
|
||||||
- resets: Must contain an entry for each entry in reset-names.
|
|
||||||
- reset-names: Must contain the following entries:
|
|
||||||
- "phy": reset for the PCIe UPHY block
|
|
||||||
|
|
||||||
SATA pad:
|
|
||||||
---------
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- resets: Must contain an entry for each entry in reset-names.
|
|
||||||
- reset-names: Must contain the following entries:
|
|
||||||
- "phy": reset for the SATA UPHY block
|
|
||||||
|
|
||||||
|
|
||||||
PHY nodes:
|
|
||||||
==========
|
|
||||||
|
|
||||||
Each pad node has a child named "lanes" that contains one or more children of
|
|
||||||
its own, each representing one of the lanes controlled by the pad.
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
--------------------
|
|
||||||
- status: Defines the operation status of the PHY. Valid values are:
|
|
||||||
- "disabled": the PHY is disabled
|
|
||||||
- "okay": the PHY is enabled
|
|
||||||
- #phy-cells: Should be 0. Since each lane represents a single PHY, there is
|
|
||||||
no need for an additional specifier.
|
|
||||||
- nvidia,function: The output function of the PHY. See below for a list of
|
|
||||||
valid functions per SoC generation.
|
|
||||||
|
|
||||||
For Tegra124 and Tegra132, the list of valid PHY nodes is given below:
|
|
||||||
- usb2: usb2-0, usb2-1, usb2-2
|
|
||||||
- functions: "snps", "xusb", "uart"
|
|
||||||
- ulpi: ulpi-0
|
|
||||||
- functions: "snps", "xusb"
|
|
||||||
- hsic: hsic-0, hsic-1
|
|
||||||
- functions: "snps", "xusb"
|
|
||||||
- pcie: pcie-0, pcie-1, pcie-2, pcie-3, pcie-4
|
|
||||||
- functions: "pcie", "usb3-ss"
|
|
||||||
- sata: sata-0
|
|
||||||
- functions: "usb3-ss", "sata"
|
|
||||||
|
|
||||||
For Tegra210, the list of valid PHY nodes is given below:
|
|
||||||
- usb2: usb2-0, usb2-1, usb2-2, usb2-3
|
|
||||||
- functions: "snps", "xusb", "uart"
|
|
||||||
- hsic: hsic-0, hsic-1
|
|
||||||
- functions: "snps", "xusb"
|
|
||||||
- pcie: pcie-0, pcie-1, pcie-2, pcie-3, pcie-4, pcie-5, pcie-6
|
|
||||||
- functions: "pcie-x1", "usb3-ss", "pcie-x4"
|
|
||||||
- sata: sata-0
|
|
||||||
- functions: "usb3-ss", "sata"
|
|
||||||
|
|
||||||
For Tegra194, the list of valid PHY nodes is given below:
|
|
||||||
- usb2: usb2-0, usb2-1, usb2-2, usb2-3
|
|
||||||
- functions: "xusb"
|
|
||||||
- usb3: usb3-0, usb3-1, usb3-2, usb3-3
|
|
||||||
- functions: "xusb"
|
|
||||||
|
|
||||||
Port nodes:
|
|
||||||
===========
|
|
||||||
|
|
||||||
A required child node named "ports" contains a list of all the ports exposed
|
|
||||||
by the XUSB pad controller. Per-port configuration is only required for USB.
|
|
||||||
|
|
||||||
USB2 ports:
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- status: Defines the operation status of the port. Valid values are:
|
|
||||||
- "disabled": the port is disabled
|
|
||||||
- "okay": the port is enabled
|
|
||||||
- mode: A string that determines the mode in which to run the port. Valid
|
|
||||||
values are:
|
|
||||||
- "host": for USB host mode
|
|
||||||
- "device": for USB device mode
|
|
||||||
- "otg": for USB OTG mode
|
|
||||||
|
|
||||||
Required properties for OTG/Peripheral capable USB2 ports:
|
|
||||||
- usb-role-switch: Boolean property to indicate that the port support OTG or
|
|
||||||
peripheral mode. If present, the port supports switching between USB host
|
|
||||||
and peripheral roles. Connector should be added as subnode.
|
|
||||||
See usb/usb-conn-gpio.txt.
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
- nvidia,internal: A boolean property whose presence determines that a port
|
|
||||||
is internal. In the absence of this property the port is considered to be
|
|
||||||
external.
|
|
||||||
- vbus-supply: phandle to a regulator supplying the VBUS voltage.
|
|
||||||
|
|
||||||
ULPI ports:
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
- status: Defines the operation status of the port. Valid values are:
|
|
||||||
- "disabled": the port is disabled
|
|
||||||
- "okay": the port is enabled
|
|
||||||
- nvidia,internal: A boolean property whose presence determines that a port
|
|
||||||
is internal. In the absence of this property the port is considered to be
|
|
||||||
external.
|
|
||||||
- vbus-supply: phandle to a regulator supplying the VBUS voltage.
|
|
||||||
|
|
||||||
HSIC ports:
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- status: Defines the operation status of the port. Valid values are:
|
|
||||||
- "disabled": the port is disabled
|
|
||||||
- "okay": the port is enabled
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
- vbus-supply: phandle to a regulator supplying the VBUS voltage.
|
|
||||||
|
|
||||||
Super-speed USB ports:
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- status: Defines the operation status of the port. Valid values are:
|
|
||||||
- "disabled": the port is disabled
|
|
||||||
- "okay": the port is enabled
|
|
||||||
- nvidia,usb2-companion: A single cell that specifies the physical port number
|
|
||||||
to map this super-speed USB port to. The range of valid port numbers varies
|
|
||||||
with the SoC generation:
|
|
||||||
- 0-2: for Tegra124 and Tegra132
|
|
||||||
- 0-3: for Tegra210
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
- nvidia,internal: A boolean property whose presence determines that a port
|
|
||||||
is internal. In the absence of this property the port is considered to be
|
|
||||||
external.
|
|
||||||
|
|
||||||
- maximum-speed: Only for Tegra194. A string property that specifies maximum
|
|
||||||
supported speed of a usb3 port. Valid values are:
|
|
||||||
- "super-speed-plus": default, the usb3 port supports USB 3.1 Gen 2 speed.
|
|
||||||
- "super-speed": the usb3 port supports USB 3.1 Gen 1 speed only.
|
|
||||||
|
|
||||||
For Tegra124 and Tegra132, the XUSB pad controller exposes the following
|
|
||||||
ports:
|
|
||||||
- 3x USB2: usb2-0, usb2-1, usb2-2
|
|
||||||
- 1x ULPI: ulpi-0
|
|
||||||
- 2x HSIC: hsic-0, hsic-1
|
|
||||||
- 2x super-speed USB: usb3-0, usb3-1
|
|
||||||
|
|
||||||
For Tegra210, the XUSB pad controller exposes the following ports:
|
|
||||||
- 4x USB2: usb2-0, usb2-1, usb2-2, usb2-3
|
|
||||||
- 2x HSIC: hsic-0, hsic-1
|
|
||||||
- 4x super-speed USB: usb3-0, usb3-1, usb3-2, usb3-3
|
|
||||||
|
|
||||||
For Tegra194, the XUSB pad controller exposes the following ports:
|
|
||||||
- 4x USB2: usb2-0, usb2-1, usb2-2, usb2-3
|
|
||||||
- 4x super-speed USB: usb3-0, usb3-1, usb3-2, usb3-3
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
=========
|
|
||||||
|
|
||||||
Tegra124 and Tegra132:
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
SoC include:
|
|
||||||
|
|
||||||
padctl@7009f000 {
|
|
||||||
/* for Tegra124 */
|
|
||||||
compatible = "nvidia,tegra124-xusb-padctl";
|
|
||||||
/* for Tegra132 */
|
|
||||||
compatible = "nvidia,tegra132-xusb-padctl",
|
|
||||||
"nvidia,tegra124-xusb-padctl";
|
|
||||||
reg = <0x0 0x7009f000 0x0 0x1000>;
|
|
||||||
resets = <&tegra_car 142>;
|
|
||||||
reset-names = "padctl";
|
|
||||||
|
|
||||||
pads {
|
|
||||||
usb2 {
|
|
||||||
status = "disabled";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
usb2-0 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-1 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-2 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
ulpi {
|
|
||||||
status = "disabled";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
ulpi-0 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
hsic {
|
|
||||||
status = "disabled";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
hsic-0 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
hsic-1 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie {
|
|
||||||
status = "disabled";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
pcie-0 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-1 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-2 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-3 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-4 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
sata {
|
|
||||||
status = "disabled";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
sata-0 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
ports {
|
|
||||||
usb2-0 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-1 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-2 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
ulpi-0 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
hsic-0 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
hsic-1 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb3-0 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb3-1 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
Board file:
|
|
||||||
|
|
||||||
padctl@7009f000 {
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
pads {
|
|
||||||
usb2 {
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
usb2-0 {
|
|
||||||
nvidia,function = "xusb";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-1 {
|
|
||||||
nvidia,function = "xusb";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-2 {
|
|
||||||
nvidia,function = "xusb";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie {
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
pcie-0 {
|
|
||||||
nvidia,function = "usb3-ss";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-2 {
|
|
||||||
nvidia,function = "pcie";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-4 {
|
|
||||||
nvidia,function = "pcie";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
sata {
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
sata-0 {
|
|
||||||
nvidia,function = "sata";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
ports {
|
|
||||||
/* Micro A/B */
|
|
||||||
usb2-0 {
|
|
||||||
status = "okay";
|
|
||||||
mode = "otg";
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Mini PCIe */
|
|
||||||
usb2-1 {
|
|
||||||
status = "okay";
|
|
||||||
mode = "host";
|
|
||||||
};
|
|
||||||
|
|
||||||
/* USB3 */
|
|
||||||
usb2-2 {
|
|
||||||
status = "okay";
|
|
||||||
mode = "host";
|
|
||||||
|
|
||||||
vbus-supply = <&vdd_usb3_vbus>;
|
|
||||||
};
|
|
||||||
|
|
||||||
usb3-0 {
|
|
||||||
nvidia,port = <2>;
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
Tegra210:
|
|
||||||
---------
|
|
||||||
|
|
||||||
SoC include:
|
|
||||||
|
|
||||||
padctl@7009f000 {
|
|
||||||
compatible = "nvidia,tegra210-xusb-padctl";
|
|
||||||
reg = <0x0 0x7009f000 0x0 0x1000>;
|
|
||||||
resets = <&tegra_car 142>;
|
|
||||||
reset-names = "padctl";
|
|
||||||
|
|
||||||
status = "disabled";
|
|
||||||
|
|
||||||
pads {
|
|
||||||
usb2 {
|
|
||||||
clocks = <&tegra_car TEGRA210_CLK_USB2_TRK>;
|
|
||||||
clock-names = "trk";
|
|
||||||
status = "disabled";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
usb2-0 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-1 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-2 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-3 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
hsic {
|
|
||||||
clocks = <&tegra_car TEGRA210_CLK_HSIC_TRK>;
|
|
||||||
clock-names = "trk";
|
|
||||||
status = "disabled";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
hsic-0 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
hsic-1 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie {
|
|
||||||
clocks = <&tegra_car TEGRA210_CLK_PLL_E>;
|
|
||||||
clock-names = "pll";
|
|
||||||
resets = <&tegra_car 205>;
|
|
||||||
reset-names = "phy";
|
|
||||||
status = "disabled";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
pcie-0 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-1 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-2 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-3 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-4 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-5 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-6 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
sata {
|
|
||||||
clocks = <&tegra_car TEGRA210_CLK_PLL_E>;
|
|
||||||
clock-names = "pll";
|
|
||||||
resets = <&tegra_car 204>;
|
|
||||||
reset-names = "phy";
|
|
||||||
status = "disabled";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
sata-0 {
|
|
||||||
status = "disabled";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
ports {
|
|
||||||
usb2-0 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-1 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-2 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-3 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
hsic-0 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
hsic-1 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb3-0 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb3-1 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb3-2 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb3-3 {
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
Board file:
|
|
||||||
|
|
||||||
padctl@7009f000 {
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
pads {
|
|
||||||
usb2 {
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
usb2-0 {
|
|
||||||
nvidia,function = "xusb";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-1 {
|
|
||||||
nvidia,function = "xusb";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-2 {
|
|
||||||
nvidia,function = "xusb";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-3 {
|
|
||||||
nvidia,function = "xusb";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie {
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
pcie-0 {
|
|
||||||
nvidia,function = "pcie-x1";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-1 {
|
|
||||||
nvidia,function = "pcie-x4";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-2 {
|
|
||||||
nvidia,function = "pcie-x4";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-3 {
|
|
||||||
nvidia,function = "pcie-x4";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-4 {
|
|
||||||
nvidia,function = "pcie-x4";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-5 {
|
|
||||||
nvidia,function = "usb3-ss";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
pcie-6 {
|
|
||||||
nvidia,function = "usb3-ss";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
sata {
|
|
||||||
status = "okay";
|
|
||||||
|
|
||||||
lanes {
|
|
||||||
sata-0 {
|
|
||||||
nvidia,function = "sata";
|
|
||||||
status = "okay";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
ports {
|
|
||||||
usb2-0 {
|
|
||||||
status = "okay";
|
|
||||||
mode = "otg";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-1 {
|
|
||||||
status = "okay";
|
|
||||||
vbus-supply = <&vdd_5v0_rtl>;
|
|
||||||
mode = "host";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-2 {
|
|
||||||
status = "okay";
|
|
||||||
vbus-supply = <&vdd_usb_vbus>;
|
|
||||||
mode = "host";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb2-3 {
|
|
||||||
status = "okay";
|
|
||||||
mode = "host";
|
|
||||||
};
|
|
||||||
|
|
||||||
usb3-0 {
|
|
||||||
status = "okay";
|
|
||||||
nvidia,lanes = "pcie-6";
|
|
||||||
nvidia,port = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
usb3-1 {
|
|
||||||
status = "okay";
|
|
||||||
nvidia,lanes = "pcie-5";
|
|
||||||
nvidia,port = <2>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
|
@ -0,0 +1,654 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/phy/nvidia,tegra124-xusb-padctl.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: NVIDIA Tegra124 XUSB pad controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Thierry Reding <thierry.reding@gmail.com>
|
||||||
|
- Jon Hunter <jonathanh@nvidia.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The Tegra XUSB pad controller manages a set of I/O lanes (with differential
|
||||||
|
signals) which connect directly to pins/pads on the SoC package. Each lane
|
||||||
|
is controlled by a HW block referred to as a "pad" in the Tegra hardware
|
||||||
|
documentation. Each such "pad" may control either one or multiple lanes,
|
||||||
|
and thus contains any logic common to all its lanes. Each lane can be
|
||||||
|
separately configured and powered up.
|
||||||
|
|
||||||
|
Some of the lanes are high-speed lanes, which can be used for PCIe, SATA or
|
||||||
|
super-speed USB. Other lanes are for various types of low-speed, full-speed
|
||||||
|
or high-speed USB (such as UTMI, ULPI and HSIC). The XUSB pad controller
|
||||||
|
contains a software-configurable mux that sits between the I/O controller
|
||||||
|
ports (e.g. PCIe) and the lanes.
|
||||||
|
|
||||||
|
In addition to per-lane configuration, USB 3.0 ports may require additional
|
||||||
|
settings on a per-board basis.
|
||||||
|
|
||||||
|
Pads will be represented as children of the top-level XUSB pad controller
|
||||||
|
device tree node. Each lane exposed by the pad will be represented by its
|
||||||
|
own subnode and can be referenced by users of the lane using the standard
|
||||||
|
PHY bindings, as described by the phy-bindings.txt file in this directory.
|
||||||
|
|
||||||
|
The Tegra hardware documentation refers to the connection between the XUSB
|
||||||
|
pad controller and the XUSB controller as "ports". This is confusing since
|
||||||
|
"port" is typically used to denote the physical USB receptacle. The device
|
||||||
|
tree binding in this document uses the term "port" to refer to the logical
|
||||||
|
abstraction of the signals that are routed to a USB receptacle (i.e. a PHY
|
||||||
|
for the USB signal, the VBUS power supply, the USB 2.0 companion port for
|
||||||
|
USB 3.0 receptacles, ...).
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
- enum:
|
||||||
|
- nvidia,tegra124-xusb-padctl
|
||||||
|
|
||||||
|
- items:
|
||||||
|
- const: nvidia,tegra132-xusb-padctl
|
||||||
|
- const: nvidia,tegra124-xusb-padctl
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
items:
|
||||||
|
- description: XUSB pad controller interrupt
|
||||||
|
|
||||||
|
resets:
|
||||||
|
items:
|
||||||
|
- description: pad controller reset
|
||||||
|
|
||||||
|
reset-names:
|
||||||
|
items:
|
||||||
|
- const: padctl
|
||||||
|
|
||||||
|
avdd-pll-utmip-supply:
|
||||||
|
description: UTMI PLL power supply. Must supply 1.8 V.
|
||||||
|
|
||||||
|
avdd-pll-erefe-supply:
|
||||||
|
description: PLLE reference PLL power supply. Must supply 1.05 V.
|
||||||
|
|
||||||
|
avdd-pex-pll-supply:
|
||||||
|
description: PCIe/USB3 PLL power supply. Must supply 1.05 V.
|
||||||
|
|
||||||
|
hvdd-pex-pll-e-supply:
|
||||||
|
description: High-voltage PLLE power supply. Must supply 3.3 V.
|
||||||
|
|
||||||
|
pads:
|
||||||
|
description: A required child node named "pads" contains a list of
|
||||||
|
subnodes, one for each of the pads exposed by the XUSB pad controller.
|
||||||
|
Each pad may need additional resources that can be referenced in its
|
||||||
|
pad node.
|
||||||
|
|
||||||
|
The "status" property is used to enable or disable the use of a pad.
|
||||||
|
If set to "disabled", the pad will not be used on the given board. In
|
||||||
|
order to use the pad and any of its lanes, this property must be set
|
||||||
|
to "okay" or be absent.
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: USB2 tracking clock
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: trk
|
||||||
|
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb2-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ snps, xusb, uart ]
|
||||||
|
|
||||||
|
usb2-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ snps, xusb, uart ]
|
||||||
|
|
||||||
|
usb2-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ snps, xusb, uart ]
|
||||||
|
|
||||||
|
ulpi:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
ulpi-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ snps, xusb ]
|
||||||
|
|
||||||
|
hsic:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: HSIC tracking clock
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: trk
|
||||||
|
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
hsic-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ snps, xusb ]
|
||||||
|
|
||||||
|
hsic-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ snps, xusb ]
|
||||||
|
|
||||||
|
pcie:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: PLLE clock
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: pll
|
||||||
|
|
||||||
|
resets:
|
||||||
|
items:
|
||||||
|
- description: reset for the PCIe UPHY block
|
||||||
|
|
||||||
|
reset-names:
|
||||||
|
items:
|
||||||
|
- const: phy
|
||||||
|
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
pcie-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ pcie, usb3-ss ]
|
||||||
|
|
||||||
|
pcie-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ pcie, usb3-ss ]
|
||||||
|
|
||||||
|
pcie-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ pcie, usb3-ss ]
|
||||||
|
|
||||||
|
pcie-3:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ pcie, usb3-ss ]
|
||||||
|
|
||||||
|
pcie-4:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ pcie, usb3-ss ]
|
||||||
|
|
||||||
|
sata:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
resets:
|
||||||
|
items:
|
||||||
|
- description: reset for the SATA UPHY block
|
||||||
|
|
||||||
|
reset-names:
|
||||||
|
items:
|
||||||
|
- const: phy
|
||||||
|
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
sata-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ sata, usb3-ss ]
|
||||||
|
|
||||||
|
ports:
|
||||||
|
description: A required child node named "ports" contains a list of
|
||||||
|
subnodes, one for each of the ports exposed by the XUSB pad controller.
|
||||||
|
Each port may need additional resources that can be referenced in its
|
||||||
|
port node.
|
||||||
|
|
||||||
|
The "status" property is used to enable or disable the use of a port.
|
||||||
|
If set to "disabled", the port will not be used on the given board. In
|
||||||
|
order to use the port, this property must be set to "okay".
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb2-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
usb2-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
usb2-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
ulpi-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
hsic-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
hsic-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
usb3-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
nvidia,usb2-companion:
|
||||||
|
description: A single cell that specifies the physical port
|
||||||
|
number to map this super-speed USB port to. The range of
|
||||||
|
valid port numbers varies with the SoC generation.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1, 2 ]
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
usb3-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
nvidia,usb2-companion:
|
||||||
|
description: A single cell that specifies the physical port
|
||||||
|
number to map this super-speed USB port to. The range of
|
||||||
|
valid port numbers varies with the SoC generation.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1, 2 ]
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- resets
|
||||||
|
- reset-names
|
||||||
|
- avdd-pll-utmip-supply
|
||||||
|
- avdd-pll-erefe-supply
|
||||||
|
- avdd-pex-pll-supply
|
||||||
|
- hvdd-pex-pll-e-supply
|
||||||
|
|
||||||
|
examples:
|
||||||
|
# Tegra124 and Tegra132
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
|
||||||
|
padctl@7009f000 {
|
||||||
|
compatible = "nvidia,tegra124-xusb-padctl";
|
||||||
|
reg = <0x7009f000 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
resets = <&tegra_car 142>;
|
||||||
|
reset-names = "padctl";
|
||||||
|
|
||||||
|
avdd-pll-utmip-supply = <&vddio_1v8>;
|
||||||
|
avdd-pll-erefe-supply = <&avdd_1v05_run>;
|
||||||
|
avdd-pex-pll-supply = <&vdd_1v05_run>;
|
||||||
|
hvdd-pex-pll-e-supply = <&vdd_3v3_lp0>;
|
||||||
|
|
||||||
|
pads {
|
||||||
|
usb2 {
|
||||||
|
lanes {
|
||||||
|
usb2-0 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-1 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-2 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ulpi {
|
||||||
|
lanes {
|
||||||
|
ulpi-0 {
|
||||||
|
status = "disabled";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
hsic {
|
||||||
|
lanes {
|
||||||
|
hsic-0 {
|
||||||
|
status = "disabled";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
hsic-1 {
|
||||||
|
status = "disabled";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie {
|
||||||
|
lanes {
|
||||||
|
pcie-0 {
|
||||||
|
nvidia,function = "usb3-ss";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie-1 {
|
||||||
|
status = "disabled";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie-2 {
|
||||||
|
nvidia,function = "pcie";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie-3 {
|
||||||
|
status = "disabled";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie-4 {
|
||||||
|
nvidia,function = "pcie";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
sata {
|
||||||
|
lanes {
|
||||||
|
sata-0 {
|
||||||
|
nvidia,function = "sata";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ports {
|
||||||
|
/* Micro A/B */
|
||||||
|
usb2-0 {
|
||||||
|
mode = "otg";
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Mini PCIe */
|
||||||
|
usb2-1 {
|
||||||
|
mode = "host";
|
||||||
|
};
|
||||||
|
|
||||||
|
/* USB3 */
|
||||||
|
usb2-2 {
|
||||||
|
vbus-supply = <&vdd_usb3_vbus>;
|
||||||
|
mode = "host";
|
||||||
|
};
|
||||||
|
|
||||||
|
ulpi-0 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
hsic-0 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
hsic-1 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-0 {
|
||||||
|
nvidia,usb2-companion = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-1 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,544 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/phy/nvidia,tegra186-xusb-padctl.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: NVIDIA Tegra186 XUSB pad controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Thierry Reding <thierry.reding@gmail.com>
|
||||||
|
- Jon Hunter <jonathanh@nvidia.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The Tegra XUSB pad controller manages a set of I/O lanes (with differential
|
||||||
|
signals) which connect directly to pins/pads on the SoC package. Each lane
|
||||||
|
is controlled by a HW block referred to as a "pad" in the Tegra hardware
|
||||||
|
documentation. Each such "pad" may control either one or multiple lanes,
|
||||||
|
and thus contains any logic common to all its lanes. Each lane can be
|
||||||
|
separately configured and powered up.
|
||||||
|
|
||||||
|
Some of the lanes are high-speed lanes, which can be used for PCIe, SATA or
|
||||||
|
super-speed USB. Other lanes are for various types of low-speed, full-speed
|
||||||
|
or high-speed USB (such as UTMI, ULPI and HSIC). The XUSB pad controller
|
||||||
|
contains a software-configurable mux that sits between the I/O controller
|
||||||
|
ports (e.g. PCIe) and the lanes.
|
||||||
|
|
||||||
|
In addition to per-lane configuration, USB 3.0 ports may require additional
|
||||||
|
settings on a per-board basis.
|
||||||
|
|
||||||
|
Pads will be represented as children of the top-level XUSB pad controller
|
||||||
|
device tree node. Each lane exposed by the pad will be represented by its
|
||||||
|
own subnode and can be referenced by users of the lane using the standard
|
||||||
|
PHY bindings, as described by the phy-bindings.txt file in this directory.
|
||||||
|
|
||||||
|
The Tegra hardware documentation refers to the connection between the XUSB
|
||||||
|
pad controller and the XUSB controller as "ports". This is confusing since
|
||||||
|
"port" is typically used to denote the physical USB receptacle. The device
|
||||||
|
tree binding in this document uses the term "port" to refer to the logical
|
||||||
|
abstraction of the signals that are routed to a USB receptacle (i.e. a PHY
|
||||||
|
for the USB signal, the VBUS power supply, the USB 2.0 companion port for
|
||||||
|
USB 3.0 receptacles, ...).
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: nvidia,tegra186-xusb-padctl
|
||||||
|
|
||||||
|
reg:
|
||||||
|
items:
|
||||||
|
- description: pad controller registers
|
||||||
|
- description: AO registers
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
items:
|
||||||
|
- description: XUSB pad controller interrupt
|
||||||
|
|
||||||
|
reg-names:
|
||||||
|
items:
|
||||||
|
- const: padctl
|
||||||
|
- const: ao
|
||||||
|
|
||||||
|
resets:
|
||||||
|
items:
|
||||||
|
- description: pad controller reset
|
||||||
|
|
||||||
|
reset-names:
|
||||||
|
items:
|
||||||
|
- const: padctl
|
||||||
|
|
||||||
|
avdd-pll-erefeut-supply:
|
||||||
|
description: UPHY brick and reference clock as well as UTMI PHY
|
||||||
|
power supply. Must supply 1.8 V.
|
||||||
|
|
||||||
|
avdd-usb-supply:
|
||||||
|
description: USB I/Os, VBUS, ID, REXT, D+/D- power supply. Must
|
||||||
|
supply 3.3 V.
|
||||||
|
|
||||||
|
vclamp-usb-supply:
|
||||||
|
description: Bias rail for USB pad. Must supply 1.8 V.
|
||||||
|
|
||||||
|
vddio-hsic-supply:
|
||||||
|
description: HSIC PHY power supply. Must supply 1.2 V.
|
||||||
|
|
||||||
|
pads:
|
||||||
|
description: A required child node named "pads" contains a list of
|
||||||
|
subnodes, one for each of the pads exposed by the XUSB pad controller.
|
||||||
|
Each pad may need additional resources that can be referenced in its
|
||||||
|
pad node.
|
||||||
|
|
||||||
|
The "status" property is used to enable or disable the use of a pad.
|
||||||
|
If set to "disabled", the pad will not be used on the given board. In
|
||||||
|
order to use the pad and any of its lanes, this property must be set
|
||||||
|
to "okay" or be absent.
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: USB2 tracking clock
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: trk
|
||||||
|
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb2-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
usb2-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
usb2-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
hsic:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: HSIC tracking clock
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: trk
|
||||||
|
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
hsic-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
usb3:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb3-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
usb3-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
usb3-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
ports:
|
||||||
|
description: A required child node named "ports" contains a list of
|
||||||
|
subnodes, one for each of the ports exposed by the XUSB pad controller.
|
||||||
|
Each port may need additional resources that can be referenced in its
|
||||||
|
port node.
|
||||||
|
|
||||||
|
The "status" property is used to enable or disable the use of a port.
|
||||||
|
If set to "disabled", the port will not be used on the given board. In
|
||||||
|
order to use the port, this property must be set to "okay".
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb2-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
usb-role-switch: [ connector ]
|
||||||
|
|
||||||
|
usb2-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
usb-role-switch: [ connector ]
|
||||||
|
|
||||||
|
usb2-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
usb-role-switch: [ connector ]
|
||||||
|
|
||||||
|
hsic-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
usb3-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
nvidia,usb2-companion:
|
||||||
|
description: A single cell that specifies the physical port
|
||||||
|
number to map this super-speed USB port to. The range of
|
||||||
|
valid port numbers varies with the SoC generation.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
usb3-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
nvidia,usb2-companion:
|
||||||
|
description: A single cell that specifies the physical port
|
||||||
|
number to map this super-speed USB port to. The range of
|
||||||
|
valid port numbers varies with the SoC generation.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
usb3-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
nvidia,usb2-companion:
|
||||||
|
description: A single cell that specifies the physical port
|
||||||
|
number to map this super-speed USB port to. The range of
|
||||||
|
valid port numbers varies with the SoC generation.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- resets
|
||||||
|
- reset-names
|
||||||
|
- avdd-pll-erefeut-supply
|
||||||
|
- avdd-usb-supply
|
||||||
|
- vclamp-usb-supply
|
||||||
|
- vddio-hsic-supply
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/tegra186-clock.h>
|
||||||
|
#include <dt-bindings/gpio/tegra186-gpio.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
#include <dt-bindings/reset/tegra186-reset.h>
|
||||||
|
|
||||||
|
padctl@3520000 {
|
||||||
|
compatible = "nvidia,tegra186-xusb-padctl";
|
||||||
|
reg = <0x03520000 0x1000>,
|
||||||
|
<0x03540000 0x1000>;
|
||||||
|
reg-names = "padctl", "ao";
|
||||||
|
interrupts = <GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
|
||||||
|
resets = <&bpmp TEGRA186_RESET_XUSB_PADCTL>;
|
||||||
|
reset-names = "padctl";
|
||||||
|
|
||||||
|
avdd-pll-erefeut-supply = <&vdd_1v8_pll>;
|
||||||
|
avdd-usb-supply = <&vdd_3v3_sys>;
|
||||||
|
vclamp-usb-supply = <&vdd_1v8>;
|
||||||
|
vddio-hsic-supply = <&gnd>;
|
||||||
|
|
||||||
|
pads {
|
||||||
|
usb2 {
|
||||||
|
clocks = <&bpmp TEGRA186_CLK_USB2_TRK>;
|
||||||
|
clock-names = "trk";
|
||||||
|
|
||||||
|
lanes {
|
||||||
|
usb2-0 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-1 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-2 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
hsic {
|
||||||
|
clocks = <&bpmp TEGRA186_CLK_HSIC_TRK>;
|
||||||
|
clock-names = "trk";
|
||||||
|
status = "disabled";
|
||||||
|
|
||||||
|
lanes {
|
||||||
|
hsic-0 {
|
||||||
|
status = "disabled";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3 {
|
||||||
|
lanes {
|
||||||
|
usb3-0 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-1 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-2 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ports {
|
||||||
|
usb2-0 {
|
||||||
|
mode = "otg";
|
||||||
|
vbus-supply = <&vdd_usb0>;
|
||||||
|
usb-role-switch;
|
||||||
|
|
||||||
|
connector {
|
||||||
|
compatible = "gpio-usb-b-connector",
|
||||||
|
"usb-b-connector";
|
||||||
|
label = "micro-USB";
|
||||||
|
type = "micro";
|
||||||
|
vbus-gpios = <&gpio TEGRA186_MAIN_GPIO(X, 7) GPIO_ACTIVE_LOW>;
|
||||||
|
id-gpios = <&pmic 0 GPIO_ACTIVE_HIGH>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-1 {
|
||||||
|
vbus-supply = <&vdd_usb1>;
|
||||||
|
mode = "host";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-2 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
hsic-0 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-0 {
|
||||||
|
nvidia,usb2-companion = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-1 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-2 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,632 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/phy/nvidia,tegra194-xusb-padctl.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: NVIDIA Tegra194 XUSB pad controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Thierry Reding <thierry.reding@gmail.com>
|
||||||
|
- Jon Hunter <jonathanh@nvidia.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The Tegra XUSB pad controller manages a set of I/O lanes (with differential
|
||||||
|
signals) which connect directly to pins/pads on the SoC package. Each lane
|
||||||
|
is controlled by a HW block referred to as a "pad" in the Tegra hardware
|
||||||
|
documentation. Each such "pad" may control either one or multiple lanes,
|
||||||
|
and thus contains any logic common to all its lanes. Each lane can be
|
||||||
|
separately configured and powered up.
|
||||||
|
|
||||||
|
Some of the lanes are high-speed lanes, which can be used for PCIe, SATA or
|
||||||
|
super-speed USB. Other lanes are for various types of low-speed, full-speed
|
||||||
|
or high-speed USB (such as UTMI, ULPI and HSIC). The XUSB pad controller
|
||||||
|
contains a software-configurable mux that sits between the I/O controller
|
||||||
|
ports (e.g. PCIe) and the lanes.
|
||||||
|
|
||||||
|
In addition to per-lane configuration, USB 3.0 ports may require additional
|
||||||
|
settings on a per-board basis.
|
||||||
|
|
||||||
|
Pads will be represented as children of the top-level XUSB pad controller
|
||||||
|
device tree node. Each lane exposed by the pad will be represented by its
|
||||||
|
own subnode and can be referenced by users of the lane using the standard
|
||||||
|
PHY bindings, as described by the phy-bindings.txt file in this directory.
|
||||||
|
|
||||||
|
The Tegra hardware documentation refers to the connection between the XUSB
|
||||||
|
pad controller and the XUSB controller as "ports". This is confusing since
|
||||||
|
"port" is typically used to denote the physical USB receptacle. The device
|
||||||
|
tree binding in this document uses the term "port" to refer to the logical
|
||||||
|
abstraction of the signals that are routed to a USB receptacle (i.e. a PHY
|
||||||
|
for the USB signal, the VBUS power supply, the USB 2.0 companion port for
|
||||||
|
USB 3.0 receptacles, ...).
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- nvidia,tegra194-xusb-padctl
|
||||||
|
- nvidia,tegra234-xusb-padctl
|
||||||
|
|
||||||
|
reg:
|
||||||
|
items:
|
||||||
|
- description: pad controller registers
|
||||||
|
- description: AO registers
|
||||||
|
|
||||||
|
reg-names:
|
||||||
|
items:
|
||||||
|
- const: padctl
|
||||||
|
- const: ao
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
items:
|
||||||
|
- description: XUSB pad controller interrupt
|
||||||
|
|
||||||
|
resets:
|
||||||
|
items:
|
||||||
|
- description: pad controller reset
|
||||||
|
|
||||||
|
reset-names:
|
||||||
|
items:
|
||||||
|
- const: padctl
|
||||||
|
|
||||||
|
avdd-usb-supply:
|
||||||
|
description: USB I/Os, VBUS, ID, REXT, D+/D- power supply. Must
|
||||||
|
supply 3.3 V.
|
||||||
|
|
||||||
|
vclamp-usb-supply:
|
||||||
|
description: Bias rail for USB pad. Must supply 1.8 V.
|
||||||
|
|
||||||
|
pads:
|
||||||
|
description: A required child node named "pads" contains a list of
|
||||||
|
subnodes, one for each of the pads exposed by the XUSB pad controller.
|
||||||
|
Each pad may need additional resources that can be referenced in its
|
||||||
|
pad node.
|
||||||
|
|
||||||
|
The "status" property is used to enable or disable the use of a pad.
|
||||||
|
If set to "disabled", the pad will not be used on the given board. In
|
||||||
|
order to use the pad and any of its lanes, this property must be set
|
||||||
|
to "okay" or absent.
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: USB2 tracking clock
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: trk
|
||||||
|
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb2-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
usb2-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
usb2-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
usb2-3:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
usb3:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb3-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
usb3-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
usb3-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
usb3-3:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ xusb ]
|
||||||
|
|
||||||
|
ports:
|
||||||
|
description: A required child node named "ports" contains a list of
|
||||||
|
subnodes, one for each of the ports exposed by the XUSB pad controller.
|
||||||
|
Each port may need additional resources that can be referenced in its
|
||||||
|
port node.
|
||||||
|
|
||||||
|
The "status" property is used to enable or disable the use of a port.
|
||||||
|
If set to "disabled", the port will not be used on the given board. In
|
||||||
|
order to use the port, this property must be set to "okay".
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb2-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
usb-role-switch: [ connector ]
|
||||||
|
|
||||||
|
usb2-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
usb-role-switch: [ connector ]
|
||||||
|
|
||||||
|
usb2-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
usb-role-switch: [ connector ]
|
||||||
|
|
||||||
|
usb2-3:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
usb-role-switch: [ connector ]
|
||||||
|
|
||||||
|
usb3-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
maximum-speed:
|
||||||
|
description: A string property that specifies the maximum
|
||||||
|
supported speed of a USB3 port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
oneOf:
|
||||||
|
- description: The USB3 port supports USB 3.1 Gen 2 speed.
|
||||||
|
This is the default.
|
||||||
|
const: super-speed-plus
|
||||||
|
- description: The USB3 port supports USB 3.1 Gen 1 speed
|
||||||
|
only.
|
||||||
|
const: super-speed
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
nvidia,usb2-companion:
|
||||||
|
description: A single cell that specifies the physical port
|
||||||
|
number to map this super-speed USB port to. The range of
|
||||||
|
valid port numbers varies with the SoC generation.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
usb3-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
maximum-speed:
|
||||||
|
description: A string property that specifies the maximum
|
||||||
|
supported speed of a USB3 port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
oneOf:
|
||||||
|
- description: The USB3 port supports USB 3.1 Gen 2 speed.
|
||||||
|
This is the default.
|
||||||
|
const: super-speed-plus
|
||||||
|
- description: The USB3 port supports USB 3.1 Gen 1 speed
|
||||||
|
only.
|
||||||
|
const: super-speed
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
nvidia,usb2-companion:
|
||||||
|
description: A single cell that specifies the physical port
|
||||||
|
number to map this super-speed USB port to. The range of
|
||||||
|
valid port numbers varies with the SoC generation.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
usb3-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
maximum-speed:
|
||||||
|
description: A string property that specifies the maximum
|
||||||
|
supported speed of a USB3 port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
oneOf:
|
||||||
|
- description: The USB3 port supports USB 3.1 Gen 2 speed.
|
||||||
|
This is the default.
|
||||||
|
const: super-speed-plus
|
||||||
|
- description: The USB3 port supports USB 3.1 Gen 1 speed
|
||||||
|
only.
|
||||||
|
const: super-speed
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
nvidia,usb2-companion:
|
||||||
|
description: A single cell that specifies the physical port
|
||||||
|
number to map this super-speed USB port to. The range of
|
||||||
|
valid port numbers varies with the SoC generation.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
usb3-3:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
maximum-speed:
|
||||||
|
description: A string property that specifies the maximum
|
||||||
|
supported speed of a USB3 port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
oneOf:
|
||||||
|
- description: The USB3 port supports USB 3.1 Gen 2 speed.
|
||||||
|
This is the default.
|
||||||
|
const: super-speed-plus
|
||||||
|
- description: The USB3 port supports USB 3.1 Gen 1 speed
|
||||||
|
only.
|
||||||
|
const: super-speed
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
nvidia,usb2-companion:
|
||||||
|
description: A single cell that specifies the physical port
|
||||||
|
number to map this super-speed USB port to. The range of
|
||||||
|
valid port numbers varies with the SoC generation.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- resets
|
||||||
|
- reset-names
|
||||||
|
- avdd-usb-supply
|
||||||
|
- vclamp-usb-supply
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/tegra194-clock.h>
|
||||||
|
#include <dt-bindings/gpio/tegra194-gpio.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
#include <dt-bindings/reset/tegra194-reset.h>
|
||||||
|
|
||||||
|
padctl@3520000 {
|
||||||
|
compatible = "nvidia,tegra194-xusb-padctl";
|
||||||
|
reg = <0x03520000 0x1000>,
|
||||||
|
<0x03540000 0x1000>;
|
||||||
|
reg-names = "padctl", "ao";
|
||||||
|
interrupts = <GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
|
||||||
|
resets = <&bpmp TEGRA194_RESET_XUSB_PADCTL>;
|
||||||
|
reset-names = "padctl";
|
||||||
|
|
||||||
|
avdd-usb-supply = <&vdd_usb_3v3>;
|
||||||
|
vclamp-usb-supply = <&vdd_1v8ao>;
|
||||||
|
|
||||||
|
pads {
|
||||||
|
usb2 {
|
||||||
|
clocks = <&bpmp TEGRA194_CLK_USB2_TRK>;
|
||||||
|
clock-names = "trk";
|
||||||
|
|
||||||
|
lanes {
|
||||||
|
usb2-0 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
status = "disabled";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-1 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-2 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
status = "disabled";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-3 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3 {
|
||||||
|
lanes {
|
||||||
|
usb3-0 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-1 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
status = "disabled";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-2 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
status = "disabled";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-3 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ports {
|
||||||
|
usb2-0 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-1 {
|
||||||
|
vbus-supply = <&vdd_5v0_sys>;
|
||||||
|
mode = "host";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-2 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-3 {
|
||||||
|
vbus-supply = <&vdd_5v_sata>;
|
||||||
|
mode = "host";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-0 {
|
||||||
|
vbus-supply = <&vdd_5v0_sys>;
|
||||||
|
nvidia,usb2-companion = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-1 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-2 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-3 {
|
||||||
|
maximum-speed = "super-speed";
|
||||||
|
vbus-supply = <&vdd_5v0_sys>;
|
||||||
|
nvidia,usb2-companion = <3>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,786 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/phy/nvidia,tegra210-xusb-padctl.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: NVIDIA Tegra210 XUSB pad controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Thierry Reding <thierry.reding@gmail.com>
|
||||||
|
- Jon Hunter <jonathanh@nvidia.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The Tegra XUSB pad controller manages a set of I/O lanes (with differential
|
||||||
|
signals) which connect directly to pins/pads on the SoC package. Each lane
|
||||||
|
is controlled by a HW block referred to as a "pad" in the Tegra hardware
|
||||||
|
documentation. Each such "pad" may control either one or multiple lanes,
|
||||||
|
and thus contains any logic common to all its lanes. Each lane can be
|
||||||
|
separately configured and powered up.
|
||||||
|
|
||||||
|
Some of the lanes are high-speed lanes, which can be used for PCIe, SATA or
|
||||||
|
super-speed USB. Other lanes are for various types of low-speed, full-speed
|
||||||
|
or high-speed USB (such as UTMI, ULPI and HSIC). The XUSB pad controller
|
||||||
|
contains a software-configurable mux that sits between the I/O controller
|
||||||
|
ports (e.g. PCIe) and the lanes.
|
||||||
|
|
||||||
|
In addition to per-lane configuration, USB 3.0 ports may require additional
|
||||||
|
settings on a per-board basis.
|
||||||
|
|
||||||
|
Pads will be represented as children of the top-level XUSB pad controller
|
||||||
|
device tree node. Each lane exposed by the pad will be represented by its
|
||||||
|
own subnode and can be referenced by users of the lane using the standard
|
||||||
|
PHY bindings, as described by the phy-bindings.txt file in this directory.
|
||||||
|
|
||||||
|
The Tegra hardware documentation refers to the connection between the XUSB
|
||||||
|
pad controller and the XUSB controller as "ports". This is confusing since
|
||||||
|
"port" is typically used to denote the physical USB receptacle. The device
|
||||||
|
tree binding in this document uses the term "port" to refer to the logical
|
||||||
|
abstraction of the signals that are routed to a USB receptacle (i.e. a PHY
|
||||||
|
for the USB signal, the VBUS power supply, the USB 2.0 companion port for
|
||||||
|
USB 3.0 receptacles, ...).
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: nvidia,tegra210-xusb-padctl
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
resets:
|
||||||
|
items:
|
||||||
|
- description: pad controller reset
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
items:
|
||||||
|
- description: XUSB pad controller interrupt
|
||||||
|
|
||||||
|
reset-names:
|
||||||
|
items:
|
||||||
|
- const: padctl
|
||||||
|
|
||||||
|
avdd-pll-utmip-supply:
|
||||||
|
description: UTMI PLL power supply. Must supply 1.8 V.
|
||||||
|
|
||||||
|
avdd-pll-uerefe-supply:
|
||||||
|
description: PLLE reference PLL power supply. Must supply 1.05 V.
|
||||||
|
|
||||||
|
dvdd-pex-pll-supply:
|
||||||
|
description: PCIe/USB3 PLL power supply. Must supply 1.05 V.
|
||||||
|
|
||||||
|
hvdd-pex-pll-e-supply:
|
||||||
|
description: High-voltage PLLE power supply. Must supply 1.8 V.
|
||||||
|
|
||||||
|
nvidia,pmc:
|
||||||
|
description: phandle to the Tegra Power Management Controller (PMC) node
|
||||||
|
$ref: /schemas/types.yaml#/definitions/phandle
|
||||||
|
|
||||||
|
pads:
|
||||||
|
description: A required child node named "pads" contains a list of
|
||||||
|
subnodes, one for each of the pads exposed by the XUSB pad controller.
|
||||||
|
Each pad may need additional resources that can be referenced in its
|
||||||
|
pad node.
|
||||||
|
|
||||||
|
The "status" property is used to enable or disable the use of a pad.
|
||||||
|
If set to "disabled", the pad will not be used on the given board. In
|
||||||
|
order to use the pad and any of its lanes, this property must be set
|
||||||
|
to "okay" or be absent.
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: USB2 tracking clock
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: trk
|
||||||
|
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb2-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ snps, xusb, uart ]
|
||||||
|
|
||||||
|
usb2-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ snps, xusb, uart ]
|
||||||
|
|
||||||
|
usb2-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ snps, xusb, uart ]
|
||||||
|
|
||||||
|
usb2-3:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ snps, xusb, uart ]
|
||||||
|
|
||||||
|
hsic:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: HSIC tracking clock
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: trk
|
||||||
|
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
hsic-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ snps, xusb ]
|
||||||
|
|
||||||
|
hsic-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ snps, xusb ]
|
||||||
|
|
||||||
|
pcie:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: PCIe PLL clock source
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: pll
|
||||||
|
|
||||||
|
resets:
|
||||||
|
items:
|
||||||
|
- description: PCIe PHY reset
|
||||||
|
|
||||||
|
reset-names:
|
||||||
|
items:
|
||||||
|
- const: phy
|
||||||
|
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
pcie-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ pcie-x1, usb3-ss, pcie-x4 ]
|
||||||
|
|
||||||
|
pcie-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ pcie-x1, usb3-ss, pcie-x4 ]
|
||||||
|
|
||||||
|
pcie-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ pcie-x1, usb3-ss, pcie-x4 ]
|
||||||
|
|
||||||
|
pcie-3:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ pcie-x1, usb3-ss, pcie-x4 ]
|
||||||
|
|
||||||
|
pcie-4:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ pcie-x1, usb3-ss, pcie-x4 ]
|
||||||
|
|
||||||
|
pcie-5:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ pcie-x1, usb3-ss, pcie-x4 ]
|
||||||
|
|
||||||
|
pcie-6:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ pcie-x1, usb3-ss, pcie-x4 ]
|
||||||
|
|
||||||
|
sata:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: SATA PLL clock source
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: pll
|
||||||
|
|
||||||
|
resets:
|
||||||
|
items:
|
||||||
|
- description: SATA PHY reset
|
||||||
|
|
||||||
|
reset-names:
|
||||||
|
items:
|
||||||
|
- const: phy
|
||||||
|
|
||||||
|
lanes:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
sata-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
nvidia,function:
|
||||||
|
description: Function selection for this lane.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ usb3-ss, sata ]
|
||||||
|
|
||||||
|
ports:
|
||||||
|
description: A required child node named "ports" contains a list of
|
||||||
|
subnodes, one for each of the ports exposed by the XUSB pad controller.
|
||||||
|
Each port may need additional resources that can be referenced in its
|
||||||
|
port node.
|
||||||
|
|
||||||
|
The "status" property is used to enable or disable the use of a port.
|
||||||
|
If set to "disabled", the port will not be used on the given board. In
|
||||||
|
order to use the port, this property must be set to "okay".
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
usb2-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
usb-role-switch: [ connector ]
|
||||||
|
|
||||||
|
usb2-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
usb-role-switch: [ connector ]
|
||||||
|
|
||||||
|
usb2-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
usb-role-switch: [ connector ]
|
||||||
|
|
||||||
|
usb2-3:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
# no need to further describe this because the connector will
|
||||||
|
# match on gpio-usb-b-connector or usb-b-connector and cause
|
||||||
|
# that binding to be selected for the subnode
|
||||||
|
connector:
|
||||||
|
type: object
|
||||||
|
|
||||||
|
mode:
|
||||||
|
description: A string that determines the mode in which to
|
||||||
|
run the port.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/string
|
||||||
|
enum: [ host, peripheral, otg ]
|
||||||
|
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
usb-role-switch:
|
||||||
|
description: |
|
||||||
|
A boolean property whole presence indicates that the port
|
||||||
|
supports OTG or peripheral mode. If present, the port
|
||||||
|
supports switching between USB host and peripheral roles.
|
||||||
|
A connector must be added as a subnode in that case.
|
||||||
|
|
||||||
|
See ../connector/usb-connector.yaml.
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
usb-role-switch: [ connector ]
|
||||||
|
|
||||||
|
hsic-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
hsic-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
usb3-0:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
nvidia,usb2-companion:
|
||||||
|
description: A single cell that specifies the physical port
|
||||||
|
number to map this super-speed USB port to. The range of
|
||||||
|
valid port numbers varies with the SoC generation.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
usb3-1:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
nvidia,usb2-companion:
|
||||||
|
description: A single cell that specifies the physical port
|
||||||
|
number to map this super-speed USB port to. The range of
|
||||||
|
valid port numbers varies with the SoC generation.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
usb3-2:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
nvidia,usb2-companion:
|
||||||
|
description: A single cell that specifies the physical port
|
||||||
|
number to map this super-speed USB port to. The range of
|
||||||
|
valid port numbers varies with the SoC generation.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
usb3-3:
|
||||||
|
type: object
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
nvidia,internal:
|
||||||
|
description: A boolean property whose presence determines
|
||||||
|
that a port is internal. In the absence of this property
|
||||||
|
the port is considered to be external.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/flag
|
||||||
|
|
||||||
|
nvidia,usb2-companion:
|
||||||
|
description: A single cell that specifies the physical port
|
||||||
|
number to map this super-speed USB port to. The range of
|
||||||
|
valid port numbers varies with the SoC generation.
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [ 0, 1, 2, 3 ]
|
||||||
|
|
||||||
|
vbus-supply:
|
||||||
|
description: A phandle to the regulator supplying the VBUS
|
||||||
|
voltage.
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
required:
|
||||||
|
- avdd-pll-utmip-supply
|
||||||
|
- avdd-pll-uerefe-supply
|
||||||
|
- dvdd-pex-pll-supply
|
||||||
|
- hvdd-pex-pll-e-supply
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/tegra210-car.h>
|
||||||
|
#include <dt-bindings/gpio/tegra-gpio.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
|
||||||
|
padctl@7009f000 {
|
||||||
|
compatible = "nvidia,tegra210-xusb-padctl";
|
||||||
|
reg = <0x7009f000 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
resets = <&tegra_car 142>;
|
||||||
|
reset-names = "padctl";
|
||||||
|
|
||||||
|
avdd-pll-utmip-supply = <&vdd_1v8>;
|
||||||
|
avdd-pll-uerefe-supply = <&vdd_pex_1v05>;
|
||||||
|
dvdd-pex-pll-supply = <&vdd_pex_1v05>;
|
||||||
|
hvdd-pex-pll-e-supply = <&vdd_1v8>;
|
||||||
|
|
||||||
|
pads {
|
||||||
|
usb2 {
|
||||||
|
clocks = <&tegra_car TEGRA210_CLK_USB2_TRK>;
|
||||||
|
clock-names = "trk";
|
||||||
|
|
||||||
|
lanes {
|
||||||
|
usb2-0 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-1 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-2 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-3 {
|
||||||
|
nvidia,function = "xusb";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
hsic {
|
||||||
|
clocks = <&tegra_car TEGRA210_CLK_HSIC_TRK>;
|
||||||
|
clock-names = "trk";
|
||||||
|
status = "disabled";
|
||||||
|
|
||||||
|
lanes {
|
||||||
|
hsic-0 {
|
||||||
|
status = "disabled";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
hsic-1 {
|
||||||
|
status = "disabled";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie {
|
||||||
|
clocks = <&tegra_car TEGRA210_CLK_PLL_E>;
|
||||||
|
clock-names = "pll";
|
||||||
|
resets = <&tegra_car 205>;
|
||||||
|
reset-names = "phy";
|
||||||
|
|
||||||
|
lanes {
|
||||||
|
pcie-0 {
|
||||||
|
nvidia,function = "pcie-x1";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie-1 {
|
||||||
|
nvidia,function = "pcie-x4";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie-2 {
|
||||||
|
nvidia,function = "pcie-x4";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie-3 {
|
||||||
|
nvidia,function = "pcie-x4";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie-4 {
|
||||||
|
nvidia,function = "pcie-x4";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie-5 {
|
||||||
|
nvidia,function = "usb3-ss";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pcie-6 {
|
||||||
|
nvidia,function = "usb3-ss";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
sata {
|
||||||
|
clocks = <&tegra_car TEGRA210_CLK_PLL_E>;
|
||||||
|
clock-names = "pll";
|
||||||
|
resets = <&tegra_car 204>;
|
||||||
|
reset-names = "phy";
|
||||||
|
|
||||||
|
lanes {
|
||||||
|
sata-0 {
|
||||||
|
nvidia,function = "sata";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ports {
|
||||||
|
usb2-0 {
|
||||||
|
mode = "peripheral";
|
||||||
|
usb-role-switch;
|
||||||
|
|
||||||
|
connector {
|
||||||
|
compatible = "gpio-usb-b-connector",
|
||||||
|
"usb-b-connector";
|
||||||
|
label = "micro-USB";
|
||||||
|
type = "micro";
|
||||||
|
vbus-gpios = <&gpio TEGRA_GPIO(CC, 4) GPIO_ACTIVE_LOW>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-1 {
|
||||||
|
vbus-supply = <&vdd_5v0_rtl>;
|
||||||
|
mode = "host";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-2 {
|
||||||
|
vbus-supply = <&vdd_usb_vbus>;
|
||||||
|
mode = "host";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb2-3 {
|
||||||
|
mode = "host";
|
||||||
|
};
|
||||||
|
|
||||||
|
hsic-0 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
hsic-1 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-0 {
|
||||||
|
nvidia,usb2-companion = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-1 {
|
||||||
|
nvidia,usb2-companion = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-2 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
usb3-3 {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -75,6 +75,9 @@ patternProperties:
|
||||||
minItems: 3
|
minItems: 3
|
||||||
maxItems: 6
|
maxItems: 6
|
||||||
|
|
||||||
|
"#clock-cells":
|
||||||
|
const: 1
|
||||||
|
|
||||||
"#phy-cells":
|
"#phy-cells":
|
||||||
const: 0
|
const: 0
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ properties:
|
||||||
- qcom,sdm845-qmp-usb3-uni-phy
|
- qcom,sdm845-qmp-usb3-uni-phy
|
||||||
- qcom,sdx55-qmp-usb3-uni-phy
|
- qcom,sdx55-qmp-usb3-uni-phy
|
||||||
- qcom,sdx65-qmp-usb3-uni-phy
|
- qcom,sdx65-qmp-usb3-uni-phy
|
||||||
|
- qcom,sm6115-qmp-usb3-phy
|
||||||
- qcom,sm8150-qmp-usb3-phy
|
- qcom,sm8150-qmp-usb3-phy
|
||||||
- qcom,sm8150-qmp-usb3-uni-phy
|
- qcom,sm8150-qmp-usb3-uni-phy
|
||||||
- qcom,sm8250-qmp-usb3-phy
|
- qcom,sm8250-qmp-usb3-phy
|
||||||
|
@ -253,6 +254,7 @@ allOf:
|
||||||
contains:
|
contains:
|
||||||
enum:
|
enum:
|
||||||
- qcom,qcm2290-qmp-usb3-phy
|
- qcom,qcm2290-qmp-usb3-phy
|
||||||
|
- qcom,sm6115-qmp-usb3-phy
|
||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
clocks:
|
clocks:
|
||||||
|
@ -321,6 +323,7 @@ allOf:
|
||||||
- qcom,sc8180x-qmp-usb3-phy
|
- qcom,sc8180x-qmp-usb3-phy
|
||||||
- qcom,sdx55-qmp-usb3-uni-phy
|
- qcom,sdx55-qmp-usb3-uni-phy
|
||||||
- qcom,sdx65-qmp-usb3-uni-phy
|
- qcom,sdx65-qmp-usb3-uni-phy
|
||||||
|
- qcom,sm6115-qmp-usb3-phy
|
||||||
- qcom,sm8150-qmp-usb3-uni-phy
|
- qcom,sm8150-qmp-usb3-uni-phy
|
||||||
- qcom,sm8250-qmp-usb3-phy
|
- qcom,sm8250-qmp-usb3-phy
|
||||||
then:
|
then:
|
||||||
|
|
86
Documentation/devicetree/bindings/phy/qcom,pcie2-phy.yaml
Normal file
86
Documentation/devicetree/bindings/phy/qcom,pcie2-phy.yaml
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/phy/qcom,pcie2-phy.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Qualcomm PCIe2 PHY controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Vinod Koul <vkoul@kernel.org>
|
||||||
|
|
||||||
|
description:
|
||||||
|
The Qualcomm PCIe2 PHY is a Synopsys based phy found in a number of Qualcomm
|
||||||
|
platforms.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
items:
|
||||||
|
- const: qcom,qcs404-pcie2-phy
|
||||||
|
- const: qcom,pcie2-phy
|
||||||
|
|
||||||
|
reg:
|
||||||
|
items:
|
||||||
|
- description: PHY register set
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: a clock-specifier pair for the "pipe" clock
|
||||||
|
|
||||||
|
clock-output-names:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
"#clock-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
vdda-vp-supply:
|
||||||
|
description: low voltage regulator
|
||||||
|
|
||||||
|
vdda-vph-supply:
|
||||||
|
description: high voltage regulator
|
||||||
|
|
||||||
|
resets:
|
||||||
|
maxItems: 2
|
||||||
|
|
||||||
|
reset-names:
|
||||||
|
items:
|
||||||
|
- const: phy
|
||||||
|
- const: pipe
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- clocks
|
||||||
|
- clock-output-names
|
||||||
|
- "#clock-cells"
|
||||||
|
- "#phy-cells"
|
||||||
|
- vdda-vp-supply
|
||||||
|
- vdda-vph-supply
|
||||||
|
- resets
|
||||||
|
- reset-names
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/qcom,gcc-qcs404.h>
|
||||||
|
phy@7786000 {
|
||||||
|
compatible = "qcom,qcs404-pcie2-phy", "qcom,pcie2-phy";
|
||||||
|
reg = <0x07786000 0xb8>;
|
||||||
|
|
||||||
|
clocks = <&gcc GCC_PCIE_0_PIPE_CLK>;
|
||||||
|
resets = <&gcc GCC_PCIEPHY_0_PHY_BCR>,
|
||||||
|
<&gcc GCC_PCIE_0_PIPE_ARES>;
|
||||||
|
reset-names = "phy", "pipe";
|
||||||
|
|
||||||
|
vdda-vp-supply = <&vreg_l3_1p05>;
|
||||||
|
vdda-vph-supply = <&vreg_l5_1p8>;
|
||||||
|
|
||||||
|
clock-output-names = "pcie_0_pipe_clk";
|
||||||
|
#clock-cells = <0>;
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
...
|
|
@ -82,81 +82,74 @@ properties:
|
||||||
Phandle to TCSR syscon register region.
|
Phandle to TCSR syscon register region.
|
||||||
$ref: /schemas/types.yaml#/definitions/phandle
|
$ref: /schemas/types.yaml#/definitions/phandle
|
||||||
|
|
||||||
if:
|
qcom,imp-res-offset-value:
|
||||||
properties:
|
description:
|
||||||
compatible:
|
It is a 6 bit value that specifies offset to be
|
||||||
contains:
|
added to PHY refgen RESCODE via IMP_CTRL1 register. It is a PHY
|
||||||
const: qcom,qusb2-v2-phy
|
tuning parameter that may vary for different boards of same SOC.
|
||||||
then:
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
properties:
|
minimum: 0
|
||||||
qcom,imp-res-offset-value:
|
maximum: 63
|
||||||
description:
|
default: 0
|
||||||
It is a 6 bit value that specifies offset to be
|
|
||||||
added to PHY refgen RESCODE via IMP_CTRL1 register. It is a PHY
|
|
||||||
tuning parameter that may vary for different boards of same SOC.
|
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
|
||||||
minimum: 0
|
|
||||||
maximum: 63
|
|
||||||
default: 0
|
|
||||||
|
|
||||||
qcom,bias-ctrl-value:
|
qcom,bias-ctrl-value:
|
||||||
description:
|
description:
|
||||||
It is a 6 bit value that specifies bias-ctrl-value. It is a PHY
|
It is a 6 bit value that specifies bias-ctrl-value. It is a PHY
|
||||||
tuning parameter that may vary for different boards of same SOC.
|
tuning parameter that may vary for different boards of same SOC.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
minimum: 0
|
minimum: 0
|
||||||
maximum: 63
|
maximum: 63
|
||||||
default: 32
|
default: 32
|
||||||
|
|
||||||
qcom,charge-ctrl-value:
|
qcom,charge-ctrl-value:
|
||||||
description:
|
description:
|
||||||
It is a 2 bit value that specifies charge-ctrl-value. It is a PHY
|
It is a 2 bit value that specifies charge-ctrl-value. It is a PHY
|
||||||
tuning parameter that may vary for different boards of same SOC.
|
tuning parameter that may vary for different boards of same SOC.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
minimum: 0
|
minimum: 0
|
||||||
maximum: 3
|
maximum: 3
|
||||||
default: 0
|
default: 0
|
||||||
|
|
||||||
qcom,hstx-trim-value:
|
qcom,hstx-trim-value:
|
||||||
description:
|
description:
|
||||||
It is a 4 bit value that specifies tuning for HSTX
|
It is a 4 bit value that specifies tuning for HSTX
|
||||||
output current.
|
output current.
|
||||||
Possible range is - 15mA to 24mA (stepsize of 600 uA).
|
Possible range is - 15mA to 24mA (stepsize of 600 uA).
|
||||||
See dt-bindings/phy/phy-qcom-qusb2.h for applicable values.
|
See dt-bindings/phy/phy-qcom-qusb2.h for applicable values.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
minimum: 0
|
minimum: 0
|
||||||
maximum: 15
|
maximum: 15
|
||||||
default: 3
|
default: 3
|
||||||
|
|
||||||
qcom,preemphasis-level:
|
qcom,preemphasis-level:
|
||||||
description:
|
description:
|
||||||
It is a 2 bit value that specifies pre-emphasis level.
|
It is a 2 bit value that specifies pre-emphasis level.
|
||||||
Possible range is 0 to 15% (stepsize of 5%).
|
Possible range is 0 to 15% (stepsize of 5%).
|
||||||
See dt-bindings/phy/phy-qcom-qusb2.h for applicable values.
|
See dt-bindings/phy/phy-qcom-qusb2.h for applicable values.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
minimum: 0
|
minimum: 0
|
||||||
maximum: 3
|
maximum: 3
|
||||||
default: 2
|
default: 2
|
||||||
|
|
||||||
qcom,preemphasis-width:
|
qcom,preemphasis-width:
|
||||||
description:
|
description:
|
||||||
It is a 1 bit value that specifies how long the HSTX
|
It is a 1 bit value that specifies how long the HSTX
|
||||||
pre-emphasis (specified using qcom,preemphasis-level) must be in
|
pre-emphasis (specified using qcom,preemphasis-level) must be in
|
||||||
effect. Duration could be half-bit of full-bit.
|
effect. Duration could be half-bit of full-bit.
|
||||||
See dt-bindings/phy/phy-qcom-qusb2.h for applicable values.
|
See dt-bindings/phy/phy-qcom-qusb2.h for applicable values.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
minimum: 0
|
minimum: 0
|
||||||
maximum: 1
|
maximum: 1
|
||||||
default: 0
|
default: 0
|
||||||
|
|
||||||
qcom,hsdisc-trim-value:
|
qcom,hsdisc-trim-value:
|
||||||
description:
|
description:
|
||||||
It is a 2 bit value tuning parameter that control disconnect
|
It is a 2 bit value tuning parameter that control disconnect
|
||||||
threshold and may vary for different boards of same SOC.
|
threshold and may vary for different boards of same SOC.
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
minimum: 0
|
minimum: 0
|
||||||
maximum: 3
|
maximum: 3
|
||||||
default: 0
|
default: 0
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
|
@ -169,6 +162,23 @@ required:
|
||||||
- vdda-phy-dpdm-supply
|
- vdda-phy-dpdm-supply
|
||||||
- resets
|
- resets
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- if:
|
||||||
|
not:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
const: qcom,qusb2-v2-phy
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
qcom,imp-res-offset-value: false
|
||||||
|
qcom,bias-ctrl-value: false
|
||||||
|
qcom,charge-ctrl-value: false
|
||||||
|
qcom,hstx-trim-value: false
|
||||||
|
qcom,preemphasis-level: false
|
||||||
|
qcom,preemphasis-width: false
|
||||||
|
qcom,hsdisc-trim-value: false
|
||||||
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
|
|
|
@ -19,12 +19,17 @@ maintainers:
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
enum:
|
oneOf:
|
||||||
- qcom,sc7180-qmp-usb3-dp-phy
|
- enum:
|
||||||
- qcom,sc7280-qmp-usb3-dp-phy
|
- qcom,sc7180-qmp-usb3-dp-phy
|
||||||
- qcom,sc8180x-qmp-usb3-dp-phy
|
- qcom,sc8180x-qmp-usb3-dp-phy
|
||||||
- qcom,sdm845-qmp-usb3-dp-phy
|
- qcom,sdm845-qmp-usb3-dp-phy
|
||||||
- qcom,sm8250-qmp-usb3-dp-phy
|
- qcom,sm8250-qmp-usb3-dp-phy
|
||||||
|
- items:
|
||||||
|
- enum:
|
||||||
|
- qcom,sc7280-qmp-usb3-dp-phy
|
||||||
|
- const: qcom,sm8250-qmp-usb3-dp-phy
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
items:
|
items:
|
||||||
- description: Address and length of PHY's USB serdes block.
|
- description: Address and length of PHY's USB serdes block.
|
||||||
|
@ -46,18 +51,12 @@ properties:
|
||||||
ranges: true
|
ranges: true
|
||||||
|
|
||||||
clocks:
|
clocks:
|
||||||
items:
|
minItems: 3
|
||||||
- description: Phy aux clock.
|
maxItems: 4
|
||||||
- description: Phy config clock.
|
|
||||||
- description: 19.2 MHz ref clk.
|
|
||||||
- description: Phy common block aux clock.
|
|
||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
items:
|
minItems: 3
|
||||||
- const: aux
|
maxItems: 4
|
||||||
- const: cfg_ahb
|
|
||||||
- const: ref
|
|
||||||
- const: com_aux
|
|
||||||
|
|
||||||
power-domains:
|
power-domains:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
@ -166,6 +165,64 @@ required:
|
||||||
- vdda-phy-supply
|
- vdda-phy-supply
|
||||||
- vdda-pll-supply
|
- vdda-pll-supply
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- qcom,sc7180-qmp-usb3-dp-phy
|
||||||
|
- qcom,sdm845-qmp-usb3-dp-phy
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: Phy aux clock
|
||||||
|
- description: Phy config clock
|
||||||
|
- description: 19.2 MHz ref clk
|
||||||
|
- description: Phy common block aux clock
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: aux
|
||||||
|
- const: cfg_ahb
|
||||||
|
- const: ref
|
||||||
|
- const: com_aux
|
||||||
|
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- qcom,sc8180x-qmp-usb3-dp-phy
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: Phy aux clock
|
||||||
|
- description: 19.2 MHz ref clk
|
||||||
|
- description: Phy common block aux clock
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: aux
|
||||||
|
- const: ref
|
||||||
|
- const: com_aux
|
||||||
|
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- qcom,sm8250-qmp-usb3-dp-phy
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: Phy aux clock
|
||||||
|
- description: Board XO source
|
||||||
|
- description: Phy common block aux clock
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: aux
|
||||||
|
- const: ref_clk_src
|
||||||
|
- const: com_aux
|
||||||
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
|
|
|
@ -19,15 +19,20 @@ properties:
|
||||||
- qcom,sc8280xp-qmp-gen3x1-pcie-phy
|
- qcom,sc8280xp-qmp-gen3x1-pcie-phy
|
||||||
- qcom,sc8280xp-qmp-gen3x2-pcie-phy
|
- qcom,sc8280xp-qmp-gen3x2-pcie-phy
|
||||||
- qcom,sc8280xp-qmp-gen3x4-pcie-phy
|
- qcom,sc8280xp-qmp-gen3x4-pcie-phy
|
||||||
|
- qcom,sm8350-qmp-gen3x1-pcie-phy
|
||||||
|
- qcom,sm8550-qmp-gen3x2-pcie-phy
|
||||||
|
- qcom,sm8550-qmp-gen4x2-pcie-phy
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 2
|
maxItems: 2
|
||||||
|
|
||||||
clocks:
|
clocks:
|
||||||
|
minItems: 5
|
||||||
maxItems: 6
|
maxItems: 6
|
||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
|
minItems: 5
|
||||||
items:
|
items:
|
||||||
- const: aux
|
- const: aux
|
||||||
- const: cfg_ahb
|
- const: cfg_ahb
|
||||||
|
@ -40,16 +45,21 @@ properties:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
resets:
|
resets:
|
||||||
maxItems: 1
|
minItems: 1
|
||||||
|
maxItems: 2
|
||||||
|
|
||||||
reset-names:
|
reset-names:
|
||||||
|
minItems: 1
|
||||||
items:
|
items:
|
||||||
- const: phy
|
- const: phy
|
||||||
|
- const: phy_nocsr
|
||||||
|
|
||||||
vdda-phy-supply: true
|
vdda-phy-supply: true
|
||||||
|
|
||||||
vdda-pll-supply: true
|
vdda-pll-supply: true
|
||||||
|
|
||||||
|
vdda-qref-supply: true
|
||||||
|
|
||||||
qcom,4ln-config-sel:
|
qcom,4ln-config-sel:
|
||||||
description: PCIe 4-lane configuration
|
description: PCIe 4-lane configuration
|
||||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||||
|
@ -104,6 +114,46 @@ allOf:
|
||||||
reg:
|
reg:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
- qcom,sm8350-qmp-gen3x1-pcie-phy
|
||||||
|
- qcom,sm8550-qmp-gen3x2-pcie-phy
|
||||||
|
- qcom,sm8550-qmp-gen4x2-pcie-phy
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
maxItems: 5
|
||||||
|
clock-names:
|
||||||
|
maxItems: 5
|
||||||
|
else:
|
||||||
|
properties:
|
||||||
|
clocks:
|
||||||
|
minItems: 6
|
||||||
|
clock-names:
|
||||||
|
minItems: 6
|
||||||
|
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
- qcom,sm8550-qmp-gen4x2-pcie-phy
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
resets:
|
||||||
|
minItems: 2
|
||||||
|
reset-names:
|
||||||
|
minItems: 2
|
||||||
|
else:
|
||||||
|
properties:
|
||||||
|
resets:
|
||||||
|
maxItems: 1
|
||||||
|
reset-names:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
examples:
|
examples:
|
||||||
- |
|
- |
|
||||||
#include <dt-bindings/clock/qcom,gcc-sc8280xp.h>
|
#include <dt-bindings/clock/qcom,gcc-sc8280xp.h>
|
||||||
|
|
|
@ -17,6 +17,8 @@ properties:
|
||||||
compatible:
|
compatible:
|
||||||
enum:
|
enum:
|
||||||
- qcom,sc8280xp-qmp-ufs-phy
|
- qcom,sc8280xp-qmp-ufs-phy
|
||||||
|
- qcom,sm6125-qmp-ufs-phy
|
||||||
|
- qcom,sm8550-qmp-ufs-phy
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
@ -43,6 +45,9 @@ properties:
|
||||||
|
|
||||||
vdda-pll-supply: true
|
vdda-pll-supply: true
|
||||||
|
|
||||||
|
"#clock-cells":
|
||||||
|
const: 1
|
||||||
|
|
||||||
"#phy-cells":
|
"#phy-cells":
|
||||||
const: 0
|
const: 0
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,10 @@ properties:
|
||||||
compatible:
|
compatible:
|
||||||
enum:
|
enum:
|
||||||
- qcom,sc8280xp-qmp-usb43dp-phy
|
- qcom,sc8280xp-qmp-usb43dp-phy
|
||||||
|
- qcom,sm6350-qmp-usb3-dp-phy
|
||||||
|
- qcom,sm8350-qmp-usb3-dp-phy
|
||||||
|
- qcom,sm8450-qmp-usb3-dp-phy
|
||||||
|
- qcom,sm8550-qmp-usb3-dp-phy
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/phy/qcom,snps-eusb2-phy.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Qualcomm SNPS eUSB2 phy controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Abel Vesa <abel.vesa@linaro.org>
|
||||||
|
|
||||||
|
description:
|
||||||
|
eUSB2 controller supports LS/FS/HS usb connectivity on Qualcomm chipsets.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: qcom,sm8550-snps-eusb2-phy
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: ref
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: ref
|
||||||
|
|
||||||
|
resets:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
phys:
|
||||||
|
maxItems: 1
|
||||||
|
description:
|
||||||
|
Phandle to eUSB2 to USB 2.0 repeater
|
||||||
|
|
||||||
|
vdd-supply:
|
||||||
|
description:
|
||||||
|
Phandle to 0.88V regulator supply to PHY digital circuit.
|
||||||
|
|
||||||
|
vdda12-supply:
|
||||||
|
description:
|
||||||
|
Phandle to 1.2V regulator supply to PHY refclk pll block.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- "#phy-cells"
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
- vdd-supply
|
||||||
|
- vdda12-supply
|
||||||
|
- resets
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/qcom,sm8550-gcc.h>
|
||||||
|
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||||
|
#include <dt-bindings/clock/qcom,sm8550-tcsr.h>
|
||||||
|
|
||||||
|
usb_1_hsphy: phy@88e3000 {
|
||||||
|
compatible = "qcom,sm8550-snps-eusb2-phy";
|
||||||
|
reg = <0x88e3000 0x154>;
|
||||||
|
#phy-cells = <0>;
|
||||||
|
|
||||||
|
clocks = <&tcsrcc TCSR_USB2_CLKREF_EN>;
|
||||||
|
clock-names = "ref";
|
||||||
|
|
||||||
|
vdd-supply = <&vreg_l1e_0p88>;
|
||||||
|
vdda12-supply = <&vreg_l3e_1p2>;
|
||||||
|
|
||||||
|
resets = <&gcc GCC_QUSB2PHY_PRIM_BCR>;
|
||||||
|
};
|
|
@ -0,0 +1,52 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/phy/qcom,snps-eusb2-repeater.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Qualcomm Synopsis eUSB2 to USB 2.0 repeater
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Abel Vesa <abel.vesa@linaro.org>
|
||||||
|
|
||||||
|
description:
|
||||||
|
eUSB2 repeater converts between eUSB2 and USB 2.0 signaling levels and
|
||||||
|
allows a eUSB2 PHY to connect to legacy USB 2.0 products
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: qcom,pm8550b-eusb2-repeater
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
vdd18-supply: true
|
||||||
|
|
||||||
|
vdd3-supply: true
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- "#phy-cells"
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/spmi/spmi.h>
|
||||||
|
|
||||||
|
pmic@7 {
|
||||||
|
reg = <0x7 SPMI_USID>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
pm8550b_eusb2_repeater: phy@fd00 {
|
||||||
|
compatible = "qcom,pm8550b-eusb2-repeater";
|
||||||
|
reg = <0xfd00>;
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
...
|
|
@ -1,65 +0,0 @@
|
||||||
Qualcomm's USB HSIC PHY
|
|
||||||
|
|
||||||
PROPERTIES
|
|
||||||
|
|
||||||
- compatible:
|
|
||||||
Usage: required
|
|
||||||
Value type: <string>
|
|
||||||
Definition: Should contain "qcom,usb-hsic-phy" and more specifically one of the
|
|
||||||
following:
|
|
||||||
|
|
||||||
"qcom,usb-hsic-phy-mdm9615"
|
|
||||||
"qcom,usb-hsic-phy-msm8974"
|
|
||||||
|
|
||||||
- #phy-cells:
|
|
||||||
Usage: required
|
|
||||||
Value type: <u32>
|
|
||||||
Definition: Should contain 0
|
|
||||||
|
|
||||||
- clocks:
|
|
||||||
Usage: required
|
|
||||||
Value type: <prop-encoded-array>
|
|
||||||
Definition: Should contain clock specifier for phy, calibration and
|
|
||||||
a calibration sleep clock
|
|
||||||
|
|
||||||
- clock-names:
|
|
||||||
Usage: required
|
|
||||||
Value type: <stringlist>
|
|
||||||
Definition: Should contain "phy, "cal" and "cal_sleep"
|
|
||||||
|
|
||||||
- pinctrl-names:
|
|
||||||
Usage: required
|
|
||||||
Value type: <stringlist>
|
|
||||||
Definition: Should contain "init" and "default" in that order
|
|
||||||
|
|
||||||
- pinctrl-0:
|
|
||||||
Usage: required
|
|
||||||
Value type: <prop-encoded-array>
|
|
||||||
Definition: List of pinctrl settings to apply to keep HSIC pins in a glitch
|
|
||||||
free state
|
|
||||||
|
|
||||||
- pinctrl-1:
|
|
||||||
Usage: required
|
|
||||||
Value type: <prop-encoded-array>
|
|
||||||
Definition: List of pinctrl settings to apply to mux out the HSIC pins
|
|
||||||
|
|
||||||
EXAMPLE
|
|
||||||
|
|
||||||
usb-controller {
|
|
||||||
ulpi {
|
|
||||||
phy {
|
|
||||||
compatible = "qcom,usb-hsic-phy-msm8974",
|
|
||||||
"qcom,usb-hsic-phy";
|
|
||||||
#phy-cells = <0>;
|
|
||||||
pinctrl-names = "init", "default";
|
|
||||||
pinctrl-0 = <&hsic_sleep>;
|
|
||||||
pinctrl-1 = <&hsic_default>;
|
|
||||||
clocks = <&gcc GCC_USB_HSIC_CLK>,
|
|
||||||
<&gcc GCC_USB_HSIC_IO_CAL_CLK>,
|
|
||||||
<&gcc GCC_USB_HSIC_IO_CAL_SLEEP_CLK>;
|
|
||||||
clock-names = "phy", "cal", "cal_sleep";
|
|
||||||
assigned-clocks = <&gcc GCC_USB_HSIC_IO_CAL_CLK>;
|
|
||||||
assigned-clock-rates = <960000>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
67
Documentation/devicetree/bindings/phy/qcom,usb-hsic-phy.yaml
Normal file
67
Documentation/devicetree/bindings/phy/qcom,usb-hsic-phy.yaml
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/phy/qcom,usb-hsic-phy.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Qualcomm USB HSIC PHY Controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Bjorn Andersson <andersson@kernel.org>
|
||||||
|
- Vinod Koul <vkoul@kernel.org>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
items:
|
||||||
|
- enum:
|
||||||
|
- qcom,usb-hsic-phy-mdm9615
|
||||||
|
- qcom,usb-hsic-phy-msm8974
|
||||||
|
- const: qcom,usb-hsic-phy
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
maxItems: 3
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: phy
|
||||||
|
- const: cal
|
||||||
|
- const: cal_sleep
|
||||||
|
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
pinctrl-0: true
|
||||||
|
pinctrl-1: true
|
||||||
|
|
||||||
|
pinctrl-names:
|
||||||
|
items:
|
||||||
|
- const: init
|
||||||
|
- const: default
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
- "#phy-cells"
|
||||||
|
- pinctrl-0
|
||||||
|
- pinctrl-1
|
||||||
|
- pinctrl-names
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/qcom,gcc-msm8974.h>
|
||||||
|
|
||||||
|
phy {
|
||||||
|
compatible = "qcom,usb-hsic-phy-msm8974",
|
||||||
|
"qcom,usb-hsic-phy";
|
||||||
|
clocks = <&gcc GCC_USB_HSIC_CLK>,
|
||||||
|
<&gcc GCC_USB_HSIC_IO_CAL_CLK>,
|
||||||
|
<&gcc GCC_USB_HSIC_IO_CAL_SLEEP_CLK>;
|
||||||
|
clock-names = "phy", "cal", "cal_sleep";
|
||||||
|
#phy-cells = <0>;
|
||||||
|
pinctrl-names = "init", "default";
|
||||||
|
pinctrl-0 = <&hsic_sleep>;
|
||||||
|
pinctrl-1 = <&hsic_default>;
|
||||||
|
};
|
|
@ -14,18 +14,25 @@ description: |
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
enum:
|
oneOf:
|
||||||
- qcom,usb-snps-hs-5nm-phy
|
- enum:
|
||||||
- qcom,usb-snps-hs-7nm-phy
|
- qcom,sc8180x-usb-hs-phy
|
||||||
- qcom,sc7280-usb-hs-phy
|
- qcom,usb-snps-femto-v2-phy
|
||||||
- qcom,sc8180x-usb-hs-phy
|
- items:
|
||||||
- qcom,sc8280xp-usb-hs-phy
|
- enum:
|
||||||
- qcom,sm6375-usb-hs-phy
|
- qcom,sc8280xp-usb-hs-phy
|
||||||
- qcom,sm8150-usb-hs-phy
|
- const: qcom,usb-snps-hs-5nm-phy
|
||||||
- qcom,sm8250-usb-hs-phy
|
- items:
|
||||||
- qcom,sm8350-usb-hs-phy
|
- enum:
|
||||||
- qcom,sm8450-usb-hs-phy
|
- qcom,sc7280-usb-hs-phy
|
||||||
- qcom,usb-snps-femto-v2-phy
|
- qcom,sdx55-usb-hs-phy
|
||||||
|
- qcom,sdx65-usb-hs-phy
|
||||||
|
- qcom,sm6375-usb-hs-phy
|
||||||
|
- qcom,sm8150-usb-hs-phy
|
||||||
|
- qcom,sm8250-usb-hs-phy
|
||||||
|
- qcom,sm8350-usb-hs-phy
|
||||||
|
- qcom,sm8450-usb-hs-phy
|
||||||
|
- const: qcom,usb-snps-hs-7nm-phy
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
@ -160,7 +167,7 @@ examples:
|
||||||
#include <dt-bindings/clock/qcom,rpmh.h>
|
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||||
#include <dt-bindings/clock/qcom,gcc-sm8150.h>
|
#include <dt-bindings/clock/qcom,gcc-sm8150.h>
|
||||||
phy@88e2000 {
|
phy@88e2000 {
|
||||||
compatible = "qcom,sm8150-usb-hs-phy";
|
compatible = "qcom,sm8150-usb-hs-phy", "qcom,usb-snps-hs-7nm-phy";
|
||||||
reg = <0x088e2000 0x400>;
|
reg = <0x088e2000 0x400>;
|
||||||
#phy-cells = <0>;
|
#phy-cells = <0>;
|
||||||
|
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
Qualcomm PCIe2 PHY controller
|
|
||||||
=============================
|
|
||||||
|
|
||||||
The Qualcomm PCIe2 PHY is a Synopsys based phy found in a number of Qualcomm
|
|
||||||
platforms.
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
- compatible: compatible list, should be:
|
|
||||||
"qcom,qcs404-pcie2-phy", "qcom,pcie2-phy"
|
|
||||||
|
|
||||||
- reg: offset and length of the PHY register set.
|
|
||||||
- #phy-cells: must be 0.
|
|
||||||
|
|
||||||
- clocks: a clock-specifier pair for the "pipe" clock
|
|
||||||
|
|
||||||
- vdda-vp-supply: phandle to low voltage regulator
|
|
||||||
- vdda-vph-supply: phandle to high voltage regulator
|
|
||||||
|
|
||||||
- resets: reset-specifier pairs for the "phy" and "pipe" resets
|
|
||||||
- reset-names: list of resets, should contain:
|
|
||||||
"phy" and "pipe"
|
|
||||||
|
|
||||||
- clock-output-names: name of the outgoing clock signal from the PHY PLL
|
|
||||||
- #clock-cells: must be 0
|
|
||||||
|
|
||||||
Example:
|
|
||||||
phy@7786000 {
|
|
||||||
compatible = "qcom,qcs404-pcie2-phy", "qcom,pcie2-phy";
|
|
||||||
reg = <0x07786000 0xb8>;
|
|
||||||
|
|
||||||
clocks = <&gcc GCC_PCIE_0_PIPE_CLK>;
|
|
||||||
resets = <&gcc GCC_PCIEPHY_0_PHY_BCR>,
|
|
||||||
<&gcc GCC_PCIE_0_PIPE_ARES>;
|
|
||||||
reset-names = "phy", "pipe";
|
|
||||||
|
|
||||||
vdda-vp-supply = <&vreg_l3_1p05>;
|
|
||||||
vdda-vph-supply = <&vreg_l5_1p8>;
|
|
||||||
|
|
||||||
clock-output-names = "pcie_0_pipe_clk";
|
|
||||||
#clock-cells = <0>;
|
|
||||||
#phy-cells = <0>;
|
|
||||||
};
|
|
|
@ -15,6 +15,7 @@ properties:
|
||||||
|
|
||||||
compatible:
|
compatible:
|
||||||
enum:
|
enum:
|
||||||
|
- nxp,tjr1443
|
||||||
- ti,tcan1042
|
- ti,tcan1042
|
||||||
- ti,tcan1043
|
- ti,tcan1043
|
||||||
|
|
||||||
|
|
|
@ -103,27 +103,31 @@ it. This framework provides the following APIs to get a reference to the PHY.
|
||||||
::
|
::
|
||||||
|
|
||||||
struct phy *phy_get(struct device *dev, const char *string);
|
struct phy *phy_get(struct device *dev, const char *string);
|
||||||
struct phy *phy_optional_get(struct device *dev, const char *string);
|
|
||||||
struct phy *devm_phy_get(struct device *dev, const char *string);
|
struct phy *devm_phy_get(struct device *dev, const char *string);
|
||||||
struct phy *devm_phy_optional_get(struct device *dev,
|
struct phy *devm_phy_optional_get(struct device *dev,
|
||||||
const char *string);
|
const char *string);
|
||||||
|
struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
|
||||||
|
const char *con_id);
|
||||||
|
struct phy *devm_of_phy_optional_get(struct device *dev,
|
||||||
|
struct device_node *np,
|
||||||
|
const char *con_id);
|
||||||
struct phy *devm_of_phy_get_by_index(struct device *dev,
|
struct phy *devm_of_phy_get_by_index(struct device *dev,
|
||||||
struct device_node *np,
|
struct device_node *np,
|
||||||
int index);
|
int index);
|
||||||
|
|
||||||
phy_get, phy_optional_get, devm_phy_get and devm_phy_optional_get can
|
phy_get, devm_phy_get and devm_phy_optional_get can be used to get the PHY.
|
||||||
be used to get the PHY. In the case of dt boot, the string arguments
|
In the case of dt boot, the string arguments
|
||||||
should contain the phy name as given in the dt data and in the case of
|
should contain the phy name as given in the dt data and in the case of
|
||||||
non-dt boot, it should contain the label of the PHY. The two
|
non-dt boot, it should contain the label of the PHY. The two
|
||||||
devm_phy_get associates the device with the PHY using devres on
|
devm_phy_get associates the device with the PHY using devres on
|
||||||
successful PHY get. On driver detach, release function is invoked on
|
successful PHY get. On driver detach, release function is invoked on
|
||||||
the devres data and devres data is freed. phy_optional_get and
|
the devres data and devres data is freed.
|
||||||
devm_phy_optional_get should be used when the phy is optional. These
|
The _optional_get variants should be used when the phy is optional. These
|
||||||
two functions will never return -ENODEV, but instead returns NULL when
|
functions will never return -ENODEV, but instead return NULL when
|
||||||
the phy cannot be found.Some generic drivers, such as ehci, may use multiple
|
the phy cannot be found.
|
||||||
phys and for such drivers referencing phy(s) by name(s) does not make sense. In
|
Some generic drivers, such as ehci, may use multiple phys. In this case,
|
||||||
this case, devm_of_phy_get_by_index can be used to get a phy reference based on
|
devm_of_phy_get or devm_of_phy_get_by_index can be used to get a phy
|
||||||
the index.
|
reference based on name or index.
|
||||||
|
|
||||||
It should be noted that NULL is a valid phy reference. All phy
|
It should be noted that NULL is a valid phy reference. All phy
|
||||||
consumer calls on the NULL phy become NOPs. That is the release calls,
|
consumer calls on the NULL phy become NOPs. That is the release calls,
|
||||||
|
|
|
@ -1155,13 +1155,12 @@ int memac_initialization(struct mac_device *mac_dev,
|
||||||
else
|
else
|
||||||
memac->sgmii_pcs = pcs;
|
memac->sgmii_pcs = pcs;
|
||||||
|
|
||||||
memac->serdes = devm_of_phy_get(mac_dev->dev, mac_node, "serdes");
|
memac->serdes = devm_of_phy_optional_get(mac_dev->dev, mac_node,
|
||||||
err = PTR_ERR(memac->serdes);
|
"serdes");
|
||||||
if (err == -ENODEV || err == -ENOSYS) {
|
if (!memac->serdes) {
|
||||||
dev_dbg(mac_dev->dev, "could not get (optional) serdes\n");
|
dev_dbg(mac_dev->dev, "could not get (optional) serdes\n");
|
||||||
memac->serdes = NULL;
|
|
||||||
} else if (IS_ERR(memac->serdes)) {
|
} else if (IS_ERR(memac->serdes)) {
|
||||||
dev_err_probe(mac_dev->dev, err, "could not get serdes\n");
|
err = PTR_ERR(memac->serdes);
|
||||||
goto _return_fm_mac_free;
|
goto _return_fm_mac_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1154,9 +1154,8 @@ static int lan966x_probe(struct platform_device *pdev)
|
||||||
lan966x->ports[p]->config.portmode = phy_mode;
|
lan966x->ports[p]->config.portmode = phy_mode;
|
||||||
lan966x->ports[p]->fwnode = fwnode_handle_get(portnp);
|
lan966x->ports[p]->fwnode = fwnode_handle_get(portnp);
|
||||||
|
|
||||||
serdes = devm_of_phy_get(lan966x->dev, to_of_node(portnp), NULL);
|
serdes = devm_of_phy_optional_get(lan966x->dev,
|
||||||
if (PTR_ERR(serdes) == -ENODEV)
|
to_of_node(portnp), NULL);
|
||||||
serdes = NULL;
|
|
||||||
if (IS_ERR(serdes)) {
|
if (IS_ERR(serdes)) {
|
||||||
err = PTR_ERR(serdes);
|
err = PTR_ERR(serdes);
|
||||||
goto cleanup_ports;
|
goto cleanup_ports;
|
||||||
|
|
|
@ -1330,12 +1330,9 @@ static struct phy *devm_of_phy_optional_get_index(struct device *dev,
|
||||||
if (!name)
|
if (!name)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
phy = devm_of_phy_get(dev, np, name);
|
phy = devm_of_phy_optional_get(dev, np, name);
|
||||||
kfree(name);
|
kfree(name);
|
||||||
|
|
||||||
if (PTR_ERR(phy) == -ENODEV)
|
|
||||||
phy = NULL;
|
|
||||||
|
|
||||||
return phy;
|
return phy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -99,28 +99,17 @@
|
||||||
#define DEBOUNCE_TIME msecs_to_jiffies(50)
|
#define DEBOUNCE_TIME msecs_to_jiffies(50)
|
||||||
#define POLL_TIME msecs_to_jiffies(250)
|
#define POLL_TIME msecs_to_jiffies(250)
|
||||||
|
|
||||||
enum sun4i_usb_phy_type {
|
|
||||||
sun4i_a10_phy,
|
|
||||||
sun6i_a31_phy,
|
|
||||||
sun8i_a33_phy,
|
|
||||||
sun8i_a83t_phy,
|
|
||||||
sun8i_h3_phy,
|
|
||||||
sun8i_r40_phy,
|
|
||||||
sun8i_v3s_phy,
|
|
||||||
sun50i_a64_phy,
|
|
||||||
sun50i_h6_phy,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sun4i_usb_phy_cfg {
|
struct sun4i_usb_phy_cfg {
|
||||||
int num_phys;
|
int num_phys;
|
||||||
int hsic_index;
|
int hsic_index;
|
||||||
enum sun4i_usb_phy_type type;
|
|
||||||
u32 disc_thresh;
|
u32 disc_thresh;
|
||||||
u32 hci_phy_ctl_clear;
|
u32 hci_phy_ctl_clear;
|
||||||
u8 phyctl_offset;
|
u8 phyctl_offset;
|
||||||
bool dedicated_clocks;
|
bool dedicated_clocks;
|
||||||
bool phy0_dual_route;
|
bool phy0_dual_route;
|
||||||
bool needs_phy2_siddq;
|
bool needs_phy2_siddq;
|
||||||
|
bool siddq_in_base;
|
||||||
|
bool poll_vbusen;
|
||||||
int missing_phys;
|
int missing_phys;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -252,7 +241,8 @@ static void sun4i_usb_phy_passby(struct sun4i_usb_phy *phy, int enable)
|
||||||
SUNXI_AHB_INCRX_ALIGN_EN | SUNXI_ULPI_BYPASS_EN;
|
SUNXI_AHB_INCRX_ALIGN_EN | SUNXI_ULPI_BYPASS_EN;
|
||||||
|
|
||||||
/* A83T USB2 is HSIC */
|
/* A83T USB2 is HSIC */
|
||||||
if (phy_data->cfg->type == sun8i_a83t_phy && phy->index == 2)
|
if (phy_data->cfg->hsic_index &&
|
||||||
|
phy->index == phy_data->cfg->hsic_index)
|
||||||
bits |= SUNXI_EHCI_HS_FORCE | SUNXI_HSIC_CONNECT_INT |
|
bits |= SUNXI_EHCI_HS_FORCE | SUNXI_HSIC_CONNECT_INT |
|
||||||
SUNXI_HSIC;
|
SUNXI_HSIC;
|
||||||
|
|
||||||
|
@ -340,8 +330,7 @@ static int sun4i_usb_phy_init(struct phy *_phy)
|
||||||
writel(val, phy->pmu + REG_HCI_PHY_CTL);
|
writel(val, phy->pmu + REG_HCI_PHY_CTL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->cfg->type == sun8i_a83t_phy ||
|
if (data->cfg->siddq_in_base) {
|
||||||
data->cfg->type == sun50i_h6_phy) {
|
|
||||||
if (phy->index == 0) {
|
if (phy->index == 0) {
|
||||||
val = readl(data->base + data->cfg->phyctl_offset);
|
val = readl(data->base + data->cfg->phyctl_offset);
|
||||||
val |= PHY_CTL_VBUSVLDEXT;
|
val |= PHY_CTL_VBUSVLDEXT;
|
||||||
|
@ -385,8 +374,7 @@ static int sun4i_usb_phy_exit(struct phy *_phy)
|
||||||
struct sun4i_usb_phy_data *data = to_sun4i_usb_phy_data(phy);
|
struct sun4i_usb_phy_data *data = to_sun4i_usb_phy_data(phy);
|
||||||
|
|
||||||
if (phy->index == 0) {
|
if (phy->index == 0) {
|
||||||
if (data->cfg->type == sun8i_a83t_phy ||
|
if (data->cfg->siddq_in_base) {
|
||||||
data->cfg->type == sun50i_h6_phy) {
|
|
||||||
void __iomem *phyctl = data->base +
|
void __iomem *phyctl = data->base +
|
||||||
data->cfg->phyctl_offset;
|
data->cfg->phyctl_offset;
|
||||||
|
|
||||||
|
@ -466,9 +454,8 @@ static bool sun4i_usb_phy0_poll(struct sun4i_usb_phy_data *data)
|
||||||
* vbus using the N_VBUSEN pin on the pmic, so we must poll
|
* vbus using the N_VBUSEN pin on the pmic, so we must poll
|
||||||
* when using the pmic for vbus-det _and_ we're driving vbus.
|
* when using the pmic for vbus-det _and_ we're driving vbus.
|
||||||
*/
|
*/
|
||||||
if ((data->cfg->type == sun6i_a31_phy ||
|
if (data->cfg->poll_vbusen && data->vbus_power_supply &&
|
||||||
data->cfg->type == sun8i_a33_phy) &&
|
data->phys[0].regulator_on)
|
||||||
data->vbus_power_supply && data->phys[0].regulator_on)
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -918,9 +905,15 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct sun4i_usb_phy_cfg suniv_f1c100s_cfg = {
|
||||||
|
.num_phys = 1,
|
||||||
|
.disc_thresh = 3,
|
||||||
|
.phyctl_offset = REG_PHYCTL_A10,
|
||||||
|
.dedicated_clocks = true,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun4i_a10_cfg = {
|
static const struct sun4i_usb_phy_cfg sun4i_a10_cfg = {
|
||||||
.num_phys = 3,
|
.num_phys = 3,
|
||||||
.type = sun4i_a10_phy,
|
|
||||||
.disc_thresh = 3,
|
.disc_thresh = 3,
|
||||||
.phyctl_offset = REG_PHYCTL_A10,
|
.phyctl_offset = REG_PHYCTL_A10,
|
||||||
.dedicated_clocks = false,
|
.dedicated_clocks = false,
|
||||||
|
@ -928,7 +921,6 @@ static const struct sun4i_usb_phy_cfg sun4i_a10_cfg = {
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun5i_a13_cfg = {
|
static const struct sun4i_usb_phy_cfg sun5i_a13_cfg = {
|
||||||
.num_phys = 2,
|
.num_phys = 2,
|
||||||
.type = sun4i_a10_phy,
|
|
||||||
.disc_thresh = 2,
|
.disc_thresh = 2,
|
||||||
.phyctl_offset = REG_PHYCTL_A10,
|
.phyctl_offset = REG_PHYCTL_A10,
|
||||||
.dedicated_clocks = false,
|
.dedicated_clocks = false,
|
||||||
|
@ -936,15 +928,14 @@ static const struct sun4i_usb_phy_cfg sun5i_a13_cfg = {
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun6i_a31_cfg = {
|
static const struct sun4i_usb_phy_cfg sun6i_a31_cfg = {
|
||||||
.num_phys = 3,
|
.num_phys = 3,
|
||||||
.type = sun6i_a31_phy,
|
|
||||||
.disc_thresh = 3,
|
.disc_thresh = 3,
|
||||||
.phyctl_offset = REG_PHYCTL_A10,
|
.phyctl_offset = REG_PHYCTL_A10,
|
||||||
.dedicated_clocks = true,
|
.dedicated_clocks = true,
|
||||||
|
.poll_vbusen = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun7i_a20_cfg = {
|
static const struct sun4i_usb_phy_cfg sun7i_a20_cfg = {
|
||||||
.num_phys = 3,
|
.num_phys = 3,
|
||||||
.type = sun4i_a10_phy,
|
|
||||||
.disc_thresh = 2,
|
.disc_thresh = 2,
|
||||||
.phyctl_offset = REG_PHYCTL_A10,
|
.phyctl_offset = REG_PHYCTL_A10,
|
||||||
.dedicated_clocks = false,
|
.dedicated_clocks = false,
|
||||||
|
@ -952,31 +943,30 @@ static const struct sun4i_usb_phy_cfg sun7i_a20_cfg = {
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun8i_a23_cfg = {
|
static const struct sun4i_usb_phy_cfg sun8i_a23_cfg = {
|
||||||
.num_phys = 2,
|
.num_phys = 2,
|
||||||
.type = sun6i_a31_phy,
|
|
||||||
.disc_thresh = 3,
|
.disc_thresh = 3,
|
||||||
.phyctl_offset = REG_PHYCTL_A10,
|
.phyctl_offset = REG_PHYCTL_A10,
|
||||||
.dedicated_clocks = true,
|
.dedicated_clocks = true,
|
||||||
|
.poll_vbusen = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun8i_a33_cfg = {
|
static const struct sun4i_usb_phy_cfg sun8i_a33_cfg = {
|
||||||
.num_phys = 2,
|
.num_phys = 2,
|
||||||
.type = sun8i_a33_phy,
|
|
||||||
.disc_thresh = 3,
|
.disc_thresh = 3,
|
||||||
.phyctl_offset = REG_PHYCTL_A33,
|
.phyctl_offset = REG_PHYCTL_A33,
|
||||||
.dedicated_clocks = true,
|
.dedicated_clocks = true,
|
||||||
|
.poll_vbusen = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun8i_a83t_cfg = {
|
static const struct sun4i_usb_phy_cfg sun8i_a83t_cfg = {
|
||||||
.num_phys = 3,
|
.num_phys = 3,
|
||||||
.hsic_index = 2,
|
.hsic_index = 2,
|
||||||
.type = sun8i_a83t_phy,
|
|
||||||
.phyctl_offset = REG_PHYCTL_A33,
|
.phyctl_offset = REG_PHYCTL_A33,
|
||||||
.dedicated_clocks = true,
|
.dedicated_clocks = true,
|
||||||
|
.siddq_in_base = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun8i_h3_cfg = {
|
static const struct sun4i_usb_phy_cfg sun8i_h3_cfg = {
|
||||||
.num_phys = 4,
|
.num_phys = 4,
|
||||||
.type = sun8i_h3_phy,
|
|
||||||
.disc_thresh = 3,
|
.disc_thresh = 3,
|
||||||
.phyctl_offset = REG_PHYCTL_A33,
|
.phyctl_offset = REG_PHYCTL_A33,
|
||||||
.dedicated_clocks = true,
|
.dedicated_clocks = true,
|
||||||
|
@ -986,7 +976,6 @@ static const struct sun4i_usb_phy_cfg sun8i_h3_cfg = {
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun8i_r40_cfg = {
|
static const struct sun4i_usb_phy_cfg sun8i_r40_cfg = {
|
||||||
.num_phys = 3,
|
.num_phys = 3,
|
||||||
.type = sun8i_r40_phy,
|
|
||||||
.disc_thresh = 3,
|
.disc_thresh = 3,
|
||||||
.phyctl_offset = REG_PHYCTL_A33,
|
.phyctl_offset = REG_PHYCTL_A33,
|
||||||
.dedicated_clocks = true,
|
.dedicated_clocks = true,
|
||||||
|
@ -996,7 +985,6 @@ static const struct sun4i_usb_phy_cfg sun8i_r40_cfg = {
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun8i_v3s_cfg = {
|
static const struct sun4i_usb_phy_cfg sun8i_v3s_cfg = {
|
||||||
.num_phys = 1,
|
.num_phys = 1,
|
||||||
.type = sun8i_v3s_phy,
|
|
||||||
.disc_thresh = 3,
|
.disc_thresh = 3,
|
||||||
.phyctl_offset = REG_PHYCTL_A33,
|
.phyctl_offset = REG_PHYCTL_A33,
|
||||||
.dedicated_clocks = true,
|
.dedicated_clocks = true,
|
||||||
|
@ -1006,16 +994,15 @@ static const struct sun4i_usb_phy_cfg sun8i_v3s_cfg = {
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun20i_d1_cfg = {
|
static const struct sun4i_usb_phy_cfg sun20i_d1_cfg = {
|
||||||
.num_phys = 2,
|
.num_phys = 2,
|
||||||
.type = sun50i_h6_phy,
|
|
||||||
.phyctl_offset = REG_PHYCTL_A33,
|
.phyctl_offset = REG_PHYCTL_A33,
|
||||||
.dedicated_clocks = true,
|
.dedicated_clocks = true,
|
||||||
.hci_phy_ctl_clear = PHY_CTL_SIDDQ,
|
.hci_phy_ctl_clear = PHY_CTL_SIDDQ,
|
||||||
.phy0_dual_route = true,
|
.phy0_dual_route = true,
|
||||||
|
.siddq_in_base = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun50i_a64_cfg = {
|
static const struct sun4i_usb_phy_cfg sun50i_a64_cfg = {
|
||||||
.num_phys = 2,
|
.num_phys = 2,
|
||||||
.type = sun50i_a64_phy,
|
|
||||||
.disc_thresh = 3,
|
.disc_thresh = 3,
|
||||||
.phyctl_offset = REG_PHYCTL_A33,
|
.phyctl_offset = REG_PHYCTL_A33,
|
||||||
.dedicated_clocks = true,
|
.dedicated_clocks = true,
|
||||||
|
@ -1025,22 +1012,22 @@ static const struct sun4i_usb_phy_cfg sun50i_a64_cfg = {
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun50i_h6_cfg = {
|
static const struct sun4i_usb_phy_cfg sun50i_h6_cfg = {
|
||||||
.num_phys = 4,
|
.num_phys = 4,
|
||||||
.type = sun50i_h6_phy,
|
|
||||||
.phyctl_offset = REG_PHYCTL_A33,
|
.phyctl_offset = REG_PHYCTL_A33,
|
||||||
.dedicated_clocks = true,
|
.dedicated_clocks = true,
|
||||||
.phy0_dual_route = true,
|
.phy0_dual_route = true,
|
||||||
.missing_phys = BIT(1) | BIT(2),
|
.missing_phys = BIT(1) | BIT(2),
|
||||||
|
.siddq_in_base = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun50i_h616_cfg = {
|
static const struct sun4i_usb_phy_cfg sun50i_h616_cfg = {
|
||||||
.num_phys = 4,
|
.num_phys = 4,
|
||||||
.type = sun50i_h6_phy,
|
|
||||||
.disc_thresh = 3,
|
.disc_thresh = 3,
|
||||||
.phyctl_offset = REG_PHYCTL_A33,
|
.phyctl_offset = REG_PHYCTL_A33,
|
||||||
.dedicated_clocks = true,
|
.dedicated_clocks = true,
|
||||||
.phy0_dual_route = true,
|
.phy0_dual_route = true,
|
||||||
.hci_phy_ctl_clear = PHY_CTL_SIDDQ,
|
.hci_phy_ctl_clear = PHY_CTL_SIDDQ,
|
||||||
.needs_phy2_siddq = true,
|
.needs_phy2_siddq = true,
|
||||||
|
.siddq_in_base = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct of_device_id sun4i_usb_phy_of_match[] = {
|
static const struct of_device_id sun4i_usb_phy_of_match[] = {
|
||||||
|
@ -1059,6 +1046,8 @@ static const struct of_device_id sun4i_usb_phy_of_match[] = {
|
||||||
.data = &sun50i_a64_cfg},
|
.data = &sun50i_a64_cfg},
|
||||||
{ .compatible = "allwinner,sun50i-h6-usb-phy", .data = &sun50i_h6_cfg },
|
{ .compatible = "allwinner,sun50i-h6-usb-phy", .data = &sun50i_h6_cfg },
|
||||||
{ .compatible = "allwinner,sun50i-h616-usb-phy", .data = &sun50i_h616_cfg },
|
{ .compatible = "allwinner,sun50i-h616-usb-phy", .data = &sun50i_h616_cfg },
|
||||||
|
{ .compatible = "allwinner,suniv-f1c100s-usb-phy",
|
||||||
|
.data = &suniv_f1c100s_cfg },
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, sun4i_usb_phy_of_match);
|
MODULE_DEVICE_TABLE(of, sun4i_usb_phy_of_match);
|
||||||
|
|
|
@ -39,8 +39,8 @@ static inline void mtk_phy_update_bits(void __iomem *reg, u32 mask, u32 val)
|
||||||
/* field @mask shall be constant and continuous */
|
/* field @mask shall be constant and continuous */
|
||||||
#define mtk_phy_update_field(reg, mask, val) \
|
#define mtk_phy_update_field(reg, mask, val) \
|
||||||
({ \
|
({ \
|
||||||
typeof(mask) mask_ = (mask); \
|
BUILD_BUG_ON_MSG(!__builtin_constant_p(mask), "mask is not constant"); \
|
||||||
mtk_phy_update_bits(reg, mask_, FIELD_PREP(mask_, val)); \
|
mtk_phy_update_bits(reg, mask, FIELD_PREP(mask, val)); \
|
||||||
})
|
})
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -84,6 +84,10 @@ static const struct of_device_id can_transceiver_phy_ids[] = {
|
||||||
.compatible = "ti,tcan1043",
|
.compatible = "ti,tcan1043",
|
||||||
.data = &tcan1043_drvdata
|
.data = &tcan1043_drvdata
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.compatible = "nxp,tjr1443",
|
||||||
|
.data = &tcan1043_drvdata
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, can_transceiver_phy_ids);
|
MODULE_DEVICE_TABLE(of, can_transceiver_phy_ids);
|
||||||
|
|
|
@ -766,27 +766,6 @@ struct phy *phy_get(struct device *dev, const char *string)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(phy_get);
|
EXPORT_SYMBOL_GPL(phy_get);
|
||||||
|
|
||||||
/**
|
|
||||||
* phy_optional_get() - lookup and obtain a reference to an optional phy.
|
|
||||||
* @dev: device that requests this phy
|
|
||||||
* @string: the phy name as given in the dt data or the name of the controller
|
|
||||||
* port for non-dt case
|
|
||||||
*
|
|
||||||
* Returns the phy driver, after getting a refcount to it; or
|
|
||||||
* NULL if there is no such phy. The caller is responsible for
|
|
||||||
* calling phy_put() to release that count.
|
|
||||||
*/
|
|
||||||
struct phy *phy_optional_get(struct device *dev, const char *string)
|
|
||||||
{
|
|
||||||
struct phy *phy = phy_get(dev, string);
|
|
||||||
|
|
||||||
if (PTR_ERR(phy) == -ENODEV)
|
|
||||||
phy = NULL;
|
|
||||||
|
|
||||||
return phy;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(phy_optional_get);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* devm_phy_get() - lookup and obtain a reference to a phy.
|
* devm_phy_get() - lookup and obtain a reference to a phy.
|
||||||
* @dev: device that requests this phy
|
* @dev: device that requests this phy
|
||||||
|
@ -879,6 +858,36 @@ struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(devm_of_phy_get);
|
EXPORT_SYMBOL_GPL(devm_of_phy_get);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* devm_of_phy_optional_get() - lookup and obtain a reference to an optional
|
||||||
|
* phy.
|
||||||
|
* @dev: device that requests this phy
|
||||||
|
* @np: node containing the phy
|
||||||
|
* @con_id: name of the phy from device's point of view
|
||||||
|
*
|
||||||
|
* Gets the phy using of_phy_get(), and associates a device with it using
|
||||||
|
* devres. On driver detach, release function is invoked on the devres data,
|
||||||
|
* then, devres data is freed. This differs to devm_of_phy_get() in
|
||||||
|
* that if the phy does not exist, it is not considered an error and
|
||||||
|
* -ENODEV will not be returned. Instead the NULL phy is returned,
|
||||||
|
* which can be passed to all other phy consumer calls.
|
||||||
|
*/
|
||||||
|
struct phy *devm_of_phy_optional_get(struct device *dev, struct device_node *np,
|
||||||
|
const char *con_id)
|
||||||
|
{
|
||||||
|
struct phy *phy = devm_of_phy_get(dev, np, con_id);
|
||||||
|
|
||||||
|
if (PTR_ERR(phy) == -ENODEV)
|
||||||
|
phy = NULL;
|
||||||
|
|
||||||
|
if (IS_ERR(phy))
|
||||||
|
dev_err_probe(dev, PTR_ERR(phy), "failed to get PHY %pOF:%s",
|
||||||
|
np, con_id);
|
||||||
|
|
||||||
|
return phy;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(devm_of_phy_optional_get);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* devm_of_phy_get_by_index() - lookup and obtain a reference to a phy by index.
|
* devm_of_phy_get_by_index() - lookup and obtain a reference to a phy by index.
|
||||||
* @dev: device that requests this phy
|
* @dev: device that requests this phy
|
||||||
|
|
|
@ -50,14 +50,56 @@ config PHY_QCOM_PCIE2
|
||||||
Enable this to support the Qualcomm PCIe PHY, used with the Synopsys
|
Enable this to support the Qualcomm PCIe PHY, used with the Synopsys
|
||||||
based PCIe controller.
|
based PCIe controller.
|
||||||
|
|
||||||
config PHY_QCOM_QMP
|
menuconfig PHY_QCOM_QMP
|
||||||
tristate "Qualcomm QMP PHY Driver"
|
tristate "Qualcomm QMP PHY Drivers"
|
||||||
depends on OF && COMMON_CLK && (ARCH_QCOM || COMPILE_TEST)
|
depends on OF && COMMON_CLK && (ARCH_QCOM || COMPILE_TEST)
|
||||||
|
|
||||||
|
if PHY_QCOM_QMP
|
||||||
|
|
||||||
|
config PHY_QCOM_QMP_COMBO
|
||||||
|
tristate "Qualcomm QMP Combo PHY Driver"
|
||||||
|
default PHY_QCOM_QMP
|
||||||
select GENERIC_PHY
|
select GENERIC_PHY
|
||||||
select MFD_SYSCON
|
select MFD_SYSCON
|
||||||
help
|
help
|
||||||
Enable this to support the QMP PHY transceiver that is used
|
Enable this to support the QMP Combo PHY transceiver that is used
|
||||||
with controllers such as PCIe, UFS, and USB on Qualcomm chips.
|
with USB3 and DisplayPort controllers on Qualcomm chips.
|
||||||
|
|
||||||
|
config PHY_QCOM_QMP_PCIE
|
||||||
|
tristate "Qualcomm QMP PCIe PHY Driver"
|
||||||
|
depends on PCI || COMPILE_TEST
|
||||||
|
select GENERIC_PHY
|
||||||
|
default PHY_QCOM_QMP
|
||||||
|
help
|
||||||
|
Enable this to support the QMP PCIe PHY transceiver that is used
|
||||||
|
with PCIe controllers on Qualcomm chips.
|
||||||
|
|
||||||
|
config PHY_QCOM_QMP_PCIE_8996
|
||||||
|
tristate "Qualcomm QMP PCIe 8996 PHY Driver"
|
||||||
|
depends on PCI || COMPILE_TEST
|
||||||
|
select GENERIC_PHY
|
||||||
|
default PHY_QCOM_QMP
|
||||||
|
help
|
||||||
|
Enable this to support the QMP PCIe PHY transceiver that is used
|
||||||
|
with PCIe controllers on Qualcomm msm8996 chips.
|
||||||
|
|
||||||
|
config PHY_QCOM_QMP_UFS
|
||||||
|
tristate "Qualcomm QMP UFS PHY Driver"
|
||||||
|
select GENERIC_PHY
|
||||||
|
default PHY_QCOM_QMP
|
||||||
|
help
|
||||||
|
Enable this to support the QMP UFS PHY transceiver that is used
|
||||||
|
with UFS controllers on Qualcomm chips.
|
||||||
|
|
||||||
|
config PHY_QCOM_QMP_USB
|
||||||
|
tristate "Qualcomm QMP USB PHY Driver"
|
||||||
|
select GENERIC_PHY
|
||||||
|
default PHY_QCOM_QMP
|
||||||
|
help
|
||||||
|
Enable this to support the QMP USB PHY transceiver that is used
|
||||||
|
with USB3 controllers on Qualcomm chips.
|
||||||
|
|
||||||
|
endif # PHY_QCOM_QMP
|
||||||
|
|
||||||
config PHY_QCOM_QUSB2
|
config PHY_QCOM_QUSB2
|
||||||
tristate "Qualcomm QUSB2 PHY Driver"
|
tristate "Qualcomm QUSB2 PHY Driver"
|
||||||
|
@ -70,6 +112,24 @@ config PHY_QCOM_QUSB2
|
||||||
PHY which is usually paired with either the ChipIdea or Synopsys DWC3
|
PHY which is usually paired with either the ChipIdea or Synopsys DWC3
|
||||||
USB IPs on MSM SOCs.
|
USB IPs on MSM SOCs.
|
||||||
|
|
||||||
|
config PHY_QCOM_SNPS_EUSB2
|
||||||
|
tristate "Qualcomm SNPS eUSB2 PHY Driver"
|
||||||
|
depends on OF && (ARCH_QCOM || COMPILE_TEST)
|
||||||
|
select GENERIC_PHY
|
||||||
|
help
|
||||||
|
Enable support for the USB high-speed SNPS eUSB2 phy on Qualcomm
|
||||||
|
chipsets. The PHY is paired with a Synopsys DWC3 USB controller
|
||||||
|
on Qualcomm SOCs.
|
||||||
|
|
||||||
|
config PHY_QCOM_EUSB2_REPEATER
|
||||||
|
tristate "Qualcomm SNPS eUSB2 Repeater Driver"
|
||||||
|
depends on OF && (ARCH_QCOM || COMPILE_TEST)
|
||||||
|
select GENERIC_PHY
|
||||||
|
help
|
||||||
|
Enable support for the USB high-speed SNPS eUSB2 repeater on Qualcomm
|
||||||
|
PMICs. The repeater is paired with a Synopsys eUSB2 Phy
|
||||||
|
on Qualcomm SOCs.
|
||||||
|
|
||||||
config PHY_QCOM_USB_HS
|
config PHY_QCOM_USB_HS
|
||||||
tristate "Qualcomm USB HS PHY module"
|
tristate "Qualcomm USB HS PHY module"
|
||||||
depends on USB_ULPI_BUS
|
depends on USB_ULPI_BUS
|
||||||
|
|
|
@ -5,14 +5,16 @@ obj-$(CONFIG_PHY_QCOM_EDP) += phy-qcom-edp.o
|
||||||
obj-$(CONFIG_PHY_QCOM_IPQ4019_USB) += phy-qcom-ipq4019-usb.o
|
obj-$(CONFIG_PHY_QCOM_IPQ4019_USB) += phy-qcom-ipq4019-usb.o
|
||||||
obj-$(CONFIG_PHY_QCOM_IPQ806X_SATA) += phy-qcom-ipq806x-sata.o
|
obj-$(CONFIG_PHY_QCOM_IPQ806X_SATA) += phy-qcom-ipq806x-sata.o
|
||||||
obj-$(CONFIG_PHY_QCOM_PCIE2) += phy-qcom-pcie2.o
|
obj-$(CONFIG_PHY_QCOM_PCIE2) += phy-qcom-pcie2.o
|
||||||
obj-$(CONFIG_PHY_QCOM_QMP) += \
|
|
||||||
phy-qcom-qmp-combo.o \
|
obj-$(CONFIG_PHY_QCOM_QMP_COMBO) += phy-qcom-qmp-combo.o
|
||||||
phy-qcom-qmp-pcie.o \
|
obj-$(CONFIG_PHY_QCOM_QMP_PCIE) += phy-qcom-qmp-pcie.o
|
||||||
phy-qcom-qmp-pcie-msm8996.o \
|
obj-$(CONFIG_PHY_QCOM_QMP_PCIE_8996) += phy-qcom-qmp-pcie-msm8996.o
|
||||||
phy-qcom-qmp-ufs.o \
|
obj-$(CONFIG_PHY_QCOM_QMP_UFS) += phy-qcom-qmp-ufs.o
|
||||||
phy-qcom-qmp-usb.o
|
obj-$(CONFIG_PHY_QCOM_QMP_USB) += phy-qcom-qmp-usb.o
|
||||||
|
|
||||||
obj-$(CONFIG_PHY_QCOM_QUSB2) += phy-qcom-qusb2.o
|
obj-$(CONFIG_PHY_QCOM_QUSB2) += phy-qcom-qusb2.o
|
||||||
|
obj-$(CONFIG_PHY_QCOM_SNPS_EUSB2) += phy-qcom-snps-eusb2.o
|
||||||
|
obj-$(CONFIG_PHY_QCOM_EUSB2_REPEATER) += phy-qcom-eusb2-repeater.o
|
||||||
obj-$(CONFIG_PHY_QCOM_USB_HS) += phy-qcom-usb-hs.o
|
obj-$(CONFIG_PHY_QCOM_USB_HS) += phy-qcom-usb-hs.o
|
||||||
obj-$(CONFIG_PHY_QCOM_USB_HSIC) += phy-qcom-usb-hsic.o
|
obj-$(CONFIG_PHY_QCOM_USB_HSIC) += phy-qcom-usb-hsic.o
|
||||||
obj-$(CONFIG_PHY_QCOM_USB_HS_28NM) += phy-qcom-usb-hs-28nm.o
|
obj-$(CONFIG_PHY_QCOM_USB_HS_28NM) += phy-qcom-usb-hs-28nm.o
|
||||||
|
|
259
drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c
Normal file
259
drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c
Normal file
|
@ -0,0 +1,259 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Linaro Limited
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/regulator/consumer.h>
|
||||||
|
#include <linux/regmap.h>
|
||||||
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/phy/phy.h>
|
||||||
|
|
||||||
|
/* eUSB2 status registers */
|
||||||
|
#define EUSB2_RPTR_STATUS 0x08
|
||||||
|
#define RPTR_OK BIT(7)
|
||||||
|
|
||||||
|
/* eUSB2 control registers */
|
||||||
|
#define EUSB2_EN_CTL1 0x46
|
||||||
|
#define EUSB2_RPTR_EN BIT(7)
|
||||||
|
|
||||||
|
#define EUSB2_FORCE_EN_5 0xe8
|
||||||
|
#define F_CLK_19P2M_EN BIT(6)
|
||||||
|
|
||||||
|
#define EUSB2_FORCE_VAL_5 0xeD
|
||||||
|
#define V_CLK_19P2M_EN BIT(6)
|
||||||
|
|
||||||
|
#define EUSB2_TUNE_IUSB2 0x51
|
||||||
|
#define EUSB2_TUNE_SQUELCH_U 0x54
|
||||||
|
#define EUSB2_TUNE_USB2_PREEM 0x57
|
||||||
|
|
||||||
|
#define QCOM_EUSB2_REPEATER_INIT_CFG(o, v) \
|
||||||
|
{ \
|
||||||
|
.offset = o, \
|
||||||
|
.val = v, \
|
||||||
|
}
|
||||||
|
|
||||||
|
struct eusb2_repeater_init_tbl {
|
||||||
|
unsigned int offset;
|
||||||
|
unsigned int val;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct eusb2_repeater_cfg {
|
||||||
|
const struct eusb2_repeater_init_tbl *init_tbl;
|
||||||
|
int init_tbl_num;
|
||||||
|
const char * const *vreg_list;
|
||||||
|
int num_vregs;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct eusb2_repeater {
|
||||||
|
struct device *dev;
|
||||||
|
struct regmap *regmap;
|
||||||
|
struct phy *phy;
|
||||||
|
struct regulator_bulk_data *vregs;
|
||||||
|
const struct eusb2_repeater_cfg *cfg;
|
||||||
|
u16 base;
|
||||||
|
enum phy_mode mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char * const pm8550b_vreg_l[] = {
|
||||||
|
"vdd18", "vdd3",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct eusb2_repeater_init_tbl pm8550b_init_tbl[] = {
|
||||||
|
QCOM_EUSB2_REPEATER_INIT_CFG(EUSB2_TUNE_IUSB2, 0x8),
|
||||||
|
QCOM_EUSB2_REPEATER_INIT_CFG(EUSB2_TUNE_SQUELCH_U, 0x3),
|
||||||
|
QCOM_EUSB2_REPEATER_INIT_CFG(EUSB2_TUNE_USB2_PREEM, 0x5),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct eusb2_repeater_cfg pm8550b_eusb2_cfg = {
|
||||||
|
.init_tbl = pm8550b_init_tbl,
|
||||||
|
.init_tbl_num = ARRAY_SIZE(pm8550b_init_tbl),
|
||||||
|
.vreg_list = pm8550b_vreg_l,
|
||||||
|
.num_vregs = ARRAY_SIZE(pm8550b_vreg_l),
|
||||||
|
};
|
||||||
|
|
||||||
|
static int eusb2_repeater_init_vregs(struct eusb2_repeater *rptr)
|
||||||
|
{
|
||||||
|
int num = rptr->cfg->num_vregs;
|
||||||
|
struct device *dev = rptr->dev;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
rptr->vregs = devm_kcalloc(dev, num, sizeof(*rptr->vregs), GFP_KERNEL);
|
||||||
|
if (!rptr->vregs)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
rptr->vregs[i].supply = rptr->cfg->vreg_list[i];
|
||||||
|
|
||||||
|
return devm_regulator_bulk_get(dev, num, rptr->vregs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int eusb2_repeater_init(struct phy *phy)
|
||||||
|
{
|
||||||
|
struct eusb2_repeater *rptr = phy_get_drvdata(phy);
|
||||||
|
const struct eusb2_repeater_init_tbl *init_tbl = rptr->cfg->init_tbl;
|
||||||
|
int num = rptr->cfg->init_tbl_num;
|
||||||
|
u32 val;
|
||||||
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ret = regulator_bulk_enable(rptr->cfg->num_vregs, rptr->vregs);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
regmap_update_bits(rptr->regmap, rptr->base + EUSB2_EN_CTL1,
|
||||||
|
EUSB2_RPTR_EN, EUSB2_RPTR_EN);
|
||||||
|
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
regmap_update_bits(rptr->regmap,
|
||||||
|
rptr->base + init_tbl[i].offset,
|
||||||
|
init_tbl[i].val, init_tbl[i].val);
|
||||||
|
|
||||||
|
ret = regmap_read_poll_timeout(rptr->regmap,
|
||||||
|
rptr->base + EUSB2_RPTR_STATUS, val,
|
||||||
|
val & RPTR_OK, 10, 5);
|
||||||
|
if (ret)
|
||||||
|
dev_err(rptr->dev, "initialization timed-out\n");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int eusb2_repeater_set_mode(struct phy *phy,
|
||||||
|
enum phy_mode mode, int submode)
|
||||||
|
{
|
||||||
|
struct eusb2_repeater *rptr = phy_get_drvdata(phy);
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
case PHY_MODE_USB_HOST:
|
||||||
|
/*
|
||||||
|
* CM.Lx is prohibited when repeater is already into Lx state as
|
||||||
|
* per eUSB 1.2 Spec. Below implement software workaround until
|
||||||
|
* PHY and controller is fixing seen observation.
|
||||||
|
*/
|
||||||
|
regmap_update_bits(rptr->regmap, rptr->base + EUSB2_FORCE_EN_5,
|
||||||
|
F_CLK_19P2M_EN, F_CLK_19P2M_EN);
|
||||||
|
regmap_update_bits(rptr->regmap, rptr->base + EUSB2_FORCE_VAL_5,
|
||||||
|
V_CLK_19P2M_EN, V_CLK_19P2M_EN);
|
||||||
|
break;
|
||||||
|
case PHY_MODE_USB_DEVICE:
|
||||||
|
/*
|
||||||
|
* In device mode clear host mode related workaround as there
|
||||||
|
* is no repeater reset available, and enable/disable of
|
||||||
|
* repeater doesn't clear previous value due to shared
|
||||||
|
* regulators (say host <-> device mode switch).
|
||||||
|
*/
|
||||||
|
regmap_update_bits(rptr->regmap, rptr->base + EUSB2_FORCE_EN_5,
|
||||||
|
F_CLK_19P2M_EN, 0);
|
||||||
|
regmap_update_bits(rptr->regmap, rptr->base + EUSB2_FORCE_VAL_5,
|
||||||
|
V_CLK_19P2M_EN, 0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int eusb2_repeater_exit(struct phy *phy)
|
||||||
|
{
|
||||||
|
struct eusb2_repeater *rptr = phy_get_drvdata(phy);
|
||||||
|
|
||||||
|
return regulator_bulk_disable(rptr->cfg->num_vregs, rptr->vregs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct phy_ops eusb2_repeater_ops = {
|
||||||
|
.init = eusb2_repeater_init,
|
||||||
|
.exit = eusb2_repeater_exit,
|
||||||
|
.set_mode = eusb2_repeater_set_mode,
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int eusb2_repeater_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct eusb2_repeater *rptr;
|
||||||
|
struct device *dev = &pdev->dev;
|
||||||
|
struct phy_provider *phy_provider;
|
||||||
|
struct device_node *np = dev->of_node;
|
||||||
|
u32 res;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
rptr = devm_kzalloc(dev, sizeof(*rptr), GFP_KERNEL);
|
||||||
|
if (!rptr)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
rptr->dev = dev;
|
||||||
|
dev_set_drvdata(dev, rptr);
|
||||||
|
|
||||||
|
rptr->cfg = of_device_get_match_data(dev);
|
||||||
|
if (!rptr->cfg)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
rptr->regmap = dev_get_regmap(dev->parent, NULL);
|
||||||
|
if (!rptr->regmap)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
ret = of_property_read_u32(np, "reg", &res);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
rptr->base = res;
|
||||||
|
|
||||||
|
ret = eusb2_repeater_init_vregs(rptr);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dev, "unable to get supplies\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
rptr->phy = devm_phy_create(dev, np, &eusb2_repeater_ops);
|
||||||
|
if (IS_ERR(rptr->phy)) {
|
||||||
|
dev_err(dev, "failed to create PHY: %d\n", ret);
|
||||||
|
return PTR_ERR(rptr->phy);
|
||||||
|
}
|
||||||
|
|
||||||
|
phy_set_drvdata(rptr->phy, rptr);
|
||||||
|
|
||||||
|
phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
|
||||||
|
if (IS_ERR(phy_provider))
|
||||||
|
return PTR_ERR(phy_provider);
|
||||||
|
|
||||||
|
dev_info(dev, "Registered Qcom-eUSB2 repeater\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int eusb2_repeater_remove(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct eusb2_repeater *rptr = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
|
if (!rptr)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
eusb2_repeater_exit(rptr->phy);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct of_device_id eusb2_repeater_of_match_table[] = {
|
||||||
|
{
|
||||||
|
.compatible = "qcom,pm8550b-eusb2-repeater",
|
||||||
|
.data = &pm8550b_eusb2_cfg,
|
||||||
|
},
|
||||||
|
{ },
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, eusb2_repeater_of_match_table);
|
||||||
|
|
||||||
|
static struct platform_driver eusb2_repeater_driver = {
|
||||||
|
.probe = eusb2_repeater_probe,
|
||||||
|
.remove = eusb2_repeater_remove,
|
||||||
|
.driver = {
|
||||||
|
.name = "qcom-eusb2-repeater",
|
||||||
|
.of_match_table = eusb2_repeater_of_match_table,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
module_platform_driver(eusb2_repeater_driver);
|
||||||
|
|
||||||
|
MODULE_DESCRIPTION("Qualcomm PMIC eUSB2 Repeater driver");
|
||||||
|
MODULE_LICENSE("GPL");
|
|
@ -243,7 +243,11 @@ static int phy_pipe_clksrc_register(struct qcom_phy *qphy)
|
||||||
fixed->fixed_rate = 250000000;
|
fixed->fixed_rate = 250000000;
|
||||||
fixed->hw.init = &init;
|
fixed->hw.init = &init;
|
||||||
|
|
||||||
return devm_clk_hw_register(qphy->dev, &fixed->hw);
|
ret = devm_clk_hw_register(qphy->dev, &fixed->hw);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return devm_of_clk_add_hw_provider(qphy->dev, of_clk_hw_simple_get, &fixed->hw);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qcom_pcie2_phy_probe(struct platform_device *pdev)
|
static int qcom_pcie2_phy_probe(struct platform_device *pdev)
|
||||||
|
|
|
@ -23,6 +23,10 @@
|
||||||
#include <dt-bindings/phy/phy-qcom-qmp.h>
|
#include <dt-bindings/phy/phy-qcom-qmp.h>
|
||||||
|
|
||||||
#include "phy-qcom-qmp.h"
|
#include "phy-qcom-qmp.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-misc-v3.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-usb-v4.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-usb-v5.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-usb-v6.h"
|
||||||
|
|
||||||
/* QPHY_SW_RESET bit */
|
/* QPHY_SW_RESET bit */
|
||||||
#define SW_RESET BIT(0)
|
#define SW_RESET BIT(0)
|
||||||
|
@ -56,9 +60,6 @@
|
||||||
/* QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR register bits */
|
/* QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR register bits */
|
||||||
#define IRQ_CLEAR BIT(0)
|
#define IRQ_CLEAR BIT(0)
|
||||||
|
|
||||||
/* QPHY_PCS_LFPS_RXTERM_IRQ_STATUS register bits */
|
|
||||||
#define RCVR_DETECT BIT(0)
|
|
||||||
|
|
||||||
/* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */
|
/* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */
|
||||||
#define CLAMP_EN BIT(0) /* enables i/o clamp_n */
|
#define CLAMP_EN BIT(0) /* enables i/o clamp_n */
|
||||||
|
|
||||||
|
@ -96,31 +97,29 @@ enum qphy_reg_layout {
|
||||||
QPHY_PCS_STATUS,
|
QPHY_PCS_STATUS,
|
||||||
QPHY_PCS_AUTONOMOUS_MODE_CTRL,
|
QPHY_PCS_AUTONOMOUS_MODE_CTRL,
|
||||||
QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR,
|
QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR,
|
||||||
QPHY_PCS_LFPS_RXTERM_IRQ_STATUS,
|
|
||||||
QPHY_PCS_POWER_DOWN_CONTROL,
|
QPHY_PCS_POWER_DOWN_CONTROL,
|
||||||
/* Keep last to ensure regs_layout arrays are properly initialized */
|
/* Keep last to ensure regs_layout arrays are properly initialized */
|
||||||
QPHY_LAYOUT_SIZE
|
QPHY_LAYOUT_SIZE
|
||||||
};
|
};
|
||||||
|
|
||||||
static const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
static const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
||||||
[QPHY_SW_RESET] = 0x00,
|
[QPHY_SW_RESET] = QPHY_V3_PCS_SW_RESET,
|
||||||
[QPHY_START_CTRL] = 0x08,
|
[QPHY_START_CTRL] = QPHY_V3_PCS_START_CONTROL,
|
||||||
[QPHY_PCS_STATUS] = 0x174,
|
[QPHY_PCS_STATUS] = QPHY_V3_PCS_PCS_STATUS,
|
||||||
[QPHY_PCS_POWER_DOWN_CONTROL] = 0x04,
|
[QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V3_PCS_POWER_DOWN_CONTROL,
|
||||||
[QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x0d8,
|
[QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V3_PCS_AUTONOMOUS_MODE_CTRL,
|
||||||
[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x0dc,
|
[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V3_PCS_LFPS_RXTERM_IRQ_CLEAR,
|
||||||
[QPHY_PCS_LFPS_RXTERM_IRQ_STATUS] = 0x170,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const unsigned int qmp_v4_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
static const unsigned int qmp_v4_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
||||||
[QPHY_SW_RESET] = 0x00,
|
[QPHY_SW_RESET] = QPHY_V4_PCS_SW_RESET,
|
||||||
[QPHY_START_CTRL] = 0x44,
|
[QPHY_START_CTRL] = QPHY_V4_PCS_START_CONTROL,
|
||||||
[QPHY_PCS_STATUS] = 0x14,
|
[QPHY_PCS_STATUS] = QPHY_V4_PCS_PCS_STATUS1,
|
||||||
[QPHY_PCS_POWER_DOWN_CONTROL] = 0x40,
|
[QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V4_PCS_POWER_DOWN_CONTROL,
|
||||||
|
|
||||||
/* In PCS_USB */
|
/* In PCS_USB */
|
||||||
[QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x008,
|
[QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V4_PCS_USB3_AUTONOMOUS_MODE_CTRL,
|
||||||
[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x014,
|
[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V4_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl qmp_v3_usb3_serdes_tbl[] = {
|
static const struct qmp_phy_init_tbl qmp_v3_usb3_serdes_tbl[] = {
|
||||||
|
@ -311,6 +310,70 @@ static const struct qmp_phy_init_tbl qmp_v3_usb3_pcs_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm6350_usb3_rx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x05),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm6350_usb3_pcs_tbl[] = {
|
||||||
|
/* FLL settings */
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
|
||||||
|
|
||||||
|
/* Lock Det settings */
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
|
||||||
|
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xcc),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
|
||||||
|
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_DET_HIGH_COUNT_VAL, 0x04),
|
||||||
|
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG1, 0x21),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG2, 0x60),
|
||||||
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl sm8150_usb3_serdes_tbl[] = {
|
static const struct qmp_phy_init_tbl sm8150_usb3_serdes_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01),
|
QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31),
|
QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31),
|
||||||
|
@ -494,6 +557,223 @@ static const struct qmp_phy_init_tbl sm8250_usb3_pcs_usb_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8350_usb3_tx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_TX, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_RX, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x0e),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0x35),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_3, 0x3f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_4, 0x7f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_5, 0x3f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RCV_DETECT_LVL_2, 0x12),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_PI_QEC_CTRL, 0x21),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8350_usb3_rx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x05),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0x99),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH1, 0x08),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH2, 0x08),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN1, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN2, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL1, 0x54),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_CNTRL, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0xbb),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0x7b),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xbb),
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3d, 1),
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3c, 2),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0xdb),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0x64),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0x24),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH2, 0xd2),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH3, 0x13),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0xa9),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_EN_TIMER, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_DCC_CTRL1, 0x0c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_GM_CAL, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_VTH_CODE, 0x10),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8350_usb3_pcs_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8350_usb3_pcs_usb_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_H, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_usb3_serdes_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE1_MODE1, 0xc0),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE2_MODE1, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE1, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE1, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE1, 0x36),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORECLK_DIV_MODE1, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE1, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE1, 0x41),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE1, 0x41),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MSB_MODE1, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE1, 0x55),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE1, 0x75),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE1, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE1_MODE1, 0x25),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE2_MODE1, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0x5c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x5c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE1_MODE0, 0xc0),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE2_MODE0, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x36),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x08),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x1a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x41),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MSB_MODE0, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE0, 0x55),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0x75),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE1_MODE0, 0x25),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE2_MODE0, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BG_TIMER, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_EN_CENTER, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_PER1, 0x62),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_PER2, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_BUF_ENABLE, 0x0c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0x1a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_CFG, 0x14),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORE_CLK_EN, 0x20),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_1, 0xb6),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_2, 0x4b),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_3, 0x37),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_ADDITIONAL_MISC, 0x0c),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_usb3_tx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_TX, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_RX, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x1f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_RX, 0x09),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_1, 0xf5),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_3, 0x3f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_4, 0x3f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_5, 0x5f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_RCV_DETECT_LVL_2, 0x12),
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V6_TX_PI_QEC_CTRL, 0x21, 1),
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V6_TX_PI_QEC_CTRL, 0x05, 2),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_usb3_rx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FO_GAIN, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SO_GAIN, 0x06),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_PI_CONTROLS, 0x99),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_THRESH1, 0x08),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_THRESH2, 0x08),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_GAIN1, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_GAIN2, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_VGA_CAL_CNTRL1, 0x54),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_VGA_CAL_CNTRL2, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_GM_CAL, 0x13),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_IDAC_TSETTLE_LOW, 0x07),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_CNTRL, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_LOW, 0xdc),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH, 0x5c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH2, 0x9c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH3, 0x1d),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH4, 0x09),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_DFE_EN_TIMER, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_DCC_CTRL1, 0x0c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_VTH_CODE, 0x10),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_CAL_CTRL1, 0x14),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_CAL_TRIM, 0x08),
|
||||||
|
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_LOW, 0x3f, 1),
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH, 0xbf, 1),
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH2, 0xff, 1),
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH3, 0xdf, 1),
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH4, 0xed, 1),
|
||||||
|
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_LOW, 0xbf, 2),
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH, 0xbf, 2),
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH2, 0xbf, 2),
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH3, 0xdf, 2),
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH4, 0xfd, 2),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_usb3_pcs_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG1, 0xc4),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG2, 0x89),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG3, 0x20),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG6, 0x13),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_REFGEN_REQ_CONFIG1, 0x21),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_RX_SIGDET_LVL, 0x99),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_CDR_RESET_TIME, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_ALIGN_DETECT_CONFIG1, 0x88),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_ALIGN_DETECT_CONFIG2, 0x13),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_PCS_TX_RX_CONFIG, 0x0c),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG1, 0x4b),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG5, 0x10),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_POWER_STATE_CONFIG1, 0x68),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_usb3_pcs_usb_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_H, 0x00),
|
||||||
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl[] = {
|
static const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V4_COM_SVS_MODE_CLK_SEL, 0x05),
|
QMP_PHY_INIT_CFG(QSERDES_V4_COM_SVS_MODE_CLK_SEL, 0x05),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x3b),
|
QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x3b),
|
||||||
|
@ -600,6 +880,20 @@ static const struct qmp_phy_init_tbl qmp_v5_dp_serdes_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORE_CLK_EN, 0x1f),
|
QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORE_CLK_EN, 0x1f),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl qmp_v5_dp_tx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_VMODE_CTRL1, 0x40),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_INTERFACE_SELECT, 0x3b),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_CLKBUF_ENABLE, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RESET_TSYNC_EN, 0x03),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_TRAN_DRVR_EMP_EN, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_TX_INTERFACE_MODE, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x11),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_TX_BAND, 0x04),
|
||||||
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl qmp_v5_5nm_dp_tx_tbl[] = {
|
static const struct qmp_phy_init_tbl qmp_v5_5nm_dp_tx_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_3, 0x51),
|
QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_3, 0x51),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN, 0x1a),
|
QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN, 0x1a),
|
||||||
|
@ -615,6 +909,91 @@ static const struct qmp_phy_init_tbl qmp_v5_5nm_dp_tx_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_TX_BAND, 0x01),
|
QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_TX_BAND, 0x01),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SVS_MODE_CLK_SEL, 0x15),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0x3b),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYS_CLK_CTRL, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CLK_ENABLE1, 0x0c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_BUF_ENABLE, 0x06),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CLK_SELECT, 0x30),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x36),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x06),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE0, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x12),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BG_TIMER, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CORE_CLK_DIV_MODE0, 0x14),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_CTRL, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN, 0x17),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORE_CLK_EN, 0x0f),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl qmp_v6_dp_tx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_VMODE_CTRL1, 0x40),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_INTERFACE_SELECT, 0x3b),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_CLKBUF_ENABLE, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_RESET_TSYNC_EN, 0x03),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_TRAN_DRVR_EMP_EN, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_TX_INTERFACE_MODE, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x0c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_RX, 0x0c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_TX_BAND, 0x4),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_rbr[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x05),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x34),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xc0),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x0b),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x37),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x71),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0c),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_hbr[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x03),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x34),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xc0),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x0b),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x07),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x07),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x08),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x71),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0c),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_hbr2[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x46),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x05),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x0e),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x08),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x97),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x10),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_hbr3[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x34),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xc0),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x0b),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x17),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x15),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x08),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x71),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0c),
|
||||||
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl sc8280xp_usb43dp_serdes_tbl[] = {
|
static const struct qmp_phy_init_tbl sc8280xp_usb43dp_serdes_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_EN_CENTER, 0x01),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_EN_CENTER, 0x01),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER1, 0x31),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER1, 0x31),
|
||||||
|
@ -768,6 +1147,27 @@ static const u8 qmp_dp_v3_voltage_swing_hbr_rbr[4][4] = {
|
||||||
{ 0x1f, 0xff, 0xff, 0xff }
|
{ 0x1f, 0xff, 0xff, 0xff }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const u8 qmp_dp_v4_pre_emphasis_hbr3_hbr2[4][4] = {
|
||||||
|
{ 0x00, 0x0c, 0x15, 0x1b },
|
||||||
|
{ 0x02, 0x0e, 0x16, 0xff },
|
||||||
|
{ 0x02, 0x11, 0xff, 0xff },
|
||||||
|
{ 0x04, 0xff, 0xff, 0xff }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u8 qmp_dp_v4_pre_emphasis_hbr_rbr[4][4] = {
|
||||||
|
{ 0x00, 0x0d, 0x14, 0x1a },
|
||||||
|
{ 0x00, 0x0e, 0x15, 0xff },
|
||||||
|
{ 0x00, 0x0d, 0xff, 0xff },
|
||||||
|
{ 0x03, 0xff, 0xff, 0xff }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u8 qmp_dp_v4_voltage_swing_hbr_rbr[4][4] = {
|
||||||
|
{ 0x08, 0x0f, 0x16, 0x1f },
|
||||||
|
{ 0x11, 0x1e, 0x1f, 0xff },
|
||||||
|
{ 0x16, 0x1f, 0xff, 0xff },
|
||||||
|
{ 0x1f, 0xff, 0xff, 0xff }
|
||||||
|
};
|
||||||
|
|
||||||
static const u8 qmp_dp_v5_pre_emphasis_hbr3_hbr2[4][4] = {
|
static const u8 qmp_dp_v5_pre_emphasis_hbr3_hbr2[4][4] = {
|
||||||
{ 0x20, 0x2c, 0x35, 0x3b },
|
{ 0x20, 0x2c, 0x35, 0x3b },
|
||||||
{ 0x22, 0x2e, 0x36, 0xff },
|
{ 0x22, 0x2e, 0x36, 0xff },
|
||||||
|
@ -796,6 +1196,13 @@ static const u8 qmp_dp_v5_voltage_swing_hbr_rbr[4][4] = {
|
||||||
{ 0x3f, 0xff, 0xff, 0xff }
|
{ 0x3f, 0xff, 0xff, 0xff }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const u8 qmp_dp_v6_pre_emphasis_hbr_rbr[4][4] = {
|
||||||
|
{ 0x20, 0x2d, 0x34, 0x3a },
|
||||||
|
{ 0x20, 0x2e, 0x35, 0xff },
|
||||||
|
{ 0x20, 0x2e, 0xff, 0xff },
|
||||||
|
{ 0x22, 0xff, 0xff, 0xff }
|
||||||
|
};
|
||||||
|
|
||||||
struct qmp_combo;
|
struct qmp_combo;
|
||||||
|
|
||||||
struct qmp_combo_offsets {
|
struct qmp_combo_offsets {
|
||||||
|
@ -809,6 +1216,8 @@ struct qmp_combo_offsets {
|
||||||
u16 usb3_pcs;
|
u16 usb3_pcs;
|
||||||
u16 usb3_pcs_usb;
|
u16 usb3_pcs_usb;
|
||||||
u16 dp_serdes;
|
u16 dp_serdes;
|
||||||
|
u16 dp_txa;
|
||||||
|
u16 dp_txb;
|
||||||
u16 dp_dp_phy;
|
u16 dp_dp_phy;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -928,6 +1337,9 @@ static int qmp_v4_calibrate_dp_phy(struct qmp_combo *qmp);
|
||||||
|
|
||||||
static int qmp_v5_configure_dp_phy(struct qmp_combo *qmp);
|
static int qmp_v5_configure_dp_phy(struct qmp_combo *qmp);
|
||||||
|
|
||||||
|
static void qmp_v6_dp_aux_init(struct qmp_combo *qmp);
|
||||||
|
static int qmp_v6_configure_dp_phy(struct qmp_combo *qmp);
|
||||||
|
|
||||||
static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
|
static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
|
||||||
{
|
{
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
@ -975,6 +1387,21 @@ static const char * const sc7180_usb3phy_reset_l[] = {
|
||||||
"phy",
|
"phy",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_combo_offsets qmp_combo_offsets_v3 = {
|
||||||
|
.com = 0x0000,
|
||||||
|
.txa = 0x1200,
|
||||||
|
.rxa = 0x1400,
|
||||||
|
.txb = 0x1600,
|
||||||
|
.rxb = 0x1800,
|
||||||
|
.usb3_serdes = 0x1000,
|
||||||
|
.usb3_pcs_misc = 0x1a00,
|
||||||
|
.usb3_pcs = 0x1c00,
|
||||||
|
.dp_serdes = 0x2000,
|
||||||
|
.dp_txa = 0x2200,
|
||||||
|
.dp_txb = 0x2600,
|
||||||
|
.dp_dp_phy = 0x2a00,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct qmp_combo_offsets qmp_combo_offsets_v5 = {
|
static const struct qmp_combo_offsets qmp_combo_offsets_v5 = {
|
||||||
.com = 0x0000,
|
.com = 0x0000,
|
||||||
.txa = 0x0400,
|
.txa = 0x0400,
|
||||||
|
@ -989,6 +1416,22 @@ static const struct qmp_combo_offsets qmp_combo_offsets_v5 = {
|
||||||
.dp_dp_phy = 0x2200,
|
.dp_dp_phy = 0x2200,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_combo_offsets qmp_combo_offsets_v6 = {
|
||||||
|
.com = 0x0000,
|
||||||
|
.txa = 0x1200,
|
||||||
|
.rxa = 0x1400,
|
||||||
|
.txb = 0x1600,
|
||||||
|
.rxb = 0x1800,
|
||||||
|
.usb3_serdes = 0x1000,
|
||||||
|
.usb3_pcs_misc = 0x1a00,
|
||||||
|
.usb3_pcs = 0x1c00,
|
||||||
|
.usb3_pcs_usb = 0x1f00,
|
||||||
|
.dp_serdes = 0x2000,
|
||||||
|
.dp_txa = 0x2200,
|
||||||
|
.dp_txb = 0x2600,
|
||||||
|
.dp_dp_phy = 0x2a00,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_cfg sc7180_usb3dpphy_cfg = {
|
static const struct qmp_phy_cfg sc7180_usb3dpphy_cfg = {
|
||||||
.serdes_tbl = qmp_v3_usb3_serdes_tbl,
|
.serdes_tbl = qmp_v3_usb3_serdes_tbl,
|
||||||
.serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
|
.serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
|
||||||
|
@ -1172,6 +1615,51 @@ static const struct qmp_phy_cfg sc8280xp_usb43dpphy_cfg = {
|
||||||
.regs = qmp_v4_usb3phy_regs_layout,
|
.regs = qmp_v4_usb3phy_regs_layout,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_cfg sm6350_usb3dpphy_cfg = {
|
||||||
|
.offsets = &qmp_combo_offsets_v3,
|
||||||
|
|
||||||
|
.serdes_tbl = qmp_v3_usb3_serdes_tbl,
|
||||||
|
.serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
|
||||||
|
.tx_tbl = qmp_v3_usb3_tx_tbl,
|
||||||
|
.tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl),
|
||||||
|
.rx_tbl = sm6350_usb3_rx_tbl,
|
||||||
|
.rx_tbl_num = ARRAY_SIZE(sm6350_usb3_rx_tbl),
|
||||||
|
.pcs_tbl = sm6350_usb3_pcs_tbl,
|
||||||
|
.pcs_tbl_num = ARRAY_SIZE(sm6350_usb3_pcs_tbl),
|
||||||
|
|
||||||
|
.dp_serdes_tbl = qmp_v3_dp_serdes_tbl,
|
||||||
|
.dp_serdes_tbl_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl),
|
||||||
|
.dp_tx_tbl = qmp_v3_dp_tx_tbl,
|
||||||
|
.dp_tx_tbl_num = ARRAY_SIZE(qmp_v3_dp_tx_tbl),
|
||||||
|
|
||||||
|
.serdes_tbl_rbr = qmp_v3_dp_serdes_tbl_rbr,
|
||||||
|
.serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr),
|
||||||
|
.serdes_tbl_hbr = qmp_v3_dp_serdes_tbl_hbr,
|
||||||
|
.serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr),
|
||||||
|
.serdes_tbl_hbr2 = qmp_v3_dp_serdes_tbl_hbr2,
|
||||||
|
.serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2),
|
||||||
|
.serdes_tbl_hbr3 = qmp_v3_dp_serdes_tbl_hbr3,
|
||||||
|
.serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3),
|
||||||
|
|
||||||
|
.swing_hbr_rbr = &qmp_dp_v3_voltage_swing_hbr_rbr,
|
||||||
|
.pre_emphasis_hbr_rbr = &qmp_dp_v3_pre_emphasis_hbr_rbr,
|
||||||
|
.swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2,
|
||||||
|
.pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2,
|
||||||
|
|
||||||
|
.dp_aux_init = qmp_v3_dp_aux_init,
|
||||||
|
.configure_dp_tx = qmp_v3_configure_dp_tx,
|
||||||
|
.configure_dp_phy = qmp_v3_configure_dp_phy,
|
||||||
|
.calibrate_dp_phy = qmp_v3_calibrate_dp_phy,
|
||||||
|
|
||||||
|
.clk_list = qmp_v4_phy_clk_l,
|
||||||
|
.num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
|
||||||
|
.reset_list = msm8996_usb3phy_reset_l,
|
||||||
|
.num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
|
||||||
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
|
.regs = qmp_v3_usb3phy_regs_layout,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_cfg sm8250_usb3dpphy_cfg = {
|
static const struct qmp_phy_cfg sm8250_usb3dpphy_cfg = {
|
||||||
.serdes_tbl = sm8150_usb3_serdes_tbl,
|
.serdes_tbl = sm8150_usb3_serdes_tbl,
|
||||||
.serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
|
.serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
|
||||||
|
@ -1220,6 +1708,102 @@ static const struct qmp_phy_cfg sm8250_usb3dpphy_cfg = {
|
||||||
.has_pwrdn_delay = true,
|
.has_pwrdn_delay = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_cfg sm8350_usb3dpphy_cfg = {
|
||||||
|
.offsets = &qmp_combo_offsets_v3,
|
||||||
|
|
||||||
|
.serdes_tbl = sm8150_usb3_serdes_tbl,
|
||||||
|
.serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
|
||||||
|
.tx_tbl = sm8350_usb3_tx_tbl,
|
||||||
|
.tx_tbl_num = ARRAY_SIZE(sm8350_usb3_tx_tbl),
|
||||||
|
.rx_tbl = sm8350_usb3_rx_tbl,
|
||||||
|
.rx_tbl_num = ARRAY_SIZE(sm8350_usb3_rx_tbl),
|
||||||
|
.pcs_tbl = sm8350_usb3_pcs_tbl,
|
||||||
|
.pcs_tbl_num = ARRAY_SIZE(sm8350_usb3_pcs_tbl),
|
||||||
|
.pcs_usb_tbl = sm8350_usb3_pcs_usb_tbl,
|
||||||
|
.pcs_usb_tbl_num = ARRAY_SIZE(sm8350_usb3_pcs_usb_tbl),
|
||||||
|
|
||||||
|
.dp_serdes_tbl = qmp_v4_dp_serdes_tbl,
|
||||||
|
.dp_serdes_tbl_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl),
|
||||||
|
.dp_tx_tbl = qmp_v5_dp_tx_tbl,
|
||||||
|
.dp_tx_tbl_num = ARRAY_SIZE(qmp_v5_dp_tx_tbl),
|
||||||
|
|
||||||
|
.serdes_tbl_rbr = qmp_v4_dp_serdes_tbl_rbr,
|
||||||
|
.serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr),
|
||||||
|
.serdes_tbl_hbr = qmp_v4_dp_serdes_tbl_hbr,
|
||||||
|
.serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr),
|
||||||
|
.serdes_tbl_hbr2 = qmp_v4_dp_serdes_tbl_hbr2,
|
||||||
|
.serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2),
|
||||||
|
.serdes_tbl_hbr3 = qmp_v4_dp_serdes_tbl_hbr3,
|
||||||
|
.serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3),
|
||||||
|
|
||||||
|
.swing_hbr_rbr = &qmp_dp_v4_voltage_swing_hbr_rbr,
|
||||||
|
.pre_emphasis_hbr_rbr = &qmp_dp_v4_pre_emphasis_hbr_rbr,
|
||||||
|
.swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2,
|
||||||
|
.pre_emphasis_hbr3_hbr2 = &qmp_dp_v4_pre_emphasis_hbr3_hbr2,
|
||||||
|
|
||||||
|
.dp_aux_init = qmp_v4_dp_aux_init,
|
||||||
|
.configure_dp_tx = qmp_v4_configure_dp_tx,
|
||||||
|
.configure_dp_phy = qmp_v4_configure_dp_phy,
|
||||||
|
.calibrate_dp_phy = qmp_v4_calibrate_dp_phy,
|
||||||
|
|
||||||
|
.clk_list = qmp_v4_phy_clk_l,
|
||||||
|
.num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
|
||||||
|
.reset_list = msm8996_usb3phy_reset_l,
|
||||||
|
.num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
|
||||||
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
|
.regs = qmp_v4_usb3phy_regs_layout,
|
||||||
|
|
||||||
|
.has_pwrdn_delay = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_cfg sm8550_usb3dpphy_cfg = {
|
||||||
|
.offsets = &qmp_combo_offsets_v6,
|
||||||
|
|
||||||
|
.serdes_tbl = sm8550_usb3_serdes_tbl,
|
||||||
|
.serdes_tbl_num = ARRAY_SIZE(sm8550_usb3_serdes_tbl),
|
||||||
|
.tx_tbl = sm8550_usb3_tx_tbl,
|
||||||
|
.tx_tbl_num = ARRAY_SIZE(sm8550_usb3_tx_tbl),
|
||||||
|
.rx_tbl = sm8550_usb3_rx_tbl,
|
||||||
|
.rx_tbl_num = ARRAY_SIZE(sm8550_usb3_rx_tbl),
|
||||||
|
.pcs_tbl = sm8550_usb3_pcs_tbl,
|
||||||
|
.pcs_tbl_num = ARRAY_SIZE(sm8550_usb3_pcs_tbl),
|
||||||
|
.pcs_usb_tbl = sm8550_usb3_pcs_usb_tbl,
|
||||||
|
.pcs_usb_tbl_num = ARRAY_SIZE(sm8550_usb3_pcs_usb_tbl),
|
||||||
|
|
||||||
|
.dp_serdes_tbl = qmp_v6_dp_serdes_tbl,
|
||||||
|
.dp_serdes_tbl_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl),
|
||||||
|
.dp_tx_tbl = qmp_v6_dp_tx_tbl,
|
||||||
|
.dp_tx_tbl_num = ARRAY_SIZE(qmp_v6_dp_tx_tbl),
|
||||||
|
|
||||||
|
.serdes_tbl_rbr = qmp_v6_dp_serdes_tbl_rbr,
|
||||||
|
.serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl_rbr),
|
||||||
|
.serdes_tbl_hbr = qmp_v6_dp_serdes_tbl_hbr,
|
||||||
|
.serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl_hbr),
|
||||||
|
.serdes_tbl_hbr2 = qmp_v6_dp_serdes_tbl_hbr2,
|
||||||
|
.serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl_hbr2),
|
||||||
|
.serdes_tbl_hbr3 = qmp_v6_dp_serdes_tbl_hbr3,
|
||||||
|
.serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl_hbr3),
|
||||||
|
|
||||||
|
.swing_hbr_rbr = &qmp_dp_v5_voltage_swing_hbr_rbr,
|
||||||
|
.pre_emphasis_hbr_rbr = &qmp_dp_v6_pre_emphasis_hbr_rbr,
|
||||||
|
.swing_hbr3_hbr2 = &qmp_dp_v5_voltage_swing_hbr3_hbr2,
|
||||||
|
.pre_emphasis_hbr3_hbr2 = &qmp_dp_v5_pre_emphasis_hbr3_hbr2,
|
||||||
|
|
||||||
|
.dp_aux_init = qmp_v6_dp_aux_init,
|
||||||
|
.configure_dp_tx = qmp_v4_configure_dp_tx,
|
||||||
|
.configure_dp_phy = qmp_v6_configure_dp_phy,
|
||||||
|
.calibrate_dp_phy = qmp_v4_calibrate_dp_phy,
|
||||||
|
|
||||||
|
.regs = qmp_v4_usb3phy_regs_layout,
|
||||||
|
.clk_list = qmp_v4_phy_clk_l,
|
||||||
|
.num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
|
||||||
|
.reset_list = msm8996_usb3phy_reset_l,
|
||||||
|
.num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
|
||||||
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
|
};
|
||||||
|
|
||||||
static void qmp_combo_configure_lane(void __iomem *base,
|
static void qmp_combo_configure_lane(void __iomem *base,
|
||||||
const struct qmp_phy_init_tbl tbl[],
|
const struct qmp_phy_init_tbl tbl[],
|
||||||
int num,
|
int num,
|
||||||
|
@ -1530,6 +2114,33 @@ static void qmp_v4_dp_aux_init(struct qmp_combo *qmp)
|
||||||
qmp->dp_dp_phy + QSERDES_V4_DP_PHY_AUX_INTERRUPT_MASK);
|
qmp->dp_dp_phy + QSERDES_V4_DP_PHY_AUX_INTERRUPT_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void qmp_v6_dp_aux_init(struct qmp_combo *qmp)
|
||||||
|
{
|
||||||
|
writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_PSR_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
|
||||||
|
DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
|
||||||
|
qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
|
||||||
|
|
||||||
|
/* Turn on BIAS current for PHY/PLL */
|
||||||
|
writel(0x17, qmp->dp_serdes + QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN);
|
||||||
|
|
||||||
|
writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0);
|
||||||
|
writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
|
||||||
|
writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2);
|
||||||
|
writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG3);
|
||||||
|
writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG4);
|
||||||
|
writel(0x26, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG5);
|
||||||
|
writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG6);
|
||||||
|
writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG7);
|
||||||
|
writel(0xb7, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG8);
|
||||||
|
writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG9);
|
||||||
|
qmp->dp_aux_cfg = 0;
|
||||||
|
|
||||||
|
writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK |
|
||||||
|
PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK |
|
||||||
|
PHY_AUX_REQ_ERR_MASK,
|
||||||
|
qmp->dp_dp_phy + QSERDES_V4_DP_PHY_AUX_INTERRUPT_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
static void qmp_v4_configure_dp_tx(struct qmp_combo *qmp)
|
static void qmp_v4_configure_dp_tx(struct qmp_combo *qmp)
|
||||||
{
|
{
|
||||||
/* Program default values before writing proper values */
|
/* Program default values before writing proper values */
|
||||||
|
@ -1543,7 +2154,10 @@ static void qmp_v4_configure_dp_tx(struct qmp_combo *qmp)
|
||||||
QSERDES_V4_TX_TX_EMP_POST1_LVL);
|
QSERDES_V4_TX_TX_EMP_POST1_LVL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qmp_v45_configure_dp_phy(struct qmp_combo *qmp)
|
static int qmp_v456_configure_dp_phy(struct qmp_combo *qmp,
|
||||||
|
unsigned int com_resetm_ctrl_reg,
|
||||||
|
unsigned int com_c_ready_status_reg,
|
||||||
|
unsigned int dp_phy_status_reg)
|
||||||
{
|
{
|
||||||
const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
|
const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
|
||||||
u32 phy_vco_div, status;
|
u32 phy_vco_div, status;
|
||||||
|
@ -1590,9 +2204,9 @@ static int qmp_v45_configure_dp_phy(struct qmp_combo *qmp)
|
||||||
writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
|
writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
|
||||||
writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
|
writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
|
||||||
|
|
||||||
writel(0x20, qmp->dp_serdes + QSERDES_V4_COM_RESETSM_CNTRL);
|
writel(0x20, qmp->dp_serdes + com_resetm_ctrl_reg);
|
||||||
|
|
||||||
if (readl_poll_timeout(qmp->dp_serdes + QSERDES_V4_COM_C_READY_STATUS,
|
if (readl_poll_timeout(qmp->dp_serdes + com_c_ready_status_reg,
|
||||||
status,
|
status,
|
||||||
((status & BIT(0)) > 0),
|
((status & BIT(0)) > 0),
|
||||||
500,
|
500,
|
||||||
|
@ -1615,14 +2229,14 @@ static int qmp_v45_configure_dp_phy(struct qmp_combo *qmp)
|
||||||
|
|
||||||
writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
|
writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
|
||||||
|
|
||||||
if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V4_DP_PHY_STATUS,
|
if (readl_poll_timeout(qmp->dp_dp_phy + dp_phy_status_reg,
|
||||||
status,
|
status,
|
||||||
((status & BIT(0)) > 0),
|
((status & BIT(0)) > 0),
|
||||||
500,
|
500,
|
||||||
10000))
|
10000))
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
|
|
||||||
if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V4_DP_PHY_STATUS,
|
if (readl_poll_timeout(qmp->dp_dp_phy + dp_phy_status_reg,
|
||||||
status,
|
status,
|
||||||
((status & BIT(1)) > 0),
|
((status & BIT(1)) > 0),
|
||||||
500,
|
500,
|
||||||
|
@ -1640,7 +2254,9 @@ static int qmp_v4_configure_dp_phy(struct qmp_combo *qmp)
|
||||||
u32 status;
|
u32 status;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = qmp_v45_configure_dp_phy(qmp);
|
ret = qmp_v456_configure_dp_phy(qmp, QSERDES_V4_COM_RESETSM_CNTRL,
|
||||||
|
QSERDES_V4_COM_C_READY_STATUS,
|
||||||
|
QSERDES_V4_DP_PHY_STATUS);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -1702,7 +2318,9 @@ static int qmp_v5_configure_dp_phy(struct qmp_combo *qmp)
|
||||||
u32 status;
|
u32 status;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = qmp_v45_configure_dp_phy(qmp);
|
ret = qmp_v456_configure_dp_phy(qmp, QSERDES_V4_COM_RESETSM_CNTRL,
|
||||||
|
QSERDES_V4_COM_C_READY_STATUS,
|
||||||
|
QSERDES_V4_DP_PHY_STATUS);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -1751,6 +2369,65 @@ static int qmp_v5_configure_dp_phy(struct qmp_combo *qmp)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int qmp_v6_configure_dp_phy(struct qmp_combo *qmp)
|
||||||
|
{
|
||||||
|
const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
|
||||||
|
u32 bias0_en, drvr0_en, bias1_en, drvr1_en;
|
||||||
|
bool reverse = false;
|
||||||
|
u32 status;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = qmp_v456_configure_dp_phy(qmp, QSERDES_V6_COM_RESETSM_CNTRL,
|
||||||
|
QSERDES_V6_COM_C_READY_STATUS,
|
||||||
|
QSERDES_V6_DP_PHY_STATUS);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (dp_opts->lanes == 1) {
|
||||||
|
bias0_en = reverse ? 0x3e : 0x1a;
|
||||||
|
drvr0_en = reverse ? 0x13 : 0x10;
|
||||||
|
bias1_en = reverse ? 0x15 : 0x3e;
|
||||||
|
drvr1_en = reverse ? 0x10 : 0x13;
|
||||||
|
} else if (dp_opts->lanes == 2) {
|
||||||
|
bias0_en = reverse ? 0x3f : 0x15;
|
||||||
|
drvr0_en = 0x10;
|
||||||
|
bias1_en = reverse ? 0x15 : 0x3f;
|
||||||
|
drvr1_en = 0x10;
|
||||||
|
} else {
|
||||||
|
bias0_en = 0x3f;
|
||||||
|
bias1_en = 0x3f;
|
||||||
|
drvr0_en = 0x10;
|
||||||
|
drvr1_en = 0x10;
|
||||||
|
}
|
||||||
|
|
||||||
|
writel(drvr0_en, qmp->dp_tx + QSERDES_V4_TX_HIGHZ_DRVR_EN);
|
||||||
|
writel(bias0_en, qmp->dp_tx + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN);
|
||||||
|
writel(drvr1_en, qmp->dp_tx2 + QSERDES_V4_TX_HIGHZ_DRVR_EN);
|
||||||
|
writel(bias1_en, qmp->dp_tx2 + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN);
|
||||||
|
|
||||||
|
writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
|
||||||
|
udelay(2000);
|
||||||
|
writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
|
||||||
|
|
||||||
|
if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V6_DP_PHY_STATUS,
|
||||||
|
status,
|
||||||
|
((status & BIT(1)) > 0),
|
||||||
|
500,
|
||||||
|
10000))
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
|
||||||
|
writel(0x0a, qmp->dp_tx + QSERDES_V4_TX_TX_POL_INV);
|
||||||
|
writel(0x0a, qmp->dp_tx2 + QSERDES_V4_TX_TX_POL_INV);
|
||||||
|
|
||||||
|
writel(0x27, qmp->dp_tx + QSERDES_V4_TX_TX_DRV_LVL);
|
||||||
|
writel(0x27, qmp->dp_tx2 + QSERDES_V4_TX_TX_DRV_LVL);
|
||||||
|
|
||||||
|
writel(0x20, qmp->dp_tx + QSERDES_V4_TX_TX_EMP_POST1_LVL);
|
||||||
|
writel(0x20, qmp->dp_tx2 + QSERDES_V4_TX_TX_EMP_POST1_LVL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need to calibrate the aux setting here as many times
|
* We need to calibrate the aux setting here as many times
|
||||||
* as the caller tries
|
* as the caller tries
|
||||||
|
@ -2641,8 +3318,13 @@ static int qmp_combo_parse_dt(struct qmp_combo *qmp)
|
||||||
qmp->pcs_usb = base + offs->usb3_pcs_usb;
|
qmp->pcs_usb = base + offs->usb3_pcs_usb;
|
||||||
|
|
||||||
qmp->dp_serdes = base + offs->dp_serdes;
|
qmp->dp_serdes = base + offs->dp_serdes;
|
||||||
qmp->dp_tx = base + offs->txa;
|
if (offs->dp_txa) {
|
||||||
qmp->dp_tx2 = base + offs->txb;
|
qmp->dp_tx = base + offs->dp_txa;
|
||||||
|
qmp->dp_tx2 = base + offs->dp_txb;
|
||||||
|
} else {
|
||||||
|
qmp->dp_tx = base + offs->txa;
|
||||||
|
qmp->dp_tx2 = base + offs->txb;
|
||||||
|
}
|
||||||
qmp->dp_dp_phy = base + offs->dp_dp_phy;
|
qmp->dp_dp_phy = base + offs->dp_dp_phy;
|
||||||
|
|
||||||
qmp->pipe_clk = devm_clk_get(dev, "usb3_pipe");
|
qmp->pipe_clk = devm_clk_get(dev, "usb3_pipe");
|
||||||
|
@ -2789,10 +3471,26 @@ static const struct of_device_id qmp_combo_of_match_table[] = {
|
||||||
.compatible = "qcom,sdm845-qmp-usb3-dp-phy",
|
.compatible = "qcom,sdm845-qmp-usb3-dp-phy",
|
||||||
.data = &sdm845_usb3dpphy_cfg,
|
.data = &sdm845_usb3dpphy_cfg,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.compatible = "qcom,sm6350-qmp-usb3-dp-phy",
|
||||||
|
.data = &sm6350_usb3dpphy_cfg,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.compatible = "qcom,sm8250-qmp-usb3-dp-phy",
|
.compatible = "qcom,sm8250-qmp-usb3-dp-phy",
|
||||||
.data = &sm8250_usb3dpphy_cfg,
|
.data = &sm8250_usb3dpphy_cfg,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.compatible = "qcom,sm8350-qmp-usb3-dp-phy",
|
||||||
|
.data = &sm8350_usb3dpphy_cfg,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.compatible = "qcom,sm8450-qmp-usb3-dp-phy",
|
||||||
|
.data = &sm8350_usb3dpphy_cfg,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.compatible = "qcom,sm8550-qmp-usb3-dp-phy",
|
||||||
|
.data = &sm8550_usb3dpphy_cfg,
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, qmp_combo_of_match_table);
|
MODULE_DEVICE_TABLE(of, qmp_combo_of_match_table);
|
||||||
|
|
|
@ -84,9 +84,9 @@ static const unsigned int pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
||||||
[QPHY_COM_POWER_DOWN_CONTROL] = 0x404,
|
[QPHY_COM_POWER_DOWN_CONTROL] = 0x404,
|
||||||
[QPHY_COM_START_CONTROL] = 0x408,
|
[QPHY_COM_START_CONTROL] = 0x408,
|
||||||
[QPHY_COM_PCS_READY_STATUS] = 0x448,
|
[QPHY_COM_PCS_READY_STATUS] = 0x448,
|
||||||
[QPHY_SW_RESET] = 0x00,
|
[QPHY_SW_RESET] = QPHY_V2_PCS_SW_RESET,
|
||||||
[QPHY_START_CTRL] = 0x08,
|
[QPHY_START_CTRL] = QPHY_V2_PCS_START_CONTROL,
|
||||||
[QPHY_PCS_STATUS] = 0x174,
|
[QPHY_PCS_STATUS] = QPHY_V2_PCS_PCI_PCS_STATUS,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl msm8996_pcie_serdes_tbl[] = {
|
static const struct qmp_phy_init_tbl msm8996_pcie_serdes_tbl[] = {
|
||||||
|
|
|
@ -24,6 +24,14 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
|
||||||
#include "phy-qcom-qmp.h"
|
#include "phy-qcom-qmp.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-misc-v3.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-pcie-v4.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-pcie-v4_20.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-pcie-v5.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-pcie-v5_20.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-pcie-v6.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-pcie-v6_20.h"
|
||||||
|
#include "phy-qcom-qmp-pcie-qhp.h"
|
||||||
|
|
||||||
/* QPHY_SW_RESET bit */
|
/* QPHY_SW_RESET bit */
|
||||||
#define SW_RESET BIT(0)
|
#define SW_RESET BIT(0)
|
||||||
|
@ -74,25 +82,18 @@ enum qphy_reg_layout {
|
||||||
QPHY_LAYOUT_SIZE
|
QPHY_LAYOUT_SIZE
|
||||||
};
|
};
|
||||||
|
|
||||||
static const unsigned int ipq_pciephy_gen3_regs_layout[QPHY_LAYOUT_SIZE] = {
|
static const unsigned int pciephy_v2_regs_layout[QPHY_LAYOUT_SIZE] = {
|
||||||
[QPHY_SW_RESET] = 0x00,
|
[QPHY_SW_RESET] = QPHY_V2_PCS_SW_RESET,
|
||||||
[QPHY_START_CTRL] = 0x44,
|
[QPHY_START_CTRL] = QPHY_V2_PCS_START_CONTROL,
|
||||||
[QPHY_PCS_STATUS] = 0x14,
|
[QPHY_PCS_STATUS] = QPHY_V2_PCS_PCI_PCS_STATUS,
|
||||||
[QPHY_PCS_POWER_DOWN_CONTROL] = 0x40,
|
[QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V2_PCS_POWER_DOWN_CONTROL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const unsigned int pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
static const unsigned int pciephy_v3_regs_layout[QPHY_LAYOUT_SIZE] = {
|
||||||
[QPHY_SW_RESET] = 0x00,
|
[QPHY_SW_RESET] = QPHY_V3_PCS_SW_RESET,
|
||||||
[QPHY_START_CTRL] = 0x08,
|
[QPHY_START_CTRL] = QPHY_V3_PCS_START_CONTROL,
|
||||||
[QPHY_PCS_STATUS] = 0x174,
|
[QPHY_PCS_STATUS] = QPHY_V3_PCS_PCS_STATUS,
|
||||||
[QPHY_PCS_POWER_DOWN_CONTROL] = 0x04,
|
[QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V3_PCS_POWER_DOWN_CONTROL,
|
||||||
};
|
|
||||||
|
|
||||||
static const unsigned int sdm845_qmp_pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
|
||||||
[QPHY_SW_RESET] = 0x00,
|
|
||||||
[QPHY_START_CTRL] = 0x08,
|
|
||||||
[QPHY_PCS_STATUS] = 0x174,
|
|
||||||
[QPHY_PCS_POWER_DOWN_CONTROL] = 0x04,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const unsigned int sdm845_qhp_pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
static const unsigned int sdm845_qhp_pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
||||||
|
@ -102,11 +103,18 @@ static const unsigned int sdm845_qhp_pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
||||||
[QPHY_PCS_POWER_DOWN_CONTROL] = 0x04,
|
[QPHY_PCS_POWER_DOWN_CONTROL] = 0x04,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const unsigned int sm8250_pcie_regs_layout[QPHY_LAYOUT_SIZE] = {
|
static const unsigned int pciephy_v4_regs_layout[QPHY_LAYOUT_SIZE] = {
|
||||||
[QPHY_SW_RESET] = 0x00,
|
[QPHY_SW_RESET] = QPHY_V4_PCS_SW_RESET,
|
||||||
[QPHY_START_CTRL] = 0x44,
|
[QPHY_START_CTRL] = QPHY_V4_PCS_START_CONTROL,
|
||||||
[QPHY_PCS_STATUS] = 0x14,
|
[QPHY_PCS_STATUS] = QPHY_V4_PCS_PCS_STATUS1,
|
||||||
[QPHY_PCS_POWER_DOWN_CONTROL] = 0x40,
|
[QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V4_PCS_POWER_DOWN_CONTROL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const unsigned int pciephy_v5_regs_layout[QPHY_LAYOUT_SIZE] = {
|
||||||
|
[QPHY_SW_RESET] = QPHY_V5_PCS_SW_RESET,
|
||||||
|
[QPHY_START_CTRL] = QPHY_V5_PCS_START_CONTROL,
|
||||||
|
[QPHY_PCS_STATUS] = QPHY_V5_PCS_PCS_STATUS1,
|
||||||
|
[QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V5_PCS_POWER_DOWN_CONTROL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl msm8998_pcie_serdes_tbl[] = {
|
static const struct qmp_phy_init_tbl msm8998_pcie_serdes_tbl[] = {
|
||||||
|
@ -1216,7 +1224,7 @@ static const struct qmp_phy_init_tbl sdx55_qmp_pcie_pcs_misc_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QPHY_V4_20_PCS_LANE1_INSIG_MX_CTRL2, 0x00),
|
QMP_PHY_INIT_CFG(QPHY_V4_20_PCS_LANE1_INSIG_MX_CTRL2, 0x00),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl sm8450_qmp_gen3x1_pcie_serdes_tbl[] = {
|
static const struct qmp_phy_init_tbl sm8450_qmp_gen3_pcie_serdes_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_EN_SEL, 0x08),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_EN_SEL, 0x08),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_CLK_SELECT, 0x34),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_CLK_SELECT, 0x34),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORECLK_DIV_MODE1, 0x08),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORECLK_DIV_MODE1, 0x08),
|
||||||
|
@ -1250,7 +1258,6 @@ static const struct qmp_phy_init_tbl sm8450_qmp_gen3x1_pcie_serdes_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x18),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x18),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xa2),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xa2),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_BUF_ENABLE, 0x07),
|
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_EN_CENTER, 0x01),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_EN_CENTER, 0x01),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER1, 0x31),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER1, 0x31),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER2, 0x01),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER2, 0x01),
|
||||||
|
@ -1261,6 +1268,10 @@ static const struct qmp_phy_init_tbl sm8450_qmp_gen3x1_pcie_serdes_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_CLK_ENABLE1, 0x90),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_CLK_ENABLE1, 0x90),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8450_qmp_gen3x1_pcie_rc_serdes_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_BUF_ENABLE, 0x07),
|
||||||
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl sm8450_qmp_gen3x1_pcie_tx_tbl[] = {
|
static const struct qmp_phy_init_tbl sm8450_qmp_gen3x1_pcie_tx_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_TX_PI_QEC_CTRL, 0x20),
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_PI_QEC_CTRL, 0x20),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0x75),
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0x75),
|
||||||
|
@ -1269,11 +1280,9 @@ static const struct qmp_phy_init_tbl sm8450_qmp_gen3x1_pcie_tx_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x04),
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x04),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl sm8450_qmp_gen3x1_pcie_rx_tbl[] = {
|
static const struct qmp_phy_init_tbl sm8450_qmp_gen3_pcie_rx_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0x7f),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0x7f),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0xff),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0xff),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xbf),
|
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3f),
|
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0xd8),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0xd8),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0xdc),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0xdc),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0xdc),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0xdc),
|
||||||
|
@ -1281,20 +1290,25 @@ static const struct qmp_phy_init_tbl sm8450_qmp_gen3x1_pcie_rx_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH3, 0x34),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH3, 0x34),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0xa6),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0xa6),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH3, 0x34),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH3, 0x34),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH4, 0x38),
|
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x07),
|
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_GM_CAL, 0x00),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_GM_CAL, 0x00),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH1, 0x08),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH1, 0x08),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH2, 0x08),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH2, 0x08),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0xf0),
|
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_TX_ADAPT_POST_THRESH, 0xf0),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_TX_ADAPT_POST_THRESH, 0xf0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8450_qmp_gen3x1_pcie_rc_rx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xbf),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH4, 0x38),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x07),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0xf0),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x07),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x07),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x09),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x09),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x05),
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x05),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl sm8450_qmp_gen3x1_pcie_pcs_tbl[] = {
|
static const struct qmp_phy_init_tbl sm8450_qmp_gen3_pcie_pcs_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_RX_SIGDET_LVL, 0x77),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_RX_SIGDET_LVL, 0x77),
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_RATE_SLEW_CNTRL1, 0x0b),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_RATE_SLEW_CNTRL1, 0x0b),
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_REFGEN_REQ_CONFIG1, 0x05),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_REFGEN_REQ_CONFIG1, 0x05),
|
||||||
|
@ -1307,6 +1321,40 @@ static const struct qmp_phy_init_tbl sm8450_qmp_gen3x1_pcie_pcs_misc_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_ENDPOINT_REFCLK_DRIVE, 0xc1),
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCIE_ENDPOINT_REFCLK_DRIVE, 0xc1),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8350_qmp_gen3x1_pcie_tx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_PI_QEC_CTRL, 0x20),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0x75),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_4, 0x3f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x1d),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x0c),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8350_qmp_gen3x1_pcie_rc_rx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xbf),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x07),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0xf0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8350_qmp_gen3x2_pcie_rc_rx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0x7f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x34),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x0f),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8350_qmp_gen3x2_pcie_tx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V5_TX_PI_QEC_CTRL, 0x02, 1),
|
||||||
|
QMP_PHY_INIT_CFG_LANE(QSERDES_V5_TX_PI_QEC_CTRL, 0x04, 2),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0xd5),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_4, 0x3f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x1d),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x0c),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8350_qmp_gen3x2_pcie_rc_pcs_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V5_PCS_EQ_CONFIG2, 0x0f),
|
||||||
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl sm8450_qmp_gen4x2_pcie_serdes_tbl[] = {
|
static const struct qmp_phy_init_tbl sm8450_qmp_gen4x2_pcie_serdes_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIAS_EN_CLKBUFLR_EN, 0x14),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIAS_EN_CLKBUFLR_EN, 0x14),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_IVCO, 0x0f),
|
QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_IVCO, 0x0f),
|
||||||
|
@ -1458,6 +1506,234 @@ static const struct qmp_phy_init_tbl sm8450_qmp_gen4x2_pcie_ep_pcs_misc_tbl[] =
|
||||||
QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_PCIE_OSC_DTCT_MODE2_CONFIG5, 0x08),
|
QMP_PHY_INIT_CFG(QPHY_V5_20_PCS_PCIE_OSC_DTCT_MODE2_CONFIG5, 0x08),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_qmp_gen3x2_pcie_serdes_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_EN_CENTER, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_PER1, 0x62),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_PER2, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE1_MODE0, 0xf8),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE2_MODE0, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE1_MODE1, 0x93),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE2_MODE1, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CLK_ENABLE1, 0x90),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYS_CLK_CTRL, 0x82),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x07),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE1, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE1, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x36),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE1, 0x36),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0x08),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BG_TIMER, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x42),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x0d),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE1, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE1, 0x1a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x41),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE1, 0x34),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE0, 0xab),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xaa),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE1, 0x55),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE1, 0x55),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE1, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x14),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CLK_SELECT, 0x34),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORECLK_DIV_MODE1, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_ADDITIONAL_MISC_3, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORE_CLK_EN, 0xa0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_qmp_gen3x2_pcie_tx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_1, 0x15),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_4, 0x3f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_PI_QEC_CTRL, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_RX, 0x06),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x18),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_qmp_gen3x2_pcie_rx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_GM_CAL, 0x11),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_00_HIGH, 0xbf),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_00_HIGH2, 0xbf),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_00_HIGH3, 0xb7),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_00_HIGH4, 0xea),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_00_LOW, 0x3f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH, 0x5c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH2, 0x9c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH3, 0x1a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH4, 0x89),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_LOW, 0xdc),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_10_HIGH, 0x94),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_10_HIGH2, 0x5b),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_10_HIGH3, 0x1a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_10_HIGH4, 0x89),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_TX_ADAPT_POST_THRESH, 0xf0),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FO_GAIN, 0x09),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SO_GAIN, 0x05),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_THRESH1, 0x08),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_THRESH2, 0x08),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_VGA_CAL_CNTRL2, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIDGET_ENABLES, 0x1c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_IDAC_TSETTLE_LOW, 0x07),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_CAL_TRIM, 0x08),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_qmp_gen3x2_pcie_pcs_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V6_PCS_REFGEN_REQ_CONFIG1, 0x05),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V6_PCS_RX_SIGDET_LVL, 0x77),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V6_PCS_RATE_SLEW_CNTRL1, 0x0b),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V6_PCS_EQ_CONFIG2, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V6_PCS_PCS_TX_RX_CONFIG, 0x8c),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_qmp_gen3x2_pcie_pcs_misc_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_PCS_PCIE_POWER_STATE_CONFIG2, 0x1d),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_PCS_PCIE_POWER_STATE_CONFIG4, 0x07),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_PCS_PCIE_ENDPOINT_REFCLK_DRIVE, 0xc1),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_PCS_PCIE_OSC_DTCT_ACTIONS, 0x00),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_qmp_gen4x2_pcie_serdes_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE1_MODE1, 0x26),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE2_MODE1, 0x03),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE1, 0x06),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE1, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE1, 0x36),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORECLK_DIV_MODE1, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE1, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE1, 0x1a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE1, 0x68),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE1, 0xab),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE1, 0xaa),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE1, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x12),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE1_MODE0, 0xf8),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE2_MODE0, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x06),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x36),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CORE_CLK_DIV_MODE0, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x0d),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x41),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE0, 0xab),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xaa),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_HS_SWITCH_SEL_1, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_BG_TIMER, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_EN_CENTER, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_PER1, 0x62),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_PER2, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_POST_DIV_MUX, 0x40),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN, 0x14),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CLK_ENABLE1, 0x90),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYS_CLK_CTRL, 0x82),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0x08),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x46),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_CFG, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x14),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CLK_SELECT, 0x34),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORE_CLK_EN, 0xa0),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x06),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_MISC_1, 0x88),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_MODE, 0x14),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_VCO_DC_LEVEL_CTRL, 0x0f),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_qmp_gen4x2_pcie_ln_shrd_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RXCLK_DIV2_CTRL, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_Q_EN_RATES, 0xe),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_DFE_DAC_ENABLE1, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_TX_ADAPT_POST_THRESH1, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_TX_ADAPT_POST_THRESH2, 0x1f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B0, 0x12),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B1, 0x12),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B2, 0xdb),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B3, 0x9a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B4, 0x38),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B5, 0xb6),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B6, 0x64),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH1_RATE210, 0x1f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH1_RATE3, 0x1f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH2_RATE210, 0x1f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH2_RATE3, 0x1f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH3_RATE210, 0x1f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH3_RATE3, 0x1f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH4_RATE3, 0x1f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH5_RATE3, 0x1f),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH6_RATE3, 0x1f),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_qmp_gen4x2_pcie_tx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_TX_RES_CODE_LANE_OFFSET_TX, 0x1d),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_TX_RES_CODE_LANE_OFFSET_RX, 0x03),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_TX_LANE_MODE_1, 0x01),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_TX_LANE_MODE_2, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_TX_LANE_MODE_3, 0x51),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_TX_TRAN_DRVR_EMP_EN, 0x34),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_qmp_gen4x2_pcie_rx_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_UCDR_FO_GAIN_RATE_2, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_UCDR_FO_GAIN_RATE_3, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_UCDR_PI_CONTROLS, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_UCDR_SO_ACC_DEFAULT_VAL_RATE3, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_IVCM_CAL_CTRL2, 0x80),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_IVCM_POSTCAL_OFFSET, 0x7c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_DFE_3, 0x05),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_VGA_CAL_MAN_VAL, 0x0a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_GM_CAL, 0x0d),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_EQU_ADAPTOR_CNTRL4, 0x0b),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_SIGDET_ENABLES, 0x1c),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_PHPRE_CTRL, 0x20),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_DFE_CTLE_POST_CAL_OFFSET, 0x30),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_Q_PI_INTRINSIC_BIAS_RATE32, 0x09),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE2_B0, 0x14),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE2_B1, 0xb3),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE2_B2, 0x58),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE2_B3, 0x9a),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE2_B4, 0x26),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE2_B5, 0xb6),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE2_B6, 0xee),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE3_B0, 0xdb),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE3_B1, 0xdb),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE3_B2, 0xa0),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE3_B3, 0xdf),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE3_B4, 0x78),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE3_B5, 0x76),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_V6_20_RX_MODE_RATE3_B6, 0xff),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_qmp_gen4x2_pcie_pcs_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V6_20_PCS_G3S2_PRE_GAIN, 0x2e),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V6_20_PCS_COM_ELECIDLE_DLY_SEL, 0x25),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V6_20_PCS_EQ_CONFIG4, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V6_20_PCS_EQ_CONFIG5, 0x22),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V6_20_PCS_TX_RX_CONFIG1, 0x04),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_V6_20_PCS_TX_RX_CONFIG2, 0x02),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_init_tbl sm8550_qmp_gen4x2_pcie_pcs_misc_tbl[] = {
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_20_PCS_ENDPOINT_REFCLK_DRIVE, 0xc1),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_20_PCS_OSC_DTCT_ATCIONS, 0x00),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_20_PCS_EQ_CONFIG1, 0x16),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_20_PCS_EQ_CONFIG5, 0x02),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_20_PCS_G4_PRE_GAIN, 0x2e),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_20_PCS_RX_MARGINING_CONFIG1, 0x03),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_20_PCS_RX_MARGINING_CONFIG3, 0x28),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_20_PCS_TX_RX_CONFIG, 0xc0),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_20_PCS_POWER_STATE_CONFIG2, 0x1d),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_20_PCS_RX_MARGINING_CONFIG5, 0x0f),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_20_PCS_G3_FOM_EQ_CONFIG5, 0xf2),
|
||||||
|
QMP_PHY_INIT_CFG(QPHY_PCIE_V6_20_PCS_G4_FOM_EQ_CONFIG5, 0xf2),
|
||||||
|
};
|
||||||
|
|
||||||
struct qmp_pcie_offsets {
|
struct qmp_pcie_offsets {
|
||||||
u16 serdes;
|
u16 serdes;
|
||||||
u16 pcs;
|
u16 pcs;
|
||||||
|
@ -1466,6 +1742,7 @@ struct qmp_pcie_offsets {
|
||||||
u16 rx;
|
u16 rx;
|
||||||
u16 tx2;
|
u16 tx2;
|
||||||
u16 rx2;
|
u16 rx2;
|
||||||
|
u16 ln_shrd;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct qmp_phy_cfg_tbls {
|
struct qmp_phy_cfg_tbls {
|
||||||
|
@ -1479,6 +1756,8 @@ struct qmp_phy_cfg_tbls {
|
||||||
int pcs_num;
|
int pcs_num;
|
||||||
const struct qmp_phy_init_tbl *pcs_misc;
|
const struct qmp_phy_init_tbl *pcs_misc;
|
||||||
int pcs_misc_num;
|
int pcs_misc_num;
|
||||||
|
const struct qmp_phy_init_tbl *ln_shrd;
|
||||||
|
int ln_shrd_num;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* struct qmp_phy_cfg - per-PHY initialization config */
|
/* struct qmp_phy_cfg - per-PHY initialization config */
|
||||||
|
@ -1521,6 +1800,8 @@ struct qmp_phy_cfg {
|
||||||
|
|
||||||
bool skip_start_delay;
|
bool skip_start_delay;
|
||||||
|
|
||||||
|
bool has_nocsr_reset;
|
||||||
|
|
||||||
/* QMP PHY pipe clock interface rate */
|
/* QMP PHY pipe clock interface rate */
|
||||||
unsigned long pipe_clock_rate;
|
unsigned long pipe_clock_rate;
|
||||||
};
|
};
|
||||||
|
@ -1538,6 +1819,7 @@ struct qmp_pcie {
|
||||||
void __iomem *rx;
|
void __iomem *rx;
|
||||||
void __iomem *tx2;
|
void __iomem *tx2;
|
||||||
void __iomem *rx2;
|
void __iomem *rx2;
|
||||||
|
void __iomem *ln_shrd;
|
||||||
|
|
||||||
void __iomem *port_b;
|
void __iomem *port_b;
|
||||||
|
|
||||||
|
@ -1546,6 +1828,7 @@ struct qmp_pcie {
|
||||||
int num_pipe_clks;
|
int num_pipe_clks;
|
||||||
|
|
||||||
struct reset_control_bulk_data *resets;
|
struct reset_control_bulk_data *resets;
|
||||||
|
struct reset_control *nocsr_reset;
|
||||||
struct regulator_bulk_data *vregs;
|
struct regulator_bulk_data *vregs;
|
||||||
|
|
||||||
struct phy *phy;
|
struct phy *phy;
|
||||||
|
@ -1600,6 +1883,10 @@ static const char * const qmp_phy_vreg_l[] = {
|
||||||
"vdda-phy", "vdda-pll",
|
"vdda-phy", "vdda-pll",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char * const sm8550_qmp_phy_vreg_l[] = {
|
||||||
|
"vdda-phy", "vdda-pll", "vdda-qref",
|
||||||
|
};
|
||||||
|
|
||||||
/* list of resets */
|
/* list of resets */
|
||||||
static const char * const ipq8074_pciephy_reset_l[] = {
|
static const char * const ipq8074_pciephy_reset_l[] = {
|
||||||
"phy", "common",
|
"phy", "common",
|
||||||
|
@ -1619,6 +1906,17 @@ static const struct qmp_pcie_offsets qmp_pcie_offsets_v5 = {
|
||||||
.rx2 = 0x1800,
|
.rx2 = 0x1800,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_pcie_offsets qmp_pcie_offsets_v6_20 = {
|
||||||
|
.serdes = 0x1000,
|
||||||
|
.pcs = 0x1200,
|
||||||
|
.pcs_misc = 0x1400,
|
||||||
|
.tx = 0x0000,
|
||||||
|
.rx = 0x0200,
|
||||||
|
.tx2 = 0x0800,
|
||||||
|
.rx2 = 0x0a00,
|
||||||
|
.ln_shrd = 0x0e00,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_cfg ipq8074_pciephy_cfg = {
|
static const struct qmp_phy_cfg ipq8074_pciephy_cfg = {
|
||||||
.lanes = 1,
|
.lanes = 1,
|
||||||
|
|
||||||
|
@ -1638,7 +1936,7 @@ static const struct qmp_phy_cfg ipq8074_pciephy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
|
||||||
.vreg_list = NULL,
|
.vreg_list = NULL,
|
||||||
.num_vregs = 0,
|
.num_vregs = 0,
|
||||||
.regs = pciephy_regs_layout,
|
.regs = pciephy_v2_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
.phy_status = PHYSTATUS,
|
.phy_status = PHYSTATUS,
|
||||||
|
@ -1665,7 +1963,7 @@ static const struct qmp_phy_cfg ipq8074_pciephy_gen3_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
|
||||||
.vreg_list = NULL,
|
.vreg_list = NULL,
|
||||||
.num_vregs = 0,
|
.num_vregs = 0,
|
||||||
.regs = ipq_pciephy_gen3_regs_layout,
|
.regs = pciephy_v4_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
.phy_status = PHYSTATUS,
|
.phy_status = PHYSTATUS,
|
||||||
|
@ -1694,7 +1992,7 @@ static const struct qmp_phy_cfg ipq6018_pciephy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
|
||||||
.vreg_list = NULL,
|
.vreg_list = NULL,
|
||||||
.num_vregs = 0,
|
.num_vregs = 0,
|
||||||
.regs = ipq_pciephy_gen3_regs_layout,
|
.regs = pciephy_v4_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
.phy_status = PHYSTATUS,
|
.phy_status = PHYSTATUS,
|
||||||
|
@ -1721,7 +2019,7 @@ static const struct qmp_phy_cfg sdm845_qmp_pciephy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = sdm845_qmp_pciephy_regs_layout,
|
.regs = pciephy_v3_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
.phy_status = PHYSTATUS,
|
.phy_status = PHYSTATUS,
|
||||||
|
@ -1783,7 +2081,7 @@ static const struct qmp_phy_cfg sm8250_qmp_gen3x1_pciephy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = sm8250_pcie_regs_layout,
|
.regs = pciephy_v4_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
.phy_status = PHYSTATUS,
|
.phy_status = PHYSTATUS,
|
||||||
|
@ -1820,7 +2118,7 @@ static const struct qmp_phy_cfg sm8250_qmp_gen3x2_pciephy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = sm8250_pcie_regs_layout,
|
.regs = pciephy_v4_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
.phy_status = PHYSTATUS,
|
.phy_status = PHYSTATUS,
|
||||||
|
@ -1845,7 +2143,7 @@ static const struct qmp_phy_cfg msm8998_pciephy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = pciephy_regs_layout,
|
.regs = pciephy_v3_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
.phy_status = PHYSTATUS,
|
.phy_status = PHYSTATUS,
|
||||||
|
@ -1874,7 +2172,7 @@ static const struct qmp_phy_cfg sc8180x_pciephy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = sm8250_pcie_regs_layout,
|
.regs = pciephy_v4_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
.phy_status = PHYSTATUS,
|
.phy_status = PHYSTATUS,
|
||||||
|
@ -1909,7 +2207,7 @@ static const struct qmp_phy_cfg sc8280xp_qmp_gen3x1_pciephy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = sm8250_pcie_regs_layout,
|
.regs = pciephy_v5_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
.phy_status = PHYSTATUS,
|
.phy_status = PHYSTATUS,
|
||||||
|
@ -1944,7 +2242,7 @@ static const struct qmp_phy_cfg sc8280xp_qmp_gen3x2_pciephy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = sm8250_pcie_regs_layout,
|
.regs = pciephy_v5_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
.phy_status = PHYSTATUS,
|
.phy_status = PHYSTATUS,
|
||||||
|
@ -1982,7 +2280,7 @@ static const struct qmp_phy_cfg sc8280xp_qmp_gen3x4_pciephy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = sm8250_pcie_regs_layout,
|
.regs = pciephy_v5_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
.phy_status = PHYSTATUS,
|
.phy_status = PHYSTATUS,
|
||||||
|
@ -2009,34 +2307,116 @@ static const struct qmp_phy_cfg sdx55_qmp_pciephy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = sm8250_pcie_regs_layout,
|
.regs = pciephy_v4_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN,
|
.pwrdn_ctrl = SW_PWRDN,
|
||||||
.phy_status = PHYSTATUS_4_20,
|
.phy_status = PHYSTATUS_4_20,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_cfg sm8350_qmp_gen3x1_pciephy_cfg = {
|
||||||
|
.lanes = 1,
|
||||||
|
|
||||||
|
.offsets = &qmp_pcie_offsets_v5,
|
||||||
|
|
||||||
|
.tbls = {
|
||||||
|
.serdes = sm8450_qmp_gen3_pcie_serdes_tbl,
|
||||||
|
.serdes_num = ARRAY_SIZE(sm8450_qmp_gen3_pcie_serdes_tbl),
|
||||||
|
.tx = sm8350_qmp_gen3x1_pcie_tx_tbl,
|
||||||
|
.tx_num = ARRAY_SIZE(sm8350_qmp_gen3x1_pcie_tx_tbl),
|
||||||
|
.rx = sm8450_qmp_gen3_pcie_rx_tbl,
|
||||||
|
.rx_num = ARRAY_SIZE(sm8450_qmp_gen3_pcie_rx_tbl),
|
||||||
|
.pcs = sm8450_qmp_gen3_pcie_pcs_tbl,
|
||||||
|
.pcs_num = ARRAY_SIZE(sm8450_qmp_gen3_pcie_pcs_tbl),
|
||||||
|
.pcs_misc = sm8450_qmp_gen3x1_pcie_pcs_misc_tbl,
|
||||||
|
.pcs_misc_num = ARRAY_SIZE(sm8450_qmp_gen3x1_pcie_pcs_misc_tbl),
|
||||||
|
},
|
||||||
|
|
||||||
|
.tbls_rc = &(const struct qmp_phy_cfg_tbls) {
|
||||||
|
.serdes = sm8450_qmp_gen3x1_pcie_rc_serdes_tbl,
|
||||||
|
.serdes_num = ARRAY_SIZE(sm8450_qmp_gen3x1_pcie_rc_serdes_tbl),
|
||||||
|
.rx = sm8350_qmp_gen3x1_pcie_rc_rx_tbl,
|
||||||
|
.rx_num = ARRAY_SIZE(sm8350_qmp_gen3x1_pcie_rc_rx_tbl),
|
||||||
|
},
|
||||||
|
|
||||||
|
.clk_list = sc8280xp_pciephy_clk_l,
|
||||||
|
.num_clks = ARRAY_SIZE(sc8280xp_pciephy_clk_l),
|
||||||
|
.reset_list = sdm845_pciephy_reset_l,
|
||||||
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
|
.regs = pciephy_v5_regs_layout,
|
||||||
|
|
||||||
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
|
.phy_status = PHYSTATUS,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_cfg sm8350_qmp_gen3x2_pciephy_cfg = {
|
||||||
|
.lanes = 2,
|
||||||
|
|
||||||
|
.offsets = &qmp_pcie_offsets_v5,
|
||||||
|
|
||||||
|
.tbls = {
|
||||||
|
.serdes = sm8450_qmp_gen3_pcie_serdes_tbl,
|
||||||
|
.serdes_num = ARRAY_SIZE(sm8450_qmp_gen3_pcie_serdes_tbl),
|
||||||
|
.tx = sm8350_qmp_gen3x2_pcie_tx_tbl,
|
||||||
|
.tx_num = ARRAY_SIZE(sm8350_qmp_gen3x2_pcie_tx_tbl),
|
||||||
|
.rx = sm8450_qmp_gen3_pcie_rx_tbl,
|
||||||
|
.rx_num = ARRAY_SIZE(sm8450_qmp_gen3_pcie_rx_tbl),
|
||||||
|
.pcs = sm8450_qmp_gen3_pcie_pcs_tbl,
|
||||||
|
.pcs_num = ARRAY_SIZE(sm8450_qmp_gen3_pcie_pcs_tbl),
|
||||||
|
.pcs_misc = sc8280xp_qmp_gen3x2_pcie_pcs_misc_tbl,
|
||||||
|
.pcs_misc_num = ARRAY_SIZE(sc8280xp_qmp_gen3x2_pcie_pcs_misc_tbl),
|
||||||
|
},
|
||||||
|
|
||||||
|
.tbls_rc = &(const struct qmp_phy_cfg_tbls) {
|
||||||
|
.rx = sm8350_qmp_gen3x2_pcie_rc_rx_tbl,
|
||||||
|
.rx_num = ARRAY_SIZE(sm8350_qmp_gen3x2_pcie_rc_rx_tbl),
|
||||||
|
.pcs = sm8350_qmp_gen3x2_pcie_rc_pcs_tbl,
|
||||||
|
.pcs_num = ARRAY_SIZE(sm8350_qmp_gen3x2_pcie_rc_pcs_tbl),
|
||||||
|
},
|
||||||
|
|
||||||
|
.clk_list = sc8280xp_pciephy_clk_l,
|
||||||
|
.num_clks = ARRAY_SIZE(sc8280xp_pciephy_clk_l),
|
||||||
|
.reset_list = sdm845_pciephy_reset_l,
|
||||||
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
|
.regs = pciephy_v5_regs_layout,
|
||||||
|
|
||||||
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
|
.phy_status = PHYSTATUS,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_cfg sm8450_qmp_gen3x1_pciephy_cfg = {
|
static const struct qmp_phy_cfg sm8450_qmp_gen3x1_pciephy_cfg = {
|
||||||
.lanes = 1,
|
.lanes = 1,
|
||||||
|
|
||||||
.tbls = {
|
.tbls = {
|
||||||
.serdes = sm8450_qmp_gen3x1_pcie_serdes_tbl,
|
.serdes = sm8450_qmp_gen3_pcie_serdes_tbl,
|
||||||
.serdes_num = ARRAY_SIZE(sm8450_qmp_gen3x1_pcie_serdes_tbl),
|
.serdes_num = ARRAY_SIZE(sm8450_qmp_gen3_pcie_serdes_tbl),
|
||||||
.tx = sm8450_qmp_gen3x1_pcie_tx_tbl,
|
.tx = sm8450_qmp_gen3x1_pcie_tx_tbl,
|
||||||
.tx_num = ARRAY_SIZE(sm8450_qmp_gen3x1_pcie_tx_tbl),
|
.tx_num = ARRAY_SIZE(sm8450_qmp_gen3x1_pcie_tx_tbl),
|
||||||
.rx = sm8450_qmp_gen3x1_pcie_rx_tbl,
|
.rx = sm8450_qmp_gen3_pcie_rx_tbl,
|
||||||
.rx_num = ARRAY_SIZE(sm8450_qmp_gen3x1_pcie_rx_tbl),
|
.rx_num = ARRAY_SIZE(sm8450_qmp_gen3_pcie_rx_tbl),
|
||||||
.pcs = sm8450_qmp_gen3x1_pcie_pcs_tbl,
|
.pcs = sm8450_qmp_gen3_pcie_pcs_tbl,
|
||||||
.pcs_num = ARRAY_SIZE(sm8450_qmp_gen3x1_pcie_pcs_tbl),
|
.pcs_num = ARRAY_SIZE(sm8450_qmp_gen3_pcie_pcs_tbl),
|
||||||
.pcs_misc = sm8450_qmp_gen3x1_pcie_pcs_misc_tbl,
|
.pcs_misc = sm8450_qmp_gen3x1_pcie_pcs_misc_tbl,
|
||||||
.pcs_misc_num = ARRAY_SIZE(sm8450_qmp_gen3x1_pcie_pcs_misc_tbl),
|
.pcs_misc_num = ARRAY_SIZE(sm8450_qmp_gen3x1_pcie_pcs_misc_tbl),
|
||||||
},
|
},
|
||||||
|
|
||||||
|
.tbls_rc = &(const struct qmp_phy_cfg_tbls) {
|
||||||
|
.serdes = sm8450_qmp_gen3x1_pcie_rc_serdes_tbl,
|
||||||
|
.serdes_num = ARRAY_SIZE(sm8450_qmp_gen3x1_pcie_rc_serdes_tbl),
|
||||||
|
.rx = sm8450_qmp_gen3x1_pcie_rc_rx_tbl,
|
||||||
|
.rx_num = ARRAY_SIZE(sm8450_qmp_gen3x1_pcie_rc_rx_tbl),
|
||||||
|
},
|
||||||
|
|
||||||
.clk_list = sdm845_pciephy_clk_l,
|
.clk_list = sdm845_pciephy_clk_l,
|
||||||
.num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l),
|
.num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l),
|
||||||
.reset_list = sdm845_pciephy_reset_l,
|
.reset_list = sdm845_pciephy_reset_l,
|
||||||
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = sm8250_pcie_regs_layout,
|
.regs = pciephy_v5_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
.phy_status = PHYSTATUS,
|
.phy_status = PHYSTATUS,
|
||||||
|
@ -2078,12 +2458,73 @@ static const struct qmp_phy_cfg sm8450_qmp_gen4x2_pciephy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = sm8250_pcie_regs_layout,
|
.regs = pciephy_v5_regs_layout,
|
||||||
|
|
||||||
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
.phy_status = PHYSTATUS_4_20,
|
.phy_status = PHYSTATUS_4_20,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_cfg sm8550_qmp_gen3x2_pciephy_cfg = {
|
||||||
|
.lanes = 2,
|
||||||
|
|
||||||
|
.offsets = &qmp_pcie_offsets_v5,
|
||||||
|
|
||||||
|
.tbls = {
|
||||||
|
.serdes = sm8550_qmp_gen3x2_pcie_serdes_tbl,
|
||||||
|
.serdes_num = ARRAY_SIZE(sm8550_qmp_gen3x2_pcie_serdes_tbl),
|
||||||
|
.tx = sm8550_qmp_gen3x2_pcie_tx_tbl,
|
||||||
|
.tx_num = ARRAY_SIZE(sm8550_qmp_gen3x2_pcie_tx_tbl),
|
||||||
|
.rx = sm8550_qmp_gen3x2_pcie_rx_tbl,
|
||||||
|
.rx_num = ARRAY_SIZE(sm8550_qmp_gen3x2_pcie_rx_tbl),
|
||||||
|
.pcs = sm8550_qmp_gen3x2_pcie_pcs_tbl,
|
||||||
|
.pcs_num = ARRAY_SIZE(sm8550_qmp_gen3x2_pcie_pcs_tbl),
|
||||||
|
.pcs_misc = sm8550_qmp_gen3x2_pcie_pcs_misc_tbl,
|
||||||
|
.pcs_misc_num = ARRAY_SIZE(sm8550_qmp_gen3x2_pcie_pcs_misc_tbl),
|
||||||
|
},
|
||||||
|
.clk_list = sc8280xp_pciephy_clk_l,
|
||||||
|
.num_clks = ARRAY_SIZE(sc8280xp_pciephy_clk_l),
|
||||||
|
.reset_list = sdm845_pciephy_reset_l,
|
||||||
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
|
.regs = pciephy_v5_regs_layout,
|
||||||
|
|
||||||
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
|
.phy_status = PHYSTATUS,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qmp_phy_cfg sm8550_qmp_gen4x2_pciephy_cfg = {
|
||||||
|
.lanes = 2,
|
||||||
|
|
||||||
|
.offsets = &qmp_pcie_offsets_v6_20,
|
||||||
|
|
||||||
|
.tbls = {
|
||||||
|
.serdes = sm8550_qmp_gen4x2_pcie_serdes_tbl,
|
||||||
|
.serdes_num = ARRAY_SIZE(sm8550_qmp_gen4x2_pcie_serdes_tbl),
|
||||||
|
.tx = sm8550_qmp_gen4x2_pcie_tx_tbl,
|
||||||
|
.tx_num = ARRAY_SIZE(sm8550_qmp_gen4x2_pcie_tx_tbl),
|
||||||
|
.rx = sm8550_qmp_gen4x2_pcie_rx_tbl,
|
||||||
|
.rx_num = ARRAY_SIZE(sm8550_qmp_gen4x2_pcie_rx_tbl),
|
||||||
|
.pcs = sm8550_qmp_gen4x2_pcie_pcs_tbl,
|
||||||
|
.pcs_num = ARRAY_SIZE(sm8550_qmp_gen4x2_pcie_pcs_tbl),
|
||||||
|
.pcs_misc = sm8550_qmp_gen4x2_pcie_pcs_misc_tbl,
|
||||||
|
.pcs_misc_num = ARRAY_SIZE(sm8550_qmp_gen4x2_pcie_pcs_misc_tbl),
|
||||||
|
.ln_shrd = sm8550_qmp_gen4x2_pcie_ln_shrd_tbl,
|
||||||
|
.ln_shrd_num = ARRAY_SIZE(sm8550_qmp_gen4x2_pcie_ln_shrd_tbl),
|
||||||
|
},
|
||||||
|
.clk_list = sc8280xp_pciephy_clk_l,
|
||||||
|
.num_clks = ARRAY_SIZE(sc8280xp_pciephy_clk_l),
|
||||||
|
.reset_list = sdm845_pciephy_reset_l,
|
||||||
|
.num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
|
||||||
|
.vreg_list = sm8550_qmp_phy_vreg_l,
|
||||||
|
.num_vregs = ARRAY_SIZE(sm8550_qmp_phy_vreg_l),
|
||||||
|
.regs = pciephy_v5_regs_layout,
|
||||||
|
|
||||||
|
.pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
|
||||||
|
.phy_status = PHYSTATUS_4_20,
|
||||||
|
.has_nocsr_reset = true,
|
||||||
|
};
|
||||||
|
|
||||||
static void qmp_pcie_configure_lane(void __iomem *base,
|
static void qmp_pcie_configure_lane(void __iomem *base,
|
||||||
const struct qmp_phy_init_tbl tbl[],
|
const struct qmp_phy_init_tbl tbl[],
|
||||||
int num,
|
int num,
|
||||||
|
@ -2138,6 +2579,7 @@ static void qmp_pcie_init_registers(struct qmp_pcie *qmp, const struct qmp_phy_c
|
||||||
void __iomem *rx2 = qmp->rx2;
|
void __iomem *rx2 = qmp->rx2;
|
||||||
void __iomem *pcs = qmp->pcs;
|
void __iomem *pcs = qmp->pcs;
|
||||||
void __iomem *pcs_misc = qmp->pcs_misc;
|
void __iomem *pcs_misc = qmp->pcs_misc;
|
||||||
|
void __iomem *ln_shrd = qmp->ln_shrd;
|
||||||
|
|
||||||
if (!tbls)
|
if (!tbls)
|
||||||
return;
|
return;
|
||||||
|
@ -2159,6 +2601,8 @@ static void qmp_pcie_init_registers(struct qmp_pcie *qmp, const struct qmp_phy_c
|
||||||
qmp_pcie_configure(serdes, cfg->serdes_4ln_tbl, cfg->serdes_4ln_num);
|
qmp_pcie_configure(serdes, cfg->serdes_4ln_tbl, cfg->serdes_4ln_num);
|
||||||
qmp_pcie_init_port_b(qmp, tbls);
|
qmp_pcie_init_port_b(qmp, tbls);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qmp_pcie_configure(ln_shrd, tbls->ln_shrd, tbls->ln_shrd_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qmp_pcie_init(struct phy *phy)
|
static int qmp_pcie_init(struct phy *phy)
|
||||||
|
@ -2179,12 +2623,18 @@ static int qmp_pcie_init(struct phy *phy)
|
||||||
goto err_disable_regulators;
|
goto err_disable_regulators;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = reset_control_assert(qmp->nocsr_reset);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(qmp->dev, "no-csr reset assert failed\n");
|
||||||
|
goto err_assert_reset;
|
||||||
|
}
|
||||||
|
|
||||||
usleep_range(200, 300);
|
usleep_range(200, 300);
|
||||||
|
|
||||||
ret = reset_control_bulk_deassert(cfg->num_resets, qmp->resets);
|
ret = reset_control_bulk_deassert(cfg->num_resets, qmp->resets);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(qmp->dev, "reset deassert failed\n");
|
dev_err(qmp->dev, "reset deassert failed\n");
|
||||||
goto err_disable_regulators;
|
goto err_assert_reset;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
|
ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
|
||||||
|
@ -2240,6 +2690,12 @@ static int qmp_pcie_power_on(struct phy *phy)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
ret = reset_control_deassert(qmp->nocsr_reset);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(qmp->dev, "no-csr reset deassert failed\n");
|
||||||
|
goto err_disable_pipe_clk;
|
||||||
|
}
|
||||||
|
|
||||||
/* Pull PHY out of reset state */
|
/* Pull PHY out of reset state */
|
||||||
qphy_clrbits(pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
|
qphy_clrbits(pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
|
||||||
|
|
||||||
|
@ -2373,6 +2829,13 @@ static int qmp_pcie_reset_init(struct qmp_pcie *qmp)
|
||||||
if (ret)
|
if (ret)
|
||||||
return dev_err_probe(dev, ret, "failed to get resets\n");
|
return dev_err_probe(dev, ret, "failed to get resets\n");
|
||||||
|
|
||||||
|
if (cfg->has_nocsr_reset) {
|
||||||
|
qmp->nocsr_reset = devm_reset_control_get_exclusive(dev, "phy_nocsr");
|
||||||
|
if (IS_ERR(qmp->nocsr_reset))
|
||||||
|
return dev_err_probe(dev, PTR_ERR(qmp->nocsr_reset),
|
||||||
|
"failed to get no-csr reset\n");
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2595,11 +3058,18 @@ static int qmp_pcie_parse_dt(struct qmp_pcie *qmp)
|
||||||
return PTR_ERR(qmp->port_b);
|
return PTR_ERR(qmp->port_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cfg->tbls.ln_shrd)
|
||||||
|
qmp->ln_shrd = base + offs->ln_shrd;
|
||||||
|
|
||||||
qmp->num_pipe_clks = 2;
|
qmp->num_pipe_clks = 2;
|
||||||
qmp->pipe_clks[0].id = "pipe";
|
qmp->pipe_clks[0].id = "pipe";
|
||||||
qmp->pipe_clks[1].id = "pipediv2";
|
qmp->pipe_clks[1].id = "pipediv2";
|
||||||
|
|
||||||
ret = devm_clk_bulk_get(dev, qmp->num_pipe_clks, qmp->pipe_clks);
|
ret = devm_clk_bulk_get(dev, 1, qmp->pipe_clks);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = devm_clk_bulk_get_optional(dev, qmp->num_pipe_clks - 1, qmp->pipe_clks + 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -2719,12 +3189,24 @@ static const struct of_device_id qmp_pcie_of_match_table[] = {
|
||||||
}, {
|
}, {
|
||||||
.compatible = "qcom,sm8250-qmp-modem-pcie-phy",
|
.compatible = "qcom,sm8250-qmp-modem-pcie-phy",
|
||||||
.data = &sm8250_qmp_gen3x2_pciephy_cfg,
|
.data = &sm8250_qmp_gen3x2_pciephy_cfg,
|
||||||
|
}, {
|
||||||
|
.compatible = "qcom,sm8350-qmp-gen3x1-pcie-phy",
|
||||||
|
.data = &sm8350_qmp_gen3x1_pciephy_cfg,
|
||||||
|
}, {
|
||||||
|
.compatible = "qcom,sm8350-qmp-gen3x2-pcie-phy",
|
||||||
|
.data = &sm8350_qmp_gen3x2_pciephy_cfg,
|
||||||
}, {
|
}, {
|
||||||
.compatible = "qcom,sm8450-qmp-gen3x1-pcie-phy",
|
.compatible = "qcom,sm8450-qmp-gen3x1-pcie-phy",
|
||||||
.data = &sm8450_qmp_gen3x1_pciephy_cfg,
|
.data = &sm8450_qmp_gen3x1_pciephy_cfg,
|
||||||
}, {
|
}, {
|
||||||
.compatible = "qcom,sm8450-qmp-gen4x2-pcie-phy",
|
.compatible = "qcom,sm8450-qmp-gen4x2-pcie-phy",
|
||||||
.data = &sm8450_qmp_gen4x2_pciephy_cfg,
|
.data = &sm8450_qmp_gen4x2_pciephy_cfg,
|
||||||
|
}, {
|
||||||
|
.compatible = "qcom,sm8550-qmp-gen3x2-pcie-phy",
|
||||||
|
.data = &sm8550_qmp_gen3x2_pciephy_cfg,
|
||||||
|
}, {
|
||||||
|
.compatible = "qcom,sm8550-qmp-gen4x2-pcie-phy",
|
||||||
|
.data = &sm8550_qmp_gen4x2_pciephy_cfg,
|
||||||
},
|
},
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
15
drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v6.h
Normal file
15
drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v6.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Linaro Limited
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QCOM_PHY_QMP_PCS_PCIE_V6_H_
|
||||||
|
#define QCOM_PHY_QMP_PCS_PCIE_V6_H_
|
||||||
|
|
||||||
|
/* Only for QMP V6 PHY - PCIE have different offsets than V5 */
|
||||||
|
#define QPHY_PCIE_V6_PCS_PCIE_POWER_STATE_CONFIG2 0x0c
|
||||||
|
#define QPHY_PCIE_V6_PCS_PCIE_POWER_STATE_CONFIG4 0x14
|
||||||
|
#define QPHY_PCIE_V6_PCS_PCIE_ENDPOINT_REFCLK_DRIVE 0x20
|
||||||
|
#define QPHY_PCIE_V6_PCS_PCIE_OSC_DTCT_ACTIONS 0x94
|
||||||
|
|
||||||
|
#endif
|
23
drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v6_20.h
Normal file
23
drivers/phy/qualcomm/phy-qcom-qmp-pcs-pcie-v6_20.h
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Linaro Limited
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QCOM_PHY_QMP_PCS_PCIE_V6_20_H_
|
||||||
|
#define QCOM_PHY_QMP_PCS_PCIE_V6_20_H_
|
||||||
|
|
||||||
|
/* Only for QMP V6_20 PHY - PCIE have different offsets than V5 */
|
||||||
|
#define QPHY_PCIE_V6_20_PCS_POWER_STATE_CONFIG2 0x00c
|
||||||
|
#define QPHY_PCIE_V6_20_PCS_TX_RX_CONFIG 0x018
|
||||||
|
#define QPHY_PCIE_V6_20_PCS_ENDPOINT_REFCLK_DRIVE 0x01c
|
||||||
|
#define QPHY_PCIE_V6_20_PCS_OSC_DTCT_ATCIONS 0x090
|
||||||
|
#define QPHY_PCIE_V6_20_PCS_EQ_CONFIG1 0x0a0
|
||||||
|
#define QPHY_PCIE_V6_20_PCS_EQ_CONFIG5 0x108
|
||||||
|
#define QPHY_PCIE_V6_20_PCS_G4_PRE_GAIN 0x15c
|
||||||
|
#define QPHY_PCIE_V6_20_PCS_RX_MARGINING_CONFIG1 0x17c
|
||||||
|
#define QPHY_PCIE_V6_20_PCS_RX_MARGINING_CONFIG3 0x184
|
||||||
|
#define QPHY_PCIE_V6_20_PCS_RX_MARGINING_CONFIG5 0x18c
|
||||||
|
#define QPHY_PCIE_V6_20_PCS_G3_FOM_EQ_CONFIG5 0x1ac
|
||||||
|
#define QPHY_PCIE_V6_20_PCS_G4_FOM_EQ_CONFIG5 0x1c0
|
||||||
|
|
||||||
|
#endif
|
25
drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v2.h
Normal file
25
drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v2.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017, The Linux Foundation. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QCOM_PHY_QMP_PCS_UFS_V2_H_
|
||||||
|
#define QCOM_PHY_QMP_PCS_UFS_V2_H_
|
||||||
|
|
||||||
|
#define QPHY_V2_PCS_UFS_PHY_START 0x000
|
||||||
|
#define QPHY_V2_PCS_UFS_POWER_DOWN_CONTROL 0x004
|
||||||
|
|
||||||
|
#define QPHY_V2_PCS_UFS_TX_LARGE_AMP_DRV_LVL 0x034
|
||||||
|
#define QPHY_V2_PCS_UFS_TX_LARGE_AMP_POST_EMP_LVL 0x038
|
||||||
|
#define QPHY_V2_PCS_UFS_TX_SMALL_AMP_DRV_LVL 0x03c
|
||||||
|
#define QPHY_V2_PCS_UFS_TX_SMALL_AMP_POST_EMP_LVL 0x040
|
||||||
|
|
||||||
|
#define QPHY_V2_PCS_UFS_RX_MIN_STALL_NOCONFIG_TIME_CAP 0x0cc
|
||||||
|
#define QPHY_V2_PCS_UFS_RX_SYM_RESYNC_CTRL 0x13c
|
||||||
|
#define QPHY_V2_PCS_UFS_RX_MIN_HIBERN8_TIME 0x140
|
||||||
|
#define QPHY_V2_PCS_UFS_RX_SIGDET_CTRL2 0x148
|
||||||
|
#define QPHY_V2_PCS_UFS_RX_PWM_GEAR_BAND 0x154
|
||||||
|
|
||||||
|
#define QPHY_V2_PCS_UFS_READY_STATUS 0x168
|
||||||
|
|
||||||
|
#endif
|
|
@ -6,12 +6,15 @@
|
||||||
#ifndef QCOM_PHY_QMP_PCS_UFS_V3_H_
|
#ifndef QCOM_PHY_QMP_PCS_UFS_V3_H_
|
||||||
#define QCOM_PHY_QMP_PCS_UFS_V3_H_
|
#define QCOM_PHY_QMP_PCS_UFS_V3_H_
|
||||||
|
|
||||||
|
#define QPHY_V3_PCS_UFS_PHY_START 0x000
|
||||||
|
#define QPHY_V3_PCS_UFS_POWER_DOWN_CONTROL 0x004
|
||||||
#define QPHY_V3_PCS_UFS_TX_LARGE_AMP_DRV_LVL 0x02c
|
#define QPHY_V3_PCS_UFS_TX_LARGE_AMP_DRV_LVL 0x02c
|
||||||
#define QPHY_V3_PCS_UFS_TX_SMALL_AMP_DRV_LVL 0x034
|
#define QPHY_V3_PCS_UFS_TX_SMALL_AMP_DRV_LVL 0x034
|
||||||
#define QPHY_V3_PCS_UFS_RX_SYM_RESYNC_CTRL 0x134
|
#define QPHY_V3_PCS_UFS_RX_SYM_RESYNC_CTRL 0x134
|
||||||
#define QPHY_V3_PCS_UFS_RX_MIN_HIBERN8_TIME 0x138
|
#define QPHY_V3_PCS_UFS_RX_MIN_HIBERN8_TIME 0x138
|
||||||
#define QPHY_V3_PCS_UFS_RX_SIGDET_CTRL1 0x13c
|
#define QPHY_V3_PCS_UFS_RX_SIGDET_CTRL1 0x13c
|
||||||
#define QPHY_V3_PCS_UFS_RX_SIGDET_CTRL2 0x140
|
#define QPHY_V3_PCS_UFS_RX_SIGDET_CTRL2 0x140
|
||||||
|
#define QPHY_V3_PCS_UFS_READY_STATUS 0x160
|
||||||
#define QPHY_V3_PCS_UFS_TX_MID_TERM_CTRL1 0x1bc
|
#define QPHY_V3_PCS_UFS_TX_MID_TERM_CTRL1 0x1bc
|
||||||
#define QPHY_V3_PCS_UFS_MULTI_LANE_CTRL1 0x1c4
|
#define QPHY_V3_PCS_UFS_MULTI_LANE_CTRL1 0x1c4
|
||||||
|
|
||||||
|
|
|
@ -8,11 +8,15 @@
|
||||||
#define QCOM_PHY_QMP_PCS_UFS_V5_H_
|
#define QCOM_PHY_QMP_PCS_UFS_V5_H_
|
||||||
|
|
||||||
/* Only for QMP V5 PHY - UFS PCS registers */
|
/* Only for QMP V5 PHY - UFS PCS registers */
|
||||||
|
#define QPHY_V5_PCS_UFS_PHY_START 0x000
|
||||||
|
#define QPHY_V5_PCS_UFS_POWER_DOWN_CONTROL 0x004
|
||||||
|
#define QPHY_V5_PCS_UFS_SW_RESET 0x008
|
||||||
#define QPHY_V5_PCS_UFS_TIMER_20US_CORECLK_STEPS_MSB 0x00c
|
#define QPHY_V5_PCS_UFS_TIMER_20US_CORECLK_STEPS_MSB 0x00c
|
||||||
#define QPHY_V5_PCS_UFS_TIMER_20US_CORECLK_STEPS_LSB 0x010
|
#define QPHY_V5_PCS_UFS_TIMER_20US_CORECLK_STEPS_LSB 0x010
|
||||||
#define QPHY_V5_PCS_UFS_PLL_CNTL 0x02c
|
#define QPHY_V5_PCS_UFS_PLL_CNTL 0x02c
|
||||||
#define QPHY_V5_PCS_UFS_TX_LARGE_AMP_DRV_LVL 0x030
|
#define QPHY_V5_PCS_UFS_TX_LARGE_AMP_DRV_LVL 0x030
|
||||||
#define QPHY_V5_PCS_UFS_TX_SMALL_AMP_DRV_LVL 0x038
|
#define QPHY_V5_PCS_UFS_TX_SMALL_AMP_DRV_LVL 0x038
|
||||||
|
#define QPHY_V5_PCS_UFS_BIST_FIXED_PAT_CTRL 0x060
|
||||||
#define QPHY_V5_PCS_UFS_TX_HSGEAR_CAPABILITY 0x074
|
#define QPHY_V5_PCS_UFS_TX_HSGEAR_CAPABILITY 0x074
|
||||||
#define QPHY_V5_PCS_UFS_RX_HSGEAR_CAPABILITY 0x0b4
|
#define QPHY_V5_PCS_UFS_RX_HSGEAR_CAPABILITY 0x0b4
|
||||||
#define QPHY_V5_PCS_UFS_DEBUG_BUS_CLKSEL 0x124
|
#define QPHY_V5_PCS_UFS_DEBUG_BUS_CLKSEL 0x124
|
||||||
|
@ -21,6 +25,7 @@
|
||||||
#define QPHY_V5_PCS_UFS_RX_SIGDET_CTRL2 0x158
|
#define QPHY_V5_PCS_UFS_RX_SIGDET_CTRL2 0x158
|
||||||
#define QPHY_V5_PCS_UFS_TX_PWM_GEAR_BAND 0x160
|
#define QPHY_V5_PCS_UFS_TX_PWM_GEAR_BAND 0x160
|
||||||
#define QPHY_V5_PCS_UFS_TX_HS_GEAR_BAND 0x168
|
#define QPHY_V5_PCS_UFS_TX_HS_GEAR_BAND 0x168
|
||||||
|
#define QPHY_V5_PCS_UFS_READY_STATUS 0x180
|
||||||
#define QPHY_V5_PCS_UFS_TX_MID_TERM_CTRL1 0x1d8
|
#define QPHY_V5_PCS_UFS_TX_MID_TERM_CTRL1 0x1d8
|
||||||
#define QPHY_V5_PCS_UFS_MULTI_LANE_CTRL1 0x1e0
|
#define QPHY_V5_PCS_UFS_MULTI_LANE_CTRL1 0x1e0
|
||||||
|
|
||||||
|
|
31
drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v6.h
Normal file
31
drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v6.h
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Linaro Limited
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QCOM_PHY_QMP_PCS_UFS_V6_H_
|
||||||
|
#define QCOM_PHY_QMP_PCS_UFS_V6_H_
|
||||||
|
|
||||||
|
/* Only for QMP V6 PHY - UFS PCS registers */
|
||||||
|
#define QPHY_V6_PCS_UFS_PHY_START 0x000
|
||||||
|
#define QPHY_V6_PCS_UFS_POWER_DOWN_CONTROL 0x004
|
||||||
|
#define QPHY_V6_PCS_UFS_SW_RESET 0x008
|
||||||
|
#define QPHY_V6_PCS_UFS_TIMER_20US_CORECLK_STEPS_MSB 0x00c
|
||||||
|
#define QPHY_V6_PCS_UFS_TIMER_20US_CORECLK_STEPS_LSB 0x010
|
||||||
|
#define QPHY_V6_PCS_UFS_PLL_CNTL 0x02c
|
||||||
|
#define QPHY_V6_PCS_UFS_TX_LARGE_AMP_DRV_LVL 0x030
|
||||||
|
#define QPHY_V6_PCS_UFS_TX_SMALL_AMP_DRV_LVL 0x038
|
||||||
|
#define QPHY_V6_PCS_UFS_BIST_FIXED_PAT_CTRL 0x060
|
||||||
|
#define QPHY_V6_PCS_UFS_TX_HSGEAR_CAPABILITY 0x074
|
||||||
|
#define QPHY_V6_PCS_UFS_RX_HSGEAR_CAPABILITY 0x0bc
|
||||||
|
#define QPHY_V6_PCS_UFS_DEBUG_BUS_CLKSEL 0x158
|
||||||
|
#define QPHY_V6_PCS_UFS_LINECFG_DISABLE 0x17c
|
||||||
|
#define QPHY_V6_PCS_UFS_RX_MIN_HIBERN8_TIME 0x184
|
||||||
|
#define QPHY_V6_PCS_UFS_RX_SIGDET_CTRL2 0x18c
|
||||||
|
#define QPHY_V6_PCS_UFS_TX_PWM_GEAR_BAND 0x178
|
||||||
|
#define QPHY_V6_PCS_UFS_TX_HS_GEAR_BAND 0x174
|
||||||
|
#define QPHY_V6_PCS_UFS_READY_STATUS 0x1a8
|
||||||
|
#define QPHY_V6_PCS_UFS_TX_MID_TERM_CTRL1 0x1f4
|
||||||
|
#define QPHY_V6_PCS_UFS_MULTI_LANE_CTRL1 0x1fc
|
||||||
|
|
||||||
|
#endif
|
31
drivers/phy/qualcomm/phy-qcom-qmp-pcs-usb-v6.h
Normal file
31
drivers/phy/qualcomm/phy-qcom-qmp-pcs-usb-v6.h
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022, The Linux Foundation. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QCOM_PHY_QMP_PCS_USB_V6_H_
|
||||||
|
#define QCOM_PHY_QMP_PCS_USB_V6_H_
|
||||||
|
|
||||||
|
/* Only for QMP V6 PHY - USB3 have different offsets than V5 */
|
||||||
|
#define QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG1 0xc4
|
||||||
|
#define QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG2 0xc8
|
||||||
|
#define QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG3 0xcc
|
||||||
|
#define QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG6 0xd8
|
||||||
|
#define QPHY_USB_V6_PCS_REFGEN_REQ_CONFIG1 0xdc
|
||||||
|
#define QPHY_USB_V6_PCS_USB3_POWER_STATE_CONFIG1 0x90
|
||||||
|
#define QPHY_USB_V6_PCS_RX_SIGDET_LVL 0x188
|
||||||
|
#define QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_L 0x190
|
||||||
|
#define QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_H 0x194
|
||||||
|
#define QPHY_USB_V6_PCS_CDR_RESET_TIME 0x1b0
|
||||||
|
#define QPHY_USB_V6_PCS_ALIGN_DETECT_CONFIG1 0x1c0
|
||||||
|
#define QPHY_USB_V6_PCS_ALIGN_DETECT_CONFIG2 0x1c4
|
||||||
|
#define QPHY_USB_V6_PCS_PCS_TX_RX_CONFIG 0x1d0
|
||||||
|
#define QPHY_USB_V6_PCS_EQ_CONFIG1 0x1dc
|
||||||
|
#define QPHY_USB_V6_PCS_EQ_CONFIG5 0x1ec
|
||||||
|
|
||||||
|
#define QPHY_USB_V6_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL 0x18
|
||||||
|
#define QPHY_USB_V6_PCS_USB3_RXEQTRAINING_DFE_TIME_S2 0x3c
|
||||||
|
#define QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_L 0x40
|
||||||
|
#define QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_H 0x44
|
||||||
|
|
||||||
|
#endif
|
|
@ -7,13 +7,11 @@
|
||||||
#define QCOM_PHY_QMP_PCS_V2_H_
|
#define QCOM_PHY_QMP_PCS_V2_H_
|
||||||
|
|
||||||
/* Only for QMP V2 PHY - PCS registers */
|
/* Only for QMP V2 PHY - PCS registers */
|
||||||
|
#define QPHY_V2_PCS_SW_RESET 0x000
|
||||||
#define QPHY_V2_PCS_POWER_DOWN_CONTROL 0x004
|
#define QPHY_V2_PCS_POWER_DOWN_CONTROL 0x004
|
||||||
|
#define QPHY_V2_PCS_START_CONTROL 0x008
|
||||||
#define QPHY_V2_PCS_TXDEEMPH_M6DB_V0 0x024
|
#define QPHY_V2_PCS_TXDEEMPH_M6DB_V0 0x024
|
||||||
#define QPHY_V2_PCS_TXDEEMPH_M3P5DB_V0 0x028
|
#define QPHY_V2_PCS_TXDEEMPH_M3P5DB_V0 0x028
|
||||||
#define QPHY_V2_PCS_TX_LARGE_AMP_DRV_LVL 0x034
|
|
||||||
#define QPHY_V2_PCS_TX_LARGE_AMP_POST_EMP_LVL 0x038
|
|
||||||
#define QPHY_V2_PCS_TX_SMALL_AMP_DRV_LVL 0x03c
|
|
||||||
#define QPHY_V2_PCS_TX_SMALL_AMP_POST_EMP_LVL 0x040
|
|
||||||
#define QPHY_V2_PCS_ENDPOINT_REFCLK_DRIVE 0x054
|
#define QPHY_V2_PCS_ENDPOINT_REFCLK_DRIVE 0x054
|
||||||
#define QPHY_V2_PCS_RX_IDLE_DTCT_CNTRL 0x058
|
#define QPHY_V2_PCS_RX_IDLE_DTCT_CNTRL 0x058
|
||||||
#define QPHY_V2_PCS_POWER_STATE_CONFIG1 0x060
|
#define QPHY_V2_PCS_POWER_STATE_CONFIG1 0x060
|
||||||
|
@ -30,17 +28,16 @@
|
||||||
#define QPHY_V2_PCS_FLL_CNT_VAL_L 0x0c8
|
#define QPHY_V2_PCS_FLL_CNT_VAL_L 0x0c8
|
||||||
#define QPHY_V2_PCS_FLL_CNT_VAL_H_TOL 0x0cc
|
#define QPHY_V2_PCS_FLL_CNT_VAL_H_TOL 0x0cc
|
||||||
#define QPHY_V2_PCS_FLL_MAN_CODE 0x0d0
|
#define QPHY_V2_PCS_FLL_MAN_CODE 0x0d0
|
||||||
|
#define QPHY_V2_PCS_AUTONOMOUS_MODE_CTRL 0x0d4
|
||||||
/* UFS only ? */
|
#define QPHY_V2_PCS_LFPS_RXTERM_IRQ_CLEAR 0x0d8
|
||||||
#define QPHY_V2_PCS_RX_MIN_STALL_NOCONFIG_TIME_CAP 0x0cc
|
#define QPHY_V2_PCS_LFPS_RXTERM_IRQ_STATUS 0x178
|
||||||
#define QPHY_V2_PCS_RX_SYM_RESYNC_CTRL 0x13c
|
#define QPHY_V2_PCS_USB_PCS_STATUS 0x17c /* USB */
|
||||||
#define QPHY_V2_PCS_RX_MIN_HIBERN8_TIME 0x140
|
|
||||||
#define QPHY_V2_PCS_RX_SIGDET_CTRL2 0x148
|
|
||||||
#define QPHY_V2_PCS_RX_PWM_GEAR_BAND 0x154
|
|
||||||
#define QPHY_V2_PCS_PLL_LOCK_CHK_DLY_TIME_AUXCLK_LSB 0x1a8
|
#define QPHY_V2_PCS_PLL_LOCK_CHK_DLY_TIME_AUXCLK_LSB 0x1a8
|
||||||
#define QPHY_V2_PCS_OSC_DTCT_ACTIONS 0x1ac
|
#define QPHY_V2_PCS_OSC_DTCT_ACTIONS 0x1ac
|
||||||
#define QPHY_V2_PCS_RX_SIGDET_LVL 0x1d8
|
#define QPHY_V2_PCS_RX_SIGDET_LVL 0x1d8
|
||||||
#define QPHY_V2_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB 0x1dc
|
#define QPHY_V2_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB 0x1dc
|
||||||
#define QPHY_V2_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB 0x1e0
|
#define QPHY_V2_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB 0x1e0
|
||||||
|
|
||||||
|
#define QPHY_V2_PCS_PCI_PCS_STATUS 0x174 /* PCI */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -7,6 +7,10 @@
|
||||||
#define QCOM_PHY_QMP_PCS_V5_H_
|
#define QCOM_PHY_QMP_PCS_V5_H_
|
||||||
|
|
||||||
/* Only for QMP V5 PHY - USB/PCIe PCS registers */
|
/* Only for QMP V5 PHY - USB/PCIe PCS registers */
|
||||||
|
#define QPHY_V5_PCS_SW_RESET 0x000
|
||||||
|
#define QPHY_V5_PCS_PCS_STATUS1 0x014
|
||||||
|
#define QPHY_V5_PCS_POWER_DOWN_CONTROL 0x040
|
||||||
|
#define QPHY_V5_PCS_START_CONTROL 0x044
|
||||||
#define QPHY_V5_PCS_LOCK_DETECT_CONFIG1 0x0c4
|
#define QPHY_V5_PCS_LOCK_DETECT_CONFIG1 0x0c4
|
||||||
#define QPHY_V5_PCS_LOCK_DETECT_CONFIG2 0x0c8
|
#define QPHY_V5_PCS_LOCK_DETECT_CONFIG2 0x0c8
|
||||||
#define QPHY_V5_PCS_LOCK_DETECT_CONFIG3 0x0cc
|
#define QPHY_V5_PCS_LOCK_DETECT_CONFIG3 0x0cc
|
||||||
|
|
16
drivers/phy/qualcomm/phy-qcom-qmp-pcs-v6.h
Normal file
16
drivers/phy/qualcomm/phy-qcom-qmp-pcs-v6.h
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Linaro Limited
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QCOM_PHY_QMP_PCS_V6_H_
|
||||||
|
#define QCOM_PHY_QMP_PCS_V6_H_
|
||||||
|
|
||||||
|
/* Only for QMP V6 PHY - USB/PCIe PCS registers */
|
||||||
|
#define QPHY_V6_PCS_REFGEN_REQ_CONFIG1 0xdc
|
||||||
|
#define QPHY_V6_PCS_RX_SIGDET_LVL 0x188
|
||||||
|
#define QPHY_V6_PCS_RATE_SLEW_CNTRL1 0x198
|
||||||
|
#define QPHY_V6_PCS_EQ_CONFIG2 0x1e0
|
||||||
|
#define QPHY_V6_PCS_PCS_TX_RX_CONFIG 0x1d0
|
||||||
|
|
||||||
|
#endif
|
18
drivers/phy/qualcomm/phy-qcom-qmp-pcs-v6_20.h
Normal file
18
drivers/phy/qualcomm/phy-qcom-qmp-pcs-v6_20.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Linaro Limited
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QCOM_PHY_QMP_PCS_V6_20_H_
|
||||||
|
#define QCOM_PHY_QMP_PCS_V6_20_H_
|
||||||
|
|
||||||
|
/* Only for QMP V6_20 PHY - USB/PCIe PCS registers */
|
||||||
|
#define QPHY_V6_20_PCS_G3S2_PRE_GAIN 0x178
|
||||||
|
#define QPHY_V6_20_PCS_RX_SIGDET_LVL 0x190
|
||||||
|
#define QPHY_V6_20_PCS_COM_ELECIDLE_DLY_SEL 0x1b8
|
||||||
|
#define QPHY_V6_20_PCS_TX_RX_CONFIG1 0x1dc
|
||||||
|
#define QPHY_V6_20_PCS_TX_RX_CONFIG2 0x1e0
|
||||||
|
#define QPHY_V6_20_PCS_EQ_CONFIG4 0x1f8
|
||||||
|
#define QPHY_V6_20_PCS_EQ_CONFIG5 0x1fc
|
||||||
|
|
||||||
|
#endif
|
82
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-com-v6.h
Normal file
82
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-com-v6.h
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Linaro Limited
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QCOM_PHY_QMP_QSERDES_COM_V6_H_
|
||||||
|
#define QCOM_PHY_QMP_QSERDES_COM_V6_H_
|
||||||
|
|
||||||
|
/* Only for QMP V6 PHY - QSERDES COM registers */
|
||||||
|
|
||||||
|
#define QSERDES_V6_COM_SSC_STEP_SIZE1_MODE1 0x00
|
||||||
|
#define QSERDES_V6_COM_SSC_STEP_SIZE2_MODE1 0x04
|
||||||
|
#define QSERDES_V6_COM_CP_CTRL_MODE1 0x10
|
||||||
|
#define QSERDES_V6_COM_PLL_RCTRL_MODE1 0x14
|
||||||
|
#define QSERDES_V6_COM_PLL_CCTRL_MODE1 0x18
|
||||||
|
#define QSERDES_V6_COM_CORECLK_DIV_MODE1 0x1c
|
||||||
|
#define QSERDES_V6_COM_LOCK_CMP1_MODE1 0x20
|
||||||
|
#define QSERDES_V6_COM_LOCK_CMP2_MODE1 0x24
|
||||||
|
#define QSERDES_V6_COM_DEC_START_MODE1 0x28
|
||||||
|
#define QSERDES_V6_COM_DEC_START_MSB_MODE1 0x2c
|
||||||
|
#define QSERDES_V6_COM_DIV_FRAC_START1_MODE1 0x30
|
||||||
|
#define QSERDES_V6_COM_DIV_FRAC_START2_MODE1 0x34
|
||||||
|
#define QSERDES_V6_COM_DIV_FRAC_START3_MODE1 0x38
|
||||||
|
#define QSERDES_V6_COM_HSCLK_SEL_1 0x3c
|
||||||
|
#define QSERDES_V6_COM_VCO_TUNE1_MODE1 0x48
|
||||||
|
#define QSERDES_V6_COM_VCO_TUNE2_MODE1 0x4c
|
||||||
|
#define QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE1 0x50
|
||||||
|
#define QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE1 0x54
|
||||||
|
#define QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0 0x58
|
||||||
|
#define QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0 0x5c
|
||||||
|
#define QSERDES_V6_COM_SSC_STEP_SIZE1_MODE0 0x60
|
||||||
|
#define QSERDES_V6_COM_SSC_STEP_SIZE2_MODE0 0x64
|
||||||
|
#define QSERDES_V6_COM_CP_CTRL_MODE0 0x70
|
||||||
|
#define QSERDES_V6_COM_PLL_RCTRL_MODE0 0x74
|
||||||
|
#define QSERDES_V6_COM_PLL_CCTRL_MODE0 0x78
|
||||||
|
#define QSERDES_V6_COM_PLL_CORE_CLK_DIV_MODE0 0x7c
|
||||||
|
#define QSERDES_V6_COM_LOCK_CMP1_MODE0 0x80
|
||||||
|
#define QSERDES_V6_COM_LOCK_CMP2_MODE0 0x84
|
||||||
|
#define QSERDES_V6_COM_DEC_START_MODE0 0x88
|
||||||
|
#define QSERDES_V6_COM_DEC_START_MSB_MODE0 0x8c
|
||||||
|
#define QSERDES_V6_COM_DIV_FRAC_START1_MODE0 0x90
|
||||||
|
#define QSERDES_V6_COM_DIV_FRAC_START2_MODE0 0x94
|
||||||
|
#define QSERDES_V6_COM_DIV_FRAC_START3_MODE0 0x98
|
||||||
|
#define QSERDES_V6_COM_HSCLK_HS_SWITCH_SEL_1 0x9c
|
||||||
|
#define QSERDES_V6_COM_INTEGLOOP_GAIN0_MODE0 0xa0
|
||||||
|
#define QSERDES_V6_COM_INTEGLOOP_GAIN1_MODE0 0xa4
|
||||||
|
#define QSERDES_V6_COM_VCO_TUNE1_MODE0 0xa8
|
||||||
|
#define QSERDES_V6_COM_VCO_TUNE2_MODE0 0xac
|
||||||
|
#define QSERDES_V6_COM_BG_TIMER 0xbc
|
||||||
|
#define QSERDES_V6_COM_SSC_EN_CENTER 0xc0
|
||||||
|
#define QSERDES_V6_COM_SSC_PER1 0xcc
|
||||||
|
#define QSERDES_V6_COM_SSC_PER2 0xd0
|
||||||
|
#define QSERDES_V6_COM_PLL_POST_DIV_MUX 0xd8
|
||||||
|
#define QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN 0xdc
|
||||||
|
#define QSERDES_V6_COM_CLK_ENABLE1 0xe0
|
||||||
|
#define QSERDES_V6_COM_SYS_CLK_CTRL 0xe4
|
||||||
|
#define QSERDES_V6_COM_SYSCLK_BUF_ENABLE 0xe8
|
||||||
|
#define QSERDES_V6_COM_PLL_IVCO 0xf4
|
||||||
|
#define QSERDES_V6_COM_SYSCLK_EN_SEL 0x110
|
||||||
|
#define QSERDES_V6_COM_RESETSM_CNTRL 0x118
|
||||||
|
#define QSERDES_V6_COM_LOCK_CMP_EN 0x120
|
||||||
|
#define QSERDES_V6_COM_LOCK_CMP_CFG 0x124
|
||||||
|
#define QSERDES_V6_COM_VCO_TUNE_CTRL 0x13c
|
||||||
|
#define QSERDES_V6_COM_VCO_TUNE_MAP 0x140
|
||||||
|
#define QSERDES_V6_COM_VCO_TUNE_INITVAL2 0x148
|
||||||
|
#define QSERDES_V6_COM_CLK_SELECT 0x164
|
||||||
|
#define QSERDES_V6_COM_CORE_CLK_EN 0x170
|
||||||
|
#define QSERDES_V6_COM_CMN_CONFIG_1 0x174
|
||||||
|
#define QSERDES_V6_COM_SVS_MODE_CLK_SEL 0x17c
|
||||||
|
#define QSERDES_V6_COM_CMN_MISC_1 0x184
|
||||||
|
#define QSERDES_V6_COM_CMN_MODE 0x188
|
||||||
|
#define QSERDES_V6_COM_PLL_VCO_DC_LEVEL_CTRL 0x198
|
||||||
|
#define QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_1 0x1a4
|
||||||
|
#define QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_2 0x1a8
|
||||||
|
#define QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_3 0x1ac
|
||||||
|
#define QSERDES_V6_COM_ADDITIONAL_MISC 0x1b4
|
||||||
|
#define QSERDES_V6_COM_ADDITIONAL_MISC_2 0x1b8
|
||||||
|
#define QSERDES_V6_COM_ADDITIONAL_MISC_3 0x1bc
|
||||||
|
#define QSERDES_V6_COM_CMN_STATUS 0x1d0
|
||||||
|
#define QSERDES_V6_COM_C_READY_STATUS 0x1f8
|
||||||
|
|
||||||
|
#endif
|
|
@ -135,6 +135,6 @@
|
||||||
#define QSERDES_COM_CMN_MISC2 0x1b8
|
#define QSERDES_COM_CMN_MISC2 0x1b8
|
||||||
#define QSERDES_COM_CORECLK_DIV_MODE1 0x1bc
|
#define QSERDES_COM_CORECLK_DIV_MODE1 0x1bc
|
||||||
#define QSERDES_COM_CORECLK_DIV_MODE2 0x1c0
|
#define QSERDES_COM_CORECLK_DIV_MODE2 0x1c0
|
||||||
#define QSERDES_COM_CMN_RSVD5 0x1c0
|
#define QSERDES_COM_CMN_RSVD5 0x1c4
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
32
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-ln-shrd-v6.h
Normal file
32
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-ln-shrd-v6.h
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Linaro Limited
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QCOM_PHY_QMP_QSERDES_LN_SHRD_V6_H_
|
||||||
|
#define QCOM_PHY_QMP_QSERDES_LN_SHRD_V6_H_
|
||||||
|
|
||||||
|
#define QSERDES_V6_LN_SHRD_RXCLK_DIV2_CTRL 0xa0
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_Q_EN_RATES 0xb0
|
||||||
|
#define QSERDES_V6_LN_SHRD_DFE_DAC_ENABLE1 0xb4
|
||||||
|
#define QSERDES_V6_LN_SHRD_TX_ADAPT_POST_THRESH1 0xc4
|
||||||
|
#define QSERDES_V6_LN_SHRD_TX_ADAPT_POST_THRESH2 0xc8
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B0 0xd4
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B1 0xd8
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B2 0xdc
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B3 0xe0
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B4 0xe4
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B5 0xe8
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MODE_RATE_0_1_B6 0xec
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH1_RATE210 0xf0
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH1_RATE3 0xf4
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH2_RATE210 0xf8
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH2_RATE3 0xfc
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH3_RATE210 0x100
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH3_RATE3 0x104
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH4_RATE3 0x10c
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH5_RATE3 0x114
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_MARG_COARSE_THRESH6_RATE3 0x11c
|
||||||
|
#define QSERDES_V6_LN_SHRD_RX_SUMMER_CAL_SPD_MODE 0x128
|
||||||
|
|
||||||
|
#endif
|
30
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-ufs-v6.h
Normal file
30
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-ufs-v6.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Linaro Limited
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QCOM_PHY_QMP_QSERDES_TXRX_UFS_V6_H_
|
||||||
|
#define QCOM_PHY_QMP_QSERDES_TXRX_UFS_V6_H_
|
||||||
|
|
||||||
|
#define QSERDES_UFS_V6_TX_RES_CODE_LANE_TX 0x28
|
||||||
|
#define QSERDES_UFS_V6_TX_RES_CODE_LANE_RX 0x2c
|
||||||
|
#define QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_TX 0x30
|
||||||
|
#define QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_RX 0x34
|
||||||
|
|
||||||
|
#define QSERDES_UFS_V6_RX_UCDR_FASTLOCK_FO_GAIN_RATE2 0x08
|
||||||
|
#define QSERDES_UFS_V6_RX_UCDR_FASTLOCK_FO_GAIN_RATE4 0x10
|
||||||
|
#define QSERDES_UFS_V6_RX_VGA_CAL_MAN_VAL 0x178
|
||||||
|
#define QSERDES_UFS_V6_RX_MODE_RATE_0_1_B0 0x208
|
||||||
|
#define QSERDES_UFS_V6_RX_MODE_RATE_0_1_B1 0x20c
|
||||||
|
#define QSERDES_UFS_V6_RX_MODE_RATE_0_1_B3 0x214
|
||||||
|
#define QSERDES_UFS_V6_RX_MODE_RATE_0_1_B6 0x220
|
||||||
|
#define QSERDES_UFS_V6_RX_MODE_RATE2_B3 0x238
|
||||||
|
#define QSERDES_UFS_V6_RX_MODE_RATE2_B6 0x244
|
||||||
|
#define QSERDES_UFS_V6_RX_MODE_RATE3_B3 0x25c
|
||||||
|
#define QSERDES_UFS_V6_RX_MODE_RATE3_B4 0x260
|
||||||
|
#define QSERDES_UFS_V6_RX_MODE_RATE3_B5 0x264
|
||||||
|
#define QSERDES_UFS_V6_RX_MODE_RATE3_B8 0x270
|
||||||
|
#define QSERDES_UFS_V6_RX_MODE_RATE4_B3 0x280
|
||||||
|
#define QSERDES_UFS_V6_RX_MODE_RATE4_B6 0x28c
|
||||||
|
|
||||||
|
#endif
|
|
@ -7,11 +7,6 @@
|
||||||
#define QCOM_PHY_QMP_QSERDES_TXRX_V5_5NM_H_
|
#define QCOM_PHY_QMP_QSERDES_TXRX_V5_5NM_H_
|
||||||
|
|
||||||
/* Only for QMP V5 5NM PHY - TX registers */
|
/* Only for QMP V5 5NM PHY - TX registers */
|
||||||
#define QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_TX 0x30
|
|
||||||
#define QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_RX 0x34
|
|
||||||
#define QSERDES_V5_5NM_TX_LANE_MODE_1 0x78
|
|
||||||
#define QSERDES_V5_5NM_TX_LANE_MODE_2 0x7c
|
|
||||||
#define QSERDES_V5_5NM_TX_LANE_MODE_3 0x80
|
|
||||||
#define QSERDES_V5_5NM_TX_BIST_MODE_LANENO 0x00
|
#define QSERDES_V5_5NM_TX_BIST_MODE_LANENO 0x00
|
||||||
#define QSERDES_V5_5NM_TX_BIST_INVERT 0x04
|
#define QSERDES_V5_5NM_TX_BIST_INVERT 0x04
|
||||||
#define QSERDES_V5_5NM_TX_CLKBUF_ENABLE 0x08
|
#define QSERDES_V5_5NM_TX_CLKBUF_ENABLE 0x08
|
||||||
|
|
77
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v6.h
Normal file
77
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v6.h
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Linaro Limited
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QCOM_PHY_QMP_QSERDES_TXRX_USB_V6_H_
|
||||||
|
#define QCOM_PHY_QMP_QSERDES_TXRX_USB_V6_H_
|
||||||
|
|
||||||
|
#define QSERDES_V6_TX_CLKBUF_ENABLE 0x08
|
||||||
|
#define QSERDES_V6_TX_RESET_TSYNC_EN 0x1c
|
||||||
|
#define QSERDES_V6_TX_PRE_STALL_LDO_BOOST_EN 0x20
|
||||||
|
#define QSERDES_V6_TX_TX_BAND 0x24
|
||||||
|
#define QSERDES_V6_TX_INTERFACE_SELECT 0x2c
|
||||||
|
#define QSERDES_V6_TX_RES_CODE_LANE_TX 0x34
|
||||||
|
#define QSERDES_V6_TX_RES_CODE_LANE_RX 0x38
|
||||||
|
#define QSERDES_V6_TX_RES_CODE_LANE_OFFSET_TX 0x3c
|
||||||
|
#define QSERDES_V6_TX_RES_CODE_LANE_OFFSET_RX 0x40
|
||||||
|
#define QSERDES_V6_TX_PARRATE_REC_DETECT_IDLE_EN 0x60
|
||||||
|
#define QSERDES_V6_TX_BIST_PATTERN7 0x7c
|
||||||
|
#define QSERDES_V6_TX_LANE_MODE_1 0x84
|
||||||
|
#define QSERDES_V6_TX_LANE_MODE_3 0x8c
|
||||||
|
#define QSERDES_V6_TX_LANE_MODE_4 0x90
|
||||||
|
#define QSERDES_V6_TX_LANE_MODE_5 0x94
|
||||||
|
#define QSERDES_V6_TX_RCV_DETECT_LVL_2 0xa4
|
||||||
|
#define QSERDES_V6_TX_TRAN_DRVR_EMP_EN 0xc0
|
||||||
|
#define QSERDES_V6_TX_TX_INTERFACE_MODE 0xc4
|
||||||
|
#define QSERDES_V6_TX_VMODE_CTRL1 0xc8
|
||||||
|
#define QSERDES_V6_TX_PI_QEC_CTRL 0xe4
|
||||||
|
|
||||||
|
#define QSERDES_V6_RX_UCDR_FO_GAIN 0x08
|
||||||
|
#define QSERDES_V6_RX_UCDR_SO_GAIN 0x14
|
||||||
|
#define QSERDES_V6_RX_UCDR_FASTLOCK_FO_GAIN 0x30
|
||||||
|
#define QSERDES_V6_RX_UCDR_SO_SATURATION_AND_ENABLE 0x34
|
||||||
|
#define QSERDES_V6_RX_UCDR_FASTLOCK_COUNT_LOW 0x3c
|
||||||
|
#define QSERDES_V6_RX_UCDR_FASTLOCK_COUNT_HIGH 0x40
|
||||||
|
#define QSERDES_V6_RX_UCDR_PI_CONTROLS 0x44
|
||||||
|
#define QSERDES_V6_RX_UCDR_SB2_THRESH1 0x4c
|
||||||
|
#define QSERDES_V6_RX_UCDR_SB2_THRESH2 0x50
|
||||||
|
#define QSERDES_V6_RX_UCDR_SB2_GAIN1 0x54
|
||||||
|
#define QSERDES_V6_RX_UCDR_SB2_GAIN2 0x58
|
||||||
|
#define QSERDES_V6_RX_AUX_DATA_TCOARSE_TFINE 0x60
|
||||||
|
#define QSERDES_V6_RX_TX_ADAPT_POST_THRESH 0xcc
|
||||||
|
#define QSERDES_V6_RX_VGA_CAL_CNTRL1 0xd4
|
||||||
|
#define QSERDES_V6_RX_VGA_CAL_CNTRL2 0xd8
|
||||||
|
#define QSERDES_V6_RX_GM_CAL 0xdc
|
||||||
|
#define QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL2 0xec
|
||||||
|
#define QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL3 0xf0
|
||||||
|
#define QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL4 0xf4
|
||||||
|
#define QSERDES_V6_RX_RX_IDAC_TSETTLE_LOW 0xf8
|
||||||
|
#define QSERDES_V6_RX_RX_IDAC_TSETTLE_HIGH 0xfc
|
||||||
|
#define QSERDES_V6_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1 0x110
|
||||||
|
#define QSERDES_V6_RX_SIDGET_ENABLES 0x118
|
||||||
|
#define QSERDES_V6_RX_SIGDET_CNTRL 0x11c
|
||||||
|
#define QSERDES_V6_RX_SIGDET_DEGLITCH_CNTRL 0x124
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_00_LOW 0x15c
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_00_HIGH 0x160
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_00_HIGH2 0x164
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_00_HIGH3 0x168
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_00_HIGH4 0x16c
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_01_LOW 0x170
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_01_HIGH 0x174
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_01_HIGH2 0x178
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_01_HIGH3 0x17c
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_01_HIGH4 0x180
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_10_LOW 0x184
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_10_HIGH 0x188
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_10_HIGH2 0x18c
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_10_HIGH3 0x190
|
||||||
|
#define QSERDES_V6_RX_RX_MODE_10_HIGH4 0x194
|
||||||
|
#define QSERDES_V6_RX_DFE_EN_TIMER 0x1a0
|
||||||
|
#define QSERDES_V6_RX_DFE_CTLE_POST_CAL_OFFSET 0x1a4
|
||||||
|
#define QSERDES_V6_RX_DCC_CTRL1 0x1a8
|
||||||
|
#define QSERDES_V6_RX_VTH_CODE 0x1b0
|
||||||
|
#define QSERDES_V6_RX_SIGDET_CAL_CTRL1 0x1e4
|
||||||
|
#define QSERDES_V6_RX_SIGDET_CAL_TRIM 0x1f8
|
||||||
|
|
||||||
|
#endif
|
45
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v6_20.h
Normal file
45
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-v6_20.h
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Linaro Limited
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QCOM_PHY_QMP_QSERDES_TXRX_PCIE_V6_20_H_
|
||||||
|
#define QCOM_PHY_QMP_QSERDES_TXRX_PCIE_V6_20_H_
|
||||||
|
|
||||||
|
#define QSERDES_V6_20_TX_RES_CODE_LANE_OFFSET_TX 0x30
|
||||||
|
#define QSERDES_V6_20_TX_RES_CODE_LANE_OFFSET_RX 0x34
|
||||||
|
#define QSERDES_V6_20_TX_TRAN_DRVR_EMP_EN 0xac
|
||||||
|
#define QSERDES_V6_20_TX_LANE_MODE_1 0x78
|
||||||
|
#define QSERDES_V6_20_TX_LANE_MODE_2 0x7c
|
||||||
|
#define QSERDES_V6_20_TX_LANE_MODE_3 0x80
|
||||||
|
|
||||||
|
#define QSERDES_V6_20_RX_UCDR_FO_GAIN_RATE_2 0x08
|
||||||
|
#define QSERDES_V6_20_RX_UCDR_FO_GAIN_RATE_3 0x0c
|
||||||
|
#define QSERDES_V6_20_RX_UCDR_PI_CONTROLS 0x20
|
||||||
|
#define QSERDES_V6_20_RX_UCDR_SO_ACC_DEFAULT_VAL_RATE3 0x34
|
||||||
|
#define QSERDES_V6_20_RX_IVCM_CAL_CTRL2 0x9c
|
||||||
|
#define QSERDES_V6_20_RX_IVCM_POSTCAL_OFFSET 0xa0
|
||||||
|
#define QSERDES_V6_20_RX_DFE_3 0xb4
|
||||||
|
#define QSERDES_V6_20_RX_VGA_CAL_MAN_VAL 0xe8
|
||||||
|
#define QSERDES_V6_20_RX_GM_CAL 0x10c
|
||||||
|
#define QSERDES_V6_20_RX_EQU_ADAPTOR_CNTRL4 0x120
|
||||||
|
#define QSERDES_V6_20_RX_SIGDET_ENABLES 0x148
|
||||||
|
#define QSERDES_V6_20_RX_PHPRE_CTRL 0x188
|
||||||
|
#define QSERDES_V6_20_RX_DFE_CTLE_POST_CAL_OFFSET 0x194
|
||||||
|
#define QSERDES_V6_20_RX_Q_PI_INTRINSIC_BIAS_RATE32 0x1dc
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE2_B0 0x1f4
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE2_B1 0x1f8
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE2_B2 0x1fc
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE2_B3 0x200
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE2_B4 0x204
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE2_B5 0x208
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE2_B6 0x20c
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE3_B0 0x210
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE3_B1 0x214
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE3_B2 0x218
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE3_B3 0x21c
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE3_B4 0x220
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE3_B5 0x224
|
||||||
|
#define QSERDES_V6_20_RX_MODE_RATE3_B6 0x228
|
||||||
|
|
||||||
|
#endif
|
File diff suppressed because it is too large
Load diff
|
@ -21,6 +21,9 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
|
||||||
#include "phy-qcom-qmp.h"
|
#include "phy-qcom-qmp.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-misc-v3.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-usb-v4.h"
|
||||||
|
#include "phy-qcom-qmp-pcs-usb-v5.h"
|
||||||
|
|
||||||
/* QPHY_SW_RESET bit */
|
/* QPHY_SW_RESET bit */
|
||||||
#define SW_RESET BIT(0)
|
#define SW_RESET BIT(0)
|
||||||
|
@ -54,9 +57,6 @@
|
||||||
/* QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR register bits */
|
/* QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR register bits */
|
||||||
#define IRQ_CLEAR BIT(0)
|
#define IRQ_CLEAR BIT(0)
|
||||||
|
|
||||||
/* QPHY_PCS_LFPS_RXTERM_IRQ_STATUS register bits */
|
|
||||||
#define RCVR_DETECT BIT(0)
|
|
||||||
|
|
||||||
/* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */
|
/* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */
|
||||||
#define CLAMP_EN BIT(0) /* enables i/o clamp_n */
|
#define CLAMP_EN BIT(0) /* enables i/o clamp_n */
|
||||||
|
|
||||||
|
@ -94,53 +94,49 @@ enum qphy_reg_layout {
|
||||||
QPHY_PCS_STATUS,
|
QPHY_PCS_STATUS,
|
||||||
QPHY_PCS_AUTONOMOUS_MODE_CTRL,
|
QPHY_PCS_AUTONOMOUS_MODE_CTRL,
|
||||||
QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR,
|
QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR,
|
||||||
QPHY_PCS_LFPS_RXTERM_IRQ_STATUS,
|
|
||||||
QPHY_PCS_POWER_DOWN_CONTROL,
|
QPHY_PCS_POWER_DOWN_CONTROL,
|
||||||
/* PCS_MISC registers */
|
|
||||||
QPHY_PCS_MISC_TYPEC_CTRL,
|
|
||||||
/* Keep last to ensure regs_layout arrays are properly initialized */
|
/* Keep last to ensure regs_layout arrays are properly initialized */
|
||||||
QPHY_LAYOUT_SIZE
|
QPHY_LAYOUT_SIZE
|
||||||
};
|
};
|
||||||
|
|
||||||
static const unsigned int usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
static const unsigned int qmp_v2_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
||||||
[QPHY_SW_RESET] = 0x00,
|
[QPHY_SW_RESET] = QPHY_V2_PCS_SW_RESET,
|
||||||
[QPHY_START_CTRL] = 0x08,
|
[QPHY_START_CTRL] = QPHY_V2_PCS_START_CONTROL,
|
||||||
[QPHY_PCS_STATUS] = 0x17c,
|
[QPHY_PCS_STATUS] = QPHY_V2_PCS_USB_PCS_STATUS,
|
||||||
[QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x0d4,
|
[QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V2_PCS_AUTONOMOUS_MODE_CTRL,
|
||||||
[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x0d8,
|
[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V2_PCS_LFPS_RXTERM_IRQ_CLEAR,
|
||||||
[QPHY_PCS_LFPS_RXTERM_IRQ_STATUS] = 0x178,
|
[QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V2_PCS_POWER_DOWN_CONTROL,
|
||||||
[QPHY_PCS_POWER_DOWN_CONTROL] = 0x04,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
static const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
||||||
[QPHY_SW_RESET] = 0x00,
|
[QPHY_SW_RESET] = QPHY_V3_PCS_SW_RESET,
|
||||||
[QPHY_START_CTRL] = 0x08,
|
[QPHY_START_CTRL] = QPHY_V3_PCS_START_CONTROL,
|
||||||
[QPHY_PCS_STATUS] = 0x174,
|
[QPHY_PCS_STATUS] = QPHY_V3_PCS_PCS_STATUS,
|
||||||
[QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x0d8,
|
[QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V3_PCS_AUTONOMOUS_MODE_CTRL,
|
||||||
[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x0dc,
|
[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V3_PCS_LFPS_RXTERM_IRQ_CLEAR,
|
||||||
[QPHY_PCS_LFPS_RXTERM_IRQ_STATUS] = 0x170,
|
[QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V3_PCS_POWER_DOWN_CONTROL,
|
||||||
[QPHY_PCS_POWER_DOWN_CONTROL] = 0x04,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const unsigned int qmp_v4_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
static const unsigned int qmp_v4_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
||||||
[QPHY_SW_RESET] = 0x00,
|
[QPHY_SW_RESET] = QPHY_V4_PCS_SW_RESET,
|
||||||
[QPHY_START_CTRL] = 0x44,
|
[QPHY_START_CTRL] = QPHY_V4_PCS_START_CONTROL,
|
||||||
[QPHY_PCS_STATUS] = 0x14,
|
[QPHY_PCS_STATUS] = QPHY_V4_PCS_PCS_STATUS1,
|
||||||
[QPHY_PCS_POWER_DOWN_CONTROL] = 0x40,
|
[QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V4_PCS_POWER_DOWN_CONTROL,
|
||||||
|
|
||||||
/* In PCS_USB */
|
/* In PCS_USB */
|
||||||
[QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x008,
|
[QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V4_PCS_USB3_AUTONOMOUS_MODE_CTRL,
|
||||||
[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x014,
|
[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V4_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const unsigned int qcm2290_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
static const unsigned int qmp_v5_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
|
||||||
[QPHY_SW_RESET] = 0x00,
|
[QPHY_SW_RESET] = QPHY_V5_PCS_SW_RESET,
|
||||||
[QPHY_PCS_POWER_DOWN_CONTROL] = 0x04,
|
[QPHY_START_CTRL] = QPHY_V5_PCS_START_CONTROL,
|
||||||
[QPHY_START_CTRL] = 0x08,
|
[QPHY_PCS_STATUS] = QPHY_V5_PCS_PCS_STATUS1,
|
||||||
[QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0xd8,
|
[QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V5_PCS_POWER_DOWN_CONTROL,
|
||||||
[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0xdc,
|
|
||||||
[QPHY_PCS_STATUS] = 0x174,
|
/* In PCS_USB */
|
||||||
[QPHY_PCS_MISC_TYPEC_CTRL] = 0x00,
|
[QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V5_PCS_USB3_AUTONOMOUS_MODE_CTRL,
|
||||||
|
[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V5_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl ipq8074_usb3_serdes_tbl[] = {
|
static const struct qmp_phy_init_tbl ipq8074_usb3_serdes_tbl[] = {
|
||||||
|
@ -1265,7 +1261,7 @@ static const struct qmp_phy_init_tbl qcm2290_usb3_tx_tbl[] = {
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl qcm2290_usb3_rx_tbl[] = {
|
static const struct qmp_phy_init_tbl qcm2290_usb3_rx_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x00),
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x80),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x00),
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x00),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x00),
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x00),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FO_GAIN, 0x0a),
|
QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FO_GAIN, 0x0a),
|
||||||
|
@ -1607,7 +1603,7 @@ static const struct qmp_phy_cfg msm8996_usb3phy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
|
.num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = usb3phy_regs_layout,
|
.regs = qmp_v2_usb3phy_regs_layout,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_cfg qmp_v3_usb3phy_cfg = {
|
static const struct qmp_phy_cfg qmp_v3_usb3phy_cfg = {
|
||||||
|
@ -1675,7 +1671,7 @@ static const struct qmp_phy_cfg sc8280xp_usb3_uniphy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(qcm2290_usb3phy_reset_l),
|
.num_resets = ARRAY_SIZE(qcm2290_usb3phy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = qmp_v4_usb3phy_regs_layout,
|
.regs = qmp_v5_usb3phy_regs_layout,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_cfg qmp_v3_usb3_uniphy_cfg = {
|
static const struct qmp_phy_cfg qmp_v3_usb3_uniphy_cfg = {
|
||||||
|
@ -1866,7 +1862,7 @@ static const struct qmp_phy_cfg sdx65_usb3_uniphy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
|
.num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = qmp_v4_usb3phy_regs_layout,
|
.regs = qmp_v5_usb3phy_regs_layout,
|
||||||
.pcs_usb_offset = 0x1000,
|
.pcs_usb_offset = 0x1000,
|
||||||
|
|
||||||
.has_pwrdn_delay = true,
|
.has_pwrdn_delay = true,
|
||||||
|
@ -1891,7 +1887,7 @@ static const struct qmp_phy_cfg sm8350_usb3phy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
|
.num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = qmp_v4_usb3phy_regs_layout,
|
.regs = qmp_v5_usb3phy_regs_layout,
|
||||||
.pcs_usb_offset = 0x300,
|
.pcs_usb_offset = 0x300,
|
||||||
|
|
||||||
.has_pwrdn_delay = true,
|
.has_pwrdn_delay = true,
|
||||||
|
@ -1917,7 +1913,7 @@ static const struct qmp_phy_cfg sm8350_usb3_uniphy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
|
.num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = qmp_v4_usb3phy_regs_layout,
|
.regs = qmp_v5_usb3phy_regs_layout,
|
||||||
.pcs_usb_offset = 0x1000,
|
.pcs_usb_offset = 0x1000,
|
||||||
|
|
||||||
.has_pwrdn_delay = true,
|
.has_pwrdn_delay = true,
|
||||||
|
@ -1940,7 +1936,7 @@ static const struct qmp_phy_cfg qcm2290_usb3phy_cfg = {
|
||||||
.num_resets = ARRAY_SIZE(qcm2290_usb3phy_reset_l),
|
.num_resets = ARRAY_SIZE(qcm2290_usb3phy_reset_l),
|
||||||
.vreg_list = qmp_phy_vreg_l,
|
.vreg_list = qmp_phy_vreg_l,
|
||||||
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
.num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
|
||||||
.regs = qcm2290_usb3phy_regs_layout,
|
.regs = qmp_v3_usb3phy_regs_layout,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void qmp_usb_configure_lane(void __iomem *base,
|
static void qmp_usb_configure_lane(void __iomem *base,
|
||||||
|
@ -2622,6 +2618,9 @@ static const struct of_device_id qmp_usb_of_match_table[] = {
|
||||||
}, {
|
}, {
|
||||||
.compatible = "qcom,sdx65-qmp-usb3-uni-phy",
|
.compatible = "qcom,sdx65-qmp-usb3-uni-phy",
|
||||||
.data = &sdx65_usb3_uniphy_cfg,
|
.data = &sdx65_usb3_uniphy_cfg,
|
||||||
|
}, {
|
||||||
|
.compatible = "qcom,sm6115-qmp-usb3-phy",
|
||||||
|
.data = &qcm2290_usb3phy_cfg,
|
||||||
}, {
|
}, {
|
||||||
.compatible = "qcom,sm8150-qmp-usb3-phy",
|
.compatible = "qcom,sm8150-qmp-usb3-phy",
|
||||||
.data = &sm8150_usb3phy_cfg,
|
.data = &sm8150_usb3phy_cfg,
|
||||||
|
|
|
@ -21,31 +21,28 @@
|
||||||
#include "phy-qcom-qmp-qserdes-txrx-v5_20.h"
|
#include "phy-qcom-qmp-qserdes-txrx-v5_20.h"
|
||||||
#include "phy-qcom-qmp-qserdes-txrx-v5_5nm.h"
|
#include "phy-qcom-qmp-qserdes-txrx-v5_5nm.h"
|
||||||
|
|
||||||
|
#include "phy-qcom-qmp-qserdes-com-v6.h"
|
||||||
|
#include "phy-qcom-qmp-qserdes-txrx-v6.h"
|
||||||
|
#include "phy-qcom-qmp-qserdes-txrx-v6_20.h"
|
||||||
|
#include "phy-qcom-qmp-qserdes-ln-shrd-v6.h"
|
||||||
|
|
||||||
#include "phy-qcom-qmp-qserdes-pll.h"
|
#include "phy-qcom-qmp-qserdes-pll.h"
|
||||||
|
|
||||||
#include "phy-qcom-qmp-pcs-v2.h"
|
#include "phy-qcom-qmp-pcs-v2.h"
|
||||||
|
|
||||||
#include "phy-qcom-qmp-pcs-v3.h"
|
#include "phy-qcom-qmp-pcs-v3.h"
|
||||||
#include "phy-qcom-qmp-pcs-misc-v3.h"
|
|
||||||
#include "phy-qcom-qmp-pcs-ufs-v3.h"
|
|
||||||
|
|
||||||
#include "phy-qcom-qmp-pcs-v4.h"
|
#include "phy-qcom-qmp-pcs-v4.h"
|
||||||
#include "phy-qcom-qmp-pcs-pcie-v4.h"
|
|
||||||
#include "phy-qcom-qmp-pcs-usb-v4.h"
|
|
||||||
#include "phy-qcom-qmp-pcs-ufs-v4.h"
|
|
||||||
|
|
||||||
#include "phy-qcom-qmp-pcs-v4_20.h"
|
#include "phy-qcom-qmp-pcs-v4_20.h"
|
||||||
#include "phy-qcom-qmp-pcs-pcie-v4_20.h"
|
|
||||||
|
|
||||||
#include "phy-qcom-qmp-pcs-v5.h"
|
#include "phy-qcom-qmp-pcs-v5.h"
|
||||||
|
|
||||||
#include "phy-qcom-qmp-pcs-v5_20.h"
|
#include "phy-qcom-qmp-pcs-v5_20.h"
|
||||||
#include "phy-qcom-qmp-pcs-pcie-v5.h"
|
|
||||||
#include "phy-qcom-qmp-pcs-usb-v5.h"
|
|
||||||
#include "phy-qcom-qmp-pcs-ufs-v5.h"
|
|
||||||
|
|
||||||
#include "phy-qcom-qmp-pcs-pcie-v5_20.h"
|
#include "phy-qcom-qmp-pcs-v6.h"
|
||||||
|
|
||||||
#include "phy-qcom-qmp-pcie-qhp.h"
|
#include "phy-qcom-qmp-pcs-v6_20.h"
|
||||||
|
|
||||||
/* Only for QMP V3 & V4 PHY - DP COM registers */
|
/* Only for QMP V3 & V4 PHY - DP COM registers */
|
||||||
#define QPHY_V3_DP_COM_PHY_MODE_CTRL 0x00
|
#define QPHY_V3_DP_COM_PHY_MODE_CTRL 0x00
|
||||||
|
@ -137,4 +134,8 @@
|
||||||
#define QPHY_V4_PCS_MISC_TYPEC_STATUS 0x10
|
#define QPHY_V4_PCS_MISC_TYPEC_STATUS 0x10
|
||||||
#define QPHY_V4_PCS_MISC_PLACEHOLDER_STATUS 0x14
|
#define QPHY_V4_PCS_MISC_PLACEHOLDER_STATUS 0x14
|
||||||
|
|
||||||
|
/* Only for QMP V6 PHY - DP PHY registers */
|
||||||
|
#define QSERDES_V6_DP_PHY_AUX_INTERRUPT_STATUS 0x0e0
|
||||||
|
#define QSERDES_V6_DP_PHY_STATUS 0x0e4
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
441
drivers/phy/qualcomm/phy-qcom-snps-eusb2.c
Normal file
441
drivers/phy/qualcomm/phy-qcom-snps-eusb2.c
Normal file
|
@ -0,0 +1,441 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Linaro Limited
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/bitfield.h>
|
||||||
|
#include <linux/clk.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
#include <linux/iopoll.h>
|
||||||
|
#include <linux/phy/phy.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/regulator/consumer.h>
|
||||||
|
#include <linux/reset.h>
|
||||||
|
|
||||||
|
#define USB_PHY_UTMI_CTRL0 (0x3c)
|
||||||
|
#define SLEEPM BIT(0)
|
||||||
|
#define OPMODE_MASK GENMASK(4, 3)
|
||||||
|
#define OPMODE_NONDRIVING BIT(3)
|
||||||
|
|
||||||
|
#define USB_PHY_UTMI_CTRL5 (0x50)
|
||||||
|
#define POR BIT(1)
|
||||||
|
|
||||||
|
#define USB_PHY_HS_PHY_CTRL_COMMON0 (0x54)
|
||||||
|
#define PHY_ENABLE BIT(0)
|
||||||
|
#define SIDDQ_SEL BIT(1)
|
||||||
|
#define SIDDQ BIT(2)
|
||||||
|
#define RETENABLEN BIT(3)
|
||||||
|
#define FSEL_MASK GENMASK(6, 4)
|
||||||
|
#define FSEL_19_2_MHZ_VAL (0x0)
|
||||||
|
#define FSEL_38_4_MHZ_VAL (0x4)
|
||||||
|
|
||||||
|
#define USB_PHY_CFG_CTRL_1 (0x58)
|
||||||
|
#define PHY_CFG_PLL_CPBIAS_CNTRL_MASK GENMASK(7, 1)
|
||||||
|
|
||||||
|
#define USB_PHY_CFG_CTRL_2 (0x5c)
|
||||||
|
#define PHY_CFG_PLL_FB_DIV_7_0_MASK GENMASK(7, 0)
|
||||||
|
#define DIV_7_0_19_2_MHZ_VAL (0x90)
|
||||||
|
#define DIV_7_0_38_4_MHZ_VAL (0xc8)
|
||||||
|
|
||||||
|
#define USB_PHY_CFG_CTRL_3 (0x60)
|
||||||
|
#define PHY_CFG_PLL_FB_DIV_11_8_MASK GENMASK(3, 0)
|
||||||
|
#define DIV_11_8_19_2_MHZ_VAL (0x1)
|
||||||
|
#define DIV_11_8_38_4_MHZ_VAL (0x0)
|
||||||
|
|
||||||
|
#define PHY_CFG_PLL_REF_DIV GENMASK(7, 4)
|
||||||
|
#define PLL_REF_DIV_VAL (0x0)
|
||||||
|
|
||||||
|
#define USB_PHY_HS_PHY_CTRL2 (0x64)
|
||||||
|
#define VBUSVLDEXT0 BIT(0)
|
||||||
|
#define USB2_SUSPEND_N BIT(2)
|
||||||
|
#define USB2_SUSPEND_N_SEL BIT(3)
|
||||||
|
#define VBUS_DET_EXT_SEL BIT(4)
|
||||||
|
|
||||||
|
#define USB_PHY_CFG_CTRL_4 (0x68)
|
||||||
|
#define PHY_CFG_PLL_GMP_CNTRL_MASK GENMASK(1, 0)
|
||||||
|
#define PHY_CFG_PLL_INT_CNTRL_MASK GENMASK(7, 2)
|
||||||
|
|
||||||
|
#define USB_PHY_CFG_CTRL_5 (0x6c)
|
||||||
|
#define PHY_CFG_PLL_PROP_CNTRL_MASK GENMASK(4, 0)
|
||||||
|
#define PHY_CFG_PLL_VREF_TUNE_MASK GENMASK(7, 6)
|
||||||
|
|
||||||
|
#define USB_PHY_CFG_CTRL_6 (0x70)
|
||||||
|
#define PHY_CFG_PLL_VCO_CNTRL_MASK GENMASK(2, 0)
|
||||||
|
|
||||||
|
#define USB_PHY_CFG_CTRL_7 (0x74)
|
||||||
|
|
||||||
|
#define USB_PHY_CFG_CTRL_8 (0x78)
|
||||||
|
#define PHY_CFG_TX_FSLS_VREF_TUNE_MASK GENMASK(1, 0)
|
||||||
|
#define PHY_CFG_TX_FSLS_VREG_BYPASS BIT(2)
|
||||||
|
#define PHY_CFG_TX_HS_VREF_TUNE_MASK GENMASK(5, 3)
|
||||||
|
#define PHY_CFG_TX_HS_XV_TUNE_MASK GENMASK(7, 6)
|
||||||
|
|
||||||
|
#define USB_PHY_CFG_CTRL_9 (0x7c)
|
||||||
|
#define PHY_CFG_TX_PREEMP_TUNE_MASK GENMASK(2, 0)
|
||||||
|
#define PHY_CFG_TX_RES_TUNE_MASK GENMASK(4, 3)
|
||||||
|
#define PHY_CFG_TX_RISE_TUNE_MASK GENMASK(6, 5)
|
||||||
|
#define PHY_CFG_RCAL_BYPASS BIT(7)
|
||||||
|
|
||||||
|
#define USB_PHY_CFG_CTRL_10 (0x80)
|
||||||
|
|
||||||
|
#define USB_PHY_CFG0 (0x94)
|
||||||
|
#define DATAPATH_CTRL_OVERRIDE_EN BIT(0)
|
||||||
|
#define CMN_CTRL_OVERRIDE_EN BIT(1)
|
||||||
|
|
||||||
|
#define UTMI_PHY_CMN_CTRL0 (0x98)
|
||||||
|
#define TESTBURNIN BIT(6)
|
||||||
|
|
||||||
|
#define USB_PHY_FSEL_SEL (0xb8)
|
||||||
|
#define FSEL_SEL BIT(0)
|
||||||
|
|
||||||
|
#define USB_PHY_APB_ACCESS_CMD (0x130)
|
||||||
|
#define RW_ACCESS BIT(0)
|
||||||
|
#define APB_START_CMD BIT(1)
|
||||||
|
#define APB_LOGIC_RESET BIT(2)
|
||||||
|
|
||||||
|
#define USB_PHY_APB_ACCESS_STATUS (0x134)
|
||||||
|
#define ACCESS_DONE BIT(0)
|
||||||
|
#define TIMED_OUT BIT(1)
|
||||||
|
#define ACCESS_ERROR BIT(2)
|
||||||
|
#define ACCESS_IN_PROGRESS BIT(3)
|
||||||
|
|
||||||
|
#define USB_PHY_APB_ADDRESS (0x138)
|
||||||
|
#define APB_REG_ADDR_MASK GENMASK(7, 0)
|
||||||
|
|
||||||
|
#define USB_PHY_APB_WRDATA_LSB (0x13c)
|
||||||
|
#define APB_REG_WRDATA_7_0_MASK GENMASK(3, 0)
|
||||||
|
|
||||||
|
#define USB_PHY_APB_WRDATA_MSB (0x140)
|
||||||
|
#define APB_REG_WRDATA_15_8_MASK GENMASK(7, 4)
|
||||||
|
|
||||||
|
#define USB_PHY_APB_RDDATA_LSB (0x144)
|
||||||
|
#define APB_REG_RDDATA_7_0_MASK GENMASK(3, 0)
|
||||||
|
|
||||||
|
#define USB_PHY_APB_RDDATA_MSB (0x148)
|
||||||
|
#define APB_REG_RDDATA_15_8_MASK GENMASK(7, 4)
|
||||||
|
|
||||||
|
static const char * const eusb2_hsphy_vreg_names[] = {
|
||||||
|
"vdd", "vdda12",
|
||||||
|
};
|
||||||
|
|
||||||
|
#define EUSB2_NUM_VREGS ARRAY_SIZE(eusb2_hsphy_vreg_names)
|
||||||
|
|
||||||
|
struct qcom_snps_eusb2_hsphy {
|
||||||
|
struct phy *phy;
|
||||||
|
void __iomem *base;
|
||||||
|
|
||||||
|
struct clk *ref_clk;
|
||||||
|
struct reset_control *phy_reset;
|
||||||
|
|
||||||
|
struct regulator_bulk_data vregs[EUSB2_NUM_VREGS];
|
||||||
|
|
||||||
|
enum phy_mode mode;
|
||||||
|
|
||||||
|
struct phy *repeater;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int qcom_snps_eusb2_hsphy_set_mode(struct phy *p, enum phy_mode mode, int submode)
|
||||||
|
{
|
||||||
|
struct qcom_snps_eusb2_hsphy *phy = phy_get_drvdata(p);
|
||||||
|
|
||||||
|
phy->mode = mode;
|
||||||
|
|
||||||
|
return phy_set_mode_ext(phy->repeater, mode, submode);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void qcom_snps_eusb2_hsphy_write_mask(void __iomem *base, u32 offset,
|
||||||
|
u32 mask, u32 val)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
reg = readl_relaxed(base + offset);
|
||||||
|
reg &= ~mask;
|
||||||
|
reg |= val & mask;
|
||||||
|
writel_relaxed(reg, base + offset);
|
||||||
|
|
||||||
|
/* Ensure above write is completed */
|
||||||
|
readl_relaxed(base + offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void qcom_eusb2_default_parameters(struct qcom_snps_eusb2_hsphy *phy)
|
||||||
|
{
|
||||||
|
/* default parameters: tx pre-emphasis */
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_9,
|
||||||
|
PHY_CFG_TX_PREEMP_TUNE_MASK,
|
||||||
|
FIELD_PREP(PHY_CFG_TX_PREEMP_TUNE_MASK, 0));
|
||||||
|
|
||||||
|
/* tx rise/fall time */
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_9,
|
||||||
|
PHY_CFG_TX_RISE_TUNE_MASK,
|
||||||
|
FIELD_PREP(PHY_CFG_TX_RISE_TUNE_MASK, 0x2));
|
||||||
|
|
||||||
|
/* source impedance adjustment */
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_9,
|
||||||
|
PHY_CFG_TX_RES_TUNE_MASK,
|
||||||
|
FIELD_PREP(PHY_CFG_TX_RES_TUNE_MASK, 0x1));
|
||||||
|
|
||||||
|
/* dc voltage level adjustement */
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_8,
|
||||||
|
PHY_CFG_TX_HS_VREF_TUNE_MASK,
|
||||||
|
FIELD_PREP(PHY_CFG_TX_HS_VREF_TUNE_MASK, 0x3));
|
||||||
|
|
||||||
|
/* transmitter HS crossover adjustement */
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_8,
|
||||||
|
PHY_CFG_TX_HS_XV_TUNE_MASK,
|
||||||
|
FIELD_PREP(PHY_CFG_TX_HS_XV_TUNE_MASK, 0x0));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int qcom_eusb2_ref_clk_init(struct qcom_snps_eusb2_hsphy *phy)
|
||||||
|
{
|
||||||
|
unsigned long ref_clk_freq = clk_get_rate(phy->ref_clk);
|
||||||
|
|
||||||
|
switch (ref_clk_freq) {
|
||||||
|
case 19200000:
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_HS_PHY_CTRL_COMMON0,
|
||||||
|
FSEL_MASK,
|
||||||
|
FIELD_PREP(FSEL_MASK, FSEL_19_2_MHZ_VAL));
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_2,
|
||||||
|
PHY_CFG_PLL_FB_DIV_7_0_MASK,
|
||||||
|
DIV_7_0_19_2_MHZ_VAL);
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_3,
|
||||||
|
PHY_CFG_PLL_FB_DIV_11_8_MASK,
|
||||||
|
DIV_11_8_19_2_MHZ_VAL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 38400000:
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_HS_PHY_CTRL_COMMON0,
|
||||||
|
FSEL_MASK,
|
||||||
|
FIELD_PREP(FSEL_MASK, FSEL_38_4_MHZ_VAL));
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_2,
|
||||||
|
PHY_CFG_PLL_FB_DIV_7_0_MASK,
|
||||||
|
DIV_7_0_38_4_MHZ_VAL);
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_3,
|
||||||
|
PHY_CFG_PLL_FB_DIV_11_8_MASK,
|
||||||
|
DIV_11_8_38_4_MHZ_VAL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
dev_err(&phy->phy->dev, "unsupported ref_clk_freq:%lu\n", ref_clk_freq);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_3,
|
||||||
|
PHY_CFG_PLL_REF_DIV, PLL_REF_DIV_VAL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int qcom_snps_eusb2_hsphy_init(struct phy *p)
|
||||||
|
{
|
||||||
|
struct qcom_snps_eusb2_hsphy *phy = phy_get_drvdata(p);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = regulator_bulk_enable(ARRAY_SIZE(phy->vregs), phy->vregs);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = phy_init(phy->repeater);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(&p->dev, "repeater init failed. %d\n", ret);
|
||||||
|
goto disable_vreg;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = clk_prepare_enable(phy->ref_clk);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(&p->dev, "failed to enable ref clock, %d\n", ret);
|
||||||
|
goto disable_vreg;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = reset_control_assert(phy->phy_reset);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(&p->dev, "failed to assert phy_reset, %d\n", ret);
|
||||||
|
goto disable_ref_clk;
|
||||||
|
}
|
||||||
|
|
||||||
|
usleep_range(100, 150);
|
||||||
|
|
||||||
|
ret = reset_control_deassert(phy->phy_reset);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(&p->dev, "failed to de-assert phy_reset, %d\n", ret);
|
||||||
|
goto disable_ref_clk;
|
||||||
|
}
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG0,
|
||||||
|
CMN_CTRL_OVERRIDE_EN, CMN_CTRL_OVERRIDE_EN);
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_UTMI_CTRL5, POR, POR);
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_HS_PHY_CTRL_COMMON0,
|
||||||
|
PHY_ENABLE | RETENABLEN, PHY_ENABLE | RETENABLEN);
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_APB_ACCESS_CMD,
|
||||||
|
APB_LOGIC_RESET, APB_LOGIC_RESET);
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, UTMI_PHY_CMN_CTRL0, TESTBURNIN, 0);
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_FSEL_SEL,
|
||||||
|
FSEL_SEL, FSEL_SEL);
|
||||||
|
|
||||||
|
/* update ref_clk related registers */
|
||||||
|
ret = qcom_eusb2_ref_clk_init(phy);
|
||||||
|
if (ret)
|
||||||
|
goto disable_ref_clk;
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_1,
|
||||||
|
PHY_CFG_PLL_CPBIAS_CNTRL_MASK,
|
||||||
|
FIELD_PREP(PHY_CFG_PLL_CPBIAS_CNTRL_MASK, 0x1));
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_4,
|
||||||
|
PHY_CFG_PLL_INT_CNTRL_MASK,
|
||||||
|
FIELD_PREP(PHY_CFG_PLL_INT_CNTRL_MASK, 0x8));
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_4,
|
||||||
|
PHY_CFG_PLL_GMP_CNTRL_MASK,
|
||||||
|
FIELD_PREP(PHY_CFG_PLL_GMP_CNTRL_MASK, 0x1));
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_5,
|
||||||
|
PHY_CFG_PLL_PROP_CNTRL_MASK,
|
||||||
|
FIELD_PREP(PHY_CFG_PLL_PROP_CNTRL_MASK, 0x10));
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_6,
|
||||||
|
PHY_CFG_PLL_VCO_CNTRL_MASK,
|
||||||
|
FIELD_PREP(PHY_CFG_PLL_VCO_CNTRL_MASK, 0x0));
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_CFG_CTRL_5,
|
||||||
|
PHY_CFG_PLL_VREF_TUNE_MASK,
|
||||||
|
FIELD_PREP(PHY_CFG_PLL_VREF_TUNE_MASK, 0x1));
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_HS_PHY_CTRL2,
|
||||||
|
VBUS_DET_EXT_SEL, VBUS_DET_EXT_SEL);
|
||||||
|
|
||||||
|
/* set default parameters */
|
||||||
|
qcom_eusb2_default_parameters(phy);
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_HS_PHY_CTRL2,
|
||||||
|
USB2_SUSPEND_N_SEL | USB2_SUSPEND_N,
|
||||||
|
USB2_SUSPEND_N_SEL | USB2_SUSPEND_N);
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_UTMI_CTRL0, SLEEPM, SLEEPM);
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_HS_PHY_CTRL_COMMON0,
|
||||||
|
SIDDQ_SEL, SIDDQ_SEL);
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_HS_PHY_CTRL_COMMON0,
|
||||||
|
SIDDQ, 0);
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_UTMI_CTRL5, POR, 0);
|
||||||
|
|
||||||
|
qcom_snps_eusb2_hsphy_write_mask(phy->base, USB_PHY_HS_PHY_CTRL2,
|
||||||
|
USB2_SUSPEND_N_SEL, 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
disable_ref_clk:
|
||||||
|
clk_disable_unprepare(phy->ref_clk);
|
||||||
|
|
||||||
|
disable_vreg:
|
||||||
|
regulator_bulk_disable(ARRAY_SIZE(phy->vregs), phy->vregs);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int qcom_snps_eusb2_hsphy_exit(struct phy *p)
|
||||||
|
{
|
||||||
|
struct qcom_snps_eusb2_hsphy *phy = phy_get_drvdata(p);
|
||||||
|
|
||||||
|
clk_disable_unprepare(phy->ref_clk);
|
||||||
|
|
||||||
|
regulator_bulk_disable(ARRAY_SIZE(phy->vregs), phy->vregs);
|
||||||
|
|
||||||
|
phy_exit(phy->repeater);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct phy_ops qcom_snps_eusb2_hsphy_ops = {
|
||||||
|
.init = qcom_snps_eusb2_hsphy_init,
|
||||||
|
.exit = qcom_snps_eusb2_hsphy_exit,
|
||||||
|
.set_mode = qcom_snps_eusb2_hsphy_set_mode,
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int qcom_snps_eusb2_hsphy_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct device *dev = &pdev->dev;
|
||||||
|
struct device_node *np = dev->of_node;
|
||||||
|
struct qcom_snps_eusb2_hsphy *phy;
|
||||||
|
struct phy_provider *phy_provider;
|
||||||
|
struct phy *generic_phy;
|
||||||
|
int ret, i;
|
||||||
|
int num;
|
||||||
|
|
||||||
|
phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL);
|
||||||
|
if (!phy)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
phy->base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
if (IS_ERR(phy->base))
|
||||||
|
return PTR_ERR(phy->base);
|
||||||
|
|
||||||
|
phy->phy_reset = devm_reset_control_get_exclusive(dev, NULL);
|
||||||
|
if (IS_ERR(phy->phy_reset))
|
||||||
|
return PTR_ERR(phy->phy_reset);
|
||||||
|
|
||||||
|
phy->ref_clk = devm_clk_get(dev, "ref");
|
||||||
|
if (IS_ERR(phy->ref_clk))
|
||||||
|
return dev_err_probe(dev, PTR_ERR(phy->ref_clk),
|
||||||
|
"failed to get ref clk\n");
|
||||||
|
|
||||||
|
num = ARRAY_SIZE(phy->vregs);
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
phy->vregs[i].supply = eusb2_hsphy_vreg_names[i];
|
||||||
|
|
||||||
|
ret = devm_regulator_bulk_get(dev, num, phy->vregs);
|
||||||
|
if (ret)
|
||||||
|
return dev_err_probe(dev, ret,
|
||||||
|
"failed to get regulator supplies\n");
|
||||||
|
|
||||||
|
phy->repeater = devm_of_phy_get_by_index(dev, np, 0);
|
||||||
|
if (IS_ERR(phy->repeater))
|
||||||
|
return dev_err_probe(dev, PTR_ERR(phy->repeater),
|
||||||
|
"failed to get repeater\n");
|
||||||
|
|
||||||
|
generic_phy = devm_phy_create(dev, NULL, &qcom_snps_eusb2_hsphy_ops);
|
||||||
|
if (IS_ERR(generic_phy)) {
|
||||||
|
dev_err(dev, "failed to create phy %d\n", ret);
|
||||||
|
return PTR_ERR(generic_phy);
|
||||||
|
}
|
||||||
|
|
||||||
|
dev_set_drvdata(dev, phy);
|
||||||
|
phy_set_drvdata(generic_phy, phy);
|
||||||
|
|
||||||
|
phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
|
||||||
|
if (IS_ERR(phy_provider))
|
||||||
|
return PTR_ERR(phy_provider);
|
||||||
|
|
||||||
|
dev_info(dev, "Registered Qcom-eUSB2 phy\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct of_device_id qcom_snps_eusb2_hsphy_of_match_table[] = {
|
||||||
|
{ .compatible = "qcom,sm8550-snps-eusb2-phy", },
|
||||||
|
{ },
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, qcom_snps_eusb2_hsphy_of_match_table);
|
||||||
|
|
||||||
|
static struct platform_driver qcom_snps_eusb2_hsphy_driver = {
|
||||||
|
.probe = qcom_snps_eusb2_hsphy_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "qcom-snps-eusb2-hsphy",
|
||||||
|
.of_match_table = qcom_snps_eusb2_hsphy_of_match_table,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
module_platform_driver(qcom_snps_eusb2_hsphy_driver);
|
||||||
|
MODULE_DESCRIPTION("Qualcomm SNPS eUSB2 HS PHY driver");
|
||||||
|
MODULE_LICENSE("GPL");
|
|
@ -18,7 +18,6 @@
|
||||||
#define R8A779F0_ETH_SERDES_BANK_SELECT 0x03fc
|
#define R8A779F0_ETH_SERDES_BANK_SELECT 0x03fc
|
||||||
#define R8A779F0_ETH_SERDES_TIMEOUT_US 100000
|
#define R8A779F0_ETH_SERDES_TIMEOUT_US 100000
|
||||||
#define R8A779F0_ETH_SERDES_NUM_RETRY_LINKUP 3
|
#define R8A779F0_ETH_SERDES_NUM_RETRY_LINKUP 3
|
||||||
#define R8A779F0_ETH_SERDES_NUM_RETRY_INIT 3
|
|
||||||
|
|
||||||
struct r8a779f0_eth_serdes_drv_data;
|
struct r8a779f0_eth_serdes_drv_data;
|
||||||
struct r8a779f0_eth_serdes_channel {
|
struct r8a779f0_eth_serdes_channel {
|
||||||
|
@ -242,53 +241,48 @@ static int r8a779f0_eth_serdes_hw_init(struct r8a779f0_eth_serdes_channel *chann
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = r8a779f0_eth_serdes_reg_wait(&dd->channel[0], 0x0000, 0x380, BIT(15), 0);
|
return r8a779f0_eth_serdes_reg_wait(&dd->channel[0], 0x0000, 0x380, BIT(15), 0);
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
for (i = 0; i < R8A779F0_ETH_SERDES_NUM; i++) {
|
|
||||||
ret = r8a779f0_eth_serdes_chan_setting(&dd->channel[i]);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < R8A779F0_ETH_SERDES_NUM; i++) {
|
|
||||||
ret = r8a779f0_eth_serdes_chan_speed(&dd->channel[i]);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < R8A779F0_ETH_SERDES_NUM; i++)
|
|
||||||
r8a779f0_eth_serdes_write32(dd->channel[i].addr, 0x03c0, 0x380, 0x0000);
|
|
||||||
for (i = 0; i < R8A779F0_ETH_SERDES_NUM; i++)
|
|
||||||
r8a779f0_eth_serdes_write32(dd->channel[i].addr, 0x03d0, 0x380, 0x0000);
|
|
||||||
|
|
||||||
for (i = 0; i < R8A779F0_ETH_SERDES_NUM; i++) {
|
|
||||||
ret = r8a779f0_eth_serdes_monitor_linkup(&dd->channel[i]);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int r8a779f0_eth_serdes_init(struct phy *p)
|
static int r8a779f0_eth_serdes_init(struct phy *p)
|
||||||
{
|
{
|
||||||
struct r8a779f0_eth_serdes_channel *channel = phy_get_drvdata(p);
|
struct r8a779f0_eth_serdes_channel *channel = phy_get_drvdata(p);
|
||||||
int i, ret;
|
int ret;
|
||||||
|
|
||||||
for (i = 0; i < R8A779F0_ETH_SERDES_NUM_RETRY_INIT; i++) {
|
ret = r8a779f0_eth_serdes_hw_init(channel);
|
||||||
ret = r8a779f0_eth_serdes_hw_init(channel);
|
if (!ret)
|
||||||
if (!ret) {
|
channel->dd->initialized = true;
|
||||||
channel->dd->initialized = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
usleep_range(1000, 2000);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int r8a779f0_eth_serdes_hw_init_late(struct r8a779f0_eth_serdes_channel
|
||||||
|
*channel)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = r8a779f0_eth_serdes_chan_setting(channel);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = r8a779f0_eth_serdes_chan_speed(channel);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
r8a779f0_eth_serdes_write32(channel->addr, 0x03c0, 0x380, 0x0000);
|
||||||
|
|
||||||
|
r8a779f0_eth_serdes_write32(channel->addr, 0x03d0, 0x380, 0x0000);
|
||||||
|
|
||||||
|
return r8a779f0_eth_serdes_monitor_linkup(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int r8a779f0_eth_serdes_power_on(struct phy *p)
|
||||||
|
{
|
||||||
|
struct r8a779f0_eth_serdes_channel *channel = phy_get_drvdata(p);
|
||||||
|
|
||||||
|
return r8a779f0_eth_serdes_hw_init_late(channel);
|
||||||
|
}
|
||||||
|
|
||||||
static int r8a779f0_eth_serdes_set_mode(struct phy *p, enum phy_mode mode,
|
static int r8a779f0_eth_serdes_set_mode(struct phy *p, enum phy_mode mode,
|
||||||
int submode)
|
int submode)
|
||||||
{
|
{
|
||||||
|
@ -319,6 +313,7 @@ static int r8a779f0_eth_serdes_set_speed(struct phy *p, int speed)
|
||||||
|
|
||||||
static const struct phy_ops r8a779f0_eth_serdes_ops = {
|
static const struct phy_ops r8a779f0_eth_serdes_ops = {
|
||||||
.init = r8a779f0_eth_serdes_init,
|
.init = r8a779f0_eth_serdes_init,
|
||||||
|
.power_on = r8a779f0_eth_serdes_power_on,
|
||||||
.set_mode = r8a779f0_eth_serdes_set_mode,
|
.set_mode = r8a779f0_eth_serdes_set_mode,
|
||||||
.set_speed = r8a779f0_eth_serdes_set_speed,
|
.set_speed = r8a779f0_eth_serdes_set_speed,
|
||||||
};
|
};
|
||||||
|
|
|
@ -808,9 +808,8 @@ static int tcphy_get_mode(struct rockchip_typec_phy *tcphy)
|
||||||
struct extcon_dev *edev = tcphy->extcon;
|
struct extcon_dev *edev = tcphy->extcon;
|
||||||
union extcon_property_value property;
|
union extcon_property_value property;
|
||||||
unsigned int id;
|
unsigned int id;
|
||||||
bool ufp, dp;
|
|
||||||
u8 mode;
|
u8 mode;
|
||||||
int ret;
|
int ret, ufp, dp;
|
||||||
|
|
||||||
if (!edev)
|
if (!edev)
|
||||||
return MODE_DFP_USB;
|
return MODE_DFP_USB;
|
||||||
|
@ -821,10 +820,10 @@ static int tcphy_get_mode(struct rockchip_typec_phy *tcphy)
|
||||||
mode = MODE_DFP_USB;
|
mode = MODE_DFP_USB;
|
||||||
id = EXTCON_USB_HOST;
|
id = EXTCON_USB_HOST;
|
||||||
|
|
||||||
if (ufp) {
|
if (ufp > 0) {
|
||||||
mode = MODE_UFP_USB;
|
mode = MODE_UFP_USB;
|
||||||
id = EXTCON_USB;
|
id = EXTCON_USB;
|
||||||
} else if (dp) {
|
} else if (dp > 0) {
|
||||||
mode = MODE_DFP_DP;
|
mode = MODE_DFP_DP;
|
||||||
id = EXTCON_DISP_DP;
|
id = EXTCON_DISP_DP;
|
||||||
|
|
||||||
|
|
|
@ -718,6 +718,22 @@ static int tegra_xusb_setup_usb_role_switch(struct tegra_xusb_port *port)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tegra_xusb_parse_usb_role_default_mode(struct tegra_xusb_port *port)
|
||||||
|
{
|
||||||
|
enum usb_role role = USB_ROLE_NONE;
|
||||||
|
enum usb_dr_mode mode = usb_get_role_switch_default_mode(&port->dev);
|
||||||
|
|
||||||
|
if (mode == USB_DR_MODE_HOST)
|
||||||
|
role = USB_ROLE_HOST;
|
||||||
|
else if (mode == USB_DR_MODE_PERIPHERAL)
|
||||||
|
role = USB_ROLE_DEVICE;
|
||||||
|
|
||||||
|
if (role != USB_ROLE_NONE) {
|
||||||
|
usb_role_switch_set_role(port->usb_role_sw, role);
|
||||||
|
dev_dbg(&port->dev, "usb role default mode is %s", modes[mode]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int tegra_xusb_usb2_port_parse_dt(struct tegra_xusb_usb2_port *usb2)
|
static int tegra_xusb_usb2_port_parse_dt(struct tegra_xusb_usb2_port *usb2)
|
||||||
{
|
{
|
||||||
struct tegra_xusb_port *port = &usb2->base;
|
struct tegra_xusb_port *port = &usb2->base;
|
||||||
|
@ -747,6 +763,7 @@ static int tegra_xusb_usb2_port_parse_dt(struct tegra_xusb_usb2_port *usb2)
|
||||||
err = tegra_xusb_setup_usb_role_switch(port);
|
err = tegra_xusb_setup_usb_role_switch(port);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
tegra_xusb_parse_usb_role_default_mode(port);
|
||||||
} else {
|
} else {
|
||||||
dev_err(&port->dev, "usb-role-switch not found for %s mode",
|
dev_err(&port->dev, "usb-role-switch not found for %s mode",
|
||||||
modes[usb2->mode]);
|
modes[usb2->mode]);
|
||||||
|
|
|
@ -58,6 +58,14 @@ enum wiz_lane_standard_mode {
|
||||||
LANE_MODE_GEN4,
|
LANE_MODE_GEN4,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* List of master lanes used for lane swapping
|
||||||
|
*/
|
||||||
|
enum wiz_typec_master_lane {
|
||||||
|
LANE0 = 0,
|
||||||
|
LANE2 = 2,
|
||||||
|
};
|
||||||
|
|
||||||
enum wiz_refclk_mux_sel {
|
enum wiz_refclk_mux_sel {
|
||||||
PLL0_REFCLK,
|
PLL0_REFCLK,
|
||||||
PLL1_REFCLK,
|
PLL1_REFCLK,
|
||||||
|
@ -194,6 +202,9 @@ static const struct reg_field p_mac_div_sel1[WIZ_MAX_LANES] = {
|
||||||
static const struct reg_field typec_ln10_swap =
|
static const struct reg_field typec_ln10_swap =
|
||||||
REG_FIELD(WIZ_SERDES_TYPEC, 30, 30);
|
REG_FIELD(WIZ_SERDES_TYPEC, 30, 30);
|
||||||
|
|
||||||
|
static const struct reg_field typec_ln23_swap =
|
||||||
|
REG_FIELD(WIZ_SERDES_TYPEC, 31, 31);
|
||||||
|
|
||||||
struct wiz_clk_mux {
|
struct wiz_clk_mux {
|
||||||
struct clk_hw hw;
|
struct clk_hw hw;
|
||||||
struct regmap_field *field;
|
struct regmap_field *field;
|
||||||
|
@ -367,6 +378,7 @@ struct wiz {
|
||||||
struct regmap_field *mux_sel_field[WIZ_MUX_NUM_CLOCKS];
|
struct regmap_field *mux_sel_field[WIZ_MUX_NUM_CLOCKS];
|
||||||
struct regmap_field *div_sel_field[WIZ_DIV_NUM_CLOCKS_16G];
|
struct regmap_field *div_sel_field[WIZ_DIV_NUM_CLOCKS_16G];
|
||||||
struct regmap_field *typec_ln10_swap;
|
struct regmap_field *typec_ln10_swap;
|
||||||
|
struct regmap_field *typec_ln23_swap;
|
||||||
struct regmap_field *sup_legacy_clk_override;
|
struct regmap_field *sup_legacy_clk_override;
|
||||||
|
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
|
@ -376,6 +388,7 @@ struct wiz {
|
||||||
struct gpio_desc *gpio_typec_dir;
|
struct gpio_desc *gpio_typec_dir;
|
||||||
int typec_dir_delay;
|
int typec_dir_delay;
|
||||||
u32 lane_phy_type[WIZ_MAX_LANES];
|
u32 lane_phy_type[WIZ_MAX_LANES];
|
||||||
|
u32 master_lane_num[WIZ_MAX_LANES];
|
||||||
struct clk *input_clks[WIZ_MAX_INPUT_CLOCKS];
|
struct clk *input_clks[WIZ_MAX_INPUT_CLOCKS];
|
||||||
struct clk *output_clks[WIZ_MAX_OUTPUT_CLOCKS];
|
struct clk *output_clks[WIZ_MAX_OUTPUT_CLOCKS];
|
||||||
struct clk_onecell_data clk_data;
|
struct clk_onecell_data clk_data;
|
||||||
|
@ -675,6 +688,13 @@ static int wiz_regfield_init(struct wiz *wiz)
|
||||||
return PTR_ERR(wiz->typec_ln10_swap);
|
return PTR_ERR(wiz->typec_ln10_swap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wiz->typec_ln23_swap = devm_regmap_field_alloc(dev, regmap,
|
||||||
|
typec_ln23_swap);
|
||||||
|
if (IS_ERR(wiz->typec_ln23_swap)) {
|
||||||
|
dev_err(dev, "LN23_SWAP reg field init failed\n");
|
||||||
|
return PTR_ERR(wiz->typec_ln23_swap);
|
||||||
|
}
|
||||||
|
|
||||||
wiz->phy_en_refclk = devm_regmap_field_alloc(dev, regmap, phy_en_refclk);
|
wiz->phy_en_refclk = devm_regmap_field_alloc(dev, regmap, phy_en_refclk);
|
||||||
if (IS_ERR(wiz->phy_en_refclk)) {
|
if (IS_ERR(wiz->phy_en_refclk)) {
|
||||||
dev_err(dev, "PHY_EN_REFCLK reg field init failed\n");
|
dev_err(dev, "PHY_EN_REFCLK reg field init failed\n");
|
||||||
|
@ -1234,15 +1254,39 @@ static int wiz_phy_reset_deassert(struct reset_controller_dev *rcdev,
|
||||||
struct wiz *wiz = dev_get_drvdata(dev);
|
struct wiz *wiz = dev_get_drvdata(dev);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* if typec-dir gpio was specified, set LN10 SWAP bit based on that */
|
if (id == 0) {
|
||||||
if (id == 0 && wiz->gpio_typec_dir) {
|
/* if typec-dir gpio was specified, set LN10 SWAP bit based on that */
|
||||||
if (wiz->typec_dir_delay)
|
if (wiz->gpio_typec_dir) {
|
||||||
msleep_interruptible(wiz->typec_dir_delay);
|
if (wiz->typec_dir_delay)
|
||||||
|
msleep_interruptible(wiz->typec_dir_delay);
|
||||||
|
|
||||||
if (gpiod_get_value_cansleep(wiz->gpio_typec_dir))
|
if (gpiod_get_value_cansleep(wiz->gpio_typec_dir))
|
||||||
regmap_field_write(wiz->typec_ln10_swap, 1);
|
regmap_field_write(wiz->typec_ln10_swap, 1);
|
||||||
else
|
else
|
||||||
regmap_field_write(wiz->typec_ln10_swap, 0);
|
regmap_field_write(wiz->typec_ln10_swap, 0);
|
||||||
|
} else {
|
||||||
|
/* if no typec-dir gpio is specified and PHY type is USB3
|
||||||
|
* with master lane number is '0' or '2', then set LN10 or
|
||||||
|
* LN23 SWAP bit to '1' respectively.
|
||||||
|
*/
|
||||||
|
u32 num_lanes = wiz->num_lanes;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < num_lanes; i++) {
|
||||||
|
if (wiz->lane_phy_type[i] == PHY_TYPE_USB3) {
|
||||||
|
switch (wiz->master_lane_num[i]) {
|
||||||
|
case LANE0:
|
||||||
|
regmap_field_write(wiz->typec_ln10_swap, 1);
|
||||||
|
break;
|
||||||
|
case LANE2:
|
||||||
|
regmap_field_write(wiz->typec_ln23_swap, 1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
|
@ -1386,8 +1430,10 @@ static int wiz_get_lane_phy_types(struct device *dev, struct wiz *wiz)
|
||||||
dev_dbg(dev, "%s: Lanes %u-%u have phy-type %u\n", __func__,
|
dev_dbg(dev, "%s: Lanes %u-%u have phy-type %u\n", __func__,
|
||||||
reg, reg + num_lanes - 1, phy_type);
|
reg, reg + num_lanes - 1, phy_type);
|
||||||
|
|
||||||
for (i = reg; i < reg + num_lanes; i++)
|
for (i = reg; i < reg + num_lanes; i++) {
|
||||||
|
wiz->master_lane_num[i] = reg;
|
||||||
wiz->lane_phy_type[i] = phy_type;
|
wiz->lane_phy_type[i] = phy_type;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -80,19 +80,11 @@ static int exynos_ehci_get_phy(struct device *dev,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
phy = devm_of_phy_get(dev, child, NULL);
|
phy = devm_of_phy_optional_get(dev, child, NULL);
|
||||||
exynos_ehci->phy[phy_number] = phy;
|
exynos_ehci->phy[phy_number] = phy;
|
||||||
if (IS_ERR(phy)) {
|
if (IS_ERR(phy)) {
|
||||||
ret = PTR_ERR(phy);
|
of_node_put(child);
|
||||||
if (ret == -EPROBE_DEFER) {
|
return PTR_ERR(phy);
|
||||||
of_node_put(child);
|
|
||||||
return ret;
|
|
||||||
} else if (ret != -ENOSYS && ret != -ENODEV) {
|
|
||||||
dev_err(dev,
|
|
||||||
"Error retrieving usb2 phy: %d\n", ret);
|
|
||||||
of_node_put(child);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,12 +100,10 @@ static int exynos_ehci_phy_enable(struct device *dev)
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
for (i = 0; ret == 0 && i < PHY_NUMBER; i++)
|
for (i = 0; ret == 0 && i < PHY_NUMBER; i++)
|
||||||
if (!IS_ERR(exynos_ehci->phy[i]))
|
ret = phy_power_on(exynos_ehci->phy[i]);
|
||||||
ret = phy_power_on(exynos_ehci->phy[i]);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
for (i--; i >= 0; i--)
|
for (i--; i >= 0; i--)
|
||||||
if (!IS_ERR(exynos_ehci->phy[i]))
|
phy_power_off(exynos_ehci->phy[i]);
|
||||||
phy_power_off(exynos_ehci->phy[i]);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -125,8 +115,7 @@ static void exynos_ehci_phy_disable(struct device *dev)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < PHY_NUMBER; i++)
|
for (i = 0; i < PHY_NUMBER; i++)
|
||||||
if (!IS_ERR(exynos_ehci->phy[i]))
|
phy_power_off(exynos_ehci->phy[i]);
|
||||||
phy_power_off(exynos_ehci->phy[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void exynos_setup_vbus_gpio(struct device *dev)
|
static void exynos_setup_vbus_gpio(struct device *dev)
|
||||||
|
|
|
@ -69,19 +69,11 @@ static int exynos_ohci_get_phy(struct device *dev,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
phy = devm_of_phy_get(dev, child, NULL);
|
phy = devm_of_phy_optional_get(dev, child, NULL);
|
||||||
exynos_ohci->phy[phy_number] = phy;
|
exynos_ohci->phy[phy_number] = phy;
|
||||||
if (IS_ERR(phy)) {
|
if (IS_ERR(phy)) {
|
||||||
ret = PTR_ERR(phy);
|
of_node_put(child);
|
||||||
if (ret == -EPROBE_DEFER) {
|
return PTR_ERR(phy);
|
||||||
of_node_put(child);
|
|
||||||
return ret;
|
|
||||||
} else if (ret != -ENOSYS && ret != -ENODEV) {
|
|
||||||
dev_err(dev,
|
|
||||||
"Error retrieving usb2 phy: %d\n", ret);
|
|
||||||
of_node_put(child);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,12 +89,10 @@ static int exynos_ohci_phy_enable(struct device *dev)
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
for (i = 0; ret == 0 && i < PHY_NUMBER; i++)
|
for (i = 0; ret == 0 && i < PHY_NUMBER; i++)
|
||||||
if (!IS_ERR(exynos_ohci->phy[i]))
|
ret = phy_power_on(exynos_ohci->phy[i]);
|
||||||
ret = phy_power_on(exynos_ohci->phy[i]);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
for (i--; i >= 0; i--)
|
for (i--; i >= 0; i--)
|
||||||
if (!IS_ERR(exynos_ohci->phy[i]))
|
phy_power_off(exynos_ohci->phy[i]);
|
||||||
phy_power_off(exynos_ohci->phy[i]);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -114,8 +104,7 @@ static void exynos_ohci_phy_disable(struct device *dev)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < PHY_NUMBER; i++)
|
for (i = 0; i < PHY_NUMBER; i++)
|
||||||
if (!IS_ERR(exynos_ohci->phy[i]))
|
phy_power_off(exynos_ohci->phy[i]);
|
||||||
phy_power_off(exynos_ohci->phy[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int exynos_ohci_probe(struct platform_device *pdev)
|
static int exynos_ohci_probe(struct platform_device *pdev)
|
||||||
|
|
|
@ -250,11 +250,12 @@ static inline void phy_set_bus_width(struct phy *phy, int bus_width)
|
||||||
phy->attrs.bus_width = bus_width;
|
phy->attrs.bus_width = bus_width;
|
||||||
}
|
}
|
||||||
struct phy *phy_get(struct device *dev, const char *string);
|
struct phy *phy_get(struct device *dev, const char *string);
|
||||||
struct phy *phy_optional_get(struct device *dev, const char *string);
|
|
||||||
struct phy *devm_phy_get(struct device *dev, const char *string);
|
struct phy *devm_phy_get(struct device *dev, const char *string);
|
||||||
struct phy *devm_phy_optional_get(struct device *dev, const char *string);
|
struct phy *devm_phy_optional_get(struct device *dev, const char *string);
|
||||||
struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
|
struct phy *devm_of_phy_get(struct device *dev, struct device_node *np,
|
||||||
const char *con_id);
|
const char *con_id);
|
||||||
|
struct phy *devm_of_phy_optional_get(struct device *dev, struct device_node *np,
|
||||||
|
const char *con_id);
|
||||||
struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,
|
struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np,
|
||||||
int index);
|
int index);
|
||||||
void of_phy_put(struct phy *phy);
|
void of_phy_put(struct phy *phy);
|
||||||
|
@ -426,12 +427,6 @@ static inline struct phy *phy_get(struct device *dev, const char *string)
|
||||||
return ERR_PTR(-ENOSYS);
|
return ERR_PTR(-ENOSYS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct phy *phy_optional_get(struct device *dev,
|
|
||||||
const char *string)
|
|
||||||
{
|
|
||||||
return ERR_PTR(-ENOSYS);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline struct phy *devm_phy_get(struct device *dev, const char *string)
|
static inline struct phy *devm_phy_get(struct device *dev, const char *string)
|
||||||
{
|
{
|
||||||
return ERR_PTR(-ENOSYS);
|
return ERR_PTR(-ENOSYS);
|
||||||
|
@ -450,6 +445,13 @@ static inline struct phy *devm_of_phy_get(struct device *dev,
|
||||||
return ERR_PTR(-ENOSYS);
|
return ERR_PTR(-ENOSYS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct phy *devm_of_phy_optional_get(struct device *dev,
|
||||||
|
struct device_node *np,
|
||||||
|
const char *con_id)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct phy *devm_of_phy_get_by_index(struct device *dev,
|
static inline struct phy *devm_of_phy_get_by_index(struct device *dev,
|
||||||
struct device_node *np,
|
struct device_node *np,
|
||||||
int index)
|
int index)
|
||||||
|
|
Loading…
Reference in a new issue