# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/pinctrl/raspberrypi,rp1-gpio.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: RaspberryPi RP1 GPIO/Pinconf/Pinmux Controller submodule

maintainers:
  - A. della Porta <andrea.porta@suse.com>

description:
  The RP1 chipset is a Multi Function Device containing, among other
  sub-peripherals, a gpio/pinconf/mux controller whose 54 pins are grouped
  into 3 banks.
  It works also as an interrupt controller for those gpios.

properties:
  compatible:
    const: raspberrypi,rp1-gpio

  reg:
    maxItems: 3
    description: One reg specifier for each one of the 3 pin banks.

  '#gpio-cells':
    description: The first cell is the pin number and the second cell is used
      to specify the flags (see include/dt-bindings/gpio/gpio.h).
    const: 2

  gpio-controller: true

  gpio-ranges:
    maxItems: 1

  gpio-line-names:
    maxItems: 54

  interrupts:
    maxItems: 3
    description: One interrupt specifier for each one of the 3 pin banks.

  '#interrupt-cells':
    description:
      Specifies the Bank number [0, 1, 2] and Flags as defined in
      include/dt-bindings/interrupt-controller/irq.h.
    const: 2

  interrupt-controller: true

patternProperties:
  '-state$':
    oneOf:
      - $ref: '#/$defs/raspberrypi-rp1-state'
      - patternProperties:
          '-pins$':
            $ref: '#/$defs/raspberrypi-rp1-state'
        additionalProperties: false

$defs:
  raspberrypi-rp1-state:
    allOf:
      - $ref: pincfg-node.yaml#
      - $ref: pinmux-node.yaml#

    description:
      Pin controller client devices use pin configuration subnodes (children
      and grandchildren) for desired pin configuration.
      Client device subnodes use below standard properties.

    properties:
      pins:
        description:
          List of gpio pins affected by the properties specified in this
          subnode (either this or "groups" must be specified).
        items:
          pattern: '^gpio([0-9]|[1-4][0-9]|5[0-3])$'

      groups:
        description:
          List of groups affected by the properties specified in this
          subnode (either this or "pins" must be specified).
        items:
          anyOf:
            - pattern: '^gpio([0-9]|[1-4][0-9]|5[0-3])$'
            - enum: [ uart0, uart0_ctrl, uart1, uart1_ctrl, uart2, uart2_ctrl,
                      uart3, uart3_ctrl, uart4, uart4_ctrl, uart5_0,
                      uart5_0_ctrl, uart5_1, uart5_1_ctrl, uart5_2,
                      uart5_2_ctrl, uart5_3,
                      sd0, sd1,
                      i2s0, i2s0_dual, i2s0_quad, i2s1, i2s1_dual, i2s1_quad,
                      i2s2_0, i2s2_0_dual, i2s2_1, i2s2_1_dual,
                      i2c4_0, i2c4_1, i2c4_2, i2c4_3, i2c6_0, i2c6_1, i2c5_0,
                      i2c5_1, i2c5_2, i2c5_3, i2c0_0, i2c0_1, i2c1_0, i2c1_1,
                      i2c2_0, i2c2_1, i2c3_0, i2c3_1, i2c3_2,
                      dpi_16bit, dpi_16bit_cpadhi, dpi_16bit_pad666,
                      dpi_18bit, dpi_18bit_cpadhi, dpi_24bit,
                      spi0, spi0_quad, spi1, spi2, spi3, spi4, spi5, spi6_0,
                      spi6_1, spi7_0, spi7_1, spi8_0, spi8_1,
                      aaud_0, aaud_1, aaud_2, aaud_3, aaud_4,
                      vbus0_0, vbus0_1, vbus1, vbus2, vbus3,
                      mic_0, mic_1, mic_2, mic_3,
                      ir ]

      function:
        enum: [ alt0, alt1, alt2, alt3, alt4, gpio, alt6, alt7, alt8, none,
                aaud, dcd0, dpi, dsi0_te_ext, dsi1_te_ext, dsr0, dtr0, gpclk0,
                gpclk1, gpclk2, gpclk3, gpclk4, gpclk5, i2c0, i2c1, i2c2, i2c3,
                i2c4, i2c5, i2c6, i2s0, i2s1, i2s2, ir, mic, pcie_clkreq_n,
                pio, proc_rio, pwm0, pwm1, ri0, sd0, sd1, spi0, spi1, spi2,
                spi3, spi4, spi5, spi6, spi7, spi8, uart0, uart1, uart2, uart3,
                uart4, uart5, vbus0, vbus1, vbus2, vbus3 ]

        description:
          Specify the alternative function to be configured for the specified
          pins.

      bias-disable: true
      bias-pull-down: true
      bias-pull-up: true
      input-enable: true
      input-schmitt-enable: true
      output-enable: true
      output-high: true
      output-low: true
      slew-rate:
        description: 0 is slow slew rate, 1 is fast slew rate
        enum: [ 0, 1 ]
      drive-strength:
        enum: [ 2, 4, 8, 12 ]

    required:
      - function

    oneOf:
      - required: [ groups ]
      - required: [ pins ]

    additionalProperties: false

