# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/mfd/adi,adp5585.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Analog Devices ADP5585 Keypad Decoder and I/O Expansion

maintainers:
  - Laurent Pinchart <laurent.pinchart@ideasonboard.com>

description:
  The ADP5585 is a 10/11 input/output port expander with a built in keypad
  matrix decoder, programmable logic, reset generator, and PWM generator.

properties:
  compatible:
    oneOf:
      - items:
          - enum:
              - adi,adp5585-00  # Default
              - adi,adp5585-01  # 11 GPIOs
              - adi,adp5585-02  # No pull-up resistors by default on special pins
              - adi,adp5585-03  # Alternate I2C address
              - adi,adp5585-04  # Pull-down resistors on all pins by default
          - const: adi,adp5585
      - items:
          - enum:
              - adi,adp5589-00  # Default
              - adi,adp5589-01  # R4 defaulted to RESET1 output
              - adi,adp5589-02  # Pull-down resistors by default on special pins
          - const: adi,adp5589

  reg:
    maxItems: 1

  interrupts:
    maxItems: 1

  vdd-supply: true

  reset-gpios:
    maxItems: 1

  gpio-controller: true

  '#gpio-cells':
    const: 2

  gpio-reserved-ranges: true

  "#pwm-cells":
    const: 3

  interrupt-controller: true

  '#interrupt-cells':
    const: 2

  poll-interval:
    enum: [10, 20, 30, 40]
    default: 10

  adi,keypad-pins:
    description: Specifies the pins used for the keypad matrix.
    $ref: /schemas/types.yaml#/definitions/uint32-array

  adi,unlock-events:
    description:
      Specifies a maximum of 2 events that can be used to unlock the keypad.
      If this property is set, the keyboard will be locked and only unlocked
      after these keys/gpis are pressed. The value 127 serves as a wildcard which
      means any key can be used for unlocking.
    $ref: /schemas/types.yaml#/definitions/uint32-array
    minItems: 1
    maxItems: 2
    items:
      anyOf:
        - minimum: 1
          maximum: 88
        - minimum: 97
          maximum: 115
        - const: 127

  adi,unlock-trigger-sec:
    description:
      Defines the time in which the second unlock event must occur after the
      first unlock event has occurred.
    maximum: 7
    default: 0

  adi,reset1-events:
    description:
      Defines the trigger events (key/gpi presses) that can generate reset
      conditions one the reset1 block.
    $ref: /schemas/types.yaml#/definitions/uint32-array
    minItems: 1
    maxItems: 3

  adi,reset2-events:
    description:
      Defines the trigger events (key/gpi presses) that can generate reset
      conditions one the reset2 block.
    $ref: /schemas/types.yaml#/definitions/uint32-array
    minItems: 1
    maxItems: 2

  adi,reset1-active-high:
    description: Sets the reset1 signal as active high.
    type: boolean

  adi,reset2-active-high:
    description: Sets the reset2 signal as active high.
    type: boolean

  adi,rst-passthrough-enable:
    description: Allows the RST pin to override (OR with) the reset1 signal.
    type: boolean

  adi,reset-trigger-ms:
    description:
      Defines the length of time that the reset events must be active before a
      reset signal is generated. All events must be active at the same time for
      the same duration.
    enum: [0, 1000, 1500, 2000, 2500, 3000, 3500, 4000]
    default: 0

  adi,reset-pulse-width-us:
    description: Defines the pulse width of the reset signals.
    enum: [500, 1000, 2000, 10000]
    default: 500

patternProperties:
  "-hog(-[0-9]+)?$":
    type: object

    required:
      - gpio-hog

dependencies:
  linux,keymap:
    - adi,keypad-pins
    - interrupts
  interrupt-controller:
    - interrupts
  adi,unlock-trigger-sec:
    - adi,unlock-events
  adi,reset1-active-high:
    - adi,reset1-events
  adi,rst-passtrough-enable:
    - adi,reset1-events
  adi,reset2-active-high:
    - adi,reset2-events

