162306a36Sopenharmony_ci# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
262306a36Sopenharmony_ci# Copyright (c) 2020 MediaTek
362306a36Sopenharmony_ci%YAML 1.2
462306a36Sopenharmony_ci---
562306a36Sopenharmony_ci$id: http://devicetree.org/schemas/usb/mediatek,mtu3.yaml#
662306a36Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml#
762306a36Sopenharmony_ci
862306a36Sopenharmony_cititle: MediaTek USB3 DRD Controller
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cimaintainers:
1162306a36Sopenharmony_ci  - Chunfeng Yun <chunfeng.yun@mediatek.com>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ciallOf:
1462306a36Sopenharmony_ci  - $ref: usb-drd.yaml
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cidescription: |
1762306a36Sopenharmony_ci  The DRD controller has a glue layer IPPC (IP Port Control), and its host is
1862306a36Sopenharmony_ci  based on xHCI.
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciproperties:
2162306a36Sopenharmony_ci  compatible:
2262306a36Sopenharmony_ci    items:
2362306a36Sopenharmony_ci      - enum:
2462306a36Sopenharmony_ci          - mediatek,mt2712-mtu3
2562306a36Sopenharmony_ci          - mediatek,mt8173-mtu3
2662306a36Sopenharmony_ci          - mediatek,mt8183-mtu3
2762306a36Sopenharmony_ci          - mediatek,mt8186-mtu3
2862306a36Sopenharmony_ci          - mediatek,mt8188-mtu3
2962306a36Sopenharmony_ci          - mediatek,mt8192-mtu3
3062306a36Sopenharmony_ci          - mediatek,mt8195-mtu3
3162306a36Sopenharmony_ci          - mediatek,mt8365-mtu3
3262306a36Sopenharmony_ci      - const: mediatek,mtu3
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci  reg:
3562306a36Sopenharmony_ci    items:
3662306a36Sopenharmony_ci      - description: the registers of device MAC
3762306a36Sopenharmony_ci      - description: the registers of IP Port Control
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci  reg-names:
4062306a36Sopenharmony_ci    items:
4162306a36Sopenharmony_ci      - const: mac
4262306a36Sopenharmony_ci      - const: ippc
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci  interrupts:
4562306a36Sopenharmony_ci    description:
4662306a36Sopenharmony_ci      use "interrupts-extended" when the interrupts are connected to the
4762306a36Sopenharmony_ci      separate interrupt controllers
4862306a36Sopenharmony_ci    minItems: 1
4962306a36Sopenharmony_ci    items:
5062306a36Sopenharmony_ci      - description: SSUSB device controller interrupt
5162306a36Sopenharmony_ci      - description: optional, wakeup interrupt used to support runtime PM
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci  interrupt-names:
5462306a36Sopenharmony_ci    items:
5562306a36Sopenharmony_ci      - const: device
5662306a36Sopenharmony_ci      - const: wakeup
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci  power-domains:
5962306a36Sopenharmony_ci    description: A phandle to USB power domain node to control USB's MTCMOS
6062306a36Sopenharmony_ci    maxItems: 1
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci  clocks:
6362306a36Sopenharmony_ci    minItems: 1
6462306a36Sopenharmony_ci    items:
6562306a36Sopenharmony_ci      - description: Controller clock used by normal mode
6662306a36Sopenharmony_ci      - description: Reference clock used by low power mode etc
6762306a36Sopenharmony_ci      - description: Mcu bus clock for register access
6862306a36Sopenharmony_ci      - description: DMA bus clock for data transfer
6962306a36Sopenharmony_ci      - description: DRD controller clock
7062306a36Sopenharmony_ci      - description: Frame count clock
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci  clock-names:
7362306a36Sopenharmony_ci    minItems: 1
7462306a36Sopenharmony_ci    items:
7562306a36Sopenharmony_ci      - const: sys_ck  # required, others are optional
7662306a36Sopenharmony_ci      - const: ref_ck
7762306a36Sopenharmony_ci      - const: mcu_ck
7862306a36Sopenharmony_ci      - const: dma_ck
7962306a36Sopenharmony_ci      - const: xhci_ck
8062306a36Sopenharmony_ci      - const: frmcnt_ck
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci  phys:
8362306a36Sopenharmony_ci    description:
8462306a36Sopenharmony_ci      List of all the USB PHYs used, it's better to keep the sequence
8562306a36Sopenharmony_ci      as the hardware layout.
8662306a36Sopenharmony_ci    minItems: 1
8762306a36Sopenharmony_ci    items:
8862306a36Sopenharmony_ci      - description: USB2/HS PHY    # required, others are optional
8962306a36Sopenharmony_ci      - description: USB3/SS(P) PHY
9062306a36Sopenharmony_ci      - description: USB2/HS PHY    # the following for backward compatible
9162306a36Sopenharmony_ci      - description: USB3/SS(P) PHY
9262306a36Sopenharmony_ci      - description: USB2/HS PHY
9362306a36Sopenharmony_ci      - description: USB3/SS(P) PHY
9462306a36Sopenharmony_ci      - description: USB2/HS PHY
9562306a36Sopenharmony_ci      - description: USB3/SS(P) PHY
9662306a36Sopenharmony_ci      - description: USB2/HS PHY
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci  vusb33-supply:
9962306a36Sopenharmony_ci    description: Regulator of USB AVDD3.3v
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci  vbus-supply:
10262306a36Sopenharmony_ci    deprecated: true
10362306a36Sopenharmony_ci    description: |
10462306a36Sopenharmony_ci      Regulator of USB VBUS5v, needed when supports dual-role mode.
10562306a36Sopenharmony_ci      Particularly, if use an output GPIO to control a VBUS regulator, should
10662306a36Sopenharmony_ci      model it as a regulator. See bindings/regulator/fixed-regulator.yaml
10762306a36Sopenharmony_ci      It's considered valid for compatibility reasons, not allowed for
10862306a36Sopenharmony_ci      new bindings, and put into a usb-connector node.
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci  dr_mode:
11162306a36Sopenharmony_ci    enum: [host, peripheral, otg]
11262306a36Sopenharmony_ci    default: otg
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci  maximum-speed:
11562306a36Sopenharmony_ci    enum: [super-speed-plus, super-speed, high-speed, full-speed]
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci  resets:
11862306a36Sopenharmony_ci    maxItems: 1
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci  "#address-cells":
12162306a36Sopenharmony_ci    enum: [1, 2]
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci  "#size-cells":
12462306a36Sopenharmony_ci    enum: [1, 2]
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci  ranges: true
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci  extcon:
12962306a36Sopenharmony_ci    deprecated: true
13062306a36Sopenharmony_ci    description: |
13162306a36Sopenharmony_ci      Phandle to the extcon device detecting the IDDIG state, needed
13262306a36Sopenharmony_ci      when supports dual-role mode.
13362306a36Sopenharmony_ci      It's considered valid for compatibility reasons, not allowed for
13462306a36Sopenharmony_ci      new bindings, and use "usb-role-switch" property instead.
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci  usb-role-switch:
13762306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/flag
13862306a36Sopenharmony_ci    description: Support role switch.
13962306a36Sopenharmony_ci    type: boolean
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci  role-switch-default-mode:
14262306a36Sopenharmony_ci    enum: [host, peripheral]
14362306a36Sopenharmony_ci    default: host
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci  connector:
14662306a36Sopenharmony_ci    $ref: /schemas/connector/usb-connector.yaml#
14762306a36Sopenharmony_ci    description:
14862306a36Sopenharmony_ci      Connector for dual role switch, especially for "gpio-usb-b-connector"
14962306a36Sopenharmony_ci    type: object
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci  port:
15262306a36Sopenharmony_ci    description:
15362306a36Sopenharmony_ci      Any connector to the data bus of this controller should be modelled
15462306a36Sopenharmony_ci      using the OF graph bindings specified, if the "usb-role-switch"
15562306a36Sopenharmony_ci      property is used. See graph.txt
15662306a36Sopenharmony_ci    $ref: /schemas/graph.yaml#/properties/port
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci  enable-manual-drd:
15962306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/flag
16062306a36Sopenharmony_ci    description:
16162306a36Sopenharmony_ci      supports manual dual-role switch via debugfs; usually used when
16262306a36Sopenharmony_ci      receptacle is TYPE-A and also wants to support dual-role mode.
16362306a36Sopenharmony_ci    type: boolean
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci  wakeup-source:
16662306a36Sopenharmony_ci    description: enable USB remote wakeup, see power/wakeup-source.txt
16762306a36Sopenharmony_ci    type: boolean
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci  mediatek,syscon-wakeup:
17062306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/phandle-array
17162306a36Sopenharmony_ci    maxItems: 1
17262306a36Sopenharmony_ci    description:
17362306a36Sopenharmony_ci      A phandle to syscon used to access the register of the USB wakeup glue
17462306a36Sopenharmony_ci      layer between xHCI and SPM, the field should always be 3 cells long.
17562306a36Sopenharmony_ci    items:
17662306a36Sopenharmony_ci      items:
17762306a36Sopenharmony_ci        - description:
17862306a36Sopenharmony_ci            The first cell represents a phandle to syscon
17962306a36Sopenharmony_ci        - description:
18062306a36Sopenharmony_ci            The second cell represents the register base address of the glue
18162306a36Sopenharmony_ci            layer in syscon
18262306a36Sopenharmony_ci        - description: |
18362306a36Sopenharmony_ci            The third cell represents the hardware version of the glue layer,
18462306a36Sopenharmony_ci            1 - used by mt8173 etc, revision 1 without following IPM rule;
18562306a36Sopenharmony_ci            2 - used by mt2712 etc, revision 2 with following IPM rule;
18662306a36Sopenharmony_ci            101 - used by mt8183, specific 1.01;
18762306a36Sopenharmony_ci            102 - used by mt8192, specific 1.02;
18862306a36Sopenharmony_ci          enum: [1, 2, 101, 102]
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci  mediatek,u3p-dis-msk:
19162306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/uint32
19262306a36Sopenharmony_ci    description: The mask to disable u3ports, bit0 for u3port0,
19362306a36Sopenharmony_ci      bit1 for u3port1, ... etc
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci  mediatek,u2p-dis-msk:
19662306a36Sopenharmony_ci    $ref: /schemas/types.yaml#/definitions/uint32
19762306a36Sopenharmony_ci    description: The mask to disable u2ports, bit0 for u2port0,
19862306a36Sopenharmony_ci      bit1 for u2port1, ... etc; but can't disable u2port0 if dual role mode
19962306a36Sopenharmony_ci      is enabled, so will be skipped in this case.
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci# Required child node when support dual-role
20262306a36Sopenharmony_cipatternProperties:
20362306a36Sopenharmony_ci  "^usb@[0-9a-f]+$":
20462306a36Sopenharmony_ci    type: object
20562306a36Sopenharmony_ci    $ref: /schemas/usb/mediatek,mtk-xhci.yaml#
20662306a36Sopenharmony_ci    description:
20762306a36Sopenharmony_ci      The xhci should be added as subnode to mtu3 as shown in the following
20862306a36Sopenharmony_ci      example if the host mode is enabled.
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_cidependencies:
21162306a36Sopenharmony_ci  connector: [ usb-role-switch ]
21262306a36Sopenharmony_ci  port: [ usb-role-switch ]
21362306a36Sopenharmony_ci  role-switch-default-mode: [ usb-role-switch ]
21462306a36Sopenharmony_ci  wakeup-source: [ 'mediatek,syscon-wakeup' ]
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_cirequired:
21762306a36Sopenharmony_ci  - compatible
21862306a36Sopenharmony_ci  - reg
21962306a36Sopenharmony_ci  - reg-names
22062306a36Sopenharmony_ci  - interrupts
22162306a36Sopenharmony_ci  - clocks
22262306a36Sopenharmony_ci  - clock-names
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ciadditionalProperties: false
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ciexamples:
22762306a36Sopenharmony_ci  # Dual role switch by extcon
22862306a36Sopenharmony_ci  - |
22962306a36Sopenharmony_ci    #include <dt-bindings/clock/mt8173-clk.h>
23062306a36Sopenharmony_ci    #include <dt-bindings/interrupt-controller/arm-gic.h>
23162306a36Sopenharmony_ci    #include <dt-bindings/interrupt-controller/irq.h>
23262306a36Sopenharmony_ci    #include <dt-bindings/phy/phy.h>
23362306a36Sopenharmony_ci    #include <dt-bindings/power/mt8173-power.h>
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci    usb@11271000 {
23662306a36Sopenharmony_ci        compatible = "mediatek,mt8173-mtu3", "mediatek,mtu3";
23762306a36Sopenharmony_ci        reg = <0x11271000 0x3000>, <0x11280700 0x0100>;
23862306a36Sopenharmony_ci        reg-names = "mac", "ippc";
23962306a36Sopenharmony_ci        interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_LOW>;
24062306a36Sopenharmony_ci        phys = <&phy_port0 PHY_TYPE_USB3>, <&phy_port1 PHY_TYPE_USB2>;
24162306a36Sopenharmony_ci        power-domains = <&scpsys MT8173_POWER_DOMAIN_USB>;
24262306a36Sopenharmony_ci        clocks = <&topckgen CLK_TOP_USB30_SEL>;
24362306a36Sopenharmony_ci        clock-names = "sys_ck";
24462306a36Sopenharmony_ci        vusb33-supply = <&mt6397_vusb_reg>;
24562306a36Sopenharmony_ci        vbus-supply = <&usb_p0_vbus>;
24662306a36Sopenharmony_ci        extcon = <&extcon_usb>;
24762306a36Sopenharmony_ci        dr_mode = "otg";
24862306a36Sopenharmony_ci        wakeup-source;
24962306a36Sopenharmony_ci        mediatek,syscon-wakeup = <&pericfg 0x400 1>;
25062306a36Sopenharmony_ci        #address-cells = <1>;
25162306a36Sopenharmony_ci        #size-cells = <1>;
25262306a36Sopenharmony_ci        ranges;
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci        xhci: usb@11270000 {
25562306a36Sopenharmony_ci            compatible = "mediatek,mt8173-xhci", "mediatek,mtk-xhci";
25662306a36Sopenharmony_ci            reg = <0x11270000 0x1000>;
25762306a36Sopenharmony_ci            reg-names = "mac";
25862306a36Sopenharmony_ci            interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_LOW>;
25962306a36Sopenharmony_ci            power-domains = <&scpsys MT8173_POWER_DOMAIN_USB>;
26062306a36Sopenharmony_ci            clocks = <&topckgen CLK_TOP_USB30_SEL>, <&clk26m>;
26162306a36Sopenharmony_ci            clock-names = "sys_ck", "ref_ck";
26262306a36Sopenharmony_ci            vusb33-supply = <&mt6397_vusb_reg>;
26362306a36Sopenharmony_ci        };
26462306a36Sopenharmony_ci    };
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci  # Dual role switch by gpio-usb-b-connector
26762306a36Sopenharmony_ci  - |
26862306a36Sopenharmony_ci    #include <dt-bindings/gpio/gpio.h>
26962306a36Sopenharmony_ci    #include <dt-bindings/power/mt2712-power.h>
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci    usb@112c1000 {
27262306a36Sopenharmony_ci        compatible = "mediatek,mt2712-mtu3", "mediatek,mtu3";
27362306a36Sopenharmony_ci        reg = <0x112c1000 0x3000>, <0x112d0700 0x0100>;
27462306a36Sopenharmony_ci        reg-names = "mac", "ippc";
27562306a36Sopenharmony_ci        interrupts = <GIC_SPI 248 IRQ_TYPE_LEVEL_LOW>;
27662306a36Sopenharmony_ci        phys = <&u2port2 PHY_TYPE_USB2>;
27762306a36Sopenharmony_ci        power-domains = <&scpsys MT2712_POWER_DOMAIN_USB2>;
27862306a36Sopenharmony_ci        clocks = <&topckgen CLK_TOP_USB30_SEL>;
27962306a36Sopenharmony_ci        clock-names = "sys_ck";
28062306a36Sopenharmony_ci        dr_mode = "otg";
28162306a36Sopenharmony_ci        usb-role-switch;
28262306a36Sopenharmony_ci        #address-cells = <1>;
28362306a36Sopenharmony_ci        #size-cells = <1>;
28462306a36Sopenharmony_ci        ranges;
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci        host0: usb@11270000 {
28762306a36Sopenharmony_ci            compatible = "mediatek,mt2712-xhci", "mediatek,mtk-xhci";
28862306a36Sopenharmony_ci            reg = <0x11270000 0x1000>;
28962306a36Sopenharmony_ci            reg-names = "mac";
29062306a36Sopenharmony_ci            interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_LOW>;
29162306a36Sopenharmony_ci            power-domains = <&scpsys MT2712_POWER_DOMAIN_USB>;
29262306a36Sopenharmony_ci            clocks = <&topckgen CLK_TOP_USB30_SEL>, <&clk26m>;
29362306a36Sopenharmony_ci            clock-names = "sys_ck", "ref_ck";
29462306a36Sopenharmony_ci        };
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci        connector {
29762306a36Sopenharmony_ci            compatible = "gpio-usb-b-connector", "usb-b-connector";
29862306a36Sopenharmony_ci            type = "micro";
29962306a36Sopenharmony_ci            id-gpios = <&pio 12 GPIO_ACTIVE_HIGH>;
30062306a36Sopenharmony_ci            vbus-supply = <&usb_p0_vbus>;
30162306a36Sopenharmony_ci        };
30262306a36Sopenharmony_ci    };
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci  # Dual role switch with type-c
30562306a36Sopenharmony_ci  - |
30662306a36Sopenharmony_ci    usb@11201000 {
30762306a36Sopenharmony_ci        compatible = "mediatek,mt8183-mtu3", "mediatek,mtu3";
30862306a36Sopenharmony_ci        reg = <0x11201000 0x2e00>, <0x11203e00 0x0100>;
30962306a36Sopenharmony_ci        reg-names = "mac", "ippc";
31062306a36Sopenharmony_ci        interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_LOW>;
31162306a36Sopenharmony_ci        phys = <&u2port0 PHY_TYPE_USB2>;
31262306a36Sopenharmony_ci        clocks = <&clk26m>;
31362306a36Sopenharmony_ci        clock-names = "sys_ck";
31462306a36Sopenharmony_ci        mediatek,syscon-wakeup = <&pericfg 0x400 1>;
31562306a36Sopenharmony_ci        wakeup-source;
31662306a36Sopenharmony_ci        dr_mode = "otg";
31762306a36Sopenharmony_ci        usb-role-switch;
31862306a36Sopenharmony_ci        role-switch-default-mode = "host";
31962306a36Sopenharmony_ci        #address-cells = <1>;
32062306a36Sopenharmony_ci        #size-cells = <1>;
32162306a36Sopenharmony_ci        ranges;
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci        host: usb@11200000 {
32462306a36Sopenharmony_ci            compatible = "mediatek,mt8183-xhci", "mediatek,mtk-xhci";
32562306a36Sopenharmony_ci            reg = <0x11200000 0x1000>;
32662306a36Sopenharmony_ci            reg-names = "mac";
32762306a36Sopenharmony_ci            interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_LOW>;
32862306a36Sopenharmony_ci            clocks = <&clk26m>;
32962306a36Sopenharmony_ci            clock-names = "sys_ck";
33062306a36Sopenharmony_ci        };
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci        port {
33362306a36Sopenharmony_ci            usb_role_sw: endpoint {
33462306a36Sopenharmony_ci                remote-endpoint = <&hs_ep>;
33562306a36Sopenharmony_ci            };
33662306a36Sopenharmony_ci        };
33762306a36Sopenharmony_ci    };
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci...
340