diff mbox series

[1/2] dt-bindings: input: Add bindings for Azoteq IQS7222A/B/C

Message ID 20220123194232.85288-2-jeff@labundy.com (mailing list archive)
State Superseded
Headers show
Series Add support for Azoteq IQS7222A/B/C | expand

Commit Message

Jeff LaBundy Jan. 23, 2022, 7:42 p.m. UTC
This patch adds bindings for the Azoteq IQS7222A/B/C family of
capacitive touch controllers.

Signed-off-by: Jeff LaBundy <jeff@labundy.com>
---
 .../devicetree/bindings/input/iqs7222.yaml    | 967 ++++++++++++++++++
 1 file changed, 967 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/input/iqs7222.yaml

Comments

Rob Herring Jan. 24, 2022, 4:01 p.m. UTC | #1
On Sun, 23 Jan 2022 13:42:31 -0600, Jeff LaBundy wrote:
> This patch adds bindings for the Azoteq IQS7222A/B/C family of
> capacitive touch controllers.
> 
> Signed-off-by: Jeff LaBundy <jeff@labundy.com>
> ---
>  .../devicetree/bindings/input/iqs7222.yaml    | 967 ++++++++++++++++++
>  1 file changed, 967 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/input/iqs7222.yaml
> 

My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check'
on your patch (DT_CHECKER_FLAGS is new in v5.13):

yamllint warnings/errors:

dtschema/dtc warnings/errors:
/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/input/iqs7222.example.dt.yaml: iqs7222a@44: '#address-cells' is a required property
	From schema: /builds/robherring/linux-dt-review/Documentation/devicetree/bindings/input/iqs7222.yaml
/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/input/iqs7222.example.dt.yaml: iqs7222a@44: '#size-cells' is a required property
	From schema: /builds/robherring/linux-dt-review/Documentation/devicetree/bindings/input/iqs7222.yaml
/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/input/iqs7222.example.dt.yaml: iqs7222a@44: 'channel-10', 'channel-11', 'channel-2', 'channel-3', 'channel-4', 'channel-5', 'channel-6', 'channel-7', 'channel-8' do not match any of the regexes: '^channel-[0-19]$', '^cycle-[0-9]$', '^gpio-[0-2]$', '^slider-[0-1]$', 'pinctrl-[0-9]+'
	From schema: /builds/robherring/linux-dt-review/Documentation/devicetree/bindings/input/iqs7222.yaml

doc reference errors (make refcheckdocs):

See https://patchwork.ozlabs.org/patch/1583181

This check can fail if there are any dependencies. The base for a patch
series is generally the most recent rc1.

If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:

pip3 install dtschema --upgrade

Please check and re-submit.
Rob Herring Jan. 24, 2022, 11:27 p.m. UTC | #2
On Sun, Jan 23, 2022 at 01:42:31PM -0600, Jeff LaBundy wrote:
> This patch adds bindings for the Azoteq IQS7222A/B/C family of
> capacitive touch controllers.

Overall, wow, that's a lot of properties. It leaves me wondering why 
does this h/w need so many and others don't?

> 
> Signed-off-by: Jeff LaBundy <jeff@labundy.com>
> ---
>  .../devicetree/bindings/input/iqs7222.yaml    | 967 ++++++++++++++++++

azoteq,iqs7222.yaml

>  1 file changed, 967 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/input/iqs7222.yaml
> 
> diff --git a/Documentation/devicetree/bindings/input/iqs7222.yaml b/Documentation/devicetree/bindings/input/iqs7222.yaml
> new file mode 100644
> index 000000000000..0c23d1d49ebd
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/input/iqs7222.yaml
> @@ -0,0 +1,967 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/input/iqs7222.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Azoteq IQS7222A/B/C Capacitive Touch Controller
> +
> +maintainers:
> +  - Jeff LaBundy <jeff@labundy.com>
> +
> +description: |
> +  The Azoteq IQS7222A, IQS7222B and IQS7222C are multichannel capacitive touch
> +  controllers that feature additional sensing capabilities.
> +
> +  Link to datasheets: https://www.azoteq.com/
> +
> +properties:
> +  compatible:
> +    enum:
> +      - azoteq,iqs7222a
> +      - azoteq,iqs7222b
> +      - azoteq,iqs7222c
> +
> +  reg:
> +    maxItems: 1
> +
> +  irq-gpios:

Use 'interrupts'. Interrupt capable GPIO lines are also interrupt 
providers.

> +    maxItems: 1
> +    description:
> +      Specifies the GPIO connected to the device's active-low RDY output.
> +
> +  reset-gpios:
> +    maxItems: 1
> +    description:
> +      Specifies the GPIO connected to the device's active-low MCLR input. The
> +      device is temporarily held in hardware reset prior to initialization if
> +      this property is present.
> +
> +  "#address-cells":
> +    const: 1
> +
> +  "#size-cells":
> +    const: 0
> +
> +  azoteq,rf-filt-enable:
> +    type: boolean
> +    description: Enables the device's internal RF filter.
> +
> +  azoteq,max-counts:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    enum: [0, 1, 2, 3]
> +    description: |
> +      Specifies the maximum counts as follows:

Counts of what?