allOf:
  - $ref: pinctrl.yaml#

required:
  - reg
  - compatible
  - '#gpio-cells'
  - gpio-controller
  - interrupts
  - '#interrupt-cells'
  - interrupt-controller

unevaluatedProperties: false

examples:
  - |
    #include <dt-bindings/interrupt-controller/irq.h>

    rp1 {
        #address-cells = <2>;
        #size-cells = <2>;

        rp1_gpio: pinctrl@c0400d0000 {
            reg = <0xc0 0x400d0000  0x0 0xc000>,
                  <0xc0 0x400e0000  0x0 0xc000>,
                  <0xc0 0x400f0000  0x0 0xc000>;
            compatible = "raspberrypi,rp1-gpio";
            gpio-controller;
            #gpio-cells = <2>;
            interrupt-controller;
            #interrupt-cells = <2>;
            interrupts = <0 IRQ_TYPE_LEVEL_HIGH>,
                         <1 IRQ_TYPE_LEVEL_HIGH>,
                         <2 IRQ_TYPE_LEVEL_HIGH>;
            gpio-line-names =
                   "ID_SDA", // GPIO0
                   "ID_SCL", // GPIO1
                   "GPIO2", "GPIO3", "GPIO4", "GPIO5", "GPIO6",
                   "GPIO7", "GPIO8", "GPIO9", "GPIO10", "GPIO11",
                   "GPIO12", "GPIO13", "GPIO14", "GPIO15", "GPIO16",
                   "GPIO17", "GPIO18", "GPIO19", "GPIO20", "GPIO21",
                   "GPIO22", "GPIO23", "GPIO24", "GPIO25", "GPIO26",
                   "GPIO27",
                   "PCIE_RP1_WAKE", // GPIO28
                   "FAN_TACH", // GPIO29
                   "HOST_SDA", // GPIO30
                   "HOST_SCL", // GPIO31
                   "ETH_RST_N", // GPIO32
                   "", // GPIO33
                   "CD0_IO0_MICCLK", // GPIO34
                   "CD0_IO0_MICDAT0", // GPIO35
                   "RP1_PCIE_CLKREQ_N", // GPIO36
                   "", // GPIO37
                   "CD0_SDA", // GPIO38
                   "CD0_SCL", // GPIO39
                   "CD1_SDA", // GPIO40
                   "CD1_SCL", // GPIO41
                   "USB_VBUS_EN", // GPIO42
                   "USB_OC_N", // GPIO43
                   "RP1_STAT_LED", // GPIO44
                   "FAN_PWM", // GPIO45
                   "CD1_IO0_MICCLK", // GPIO46
                   "2712_WAKE", // GPIO47
                   "CD1_IO1_MICDAT1", // GPIO48
                   "EN_MAX_USB_CUR", // GPIO49
                   "", // GPIO50
                   "", // GPIO51
                   "", // GPIO52
                   ""; // GPIO53

            rp1-i2s0-default-state {
                function = "i2s0";
                pins = "gpio18", "gpio19", "gpio20", "gpio21";
                bias-disable;
            };

            rp1-uart0-default-state {
                txd-pins {
                    function = "uart0";
                    pins = "gpio14";
                    bias-disable;
                };

                rxd-pins {
                    function = "uart0";
                    pins = "gpio15";
                    bias-pull-up;
                };
            };
        };
    };