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

title: Azoteq IQS626A Capacitive Touch Controller

maintainers:
  - Jeff LaBundy <jeff@labundy.com>

description: |
  The Azoteq IQS626A is a 14-channel capacitive touch controller that features
  additional Hall-effect and inductive sensing capabilities.

  Link to datasheet: https://www.azoteq.com/

allOf:
  - $ref: touchscreen/touchscreen.yaml#

properties:
  compatible:
    const: azoteq,iqs626a

  reg:
    maxItems: 1

  interrupts:
    maxItems: 1

  "#address-cells":
    const: 1

  "#size-cells":
    const: 0

  azoteq,suspend-mode:
    $ref: /schemas/types.yaml#/definitions/uint32
    enum: [0, 1, 2, 3]
    default: 0
    description: |
      Specifies the power mode during suspend as follows:
      0: Automatic (same as normal runtime, i.e. suspend/resume disabled)
      1: Low power (all sensing at a reduced reporting rate)
      2: Ultra-low power (ULP channel proximity sensing)
      3: Halt (no sensing)

  azoteq,clk-div:
    type: boolean
    description: Divides the device's core clock by a factor of 4.

  azoteq,ulp-enable:
    type: boolean
    description:
      Permits the device to automatically enter ultra-low-power mode from low-
      power mode.

  azoteq,ulp-update:
    $ref: /schemas/types.yaml#/definitions/uint32
    enum: [0, 1, 2, 3, 4, 5, 6, 7]
    default: 3
    description: |
      Specifies the rate at which the trackpad, generic and Hall channels are
      updated during ultra-low-power mode as follows:
      0: 8
      1: 13
      2: 28
      3: 54
      4: 89
      5: 135
      6: 190
      7: 256

  azoteq,ati-band-disable:
    type: boolean
    description: Disables the ATI band check.

  azoteq,ati-lp-only:
    type: boolean
    description: Limits automatic ATI to low-power mode.

  azoteq,gpio3-select:
    $ref: /schemas/types.yaml#/definitions/uint32
    enum: [0, 1, 2, 3, 4, 5, 6, 7]
    default: 1
    description: |
      Selects the channel or group of channels for which the GPIO3 pin
      represents touch state as follows:
      0: None
      1: ULP channel
      2: Trackpad
      3: Trackpad
      4: Generic channel 0
      5: Generic channel 1
      6: Generic channel 2
      7: Hall channel

  azoteq,reseed-select:
    $ref: /schemas/types.yaml#/definitions/uint32
    enum: [0, 1, 2, 3]
    default: 0
    description: |
      Specifies the event(s) that prompt the device to reseed (i.e. reset the
      long-term average) of an associated channel as follows:
      0: None
      1: Proximity
      2: Proximity or touch
      3: Proximity, touch or deep touch

  azoteq,thresh-extend:
    type: boolean
    description: Multiplies all touch and deep-touch thresholds by 4.

  azoteq,tracking-enable:
    type: boolean
    description:
      Enables all associated channels to track their respective reference
      channels.

  azoteq,reseed-offset:
    type: boolean
    description:
      Applies an 8-count offset to all long-term averages upon either ATI or
      reseed events.

  azoteq,rate-np-ms:
    minimum: 0
    maximum: 255
    default: 150
    description: Specifies the report rate (in ms) during normal-power mode.

  azoteq,rate-lp-ms:
    minimum: 0
    maximum: 255
    default: 150
    description: Specifies the report rate (in ms) during low-power mode.

  azoteq,rate-ulp-ms:
    multipleOf: 16
    minimum: 0
    maximum: 4080
    default: 0
    description: Specifies the report rate (in ms) during ultra-low-power mode.

  azoteq,timeout-pwr-ms:
    multipleOf: 512
    minimum: 0
    maximum: 130560
    default: 2560
    description:
      Specifies the length of time (in ms) to wait for an event before moving
      from normal-power mode to low-power mode, or (if 'azoteq,ulp-enable' is
      present) from low-power mode to ultra-low-power mode.

  azoteq,timeout-lta-ms:
    multipleOf: 512
    minimum: 0
    maximum: 130560
    default: 40960
    description:
      Specifies the length of time (in ms) to wait before resetting the long-
      term average of all channels. Specify the maximum timeout to disable it
      altogether.

  touchscreen-inverted-x: true
  touchscreen-inverted-y: true
  touchscreen-swapped-x-y: true