> +      0: 1023
> +      1: 2047
> +      2: 4095
> +      3: 16384
> +
> +  azoteq,auto-mode:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    enum: [0, 1, 2, 3]
> +    description: |
> +      Specifies the number of conversions to occur before an interrupt is
> +      generated as follows:
> +      0: 4
> +      1: 8
> +      2: 16
> +      3: 32
> +
> +  azoteq,ati-frac-div-fine:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    minimum: 0
> +    maximum: 31
> +    description: Specifies the preloaded ATI fine fractional divider.
> +
> +  azoteq,ati-frac-div-coarse:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    minimum: 0
> +    maximum: 31
> +    description: Specifies the preloaded ATI coarse fractional divider.
> +
> +  azoteq,ati-comp-select:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    minimum: 0
> +    maximum: 1023
> +    description: Specifies the preloaded ATI compensation selection.
> +
> +  azoteq,lta-beta-lp:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    minimum: 0
> +    maximum: 15
> +    description:
> +      Specifies the long-term average filter damping factor to be applied during
> +      low-power mode.
> +
> +  azoteq,lta-beta-np:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    minimum: 0
> +    maximum: 15
> +    description:
> +      Specifies the long-term average filter damping factor to be applied during
> +      normal-power mode.
> +
> +  azoteq,counts-beta-lp:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    minimum: 0
> +    maximum: 15
> +    description:
> +      Specifies the counts filter damping factor to be applied during low-power
> +      mode.
> +
> +  azoteq,counts-beta-np:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    minimum: 0
> +    maximum: 15
> +    description:
> +      Specifies the counts filter damping factor to be applied during normal-
> +      power mode.
> +
> +  azoteq,lta-fast-beta-lp:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    minimum: 0
> +    maximum: 15
> +    description:
> +      Specifies the long-term average filter fast damping factor to be applied
> +      during low-power mode.
> +
> +  azoteq,lta-fast-beta-np:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    minimum: 0
> +    maximum: 15
> +    description:
> +      Specifies the long-term average filter fast damping factor to be applied
> +      during normal-power mode.
> +
> +  azoteq,timeout-ati-ms:
> +    multipleOf: 500
> +    minimum: 0
> +    maximum: 32767500
> +    description:
> +      Specifies the delay (in ms) before ATI is retried following an ATI error.
> +
> +  azoteq,rate-ati-ms:
> +    minimum: 0
> +    maximum: 65535
> +    description: Specifies the rate (in ms) at which ATI status is evaluated.
> +
> +  azoteq,timeout-np-ms:
> +    minimum: 0
> +    maximum: 65535
> +    description:
> +      Specifies the length of time (in ms) to wait for an event before moving
> +      from normal-power mode to low-power mode.
> +
> +  azoteq,rate-np-ms:
> +    minimum: 0
> +    maximum: 3000
> +    description: Specifies the report rate (in ms) during normal-power mode.
> +
> +  azoteq,timeout-lp-ms:
> +    minimum: 0
> +    maximum: 65535
> +    description:
> +      Specifies the length of time (in ms) to wait for an event before moving
> +      from low-power mode to ultra-low-power mode.
> +
> +  azoteq,rate-lp-ms:
> +    minimum: 0
> +    maximum: 3000
> +    description: Specifies the report rate (in ms) during low-power mode.
> +
> +  azoteq,timeout-ulp-ms:
> +    minimum: 0
> +    maximum: 65535
> +    description:
> +      Specifies the rate (in ms) at which channels not regularly sampled during
> +      ultra-low-power mode are updated.
> +
> +  azoteq,rate-ulp-ms:
> +    minimum: 0
> +    maximum: 3000
> +    description: Specifies the report rate (in ms) during ultra-low-power mode.
> +
> +patternProperties:
> +  "^cycle-[0-9]$":
> +    type: object
> +    description: Represents a conversion cycle serving two sensing channels.
> +
> +    properties:
> +      azoteq,conv-period:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 255
> +        description: Specifies the cycle's conversion period.
> +
> +      azoteq,conv-frac:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 255
> +        description: Specifies the cycle's conversion frequency fraction.
> +
> +      azoteq,tx-enable:
> +        $ref: /schemas/types.yaml#/definitions/uint32-array
> +        minItems: 1
> +        maxItems: 9
> +        items:
> +          minimum: 0
> +          maximum: 8
> +        description: Specifies the CTx pin(s) associated with the cycle.
> +
> +      azoteq,rx-float-inactive:
> +        type: boolean
> +        description: Floats any inactive CRx pins instead of grounding them.
> +
> +      azoteq,dead-time-enable:
> +        type: boolean
> +        description:
> +          Increases the denominator of the conversion frequency formula by one.
> +
> +      azoteq,tx-freq-fosc:
> +        type: boolean
> +        description:
> +          Fixes the conversion frequency to that of the device's core clock.
> +
> +      azoteq,vbias-enable:
> +        type: boolean
> +        description: Enables the bias voltage for use during inductive sensing.
> +
> +      azoteq,sense-mode:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        enum: [0, 1, 2, 3]
> +        description: |
> +          Specifies the cycle's sensing mode as follows:
> +          0: None
> +          1: Self capacitive
> +          2: Mutual capacitive
> +          3: Inductive
> +
> +          Note that in the case of IQS7222A, cycles 5 and 6 are restricted to
> +          Hall-effect sensing.
> +
> +      azoteq,iref-enable:
> +        type: boolean
> +        description:
> +          Enables the current reference for use during various sensing modes.
> +
> +      azoteq,iref-level:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 15
> +        description: Specifies the cycle's current reference level.
> +
> +      azoteq,iref-trim:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 15
> +        description: Specifies the cycle's current reference trim.
> +
> +    dependencies:
> +      azoteq,iref-level: ["azoteq,iref-enable"]
> +      azoteq,iref-trim: ["azoteq,iref-enable"]
> +
> +    additionalProperties: false
> +
> +  "^channel-[0-19]$":
> +    type: object
> +    description:
> +      Represents a single sensing channel. A channel is active if defined and
> +      inactive otherwise.
> +
> +      Note that in the case of IQS7222A, channels 10 and 11 are restricted to
> +      Hall-effect sensing with events reported on channel 10 only.
> +
> +    properties:
> +      azoteq,ulp-allow:
> +        type: boolean
> +        description:
> +          Permits the device to enter ultra-low-power mode while the channel
> +          lies in a state of touch or proximity.
> +
> +      azoteq,ref-select:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 9
> +        description: Specifies a separate reference channel to be followed.
> +
> +      azoteq,ref-weight:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 65535
> +        description: Specifies the relative weight of the reference channel.
> +
> +      azoteq,use-prox:
> +        type: boolean
> +        description:
> +          Activates the reference channel in response to proximity events
> +          instead of touch events.
> +
> +      azoteq,ati-band:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        enum: [0, 1, 2, 3]
> +        description: |
> +          Specifies the channel's ATI band as a fraction of its ATI target as
> +          follows:
> +          0: 1/16
> +          1: 1/8
> +          2: 1/4
> +          3: 1/2
> +
> +      azoteq,global-halt:
> +        type: boolean
> +        description:
> +          Specifies that the channel's long-term average is to freeze if any
> +          other participating channel lies in a proximity or touch state.
> +
> +      azoteq,invert-enable:
> +        type: boolean
> +        description:
> +          Inverts the polarity of the states reported for proximity and touch
> +          events relative to their respective thresholds.
> +
> +      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,rx-enable:
> +        $ref: /schemas/types.yaml#/definitions/uint32-array
> +        minItems: 1
> +        maxItems: 4
> +        items:
> +          minimum: 0
> +          maximum: 7
> +        description: Specifies the CRx pin(s) associated with the channel.
> +
> +      azoteq,samp-cap-double:
> +        type: boolean
> +        description: Doubles the sampling capacitance from 40 pF to 80 pF.
> +
> +      azoteq,vref-half:
> +        type: boolean
> +        description: Halves the discharge threshold from 1.0 V to 0.5 V.
> +
> +      azoteq,proj-bias:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        enum: [0, 1, 2, 3]
> +        description: |
> +          Specifies the bias current applied during mutual (projected)
> +          capacitive sensing as follows:
> +          0: 2 uA
> +          1: 5 uA
> +          2: 7 uA
> +          3: 10 uA
> +
> +      azoteq,ati-target:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        multipleOf: 8
> +        minimum: 0
> +        maximum: 2040
> +        description: Specifies the channel's ATI target.
> +
> +      azoteq,ati-base:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        multipleOf: 16
> +        minimum: 0
> +        maximum: 496
> +        description: Specifies the channel's ATI base.
> +
> +      azoteq,ati-mode:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        enum: [0, 1, 2, 3, 4, 5]
> +        description: |
> +          Specifies the channel's ATI mode as follows:
> +          0: Disabled
> +          1: Compensation
> +          2: Compensation divider
> +          3: Fine fractional divider
> +          4: Coarse fractional divider
> +          5: Full
> +
> +      azoteq,ati-frac-div-fine:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 31
> +        description: Specifies the channel's ATI fine fractional divider.
> +
> +      azoteq,ati-frac-mult-coarse:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 15
> +        description: Specifies the channel's ATI coarse fractional multiplier.
> +
> +      azoteq,ati-frac-div-coarse:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 31
> +        description: Specifies the channel's ATI coarse fractional divider.
> +
> +      azoteq,ati-comp-div:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 31
> +        description: Specifies the channel's ATI compensation divider.
> +
> +      azoteq,ati-comp-select:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 1023
> +        description: Specifies the channel's ATI compensation selection.
> +
> +      azoteq,debounce-enter:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 15
> +        description: Specifies the channel's debounce entrance factor.
> +
> +      azoteq,debounce-exit:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 15
> +        description: Specifies the channel's debounce exit factor.
> +
> +    patternProperties:
> +      "^event-(prox|touch)$":
> +        type: object
> +        description:
> +          Represents a proximity or touch event reported by the channel.
> +
> +        properties:
> +          azoteq,gpio-select:
> +            $ref: /schemas/types.yaml#/definitions/uint32-array
> +            minItems: 1
> +            maxItems: 3
> +            items:
> +              minimum: 0
> +              maximum: 2
> +            description: |
> +              Specifies one or more GPIO mapped to the event as follows:
> +              0: GPIO0
> +              1: GPIO3 (IQS7222C only)
> +              2: GPIO4 (IQS7222C only)
> +
> +              Note that although multiple events can be mapped to a single
> +              GPIO, they must all be of the same type (proximity, touch or
> +              slider gesture).
> +
> +          azoteq,thresh:
> +            $ref: /schemas/types.yaml#/definitions/uint32
> +            description:
> +              Specifies the threshold for the event. Valid entries range from
> +              0-127 and 0-255 for proximity and touch events, respectively.
> +
> +          azoteq,hyst:
> +            $ref: /schemas/types.yaml#/definitions/uint32
> +            minimum: 0
> +            maximum: 255
> +            description:
> +              Specifies the hysteresis for the event (touch events only).
> +
> +          azoteq,timeout-press-ms:
> +            multipleOf: 500
> +            minimum: 0
> +            maximum: 127500
> +            description:
> +              Specifies the length of time (in ms) to wait before automatically
> +              releasing a press event. Specify zero to allow the press state to
> +              persist indefinitely.
> +
> +              The IQS7222B does not feature channel-specific timeouts; the time-
> +              out specified for any one channel applies to all channels.
> +
> +          linux,code:
> +            $ref: /schemas/types.yaml#/definitions/uint32
> +            description:
> +              Numeric key or switch code associated with the event. Specify
> +              KEY_RESERVED (0) to opt out of event reporting.
> +
> +          linux,input-type:
> +            $ref: /schemas/types.yaml#/definitions/uint32
> +            enum: [1, 5]
> +            default: 1
> +            description:
> +              Specifies whether the event is to be interpreted as a key (1)
> +              or a switch (5).
> +
> +        required:
> +          - linux,code
> +
> +        additionalProperties: false
> +
> +    dependencies:
> +      azoteq,ref-weight: ["azoteq,ref-select"]
> +      azoteq,use-prox: ["azoteq,ref-select"]
> +
> +    additionalProperties: false
> +
> +  "^slider-[0-1]$":
> +    type: object
> +    description: Represents a slider comprising three or four channels.
> +
> +    properties:
> +      azoteq,channel-select:
> +        $ref: /schemas/types.yaml#/definitions/uint32-array
> +        minItems: 3
> +        maxItems: 4
> +        items:
> +          minimum: 0
> +          maximum: 9
> +        description:
> +          Specifies the order of the channels that participate in the slider.
> +
> +      azoteq,slider-size:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 65535
> +        description:
> +          Specifies the slider's one-dimensional resolution, equal to the
> +          maximum coordinate plus one.
> +
> +      azoteq,lower-cal:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 255
> +        description: Specifies the slider's lower starting point.
> +
> +      azoteq,upper-cal:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 255
> +        description: Specifies the slider's upper starting point.
> +
> +      azoteq,top-speed:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 65535
> +        description:
> +          Specifies the speed of movement after which coordinate filtering is
> +          no longer applied.
> +
> +      azoteq,bottom-speed:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        multipleOf: 4
> +        minimum: 0
> +        maximum: 1020
> +        description:
> +          Specifies the speed of movement after which coordinate filtering is
> +          linearly reduced.
> +
> +      azoteq,bottom-beta:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        minimum: 0
> +        maximum: 7
> +        description:
> +          Specifies the coordinate filter damping factor to be applied
> +          while the speed of movement is below that which is specified
> +          by azoteq,bottom-speed.
> +
> +      azoteq,static-beta:
> +        type: boolean
> +        description:
> +          Applies the coordinate filter damping factor specified by
> +          azoteq,bottom-beta regardless of the speed of movement.
> +
> +      azoteq,use-prox:
> +        type: boolean
> +        description:
> +          Directs the slider to respond to the proximity states of the selected
> +          channels instead of their corresponding touch states. Note the slider
> +          cannot report granular coordinates during a state of proximity.
> +
> +      linux,axis:
> +        $ref: /schemas/types.yaml#/definitions/uint32
> +        description:
> +          Specifies the absolute axis to which coordinates are mapped. Specify
> +          ABS_WHEEL to operate the slider as a wheel (IQS7222C only).
> +
> +    patternProperties:
> +      "^event-(press|tap|(swipe|flick)-(pos|neg))$":
> +        type: object
> +        description:
> +          Represents a press or gesture (IQS7222A only) event reported by
> +          the slider.
> +
> +        properties:
> +          linux,code:
> +            $ref: /schemas/types.yaml#/definitions/uint32
> +            description: Numeric key code associated with the event.
> +
> +          azoteq,gesture-max-ms:
> +            multipleOf: 4
> +            minimum: 0
> +            maximum: 1020
> +            description:
> +              Specifies the length of time (in ms) within which a tap, swipe
> +              or flick gesture must be completed in order to be acknowledged
> +              by the device. The number specified for any one swipe or flick
> +              gesture applies to all remaining swipe or flick gestures.
> +
> +          azoteq,gesture-min-ms:
> +            multipleOf: 4
> +            minimum: 0
> +            maximum: 124
> +            description:
> +              Specifies the length of time (in ms) for which a tap gesture must
> +              be held in order to be acknowledged by the device.
> +
> +          azoteq,gesture-dist:
> +            $ref: /schemas/types.yaml#/definitions/uint32
> +            multipleOf: 16
> +            minimum: 0
> +            maximum: 4080
> +            description:
> +              Specifies the distance across which a swipe or flick gesture must
> +              travel in order to be acknowledged by the device. The number spec-
> +              ified for any one swipe or flick gesture applies to all remaining
> +              swipe or flick gestures.
> +
> +          azoteq,gpio-select:
> +            $ref: /schemas/types.yaml#/definitions/uint32-array
> +            minItems: 1
> +            maxItems: 1
> +            items:
> +              minimum: 0
> +              maximum: 0
> +            description: |
> +              Specifies an individual GPIO mapped to a tap, swipe or flick
> +              gesture as follows:
> +              0: GPIO0
> +              1: GPIO3 (reserved)
> +              2: GPIO4 (reserved)
> +
> +              Note that although multiple events can be mapped to a single
> +              GPIO, they must all be of the same type (proximity, touch or
> +              slider gesture).
> +
> +        required:
> +          - linux,code
> +
> +        additionalProperties: false
> +
> +    required:
> +      - azoteq,channel-select
> +
> +    additionalProperties: false
> +
> +  "^gpio-[0-2]$":
> +    type: object
> +    description: |
> +      Represents a GPIO mapped to one or more events as follows:
> +      gpio-0: GPIO0
> +      gpio-1: GPIO3 (IQS7222C only)
> +      gpio-2: GPIO4 (IQS7222C only)
> +
> +    allOf:
> +      - $ref: ../pinctrl/pincfg-node.yaml#
> +
> +    properties:
> +      drive-open-drain: true
> +
> +    additionalProperties: false
> +
> +allOf:
> +  - if:
> +      properties:
> +        compatible:
> +          contains:
> +            const: azoteq,iqs7222b
> +
> +    then:
> +      patternProperties:
> +        "^cycle-[0-9]$":
> +          properties:
> +            azoteq,iref-enable: false
> +
> +        "^channel-[0-19]$":
> +          properties:
> +            azoteq,ref-select: false
> +
> +          patternProperties:
> +            "^event-(prox|touch)$":
> +              properties:
> +                azoteq,gpio-select: false
> +
> +        "^slider-[0-1]$": false
> +
> +        "^gpio-[0-2]$": false
> +
> +  - if:
> +      properties:
> +        compatible:
> +          contains:
> +            const: azoteq,iqs7222a
> +
> +    then:
> +      patternProperties:
> +        "^channel-[0-19]$":
> +          patternProperties:
> +            "^event-(prox|touch)$":
> +              properties:
> +                azoteq,gpio-select:
> +                  maxItems: 1
> +                  items:
> +                    maximum: 0
> +
> +        "^slider-[0-1]$":
> +          properties:
> +            azoteq,slider-size:
> +              multipleOf: 16
> +              maximum: 4080
> +
> +            azoteq,top-speed:
> +              multipleOf: 4
> +              maximum: 1020
> +
> +    else:
> +      patternProperties:
> +        "^channel-[0-19]$":
> +          properties:
> +            azoteq,ulp-allow: false
> +
> +        "^slider-[0-1]$":
> +          patternProperties:
> +            "^event-(press|tap|(swipe|flick)-(pos|neg))$":
> +              properties:
> +                azoteq,gesture-max-ms: false
> +
> +                azoteq,gesture-min-ms: false
> +
> +                azoteq,gesture-dist: false
> +
> +                azoteq,gpio-select: false
> +
> +required:
> +  - compatible
> +  - reg
> +  - irq-gpios
> +  - "#address-cells"
> +  - "#size-cells"
> +
> +additionalProperties: false
> +
> +examples:
> +  - |
> +    #include <dt-bindings/gpio/gpio.h>
> +    #include <dt-bindings/input/input.h>
> +
> +    i2c {
> +            #address-cells = <1>;
> +            #size-cells = <0>;
> +
> +            iqs7222a@44 {
> +                    compatible = "azoteq,iqs7222a";
> +                    reg = <0x44>;
> +                    irq-gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
> +                    azoteq,lta-beta-lp = <7>;
> +                    azoteq,lta-beta-np = <8>;
> +                    azoteq,counts-beta-lp = <2>;
> +                    azoteq,counts-beta-np = <3>;
> +                    azoteq,lta-fast-beta-lp = <3>;
> +                    azoteq,lta-fast-beta-np = <4>;
> +
> +                    cycle-0 {
> +                            azoteq,conv-period = <5>;
> +                            azoteq,conv-frac = <127>;
> +                            azoteq,tx-enable = <1>, <2>, <4>, <5>;
> +                            azoteq,dead-time-enable;
> +                            azoteq,sense-mode = <2>;
> +                    };
> +
> +                    cycle-1 {
> +                            azoteq,conv-period = <5>;
> +                            azoteq,conv-frac = <127>;
> +                            azoteq,tx-enable = <5>;
> +                            azoteq,dead-time-enable;
> +                            azoteq,sense-mode = <2>;
> +                    };
> +
> +                    cycle-2 {
> +                            azoteq,conv-period = <5>;
> +                            azoteq,conv-frac = <127>;
> +                            azoteq,tx-enable = <4>;
> +                            azoteq,dead-time-enable;
> +                            azoteq,sense-mode = <2>;
> +                    };
> +
> +                    cycle-3 {
> +                            azoteq,conv-period = <5>;
> +                            azoteq,conv-frac = <127>;
> +                            azoteq,tx-enable = <2>;
> +                            azoteq,dead-time-enable;
> +                            azoteq,sense-mode = <2>;
> +                    };
> +
> +                    cycle-4 {
> +                            azoteq,conv-period = <5>;
> +                            azoteq,conv-frac = <127>;
> +                            azoteq,tx-enable = <1>;
> +                            azoteq,dead-time-enable;
> +                            azoteq,sense-mode = <2>;
> +                    };
> +
> +                    cycle-5 {
> +                            azoteq,conv-period = <2>;
> +                            azoteq,conv-frac = <0>;
> +                    };
> +
> +                    cycle-6 {
> +                            azoteq,conv-period = <2>;
> +                            azoteq,conv-frac = <0>;
> +                    };
> +
> +                    channel-0 {
> +                            azoteq,ulp-allow;
> +                            azoteq,global-halt;
> +                            azoteq,invert-enable;
> +                            azoteq,rx-enable = <3>;
> +                            azoteq,ati-target = <800>;
> +                            azoteq,ati-base = <208>;
> +                            azoteq,ati-mode = <5>;
> +                    };
> +
> +                    channel-1 {
> +                            azoteq,global-halt;
> +                            azoteq,invert-enable;
> +                            azoteq,rx-enable = <3>;
> +                            azoteq,ati-target = <496>;
> +                            azoteq,ati-base = <208>;
> +                            azoteq,ati-mode = <5>;
> +                    };
> +
> +                    channel-2 {
> +                            azoteq,global-halt;
> +                            azoteq,invert-enable;
> +                            azoteq,rx-enable = <3>;
> +                            azoteq,ati-target = <496>;
> +                            azoteq,ati-base = <208>;
> +                            azoteq,ati-mode = <5>;
> +                    };
> +
> +                    channel-3 {
> +                            azoteq,global-halt;
> +                            azoteq,invert-enable;
> +                            azoteq,rx-enable = <3>;
> +                            azoteq,ati-target = <496>;
> +                            azoteq,ati-base = <208>;
> +                            azoteq,ati-mode = <5>;
> +                    };
> +
> +                    channel-4 {
> +                            azoteq,global-halt;
> +                            azoteq,invert-enable;
> +                            azoteq,rx-enable = <3>;
> +                            azoteq,ati-target = <496>;
> +                            azoteq,ati-base = <208>;
> +                            azoteq,ati-mode = <5>;
> +                    };
> +
> +                    channel-5 {
> +                            azoteq,ulp-allow;
> +                            azoteq,global-halt;
> +                            azoteq,invert-enable;
> +                            azoteq,rx-enable = <6>;
> +                            azoteq,ati-target = <800>;
> +                            azoteq,ati-base = <144>;
> +                            azoteq,ati-mode = <5>;
> +                    };
> +
> +                    channel-6 {
> +                            azoteq,global-halt;
> +                            azoteq,invert-enable;
> +                            azoteq,rx-enable = <6>;
> +                            azoteq,ati-target = <496>;
> +                            azoteq,ati-base = <160>;
> +                            azoteq,ati-mode = <5>;
> +
> +                            event-touch {
> +                                    linux,code = <KEY_MUTE>;
> +                            };
> +                    };
> +
> +                    channel-7 {
> +                            azoteq,global-halt;
> +                            azoteq,invert-enable;
> +                            azoteq,rx-enable = <6>;
> +                            azoteq,ati-target = <496>;
> +                            azoteq,ati-base = <160>;
> +                            azoteq,ati-mode = <5>;
> +
> +                            event-touch {
> +                                    linux,code = <KEY_VOLUMEDOWN>;
> +                            };
> +                    };
> +
> +                    channel-8 {
> +                            azoteq,global-halt;
> +                            azoteq,invert-enable;
> +                            azoteq,rx-enable = <6>;
> +                            azoteq,ati-target = <496>;
> +                            azoteq,ati-base = <160>;
> +                            azoteq,ati-mode = <5>;
> +
> +                            event-touch {
> +                                    linux,code = <KEY_VOLUMEUP>;
> +                            };
> +                    };
> +
> +                    channel-9 {
> +                            azoteq,global-halt;
> +                            azoteq,invert-enable;
> +                            azoteq,rx-enable = <6>;
> +                            azoteq,ati-target = <496>;
> +                            azoteq,ati-base = <160>;
> +                            azoteq,ati-mode = <5>;
> +
> +                            event-touch {
> +                                    linux,code = <KEY_POWER>;
> +                            };
> +                    };
> +
> +                    channel-10 {
> +                            azoteq,ulp-allow;
> +                            azoteq,ati-target = <496>;
> +                            azoteq,ati-base = <112>;
> +
> +                            event-touch {
> +                                    linux,code = <SW_LID>;
> +                                    linux,input-type = <EV_SW>;
> +                            };
> +                    };
> +
> +                    channel-11 {
> +                            azoteq,ati-target = <496>;
> +                            azoteq,ati-base = <112>;
> +                    };
> +
> +                    slider-0 {
> +                            azoteq,channel-select = <1>, <2>, <3>, <4>;
> +                            azoteq,slider-size = <4080>;
> +                            azoteq,upper-cal = <50>;
> +                            azoteq,lower-cal = <30>;
> +                            azoteq,top-speed = <200>;
> +                            azoteq,bottom-speed = <1>;
> +                            azoteq,bottom-beta = <3>;
> +
> +                            event-tap {
> +                                    linux,code = <KEY_PLAYPAUSE>;
> +                                    azoteq,gesture-max-ms = <600>;
> +                                    azoteq,gesture-min-ms = <24>;
> +                            };
> +
> +                            event-flick-pos {
> +                                    linux,code = <KEY_NEXTSONG>;
> +                                    azoteq,gesture-max-ms = <600>;
> +                                    azoteq,gesture-dist = <816>;
> +                            };
> +
> +                            event-flick-neg {
> +                                    linux,code = <KEY_PREVIOUSSONG>;
> +                            };
> +                    };
> +            };
> +    };
> +
> +...
> -- 
> 2.25.1
> 
>
Jeff LaBundy Jan. 25, 2022, 1:14 a.m. UTC | #3
Hi Rob,

