# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/phy/qcom,msm8998-qmp-usb3-phy.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Qualcomm QMP PHY controller (USB, MSM8998)

maintainers:
  - Vinod Koul <vkoul@kernel.org>

description:
  The QMP PHY controller supports physical layer functionality for USB-C on
  several Qualcomm chipsets.

properties:
  compatible:
    enum:
      - qcom,msm8998-qmp-usb3-phy
      - qcom,qcm2290-qmp-usb3-phy
      - qcom,sdm660-qmp-usb3-phy
      - qcom,sm6115-qmp-usb3-phy

  reg:
    maxItems: 1

  clocks:
    maxItems: 4

  clock-names:
    maxItems: 4

  resets:
    maxItems: 2

  reset-names:
    items:
      - const: phy
      - const: phy_phy

  vdda-phy-supply: true

  vdda-pll-supply: true

  "#clock-cells":
    const: 0

  clock-output-names:
    maxItems: 1

  "#phy-cells":
    const: 0

  orientation-switch:
    description:
      Flag the PHY as possible handler of USB Type-C orientation switching
    type: boolean

  qcom,tcsr-reg:
    $ref: /schemas/types.yaml#/definitions/phandle-array
    items:
      - items:
          - description: phandle to TCSR hardware block
          - description: offset of the VLS CLAMP register
    description: Clamp register present in the TCSR

  ports:
    $ref: /schemas/graph.yaml#/properties/ports
    properties:
      port@0:
        $ref: /schemas/graph.yaml#/properties/port
        description: Output endpoint of the PHY

      port@1:
        $ref: /schemas/graph.yaml#/properties/port
        description: Incoming endpoint from the USB controller

required:
  - compatible
  - reg
  - clocks
  - clock-names
  - resets
  - reset-names
  - vdda-phy-supply
  - vdda-pll-supply
  - "#clock-cells"
  - clock-output-names
  - "#phy-cells"
  - qcom,tcsr-reg

allOf:
  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,msm8998-qmp-usb3-phy
              - qcom,sdm660-qmp-usb3-phy
    then:
      properties:
        clocks:
          maxItems: 4
        clock-names:
          items:
            - const: aux
            - const: ref
            - const: cfg_ahb
            - const: pipe

  - if:
      properties:
        compatible:
          contains:
            enum:
              - qcom,qcm2290-qmp-usb3-phy
              - qcom,sm6115-qmp-usb3-phy
    then:
      properties:
        clocks:
          maxItems: 4
        clock-names:
          items:
            - const: cfg_ahb
            - const: ref
            - const: com_aux
            - const: pipe

additionalProperties: false

examples:
  - |
    #include <dt-bindings/clock/qcom,gcc-msm8998.h>
    #include <dt-bindings/clock/qcom,rpmh.h>

    phy@c010000 {
      compatible = "qcom,msm8998-qmp-usb3-phy";
      reg = <0x0c010000 0x1000>;

      clocks = <&gcc GCC_USB3_PHY_AUX_CLK>,
               <&gcc GCC_USB3_CLKREF_CLK>,
               <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>,
               <&gcc GCC_USB3_PHY_PIPE_CLK>;
      clock-names = "aux",
                    "ref",
                    "cfg_ahb",
                    "pipe";
      clock-output-names = "usb3_phy_pipe_clk_src";
      #clock-cells = <0>;
      #phy-cells = <0>;

      resets = <&gcc GCC_USB3_PHY_BCR>,
               <&gcc GCC_USB3PHY_PHY_BCR>;
      reset-names = "phy",
                    "phy_phy";

      vdda-phy-supply = <&vreg_l1a_0p875>;
      vdda-pll-supply = <&vreg_l2a_1p2>;

      orientation-switch;

      qcom,tcsr-reg = <&tcsr_regs_1 0x6b244>;

      ports {
        #address-cells = <1>;
        #size-cells = <0>;

        port@0 {
          reg = <0>;

          endpoint {
            remote-endpoint = <&pmic_typec_mux_in>;
          };
        };

        port@1 {
          reg = <1>;

          endpoint {
            remote-endpoint = <&usb_dwc3_ss>;
          };
        };
      };
    };
