# SPDX-License-Identifier: GPL-2.0-only
%YAML 1.2
---
$id: http://devicetree.org/schemas/input/gpio-keys.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Device-Tree bindings for GPIO attached keys

maintainers:
  - Rob Herring <robh@kernel.org>

properties:
  compatible:
    enum:
      - gpio-keys
      - gpio-keys-polled

  autorepeat: true

  label:
    description: Name of entire device

  poll-interval: true

patternProperties:
  "^(button|event|key|switch|(button|event|key|switch)-[a-z0-9-]+|[a-z0-9-]+-(button|event|key|switch))$":
    $ref: input.yaml#

    properties:
      gpios:
        maxItems: 1

      interrupts:
        maxItems: 1

      label:
        description: Descriptive name of the key.

      linux,code:
        description: Key / Axis code to emit.

      linux,input-type:
        default: 1  # EV_KEY

      linux,input-value:
        description: |
          If linux,input-type is EV_ABS or EV_REL then this
          value is sent for events this button generates when pressed.
          EV_ABS/EV_REL axis will generate an event with a value of 0
          when all buttons with linux,input-type == type and
          linux,code == axis are released. This value is interpreted
          as a signed 32 bit value, e.g. to make a button generate a
          value of -1 use:

          linux,input-value = <0xffffffff>; /* -1 */

        $ref: /schemas/types.yaml#/definitions/uint32

      debounce-interval:
        description:
          Debouncing interval time in milliseconds. If not specified defaults to 5.
        $ref: /schemas/types.yaml#/definitions/uint32

        default: 5

      wakeup-source:
        description: Button can wake-up the system.

      wakeup-event-action:
        description: |
          Specifies whether the key should wake the system when asserted, when
          deasserted, or both. This property is only valid for keys that wake up the
          system (e.g., when the "wakeup-source" property is also provided).

          Supported values are defined in linux-event-codes.h:

            EV_ACT_ANY        - both asserted and deasserted
            EV_ACT_ASSERTED   - asserted
            EV_ACT_DEASSERTED - deasserted
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2]

      linux,can-disable:
        description:
          Indicates that button is connected to dedicated (not shared) interrupt
          which can be disabled to suppress events from the button.
        type: boolean

    required:
      - linux,code

    anyOf:
      - required:
          - interrupts
      - required:
          - interrupts-extended
      - required:
          - gpios

    dependencies:
      wakeup-event-action: [ wakeup-source ]
      linux,input-value: [ gpios ]

    unevaluatedProperties: false

allOf:
  - $ref: input.yaml#
  - if:
      properties:
        compatible:
          const: gpio-keys-polled
    then:
      required:
        - poll-interval
    else:
      properties:
        poll-interval: false

additionalProperties: false

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

    gpio-keys {
        compatible = "gpio-keys";
        autorepeat;

        key-up {
            label = "GPIO Key UP";
            linux,code = <103>;
            gpios = <&gpio1 0 1>;
        };

        key-down {
            label = "GPIO Key DOWN";
            linux,code = <108>;
            interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
        };
    };

...