Thank you for your prompt review.

I missed the new DT_CHECKER_FLAGS since I last submitted a binding; I
will take a look at what is happening there.

On Mon, Jan 24, 2022 at 05:27:35PM -0600, Rob Herring wrote:
> On Sun, Jan 23, 2022 at 01:42:31PM -0600, Jeff LaBundy wrote:
> > This patch adds bindings for the Azoteq IQS7222A/B/C family of
> > capacitive touch controllers.
> 
> Overall, wow, that's a lot of properties. It leaves me wondering why 
> does this h/w need so many and others don't?

Indeed, we had a similar discussion in [1] for a related device. The
reason is that these devices support several additional sensing modes
(e.g. self/mutual capacitance, inductive, Hall), with many registers
that may need to be configured differently based on use-case.

Devices with this level of configurability (e.g. touchscreens) often
lack long bindings because they simply rely on firmware from a vendor;
however, these particular devices have no nonvolatile memory.

[1] https://patchwork.ozlabs.org/patch/1273068/

> 
> > 
> > Signed-off-by: Jeff LaBundy <jeff@labundy.com>
> > ---
> >  .../devicetree/bindings/input/iqs7222.yaml    | 967 ++++++++++++++++++
> 
> azoteq,iqs7222.yaml

Is this a new standard? I'm happy to do this; just trying to understand
if I should send a separate patch to rename all other .../input/iqs*.yaml
bindings that don't follow this convention.

> 
> >  1 file changed, 967 insertions(+)
> >  create mode 100644 Documentation/devicetree/bindings/input/iqs7222.yaml
> > 
> > diff --git a/Documentation/devicetree/bindings/input/iqs7222.yaml b/Documentation/devicetree/bindings/input/iqs7222.yaml
> > new file mode 100644
> > index 000000000000..0c23d1d49ebd
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/input/iqs7222.yaml
> > @@ -0,0 +1,967 @@
> > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/input/iqs7222.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Azoteq IQS7222A/B/C Capacitive Touch Controller
> > +
> > +maintainers:
> > +  - Jeff LaBundy <jeff@labundy.com>
> > +
> > +description: |
> > +  The Azoteq IQS7222A, IQS7222B and IQS7222C are multichannel capacitive touch
> > +  controllers that feature additional sensing capabilities.
> > +
> > +  Link to datasheets: https://www.azoteq.com/
> > +
> > +properties:
> > +  compatible:
> > +    enum:
> > +      - azoteq,iqs7222a
> > +      - azoteq,iqs7222b
> > +      - azoteq,iqs7222c
> > +
> > +  reg:
> > +    maxItems: 1
> > +
> > +  irq-gpios:
> 
> Use 'interrupts'. Interrupt capable GPIO lines are also interrupt 
> providers.

