# 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";
            };
        };
    };