Documentation describes the required and optional properties for
implementing Device Tree for a Microsoft G6 Touch Digitizer that
supports HID over SPI Protocol 1.0 specification.
The properties are common to HID over SPI.
Signed-off-by: Dmitry Antipov <dmanti@microsoft.com>
Signed-off-by: Jarrett Schultz <jaschultz@microsoft.com>
Signed-off-by: Jingyuan Liang <jingyliang@chromium.org>
---
.../devicetree/bindings/input/hid-over-spi.yaml | 153 +++++++++++++++++++++
1 file changed, 153 insertions(+)
diff --git a/Documentation/devicetree/bindings/input/hid-over-spi.yaml b/Documentation/devicetree/bindings/input/hid-over-spi.yaml
new file mode 100644
index 000000000000..b623629ed9d3
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/hid-over-spi.yaml
@@ -0,0 +1,153 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/input/hid-over-spi.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: HID over SPI Devices
+
+maintainers:
+ - Benjamin Tissoires <benjamin.tissoires@redhat.com>
+ - Jiri Kosina <jkosina@suse.cz>
+
+description: |+
+ HID over SPI provides support for various Human Interface Devices over the
+ SPI bus. These devices can be for example touchpads, keyboards, touch screens
+ or sensors.
+
+ The specification has been written by Microsoft and is currently available here:
+ https://www.microsoft.com/en-us/download/details.aspx?id=103325
+
+ If this binding is used, the kernel module spi-hid will handle the communication
+ with the device and the generic hid core layer will handle the protocol.
+
+allOf:
+ - $ref: /schemas/input/touchscreen/touchscreen.yaml#
+
+properties:
+ compatible:
+ oneOf:
+ - items:
+ - enum:
+ - microsoft,g6-touch-digitizer
+ - const: hid-over-spi
+ - description: Just "hid-over-spi" alone is allowed, but not recommended.
+ const: hid-over-spi
+
+ reg:
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+
+ reset-gpios:
+ maxItems: 1
+ description:
+ GPIO specifier for the digitizer's reset pin (active low). The line must
+ be flagged with GPIO_ACTIVE_LOW.
+
+ vdd-supply:
+ description:
+ Regulator for the VDD supply voltage.
+
+ input-report-header-address:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minimum: 0
+ maximum: 0xffffff
+ description:
+ A value to be included in the Read Approval packet, listing an address of
+ the input report header to be put on the SPI bus. This address has 24
+ bits.
+
+ input-report-body-address:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minimum: 0
+ maximum: 0xffffff
+ description:
+ A value to be included in the Read Approval packet, listing an address of
+ the input report body to be put on the SPI bus. This address has 24 bits.
+
+ output-report-address:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minimum: 0
+ maximum: 0xffffff
+ description:
+ A value to be included in the Output Report sent by the host, listing an
+ address where the output report on the SPI bus is to be written to. This
+ address has 24 bits.
+
+ post-power-on-delay-ms:
+ description:
+ Optional time in ms required by the device after enabling its regulators
+ or powering it on, before it is ready for communication.
+
+ minimal-reset-delay-ms:
+ description:
+ Optional minimum amount of time in ms that device needs to be in reset
+ state for the reset to take effect.
+
+ read-opcode:
+ $ref: /schemas/types.yaml#/definitions/uint8
+ description:
+ Value to be used in Read Approval packets. 1 byte.
+
+ write-opcode:
+ $ref: /schemas/types.yaml#/definitions/uint8
+ description:
+ Value to be used in Write Approval packets. 1 byte.
+
+ hid-over-spi-flags:
+ $ref: /schemas/types.yaml#/definitions/uint16
+ description:
+ 16 bits.
+ Bits 0-12 - Reserved (must be 0)
+ Bit 13 - SPI Write Mode. Possible values -
+ * 0b0- Writes are carried out in Single-SPI mode
+ * 0b1- Writes are carried out in the Multi-SPI mode specified by bits
+ 14-15
+ Bits 14-15 - Multi-SPI Mode. Possible values -
+ * 0b00- Single SPI
+ * 0b01- Dual SPI
+ * 0b10- Quad SPI
+
+required:
+ - compatible
+ - interrupts
+ - reset-gpios
+ - vdd-supply
+ - input-report-header-address
+ - input-report-body-address
+ - output-report-address
+ - read-opcode
+ - write-opcode
+ - hid-over-spi-flags
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/irq.h>
+ #include <dt-bindings/gpio/gpio.h>
+
+ spi {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ hid@0 {
+ compatible = "hid-over-spi";
+ reg = <0x0>;
+ interrupts-extended = <&gpio 42 IRQ_TYPE_EDGE_FALLING>;
+ reset-gpios = <&gpio 27 GPIO_ACTIVE_LOW>;
+ vdd-supply = <&pm8350c_l3>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&ts_d6_reset_assert &ts_d6_int_bias>;
+ input-report-header-address = <0x1000>;
+ input-report-body-address = <0x1004>;
+ output-report-address = <0x2000>;
+ read-opcode = <0x0b>;
+ write-opcode = <0x02>;
+ hid-over-spi-flags = <0x0000>;
+ post-power-on-delay-ms = <5>;
+ minimal-reset-delay-ms = <5>;
+ };
+ };
\ No newline at end of file
--
2.53.0.473.g4a7958ca14-goog
On 3/3/26 3:13 AM, Jingyuan Liang wrote: > Documentation describes the required and optional properties for > implementing Device Tree for a Microsoft G6 Touch Digitizer that > supports HID over SPI Protocol 1.0 specification. > […] > +properties: > + compatible: > + oneOf: > + - items: > + - enum: > + - microsoft,g6-touch-digitizer > + - const: hid-over-spi > + - description: Just "hid-over-spi" alone is allowed, but not recommended. > […] > +required: > + - compatible > + - interrupts > + - reset-gpios Why is reset required? Is it so implausible on some device implementing the spec there wouldn't be a reset gpio? > + - vdd-supply Linux makes up a dummy regulator if DT doesn't provide one, so can regulators even be required? > […] > + compatible = "hid-over-spi"; Not following your own recommendation from above :) > + reg = <0x0>; > + interrupts-extended = <&gpio 42 IRQ_TYPE_EDGE_FALLING>; > + reset-gpios = <&gpio 27 GPIO_ACTIVE_LOW>; > + vdd-supply = <&pm8350c_l3>; > + pinctrl-names = "default"; > + pinctrl-0 = <&ts_d6_reset_assert &ts_d6_int_bias>; Heh, "reset_assert" is a name implying it would actually set the value from the pinctrl properties, which is what had to be done before reset-gpios were supported. But now reset-gpios are supported. Thanks, ~val P.S. happy to see work on this happen again!
On Fri, Mar 6, 2026 at 11:25 PM Val Packett <val@packett.cool> wrote: > > > On 3/3/26 3:13 AM, Jingyuan Liang wrote: > > Documentation describes the required and optional properties for > > implementing Device Tree for a Microsoft G6 Touch Digitizer that > > supports HID over SPI Protocol 1.0 specification. > > […] > > +properties: > > + compatible: > > + oneOf: > > + - items: > > + - enum: > > + - microsoft,g6-touch-digitizer > > + - const: hid-over-spi > > + - description: Just "hid-over-spi" alone is allowed, but not recommended. > > […] > > +required: > > + - compatible > > + - interrupts > > + - reset-gpios > > Why is reset required? Is it so implausible on some device implementing > the spec there wouldn't be a reset gpio? > > > + - vdd-supply > Linux makes up a dummy regulator if DT doesn't provide one, so can > regulators even be required? > > […] > > + compatible = "hid-over-spi"; > Not following your own recommendation from above :) Thanks! I will fix this in v2. > > + reg = <0x0>; > > + interrupts-extended = <&gpio 42 IRQ_TYPE_EDGE_FALLING>; > > + reset-gpios = <&gpio 27 GPIO_ACTIVE_LOW>; > > + vdd-supply = <&pm8350c_l3>; > > + pinctrl-names = "default"; > > + pinctrl-0 = <&ts_d6_reset_assert &ts_d6_int_bias>; > > Heh, "reset_assert" is a name implying it would actually set the value > from the pinctrl properties, which is what had to be done before > reset-gpios were supported. But now reset-gpios are supported. Taken from the original patch. Will fix this in v2. > > > Thanks, > ~val > > > P.S. happy to see work on this happen again! >
On Sat, Mar 07, 2026 at 04:25:44AM -0300, Val Packett wrote: > > On 3/3/26 3:13 AM, Jingyuan Liang wrote: > > Documentation describes the required and optional properties for > > implementing Device Tree for a Microsoft G6 Touch Digitizer that > > supports HID over SPI Protocol 1.0 specification. > > […] > > +properties: > > + compatible: > > + oneOf: > > + - items: > > + - enum: > > + - microsoft,g6-touch-digitizer > > + - const: hid-over-spi > > + - description: Just "hid-over-spi" alone is allowed, but not recommended. > > […] > > +required: > > + - compatible > > + - interrupts > > + - reset-gpios > > Why is reset required? Is it so implausible on some device implementing the > spec there wouldn't be a reset gpio? No, because it is mandated by the spec: "HID SPI peripheral must provide a dedicated reset line, driven by the HOST, which, when toggled (pulled LOW for at least 10ms, normally HIGH), will have the effect of resetting the device. If a HID SPI peripheral is enumerated via ACPI, the device ASL configuration must expose an ACPI FLDR (_RST) method to control this line." The spec also states that the host must initiate reset during initialization of the device. > > > + - vdd-supply > Linux makes up a dummy regulator if DT doesn't provide one, so can > regulators even be required? There is still a supply line to the chip even if it is not exposed to the OS control. So as far as chip is concerned the supply is required. Thanks. -- Dmitry
On Tue, Mar 3, 2026 at 12:14 AM Jingyuan Liang <jingyliang@chromium.org> wrote:
>
> Documentation describes the required and optional properties for
> implementing Device Tree for a Microsoft G6 Touch Digitizer that
> supports HID over SPI Protocol 1.0 specification.
>
> The properties are common to HID over SPI.
>
> Signed-off-by: Dmitry Antipov <dmanti@microsoft.com>
> Signed-off-by: Jarrett Schultz <jaschultz@microsoft.com>
> Signed-off-by: Jingyuan Liang <jingyliang@chromium.org>
> ---
> .../devicetree/bindings/input/hid-over-spi.yaml | 153 +++++++++++++++++++++
> 1 file changed, 153 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/input/hid-over-spi.yaml b/Documentation/devicetree/bindings/input/hid-over-spi.yaml
> new file mode 100644
> index 000000000000..b623629ed9d3
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/input/hid-over-spi.yaml
> @@ -0,0 +1,153 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/input/hid-over-spi.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: HID over SPI Devices
> +
> +maintainers:
> + - Benjamin Tissoires <benjamin.tissoires@redhat.com>
> + - Jiri Kosina <jkosina@suse.cz>
> +
> +description: |+
> + HID over SPI provides support for various Human Interface Devices over the
> + SPI bus. These devices can be for example touchpads, keyboards, touch screens
> + or sensors.
> +
> + The specification has been written by Microsoft and is currently available here:
> + https://www.microsoft.com/en-us/download/details.aspx?id=103325
> +
> + If this binding is used, the kernel module spi-hid will handle the communication
> + with the device and the generic hid core layer will handle the protocol.
> +
> +allOf:
> + - $ref: /schemas/input/touchscreen/touchscreen.yaml#
> +
> +properties:
> + compatible:
> + oneOf:
> + - items:
> + - enum:
> + - microsoft,g6-touch-digitizer
> + - const: hid-over-spi
> + - description: Just "hid-over-spi" alone is allowed, but not recommended.
> + const: hid-over-spi
> +
> + reg:
> + maxItems: 1
> +
> + interrupts:
> + maxItems: 1
> +
> + reset-gpios:
> + maxItems: 1
> + description:
> + GPIO specifier for the digitizer's reset pin (active low). The line must
> + be flagged with GPIO_ACTIVE_LOW.
> +
> + vdd-supply:
> + description:
> + Regulator for the VDD supply voltage.
Is this part of the spec? This won't scale for multiple devices with
different power rails.
> +
> + input-report-header-address:
> + $ref: /schemas/types.yaml#/definitions/uint32
> + minimum: 0
> + maximum: 0xffffff
> + description:
> + A value to be included in the Read Approval packet, listing an address of
> + the input report header to be put on the SPI bus. This address has 24
> + bits.
> +
> + input-report-body-address:
> + $ref: /schemas/types.yaml#/definitions/uint32
> + minimum: 0
> + maximum: 0xffffff
> + description:
> + A value to be included in the Read Approval packet, listing an address of
> + the input report body to be put on the SPI bus. This address has 24 bits.
> +
> + output-report-address:
> + $ref: /schemas/types.yaml#/definitions/uint32
> + minimum: 0
> + maximum: 0xffffff
> + description:
> + A value to be included in the Output Report sent by the host, listing an
> + address where the output report on the SPI bus is to be written to. This
> + address has 24 bits.
> +
> + post-power-on-delay-ms:
> + description:
> + Optional time in ms required by the device after enabling its regulators
> + or powering it on, before it is ready for communication.
Drop. This should be implied by the compatible.
> +
> + minimal-reset-delay-ms:
> + description:
> + Optional minimum amount of time in ms that device needs to be in reset
> + state for the reset to take effect.
Drop. This should be implied by the compatible.
> +
> + read-opcode:
> + $ref: /schemas/types.yaml#/definitions/uint8
> + description:
> + Value to be used in Read Approval packets. 1 byte.
> +
> + write-opcode:
> + $ref: /schemas/types.yaml#/definitions/uint8
> + description:
> + Value to be used in Write Approval packets. 1 byte.
Why are these and the address properties above not defined by the
spec? Do they vary for a specific device? If not, then they should be
implied by the compatible.
> +
> + hid-over-spi-flags:
> + $ref: /schemas/types.yaml#/definitions/uint16
> + description:
> + 16 bits.
> + Bits 0-12 - Reserved (must be 0)
> + Bit 13 - SPI Write Mode. Possible values -
> + * 0b0- Writes are carried out in Single-SPI mode
> + * 0b1- Writes are carried out in the Multi-SPI mode specified by bits
> + 14-15
> + Bits 14-15 - Multi-SPI Mode. Possible values -
> + * 0b00- Single SPI
> + * 0b01- Dual SPI
> + * 0b10- Quad SPI
We already have SPI properties to define the bus width for read and write.
> +
> +required:
> + - compatible
> + - interrupts
> + - reset-gpios
> + - vdd-supply
> + - input-report-header-address
> + - input-report-body-address
> + - output-report-address
> + - read-opcode
> + - write-opcode
> + - hid-over-spi-flags
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/interrupt-controller/irq.h>
> + #include <dt-bindings/gpio/gpio.h>
> +
> + spi {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + hid@0 {
> + compatible = "hid-over-spi";
> + reg = <0x0>;
> + interrupts-extended = <&gpio 42 IRQ_TYPE_EDGE_FALLING>;
> + reset-gpios = <&gpio 27 GPIO_ACTIVE_LOW>;
> + vdd-supply = <&pm8350c_l3>;
> + pinctrl-names = "default";
> + pinctrl-0 = <&ts_d6_reset_assert &ts_d6_int_bias>;
> + input-report-header-address = <0x1000>;
> + input-report-body-address = <0x1004>;
> + output-report-address = <0x2000>;
> + read-opcode = <0x0b>;
> + write-opcode = <0x02>;
> + hid-over-spi-flags = <0x0000>;
> + post-power-on-delay-ms = <5>;
> + minimal-reset-delay-ms = <5>;
> + };
> + };
> \ No newline at end of file
Fix this.
Rob
On Tue, 03 Mar 2026 06:13:01 +0000, Jingyuan Liang wrote: > Documentation describes the required and optional properties for > implementing Device Tree for a Microsoft G6 Touch Digitizer that > supports HID over SPI Protocol 1.0 specification. > > The properties are common to HID over SPI. > > Signed-off-by: Dmitry Antipov <dmanti@microsoft.com> > Signed-off-by: Jarrett Schultz <jaschultz@microsoft.com> > Signed-off-by: Jingyuan Liang <jingyliang@chromium.org> > --- > .../devicetree/bindings/input/hid-over-spi.yaml | 153 +++++++++++++++++++++ > 1 file changed, 153 insertions(+) > My bot found errors running 'make dt_binding_check' on your patch: yamllint warnings/errors: ./Documentation/devicetree/bindings/input/hid-over-spi.yaml:67:6: [warning] wrong indentation: expected 6 but found 5 (indentation) ./Documentation/devicetree/bindings/input/hid-over-spi.yaml:89:15: [error] empty value in block mapping (empty-values) ./Documentation/devicetree/bindings/input/hid-over-spi.yaml:153:7: [error] no new line character at the end of file (new-line-at-end-of-file) ./Documentation/devicetree/bindings/input/hid-over-spi.yaml:91:16: [error] syntax error: mapping values are not allowed here (syntax) dtschema/dtc warnings/errors: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/input/hid-over-spi.yaml: ignoring, error parsing file ./Documentation/devicetree/bindings/input/hid-over-spi.yaml:91:16: mapping values are not allowed here make[2]: *** Deleting file 'Documentation/devicetree/bindings/input/hid-over-spi.example.dts' Documentation/devicetree/bindings/input/hid-over-spi.yaml:91:16: mapping values are not allowed here make[2]: *** [Documentation/devicetree/bindings/Makefile:26: Documentation/devicetree/bindings/input/hid-over-spi.example.dts] Error 1 make[2]: *** Waiting for unfinished jobs.... make[1]: *** [/builds/robherring/dt-review-ci/linux/Makefile:1559: dt_binding_check] Error 2 make: *** [Makefile:248: __sub-make] Error 2 doc reference errors (make refcheckdocs): See https://patchwork.kernel.org/project/devicetree/patch/20260303-send-upstream-v1-9-1515ba218f3d@chromium.org The base for the series is generally the latest rc1. A different dependency should be noted in *this* patch. 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 after running the above command yourself. Note that DT_SCHEMA_FILES can be set to your schema file to speed up checking your schema. However, it must be unset to test all examples with your schema.
© 2016 - 2026 Red Hat, Inc.