patternProperties:
  "^ulp-0|generic-[0-2]|hall$":
    type: object
    description:
      Represents a single sensing channel. A channel is active if defined and
      inactive otherwise.

    properties:
      azoteq,ati-exclude:
        type: boolean
        description:
          Prevents the channel from participating in an ATI event that is
          manually triggered during initialization.

      azoteq,reseed-disable:
        type: boolean
        description:
          Prevents the channel from being reseeded if the long-term average
          timeout (defined in 'azoteq,timeout-lta') expires.

      azoteq,meas-cap-decrease:
        type: boolean
        description:
          Decreases the internal measurement capacitance from 60 pF to 15 pF.

      azoteq,rx-inactive:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2]
        default: 0
        description: |
          Specifies how inactive CRX pins are to be terminated as follows:
          0: VSS
          1: Floating
          2: VREG (generic channels only)

      azoteq,linearize:
        type: boolean
        description:
          Enables linearization of the channel's counts (generic and Hall
          channels) or inverts the polarity of the channel's proximity or
          touch states (ULP channel).

      azoteq,dual-direction:
        type: boolean
        description:
          Specifies that the channel's long-term average is to freeze in the
          presence of either increasing or decreasing counts, thereby permit-
          ting events to be reported in either direction.

      azoteq,filt-disable:
        type: boolean
        description: Disables raw count filtering for the channel.

      azoteq,ati-mode:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        description: |
          Specifies the channel's ATI mode as follows:
          0: Disabled
          1: Semi-partial
          2: Partial
          3: Full

          The default value is a function of the channel and the device's reset
          user interface (RUI); reference the datasheet for further information
          about the available RUI options.

      azoteq,ati-base:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [75, 100, 150, 200]
        description:
          Specifies the channel's ATI base. The default value is a function
          of the channel and the device's RUI.

      azoteq,ati-target:
        $ref: /schemas/types.yaml#/definitions/uint32
        multipleOf: 32
        minimum: 0
        maximum: 2016
        description:
          Specifies the channel's ATI target. The default value is a function
          of the channel and the device's RUI.

      azoteq,cct-increase:
        $ref: /schemas/types.yaml#/definitions/uint32
        minimum: 0
        maximum: 16
        default: 0
        description:
          Specifies the degree to which the channel's charge cycle time is to
          be increased, with 0 representing no increase. The maximum value is
          limited to 4 in the case of the ULP channel, and the property is un-
          available entirely in the case of the Hall channel.

      azoteq,proj-bias:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        default: 0
        description: |
          Specifies the bias current applied during projected-capacitance
          sensing as follows:
          0: 2.5 uA
          1: 5 uA
          2: 10 uA
          3: 20 uA

          This property is unavailable in the case of the Hall channel.

      azoteq,sense-freq:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        description: |
          Specifies the channel's sensing frequency as follows (parenthesized
          numbers represent the frequency if 'azoteq,clk-div' is present):
          0: 4 MHz (1 MHz)
          1: 2 MHz (500 kHz)
          2: 1 MHz (250 kHz)
          3: 500 kHz (125 kHz)

          This property is unavailable in the case of the Hall channel. The
          default value is a function of the channel and the device's RUI.

      azoteq,ati-band-tighten:
        type: boolean
        description:
          Tightens the ATI band from 1/8 to 1/16 of the desired target (ULP and
          generic channels only).

      azoteq,proj-enable:
        type: boolean
        description: Enables projected-capacitance sensing (ULP channel only).

      azoteq,filt-str-np-cnt:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        default: 0
        description:
          Specifies the raw count filter strength during normal-power mode (ULP
          and generic channels only).

      azoteq,filt-str-lp-cnt:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        default: 0
        description:
          Specifies the raw count filter strength during low-power mode (ULP and
          generic channels only).

      azoteq,filt-str-np-lta:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        default: 0
        description:
          Specifies the long-term average filter strength during normal-power
          mode (ULP and generic channels only).

      azoteq,filt-str-lp-lta:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        default: 0
        description:
          Specifies the long-term average filter strength during low-power mode
          (ULP and generic channels only).

      azoteq,rx-enable:
        $ref: /schemas/types.yaml#/definitions/uint32-array
        minItems: 1
        maxItems: 8
        items:
          minimum: 0
          maximum: 7
        description:
          Specifies the CRX pin(s) associated with the channel.

          This property is unavailable in the case of the Hall channel. The
          default value is a function of the channel and the device's RUI.

      azoteq,tx-enable:
        $ref: /schemas/types.yaml#/definitions/uint32-array
        minItems: 1
        maxItems: 8
        items:
          minimum: 0
          maximum: 7
        description:
          Specifies the TX pin(s) associated with the channel.

          This property is unavailable in the case of the Hall channel. The
          default value is a function of the channel and the device's RUI.

      azoteq,local-cap-size:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3, 4]
        default: 0
        description: |
          Specifies the capacitance to be added to the channel as follows:
          0: 0 pF
          1: 0.5 pF
          2: 1.0 pF
          3: 1.5 pF
          4: 2.0 pF

          This property is unavailable in the case of the ULP or Hall channels.

      azoteq,sense-mode:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 8, 9, 12, 14, 15]
        description: |
          Specifies the channel's sensing mode as follows:
          0:  Self capacitance
          1:  Projected capacitance
          8:  Self inductance
          9:  Mutual inductance
          12: External
          14: Hall effect
          15: Temperature

          This property is unavailable in the case of the ULP or Hall channels.
          The default value is a function of the channel and the device's RUI.

      azoteq,tx-freq:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        default: 0
        description: |
          Specifies the inductive sensing excitation frequency as follows
          (parenthesized numbers represent the frequency if 'azoteq,clk-div'
          is present):
          0: 16 MHz (4 MHz)
          1: 8 MHz (2 MHz)
          2: 4 MHz (1 MHz)
          3: 2 MHz (500 kHz)

          This property is unavailable in the case of the ULP or Hall channels.

      azoteq,invert-enable:
        type: boolean
        description:
          Inverts the polarity of the states reported for proximity, touch and
          deep-touch events relative to their respective thresholds (generic
          channels only).

      azoteq,comp-disable:
        type: boolean
        description:
          Disables compensation for the channel (generic channels only).

      azoteq,static-enable:
        type: boolean
        description:
          Enables the static front-end for the channel (generic channels only).

      azoteq,assoc-select:
        $ref: /schemas/types.yaml#/definitions/string-array
        minItems: 1
        maxItems: 6
        items:
          enum:
            - ulp-0
            - trackpad-3x2
            - trackpad-3x3
            - generic-0
            - generic-1
            - generic-2
            - hall
        description:
          Specifies the associated channels for which the channel serves as a
          reference channel. By default, no channels are selected. This prop-
          erty is only available for the generic channels.

      azoteq,assoc-weight:
        $ref: /schemas/types.yaml#/definitions/uint32
        minimum: 0
        maximum: 255
        default: 0
        description:
          Specifies the channel's impact weight if it acts as an associated
          channel (0 = 0% impact, 255 = 200% impact). This property is only
          available for the generic channels.

    patternProperties:
      "^event-(prox|touch|deep)(-alt)?$":
        type: object
        $ref: input.yaml#
        description:
          Represents a proximity, touch or deep-touch event reported by the
          channel in response to a decrease in counts. Node names suffixed with
          '-alt' instead correspond to an increase in counts.

          By default, the long-term average tracks an increase in counts such
          that only events corresponding to a decrease in counts are reported
          (refer to the datasheet for more information).

          Specify 'azoteq,dual-direction' to freeze the long-term average when
          the counts increase or decrease such that events of either direction
          can be reported. Alternatively, specify 'azoteq,invert-enable' to in-
          vert the polarity of the states reported by the channel.

          Complementary events (e.g. event-touch and event-touch-alt) can both
          be present and specify different key or switch codes, but not differ-
          ent thresholds or hysteresis (if applicable).

          Proximity events are unavailable in the case of the Hall channel, and
          deep-touch events are only available for the generic channels. Unless
          otherwise specified, default values are a function of the channel and
          the device's RUI.

        properties:
          azoteq,thresh:
            $ref: /schemas/types.yaml#/definitions/uint32
            minimum: 0
            maximum: 255
            description: Specifies the threshold for the event.

          azoteq,hyst:
            $ref: /schemas/types.yaml#/definitions/uint32
            minimum: 0
            maximum: 15
            description:
              Specifies the hysteresis for the event (touch and deep-touch
              events only).

          linux,code: true

          linux,input-type:
            enum: [1, 5]
            description:
              Specifies whether the event is to be interpreted as a key (1) or
              a switch (5). By default, Hall-channel events are interpreted as
              switches and all others are interpreted as keys.

        additionalProperties: false

    dependencies:
      azoteq,assoc-weight: ["azoteq,assoc-select"]

    additionalProperties: false

  "^trackpad-3x[2-3]$":
    type: object
    $ref: input.yaml#
    description:
      Represents all channels associated with the trackpad. The channels are
      collectively active if the trackpad is defined and inactive otherwise.

    properties:
      azoteq,ati-exclude:
        type: boolean
        description:
          Prevents the trackpad channels from participating in an ATI event
          that is manually triggered during initialization.

      azoteq,reseed-disable:
        type: boolean
        description:
          Prevents the trackpad channels from being reseeded if the long-term
          average timeout (defined in 'azoteq,timeout-lta') expires.

      azoteq,meas-cap-decrease:
        type: boolean
        description:
          Decreases the internal measurement capacitance from 60 pF to 15 pF.

      azoteq,rx-inactive:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1]
        default: 0
        description: |
          Specifies how inactive CRX pins are to be terminated as follows:
          0: VSS
          1: Floating

      azoteq,linearize:
        type: boolean
        description: Inverts the polarity of the trackpad's touch state.

      azoteq,dual-direction:
        type: boolean
        description:
          Specifies that the trackpad's long-term averages are to freeze in
          the presence of either increasing or decreasing counts, thereby
          permitting events to be reported in either direction.

      azoteq,filt-disable:
        type: boolean
        description: Disables raw count filtering for the trackpad channels.

      azoteq,ati-mode:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        default: 0
        description: |
          Specifies the trackpad's ATI mode as follows:
          0: Disabled
          1: Semi-partial
          2: Partial
          3: Full

      azoteq,ati-target:
        $ref: /schemas/types.yaml#/definitions/uint32
        multipleOf: 32
        minimum: 0
        maximum: 2016
        default: 0
        description: Specifies the trackpad's ATI target.

      azoteq,cct-increase:
        $ref: /schemas/types.yaml#/definitions/uint32
        minimum: 0
        maximum: 4
        default: 0
        description:
          Specifies the degree to which the trackpad's charge cycle time is to
          be increased, with 0 representing no increase.

      azoteq,proj-bias:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        default: 0
        description: |
          Specifies the bias current applied during projected-capacitance
          sensing as follows:
          0: 2.5 uA
          1: 5 uA
          2: 10 uA
          3: 20 uA

      azoteq,sense-freq:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        default: 0
        description: |
          Specifies the trackpad's sensing frequency as follows (parenthesized
          numbers represent the frequency if 'azoteq,clk-div' is present):
          0: 4 MHz (1 MHz)
          1: 2 MHz (500 kHz)
          2: 1 MHz (250 kHz)
          3: 500 kHz (125 kHz)

      azoteq,ati-band-tighten:
        type: boolean
        description:
          Tightens the ATI band from 1/8 to 1/16 of the desired target.

      azoteq,hyst:
        $ref: /schemas/types.yaml#/definitions/uint32
        minimum: 0
        maximum: 15
        default: 0
        description: Specifies the trackpad's touch hysteresis.

      azoteq,lta-update:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3, 4, 5, 6, 7]
        default: 0
        description: |
          Specifies the update rate of the trackpad's long-term average during
          ultra-low-power mode as follows:
          0: 2
          1: 4
          2: 8
          3: 16
          4: 32
          5: 64
          6: 128
          7: 255

      azoteq,filt-str-trackpad:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        default: 0
        description: Specifies the trackpad coordinate filter strength.

      azoteq,filt-str-np-cnt:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        default: 0
        description:
          Specifies the raw count filter strength during normal-power mode.

      azoteq,filt-str-lp-cnt:
        $ref: /schemas/types.yaml#/definitions/uint32
        enum: [0, 1, 2, 3]
        default: 0
        description:
          Specifies the raw count filter strength during low-power mode.

      linux,keycodes:
        minItems: 1
        maxItems: 6
        description: |
          Specifies the numeric keycodes associated with each available gesture
          in the following order (enter 0 for unused gestures):
          0: Positive flick or swipe in X direction
          1: Negative flick or swipe in X direction
          2: Positive flick or swipe in Y direction
          3: Negative flick or swipe in Y direction
          4: Tap
          5: Hold

      azoteq,gesture-swipe:
        type: boolean
        description:
          Directs the device to interpret axial gestures as a swipe (finger
          remains on trackpad) instead of a flick (finger leaves trackpad).

      azoteq,timeout-tap-ms:
        multipleOf: 16
        minimum: 0
        maximum: 4080
        default: 0
        description:
          Specifies the length of time (in ms) within which a trackpad touch
          must be released in order to be interpreted as a tap.

      azoteq,timeout-swipe-ms:
        multipleOf: 16
        minimum: 0
        maximum: 4080
        default: 0
        description:
          Specifies the length of time (in ms) within which an axial gesture
          must be completed in order to be interpreted as a flick or swipe.

      azoteq,thresh-swipe:
        $ref: /schemas/types.yaml#/definitions/uint32
        minimum: 0
        maximum: 255
        default: 0
        description:
          Specifies the number of points across which an axial gesture must
          travel in order to be interpreted as a flick or swipe.

    patternProperties:
      "^channel-[0-8]$":
        type: object
        description: Represents a single trackpad channel.

        properties:
          azoteq,thresh:
            $ref: /schemas/types.yaml#/definitions/uint32
            minimum: 0
            maximum: 255
            default: 0
            description: Specifies the threshold for the channel.

          azoteq,ati-base:
            $ref: /schemas/types.yaml#/definitions/uint32
            minimum: 45
            maximum: 300
            default: 45
            description: Specifies the channel's ATI base.

        additionalProperties: false

    dependencies:
      azoteq,gesture-swipe: ["linux,keycodes"]
      azoteq,timeout-tap-ms: ["linux,keycodes"]
      azoteq,timeout-swipe-ms: ["linux,keycodes"]
      azoteq,thresh-swipe: ["linux,keycodes"]

    additionalProperties: false