This device is a bit like the Goodix touchscreen where we need to bring
in the interrupt as a GPIO for some additional functions besides just an
interrupt. From a comment I added to the driver:

/*
 * The RDY pin behaves as an interrupt, but must also be polled ahead
 * of unsolicited I2C communication. As such, it is first opened as a
 * GPIO and then passed to gpiod_to_irq() to register the interrupt.
 */

There is no equivalent irq_to_gpio(), so I opted not to use 'interrupts'.
The Goodix example specifies both, but this is redundant. In the driver
I have added logic to apply the GPIO polarity specified in dts to the
IRQF flags.

> 
> > +    maxItems: 1
> > +    description:
> > +      Specifies the GPIO connected to the device's active-low RDY output.
> > +
> > +  reset-gpios:
> > +    maxItems: 1
> > +    description:
> > +      Specifies the GPIO connected to the device's active-low MCLR input. The
> > +      device is temporarily held in hardware reset prior to initialization if
> > +      this property is present.
> > +
> > +  "#address-cells":
> > +    const: 1
> > +
> > +  "#size-cells":
> > +    const: 0
> > +
> > +  azoteq,rf-filt-enable:
> > +    type: boolean
> > +    description: Enables the device's internal RF filter.
> > +
> > +  azoteq,max-counts:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    enum: [0, 1, 2, 3]
> > +    description: |
> > +      Specifies the maximum counts as follows:
> 
> Counts of what?

ADC counts before an internal interrupt is generated; I will add some more
details here.

