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

title: Nuvoton WPCM450 pin control and GPIO

maintainers:
  - Jonathan Neuschäfer <j.neuschaefer@gmx.net>

properties:
  compatible:
    const: nuvoton,wpcm450-pinctrl

  reg:
    maxItems: 1

  '#address-cells':
    const: 1

  '#size-cells':
    const: 0

patternProperties:
  # There are three kinds of subnodes:
  # 1. a GPIO controller node for each GPIO bank
  # 2. a pinmux node configures pin muxing for a group of pins (e.g. rmii2)
  # 3. a pinconf node configures properties of a single pin

  "^gpio@[0-7]$":
    type: object
    additionalProperties: false

    description:
      Eight GPIO banks (gpio@0 to gpio@7), that each contain between 14 and 18
      GPIOs. Some GPIOs support interrupts.

    properties:
      reg:
        minimum: 0
        maximum: 7

      gpio-controller: true

      "#gpio-cells":
        const: 2

      interrupt-controller: true

      "#interrupt-cells":
        const: 2

      interrupts:
        maxItems: 3
        description:
          The interrupts associated with this GPIO bank

    required:
      - reg
      - gpio-controller
      - '#gpio-cells'

  "^mux-":
    $ref: pinmux-node.yaml#

    properties:
      groups:
        description:
          One or more groups of pins to mux to a certain function
        items:
          enum: [ smb3, smb4, smb5, scs1, scs2, scs3, smb0, smb1, smb2, bsp,
                  hsp1, hsp2, r1err, r1md, rmii2, r2err, r2md, kbcc, dvo,
                  clko, smi, uinc, gspi, mben, xcs2, xcs1, sdio, sspi, fi0,
                  fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8, fi9, fi10, fi11,
                  fi12, fi13, fi14, fi15, pwm0, pwm1, pwm2, pwm3, pwm4, pwm5,
                  pwm6, pwm7, hg0, hg1, hg2, hg3, hg4, hg5, hg6, hg7 ]
      function:
        description:
          The function that a group of pins is muxed to
        enum: [ smb3, smb4, smb5, scs1, scs2, scs3, smb0, smb1, smb2, bsp,
                hsp1, hsp2, r1err, r1md, rmii2, r2err, r2md, kbcc, dvo0,
                dvo1, dvo2, dvo3, dvo4, dvo5, dvo6, dvo7, clko, smi, uinc,
                gspi, mben, xcs2, xcs1, sdio, sspi, fi0, fi1, fi2, fi3, fi4,
                fi5, fi6, fi7, fi8, fi9, fi10, fi11, fi12, fi13, fi14, fi15,
                pwm0, pwm1, pwm2, pwm3, pwm4, pwm5, pwm6, pwm7, hg0, hg1,
                hg2, hg3, hg4, hg5, hg6, hg7, gpio ]

    dependencies:
      groups: [ function ]
      function: [ groups ]

    additionalProperties: false

  "^cfg-":
    $ref: pincfg-node.yaml#

    properties:
      pins:
        description:
          A list of pins to configure in certain ways, such as enabling
          debouncing
        items:
          pattern: "^gpio1?[0-9]{1,2}$"

      input-debounce: true

    additionalProperties: false

required:
  - compatible
  - reg

additionalProperties: false

examples:
  - |
    #include <dt-bindings/interrupt-controller/irq.h>
    #include <dt-bindings/gpio/gpio.h>
    pinctrl: pinctrl@b8003000 {
      compatible = "nuvoton,wpcm450-pinctrl";
      reg = <0xb8003000 0x1000>;
      #address-cells = <1>;
      #size-cells = <0>;

      gpio0: gpio@0 {
        reg = <0>;
        gpio-controller;
        #gpio-cells = <2>;
        interrupts = <2 IRQ_TYPE_LEVEL_HIGH>,
                     <3 IRQ_TYPE_LEVEL_HIGH>,
                     <4 IRQ_TYPE_LEVEL_HIGH>;
      };

      mux-rmii2 {
        groups = "rmii2";
        function = "rmii2";
      };

      pinmux_uid: mux-uid {
        groups = "gspi", "sspi";
        function = "gpio";
      };

      pinctrl_uid: cfg-uid {
        pins = "gpio14";
        input-debounce = <1>;
      };
    };

    gpio-keys {
      compatible = "gpio-keys";
      pinctrl-names = "default";
      pinctrl-0 = <&pinctrl_uid>, <&pinmux_uid>;

      button-uid {
        label = "UID";
        linux,code = <102>;
        gpios = <&gpio0 14 GPIO_ACTIVE_HIGH>;
      };
    };