# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/pci/starfive,jh7110-pcie.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: StarFive JH7110 PCIe host controller

maintainers:
  - Kevin Xie <kevin.xie@starfivetech.com>

allOf:
  - $ref: plda,xpressrich3-axi-common.yaml#

properties:
  compatible:
    const: starfive,jh7110-pcie


  reg:
    maxItems: 2

  reg-names:
    maxItems: 2

  clocks:
    items:
      - description: NOC bus clock
      - description: Transport layer clock
      - description: AXI MST0 clock
      - description: APB clock

  clock-names:
    items:
      - const: noc
      - const: tl
      - const: axi_mst0
      - const: apb

  resets:
    items:
      - description: AXI MST0 reset
      - description: AXI SLAVE0 reset
      - description: AXI SLAVE reset
      - description: PCIE BRIDGE reset
      - description: PCIE CORE reset
      - description: PCIE APB reset

  reset-names:
    items:
      - const: mst0
      - const: slv0
      - const: slv
      - const: brg
      - const: core
      - const: apb

  starfive,stg-syscon:
    $ref: /schemas/types.yaml#/definitions/phandle-array
    description:
      The phandle to System Register Controller syscon node.

  perst-gpios:
    description: GPIO controlled connection to PERST# signal
    maxItems: 1

  phys:
    description:
      Specified PHY is attached to PCIe controller.
    maxItems: 1

required:
  - clocks
  - resets
  - starfive,stg-syscon

unevaluatedProperties: false

examples:
  - |
    #include <dt-bindings/gpio/gpio.h>
    soc {
        #address-cells = <2>;
        #size-cells = <2>;

        pcie@940000000 {
            compatible = "starfive,jh7110-pcie";
            reg = <0x9 0x40000000 0x0 0x10000000>,
                  <0x0 0x2b000000 0x0 0x1000000>;
            reg-names = "cfg", "apb";
            #address-cells = <3>;
            #size-cells = <2>;
            #interrupt-cells = <1>;
            device_type = "pci";
            ranges = <0x82000000  0x0 0x30000000  0x0 0x30000000 0x0 0x08000000>,
                     <0xc3000000  0x9 0x00000000  0x9 0x00000000 0x0 0x40000000>;
            starfive,stg-syscon = <&stg_syscon>;
            bus-range = <0x0 0xff>;
            interrupt-parent = <&plic>;
            interrupts = <56>;
            interrupt-map-mask = <0x0 0x0 0x0 0x7>;
            interrupt-map = <0x0 0x0 0x0 0x1 &pcie_intc0 0x1>,
                            <0x0 0x0 0x0 0x2 &pcie_intc0 0x2>,
                            <0x0 0x0 0x0 0x3 &pcie_intc0 0x3>,
                            <0x0 0x0 0x0 0x4 &pcie_intc0 0x4>;
            msi-controller;
            clocks = <&syscrg 86>,
                     <&stgcrg 10>,
                     <&stgcrg 8>,
                     <&stgcrg 9>;
            clock-names = "noc", "tl", "axi_mst0", "apb";
            resets = <&stgcrg 11>,
                     <&stgcrg 12>,
                     <&stgcrg 13>,
                     <&stgcrg 14>,
                     <&stgcrg 15>,
                     <&stgcrg 16>;
            perst-gpios = <&gpios 26 GPIO_ACTIVE_LOW>;
            phys = <&pciephy0>;

            pcie_intc0: interrupt-controller {
                #address-cells = <0>;
                #interrupt-cells = <1>;
                interrupt-controller;
            };
        };
    };