> 
> > +      0: 1023
> > +      1: 2047
> > +      2: 4095
> > +      3: 16384
> > +
> > +  azoteq,auto-mode:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    enum: [0, 1, 2, 3]
> > +    description: |
> > +      Specifies the number of conversions to occur before an interrupt is
> > +      generated as follows:
> > +      0: 4
> > +      1: 8
> > +      2: 16
> > +      3: 32
> > +
> > +  azoteq,ati-frac-div-fine:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    minimum: 0
> > +    maximum: 31
> > +    description: Specifies the preloaded ATI fine fractional divider.
> > +
> > +  azoteq,ati-frac-div-coarse:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    minimum: 0
> > +    maximum: 31
> > +    description: Specifies the preloaded ATI coarse fractional divider.
> > +
> > +  azoteq,ati-comp-select:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    minimum: 0
> > +    maximum: 1023
> > +    description: Specifies the preloaded ATI compensation selection.
> > +
> > +  azoteq,lta-beta-lp:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    minimum: 0
> > +    maximum: 15
> > +    description:
> > +      Specifies the long-term average filter damping factor to be applied during
> > +      low-power mode.
> > +
> > +  azoteq,lta-beta-np:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    minimum: 0
> > +    maximum: 15
> > +    description:
> > +      Specifies the long-term average filter damping factor to be applied during
> > +      normal-power mode.
> > +
> > +  azoteq,counts-beta-lp:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    minimum: 0
> > +    maximum: 15
> > +    description:
> > +      Specifies the counts filter damping factor to be applied during low-power
> > +      mode.
> > +
> > +  azoteq,counts-beta-np:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    minimum: 0
> > +    maximum: 15
> > +    description:
> > +      Specifies the counts filter damping factor to be applied during normal-
> > +      power mode.
> > +
> > +  azoteq,lta-fast-beta-lp:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    minimum: 0
> > +    maximum: 15
> > +    description:
> > +      Specifies the long-term average filter fast damping factor to be applied
> > +      during low-power mode.
> > +
> > +  azoteq,lta-fast-beta-np:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    minimum: 0
> > +    maximum: 15
> > +    description:
> > +      Specifies the long-term average filter fast damping factor to be applied
> > +      during normal-power mode.
> > +
> > +  azoteq,timeout-ati-ms:
> > +    multipleOf: 500
> > +    minimum: 0
> > +    maximum: 32767500
> > +    description:
> > +      Specifies the delay (in ms) before ATI is retried following an ATI error.
> > +
> > +  azoteq,rate-ati-ms:
> > +    minimum: 0
> > +    maximum: 65535
> > +    description: Specifies the rate (in ms) at which ATI status is evaluated.
> > +
> > +  azoteq,timeout-np-ms:
> > +    minimum: 0
> > +    maximum: 65535
> > +    description:
> > +      Specifies the length of time (in ms) to wait for an event before moving
> > +      from normal-power mode to low-power mode.
> > +
> > +  azoteq,rate-np-ms:
> > +    minimum: 0
> > +    maximum: 3000
> > +    description: Specifies the report rate (in ms) during normal-power mode.
> > +
> > +  azoteq,timeout-lp-ms:
> > +    minimum: 0
> > +    maximum: 65535
> > +    description:
> > +      Specifies the length of time (in ms) to wait for an event before moving
> > +      from low-power mode to ultra-low-power mode.
> > +
> > +  azoteq,rate-lp-ms:
> > +    minimum: 0
> > +    maximum: 3000
> > +    description: Specifies the report rate (in ms) during low-power mode.
> > +
> > +  azoteq,timeout-ulp-ms:
> > +    minimum: 0
> > +    maximum: 65535
> > +    description:
> > +      Specifies the rate (in ms) at which channels not regularly sampled during
> > +      ultra-low-power mode are updated.
> > +
> > +  azoteq,rate-ulp-ms:
> > +    minimum: 0
> > +    maximum: 3000
> > +    description: Specifies the report rate (in ms) during ultra-low-power mode.
> > +
> > +patternProperties:
> > +  "^cycle-[0-9]$":
> > +    type: object
> > +    description: Represents a conversion cycle serving two sensing channels.
> > +
> > +    properties:
> > +      azoteq,conv-period:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 255
> > +        description: Specifies the cycle's conversion period.
> > +
> > +      azoteq,conv-frac:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 255
> > +        description: Specifies the cycle's conversion frequency fraction.
> > +
> > +      azoteq,tx-enable:
> > +        $ref: /schemas/types.yaml#/definitions/uint32-array
> > +        minItems: 1
> > +        maxItems: 9
> > +        items:
> > +          minimum: 0
> > +          maximum: 8
> > +        description: Specifies the CTx pin(s) associated with the cycle.
> > +
> > +      azoteq,rx-float-inactive:
> > +        type: boolean
> > +        description: Floats any inactive CRx pins instead of grounding them.
> > +
> > +      azoteq,dead-time-enable:
> > +        type: boolean
> > +        description:
> > +          Increases the denominator of the conversion frequency formula by one.
> > +
> > +      azoteq,tx-freq-fosc:
> > +        type: boolean
> > +        description:
> > +          Fixes the conversion frequency to that of the device's core clock.
> > +
> > +      azoteq,vbias-enable:
> > +        type: boolean
> > +        description: Enables the bias voltage for use during inductive sensing.
> > +
> > +      azoteq,sense-mode:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        enum: [0, 1, 2, 3]
> > +        description: |
> > +          Specifies the cycle's sensing mode as follows:
> > +          0: None
> > +          1: Self capacitive
> > +          2: Mutual capacitive
> > +          3: Inductive
> > +
> > +          Note that in the case of IQS7222A, cycles 5 and 6 are restricted to
> > +          Hall-effect sensing.
> > +
> > +      azoteq,iref-enable:
> > +        type: boolean
> > +        description:
> > +          Enables the current reference for use during various sensing modes.
> > +
> > +      azoteq,iref-level:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 15
> > +        description: Specifies the cycle's current reference level.
> > +
> > +      azoteq,iref-trim:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 15
> > +        description: Specifies the cycle's current reference trim.
> > +
> > +    dependencies:
> > +      azoteq,iref-level: ["azoteq,iref-enable"]
> > +      azoteq,iref-trim: ["azoteq,iref-enable"]
> > +
> > +    additionalProperties: false
> > +
> > +  "^channel-[0-19]$":
> > +    type: object
> > +    description:
> > +      Represents a single sensing channel. A channel is active if defined and
> > +      inactive otherwise.
> > +
> > +      Note that in the case of IQS7222A, channels 10 and 11 are restricted to
> > +      Hall-effect sensing with events reported on channel 10 only.
> > +
> > +    properties:
> > +      azoteq,ulp-allow:
> > +        type: boolean
> > +        description:
> > +          Permits the device to enter ultra-low-power mode while the channel
> > +          lies in a state of touch or proximity.
> > +
> > +      azoteq,ref-select:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 9
> > +        description: Specifies a separate reference channel to be followed.
> > +
> > +      azoteq,ref-weight:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 65535
> > +        description: Specifies the relative weight of the reference channel.
> > +
> > +      azoteq,use-prox:
> > +        type: boolean
> > +        description:
> > +          Activates the reference channel in response to proximity events
> > +          instead of touch events.
> > +
> > +      azoteq,ati-band:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        enum: [0, 1, 2, 3]
> > +        description: |
> > +          Specifies the channel's ATI band as a fraction of its ATI target as
> > +          follows:
> > +          0: 1/16
> > +          1: 1/8
> > +          2: 1/4
> > +          3: 1/2
> > +
> > +      azoteq,global-halt:
> > +        type: boolean
> > +        description:
> > +          Specifies that the channel's long-term average is to freeze if any
> > +          other participating channel lies in a proximity or touch state.
> > +
> > +      azoteq,invert-enable:
> > +        type: boolean
> > +        description:
> > +          Inverts the polarity of the states reported for proximity and touch
> > +          events relative to their respective thresholds.
> > +
> > +      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,rx-enable:
> > +        $ref: /schemas/types.yaml#/definitions/uint32-array
> > +        minItems: 1
> > +        maxItems: 4
> > +        items:
> > +          minimum: 0
> > +          maximum: 7
> > +        description: Specifies the CRx pin(s) associated with the channel.
> > +
> > +      azoteq,samp-cap-double:
> > +        type: boolean
> > +        description: Doubles the sampling capacitance from 40 pF to 80 pF.
> > +
> > +      azoteq,vref-half:
> > +        type: boolean
> > +        description: Halves the discharge threshold from 1.0 V to 0.5 V.
> > +
> > +      azoteq,proj-bias:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        enum: [0, 1, 2, 3]
> > +        description: |
> > +          Specifies the bias current applied during mutual (projected)
> > +          capacitive sensing as follows:
> > +          0: 2 uA
> > +          1: 5 uA
> > +          2: 7 uA
> > +          3: 10 uA
> > +
> > +      azoteq,ati-target:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        multipleOf: 8
> > +        minimum: 0
> > +        maximum: 2040
> > +        description: Specifies the channel's ATI target.
> > +
> > +      azoteq,ati-base:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        multipleOf: 16
> > +        minimum: 0
> > +        maximum: 496
> > +        description: Specifies the channel's ATI base.
> > +
> > +      azoteq,ati-mode:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        enum: [0, 1, 2, 3, 4, 5]
> > +        description: |
> > +          Specifies the channel's ATI mode as follows:
> > +          0: Disabled
> > +          1: Compensation
> > +          2: Compensation divider
> > +          3: Fine fractional divider
> > +          4: Coarse fractional divider
> > +          5: Full
> > +
> > +      azoteq,ati-frac-div-fine:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 31
> > +        description: Specifies the channel's ATI fine fractional divider.
> > +
> > +      azoteq,ati-frac-mult-coarse:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 15
> > +        description: Specifies the channel's ATI coarse fractional multiplier.
> > +
> > +      azoteq,ati-frac-div-coarse:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 31
> > +        description: Specifies the channel's ATI coarse fractional divider.
> > +
> > +      azoteq,ati-comp-div:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 31
> > +        description: Specifies the channel's ATI compensation divider.
> > +
> > +      azoteq,ati-comp-select:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 1023
> > +        description: Specifies the channel's ATI compensation selection.
> > +
> > +      azoteq,debounce-enter:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 15
> > +        description: Specifies the channel's debounce entrance factor.
> > +
> > +      azoteq,debounce-exit:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 15
> > +        description: Specifies the channel's debounce exit factor.
> > +
> > +    patternProperties:
> > +      "^event-(prox|touch)$":
> > +        type: object
> > +        description:
> > +          Represents a proximity or touch event reported by the channel.
> > +
> > +        properties:
> > +          azoteq,gpio-select:
> > +            $ref: /schemas/types.yaml#/definitions/uint32-array
> > +            minItems: 1
> > +            maxItems: 3
> > +            items:
> > +              minimum: 0
> > +              maximum: 2
> > +            description: |
> > +              Specifies one or more GPIO mapped to the event as follows:
> > +              0: GPIO0
> > +              1: GPIO3 (IQS7222C only)
> > +              2: GPIO4 (IQS7222C only)
> > +
> > +              Note that although multiple events can be mapped to a single
> > +              GPIO, they must all be of the same type (proximity, touch or
> > +              slider gesture).
> > +
> > +          azoteq,thresh:
> > +            $ref: /schemas/types.yaml#/definitions/uint32
> > +            description:
> > +              Specifies the threshold for the event. Valid entries range from
> > +              0-127 and 0-255 for proximity and touch events, respectively.
> > +
> > +          azoteq,hyst:
> > +            $ref: /schemas/types.yaml#/definitions/uint32
> > +            minimum: 0
> > +            maximum: 255
> > +            description:
> > +              Specifies the hysteresis for the event (touch events only).
> > +
> > +          azoteq,timeout-press-ms:
> > +            multipleOf: 500
> > +            minimum: 0
> > +            maximum: 127500
> > +            description:
> > +              Specifies the length of time (in ms) to wait before automatically
> > +              releasing a press event. Specify zero to allow the press state to
> > +              persist indefinitely.
> > +
> > +              The IQS7222B does not feature channel-specific timeouts; the time-
> > +              out specified for any one channel applies to all channels.
> > +
> > +          linux,code:
> > +            $ref: /schemas/types.yaml#/definitions/uint32
> > +            description:
> > +              Numeric key or switch code associated with the event. Specify
> > +              KEY_RESERVED (0) to opt out of event reporting.
> > +
> > +          linux,input-type:
> > +            $ref: /schemas/types.yaml#/definitions/uint32
> > +            enum: [1, 5]
> > +            default: 1
> > +            description:
> > +              Specifies whether the event is to be interpreted as a key (1)
> > +              or a switch (5).
> > +
> > +        required:
> > +          - linux,code
> > +
> > +        additionalProperties: false
> > +
> > +    dependencies:
> > +      azoteq,ref-weight: ["azoteq,ref-select"]
> > +      azoteq,use-prox: ["azoteq,ref-select"]
> > +
> > +    additionalProperties: false
> > +
> > +  "^slider-[0-1]$":
> > +    type: object
> > +    description: Represents a slider comprising three or four channels.
> > +
> > +    properties:
> > +      azoteq,channel-select:
> > +        $ref: /schemas/types.yaml#/definitions/uint32-array
> > +        minItems: 3
> > +        maxItems: 4
> > +        items:
> > +          minimum: 0
> > +          maximum: 9
> > +        description:
> > +          Specifies the order of the channels that participate in the slider.
> > +
> > +      azoteq,slider-size:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 65535
> > +        description:
> > +          Specifies the slider's one-dimensional resolution, equal to the
> > +          maximum coordinate plus one.
> > +
> > +      azoteq,lower-cal:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 255
> > +        description: Specifies the slider's lower starting point.
> > +
> > +      azoteq,upper-cal:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 255
> > +        description: Specifies the slider's upper starting point.
> > +
> > +      azoteq,top-speed:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 65535
> > +        description:
> > +          Specifies the speed of movement after which coordinate filtering is
> > +          no longer applied.
> > +
> > +      azoteq,bottom-speed:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        multipleOf: 4
> > +        minimum: 0
> > +        maximum: 1020
> > +        description:
> > +          Specifies the speed of movement after which coordinate filtering is
> > +          linearly reduced.
> > +
> > +      azoteq,bottom-beta:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        minimum: 0
> > +        maximum: 7
> > +        description:
> > +          Specifies the coordinate filter damping factor to be applied
> > +          while the speed of movement is below that which is specified
> > +          by azoteq,bottom-speed.
> > +
> > +      azoteq,static-beta:
> > +        type: boolean
> > +        description:
> > +          Applies the coordinate filter damping factor specified by
> > +          azoteq,bottom-beta regardless of the speed of movement.
> > +
> > +      azoteq,use-prox:
> > +        type: boolean
> > +        description:
> > +          Directs the slider to respond to the proximity states of the selected
> > +          channels instead of their corresponding touch states. Note the slider
> > +          cannot report granular coordinates during a state of proximity.
> > +
> > +      linux,axis:
> > +        $ref: /schemas/types.yaml#/definitions/uint32
> > +        description:
> > +          Specifies the absolute axis to which coordinates are mapped. Specify
> > +          ABS_WHEEL to operate the slider as a wheel (IQS7222C only).
> > +
> > +    patternProperties:
> > +      "^event-(press|tap|(swipe|flick)-(pos|neg))$":
> > +        type: object
> > +        description:
> > +          Represents a press or gesture (IQS7222A only) event reported by
> > +          the slider.
> > +
> > +        properties:
> > +          linux,code:
> > +            $ref: /schemas/types.yaml#/definitions/uint32
> > +            description: Numeric key code associated with the event.
> > +
> > +          azoteq,gesture-max-ms:
> > +            multipleOf: 4
> > +            minimum: 0
> > +            maximum: 1020
> > +            description:
> > +              Specifies the length of time (in ms) within which a tap, swipe
> > +              or flick gesture must be completed in order to be acknowledged
> > +              by the device. The number specified for any one swipe or flick
> > +              gesture applies to all remaining swipe or flick gestures.
> > +
> > +          azoteq,gesture-min-ms:
> > +            multipleOf: 4
> > +            minimum: 0
> > +            maximum: 124
> > +            description:
> > +              Specifies the length of time (in ms) for which a tap gesture must
> > +              be held in order to be acknowledged by the device.
> > +
> > +          azoteq,gesture-dist:
> > +            $ref: /schemas/types.yaml#/definitions/uint32
> > +            multipleOf: 16
> > +            minimum: 0
> > +            maximum: 4080
> > +            description:
> > +              Specifies the distance across which a swipe or flick gesture must
> > +              travel in order to be acknowledged by the device. The number spec-
> > +              ified for any one swipe or flick gesture applies to all remaining
> > +              swipe or flick gestures.
> > +
> > +          azoteq,gpio-select:
> > +            $ref: /schemas/types.yaml#/definitions/uint32-array
> > +            minItems: 1
> > +            maxItems: 1
> > +            items:
> > +              minimum: 0
> > +              maximum: 0
> > +            description: |
> > +              Specifies an individual GPIO mapped to a tap, swipe or flick
> > +              gesture as follows:
> > +              0: GPIO0
> > +              1: GPIO3 (reserved)
> > +              2: GPIO4 (reserved)
> > +
> > +              Note that although multiple events can be mapped to a single
> > +              GPIO, they must all be of the same type (proximity, touch or
> > +              slider gesture).
> > +
> > +        required:
> > +          - linux,code
> > +
> > +        additionalProperties: false
> > +
> > +    required:
> > +      - azoteq,channel-select
> > +
> > +    additionalProperties: false
> > +
> > +  "^gpio-[0-2]$":
> > +    type: object
> > +    description: |
> > +      Represents a GPIO mapped to one or more events as follows:
> > +      gpio-0: GPIO0
> > +      gpio-1: GPIO3 (IQS7222C only)
> > +      gpio-2: GPIO4 (IQS7222C only)
> > +
> > +    allOf:
> > +      - $ref: ../pinctrl/pincfg-node.yaml#
> > +
> > +    properties:
> > +      drive-open-drain: true
> > +
> > +    additionalProperties: false
> > +
> > +allOf:
> > +  - if:
> > +      properties:
> > +        compatible:
> > +          contains:
> > +            const: azoteq,iqs7222b
> > +
> > +    then:
> > +      patternProperties:
> > +        "^cycle-[0-9]$":
> > +          properties:
> > +            azoteq,iref-enable: false
> > +
> > +        "^channel-[0-19]$":
> > +          properties:
> > +            azoteq,ref-select: false
> > +
> > +          patternProperties:
> > +            "^event-(prox|touch)$":
> > +              properties:
> > +                azoteq,gpio-select: false
> > +
> > +        "^slider-[0-1]$": false
> > +
> > +        "^gpio-[0-2]$": false
> > +
> > +  - if:
> > +      properties:
> > +        compatible:
> > +          contains:
> > +            const: azoteq,iqs7222a
> > +
> > +    then:
> > +      patternProperties:
> > +        "^channel-[0-19]$":
> > +          patternProperties:
> > +            "^event-(prox|touch)$":
> > +              properties:
> > +                azoteq,gpio-select:
> > +                  maxItems: 1
> > +                  items:
> > +                    maximum: 0
> > +
> > +        "^slider-[0-1]$":
> > +          properties:
> > +            azoteq,slider-size:
> > +              multipleOf: 16
> > +              maximum: 4080
> > +
> > +            azoteq,top-speed:
> > +              multipleOf: 4
> > +              maximum: 1020
> > +
> > +    else:
> > +      patternProperties:
> > +        "^channel-[0-19]$":
> > +          properties:
> > +            azoteq,ulp-allow: false
> > +
> > +        "^slider-[0-1]$":
> > +          patternProperties:
> > +            "^event-(press|tap|(swipe|flick)-(pos|neg))$":
> > +              properties:
> > +                azoteq,gesture-max-ms: false
> > +
> > +                azoteq,gesture-min-ms: false
> > +
> > +                azoteq,gesture-dist: false
> > +
> > +                azoteq,gpio-select: false
> > +
> > +required:
> > +  - compatible
> > +  - reg
> > +  - irq-gpios
> > +  - "#address-cells"
> > +  - "#size-cells"
> > +
> > +additionalProperties: false
> > +
> > +examples:
> > +  - |
> > +    #include <dt-bindings/gpio/gpio.h>
> > +    #include <dt-bindings/input/input.h>
> > +
> > +    i2c {
> > +            #address-cells = <1>;
> > +            #size-cells = <0>;
> > +
> > +            iqs7222a@44 {
> > +                    compatible = "azoteq,iqs7222a";
> > +                    reg = <0x44>;
> > +                    irq-gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
> > +                    azoteq,lta-beta-lp = <7>;
> > +                    azoteq,lta-beta-np = <8>;
> > +                    azoteq,counts-beta-lp = <2>;
> > +                    azoteq,counts-beta-np = <3>;
> > +                    azoteq,lta-fast-beta-lp = <3>;
> > +                    azoteq,lta-fast-beta-np = <4>;
> > +
> > +                    cycle-0 {
> > +                            azoteq,conv-period = <5>;
> > +                            azoteq,conv-frac = <127>;
> > +                            azoteq,tx-enable = <1>, <2>, <4>, <5>;
> > +                            azoteq,dead-time-enable;
> > +                            azoteq,sense-mode = <2>;
> > +                    };
> > +
> > +                    cycle-1 {
> > +                            azoteq,conv-period = <5>;
> > +                            azoteq,conv-frac = <127>;
> > +                            azoteq,tx-enable = <5>;
> > +                            azoteq,dead-time-enable;
> > +                            azoteq,sense-mode = <2>;
> > +                    };
> > +
> > +                    cycle-2 {
> > +                            azoteq,conv-period = <5>;
> > +                            azoteq,conv-frac = <127>;
> > +                            azoteq,tx-enable = <4>;
> > +                            azoteq,dead-time-enable;
> > +                            azoteq,sense-mode = <2>;
> > +                    };
> > +
> > +                    cycle-3 {
> > +                            azoteq,conv-period = <5>;
> > +                            azoteq,conv-frac = <127>;
> > +                            azoteq,tx-enable = <2>;
> > +                            azoteq,dead-time-enable;
> > +                            azoteq,sense-mode = <2>;
> > +                    };
> > +
> > +                    cycle-4 {
> > +                            azoteq,conv-period = <5>;
> > +                            azoteq,conv-frac = <127>;
> > +                            azoteq,tx-enable = <1>;
> > +                            azoteq,dead-time-enable;
> > +                            azoteq,sense-mode = <2>;
> > +                    };
> > +
> > +                    cycle-5 {
> > +                            azoteq,conv-period = <2>;
> > +                            azoteq,conv-frac = <0>;
> > +                    };
> > +
> > +                    cycle-6 {
> > +                            azoteq,conv-period = <2>;
> > +                            azoteq,conv-frac = <0>;
> > +                    };
> > +
> > +                    channel-0 {
> > +                            azoteq,ulp-allow;
> > +                            azoteq,global-halt;
> > +                            azoteq,invert-enable;
> > +                            azoteq,rx-enable = <3>;
> > +                            azoteq,ati-target = <800>;
> > +                            azoteq,ati-base = <208>;
> > +                            azoteq,ati-mode = <5>;
> > +                    };
> > +
> > +                    channel-1 {
> > +                            azoteq,global-halt;
> > +                            azoteq,invert-enable;
> > +                            azoteq,rx-enable = <3>;
> > +                            azoteq,ati-target = <496>;
> > +                            azoteq,ati-base = <208>;
> > +                            azoteq,ati-mode = <5>;
> > +                    };
> > +
> > +                    channel-2 {
> > +                            azoteq,global-halt;
> > +                            azoteq,invert-enable;
> > +                            azoteq,rx-enable = <3>;
> > +                            azoteq,ati-target = <496>;
> > +                            azoteq,ati-base = <208>;
> > +                            azoteq,ati-mode = <5>;
> > +                    };
> > +
> > +                    channel-3 {
> > +                            azoteq,global-halt;
> > +                            azoteq,invert-enable;
> > +                            azoteq,rx-enable = <3>;
> > +                            azoteq,ati-target = <496>;
> > +                            azoteq,ati-base = <208>;
> > +                            azoteq,ati-mode = <5>;
> > +                    };
> > +
> > +                    channel-4 {
> > +                            azoteq,global-halt;
> > +                            azoteq,invert-enable;
> > +                            azoteq,rx-enable = <3>;
> > +                            azoteq,ati-target = <496>;
> > +                            azoteq,ati-base = <208>;
> > +                            azoteq,ati-mode = <5>;
> > +                    };
> > +
> > +                    channel-5 {
> > +                            azoteq,ulp-allow;
> > +                            azoteq,global-halt;
> > +                            azoteq,invert-enable;
> > +                            azoteq,rx-enable = <6>;
> > +                            azoteq,ati-target = <800>;
> > +                            azoteq,ati-base = <144>;
> > +                            azoteq,ati-mode = <5>;
> > +                    };
> > +
> > +                    channel-6 {
> > +                            azoteq,global-halt;
> > +                            azoteq,invert-enable;
> > +                            azoteq,rx-enable = <6>;
> > +                            azoteq,ati-target = <496>;
> > +                            azoteq,ati-base = <160>;
> > +                            azoteq,ati-mode = <5>;
> > +
> > +                            event-touch {
> > +                                    linux,code = <KEY_MUTE>;
> > +                            };
> > +                    };
> > +
> > +                    channel-7 {
> > +                            azoteq,global-halt;
> > +                            azoteq,invert-enable;
> > +                            azoteq,rx-enable = <6>;
> > +                            azoteq,ati-target = <496>;
> > +                            azoteq,ati-base = <160>;
> > +                            azoteq,ati-mode = <5>;
> > +
> > +                            event-touch {
> > +                                    linux,code = <KEY_VOLUMEDOWN>;
> > +                            };
> > +                    };
> > +
> > +                    channel-8 {
> > +                            azoteq,global-halt;
> > +                            azoteq,invert-enable;
> > +                            azoteq,rx-enable = <6>;
> > +                            azoteq,ati-target = <496>;
> > +                            azoteq,ati-base = <160>;
> > +                            azoteq,ati-mode = <5>;
> > +
> > +                            event-touch {
> > +                                    linux,code = <KEY_VOLUMEUP>;
> > +                            };
> > +                    };
> > +
> > +                    channel-9 {
> > +                            azoteq,global-halt;
> > +                            azoteq,invert-enable;
> > +                            azoteq,rx-enable = <6>;
> > +                            azoteq,ati-target = <496>;
> > +                            azoteq,ati-base = <160>;
> > +                            azoteq,ati-mode = <5>;
> > +
> > +                            event-touch {
> > +                                    linux,code = <KEY_POWER>;
> > +                            };
> > +                    };
> > +
> > +                    channel-10 {
> > +                            azoteq,ulp-allow;
> > +                            azoteq,ati-target = <496>;
> > +                            azoteq,ati-base = <112>;
> > +
> > +                            event-touch {
> > +                                    linux,code = <SW_LID>;
> > +                                    linux,input-type = <EV_SW>;
> > +                            };
> > +                    };
> > +
> > +                    channel-11 {
> > +                            azoteq,ati-target = <496>;
> > +                            azoteq,ati-base = <112>;
> > +                    };
> > +
> > +                    slider-0 {
> > +                            azoteq,channel-select = <1>, <2>, <3>, <4>;
> > +                            azoteq,slider-size = <4080>;
> > +                            azoteq,upper-cal = <50>;
> > +                            azoteq,lower-cal = <30>;
> > +                            azoteq,top-speed = <200>;
> > +                            azoteq,bottom-speed = <1>;
> > +                            azoteq,bottom-beta = <3>;
> > +
> > +                            event-tap {
> > +                                    linux,code = <KEY_PLAYPAUSE>;
> > +                                    azoteq,gesture-max-ms = <600>;
> > +                                    azoteq,gesture-min-ms = <24>;
> > +                            };
> > +
> > +                            event-flick-pos {
> > +                                    linux,code = <KEY_NEXTSONG>;
> > +                                    azoteq,gesture-max-ms = <600>;
> > +                                    azoteq,gesture-dist = <816>;
> > +                            };
> > +
> > +                            event-flick-neg {
> > +                                    linux,code = <KEY_PREVIOUSSONG>;
> > +                            };
> > +                    };
> > +            };
> > +    };
> > +
> > +...
> > -- 
> > 2.25.1
> > 
> > 