required:
  - compatible
  - reg

allOf:
  - $ref: /schemas/input/matrix-keymap.yaml#
  - $ref: /schemas/input/input.yaml#
  - if:
      properties:
        compatible:
          contains:
            const: adi,adp5585-01
    then:
      properties:
        adi,unlock-events: false
        adi,unlock-trigger-sec: false
        gpio-reserved-ranges: false
        reset-gpios: false
        adi,keypad-pins:
          minItems: 2
          maxItems: 11
          items:
            minimum: 0
            maximum: 10
        adi,reset1-events:
          items:
            anyOf:
              - minimum: 1
                maximum: 30
              - minimum: 37
                maximum: 47
        adi,reset2-events:
          items:
            anyOf:
              - minimum: 1
                maximum: 30
              - minimum: 37
                maximum: 47
  - if:
      properties:
        compatible:
          contains:
            enum:
              - adi,adp5585-00
              - adi,adp5585-02
              - adi,adp5585-03
              - adi,adp5585-04
    then:
      properties:
        adi,unlock-events: false
        adi,unlock-trigger-sec: false
        adi,keypad-pins:
          minItems: 2
          maxItems: 10
          items:
            enum: [0, 1, 2, 3, 4, 6, 7, 8, 9, 10]
        adi,reset1-events:
          items:
            anyOf:
              - minimum: 1
                maximum: 25
              - enum: [37, 38, 39, 40, 41, 43, 44, 45, 46, 47]
        adi,reset2-events:
          items:
            anyOf:
              - minimum: 1
                maximum: 25
              - enum: [37, 38, 39, 40, 41, 43, 44, 45, 46, 47]
        gpio-reserved-ranges:
          maxItems: 1
          items:
            items:
              - const: 5
              - const: 1

  - if:
      properties:
        compatible:
          contains:
            enum:
              - adi,adp5589-00
              - adi,adp5589-01
              - adi,adp5589-02
    then:
      properties:
        gpio-reserved-ranges: false
        adi,keypad-pins:
          minItems: 2
          maxItems: 19
          items:
            minimum: 0
            maximum: 18
        adi,reset1-events:
          items:
            anyOf:
              - minimum: 1
                maximum: 88
              - minimum: 97
                maximum: 115
        adi,reset2-events:
          items:
            anyOf:
              - minimum: 1
                maximum: 88
              - minimum: 97
                maximum: 115

unevaluatedProperties: false

examples:
  - |
    #include <dt-bindings/input/input.h>
    #include <dt-bindings/interrupt-controller/irq.h>
    i2c {
        #address-cells = <1>;
        #size-cells = <0>;

        io-expander@34 {
            compatible = "adi,adp5585-00", "adi,adp5585";
            reg = <0x34>;

            vdd-supply = <&reg_3v3>;

            gpio-controller;
            #gpio-cells = <2>;
            gpio-reserved-ranges = <5 1>;

            #pwm-cells = <3>;

            interrupts = <16 IRQ_TYPE_EDGE_FALLING>;
            interrupt-parent = <&gpio>;

            adi,reset1-events = <1 43>;
            adi,reset2-events = <2 3>;
            adi,reset-trigger-ms = <2000>;

            /*
             * col0, col1, col2
             * row0, row1, row2
             */
            adi,keypad-pins = <0 1 2 6 7 8>;

            linux,keymap = <
                MATRIX_KEY(0x00, 0x00, KEY_1)
                MATRIX_KEY(0x00, 0x01, KEY_2)
                MATRIX_KEY(0x00, 0x02, KEY_3)

                MATRIX_KEY(0x01, 0x00, KEY_A)
                MATRIX_KEY(0x01, 0x01, KEY_B)
                MATRIX_KEY(0x01, 0x02, KEY_C)

                MATRIX_KEY(0x02, 0x00, BTN_1)
                MATRIX_KEY(0x02, 0x01, BTN_2)
                MATRIX_KEY(0x02, 0x02, BTN_3)
            >;
        };
    };

...