required:
  - compatible
  - reg
  - interrupts
  - "#address-cells"
  - "#size-cells"

additionalProperties: false

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

    i2c {
            #address-cells = <1>;
            #size-cells = <0>;

            touch@44 {
                    #address-cells = <1>;
                    #size-cells = <0>;

                    compatible = "azoteq,iqs626a";
                    reg = <0x44>;
                    interrupt-parent = <&gpio>;
                    interrupts = <17 IRQ_TYPE_LEVEL_LOW>;

                    azoteq,rate-np-ms = <16>;
                    azoteq,rate-lp-ms = <160>;

                    azoteq,timeout-pwr-ms = <2560>;
                    azoteq,timeout-lta-ms = <32768>;

                    ulp-0 {
                            azoteq,meas-cap-decrease;

                            azoteq,ati-base = <75>;
                            azoteq,ati-target = <1024>;

                            azoteq,rx-enable = <2>, <3>, <4>,
                                               <5>, <6>, <7>;

                            event-prox {
                                    linux,code = <KEY_POWER>;
                            };
                    };

                    trackpad-3x3 {
                            azoteq,filt-str-np-cnt = <1>;
                            azoteq,filt-str-lp-cnt = <1>;

                            azoteq,hyst = <4>;

                            azoteq,ati-mode = <3>;
                            azoteq,ati-target = <512>;

                            azoteq,proj-bias = <1>;
                            azoteq,sense-freq = <2>;

                            linux,keycodes = <KEY_VOLUMEUP>,
                                             <KEY_VOLUMEDOWN>,
                                             <KEY_NEXTSONG>,
                                             <KEY_PREVIOUSSONG>,
                                             <KEY_PLAYPAUSE>,
                                             <KEY_STOPCD>;

                            azoteq,gesture-swipe;
                            azoteq,timeout-swipe-ms = <800>;
                            azoteq,timeout-tap-ms = <400>;
                            azoteq,thresh-swipe = <40>;

                            channel-0 {
                                    azoteq,thresh = <35>;
                                    azoteq,ati-base = <195>;
                            };

                            channel-1 {
                                    azoteq,thresh = <40>;
                                    azoteq,ati-base = <195>;
                            };

                            channel-2 {
                                    azoteq,thresh = <40>;
                                    azoteq,ati-base = <195>;
                            };

                            channel-3 {
                                    azoteq,thresh = <38>;
                                    azoteq,ati-base = <195>;
                            };

                            channel-4 {
                                    azoteq,thresh = <33>;
                                    azoteq,ati-base = <195>;
                            };

                            channel-5 {
                                    azoteq,thresh = <38>;
                                    azoteq,ati-base = <195>;
                            };

                            channel-6 {
                                    azoteq,thresh = <35>;
                                    azoteq,ati-base = <195>;
                            };

                            channel-7 {
                                    azoteq,thresh = <35>;
                                    azoteq,ati-base = <195>;
                            };

                            channel-8 {
                                    azoteq,thresh = <35>;
                                    azoteq,ati-base = <195>;
                            };
                    };

                    /*
                     * Preserve the default register settings for
                     * the temperature-tracking channel leveraged
                     * by reset user interface (RUI) 1.
                     *
                     * Scalar properties (e.g. ATI mode) are left
                     * untouched by simply omitting them; boolean
                     * properties must be specified explicitly as
                     * needed.
                     */
                    generic-2 {
                            azoteq,reseed-disable;
                            azoteq,meas-cap-decrease;
                            azoteq,dual-direction;
                            azoteq,comp-disable;
                            azoteq,static-enable;
                    };

                    hall {
                            azoteq,reseed-disable;
                            azoteq,meas-cap-decrease;

                            event-touch {
                                    linux,code = <SW_LID>;
                            };
                    };
            };
    };

...
