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

title: STMicroelectonics Port Expander (STMPE)

description: STMicroelectronics Port Expander (STMPE) is a series of slow
  bus controllers for various expanded peripherals such as GPIO, keypad,
  touchscreen, ADC, PWM or rotator. It can contain one or several different
  peripherals connected to SPI or I2C.

maintainers:
  - Linus Walleij <linusw@kernel.org>

allOf:
  - $ref: /schemas/spi/spi-peripheral-props.yaml#

properties:
  compatible:
    enum:
      - st,stmpe601
      - st,stmpe801
      - st,stmpe811
      - st,stmpe1600
      - st,stmpe1601
      - st,stmpe2401
      - st,stmpe2403

  reg:
    maxItems: 1

  interrupts:
    maxItems: 1

  vcc-supply: true

  vio-supply: true

  reset-gpios:
    maxItems: 1

  wakeup-source: true

  st,autosleep-timeout:
    $ref: /schemas/types.yaml#/definitions/uint32
    enum: [ 4, 16, 32, 64, 128, 256, 512, 1024 ]
    description: Time idle before going to automatic sleep to save power

  st,sample-time:
    $ref: /schemas/types.yaml#/definitions/uint32
    enum: [ 0, 1, 2, 3, 4, 5, 6 ]
    description: |
      Sample time per iteration
      0 = 36 clock ticks
      1 = 44 clock ticks
      2 = 56 clock ticks
      3 = 64 clock ticks
      4 = 80 clock ticks - recommended
      5 = 96 clock ticks
      6 = 124 clock ticks

  st,mod-12b:
    $ref: /schemas/types.yaml#/definitions/uint32
    enum: [ 0, 1 ]
    description: ADC bit mode 0 = 10bit ADC, 1 = 12bit ADC

  st,ref-sel:
    $ref: /schemas/types.yaml#/definitions/uint32
    enum: [ 0, 1 ]
    description: ADC reference source 0 = internal, 1 = external

  st,adc-freq:
    $ref: /schemas/types.yaml#/definitions/uint32
    enum: [ 0, 1, 2, 3 ]
    description: |
      ADC clock speed
      0 = 1.625 MHz
      1 = 3.25 MHz
      2, 3 = 6.5 MHz

  adc:
    type: object
    $ref: /schemas/iio/adc/st,stmpe-adc.yaml#

  gpio:
    type: object
    $ref: /schemas/gpio/st,stmpe-gpio.yaml#

  keyboard-controller:
    type: object
    $ref: /schemas/input/matrix-keymap.yaml#

    unevaluatedProperties: false

    properties:
      compatible:
        const: st,stmpe-keypad

      debounce-interval:
        description: Debouncing interval in milliseconds
        $ref: /schemas/types.yaml#/definitions/uint32

      st,no-autorepeat:
        description: If present, the keys will not autorepeat when pressed
        $ref: /schemas/types.yaml#/definitions/flag

      st,scan-count:
        description: Scanning cycles elapsed before key data is updated
        $ref: /schemas/types.yaml#/definitions/uint32

    required:
      - compatible
      - linux,keymap

  pwm:
    type: object
    $ref: /schemas/pwm/pwm.yaml#

    unevaluatedProperties: false

    properties:
      compatible:
        const: st,stmpe-pwm

      "#pwm-cells":
        const: 2

  touchscreen:
    type: object
    $ref: /schemas/input/touchscreen/touchscreen.yaml#

    unevaluatedProperties: false

    properties:
      compatible:
        const: st,stmpe-ts

      st,ave-ctrl:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [ 0, 1, 2, 3 ]
        description: |
          Sample average control
          0 = 1 sample
          1 = 2 samples
          2 = 4 samples
          3 = 8 samples

      st,touch-det-delay:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [ 0, 1, 2, 3, 4, 5, 6, 7 ]
        description: |
          Touch detection delay
          0 = 10 us
          1 = 50 us
          2 = 100 us
          3 = 500 us - recommended
          4 = 1 ms
          5 = 5 ms
          6 = 10 ms
          7 = 50 ms

      st,settling:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [ 0, 1, 2, 3, 4, 5, 6, 7 ]
        description: |
          Panel driver settling time
          0 = 10 us
          1 = 100 us
          2 = 500 us - recommended
          3 = 1 ms
          4 = 5 ms
          5 = 10 ms
          6 = 50 ms
          7 = 100 ms

      st,fraction-z:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [ 0, 1, 2, 3, 4, 5, 6, 7 ]
        description: Length of the fractional part in z, recommended is 7
          (fraction-z ([0..7]) = Count of the fractional part)

      st,i-drive:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [ 0, 1 ]
        description: |
          current limit value of the touchscreen drivers
          0 = 20 mA (typical 35 mA max)
          1 = 50 mA (typical 80 mA max)

    required:
      - compatible

additionalProperties: false

required:
  - compatible
  - reg
  - interrupts

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

      port-expander@43 {
        compatible = "st,stmpe2401";
        reg = <0x43>;
        reset-gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
        interrupts = <26 IRQ_TYPE_EDGE_FALLING>;
        interrupt-parent = <&gpio>;
        vcc-supply = <&db8500_vsmps2_reg>;
        vio-supply = <&db8500_vsmps2_reg>;
        wakeup-source;
        st,autosleep-timeout = <1024>;

        gpio {
          compatible = "st,stmpe-gpio";
          gpio-controller;
          #gpio-cells = <2>;
          interrupt-controller;
          #interrupt-cells = <2>;
          st,norequest-mask = <0xf0f002>;
        };

        keyboard-controller {
          compatible = "st,stmpe-keypad";
          debounce-interval = <64>;
          st,scan-count = <8>;
          st,no-autorepeat;
          keypad,num-rows = <8>;
          keypad,num-columns = <8>;
          linux,keymap = <
              MATRIX_KEY(0x00, 0x00, KEY_1)
              MATRIX_KEY(0x00, 0x01, KEY_2)
              MATRIX_KEY(0x00, 0x02, KEY_3)
              MATRIX_KEY(0x00, 0x03, KEY_4)
              MATRIX_KEY(0x00, 0x04, KEY_5)
              MATRIX_KEY(0x00, 0x05, KEY_6)
              MATRIX_KEY(0x00, 0x06, KEY_7)
              MATRIX_KEY(0x00, 0x07, KEY_8)
              MATRIX_KEY(0x00, 0x08, KEY_9)
              MATRIX_KEY(0x00, 0x09, KEY_0)
          >;
        };

        pwm {
          compatible = "st,stmpe-pwm";
          #pwm-cells = <2>;
        };
      };

      port-expander@41 {
        compatible = "st,stmpe811";
        reg = <0x41>;
        interrupts = <10 IRQ_TYPE_LEVEL_LOW>;
        interrupt-parent = <&gpio>;
        st,adc-freq = <1>;
        st,mod-12b = <1>;
        st,ref-sel = <0>;
        st,sample-time = <4>;

        adc {
          compatible = "st,stmpe-adc";
          st,norequest-mask = <0x0f>;
          #io-channel-cells = <1>;
        };

        gpio {
          compatible = "st,stmpe-gpio";
          gpio-controller;
          #gpio-cells = <2>;
          interrupt-controller;
          #interrupt-cells = <2>;
        };

        pwm {
          compatible = "st,stmpe-pwm";
          #pwm-cells = <2>;
        };

        touchscreen {
          compatible = "st,stmpe-ts";
          st,ave-ctrl = <3>;
          st,touch-det-delay = <5>;
          st,settling = <3>;
          st,fraction-z = <7>;
          st,i-drive = <1>;
        };
      };
    };
...