Kind regards,
Jeff LaBundy
diff mbox series

Patch

diff --git a/Documentation/devicetree/bindings/input/iqs7222.yaml b/Documentation/devicetree/bindings/input/iqs7222.yaml
new file mode 100644
index 000000000000..0c23d1d49ebd
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/iqs7222.yaml
@@ -0,0 +1,967 @@ 
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/input/iqs7222.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Azoteq IQS7222A/B/C Capacitive Touch Controller
+
+maintainers:
+  - Jeff LaBundy <jeff@labundy.com>
+
+description: |
+  The Azoteq IQS7222A, IQS7222B and IQS7222C are multichannel capacitive touch
+  controllers that feature additional sensing capabilities.
+
+  Link to datasheets: https://www.azoteq.com/
+
+properties:
+  compatible:
+    enum:
+      - azoteq,iqs7222a
+      - azoteq,iqs7222b
+      - azoteq,iqs7222c
+
+  reg:
+    maxItems: 1
+
+  irq-gpios:
+    maxItems: 1
+    description:
+      Specifies the GPIO connected to the device's active-low RDY output.
+
+  reset-gpios:
+    maxItems: 1
+    description:
+      Specifies the GPIO connected to the device's active-low MCLR input. The
+      device is temporarily held in hardware reset prior to initialization if
+      this property is present.
+
+  "#address-cells":
+    const: 1
+
+  "#size-cells":
+    const: 0
+
+  azoteq,rf-filt-enable:
+    type: boolean
+    description: Enables the device's internal RF filter.
+
+  azoteq,max-counts:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    enum: [0, 1, 2, 3]
+    description: |
+      Specifies the maximum counts as follows:
+      0: 1023
+      1: 2047
+      2: 4095
+      3: 16384
+
+  azoteq,auto-mode:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    enum: [0, 1, 2, 3]
+    description: |
+      Specifies the number of conversions to occur before an interrupt is
+      generated as follows:
+      0: 4
+      1: 8
+      2: 16
+      3: 32
+
+  azoteq,ati-frac-div-fine:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 0
+    maximum: 31
+    description: Specifies the preloaded ATI fine fractional divider.
+
+  azoteq,ati-frac-div-coarse:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 0
+    maximum: 31
+    description: Specifies the preloaded ATI coarse fractional divider.
+
+  azoteq,ati-comp-select:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 0
+    maximum: 1023
+    description: Specifies the preloaded ATI compensation selection.
+
+  azoteq,lta-beta-lp:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 0
+    maximum: 15
+    description:
+      Specifies the long-term average filter damping factor to be applied during
+      low-power mode.
+
+  azoteq,lta-beta-np:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 0
+    maximum: 15
+    description:
+      Specifies the long-term average filter damping factor to be applied during
+      normal-power mode.
+
+  azoteq,counts-beta-lp:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 0
+    maximum: 15
+    description:
+      Specifies the counts filter damping factor to be applied during low-power
+      mode.
+
+  azoteq,counts-beta-np:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 0
+    maximum: 15
+    description:
+      Specifies the counts filter damping factor to be applied during normal-
+      power mode.
+
+  azoteq,lta-fast-beta-lp:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 0
+    maximum: 15
+    description:
+      Specifies the long-term average filter fast damping factor to be applied
+      during low-power mode.
+
+  azoteq,lta-fast-beta-np:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    minimum: 0
+    maximum: 15
+    description:
+      Specifies the long-term average filter fast damping factor to be applied
+      during normal-power mode.
+
+  azoteq,timeout-ati-ms:
+    multipleOf: 500
+    minimum: 0
+    maximum: 32767500
+    description:
+      Specifies the delay (in ms) before ATI is retried following an ATI error.
+
+  azoteq,rate-ati-ms:
+    minimum: 0
+    maximum: 65535
+    description: Specifies the rate (in ms) at which ATI status is evaluated.
+
+  azoteq,timeout-np-ms:
+    minimum: 0
+    maximum: 65535
+    description:
+      Specifies the length of time (in ms) to wait for an event before moving
+      from normal-power mode to low-power mode.
+
+  azoteq,rate-np-ms:
+    minimum: 0
+    maximum: 3000
+    description: Specifies the report rate (in ms) during normal-power mode.
+
+  azoteq,timeout-lp-ms:
+    minimum: 0
+    maximum: 65535
+    description:
+      Specifies the length of time (in ms) to wait for an event before moving
+      from low-power mode to ultra-low-power mode.
+
+  azoteq,rate-lp-ms:
+    minimum: 0
+    maximum: 3000
+    description: Specifies the report rate (in ms) during low-power mode.
+
+  azoteq,timeout-ulp-ms:
+    minimum: 0
+    maximum: 65535
+    description:
+      Specifies the rate (in ms) at which channels not regularly sampled during
+      ultra-low-power mode are updated.
+
+  azoteq,rate-ulp-ms:
+    minimum: 0
+    maximum: 3000
+    description: Specifies the report rate (in ms) during ultra-low-power mode.
+
+patternProperties:
+  "^cycle-[0-9]$":
+    type: object
+    description: Represents a conversion cycle serving two sensing channels.
+
+    properties:
+      azoteq,conv-period:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 255
+        description: Specifies the cycle's conversion period.
+
+      azoteq,conv-frac:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 255
+        description: Specifies the cycle's conversion frequency fraction.
+
+      azoteq,tx-enable:
+        $ref: /schemas/types.yaml#/definitions/uint32-array
+        minItems: 1
+        maxItems: 9
+        items:
+          minimum: 0
+          maximum: 8
+        description: Specifies the CTx pin(s) associated with the cycle.
+
+      azoteq,rx-float-inactive:
+        type: boolean
+        description: Floats any inactive CRx pins instead of grounding them.
+
+      azoteq,dead-time-enable:
+        type: boolean
+        description:
+          Increases the denominator of the conversion frequency formula by one.
+
+      azoteq,tx-freq-fosc:
+        type: boolean
+        description:
+          Fixes the conversion frequency to that of the device's core clock.
+
+      azoteq,vbias-enable:
+        type: boolean
+        description: Enables the bias voltage for use during inductive sensing.
+
+      azoteq,sense-mode:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        enum: [0, 1, 2, 3]
+        description: |
+          Specifies the cycle's sensing mode as follows:
+          0: None
+          1: Self capacitive
+          2: Mutual capacitive
+          3: Inductive
+
+          Note that in the case of IQS7222A, cycles 5 and 6 are restricted to
+          Hall-effect sensing.
+
+      azoteq,iref-enable:
+        type: boolean
+        description:
+          Enables the current reference for use during various sensing modes.
+
+      azoteq,iref-level:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 15
+        description: Specifies the cycle's current reference level.
+
+      azoteq,iref-trim:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 15
+        description: Specifies the cycle's current reference trim.
+
+    dependencies:
+      azoteq,iref-level: ["azoteq,iref-enable"]
+      azoteq,iref-trim: ["azoteq,iref-enable"]
+
+    additionalProperties: false
+
+  "^channel-[0-19]$":
+    type: object
+    description:
+      Represents a single sensing channel. A channel is active if defined and
+      inactive otherwise.
+
+      Note that in the case of IQS7222A, channels 10 and 11 are restricted to
+      Hall-effect sensing with events reported on channel 10 only.
+
+    properties:
+      azoteq,ulp-allow:
+        type: boolean
+        description:
+          Permits the device to enter ultra-low-power mode while the channel
+          lies in a state of touch or proximity.
+
+      azoteq,ref-select:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 9
+        description: Specifies a separate reference channel to be followed.
+
+      azoteq,ref-weight:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 65535
+        description: Specifies the relative weight of the reference channel.
+
+      azoteq,use-prox:
+        type: boolean
+        description:
+          Activates the reference channel in response to proximity events
+          instead of touch events.
+
+      azoteq,ati-band:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        enum: [0, 1, 2, 3]
+        description: |
+          Specifies the channel's ATI band as a fraction of its ATI target as
+          follows:
+          0: 1/16
+          1: 1/8
+          2: 1/4
+          3: 1/2
+
+      azoteq,global-halt:
+        type: boolean
+        description:
+          Specifies that the channel's long-term average is to freeze if any
+          other participating channel lies in a proximity or touch state.
+
+      azoteq,invert-enable:
+        type: boolean
+        description:
+          Inverts the polarity of the states reported for proximity and touch
+          events relative to their respective thresholds.
+
+      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,rx-enable:
+        $ref: /schemas/types.yaml#/definitions/uint32-array
+        minItems: 1
+        maxItems: 4
+        items:
+          minimum: 0
+          maximum: 7
+        description: Specifies the CRx pin(s) associated with the channel.
+
+      azoteq,samp-cap-double:
+        type: boolean
+        description: Doubles the sampling capacitance from 40 pF to 80 pF.
+
+      azoteq,vref-half:
+        type: boolean
+        description: Halves the discharge threshold from 1.0 V to 0.5 V.
+
+      azoteq,proj-bias:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        enum: [0, 1, 2, 3]
+        description: |
+          Specifies the bias current applied during mutual (projected)
+          capacitive sensing as follows:
+          0: 2 uA
+          1: 5 uA
+          2: 7 uA
+          3: 10 uA
+
+      azoteq,ati-target:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        multipleOf: 8
+        minimum: 0
+        maximum: 2040
+        description: Specifies the channel's ATI target.
+
+      azoteq,ati-base:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        multipleOf: 16
+        minimum: 0
+        maximum: 496
+        description: Specifies the channel's ATI base.
+
+      azoteq,ati-mode:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        enum: [0, 1, 2, 3, 4, 5]
+        description: |
+          Specifies the channel's ATI mode as follows:
+          0: Disabled
+          1: Compensation
+          2: Compensation divider
+          3: Fine fractional divider
+          4: Coarse fractional divider
+          5: Full
+
+      azoteq,ati-frac-div-fine:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 31
+        description: Specifies the channel's ATI fine fractional divider.
+
+      azoteq,ati-frac-mult-coarse:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 15
+        description: Specifies the channel's ATI coarse fractional multiplier.
+
+      azoteq,ati-frac-div-coarse:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 31
+        description: Specifies the channel's ATI coarse fractional divider.
+
+      azoteq,ati-comp-div:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 31
+        description: Specifies the channel's ATI compensation divider.
+
+      azoteq,ati-comp-select:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 1023
+        description: Specifies the channel's ATI compensation selection.
+
+      azoteq,debounce-enter:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 15
+        description: Specifies the channel's debounce entrance factor.
+
+      azoteq,debounce-exit:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 15
+        description: Specifies the channel's debounce exit factor.
+
+    patternProperties:
+      "^event-(prox|touch)$":
+        type: object
+        description:
+          Represents a proximity or touch event reported by the channel.
+
+        properties:
+          azoteq,gpio-select:
+            $ref: /schemas/types.yaml#/definitions/uint32-array
+            minItems: 1
+            maxItems: 3
+            items:
+              minimum: 0
+              maximum: 2
+            description: |
+              Specifies one or more GPIO mapped to the event as follows:
+              0: GPIO0
+              1: GPIO3 (IQS7222C only)
+              2: GPIO4 (IQS7222C only)
+
+              Note that although multiple events can be mapped to a single
+              GPIO, they must all be of the same type (proximity, touch or
+              slider gesture).
+
+          azoteq,thresh:
+            $ref: /schemas/types.yaml#/definitions/uint32
+            description:
+              Specifies the threshold for the event. Valid entries range from
+              0-127 and 0-255 for proximity and touch events, respectively.
+
+          azoteq,hyst:
+            $ref: /schemas/types.yaml#/definitions/uint32
+            minimum: 0
+            maximum: 255
+            description:
+              Specifies the hysteresis for the event (touch events only).
+
+          azoteq,timeout-press-ms:
+            multipleOf: 500
+            minimum: 0
+            maximum: 127500
+            description:
+              Specifies the length of time (in ms) to wait before automatically
+              releasing a press event. Specify zero to allow the press state to
+              persist indefinitely.
+
+              The IQS7222B does not feature channel-specific timeouts; the time-
+              out specified for any one channel applies to all channels.
+
+          linux,code:
+            $ref: /schemas/types.yaml#/definitions/uint32
+            description:
+              Numeric key or switch code associated with the event. Specify
+              KEY_RESERVED (0) to opt out of event reporting.
+
+          linux,input-type:
+            $ref: /schemas/types.yaml#/definitions/uint32
+            enum: [1, 5]
+            default: 1
+            description:
+              Specifies whether the event is to be interpreted as a key (1)
+              or a switch (5).
+
+        required:
+          - linux,code
+
+        additionalProperties: false
+
+    dependencies:
+      azoteq,ref-weight: ["azoteq,ref-select"]
+      azoteq,use-prox: ["azoteq,ref-select"]
+
+    additionalProperties: false
+
+  "^slider-[0-1]$":
+    type: object
+    description: Represents a slider comprising three or four channels.
+
+    properties:
+      azoteq,channel-select:
+        $ref: /schemas/types.yaml#/definitions/uint32-array
+        minItems: 3
+        maxItems: 4
+        items:
+          minimum: 0
+          maximum: 9
+        description:
+          Specifies the order of the channels that participate in the slider.
+
+      azoteq,slider-size:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 65535
+        description:
+          Specifies the slider's one-dimensional resolution, equal to the
+          maximum coordinate plus one.
+
+      azoteq,lower-cal:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 255
+        description: Specifies the slider's lower starting point.
+
+      azoteq,upper-cal:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 255
+        description: Specifies the slider's upper starting point.
+
+      azoteq,top-speed:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 65535
+        description:
+          Specifies the speed of movement after which coordinate filtering is
+          no longer applied.
+
+      azoteq,bottom-speed:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        multipleOf: 4
+        minimum: 0
+        maximum: 1020
+        description:
+          Specifies the speed of movement after which coordinate filtering is
+          linearly reduced.
+
+      azoteq,bottom-beta:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        minimum: 0
+        maximum: 7
+        description:
+          Specifies the coordinate filter damping factor to be applied
+          while the speed of movement is below that which is specified
+          by azoteq,bottom-speed.
+
+      azoteq,static-beta:
+        type: boolean
+        description:
+          Applies the coordinate filter damping factor specified by
+          azoteq,bottom-beta regardless of the speed of movement.
+
+      azoteq,use-prox:
+        type: boolean
+        description:
+          Directs the slider to respond to the proximity states of the selected
+          channels instead of their corresponding touch states. Note the slider
+          cannot report granular coordinates during a state of proximity.
+
+      linux,axis:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        description:
+          Specifies the absolute axis to which coordinates are mapped. Specify
+          ABS_WHEEL to operate the slider as a wheel (IQS7222C only).
+
+    patternProperties:
+      "^event-(press|tap|(swipe|flick)-(pos|neg))$":
+        type: object
+        description:
+          Represents a press or gesture (IQS7222A only) event reported by
+          the slider.
+
+        properties:
+          linux,code:
+            $ref: /schemas/types.yaml#/definitions/uint32
+            description: Numeric key code associated with the event.
+
+          azoteq,gesture-max-ms:
+            multipleOf: 4
+            minimum: 0
+            maximum: 1020
+            description:
+              Specifies the length of time (in ms) within which a tap, swipe
+              or flick gesture must be completed in order to be acknowledged
+              by the device. The number specified for any one swipe or flick
+              gesture applies to all remaining swipe or flick gestures.
+
+          azoteq,gesture-min-ms:
+            multipleOf: 4
+            minimum: 0
+            maximum: 124
+            description:
+              Specifies the length of time (in ms) for which a tap gesture must
+              be held in order to be acknowledged by the device.
+
+          azoteq,gesture-dist:
+            $ref: /schemas/types.yaml#/definitions/uint32
+            multipleOf: 16
+            minimum: 0
+            maximum: 4080
+            description:
+              Specifies the distance across which a swipe or flick gesture must
+              travel in order to be acknowledged by the device. The number spec-
+              ified for any one swipe or flick gesture applies to all remaining
+              swipe or flick gestures.
+
+          azoteq,gpio-select:
+            $ref: /schemas/types.yaml#/definitions/uint32-array
+            minItems: 1
+            maxItems: 1
+            items:
+              minimum: 0
+              maximum: 0
+            description: |
+              Specifies an individual GPIO mapped to a tap, swipe or flick
+              gesture as follows:
+              0: GPIO0
+              1: GPIO3 (reserved)
+              2: GPIO4 (reserved)
+
+              Note that although multiple events can be mapped to a single
+              GPIO, they must all be of the same type (proximity, touch or
+              slider gesture).
+
+        required:
+          - linux,code
+
+        additionalProperties: false
+
+    required:
+      - azoteq,channel-select
+
+    additionalProperties: false
+
+  "^gpio-[0-2]$":
+    type: object
+    description: |
+      Represents a GPIO mapped to one or more events as follows:
+      gpio-0: GPIO0
+      gpio-1: GPIO3 (IQS7222C only)
+      gpio-2: GPIO4 (IQS7222C only)
+
+    allOf:
+      - $ref: ../pinctrl/pincfg-node.yaml#
+
+    properties:
+      drive-open-drain: true
+
+    additionalProperties: false
+
+allOf:
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: azoteq,iqs7222b
+
+    then:
+      patternProperties:
+        "^cycle-[0-9]$":
+          properties:
+            azoteq,iref-enable: false
+
+        "^channel-[0-19]$":
+          properties:
+            azoteq,ref-select: false
+
+          patternProperties:
+            "^event-(prox|touch)$":
+              properties:
+                azoteq,gpio-select: false
+
+        "^slider-[0-1]$": false
+
+        "^gpio-[0-2]$": false
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: azoteq,iqs7222a
+
+    then:
+      patternProperties:
+        "^channel-[0-19]$":
+          patternProperties:
+            "^event-(prox|touch)$":
+              properties:
+                azoteq,gpio-select:
+                  maxItems: 1
+                  items:
+                    maximum: 0
+
+        "^slider-[0-1]$":
+          properties:
+            azoteq,slider-size:
+              multipleOf: 16
+              maximum: 4080
+
+            azoteq,top-speed:
+              multipleOf: 4
+              maximum: 1020
+
+    else:
+      patternProperties:
+        "^channel-[0-19]$":
+          properties:
+            azoteq,ulp-allow: false
+
+        "^slider-[0-1]$":
+          patternProperties:
+            "^event-(press|tap|(swipe|flick)-(pos|neg))$":
+              properties:
+                azoteq,gesture-max-ms: false
+
+                azoteq,gesture-min-ms: false
+
+                azoteq,gesture-dist: false
+
+                azoteq,gpio-select: false
+
+required:
+  - compatible
+  - reg
+  - irq-gpios
+  - "#address-cells"
+  - "#size-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/gpio/gpio.h>
+    #include <dt-bindings/input/input.h>
+
+    i2c {
+            #address-cells = <1>;
+            #size-cells = <0>;
+
+            iqs7222a@44 {
+                    compatible = "azoteq,iqs7222a";
+                    reg = <0x44>;
+                    irq-gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
+                    azoteq,lta-beta-lp = <7>;
+                    azoteq,lta-beta-np = <8>;
+                    azoteq,counts-beta-lp = <2>;
+                    azoteq,counts-beta-np = <3>;
+                    azoteq,lta-fast-beta-lp = <3>;
+                    azoteq,lta-fast-beta-np = <4>;
+
+                    cycle-0 {
+                            azoteq,conv-period = <5>;
+                            azoteq,conv-frac = <127>;
+                            azoteq,tx-enable = <1>, <2>, <4>, <5>;
+                            azoteq,dead-time-enable;
+                            azoteq,sense-mode = <2>;
+                    };
+
+                    cycle-1 {
+                            azoteq,conv-period = <5>;
+                            azoteq,conv-frac = <127>;
+                            azoteq,tx-enable = <5>;
+                            azoteq,dead-time-enable;
+                            azoteq,sense-mode = <2>;
+                    };
+
+                    cycle-2 {
+                            azoteq,conv-period = <5>;
+                            azoteq,conv-frac = <127>;
+                            azoteq,tx-enable = <4>;
+                            azoteq,dead-time-enable;
+                            azoteq,sense-mode = <2>;
+                    };
+
+                    cycle-3 {
+                            azoteq,conv-period = <5>;
+                            azoteq,conv-frac = <127>;
+                            azoteq,tx-enable = <2>;
+                            azoteq,dead-time-enable;
+                            azoteq,sense-mode = <2>;
+                    };
+
+                    cycle-4 {
+                            azoteq,conv-period = <5>;
+                            azoteq,conv-frac = <127>;
+                            azoteq,tx-enable = <1>;
+                            azoteq,dead-time-enable;
+                            azoteq,sense-mode = <2>;
+                    };
+
+                    cycle-5 {
+                            azoteq,conv-period = <2>;
+                            azoteq,conv-frac = <0>;
+                    };
+
+                    cycle-6 {
+                            azoteq,conv-period = <2>;
+                            azoteq,conv-frac = <0>;
+                    };
+
+                    channel-0 {
+                            azoteq,ulp-allow;
+                            azoteq,global-halt;
+                            azoteq,invert-enable;
+                            azoteq,rx-enable = <3>;
+                            azoteq,ati-target = <800>;
+                            azoteq,ati-base = <208>;
+                            azoteq,ati-mode = <5>;
+                    };
+
+                    channel-1 {
+                            azoteq,global-halt;
+                            azoteq,invert-enable;
+                            azoteq,rx-enable = <3>;
+                            azoteq,ati-target = <496>;
+                            azoteq,ati-base = <208>;
+                            azoteq,ati-mode = <5>;
+                    };
+
+                    channel-2 {
+                            azoteq,global-halt;
+                            azoteq,invert-enable;
+                            azoteq,rx-enable = <3>;
+                            azoteq,ati-target = <496>;
+                            azoteq,ati-base = <208>;
+                            azoteq,ati-mode = <5>;
+                    };
+
+                    channel-3 {
+                            azoteq,global-halt;
+                            azoteq,invert-enable;
+                            azoteq,rx-enable = <3>;
+                            azoteq,ati-target = <496>;
+                            azoteq,ati-base = <208>;
+                            azoteq,ati-mode = <5>;
+                    };
+
+                    channel-4 {
+                            azoteq,global-halt;
+                            azoteq,invert-enable;
+                            azoteq,rx-enable = <3>;
+                            azoteq,ati-target = <496>;
+                            azoteq,ati-base = <208>;
+                            azoteq,ati-mode = <5>;
+                    };
+
+                    channel-5 {
+                            azoteq,ulp-allow;
+                            azoteq,global-halt;
+                            azoteq,invert-enable;
+                            azoteq,rx-enable = <6>;
+                            azoteq,ati-target = <800>;
+                            azoteq,ati-base = <144>;
+                            azoteq,ati-mode = <5>;
+                    };
+
+                    channel-6 {
+                            azoteq,global-halt;
+                            azoteq,invert-enable;
+                            azoteq,rx-enable = <6>;
+                            azoteq,ati-target = <496>;
+                            azoteq,ati-base = <160>;
+                            azoteq,ati-mode = <5>;
+
+                            event-touch {
+                                    linux,code = <KEY_MUTE>;
+                            };
+                    };
+
+                    channel-7 {
+                            azoteq,global-halt;
+                            azoteq,invert-enable;
+                            azoteq,rx-enable = <6>;
+                            azoteq,ati-target = <496>;
+                            azoteq,ati-base = <160>;
+                            azoteq,ati-mode = <5>;
+
+                            event-touch {
+                                    linux,code = <KEY_VOLUMEDOWN>;
+                            };
+                    };
+
+                    channel-8 {
+                            azoteq,global-halt;
+                            azoteq,invert-enable;
+                            azoteq,rx-enable = <6>;
+                            azoteq,ati-target = <496>;
+                            azoteq,ati-base = <160>;
+                            azoteq,ati-mode = <5>;
+
+                            event-touch {
+                                    linux,code = <KEY_VOLUMEUP>;
+                            };
+                    };
+
+                    channel-9 {
+                            azoteq,global-halt;
+                            azoteq,invert-enable;
+                            azoteq,rx-enable = <6>;
+                            azoteq,ati-target = <496>;
+                            azoteq,ati-base = <160>;
+                            azoteq,ati-mode = <5>;
+
+                            event-touch {
+                                    linux,code = <KEY_POWER>;
+                            };
+                    };
+
+                    channel-10 {
+                            azoteq,ulp-allow;
+                            azoteq,ati-target = <496>;
+                            azoteq,ati-base = <112>;
+
+                            event-touch {
+                                    linux,code = <SW_LID>;
+                                    linux,input-type = <EV_SW>;
+                            };
+                    };
+
+                    channel-11 {
+                            azoteq,ati-target = <496>;
+                            azoteq,ati-base = <112>;
+                    };
+
+                    slider-0 {
+                            azoteq,channel-select = <1>, <2>, <3>, <4>;
+                            azoteq,slider-size = <4080>;
+                            azoteq,upper-cal = <50>;
+                            azoteq,lower-cal = <30>;
+                            azoteq,top-speed = <200>;
+                            azoteq,bottom-speed = <1>;
+                            azoteq,bottom-beta = <3>;
+
+                            event-tap {
+                                    linux,code = <KEY_PLAYPAUSE>;
+                                    azoteq,gesture-max-ms = <600>;
+                                    azoteq,gesture-min-ms = <24>;
+                            };
+
+                            event-flick-pos {
+                                    linux,code = <KEY_NEXTSONG>;
+                                    azoteq,gesture-max-ms = <600>;
+                                    azoteq,gesture-dist = <816>;
+                            };
+
+                            event-flick-neg {
+                                    linux,code = <KEY_PREVIOUSSONG>;
+                            };
+                    };
+            };
+    };
+
+...