# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/phy/brcm,brcmstb-usb-phy.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Broadcom STB USB PHY

description: Broadcom's PHY that handles EHCI/OHCI and/or XHCI

maintainers:
  - Al Cooper <alcooperx@gmail.com>
  - Rafał Miłecki <rafal@milecki.pl>

properties:
  compatible:
    enum:
      - brcm,bcm4908-usb-phy
      - brcm,bcm7211-usb-phy
      - brcm,bcm7216-usb-phy
      - brcm,brcmstb-usb-phy

  reg:
    minItems: 1
    items:
      - description: the base CTRL register
      - description: XHCI EC register
      - description: XHCI GBL register
      - description: USB PHY register
      - description: USB MDIO register
      - description: BDC register

  reg-names:
    minItems: 1
    items:
      - const: ctrl
      - const: xhci_ec
      - const: xhci_gbl
      - const: usb_phy
      - const: usb_mdio
      - const: bdc_ec

  power-domains:
    maxItems: 1

  clocks:
    minItems: 1
    maxItems: 2

  clock-names:
    minItems: 1
    items:
      - const: sw_usb
      - const: sw_usb3

  interrupts:
    description: wakeup interrupt

  interrupt-names:
    const: wake

  brcm,ipp:
    $ref: /schemas/types.yaml#/definitions/uint32
    description: Invert Port Power
    minimum: 0
    maximum: 1

  brcm,ioc:
    $ref: /schemas/types.yaml#/definitions/uint32
    description: Invert Over Current detection
    minimum: 0
    maximum: 1

  dr_mode:
    description: PHY Device mode. If this property is not defined, the PHY will
      default to "host" mode.
    enum:
      - host
      - peripheral
      - drd
      - typec-pd

  brcm,syscon-piarbctl:
    description: phandle to syscon for handling config registers
    $ref: /schemas/types.yaml#/definitions/phandle

  brcm,has-xhci:
    description: Indicates the PHY has an XHCI PHY.
    type: boolean

  brcm,has-eohci:
    description: Indicates the PHY has an EHCI/OHCI PHY.
    type: boolean

  "#phy-cells":
    description: |
      Cell allows setting the type of the PHY. Possible values are:
      - PHY_TYPE_USB2 for USB1.1/2.0 PHY
      - PHY_TYPE_USB3 for USB3.x PHY
    const: 1

required:
  - reg
  - "#phy-cells"

anyOf:
  - required:
      - brcm,has-xhci
  - required:
      - brcm,has-eohci

allOf:
  - if:
      properties:
        compatible:
          contains:
            enum:
              - brcm,bcm4908-usb-phy
              - brcm,brcmstb-usb-phy
    then:
      properties:
        reg:
          minItems: 1
          maxItems: 2
  - if:
      properties:
        compatible:
          contains:
            const: brcm,bcm7211-usb-phy
    then:
      properties:
        reg:
          minItems: 5
          maxItems: 6
        reg-names:
          minItems: 5
          maxItems: 6
  - if:
      properties:
        compatible:
          contains:
            const: brcm,bcm7216-usb-phy
    then:
      properties:
        reg:
          minItems: 3
          maxItems: 3
        reg-names:
          minItems: 3
          maxItems: 3

additionalProperties: false

examples:
  - |
    #include <dt-bindings/phy/phy.h>

    usb-phy@f0470200 {
        compatible = "brcm,brcmstb-usb-phy";
        reg = <0xf0470200 0xb8>,
              <0xf0471940 0x6c0>;
        #phy-cells = <1>;
        dr_mode = "host";
        brcm,ioc = <1>;
        brcm,ipp = <1>;
        brcm,has-xhci;
        brcm,has-eohci;
        clocks = <&usb20>, <&usb30>;
        clock-names = "sw_usb", "sw_usb3";
    };
  - |
    #include <dt-bindings/phy/phy.h>

    usb-phy@29f0200 {
        compatible = "brcm,bcm7211-usb-phy";
        reg = <0x29f0200 0x200>,
              <0x29c0880 0x30>,
              <0x29cc100 0x534>,
              <0x2808000 0x24>,
              <0x2980080 0x8>;
        reg-names = "ctrl",
            "xhci_ec",
            "xhci_gbl",
            "usb_phy",
            "usb_mdio";
        brcm,ioc = <0x0>;
        brcm,ipp = <0x0>;
        interrupts = <0x30>;
        interrupt-parent = <&vpu_intr1_nosec_intc>;
        interrupt-names = "wake";
        #phy-cells = <0x1>;
        brcm,has-xhci;
        brcm,syscon-piarbctl = <&syscon_piarbctl>;
        clocks = <&scmi_clk 256>;
        clock-names = "sw_usb";
    };