Linux Input/HID development
 help / color / mirror / Atom feed
* [PATCH v6 2/7] mfd: macsmc: Wire up Apple SMC RTC subdevice
From: James Calligeros @ 2025-12-15  9:37 UTC (permalink / raw)
  To: Sven Peter, Janne Grunau, Alyssa Rosenzweig, Neal Gompa,
	Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Alexandre Belloni, Jean Delvare, Guenter Roeck, Dmitry Torokhov,
	Jonathan Corbet, James Calligeros
  Cc: asahi, linux-arm-kernel, devicetree, linux-kernel, linux-rtc,
	linux-hwmon, linux-input, linux-doc
In-Reply-To: <20251215-macsmc-subdevs-v6-0-0518cb5f28ae@gmail.com>

Add the new SMC RTC function to the mfd device

Reviewed-by: Neal Gompa <neal@gompa.dev>
Signed-off-by: James Calligeros <jcalligeros99@gmail.com>
---
 drivers/mfd/macsmc.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/mfd/macsmc.c b/drivers/mfd/macsmc.c
index e3893e255ce5..9099a7a22f1f 100644
--- a/drivers/mfd/macsmc.c
+++ b/drivers/mfd/macsmc.c
@@ -47,6 +47,7 @@
 static const struct mfd_cell apple_smc_devs[] = {
 	MFD_CELL_OF("macsmc-gpio", NULL, NULL, 0, 0, "apple,smc-gpio"),
 	MFD_CELL_OF("macsmc-reboot", NULL, NULL, 0, 0, "apple,smc-reboot"),
+	MFD_CELL_OF("macsmc-rtc", NULL, NULL, 0, 0, "apple,smc-rtc"),
 };
 
 static int apple_smc_cmd_locked(struct apple_smc *smc, u64 cmd, u64 arg,

-- 
2.52.0


^ permalink raw reply related

* [PATCH v6 1/7] dt-bindings: hwmon: Add Apple System Management Controller hwmon schema
From: James Calligeros @ 2025-12-15  9:37 UTC (permalink / raw)
  To: Sven Peter, Janne Grunau, Alyssa Rosenzweig, Neal Gompa,
	Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Alexandre Belloni, Jean Delvare, Guenter Roeck, Dmitry Torokhov,
	Jonathan Corbet, James Calligeros
  Cc: asahi, linux-arm-kernel, devicetree, linux-kernel, linux-rtc,
	linux-hwmon, linux-input, linux-doc
In-Reply-To: <20251215-macsmc-subdevs-v6-0-0518cb5f28ae@gmail.com>

Apple Silicon devices integrate a vast array of sensors, monitoring
current, power, temperature, and voltage across almost every part of
the system. The sensors themselves are all connected to the System
Management Controller (SMC). The SMC firmware exposes the data
reported by these sensors via its standard FourCC-based key-value
API. The SMC is also responsible for monitoring and controlling any
fans connected to the system, exposing them in the same way.

For reasons known only to Apple, each device exposes its sensors with
an almost totally unique set of keys. This is true even for devices
which share an SoC. An M1 Mac mini, for example, will report its core
temperatures on different keys to an M1 MacBook Pro. Worse still, the
SMC does not provide a way to enumerate the available keys at runtime,
nor do the keys follow any sort of reasonable or consistent naming
rules that could be used to deduce their purpose. We must therefore
know which keys are present on any given device, and which function
they serve, ahead of time.

Add a schema so that we can describe the available sensors for a given
Apple Silicon device in the Devicetree.

Reviewed-by: Neal Gompa <neal@gompa.dev>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: James Calligeros <jcalligeros99@gmail.com>
---
 .../bindings/hwmon/apple,smc-hwmon.yaml  | 86 +++++++++++++++++++++++++
 .../bindings/mfd/apple,smc.yaml          | 36 +++++++++++
 MAINTAINERS                              |  1 +
 3 files changed, 123 insertions(+)

diff --git a/Documentation/devicetree/bindings/hwmon/apple,smc-hwmon.yaml b/Documentation/devicetree/bindings/hwmon/apple,smc-hwmon.yaml
new file mode 100644
index 000000000000..2eec317bc4b3
--- /dev/null
+++ b/Documentation/devicetree/bindings/hwmon/apple,smc-hwmon.yaml
@@ -0,0 +1,86 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/hwmon/apple,smc-hwmon.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Apple SMC Hardware Monitoring
+
+description:
+  Apple's System Management Controller (SMC) exposes a vast array of
+  hardware monitoring sensors, including temperature probes, current and
+  voltage sense, power meters, and fan speeds. It also provides endpoints
+  to manually control the speed of each fan individually. Each Apple
+  Silicon device exposes a different set of endpoints via SMC keys. This
+  is true even when two machines share an SoC. The CPU core temperature
+  sensor keys on an M1 Mac mini are different to those on an M1 MacBook
+  Pro, for example.
+
+maintainers:
+  - James Calligeros <jcalligeros99@gmail.com>
+
+$defs:
+  sensor:
+    type: object
+
+    properties:
+      apple,key-id:
+        $ref: /schemas/types.yaml#/definitions/string
+        pattern: "^[A-Za-z0-9]{4}$"
+        description: The SMC FourCC key of the desired sensor.
+          Must match the node's suffix.
+
+      label:
+        description: Human-readable name for the sensor
+
+    required:
+      - apple,key-id
+
+properties:
+  compatible:
+    const: apple,smc-hwmon
+
+patternProperties:
+  "^current-[A-Za-z0-9]{4}$":
+    $ref: "#/$defs/sensor"
+    unevaluatedProperties: false
+
+  "^fan-[A-Za-z0-9]{4}$":
+    $ref: "#/$defs/sensor"
+    unevaluatedProperties: false
+
+    properties:
+      apple,fan-minimum:
+        $ref: /schemas/types.yaml#/definitions/string
+        pattern: "^[A-Za-z0-9]{4}$"
+        description: SMC key containing the fan's minimum speed
+
+      apple,fan-maximum:
+        $ref: /schemas/types.yaml#/definitions/string
+        pattern: "^[A-Za-z0-9]{4}$"
+        description: SMC key containing the fan's maximum speed
+
+      apple,fan-target:
+        $ref: /schemas/types.yaml#/definitions/string
+        pattern: "^[A-Za-z0-9]{4}$"
+        description: Writeable endpoint for setting desired fan speed
+
+      apple,fan-mode:
+        $ref: /schemas/types.yaml#/definitions/string
+        pattern: "^[A-Za-z0-9]{4}$"
+        description: Writeable key to enable/disable manual fan control
+
+
+  "^power-[A-Za-z0-9]{4}$":
+    $ref: "#/$defs/sensor"
+    unevaluatedProperties: false
+
+  "^temperature-[A-Za-z0-9]{4}$":
+    $ref: "#/$defs/sensor"
+    unevaluatedProperties: false
+
+  "^voltage-[A-Za-z0-9]{4}$":
+    $ref: "#/$defs/sensor"
+    unevaluatedProperties: false
+
+additionalProperties: false
diff --git a/Documentation/devicetree/bindings/mfd/apple,smc.yaml b/Documentation/devicetree/bindings/mfd/apple,smc.yaml
index 0410e712c900..34ce048619f5 100644
--- a/Documentation/devicetree/bindings/mfd/apple,smc.yaml
+++ b/Documentation/devicetree/bindings/mfd/apple,smc.yaml
@@ -49,6 +49,9 @@ properties:
   rtc:
     $ref: /schemas/rtc/apple,smc-rtc.yaml
 
+  hwmon:
+    $ref: /schemas/hwmon/apple,smc-hwmon.yaml
+
 additionalProperties: false
 
 required:
@@ -89,5 +92,38 @@ examples:
           nvmem-cells = <&rtc_offset>;
           nvmem-cell-names = "rtc_offset";
        };
+
+        hwmon {
+          compatible = "apple,smc-hwmon";
+
+          current-ID0R {
+            apple,key-id = "ID0R";
+            label = "AC Input Current";
+          };
+
+          fan-F0Ac {
+            apple,key-id = "F0Ac";
+            apple,fan-minimum = "F0Mn";
+            apple,fan-maximum = "F0Mx";
+            apple,fan-target = "F0Tg";
+            apple,fan-mode = "F0Md";
+            label = "Fan 1";
+          };
+
+          power-PSTR {
+            apple,key-id = "PSTR";
+            label = "Total System Power";
+          };
+
+          temperature-TW0P {
+            apple,key-id = "TW0P";
+            label = "WiFi/BT Module Temperature";
+          };
+
+          voltage-VD0R {
+            apple,key-id = "VD0R";
+            label = "AC Input Voltage";
+          };
+        };
       };
     };
diff --git a/MAINTAINERS b/MAINTAINERS
index 5b11839cba9d..5f160eb6762e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2458,6 +2458,7 @@ F:	Documentation/devicetree/bindings/cpufreq/apple,cluster-cpufreq.yaml
 F:	Documentation/devicetree/bindings/dma/apple,admac.yaml
 F:	Documentation/devicetree/bindings/gpio/apple,smc-gpio.yaml
 F:	Documentation/devicetree/bindings/gpu/apple,agx.yaml
+F:	Documentation/devicetree/bindings/hwmon/apple,smc-hwmon.yaml
 F:	Documentation/devicetree/bindings/i2c/apple,i2c.yaml
 F:	Documentation/devicetree/bindings/input/touchscreen/apple,z2-multitouch.yaml
 F:	Documentation/devicetree/bindings/interrupt-controller/apple,*

-- 
2.52.0


^ permalink raw reply related

* [PATCH v6 0/7] mfd: macsmc: add rtc, hwmon and hid subdevices
From: James Calligeros @ 2025-12-15  9:37 UTC (permalink / raw)
  To: Sven Peter, Janne Grunau, Alyssa Rosenzweig, Neal Gompa,
	Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Alexandre Belloni, Jean Delvare, Guenter Roeck, Dmitry Torokhov,
	Jonathan Corbet, James Calligeros
  Cc: asahi, linux-arm-kernel, devicetree, linux-kernel, linux-rtc,
	linux-hwmon, linux-input, linux-doc, Hector Martin

Hi all,

This series adds support for the remaining SMC subdevices. These are the
RTC, hwmon, and HID devices. They are being submitted together as the RTC
and hwmon drivers both require changes to the SMC DT schema.

The RTC driver is responsible for getting and setting the system clock,
and requires an NVMEM cell. This series replaces Sven's original RTC driver
submission [1].

The hwmon function is an interesting one. While each Apple Silicon device
exposes pretty similar sets of sensors, these all seem to be paired to
different SMC keys in the firmware interface. This is true even when the
sensors are on the SoC. For example, an M1 MacBook Pro will use different
keys to access the LITTLE core temperature sensors to an M1 Mac mini. This
necessitates describing which keys correspond to which sensors for each
device individually, and populating the hwmon structs at runtime. We do
this with a node in the device tree. This series includes only the keys
for sensors which we know to be common to all devices. The SMC is also
responsible for monitoring and controlling fan speeds on systems with fans,
which we expose via the hwmon driver.

The SMC also handles the hardware power button and lid switch. Power
button presses and lid opening/closing are emitted as HID events, so we
add an input subdevice to handle them.

Since there are no real dependencies between the components of this series,
it should be fine for each subsystem to take the relevant patches through
their trees. The mfd one-liners should be taken in order to avoid trivial
conflicts.

Regards,

James

[1] https://lore.kernel.org/asahi/CAEg-Je84XxLWH7vznQmPRfjf6GxWOu75ZetwN7AdseAwfMLLrQ@mail.gmail.com/T/#t
[2] https://lore.kernel.org/asahi/20251106140050.GQ8064@google.com/

---
Changes in v6:
- Rebase onto 6.19-rc1, dropping already merged commits
- Link to v5: https://lore.kernel.org/r/20251112-macsmc-subdevs-v5-0-728e4b91fe81@gmail.com

Changes in v5:
- Drop inadvertent mfd core includes in rtc and input drivers
- Link to v4: https://lore.kernel.org/r/20251025-macsmc-subdevs-v4-0-374d5c9eba0e@gmail.com

Changes in v4:
- Added Rob's R-b to hwmon Devicetree schema
- Added missing include to hwmon driver
- Dropped superfluous dev_info() from hwmon probe
- Added Guenter's A-b to hwmon driver
- Renamed INPUT_MACSMC_INPUT to INPUT_MACSMC
- Dropped leftover mention of HID in input driver
- Reinstated input driver MODULE_ALIAS
- Trigger a hard wakeup on power button/lid switch when coming out of
  s2idle
- Suppress KEY_POWER event on wakeup to prevent an immediate shutdown
  when waking up
- Squashed hwmon Devicetree commits into one
- Link to v3: https://lore.kernel.org/r/20251007-macsmc-subdevs-v3-0-d7d3bfd7ae02@gmail.com

Changes in v3:
- Renamed macsmc-hid to macsmc-input
- Switched to pm_wakeup_event in macsmc-input
- macsmc-input now configures its capabilities before registering the device
- Renamed macsmc_hwmon to macsmc-hwmon
- Dropped module aliases in macsmc-input and macsmc_hwmon
- Introduced new SMC FourCC macro to silence GCC errors
- Condensed hwmon binding using $defs
- Made label property optional for hwmon sensors
- Fixed incorrect hwmon is_visible implementation
- Dropped 64-bit math from SMC float ops
- Fixed incorrect use of error numbers in hwmon driver
- Replaced a number of non-fatal dev_errs with dev_dbgs in hwmon driver
- Added hwmon driver documentation
- Added hwmon subdevice directly to the DT SMC node
- Included "common" hwmon sensors in SoC .dtsi files
- Fixed typo in hwmon-common.dtsi
- Added Neal's R-b to series
- Added required nodes to t602x Devicetrees
- Link to v2: https://lore.kernel.org/r/20250827-macsmc-subdevs-v2-0-ce5e99d54c28@gmail.com

Changes in v2:
- Added Rob's R-b tag to RTC DT binding
- Removed redundant nesting from hwmon DT binding
- Dedpulicated property definitions in hwmon DT schema
- Made label a required property for hwmon DT nodes
- Clarified semantics in hwmon DT schema definitions
- Split mfd tree changes into separate commits
- Fixed numerous style errors in hwmon driver
- Removed log messages sysfs read/write functions in hwmon driver
- Removed ignored errors from hwmon driver
- Removed uses of dev_err for non-errors in hwmon driver
- Made it more obvious that a number of hwmon fan properties are optional
- Modified hwmon driver to reflect DT schema changes
- Added compatible property to hwmon node
- Link to v1: https://lore.kernel.org/r/20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com

---
Hector Martin (1):
      input: macsmc-input: New driver to handle the Apple Mac SMC buttons/lid

James Calligeros (5):
      dt-bindings: hwmon: Add Apple System Management Controller hwmon schema
      mfd: macsmc: Wire up Apple SMC RTC subdevice
      mfd: macsmc: Wire up Apple SMC hwmon subdevice
      mfd: macsmc: Wire up Apple SMC input subdevice
      arm64: dts: apple: t8103, t8112, t60xx: Add hwmon SMC subdevice

Sven Peter (1):
      arm64: dts: apple: t8103,t60xx,t8112: Add SMC RTC node

 .../bindings/hwmon/apple,smc-hwmon.yaml  |  86 ++++++++++
 .../bindings/mfd/apple,smc.yaml          |  36 +++++
 MAINTAINERS                              |   2 +
 .../boot/dts/apple/hwmon-common.dtsi     |  33 ++++
 .../boot/dts/apple/hwmon-fan-dual.dtsi   |  22 +++
 arch/arm64/boot/dts/apple/hwmon-fan.dtsi |  17 ++
 .../boot/dts/apple/hwmon-laptop.dtsi     |  33 ++++
 .../boot/dts/apple/hwmon-mac-mini.dtsi   |  15 ++
 .../arm64/boot/dts/apple/t6001-j375c.dts |   2 +
 arch/arm64/boot/dts/apple/t6001.dtsi     |   2 +
 .../arm64/boot/dts/apple/t6002-j375d.dts |   2 +
 .../arm64/boot/dts/apple/t600x-die0.dtsi |  10 ++
 .../boot/dts/apple/t600x-j314-j316.dtsi  |   3 +
 .../arm64/boot/dts/apple/t602x-die0.dtsi |  10 ++
 arch/arm64/boot/dts/apple/t8103-j274.dts |   2 +
 arch/arm64/boot/dts/apple/t8103-j293.dts |   3 +
 arch/arm64/boot/dts/apple/t8103-j313.dts |   2 +
 arch/arm64/boot/dts/apple/t8103-j456.dts |   2 +
 arch/arm64/boot/dts/apple/t8103-j457.dts |   2 +
 arch/arm64/boot/dts/apple/t8103.dtsi     |  11 ++
 arch/arm64/boot/dts/apple/t8112-j413.dts |   2 +
 arch/arm64/boot/dts/apple/t8112-j473.dts |   2 +
 arch/arm64/boot/dts/apple/t8112-j493.dts |   3 +
 arch/arm64/boot/dts/apple/t8112.dtsi     |  11 ++
 drivers/input/misc/Kconfig               |  11 ++
 drivers/input/misc/Makefile              |   1 +
 drivers/input/misc/macsmc-input.c        | 207 +++++++++++++++++++++++++
 drivers/mfd/macsmc.c                     |   3 +
 28 files changed, 535 insertions(+)
---
base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
change-id: 20250816-macsmc-subdevs-87032c017d0c

Best regards,
-- 
James Calligeros <jcalligeros99@gmail.com>


^ permalink raw reply

* Re: [PATCH v1] Input: pf1550 - Remove "defined but unused" warning
From: Geert Uytterhoeven @ 2025-12-15  9:21 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Vaibhav Gupta, Samuel Kayode, imx, linux-input, linux-kernel
In-Reply-To: <wfdhjzhkggp26mwqgvxuanuzjq6v2g4pmc44jz6kx4xwkewwhr@movikefnuvcz>

Hi Dmitry,

On Sat, 13 Dec 2025 at 10:39, Dmitry Torokhov <dmitry.torokhov@gmail.com> wrote:
> On Wed, Dec 10, 2025 at 09:11:41PM +0000, Vaibhav Gupta wrote:
> > If 'CONFIG_PM_SLEEP' is not set, compiler throws warning for *suspend() and
> > *resume() function for this driver. Using new 'DEFINE_SIMPLE_DEV_PM_OPS'
> > fixes it.
> >
> > Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>
>
> Applied, thank you.

FTR, Samual submitted a similar patch 6 weeks before, which did take
into account alignment of the continuation:
https://lore.kernel.org/all/20251028-pf1550-v1-1-c50fae56b9b1@gmail.com

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply

* usb hid descriptor requirements are rejecting hardware (ZWO EFWmini, 03c3:1f01)
From: Salvatore Bonaccorso @ 2025-12-14 15:09 UTC (permalink / raw)
  To: Sam Halliday, 1122193, Jiri Kosina, Benjamin Tissoires
  Cc: linux-usb, linux-input, linux-kernel
In-Reply-To: <176520622961.2658.15817888352918425136.reportbug@Samwise>

Hi Sam,

Jiri, Benjamin, this is about a report originally done in Debian as
https://bugs.debian.org/1122193 where Sam's device, a ZWO EFWmini with
vendor and product id's as 03c3:1f01 is not working, usbhid not
loaded.

On Mon, Dec 08, 2025 at 03:03:49PM +0000, Sam Halliday wrote:
> Package: linux-image-amd64
> Version: 6.12.57-1
> Severity: normal
> Tags: patch
> X-Debbugs-Cc: debian-amd64@lists.debian.org
> User: debian-amd64@lists.debian.org
> Usertags: amd64
> 
> Dear Maintainer,
> 
> I propose a patch to workaround USB HID descriptor requirements that
> are stopping users from being able to use astrophotography
> equipment.
> 
> I have a usb device (an ZWO EFWmini, used for astronomy) which has
> the following vendor information: 03c3:1f01 ZWO ZWO EFW
> 
> This device is known to offer a suboptimal descriptor, e.g. see the lsusb output
> 
>       Warning: Descriptor too short
>         HID Device Descriptor:
>           bLength                 9
>           bDescriptorType        33
>           bcdHID               1.01
>           bCountryCode            0 Not supported
>           bNumDescriptors         2
>           bDescriptorType        34 (null)
>           wDescriptorLength      68
>           bDescriptorType         0 (null)
>           wDescriptorLength       0
>           Report Descriptors: 
>             ** UNAVAILABLE **
> 
> My software (I write it, it is GPLv3, I'm the only user, but it isn't particularly relevant...) runs primarilly on a raspberry pi, which accepts this with kernel 6.12.25-1+rpt1, and I've also done some desktop development on archlinux (unknown kernel versions but up to at least 6 months ago). I only access the hardware for development from a debian desktop computer.
> 
> Since moving to Debian 13, my hardware no longer works, with dmesg showing the following error:
> 
> [   14.182522] usb 1-2.2: new full-speed USB device number 10 using xhci_hcd
> [   14.276921] usb 1-2.2: New USB device found, idVendor=03c3, idProduct=1f01, bcdDevice= 0.00
> [   14.276930] usb 1-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> [   14.276933] usb 1-2.2: Product: ZWO EFW
> [   14.276935] usb 1-2.2: Manufacturer: ZW0
> [   14.282951] usbhid 1-2.2:1.0: can't add hid device: -22
> [   14.282963] usbhid 1-2.2:1.0: probe with driver usbhid failed with error -22
> 
> I have tried going back as far as debian's kernel from bullseye (5.10), bookworm (6.1), trixie (6.12) and backports (6.17) but it's the same error every time.
> 
> Communicating with the ZWO (the device manufacturer) support team, they recommended patching the kernel, which I did, and it now works.
> 
> I applied the following patch and built my own kernel
> 
> ===========================================================================
> --- drivers/hid/usbhid/hid-core.c.orig	2025-12-08 13:15:08.657917762 +0000
> +++ drivers/hid/usbhid/hid-core.c	2025-12-08 13:16:24.293959487 +0000
> @@ -1015,7 +1015,7 @@
>  			      (hdesc->bNumDescriptors - 1) * sizeof(*hcdesc)) {
>  		dbg_hid("hid descriptor invalid, bLen=%hhu bNum=%hhu\n",
>  			hdesc->bLength, hdesc->bNumDescriptors);
> -		return -EINVAL;
> +		// return -EINVAL;
>  	}
>  
>  	hid->version = le16_to_cpu(hdesc->bcdHID);
> ===========================================================================
> 
> The new dmesg output is
> 
> [  366.477628] usbhid 1-2:1.0: 1 unsupported optional hid class descriptors
> [  366.478327] hid-generic 0003:03C3:1F01.0006: hiddev1,hidraw4: USB HID v1.01 Device [ZW0 ZWO EFW] on usb-000
> 
> 
> Apologies but I don't think I'm giving you a particularly good patch
> because the author of this code clearly intended for a -EINVAL
> failure. A kernel dev may prefer to create a hardware quirk (which
> ideally should be enabled for 03c3:1f01 by default) to exit if the
> descriptor isn't valid. I'm not a kernel developer so that's beyond
> me.
> 
> The device works perfectly fine despite the descriptor not meeting
> the kernel's current requirements. And I don't believe a firmware
> upgrade is possible... it's just a little motor that turns a wheel
> containing photographic filters.

I suspect your case can be a candidate for HID-BPF, cf.
https://docs.kernel.org/hid/hid-bpf.html and you might try to fixup
the required descriptors.

But I'm not entirely sure. Jiri and Benjamin is that something we
could have quirk for the device or the problem tackled in some other
way?

Regards,
Salvatore

^ permalink raw reply

* [PATCH] HID: multitouch: add MT_QUIRK_STICKY_FINGERS to MT_CLS_VTL
From: DaytonCL @ 2025-12-14 13:34 UTC (permalink / raw)
  To: benjamin.tissoires; +Cc: jikos, linux-input, linux-kernel
In-Reply-To: <20251214133648.307106-1-artem749507@gmail.com>

Some VTL-class touchpads (e.g. TOPS0102:00 35CC:0104) intermittently
fail to release a finger contact. A previous slot remains logically
active, accompanied by stale BTN_TOOL_DOUBLETAP state, causing
gestures to stay latched and resulting in stuck two-finger
scrolling and false right-clicks.

Apply MT_QUIRK_STICKY_FINGERS to handle the unreleased contact correctly.

Link: https://gitlab.freedesktop.org/libinput/libinput/-/issues/1225
Suggested-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Tested-by: DaytonCL <artem749507@gmail.com>
Signed-off-by: DaytonCL <artem749507@gmail.com>
---
 drivers/hid/hid-multitouch.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 179dc316b..a0c1ad5ac 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -393,6 +393,7 @@ static const struct mt_class mt_classes[] = {
 	{ .name = MT_CLS_VTL,
 		.quirks = MT_QUIRK_ALWAYS_VALID |
 			MT_QUIRK_CONTACT_CNT_ACCURATE |
+			MT_QUIRK_STICKY_FINGERS |
 			MT_QUIRK_FORCE_GET_FEATURE,
 	},
 	{ .name = MT_CLS_GOOGLE,
-- 
2.52.0


^ permalink raw reply related

* [PATCH] HID: multitouch: add MT_QUIRK_STICKY_FINGERS to MT_CLS_VTL
From: DaytonCL @ 2025-12-14 13:34 UTC (permalink / raw)
  To: benjamin.tissoires; +Cc: jikos, linux-input, linux-kernel

Hi Benjamin,

Thank you very much for your help on the libinput GitLab issue tracker [1].
Your suggestion to apply MT_QUIRK_STICKY_FINGERS to the VTL class was exactly
what was needed.

This patch fixes the intermittent stuck two-finger scrolling and false
right-clicks that occur on some VTL-class touchpads, specifically my
TOPS0102:00 35CC:0104 device.
The fix has been tested thoroughly on my laptop and works perfectly.
[1] https://gitlab.freedesktop.org/libinput/libinput/-/issues/1225
Best regards,
Artem


^ permalink raw reply

* Re: [PATCH] input: sound: Fix comment typos in apbps2 and codecs
From: Mark Brown @ 2025-12-14 10:38 UTC (permalink / raw)
  To: harindhu007
  Cc: dmitry.torokhov, support.opensource, lgirdwood, perex, tiwai,
	linux-input, linux-sound, linux-kernel
In-Reply-To: <20251214102008.10582-1-harikrs0905@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 512 bytes --]

On Sun, Dec 14, 2025 at 03:20:08AM -0700, harindhu007 wrote:
> Fix spelling mistakes and minor wording in comments in apbps2, da732x, and spdif_receiver drivers.
> 
> Signed-off-by: harindhu007 <harikrs0905@gmail.com>
> ---
>  drivers/input/serio/apbps2.c      | 2 +-
>  sound/soc/codecs/da732x.c         | 2 +-
>  sound/soc/codecs/spdif_receiver.c | 2 +-

Please don't send patches to multiple subsystems in a single patch
unless there is a strong reason to, send one (or more) patch per
subsystem.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply

* [PATCH] input: sound: Fix comment typos in apbps2 and codecs
From: harindhu007 @ 2025-12-14 10:20 UTC (permalink / raw)
  To: dmitry.torokhov, support.opensource, lgirdwood, broonie, perex,
	tiwai
  Cc: linux-input, linux-sound, linux-kernel, harikrs0905

Fix spelling mistakes and minor wording in comments in apbps2, da732x, and spdif_receiver drivers.

Signed-off-by: harindhu007 <harikrs0905@gmail.com>
---
 drivers/input/serio/apbps2.c      | 2 +-
 sound/soc/codecs/da732x.c         | 2 +-
 sound/soc/codecs/spdif_receiver.c | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/input/serio/apbps2.c b/drivers/input/serio/apbps2.c
index b815337be2f4..6bb65f93e052 100644
--- a/drivers/input/serio/apbps2.c
+++ b/drivers/input/serio/apbps2.c
@@ -112,7 +112,7 @@ static int apbps2_open(struct serio *io)
 	while ((ioread32be(&priv->regs->status) & APBPS2_STATUS_DR) && --limit)
 		ioread32be(&priv->regs->data);
 
-	/* Enable reciever and it's interrupt */
+	/* Enable receiver and it's interrupt */
 	iowrite32be(APBPS2_CTRL_RE | APBPS2_CTRL_RI, &priv->regs->ctrl);
 
 	return 0;
diff --git a/sound/soc/codecs/da732x.c b/sound/soc/codecs/da732x.c
index 140e449d3ef4..e8b3ba878d78 100644
--- a/sound/soc/codecs/da732x.c
+++ b/sound/soc/codecs/da732x.c
@@ -569,7 +569,7 @@ static const struct snd_kcontrol_new da732x_snd_controls[] = {
 		       DA732X_EQ_BAND5_SHIFT, DA732X_EQ_VOL_VAL_MAX,
 		       DA732X_INVERT, eq_band_pga_tlv),
 
-	/* Lineout 2 Reciever*/
+	/* Lineout 2 Receiver*/
 	SOC_SINGLE("Lineout 2 Switch", DA732X_REG_LIN2, DA732X_LOUT_MUTE_SHIFT,
 		   DA732X_SWITCH_MAX, DA732X_INVERT),
 	SOC_SINGLE_TLV("Lineout 2 Volume", DA732X_REG_LIN2,
diff --git a/sound/soc/codecs/spdif_receiver.c b/sound/soc/codecs/spdif_receiver.c
index c9766979b1d7..7b4748fc488e 100644
--- a/sound/soc/codecs/spdif_receiver.c
+++ b/sound/soc/codecs/spdif_receiver.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * ALSA SoC SPDIF DIR (Digital Interface Reciever) driver
+ * ALSA SoC SPDIF DIR (Digital Interface Receiver) driver
  *
  * Based on ALSA SoC SPDIF DIT driver
  *
-- 
2.43.0


^ permalink raw reply related

* [dtor-input:next] BUILD SUCCESS 686c64557be48d28f532b26a90db600092c82418
From: kernel test robot @ 2025-12-14  6:27 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input

tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
branch HEAD: 686c64557be48d28f532b26a90db600092c82418  MAINTAINERS: adjust file entry in HIMAX HX83112B TOUCHSCREEN SUPPORT

elapsed time: 1212m

configs tested: 298
configs skipped: 2

The following configs have been built successfully.
More configs may be tested in the coming days.

tested configs:
alpha                             allnoconfig    gcc-15.1.0
alpha                            allyesconfig    gcc-15.1.0
alpha                               defconfig    gcc-15.1.0
arc                              allmodconfig    clang-16
arc                              allmodconfig    gcc-15.1.0
arc                               allnoconfig    gcc-15.1.0
arc                              allyesconfig    clang-22
arc                              allyesconfig    gcc-15.1.0
arc                      axs103_smp_defconfig    gcc-15.1.0
arc                                 defconfig    gcc-15.1.0
arc                   randconfig-001-20251213    gcc-15.1.0
arc                   randconfig-001-20251214    gcc-10.5.0
arc                   randconfig-002-20251213    gcc-15.1.0
arc                   randconfig-002-20251214    gcc-10.5.0
arm                               allnoconfig    clang-22
arm                               allnoconfig    gcc-15.1.0
arm                              allyesconfig    clang-16
arm                              allyesconfig    gcc-15.1.0
arm                                 defconfig    gcc-15.1.0
arm                       imx_v4_v5_defconfig    gcc-15.1.0
arm                   milbeaut_m10v_defconfig    gcc-15.1.0
arm                   randconfig-001-20251213    clang-20
arm                   randconfig-001-20251214    gcc-10.5.0
arm                   randconfig-002-20251213    gcc-8.5.0
arm                   randconfig-002-20251214    gcc-10.5.0
arm                   randconfig-003-20251213    clang-22
arm                   randconfig-003-20251214    gcc-10.5.0
arm                   randconfig-004-20251213    clang-22
arm                   randconfig-004-20251214    gcc-10.5.0
arm                           stm32_defconfig    gcc-15.1.0
arm64                            allmodconfig    clang-19
arm64                            allmodconfig    clang-22
arm64                             allnoconfig    gcc-15.1.0
arm64                               defconfig    gcc-15.1.0
arm64                 randconfig-001-20251213    clang-22
arm64                 randconfig-001-20251214    gcc-8.5.0
arm64                 randconfig-002-20251213    clang-22
arm64                 randconfig-002-20251214    gcc-8.5.0
arm64                 randconfig-003-20251213    clang-22
arm64                 randconfig-003-20251214    gcc-8.5.0
arm64                 randconfig-004-20251213    clang-20
arm64                 randconfig-004-20251214    gcc-8.5.0
csky                             allmodconfig    gcc-15.1.0
csky                              allnoconfig    gcc-15.1.0
csky                                defconfig    gcc-15.1.0
csky                  randconfig-001-20251213    gcc-15.1.0
csky                  randconfig-001-20251214    gcc-8.5.0
csky                  randconfig-002-20251213    gcc-11.5.0
csky                  randconfig-002-20251214    gcc-8.5.0
hexagon                          allmodconfig    clang-17
hexagon                          allmodconfig    gcc-15.1.0
hexagon                           allnoconfig    clang-22
hexagon                           allnoconfig    gcc-15.1.0
hexagon                             defconfig    gcc-15.1.0
hexagon               randconfig-001-20251213    clang-22
hexagon               randconfig-001-20251214    gcc-11.5.0
hexagon               randconfig-002-20251213    clang-20
hexagon               randconfig-002-20251214    gcc-11.5.0
i386                             allmodconfig    clang-20
i386                             allmodconfig    gcc-14
i386                              allnoconfig    gcc-14
i386                              allnoconfig    gcc-15.1.0
i386                             allyesconfig    clang-20
i386                             allyesconfig    gcc-14
i386        buildonly-randconfig-001-20251213    clang-20
i386        buildonly-randconfig-001-20251214    clang-20
i386        buildonly-randconfig-002-20251213    gcc-14
i386        buildonly-randconfig-002-20251214    clang-20
i386        buildonly-randconfig-003-20251213    gcc-14
i386        buildonly-randconfig-003-20251214    clang-20
i386        buildonly-randconfig-004-20251213    clang-20
i386        buildonly-randconfig-004-20251214    clang-20
i386        buildonly-randconfig-005-20251213    clang-20
i386        buildonly-randconfig-005-20251214    clang-20
i386        buildonly-randconfig-006-20251213    gcc-14
i386        buildonly-randconfig-006-20251214    clang-20
i386                                defconfig    gcc-15.1.0
i386                  randconfig-001-20251213    clang-20
i386                  randconfig-001-20251214    clang-20
i386                  randconfig-002-20251213    gcc-14
i386                  randconfig-002-20251214    clang-20
i386                  randconfig-003-20251213    gcc-13
i386                  randconfig-003-20251214    clang-20
i386                  randconfig-004-20251213    clang-20
i386                  randconfig-004-20251214    clang-20
i386                  randconfig-005-20251213    clang-20
i386                  randconfig-005-20251214    clang-20
i386                  randconfig-006-20251213    gcc-14
i386                  randconfig-006-20251214    clang-20
i386                  randconfig-007-20251213    gcc-14
i386                  randconfig-007-20251214    clang-20
i386                  randconfig-011-20251213    gcc-14
i386                  randconfig-011-20251214    clang-20
i386                  randconfig-012-20251213    gcc-14
i386                  randconfig-012-20251214    clang-20
i386                  randconfig-013-20251213    clang-20
i386                  randconfig-013-20251214    clang-20
i386                  randconfig-014-20251213    gcc-14
i386                  randconfig-014-20251214    clang-20
i386                  randconfig-015-20251213    gcc-14
i386                  randconfig-015-20251214    clang-20
i386                  randconfig-016-20251213    gcc-14
i386                  randconfig-016-20251214    clang-20
i386                  randconfig-017-20251213    clang-20
i386                  randconfig-017-20251214    clang-20
loongarch                        alldefconfig    gcc-15.1.0
loongarch                        allmodconfig    clang-19
loongarch                        allmodconfig    clang-22
loongarch                         allnoconfig    clang-22
loongarch                         allnoconfig    gcc-15.1.0
loongarch                           defconfig    clang-19
loongarch             randconfig-001-20251213    clang-20
loongarch             randconfig-001-20251214    gcc-11.5.0
loongarch             randconfig-002-20251213    clang-20
loongarch             randconfig-002-20251214    gcc-11.5.0
m68k                             allmodconfig    gcc-15.1.0
m68k                              allnoconfig    gcc-15.1.0
m68k                             allyesconfig    clang-16
m68k                             allyesconfig    gcc-15.1.0
m68k                                defconfig    clang-19
m68k                                defconfig    gcc-15.1.0
m68k                           virt_defconfig    gcc-15.1.0
microblaze                        allnoconfig    gcc-15.1.0
microblaze                       allyesconfig    gcc-15.1.0
microblaze                          defconfig    clang-19
microblaze                          defconfig    gcc-15.1.0
mips                             allmodconfig    gcc-15.1.0
mips                              allnoconfig    gcc-15.1.0
mips                             allyesconfig    gcc-15.1.0
mips                          ath25_defconfig    clang-22
mips                        bcm47xx_defconfig    gcc-15.1.0
nios2                            allmodconfig    clang-22
nios2                            allmodconfig    gcc-11.5.0
nios2                             allnoconfig    clang-22
nios2                             allnoconfig    gcc-11.5.0
nios2                               defconfig    clang-19
nios2                               defconfig    gcc-11.5.0
nios2                 randconfig-001-20251213    gcc-9.5.0
nios2                 randconfig-001-20251214    gcc-11.5.0
nios2                 randconfig-002-20251213    gcc-11.5.0
nios2                 randconfig-002-20251214    gcc-11.5.0
openrisc                         allmodconfig    clang-22
openrisc                         allmodconfig    gcc-15.1.0
openrisc                          allnoconfig    clang-22
openrisc                          allnoconfig    gcc-15.1.0
openrisc                            defconfig    gcc-15.1.0
openrisc                 simple_smp_defconfig    gcc-15.1.0
parisc                           allmodconfig    gcc-15.1.0
parisc                            allnoconfig    clang-22
parisc                            allnoconfig    gcc-15.1.0
parisc                           allyesconfig    clang-19
parisc                           allyesconfig    gcc-15.1.0
parisc                              defconfig    gcc-15.1.0
parisc                generic-32bit_defconfig    gcc-15.1.0
parisc                randconfig-001-20251213    gcc-8.5.0
parisc                randconfig-001-20251214    gcc-9.5.0
parisc                randconfig-002-20251213    gcc-8.5.0
parisc                randconfig-002-20251214    gcc-9.5.0
parisc64                            defconfig    clang-19
parisc64                            defconfig    gcc-15.1.0
powerpc                          allmodconfig    gcc-15.1.0
powerpc                           allnoconfig    clang-22
powerpc                           allnoconfig    gcc-15.1.0
powerpc                      chrp32_defconfig    gcc-15.1.0
powerpc                       ebony_defconfig    gcc-15.1.0
powerpc                          g5_defconfig    gcc-15.1.0
powerpc                     mpc512x_defconfig    gcc-15.1.0
powerpc                      ppc6xx_defconfig    gcc-15.1.0
powerpc               randconfig-001-20251213    clang-18
powerpc               randconfig-001-20251214    gcc-9.5.0
powerpc               randconfig-002-20251213    clang-22
powerpc               randconfig-002-20251214    gcc-9.5.0
powerpc                     taishan_defconfig    clang-17
powerpc                     tqm8540_defconfig    gcc-15.1.0
powerpc64             randconfig-001-20251213    clang-16
powerpc64             randconfig-001-20251214    gcc-9.5.0
powerpc64             randconfig-002-20251213    clang-16
powerpc64             randconfig-002-20251214    gcc-9.5.0
riscv                            alldefconfig    gcc-15.1.0
riscv                            allmodconfig    clang-22
riscv                             allnoconfig    clang-22
riscv                             allnoconfig    gcc-15.1.0
riscv                            allyesconfig    clang-16
riscv                               defconfig    clang-22
riscv                               defconfig    gcc-15.1.0
riscv             nommu_k210_sdcard_defconfig    gcc-15.1.0
riscv                 randconfig-001-20251213    clang-16
riscv                 randconfig-001-20251214    gcc-8.5.0
riscv                 randconfig-002-20251213    clang-22
riscv                 randconfig-002-20251214    gcc-8.5.0
s390                             allmodconfig    clang-18
s390                             allmodconfig    clang-19
s390                              allnoconfig    clang-22
s390                             allyesconfig    gcc-15.1.0
s390                                defconfig    clang-22
s390                                defconfig    gcc-15.1.0
s390                  randconfig-001-20251213    gcc-13.4.0
s390                  randconfig-001-20251214    gcc-8.5.0
s390                  randconfig-002-20251213    clang-17
s390                  randconfig-002-20251214    gcc-8.5.0
s390                       zfcpdump_defconfig    gcc-15.1.0
sh                               allmodconfig    gcc-15.1.0
sh                                allnoconfig    clang-22
sh                                allnoconfig    gcc-15.1.0
sh                               allyesconfig    clang-19
sh                               allyesconfig    gcc-15.1.0
sh                                  defconfig    gcc-14
sh                    randconfig-001-20251213    gcc-15.1.0
sh                    randconfig-001-20251214    gcc-8.5.0
sh                    randconfig-002-20251213    gcc-10.5.0
sh                    randconfig-002-20251214    gcc-8.5.0
sh                   secureedge5410_defconfig    gcc-15.1.0
sh                        sh7757lcr_defconfig    gcc-15.1.0
sh                            shmin_defconfig    gcc-15.1.0
sh                            titan_defconfig    gcc-15.1.0
sparc                            alldefconfig    gcc-15.1.0
sparc                             allnoconfig    clang-22
sparc                             allnoconfig    gcc-15.1.0
sparc                               defconfig    gcc-15.1.0
sparc                 randconfig-001-20251213    gcc-14.3.0
sparc                 randconfig-001-20251214    gcc-15.1.0
sparc                 randconfig-002-20251213    gcc-8.5.0
sparc                 randconfig-002-20251214    gcc-15.1.0
sparc                       sparc32_defconfig    gcc-15.1.0
sparc64                          allmodconfig    clang-22
sparc64                             defconfig    gcc-14
sparc64               randconfig-001-20251213    gcc-15.1.0
sparc64               randconfig-001-20251214    gcc-15.1.0
sparc64               randconfig-002-20251213    gcc-14.3.0
sparc64               randconfig-002-20251214    gcc-15.1.0
um                               allmodconfig    clang-19
um                                allnoconfig    clang-22
um                               allyesconfig    gcc-14
um                               allyesconfig    gcc-15.1.0
um                                  defconfig    gcc-14
um                             i386_defconfig    gcc-14
um                    randconfig-001-20251213    clang-22
um                    randconfig-001-20251214    gcc-15.1.0
um                    randconfig-002-20251213    gcc-14
um                    randconfig-002-20251214    gcc-15.1.0
um                           x86_64_defconfig    gcc-14
x86_64                           allmodconfig    clang-20
x86_64                            allnoconfig    clang-20
x86_64                            allnoconfig    clang-22
x86_64                           allyesconfig    clang-20
x86_64      buildonly-randconfig-001-20251213    clang-20
x86_64      buildonly-randconfig-001-20251214    gcc-12
x86_64      buildonly-randconfig-002-20251213    clang-20
x86_64      buildonly-randconfig-002-20251214    gcc-12
x86_64      buildonly-randconfig-003-20251213    clang-20
x86_64      buildonly-randconfig-003-20251214    gcc-12
x86_64      buildonly-randconfig-004-20251213    clang-20
x86_64      buildonly-randconfig-004-20251214    gcc-12
x86_64      buildonly-randconfig-005-20251213    gcc-14
x86_64      buildonly-randconfig-005-20251214    gcc-12
x86_64      buildonly-randconfig-006-20251213    clang-20
x86_64      buildonly-randconfig-006-20251214    gcc-12
x86_64                              defconfig    gcc-14
x86_64                                  kexec    clang-20
x86_64                randconfig-001-20251213    gcc-14
x86_64                randconfig-002-20251213    gcc-14
x86_64                randconfig-003-20251213    gcc-14
x86_64                randconfig-004-20251213    clang-20
x86_64                randconfig-005-20251213    gcc-14
x86_64                randconfig-006-20251213    clang-20
x86_64                randconfig-011-20251214    clang-20
x86_64                randconfig-012-20251214    clang-20
x86_64                randconfig-013-20251214    clang-20
x86_64                randconfig-014-20251214    clang-20
x86_64                randconfig-015-20251214    clang-20
x86_64                randconfig-016-20251214    clang-20
x86_64                randconfig-071-20251213    clang-20
x86_64                randconfig-071-20251214    clang-20
x86_64                randconfig-072-20251213    clang-20
x86_64                randconfig-072-20251214    clang-20
x86_64                randconfig-073-20251213    clang-20
x86_64                randconfig-073-20251214    clang-20
x86_64                randconfig-074-20251213    gcc-13
x86_64                randconfig-074-20251214    clang-20
x86_64                randconfig-075-20251213    clang-20
x86_64                randconfig-075-20251214    clang-20
x86_64                randconfig-076-20251213    gcc-14
x86_64                randconfig-076-20251214    clang-20
x86_64                               rhel-9.4    clang-20
x86_64                           rhel-9.4-bpf    gcc-14
x86_64                          rhel-9.4-func    clang-20
x86_64                    rhel-9.4-kselftests    clang-20
x86_64                         rhel-9.4-kunit    gcc-14
x86_64                           rhel-9.4-ltp    gcc-14
x86_64                          rhel-9.4-rust    clang-20
xtensa                            allnoconfig    clang-22
xtensa                            allnoconfig    gcc-15.1.0
xtensa                           allyesconfig    clang-22
xtensa                           allyesconfig    gcc-15.1.0
xtensa                randconfig-001-20251213    gcc-15.1.0
xtensa                randconfig-001-20251214    gcc-15.1.0
xtensa                randconfig-002-20251213    gcc-8.5.0
xtensa                randconfig-002-20251214    gcc-15.1.0

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply

* [dtor-input:for-linus] BUILD SUCCESS e58c88f0cb2d8ed89de78f6f17409d29cfab6c5c
From: kernel test robot @ 2025-12-13  9:51 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input

tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git for-linus
branch HEAD: e58c88f0cb2d8ed89de78f6f17409d29cfab6c5c  Input: lkkbd - disable pending work before freeing device

elapsed time: 1453m

configs tested: 139
configs skipped: 1

The following configs have been built successfully.
More configs may be tested in the coming days.

tested configs:
alpha                            allyesconfig    gcc-15.1.0
alpha                               defconfig    gcc-15.1.0
arc                              allmodconfig    gcc-15.1.0
arc                                 defconfig    gcc-15.1.0
arc                   randconfig-001-20251213    gcc-15.1.0
arc                   randconfig-002-20251213    gcc-15.1.0
arc                           tb10x_defconfig    gcc-15.1.0
arm                              allyesconfig    gcc-15.1.0
arm                         at91_dt_defconfig    clang-22
arm                         bcm2835_defconfig    clang-22
arm                                 defconfig    clang-22
arm                   randconfig-001-20251213    clang-20
arm                   randconfig-002-20251213    gcc-8.5.0
arm                   randconfig-003-20251213    clang-22
arm                   randconfig-004-20251213    clang-22
arm64                               defconfig    gcc-15.1.0
arm64                 randconfig-001-20251213    clang-22
arm64                 randconfig-002-20251213    clang-22
arm64                 randconfig-003-20251213    clang-22
arm64                 randconfig-004-20251213    clang-20
csky                             allmodconfig    gcc-15.1.0
csky                                defconfig    gcc-15.1.0
csky                  randconfig-001-20251213    gcc-15.1.0
csky                  randconfig-002-20251213    gcc-11.5.0
hexagon                          allmodconfig    clang-17
hexagon                             defconfig    clang-22
hexagon               randconfig-001-20251212    clang-22
hexagon               randconfig-002-20251212    clang-22
i386                             allmodconfig    gcc-14
i386                             allyesconfig    gcc-14
i386        buildonly-randconfig-001-20251213    clang-20
i386        buildonly-randconfig-002-20251213    gcc-14
i386        buildonly-randconfig-003-20251213    gcc-14
i386        buildonly-randconfig-004-20251213    clang-20
i386        buildonly-randconfig-005-20251213    clang-20
i386        buildonly-randconfig-006-20251213    gcc-14
i386                                defconfig    clang-20
i386                  randconfig-001-20251213    clang-20
i386                  randconfig-002-20251213    gcc-14
i386                  randconfig-003-20251213    gcc-13
i386                  randconfig-004-20251213    clang-20
i386                  randconfig-005-20251213    clang-20
i386                  randconfig-006-20251213    gcc-14
i386                  randconfig-007-20251213    gcc-14
i386                  randconfig-011-20251213    gcc-14
i386                  randconfig-012-20251213    gcc-14
i386                  randconfig-013-20251213    clang-20
i386                  randconfig-014-20251213    gcc-14
i386                  randconfig-015-20251213    gcc-14
i386                  randconfig-016-20251213    gcc-14
i386                  randconfig-017-20251213    clang-20
loongarch                           defconfig    clang-19
loongarch                 loongson3_defconfig    clang-22
loongarch             randconfig-001-20251212    clang-22
loongarch             randconfig-002-20251212    clang-18
m68k                             allmodconfig    gcc-15.1.0
m68k                             allyesconfig    gcc-15.1.0
m68k                                defconfig    gcc-15.1.0
microblaze                       allyesconfig    gcc-15.1.0
microblaze                          defconfig    gcc-15.1.0
mips                             allmodconfig    gcc-15.1.0
mips                             allyesconfig    gcc-15.1.0
mips                           ci20_defconfig    clang-22
nios2                            allmodconfig    gcc-11.5.0
nios2                             allnoconfig    gcc-11.5.0
nios2                               defconfig    gcc-11.5.0
nios2                 randconfig-001-20251212    gcc-11.5.0
nios2                 randconfig-002-20251212    gcc-8.5.0
openrisc                         allmodconfig    gcc-15.1.0
openrisc                          allnoconfig    gcc-15.1.0
openrisc                            defconfig    gcc-15.1.0
openrisc                 simple_smp_defconfig    gcc-15.1.0
parisc                           allmodconfig    gcc-15.1.0
parisc                            allnoconfig    gcc-15.1.0
parisc                           allyesconfig    gcc-15.1.0
parisc                              defconfig    gcc-15.1.0
parisc                randconfig-001-20251213    gcc-8.5.0
parisc                randconfig-002-20251213    gcc-8.5.0
parisc64                            defconfig    gcc-15.1.0
powerpc                          allmodconfig    gcc-15.1.0
powerpc                           allnoconfig    gcc-15.1.0
powerpc                     ep8248e_defconfig    gcc-15.1.0
powerpc               randconfig-001-20251213    clang-18
powerpc               randconfig-002-20251213    clang-22
powerpc64             randconfig-001-20251213    clang-16
powerpc64             randconfig-002-20251213    clang-16
riscv                             allnoconfig    gcc-15.1.0
riscv                            allyesconfig    clang-16
riscv                               defconfig    clang-22
riscv                 randconfig-001-20251213    clang-16
riscv                 randconfig-002-20251213    clang-22
s390                             allmodconfig    clang-18
s390                              allnoconfig    clang-22
s390                             allyesconfig    gcc-15.1.0
s390                                defconfig    clang-22
s390                  randconfig-001-20251213    gcc-13.4.0
s390                  randconfig-002-20251213    clang-17
sh                               allmodconfig    gcc-15.1.0
sh                                allnoconfig    gcc-15.1.0
sh                               allyesconfig    gcc-15.1.0
sh                                  defconfig    gcc-15.1.0
sh                    randconfig-001-20251213    gcc-15.1.0
sh                    randconfig-002-20251213    gcc-10.5.0
sh                        sh7757lcr_defconfig    gcc-15.1.0
sparc                             allnoconfig    gcc-15.1.0
sparc                               defconfig    gcc-15.1.0
sparc64                          allmodconfig    clang-22
sparc64                             defconfig    clang-20
um                               allmodconfig    clang-19
um                                allnoconfig    clang-22
um                               allyesconfig    gcc-14
um                                  defconfig    clang-22
um                             i386_defconfig    gcc-14
um                           x86_64_defconfig    clang-22
x86_64                           allmodconfig    clang-20
x86_64                            allnoconfig    clang-20
x86_64                           allyesconfig    clang-20
x86_64                              defconfig    gcc-14
x86_64                randconfig-001-20251213    gcc-14
x86_64                randconfig-002-20251213    gcc-14
x86_64                randconfig-003-20251213    gcc-14
x86_64                randconfig-004-20251213    clang-20
x86_64                randconfig-005-20251213    gcc-14
x86_64                randconfig-006-20251213    clang-20
x86_64                randconfig-011-20251213    gcc-14
x86_64                randconfig-012-20251213    gcc-14
x86_64                randconfig-013-20251213    clang-20
x86_64                randconfig-014-20251213    clang-20
x86_64                randconfig-015-20251213    gcc-14
x86_64                randconfig-016-20251213    clang-20
x86_64                randconfig-071-20251213    clang-20
x86_64                randconfig-072-20251213    clang-20
x86_64                randconfig-073-20251213    clang-20
x86_64                randconfig-074-20251213    gcc-13
x86_64                randconfig-075-20251213    clang-20
x86_64                randconfig-076-20251213    gcc-14
x86_64                          rhel-9.4-rust    clang-20
xtensa                            allnoconfig    gcc-15.1.0
xtensa                           allyesconfig    gcc-15.1.0

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply

* Re: [PATCH] MAINTAINERS: adjust file entry in HIMAX HX83112B TOUCHSCREEN SUPPORT
From: Dmitry Torokhov @ 2025-12-13  9:46 UTC (permalink / raw)
  To: Lukas Bulwahn
  Cc: Job Noorman, Frank Li, linux-input, Rob Herring, kernel-janitors,
	linux-kernel, Lukas Bulwahn
In-Reply-To: <20251110054733.441893-1-lukas.bulwahn@redhat.com>

On Mon, Nov 10, 2025 at 06:47:33AM +0100, Lukas Bulwahn wrote:
> From: Lukas Bulwahn <lukas.bulwahn@redhat.com>
> 
> Commit a311c777f298 ("dt-bindings: touchscreen: consolidate simple touch
> controller to trivial-touch.yaml") aggregates a few touchscreen yaml files
> into a common trivial-touch.yaml, but misses to adjust the reference in
> HIMAX HX83112B TOUCHSCREEN SUPPORT, which refers to the removed file
> himax,hx83112b.yaml.
> 
> Make HIMAX HX83112B TOUCHSCREEN SUPPORT refer to trivial-touch.yaml, in
> order to inform the maintainer on changes to the device-tree binding
> relevant to that hardware driver.
> 
> Signed-off-by: Lukas Bulwahn <lukas.bulwahn@redhat.com>

Applied, thank you.

-- 
Dmitry

^ permalink raw reply

* Re: [PATCH v1 1/3] Input: cros_ec_keyb: clarify key event error message
From: Dmitry Torokhov @ 2025-12-13  9:40 UTC (permalink / raw)
  To: Fabio Baltieri
  Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Benson Leung,
	Guenter Roeck, Tzung-Bi Shih, Simon Glass, linux-input,
	devicetree, chrome-platform, linux-kernel
In-Reply-To: <20251209154706.529784-2-fabiobaltieri@chromium.org>

On Tue, Dec 09, 2025 at 03:47:04PM +0000, Fabio Baltieri wrote:
> Reword one of the key event error messages to clarify its meaning: it's
> not necessarily an incomplete message, more of a mismatch length.
> Clarify that and log the expected and received length too.
> 
> Signed-off-by: Fabio Baltieri <fabiobaltieri@chromium.org>

Applied, thank you.

-- 
Dmitry

^ permalink raw reply

* Re: [PATCH v1] Input: pf1550 - Remove "defined but unused" warning
From: Dmitry Torokhov @ 2025-12-13  9:38 UTC (permalink / raw)
  To: Vaibhav Gupta; +Cc: Samuel Kayode, imx, linux-input, linux-kernel
In-Reply-To: <20251210211149.543928-1-vaibhavgupta40@gmail.com>

On Wed, Dec 10, 2025 at 09:11:41PM +0000, Vaibhav Gupta wrote:
> If 'CONFIG_PM_SLEEP' is not set, compiler throws warning for *suspend() and
> *resume() function for this driver. Using new 'DEFINE_SIMPLE_DEV_PM_OPS'
> fixes it.
> 
> Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>

Applied, thank you.

-- 
Dmitry

^ permalink raw reply

* Re: [PATCH 1/3] Input: omap4-keypad - Remove redundant pm_runtime_mark_last_busy() calls
From: Dmitry Torokhov @ 2025-12-13  9:34 UTC (permalink / raw)
  To: Sakari Ailus
  Cc: linux-input, James Ogletree, Fred Treven, Ben Bright,
	Josh Poimboeuf, Ingo Molnar, patches
In-Reply-To: <20251027115823.391080-1-sakari.ailus@linux.intel.com>

On Mon, Oct 27, 2025 at 01:58:21PM +0200, Sakari Ailus wrote:
> pm_runtime_put_autosuspend(), pm_runtime_put_sync_autosuspend(),
> pm_runtime_autosuspend() and pm_request_autosuspend() now include a call
> to pm_runtime_mark_last_busy(). Remove the now-reduntant explicit call to
> pm_runtime_mark_last_busy().
> 
> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>

Applied the lot, thank you.

-- 
Dmitry

^ permalink raw reply

* [dtor-input:next] BUILD SUCCESS c4b3133c6a2fc283cb3d34c64d40ed2fa254b608
From: kernel test robot @ 2025-12-13  7:59 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input

tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
branch HEAD: c4b3133c6a2fc283cb3d34c64d40ed2fa254b608  Input: byd - use %*ph for Z packet dump

elapsed time: 1340m

configs tested: 296
configs skipped: 1

The following configs have been built successfully.
More configs may be tested in the coming days.

tested configs:
alpha                             allnoconfig    gcc-15.1.0
alpha                            allyesconfig    gcc-15.1.0
alpha                               defconfig    gcc-15.1.0
arc                              allmodconfig    clang-16
arc                              allmodconfig    gcc-15.1.0
arc                               allnoconfig    gcc-15.1.0
arc                              allyesconfig    clang-22
arc                              allyesconfig    gcc-15.1.0
arc                                 defconfig    gcc-15.1.0
arc                     nsimosci_hs_defconfig    gcc-15.1.0
arc                   randconfig-001-20251212    gcc-8.5.0
arc                   randconfig-001-20251213    gcc-15.1.0
arc                   randconfig-001-20251213    gcc-8.5.0
arc                   randconfig-002-20251212    gcc-15.1.0
arc                   randconfig-002-20251213    gcc-15.1.0
arc                   randconfig-002-20251213    gcc-8.5.0
arm                               allnoconfig    clang-22
arm                               allnoconfig    gcc-15.1.0
arm                              allyesconfig    clang-16
arm                              allyesconfig    gcc-15.1.0
arm                                 defconfig    gcc-15.1.0
arm                         lpc32xx_defconfig    gcc-15.1.0
arm                            mps2_defconfig    clang-22
arm                       multi_v4t_defconfig    clang-16
arm                          pxa168_defconfig    gcc-15.1.0
arm                   randconfig-001-20251212    clang-22
arm                   randconfig-001-20251213    clang-20
arm                   randconfig-001-20251213    gcc-8.5.0
arm                   randconfig-002-20251212    clang-22
arm                   randconfig-002-20251213    gcc-8.5.0
arm                   randconfig-003-20251212    gcc-8.5.0
arm                   randconfig-003-20251213    clang-22
arm                   randconfig-003-20251213    gcc-8.5.0
arm                   randconfig-004-20251212    gcc-15.1.0
arm                   randconfig-004-20251213    clang-22
arm                   randconfig-004-20251213    gcc-8.5.0
arm                          sp7021_defconfig    gcc-15.1.0
arm64                            allmodconfig    clang-19
arm64                            allmodconfig    clang-22
arm64                             allnoconfig    gcc-15.1.0
arm64                               defconfig    gcc-15.1.0
arm64                 randconfig-001-20251212    clang-18
arm64                 randconfig-001-20251213    clang-22
arm64                 randconfig-002-20251212    clang-19
arm64                 randconfig-002-20251213    clang-22
arm64                 randconfig-003-20251212    clang-22
arm64                 randconfig-003-20251213    clang-22
arm64                 randconfig-004-20251212    gcc-8.5.0
arm64                 randconfig-004-20251213    clang-22
csky                             allmodconfig    gcc-15.1.0
csky                              allnoconfig    gcc-15.1.0
csky                                defconfig    gcc-15.1.0
csky                  randconfig-001-20251212    gcc-14.3.0
csky                  randconfig-001-20251213    clang-22
csky                  randconfig-002-20251212    gcc-13.4.0
csky                  randconfig-002-20251213    clang-22
hexagon                          allmodconfig    clang-17
hexagon                          allmodconfig    gcc-15.1.0
hexagon                           allnoconfig    clang-22
hexagon                           allnoconfig    gcc-15.1.0
hexagon                             defconfig    gcc-15.1.0
hexagon               randconfig-001-20251212    clang-22
hexagon               randconfig-001-20251213    gcc-9.5.0
hexagon               randconfig-002-20251212    clang-22
hexagon               randconfig-002-20251213    gcc-9.5.0
i386                             allmodconfig    gcc-14
i386                              allnoconfig    gcc-14
i386                              allnoconfig    gcc-15.1.0
i386                             allyesconfig    gcc-14
i386        buildonly-randconfig-001-20251213    clang-20
i386        buildonly-randconfig-002-20251213    clang-20
i386        buildonly-randconfig-002-20251213    gcc-14
i386        buildonly-randconfig-003-20251213    clang-20
i386        buildonly-randconfig-003-20251213    gcc-14
i386        buildonly-randconfig-004-20251213    clang-20
i386        buildonly-randconfig-005-20251213    clang-20
i386        buildonly-randconfig-006-20251213    clang-20
i386        buildonly-randconfig-006-20251213    gcc-14
i386                                defconfig    gcc-15.1.0
i386                  randconfig-001-20251212    clang-20
i386                  randconfig-001-20251213    clang-20
i386                  randconfig-002-20251212    gcc-14
i386                  randconfig-002-20251213    clang-20
i386                  randconfig-002-20251213    gcc-14
i386                  randconfig-003-20251212    clang-20
i386                  randconfig-003-20251213    clang-20
i386                  randconfig-003-20251213    gcc-13
i386                  randconfig-004-20251212    gcc-14
i386                  randconfig-004-20251213    clang-20
i386                  randconfig-005-20251212    gcc-14
i386                  randconfig-005-20251213    clang-20
i386                  randconfig-006-20251212    gcc-14
i386                  randconfig-006-20251213    clang-20
i386                  randconfig-006-20251213    gcc-14
i386                  randconfig-007-20251212    gcc-14
i386                  randconfig-007-20251213    clang-20
i386                  randconfig-007-20251213    gcc-14
i386                  randconfig-011-20251212    gcc-14
i386                  randconfig-011-20251213    gcc-14
i386                  randconfig-012-20251212    gcc-14
i386                  randconfig-012-20251213    gcc-14
i386                  randconfig-013-20251212    gcc-14
i386                  randconfig-013-20251213    clang-20
i386                  randconfig-013-20251213    gcc-14
i386                  randconfig-014-20251212    gcc-14
i386                  randconfig-014-20251213    gcc-14
i386                  randconfig-015-20251212    clang-20
i386                  randconfig-015-20251213    gcc-14
i386                  randconfig-016-20251212    gcc-14
i386                  randconfig-016-20251213    gcc-14
i386                  randconfig-017-20251212    gcc-14
i386                  randconfig-017-20251213    clang-20
i386                  randconfig-017-20251213    gcc-14
loongarch                        allmodconfig    clang-19
loongarch                        allmodconfig    clang-22
loongarch                         allnoconfig    clang-22
loongarch                         allnoconfig    gcc-15.1.0
loongarch                           defconfig    clang-19
loongarch                 loongson3_defconfig    clang-22
loongarch             randconfig-001-20251212    clang-22
loongarch             randconfig-001-20251213    gcc-9.5.0
loongarch             randconfig-002-20251212    clang-18
loongarch             randconfig-002-20251213    gcc-9.5.0
m68k                             allmodconfig    gcc-15.1.0
m68k                              allnoconfig    gcc-15.1.0
m68k                             allyesconfig    clang-16
m68k                             allyesconfig    gcc-15.1.0
m68k                                defconfig    clang-19
m68k                                defconfig    gcc-15.1.0
microblaze                        allnoconfig    gcc-15.1.0
microblaze                       allyesconfig    gcc-15.1.0
microblaze                          defconfig    clang-19
microblaze                          defconfig    gcc-15.1.0
mips                             allmodconfig    gcc-15.1.0
mips                              allnoconfig    gcc-15.1.0
mips                             allyesconfig    gcc-15.1.0
mips                          ath79_defconfig    gcc-15.1.0
mips                           ip30_defconfig    gcc-15.1.0
mips                       rbtx49xx_defconfig    gcc-15.1.0
mips                   sb1250_swarm_defconfig    gcc-15.1.0
nios2                         10m50_defconfig    gcc-11.5.0
nios2                            allmodconfig    clang-22
nios2                            allmodconfig    gcc-11.5.0
nios2                             allnoconfig    clang-22
nios2                             allnoconfig    gcc-11.5.0
nios2                               defconfig    clang-19
nios2                               defconfig    gcc-11.5.0
nios2                 randconfig-001-20251212    gcc-11.5.0
nios2                 randconfig-001-20251213    gcc-9.5.0
nios2                 randconfig-002-20251212    gcc-8.5.0
nios2                 randconfig-002-20251213    gcc-9.5.0
openrisc                         alldefconfig    gcc-15.1.0
openrisc                         allmodconfig    clang-22
openrisc                         allmodconfig    gcc-15.1.0
openrisc                          allnoconfig    clang-22
openrisc                          allnoconfig    gcc-15.1.0
openrisc                            defconfig    gcc-15.1.0
parisc                           allmodconfig    gcc-15.1.0
parisc                            allnoconfig    clang-22
parisc                            allnoconfig    gcc-15.1.0
parisc                           allyesconfig    clang-19
parisc                           allyesconfig    gcc-15.1.0
parisc                              defconfig    gcc-15.1.0
parisc                randconfig-001-20251212    gcc-10.5.0
parisc                randconfig-001-20251213    clang-18
parisc                randconfig-001-20251213    gcc-8.5.0
parisc                randconfig-002-20251212    gcc-12.5.0
parisc                randconfig-002-20251213    clang-18
parisc                randconfig-002-20251213    gcc-8.5.0
parisc64                            defconfig    clang-19
parisc64                            defconfig    gcc-15.1.0
powerpc                          allmodconfig    gcc-15.1.0
powerpc                           allnoconfig    clang-22
powerpc                           allnoconfig    gcc-15.1.0
powerpc                   bluestone_defconfig    gcc-15.1.0
powerpc                      mgcoge_defconfig    clang-22
powerpc                 mpc8313_rdb_defconfig    gcc-15.1.0
powerpc                      pmac32_defconfig    clang-22
powerpc                         ps3_defconfig    gcc-15.1.0
powerpc                     rainier_defconfig    gcc-15.1.0
powerpc               randconfig-001-20251212    clang-22
powerpc               randconfig-001-20251213    clang-18
powerpc               randconfig-002-20251212    gcc-12.5.0
powerpc               randconfig-002-20251213    clang-18
powerpc               randconfig-002-20251213    clang-22
powerpc64             randconfig-001-20251212    gcc-11.5.0
powerpc64             randconfig-001-20251213    clang-16
powerpc64             randconfig-001-20251213    clang-18
powerpc64             randconfig-002-20251212    clang-22
powerpc64             randconfig-002-20251213    clang-16
powerpc64             randconfig-002-20251213    clang-18
riscv                            allmodconfig    clang-22
riscv                             allnoconfig    clang-22
riscv                             allnoconfig    gcc-15.1.0
riscv                            allyesconfig    clang-16
riscv                               defconfig    gcc-15.1.0
riscv                 randconfig-001-20251213    clang-16
riscv                 randconfig-001-20251213    clang-22
riscv                 randconfig-002-20251213    clang-22
s390                             allmodconfig    clang-18
s390                             allmodconfig    clang-19
s390                              allnoconfig    clang-22
s390                             allyesconfig    gcc-15.1.0
s390                          debug_defconfig    gcc-15.1.0
s390                                defconfig    gcc-15.1.0
s390                  randconfig-001-20251213    clang-22
s390                  randconfig-001-20251213    gcc-13.4.0
s390                  randconfig-002-20251213    clang-17
s390                  randconfig-002-20251213    clang-22
sh                               allmodconfig    gcc-15.1.0
sh                                allnoconfig    clang-22
sh                                allnoconfig    gcc-15.1.0
sh                               allyesconfig    clang-19
sh                               allyesconfig    gcc-15.1.0
sh                                  defconfig    gcc-14
sh                             espt_defconfig    gcc-15.1.0
sh                          lboxre2_defconfig    gcc-15.1.0
sh                    randconfig-001-20251213    clang-22
sh                    randconfig-001-20251213    gcc-15.1.0
sh                    randconfig-002-20251213    clang-22
sh                    randconfig-002-20251213    gcc-10.5.0
sh                   rts7751r2dplus_defconfig    gcc-15.1.0
sh                           se7343_defconfig    gcc-15.1.0
sparc                             allnoconfig    clang-22
sparc                             allnoconfig    gcc-15.1.0
sparc                               defconfig    gcc-15.1.0
sparc                 randconfig-001-20251213    gcc-14.3.0
sparc                 randconfig-002-20251213    gcc-14.3.0
sparc                 randconfig-002-20251213    gcc-8.5.0
sparc64                          allmodconfig    clang-22
sparc64                             defconfig    gcc-14
sparc64               randconfig-001-20251213    gcc-14.3.0
sparc64               randconfig-001-20251213    gcc-15.1.0
sparc64               randconfig-002-20251213    gcc-14.3.0
um                               allmodconfig    clang-19
um                                allnoconfig    clang-22
um                               allyesconfig    gcc-14
um                               allyesconfig    gcc-15.1.0
um                                  defconfig    gcc-14
um                             i386_defconfig    gcc-14
um                    randconfig-001-20251213    clang-22
um                    randconfig-001-20251213    gcc-14.3.0
um                    randconfig-002-20251213    gcc-14
um                    randconfig-002-20251213    gcc-14.3.0
um                           x86_64_defconfig    gcc-14
x86_64                           allmodconfig    clang-20
x86_64                            allnoconfig    clang-20
x86_64                            allnoconfig    clang-22
x86_64                           allyesconfig    clang-20
x86_64      buildonly-randconfig-001-20251213    clang-20
x86_64      buildonly-randconfig-002-20251213    clang-20
x86_64      buildonly-randconfig-003-20251213    clang-20
x86_64      buildonly-randconfig-004-20251213    clang-20
x86_64      buildonly-randconfig-005-20251213    clang-20
x86_64      buildonly-randconfig-005-20251213    gcc-14
x86_64      buildonly-randconfig-006-20251213    clang-20
x86_64                              defconfig    gcc-14
x86_64                                  kexec    clang-20
x86_64                randconfig-001-20251213    gcc-14
x86_64                randconfig-002-20251213    gcc-14
x86_64                randconfig-003-20251213    gcc-14
x86_64                randconfig-004-20251213    clang-20
x86_64                randconfig-004-20251213    gcc-14
x86_64                randconfig-005-20251213    gcc-14
x86_64                randconfig-006-20251213    clang-20
x86_64                randconfig-006-20251213    gcc-14
x86_64                randconfig-011-20251213    clang-20
x86_64                randconfig-011-20251213    gcc-14
x86_64                randconfig-012-20251213    clang-20
x86_64                randconfig-012-20251213    gcc-14
x86_64                randconfig-013-20251213    clang-20
x86_64                randconfig-014-20251213    clang-20
x86_64                randconfig-015-20251213    clang-20
x86_64                randconfig-015-20251213    gcc-14
x86_64                randconfig-016-20251213    clang-20
x86_64                randconfig-071-20251213    clang-20
x86_64                randconfig-072-20251213    clang-20
x86_64                randconfig-073-20251213    clang-20
x86_64                randconfig-074-20251213    clang-20
x86_64                randconfig-075-20251213    clang-20
x86_64                randconfig-076-20251213    clang-20
x86_64                               rhel-9.4    clang-20
x86_64                           rhel-9.4-bpf    gcc-14
x86_64                          rhel-9.4-func    clang-20
x86_64                    rhel-9.4-kselftests    clang-20
x86_64                         rhel-9.4-kunit    gcc-14
x86_64                           rhel-9.4-ltp    gcc-14
x86_64                          rhel-9.4-rust    clang-20
xtensa                            allnoconfig    clang-22
xtensa                            allnoconfig    gcc-15.1.0
xtensa                           allyesconfig    clang-22
xtensa                           allyesconfig    gcc-15.1.0
xtensa                randconfig-001-20251213    gcc-14.3.0
xtensa                randconfig-001-20251213    gcc-15.1.0
xtensa                randconfig-002-20251213    gcc-14.3.0
xtensa                randconfig-002-20251213    gcc-8.5.0

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply

* Re: [PATCH] input: synaptics_i2c - cancel delayed work before freeing device
From: Dmitry Torokhov @ 2025-12-13  4:38 UTC (permalink / raw)
  To: Mike Rapoport, Marek Vasut
  Cc: Minseong Kim, linux-input, linux-kernel, stable
In-Reply-To: <aTlmwhOF3zB1UkrI@kernel.org>

On Wed, Dec 10, 2025 at 09:25:38PM +0900, Mike Rapoport wrote:
> Hi,
> 
> On Tue, Dec 09, 2025 at 08:40:54PM -0800, Dmitry Torokhov wrote:
> > Hi Minseong,
> > 
> > On Wed, Dec 10, 2025 at 12:20:27PM +0900, Minseong Kim wrote:
> > > synaptics_i2c_irq() schedules touch->dwork via mod_delayed_work().
> > > The delayed work performs I2C transactions and may still be running
> > > (or get queued) when the device is removed.
> > > 
> > > synaptics_i2c_remove() currently frees 'touch' without canceling
> > > touch->dwork. If removal happens while the work is pending/running,
> > > the work handler may dereference freed memory, leading to a potential
> > > use-after-free.
> > > 
> > > Cancel the delayed work synchronously before unregistering/freeing
> > > the device.
> > > 
> > > Fixes: eef3e4cab72e Input: add driver for Synaptics I2C touchpad
> > > Reported-by: Minseong Kim <ii4gsp@gmail.com>
> > > Cc: stable@vger.kernel.org
> > > Signed-off-by: Minseong Kim <ii4gsp@gmail.com>
> > > ---
> > >  drivers/input/mouse/synaptics_i2c.c | 2 ++
> > >  1 file changed, 2 insertions(+)
> > > 
> > > diff --git a/drivers/input/mouse/synaptics_i2c.c b/drivers/input/mouse/synaptics_i2c.c
> > > index a0d707e47d93..fe30bf9aea3a 100644
> > > --- a/drivers/input/mouse/synaptics_i2c.c
> > > +++ b/drivers/input/mouse/synaptics_i2c.c
> > > @@ -593,6 +593,8 @@ static void synaptics_i2c_remove(struct i2c_client *client)
> > >  	if (!polling_req)
> > >  		free_irq(client->irq, touch);
> > >  
> > > +	cancel_delayed_work_sync(&touch->dwork);
> > > +
> > 
> > The call to cancel_delayed_work_sync() happens in the close() handler
> > for the device. I see that in resume we restart the polling without
> > checking if the device is opened, so if we want to fix it we should add
> > the checks there.
> > 
> > However support for the PXA board using in the device with this touch
> > controller (eXeda) was removed a while ago. Mike, you're one of the
> > authors, any objections to simply removing the driver? 
>  
> No objections from my side.

Hmm, it looks like it is still referenced from
arch/arm/boot/dts/nxp/mxs/imx23-sansa.dts

Marek, is this device still relevant?

Thanks.

-- 
Dmitry

^ permalink raw reply

* Re: [PATCH] Input: synaptics_i2c - remove the driver
From: Mike Rapoport @ 2025-12-12 13:54 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-kernel, Minseong Kim, linux-input
In-Reply-To: <7fjjlb5wmwberkwljagmmbetvcvcijoduu2cqpilressbrnn4y@4574molvgnqu>

On Fri, Dec 12, 2025 at 12:50:49AM -0800, Dmitry Torokhov wrote:
> The board support for the device using this Synaptics controller (eXeda
> mobile device) has been removed long time ago, it is time to remove the
> driver as well.
> 
> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org>

> ---
>  drivers/input/mouse/Kconfig         |  18 -
>  drivers/input/mouse/Makefile        |   1 -
>  drivers/input/mouse/synaptics_i2c.c | 664 ----------------------------
>  3 files changed, 683 deletions(-)
> 
> diff --git a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig
> index 833b643f0616..3638a5ebb51f 100644
> --- a/drivers/input/mouse/Kconfig
> +++ b/drivers/input/mouse/Kconfig
> @@ -404,24 +404,6 @@ config MOUSE_MAPLE
>  	  To compile this driver as a module choose M here: the module will be
>  	  called maplemouse.
>  
> -config MOUSE_SYNAPTICS_I2C
> -	tristate "Synaptics I2C Touchpad support"
> -	depends on I2C
> -	help
> -	  This driver supports Synaptics I2C touchpad controller on eXeda
> -	  mobile device.
> -	  The device will not work the synaptics X11 driver because
> -	  (i) it  reports only relative coordinates and has no capabilities
> -	  to report absolute coordinates
> -	  (ii) the eXeda device itself uses Xfbdev as X Server and it does
> -	  not allow using xf86-input-* drivers.
> -
> -	  Say y here if you have eXeda device and want to use a Synaptics
> -	  I2C Touchpad.
> -
> -	  To compile this driver as a module, choose M here: the
> -	  module will be called synaptics_i2c.
> -
>  config MOUSE_SYNAPTICS_USB
>  	tristate "Synaptics USB device support"
>  	depends on USB_ARCH_HAS_HCD
> diff --git a/drivers/input/mouse/Makefile b/drivers/input/mouse/Makefile
> index a1336d5bee6f..4d6251fbe38b 100644
> --- a/drivers/input/mouse/Makefile
> +++ b/drivers/input/mouse/Makefile
> @@ -19,7 +19,6 @@ obj-$(CONFIG_MOUSE_PC110PAD)		+= pc110pad.o
>  obj-$(CONFIG_MOUSE_PS2)			+= psmouse.o
>  obj-$(CONFIG_MOUSE_RISCPC)		+= rpcmouse.o
>  obj-$(CONFIG_MOUSE_SERIAL)		+= sermouse.o
> -obj-$(CONFIG_MOUSE_SYNAPTICS_I2C)	+= synaptics_i2c.o
>  obj-$(CONFIG_MOUSE_SYNAPTICS_USB)	+= synaptics_usb.o
>  obj-$(CONFIG_MOUSE_VSXXXAA)		+= vsxxxaa.o
>  
> diff --git a/drivers/input/mouse/synaptics_i2c.c b/drivers/input/mouse/synaptics_i2c.c
> deleted file mode 100644
> index a0d707e47d93..000000000000
> --- a/drivers/input/mouse/synaptics_i2c.c
> +++ /dev/null
> @@ -1,664 +0,0 @@
> -/*
> - * Synaptics touchpad with I2C interface
> - *
> - * Copyright (C) 2009 Compulab, Ltd.
> - * Mike Rapoport <mike@compulab.co.il>
> - * Igor Grinberg <grinberg@compulab.co.il>
> - *
> - * This file is subject to the terms and conditions of the GNU General Public
> - * License.  See the file COPYING in the main directory of this archive for
> - * more details.
> - */
> -
> -#include <linux/module.h>
> -#include <linux/i2c.h>
> -#include <linux/irq.h>
> -#include <linux/interrupt.h>
> -#include <linux/input.h>
> -#include <linux/delay.h>
> -#include <linux/workqueue.h>
> -#include <linux/slab.h>
> -#include <linux/pm.h>
> -
> -#define DRIVER_NAME		"synaptics_i2c"
> -/* maximum product id is 15 characters */
> -#define PRODUCT_ID_LENGTH	15
> -#define REGISTER_LENGTH		8
> -
> -/*
> - * after soft reset, we should wait for 1 ms
> - * before the device becomes operational
> - */
> -#define SOFT_RESET_DELAY_US	3000
> -/* and after hard reset, we should wait for max 500ms */
> -#define HARD_RESET_DELAY_MS	500
> -
> -/* Registers by SMBus address */
> -#define PAGE_SEL_REG		0xff
> -#define DEVICE_STATUS_REG	0x09
> -
> -/* Registers by RMI address */
> -#define DEV_CONTROL_REG		0x0000
> -#define INTERRUPT_EN_REG	0x0001
> -#define ERR_STAT_REG		0x0002
> -#define INT_REQ_STAT_REG	0x0003
> -#define DEV_COMMAND_REG		0x0004
> -
> -#define RMI_PROT_VER_REG	0x0200
> -#define MANUFACT_ID_REG		0x0201
> -#define PHYS_INT_VER_REG	0x0202
> -#define PROD_PROPERTY_REG	0x0203
> -#define INFO_QUERY_REG0		0x0204
> -#define INFO_QUERY_REG1		(INFO_QUERY_REG0 + 1)
> -#define INFO_QUERY_REG2		(INFO_QUERY_REG0 + 2)
> -#define INFO_QUERY_REG3		(INFO_QUERY_REG0 + 3)
> -
> -#define PRODUCT_ID_REG0		0x0210
> -#define PRODUCT_ID_REG1		(PRODUCT_ID_REG0 + 1)
> -#define PRODUCT_ID_REG2		(PRODUCT_ID_REG0 + 2)
> -#define PRODUCT_ID_REG3		(PRODUCT_ID_REG0 + 3)
> -#define PRODUCT_ID_REG4		(PRODUCT_ID_REG0 + 4)
> -#define PRODUCT_ID_REG5		(PRODUCT_ID_REG0 + 5)
> -#define PRODUCT_ID_REG6		(PRODUCT_ID_REG0 + 6)
> -#define PRODUCT_ID_REG7		(PRODUCT_ID_REG0 + 7)
> -#define PRODUCT_ID_REG8		(PRODUCT_ID_REG0 + 8)
> -#define PRODUCT_ID_REG9		(PRODUCT_ID_REG0 + 9)
> -#define PRODUCT_ID_REG10	(PRODUCT_ID_REG0 + 10)
> -#define PRODUCT_ID_REG11	(PRODUCT_ID_REG0 + 11)
> -#define PRODUCT_ID_REG12	(PRODUCT_ID_REG0 + 12)
> -#define PRODUCT_ID_REG13	(PRODUCT_ID_REG0 + 13)
> -#define PRODUCT_ID_REG14	(PRODUCT_ID_REG0 + 14)
> -#define PRODUCT_ID_REG15	(PRODUCT_ID_REG0 + 15)
> -
> -#define DATA_REG0		0x0400
> -#define ABS_PRESSURE_REG	0x0401
> -#define ABS_MSB_X_REG		0x0402
> -#define ABS_LSB_X_REG		(ABS_MSB_X_REG + 1)
> -#define ABS_MSB_Y_REG		0x0404
> -#define ABS_LSB_Y_REG		(ABS_MSB_Y_REG + 1)
> -#define REL_X_REG		0x0406
> -#define REL_Y_REG		0x0407
> -
> -#define DEV_QUERY_REG0		0x1000
> -#define DEV_QUERY_REG1		(DEV_QUERY_REG0 + 1)
> -#define DEV_QUERY_REG2		(DEV_QUERY_REG0 + 2)
> -#define DEV_QUERY_REG3		(DEV_QUERY_REG0 + 3)
> -#define DEV_QUERY_REG4		(DEV_QUERY_REG0 + 4)
> -#define DEV_QUERY_REG5		(DEV_QUERY_REG0 + 5)
> -#define DEV_QUERY_REG6		(DEV_QUERY_REG0 + 6)
> -#define DEV_QUERY_REG7		(DEV_QUERY_REG0 + 7)
> -#define DEV_QUERY_REG8		(DEV_QUERY_REG0 + 8)
> -
> -#define GENERAL_2D_CONTROL_REG	0x1041
> -#define SENSOR_SENSITIVITY_REG	0x1044
> -#define SENS_MAX_POS_MSB_REG	0x1046
> -#define SENS_MAX_POS_LSB_REG	(SENS_MAX_POS_UPPER_REG + 1)
> -
> -/* Register bits */
> -/* Device Control Register Bits */
> -#define REPORT_RATE_1ST_BIT	6
> -
> -/* Interrupt Enable Register Bits (INTERRUPT_EN_REG) */
> -#define F10_ABS_INT_ENA		0
> -#define F10_REL_INT_ENA		1
> -#define F20_INT_ENA		2
> -
> -/* Interrupt Request Register Bits (INT_REQ_STAT_REG | DEVICE_STATUS_REG) */
> -#define F10_ABS_INT_REQ		0
> -#define F10_REL_INT_REQ		1
> -#define F20_INT_REQ		2
> -/* Device Status Register Bits (DEVICE_STATUS_REG) */
> -#define STAT_CONFIGURED		6
> -#define STAT_ERROR		7
> -
> -/* Device Command Register Bits (DEV_COMMAND_REG) */
> -#define RESET_COMMAND		0x01
> -#define REZERO_COMMAND		0x02
> -
> -/* Data Register 0 Bits (DATA_REG0) */
> -#define GESTURE			3
> -
> -/* Device Query Registers Bits */
> -/* DEV_QUERY_REG3 */
> -#define HAS_PALM_DETECT		1
> -#define HAS_MULTI_FING		2
> -#define HAS_SCROLLER		4
> -#define HAS_2D_SCROLL		5
> -
> -/* General 2D Control Register Bits (GENERAL_2D_CONTROL_REG) */
> -#define NO_DECELERATION		1
> -#define REDUCE_REPORTING	3
> -#define NO_FILTER		5
> -
> -/* Function Masks */
> -/* Device Control Register Masks (DEV_CONTROL_REG) */
> -#define REPORT_RATE_MSK		0xc0
> -#define SLEEP_MODE_MSK		0x07
> -
> -/* Device Sleep Modes */
> -#define FULL_AWAKE		0x0
> -#define NORMAL_OP		0x1
> -#define LOW_PWR_OP		0x2
> -#define VERY_LOW_PWR_OP		0x3
> -#define SENS_SLEEP		0x4
> -#define SLEEP_MOD		0x5
> -#define DEEP_SLEEP		0x6
> -#define HIBERNATE		0x7
> -
> -/* Interrupt Register Mask */
> -/* (INT_REQ_STAT_REG | DEVICE_STATUS_REG | INTERRUPT_EN_REG) */
> -#define INT_ENA_REQ_MSK		0x07
> -#define INT_ENA_ABS_MSK		0x01
> -#define INT_ENA_REL_MSK		0x02
> -#define INT_ENA_F20_MSK		0x04
> -
> -/* Device Status Register Masks (DEVICE_STATUS_REG) */
> -#define CONFIGURED_MSK		0x40
> -#define ERROR_MSK		0x80
> -
> -/* Data Register 0 Masks */
> -#define FINGER_WIDTH_MSK	0xf0
> -#define GESTURE_MSK		0x08
> -#define SENSOR_STATUS_MSK	0x07
> -
> -/*
> - * MSB Position Register Masks
> - * ABS_MSB_X_REG | ABS_MSB_Y_REG | SENS_MAX_POS_MSB_REG |
> - * DEV_QUERY_REG3 | DEV_QUERY_REG5
> - */
> -#define MSB_POSITION_MSK	0x1f
> -
> -/* Device Query Registers Masks */
> -
> -/* DEV_QUERY_REG2 */
> -#define NUM_EXTRA_POS_MSK	0x07
> -
> -/* When in IRQ mode read the device every THREAD_IRQ_SLEEP_SECS */
> -#define THREAD_IRQ_SLEEP_SECS	2
> -#define THREAD_IRQ_SLEEP_MSECS	(THREAD_IRQ_SLEEP_SECS * MSEC_PER_SEC)
> -
> -/*
> - * When in Polling mode and no data received for NO_DATA_THRES msecs
> - * reduce the polling rate to NO_DATA_SLEEP_MSECS
> - */
> -#define NO_DATA_THRES		(MSEC_PER_SEC)
> -#define NO_DATA_SLEEP_MSECS	(MSEC_PER_SEC / 4)
> -
> -/* Control touchpad's No Deceleration option */
> -static bool no_decel = true;
> -module_param(no_decel, bool, 0644);
> -MODULE_PARM_DESC(no_decel, "No Deceleration. Default = 1 (on)");
> -
> -/* Control touchpad's Reduced Reporting option */
> -static bool reduce_report;
> -module_param(reduce_report, bool, 0644);
> -MODULE_PARM_DESC(reduce_report, "Reduced Reporting. Default = 0 (off)");
> -
> -/* Control touchpad's No Filter option */
> -static bool no_filter;
> -module_param(no_filter, bool, 0644);
> -MODULE_PARM_DESC(no_filter, "No Filter. Default = 0 (off)");
> -
> -/*
> - * touchpad Attention line is Active Low and Open Drain,
> - * therefore should be connected to pulled up line
> - * and the irq configuration should be set to Falling Edge Trigger
> - */
> -/* Control IRQ / Polling option */
> -static bool polling_req;
> -module_param(polling_req, bool, 0444);
> -MODULE_PARM_DESC(polling_req, "Request Polling. Default = 0 (use irq)");
> -
> -/* Control Polling Rate */
> -static int scan_rate = 80;
> -module_param(scan_rate, int, 0644);
> -MODULE_PARM_DESC(scan_rate, "Polling rate in times/sec. Default = 80");
> -
> -/* The main device structure */
> -struct synaptics_i2c {
> -	struct i2c_client	*client;
> -	struct input_dev	*input;
> -	struct delayed_work	dwork;
> -	int			no_data_count;
> -	int			no_decel_param;
> -	int			reduce_report_param;
> -	int			no_filter_param;
> -	int			scan_rate_param;
> -	int			scan_ms;
> -};
> -
> -static inline void set_scan_rate(struct synaptics_i2c *touch, int scan_rate)
> -{
> -	touch->scan_ms = MSEC_PER_SEC / scan_rate;
> -	touch->scan_rate_param = scan_rate;
> -}
> -
> -/*
> - * Driver's initial design makes no race condition possible on i2c bus,
> - * so there is no need in any locking.
> - * Keep it in mind, while playing with the code.
> - */
> -static s32 synaptics_i2c_reg_get(struct i2c_client *client, u16 reg)
> -{
> -	int ret;
> -
> -	ret = i2c_smbus_write_byte_data(client, PAGE_SEL_REG, reg >> 8);
> -	if (ret == 0)
> -		ret = i2c_smbus_read_byte_data(client, reg & 0xff);
> -
> -	return ret;
> -}
> -
> -static s32 synaptics_i2c_reg_set(struct i2c_client *client, u16 reg, u8 val)
> -{
> -	int ret;
> -
> -	ret = i2c_smbus_write_byte_data(client, PAGE_SEL_REG, reg >> 8);
> -	if (ret == 0)
> -		ret = i2c_smbus_write_byte_data(client, reg & 0xff, val);
> -
> -	return ret;
> -}
> -
> -static s32 synaptics_i2c_word_get(struct i2c_client *client, u16 reg)
> -{
> -	int ret;
> -
> -	ret = i2c_smbus_write_byte_data(client, PAGE_SEL_REG, reg >> 8);
> -	if (ret == 0)
> -		ret = i2c_smbus_read_word_data(client, reg & 0xff);
> -
> -	return ret;
> -}
> -
> -static int synaptics_i2c_config(struct i2c_client *client)
> -{
> -	int ret, control;
> -	u8 int_en;
> -
> -	/* set Report Rate to Device Highest (>=80) and Sleep to normal */
> -	ret = synaptics_i2c_reg_set(client, DEV_CONTROL_REG, 0xc1);
> -	if (ret)
> -		return ret;
> -
> -	/* set Interrupt Disable to Func20 / Enable to Func10) */
> -	int_en = (polling_req) ? 0 : INT_ENA_ABS_MSK | INT_ENA_REL_MSK;
> -	ret = synaptics_i2c_reg_set(client, INTERRUPT_EN_REG, int_en);
> -	if (ret)
> -		return ret;
> -
> -	control = synaptics_i2c_reg_get(client, GENERAL_2D_CONTROL_REG);
> -	/* No Deceleration */
> -	control |= no_decel ? 1 << NO_DECELERATION : 0;
> -	/* Reduced Reporting */
> -	control |= reduce_report ? 1 << REDUCE_REPORTING : 0;
> -	/* No Filter */
> -	control |= no_filter ? 1 << NO_FILTER : 0;
> -	ret = synaptics_i2c_reg_set(client, GENERAL_2D_CONTROL_REG, control);
> -	if (ret)
> -		return ret;
> -
> -	return 0;
> -}
> -
> -static int synaptics_i2c_reset_config(struct i2c_client *client)
> -{
> -	int ret;
> -
> -	/* Reset the Touchpad */
> -	ret = synaptics_i2c_reg_set(client, DEV_COMMAND_REG, RESET_COMMAND);
> -	if (ret) {
> -		dev_err(&client->dev, "Unable to reset device\n");
> -	} else {
> -		usleep_range(SOFT_RESET_DELAY_US, SOFT_RESET_DELAY_US + 100);
> -		ret = synaptics_i2c_config(client);
> -		if (ret)
> -			dev_err(&client->dev, "Unable to config device\n");
> -	}
> -
> -	return ret;
> -}
> -
> -static int synaptics_i2c_check_error(struct i2c_client *client)
> -{
> -	int status, ret = 0;
> -
> -	status = i2c_smbus_read_byte_data(client, DEVICE_STATUS_REG) &
> -		(CONFIGURED_MSK | ERROR_MSK);
> -
> -	if (status != CONFIGURED_MSK)
> -		ret = synaptics_i2c_reset_config(client);
> -
> -	return ret;
> -}
> -
> -static bool synaptics_i2c_get_input(struct synaptics_i2c *touch)
> -{
> -	struct input_dev *input = touch->input;
> -	int xy_delta, gesture;
> -	s32 data;
> -	s8 x_delta, y_delta;
> -
> -	/* Deal with spontaneous resets and errors */
> -	if (synaptics_i2c_check_error(touch->client))
> -		return false;
> -
> -	/* Get Gesture Bit */
> -	data = synaptics_i2c_reg_get(touch->client, DATA_REG0);
> -	gesture = (data >> GESTURE) & 0x1;
> -
> -	/*
> -	 * Get Relative axes. we have to get them in one shot,
> -	 * so we get 2 bytes starting from REL_X_REG.
> -	 */
> -	xy_delta = synaptics_i2c_word_get(touch->client, REL_X_REG) & 0xffff;
> -
> -	/* Separate X from Y */
> -	x_delta = xy_delta & 0xff;
> -	y_delta = (xy_delta >> REGISTER_LENGTH) & 0xff;
> -
> -	/* Report the button event */
> -	input_report_key(input, BTN_LEFT, gesture);
> -
> -	/* Report the deltas */
> -	input_report_rel(input, REL_X, x_delta);
> -	input_report_rel(input, REL_Y, -y_delta);
> -	input_sync(input);
> -
> -	return xy_delta || gesture;
> -}
> -
> -static irqreturn_t synaptics_i2c_irq(int irq, void *dev_id)
> -{
> -	struct synaptics_i2c *touch = dev_id;
> -
> -	mod_delayed_work(system_wq, &touch->dwork, 0);
> -
> -	return IRQ_HANDLED;
> -}
> -
> -static void synaptics_i2c_check_params(struct synaptics_i2c *touch)
> -{
> -	bool reset = false;
> -
> -	if (scan_rate != touch->scan_rate_param)
> -		set_scan_rate(touch, scan_rate);
> -
> -	if (no_decel != touch->no_decel_param) {
> -		touch->no_decel_param = no_decel;
> -		reset = true;
> -	}
> -
> -	if (no_filter != touch->no_filter_param) {
> -		touch->no_filter_param = no_filter;
> -		reset = true;
> -	}
> -
> -	if (reduce_report != touch->reduce_report_param) {
> -		touch->reduce_report_param = reduce_report;
> -		reset = true;
> -	}
> -
> -	if (reset)
> -		synaptics_i2c_reset_config(touch->client);
> -}
> -
> -/* Control the Device polling rate / Work Handler sleep time */
> -static unsigned long synaptics_i2c_adjust_delay(struct synaptics_i2c *touch,
> -						bool have_data)
> -{
> -	unsigned long delay, nodata_count_thres;
> -
> -	if (polling_req) {
> -		delay = touch->scan_ms;
> -		if (have_data) {
> -			touch->no_data_count = 0;
> -		} else {
> -			nodata_count_thres = NO_DATA_THRES / touch->scan_ms;
> -			if (touch->no_data_count < nodata_count_thres)
> -				touch->no_data_count++;
> -			else
> -				delay = NO_DATA_SLEEP_MSECS;
> -		}
> -		return msecs_to_jiffies(delay);
> -	} else {
> -		delay = msecs_to_jiffies(THREAD_IRQ_SLEEP_MSECS);
> -		return round_jiffies_relative(delay);
> -	}
> -}
> -
> -/* Work Handler */
> -static void synaptics_i2c_work_handler(struct work_struct *work)
> -{
> -	bool have_data;
> -	struct synaptics_i2c *touch =
> -			container_of(work, struct synaptics_i2c, dwork.work);
> -	unsigned long delay;
> -
> -	synaptics_i2c_check_params(touch);
> -
> -	have_data = synaptics_i2c_get_input(touch);
> -	delay = synaptics_i2c_adjust_delay(touch, have_data);
> -
> -	/*
> -	 * While interrupt driven, there is no real need to poll the device.
> -	 * But touchpads are very sensitive, so there could be errors
> -	 * related to physical environment and the attention line isn't
> -	 * necessarily asserted. In such case we can lose the touchpad.
> -	 * We poll the device once in THREAD_IRQ_SLEEP_SECS and
> -	 * if error is detected, we try to reset and reconfigure the touchpad.
> -	 */
> -	mod_delayed_work(system_wq, &touch->dwork, delay);
> -}
> -
> -static int synaptics_i2c_open(struct input_dev *input)
> -{
> -	struct synaptics_i2c *touch = input_get_drvdata(input);
> -	int ret;
> -
> -	ret = synaptics_i2c_reset_config(touch->client);
> -	if (ret)
> -		return ret;
> -
> -	if (polling_req)
> -		mod_delayed_work(system_wq, &touch->dwork,
> -				msecs_to_jiffies(NO_DATA_SLEEP_MSECS));
> -
> -	return 0;
> -}
> -
> -static void synaptics_i2c_close(struct input_dev *input)
> -{
> -	struct synaptics_i2c *touch = input_get_drvdata(input);
> -
> -	if (!polling_req)
> -		synaptics_i2c_reg_set(touch->client, INTERRUPT_EN_REG, 0);
> -
> -	cancel_delayed_work_sync(&touch->dwork);
> -
> -	/* Save some power */
> -	synaptics_i2c_reg_set(touch->client, DEV_CONTROL_REG, DEEP_SLEEP);
> -}
> -
> -static void synaptics_i2c_set_input_params(struct synaptics_i2c *touch)
> -{
> -	struct input_dev *input = touch->input;
> -
> -	input->name = touch->client->name;
> -	input->phys = touch->client->adapter->name;
> -	input->id.bustype = BUS_I2C;
> -	input->id.version = synaptics_i2c_word_get(touch->client,
> -						   INFO_QUERY_REG0);
> -	input->dev.parent = &touch->client->dev;
> -	input->open = synaptics_i2c_open;
> -	input->close = synaptics_i2c_close;
> -	input_set_drvdata(input, touch);
> -
> -	/* Register the device as mouse */
> -	__set_bit(EV_REL, input->evbit);
> -	__set_bit(REL_X, input->relbit);
> -	__set_bit(REL_Y, input->relbit);
> -
> -	/* Register device's buttons and keys */
> -	__set_bit(EV_KEY, input->evbit);
> -	__set_bit(BTN_LEFT, input->keybit);
> -}
> -
> -static struct synaptics_i2c *synaptics_i2c_touch_create(struct i2c_client *client)
> -{
> -	struct synaptics_i2c *touch;
> -
> -	touch = kzalloc(sizeof(*touch), GFP_KERNEL);
> -	if (!touch)
> -		return NULL;
> -
> -	touch->client = client;
> -	touch->no_decel_param = no_decel;
> -	touch->scan_rate_param = scan_rate;
> -	set_scan_rate(touch, scan_rate);
> -	INIT_DELAYED_WORK(&touch->dwork, synaptics_i2c_work_handler);
> -
> -	return touch;
> -}
> -
> -static int synaptics_i2c_probe(struct i2c_client *client)
> -{
> -	int ret;
> -	struct synaptics_i2c *touch;
> -
> -	touch = synaptics_i2c_touch_create(client);
> -	if (!touch)
> -		return -ENOMEM;
> -
> -	ret = synaptics_i2c_reset_config(client);
> -	if (ret)
> -		goto err_mem_free;
> -
> -	if (client->irq < 1)
> -		polling_req = true;
> -
> -	touch->input = input_allocate_device();
> -	if (!touch->input) {
> -		ret = -ENOMEM;
> -		goto err_mem_free;
> -	}
> -
> -	synaptics_i2c_set_input_params(touch);
> -
> -	if (!polling_req) {
> -		dev_dbg(&touch->client->dev,
> -			 "Requesting IRQ: %d\n", touch->client->irq);
> -
> -		ret = request_irq(touch->client->irq, synaptics_i2c_irq,
> -				  IRQ_TYPE_EDGE_FALLING,
> -				  DRIVER_NAME, touch);
> -		if (ret) {
> -			dev_warn(&touch->client->dev,
> -				  "IRQ request failed: %d, "
> -				  "falling back to polling\n", ret);
> -			polling_req = true;
> -			synaptics_i2c_reg_set(touch->client,
> -					      INTERRUPT_EN_REG, 0);
> -		}
> -	}
> -
> -	if (polling_req)
> -		dev_dbg(&touch->client->dev,
> -			 "Using polling at rate: %d times/sec\n", scan_rate);
> -
> -	/* Register the device in input subsystem */
> -	ret = input_register_device(touch->input);
> -	if (ret) {
> -		dev_err(&client->dev,
> -			 "Input device register failed: %d\n", ret);
> -		goto err_input_free;
> -	}
> -
> -	i2c_set_clientdata(client, touch);
> -
> -	return 0;
> -
> -err_input_free:
> -	input_free_device(touch->input);
> -err_mem_free:
> -	kfree(touch);
> -
> -	return ret;
> -}
> -
> -static void synaptics_i2c_remove(struct i2c_client *client)
> -{
> -	struct synaptics_i2c *touch = i2c_get_clientdata(client);
> -
> -	if (!polling_req)
> -		free_irq(client->irq, touch);
> -
> -	input_unregister_device(touch->input);
> -	kfree(touch);
> -}
> -
> -static int synaptics_i2c_suspend(struct device *dev)
> -{
> -	struct i2c_client *client = to_i2c_client(dev);
> -	struct synaptics_i2c *touch = i2c_get_clientdata(client);
> -
> -	cancel_delayed_work_sync(&touch->dwork);
> -
> -	/* Save some power */
> -	synaptics_i2c_reg_set(touch->client, DEV_CONTROL_REG, DEEP_SLEEP);
> -
> -	return 0;
> -}
> -
> -static int synaptics_i2c_resume(struct device *dev)
> -{
> -	int ret;
> -	struct i2c_client *client = to_i2c_client(dev);
> -	struct synaptics_i2c *touch = i2c_get_clientdata(client);
> -
> -	ret = synaptics_i2c_reset_config(client);
> -	if (ret)
> -		return ret;
> -
> -	mod_delayed_work(system_wq, &touch->dwork,
> -				msecs_to_jiffies(NO_DATA_SLEEP_MSECS));
> -
> -	return 0;
> -}
> -
> -static DEFINE_SIMPLE_DEV_PM_OPS(synaptics_i2c_pm, synaptics_i2c_suspend,
> -				synaptics_i2c_resume);
> -
> -static const struct i2c_device_id synaptics_i2c_id_table[] = {
> -	{ "synaptics_i2c" },
> -	{ }
> -};
> -MODULE_DEVICE_TABLE(i2c, synaptics_i2c_id_table);
> -
> -#ifdef CONFIG_OF
> -static const struct of_device_id synaptics_i2c_of_match[] = {
> -	{ .compatible = "synaptics,synaptics_i2c", },
> -	{ },
> -};
> -MODULE_DEVICE_TABLE(of, synaptics_i2c_of_match);
> -#endif
> -
> -static struct i2c_driver synaptics_i2c_driver = {
> -	.driver = {
> -		.name	= DRIVER_NAME,
> -		.of_match_table = of_match_ptr(synaptics_i2c_of_match),
> -		.pm	= pm_sleep_ptr(&synaptics_i2c_pm),
> -	},
> -
> -	.probe		= synaptics_i2c_probe,
> -	.remove		= synaptics_i2c_remove,
> -
> -	.id_table	= synaptics_i2c_id_table,
> -};
> -
> -module_i2c_driver(synaptics_i2c_driver);
> -
> -MODULE_DESCRIPTION("Synaptics I2C touchpad driver");
> -MODULE_AUTHOR("Mike Rapoport, Igor Grinberg, Compulab");
> -MODULE_LICENSE("GPL");
> -
> -- 
> 2.52.0.239.gd5f0c6e74e-goog
> 
> 
> -- 
> Dmitry

-- 
Sincerely yours,
Mike.

^ permalink raw reply

* [PATCH] Input: synaptics_i2c - remove the driver
From: Dmitry Torokhov @ 2025-12-12  8:50 UTC (permalink / raw)
  To: linux-kernel; +Cc: Mike Rapoport, Minseong Kim, linux-input

The board support for the device using this Synaptics controller (eXeda
mobile device) has been removed long time ago, it is time to remove the
driver as well.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/mouse/Kconfig         |  18 -
 drivers/input/mouse/Makefile        |   1 -
 drivers/input/mouse/synaptics_i2c.c | 664 ----------------------------
 3 files changed, 683 deletions(-)

diff --git a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig
index 833b643f0616..3638a5ebb51f 100644
--- a/drivers/input/mouse/Kconfig
+++ b/drivers/input/mouse/Kconfig
@@ -404,24 +404,6 @@ config MOUSE_MAPLE
 	  To compile this driver as a module choose M here: the module will be
 	  called maplemouse.
 
-config MOUSE_SYNAPTICS_I2C
-	tristate "Synaptics I2C Touchpad support"
-	depends on I2C
-	help
-	  This driver supports Synaptics I2C touchpad controller on eXeda
-	  mobile device.
-	  The device will not work the synaptics X11 driver because
-	  (i) it  reports only relative coordinates and has no capabilities
-	  to report absolute coordinates
-	  (ii) the eXeda device itself uses Xfbdev as X Server and it does
-	  not allow using xf86-input-* drivers.
-
-	  Say y here if you have eXeda device and want to use a Synaptics
-	  I2C Touchpad.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called synaptics_i2c.
-
 config MOUSE_SYNAPTICS_USB
 	tristate "Synaptics USB device support"
 	depends on USB_ARCH_HAS_HCD
diff --git a/drivers/input/mouse/Makefile b/drivers/input/mouse/Makefile
index a1336d5bee6f..4d6251fbe38b 100644
--- a/drivers/input/mouse/Makefile
+++ b/drivers/input/mouse/Makefile
@@ -19,7 +19,6 @@ obj-$(CONFIG_MOUSE_PC110PAD)		+= pc110pad.o
 obj-$(CONFIG_MOUSE_PS2)			+= psmouse.o
 obj-$(CONFIG_MOUSE_RISCPC)		+= rpcmouse.o
 obj-$(CONFIG_MOUSE_SERIAL)		+= sermouse.o
-obj-$(CONFIG_MOUSE_SYNAPTICS_I2C)	+= synaptics_i2c.o
 obj-$(CONFIG_MOUSE_SYNAPTICS_USB)	+= synaptics_usb.o
 obj-$(CONFIG_MOUSE_VSXXXAA)		+= vsxxxaa.o
 
diff --git a/drivers/input/mouse/synaptics_i2c.c b/drivers/input/mouse/synaptics_i2c.c
deleted file mode 100644
index a0d707e47d93..000000000000
--- a/drivers/input/mouse/synaptics_i2c.c
+++ /dev/null
@@ -1,664 +0,0 @@
-/*
- * Synaptics touchpad with I2C interface
- *
- * Copyright (C) 2009 Compulab, Ltd.
- * Mike Rapoport <mike@compulab.co.il>
- * Igor Grinberg <grinberg@compulab.co.il>
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file COPYING in the main directory of this archive for
- * more details.
- */
-
-#include <linux/module.h>
-#include <linux/i2c.h>
-#include <linux/irq.h>
-#include <linux/interrupt.h>
-#include <linux/input.h>
-#include <linux/delay.h>
-#include <linux/workqueue.h>
-#include <linux/slab.h>
-#include <linux/pm.h>
-
-#define DRIVER_NAME		"synaptics_i2c"
-/* maximum product id is 15 characters */
-#define PRODUCT_ID_LENGTH	15
-#define REGISTER_LENGTH		8
-
-/*
- * after soft reset, we should wait for 1 ms
- * before the device becomes operational
- */
-#define SOFT_RESET_DELAY_US	3000
-/* and after hard reset, we should wait for max 500ms */
-#define HARD_RESET_DELAY_MS	500
-
-/* Registers by SMBus address */
-#define PAGE_SEL_REG		0xff
-#define DEVICE_STATUS_REG	0x09
-
-/* Registers by RMI address */
-#define DEV_CONTROL_REG		0x0000
-#define INTERRUPT_EN_REG	0x0001
-#define ERR_STAT_REG		0x0002
-#define INT_REQ_STAT_REG	0x0003
-#define DEV_COMMAND_REG		0x0004
-
-#define RMI_PROT_VER_REG	0x0200
-#define MANUFACT_ID_REG		0x0201
-#define PHYS_INT_VER_REG	0x0202
-#define PROD_PROPERTY_REG	0x0203
-#define INFO_QUERY_REG0		0x0204
-#define INFO_QUERY_REG1		(INFO_QUERY_REG0 + 1)
-#define INFO_QUERY_REG2		(INFO_QUERY_REG0 + 2)
-#define INFO_QUERY_REG3		(INFO_QUERY_REG0 + 3)
-
-#define PRODUCT_ID_REG0		0x0210
-#define PRODUCT_ID_REG1		(PRODUCT_ID_REG0 + 1)
-#define PRODUCT_ID_REG2		(PRODUCT_ID_REG0 + 2)
-#define PRODUCT_ID_REG3		(PRODUCT_ID_REG0 + 3)
-#define PRODUCT_ID_REG4		(PRODUCT_ID_REG0 + 4)
-#define PRODUCT_ID_REG5		(PRODUCT_ID_REG0 + 5)
-#define PRODUCT_ID_REG6		(PRODUCT_ID_REG0 + 6)
-#define PRODUCT_ID_REG7		(PRODUCT_ID_REG0 + 7)
-#define PRODUCT_ID_REG8		(PRODUCT_ID_REG0 + 8)
-#define PRODUCT_ID_REG9		(PRODUCT_ID_REG0 + 9)
-#define PRODUCT_ID_REG10	(PRODUCT_ID_REG0 + 10)
-#define PRODUCT_ID_REG11	(PRODUCT_ID_REG0 + 11)
-#define PRODUCT_ID_REG12	(PRODUCT_ID_REG0 + 12)
-#define PRODUCT_ID_REG13	(PRODUCT_ID_REG0 + 13)
-#define PRODUCT_ID_REG14	(PRODUCT_ID_REG0 + 14)
-#define PRODUCT_ID_REG15	(PRODUCT_ID_REG0 + 15)
-
-#define DATA_REG0		0x0400
-#define ABS_PRESSURE_REG	0x0401
-#define ABS_MSB_X_REG		0x0402
-#define ABS_LSB_X_REG		(ABS_MSB_X_REG + 1)
-#define ABS_MSB_Y_REG		0x0404
-#define ABS_LSB_Y_REG		(ABS_MSB_Y_REG + 1)
-#define REL_X_REG		0x0406
-#define REL_Y_REG		0x0407
-
-#define DEV_QUERY_REG0		0x1000
-#define DEV_QUERY_REG1		(DEV_QUERY_REG0 + 1)
-#define DEV_QUERY_REG2		(DEV_QUERY_REG0 + 2)
-#define DEV_QUERY_REG3		(DEV_QUERY_REG0 + 3)
-#define DEV_QUERY_REG4		(DEV_QUERY_REG0 + 4)
-#define DEV_QUERY_REG5		(DEV_QUERY_REG0 + 5)
-#define DEV_QUERY_REG6		(DEV_QUERY_REG0 + 6)
-#define DEV_QUERY_REG7		(DEV_QUERY_REG0 + 7)
-#define DEV_QUERY_REG8		(DEV_QUERY_REG0 + 8)
-
-#define GENERAL_2D_CONTROL_REG	0x1041
-#define SENSOR_SENSITIVITY_REG	0x1044
-#define SENS_MAX_POS_MSB_REG	0x1046
-#define SENS_MAX_POS_LSB_REG	(SENS_MAX_POS_UPPER_REG + 1)
-
-/* Register bits */
-/* Device Control Register Bits */
-#define REPORT_RATE_1ST_BIT	6
-
-/* Interrupt Enable Register Bits (INTERRUPT_EN_REG) */
-#define F10_ABS_INT_ENA		0
-#define F10_REL_INT_ENA		1
-#define F20_INT_ENA		2
-
-/* Interrupt Request Register Bits (INT_REQ_STAT_REG | DEVICE_STATUS_REG) */
-#define F10_ABS_INT_REQ		0
-#define F10_REL_INT_REQ		1
-#define F20_INT_REQ		2
-/* Device Status Register Bits (DEVICE_STATUS_REG) */
-#define STAT_CONFIGURED		6
-#define STAT_ERROR		7
-
-/* Device Command Register Bits (DEV_COMMAND_REG) */
-#define RESET_COMMAND		0x01
-#define REZERO_COMMAND		0x02
-
-/* Data Register 0 Bits (DATA_REG0) */
-#define GESTURE			3
-
-/* Device Query Registers Bits */
-/* DEV_QUERY_REG3 */
-#define HAS_PALM_DETECT		1
-#define HAS_MULTI_FING		2
-#define HAS_SCROLLER		4
-#define HAS_2D_SCROLL		5
-
-/* General 2D Control Register Bits (GENERAL_2D_CONTROL_REG) */
-#define NO_DECELERATION		1
-#define REDUCE_REPORTING	3
-#define NO_FILTER		5
-
-/* Function Masks */
-/* Device Control Register Masks (DEV_CONTROL_REG) */
-#define REPORT_RATE_MSK		0xc0
-#define SLEEP_MODE_MSK		0x07
-
-/* Device Sleep Modes */
-#define FULL_AWAKE		0x0
-#define NORMAL_OP		0x1
-#define LOW_PWR_OP		0x2
-#define VERY_LOW_PWR_OP		0x3
-#define SENS_SLEEP		0x4
-#define SLEEP_MOD		0x5
-#define DEEP_SLEEP		0x6
-#define HIBERNATE		0x7
-
-/* Interrupt Register Mask */
-/* (INT_REQ_STAT_REG | DEVICE_STATUS_REG | INTERRUPT_EN_REG) */
-#define INT_ENA_REQ_MSK		0x07
-#define INT_ENA_ABS_MSK		0x01
-#define INT_ENA_REL_MSK		0x02
-#define INT_ENA_F20_MSK		0x04
-
-/* Device Status Register Masks (DEVICE_STATUS_REG) */
-#define CONFIGURED_MSK		0x40
-#define ERROR_MSK		0x80
-
-/* Data Register 0 Masks */
-#define FINGER_WIDTH_MSK	0xf0
-#define GESTURE_MSK		0x08
-#define SENSOR_STATUS_MSK	0x07
-
-/*
- * MSB Position Register Masks
- * ABS_MSB_X_REG | ABS_MSB_Y_REG | SENS_MAX_POS_MSB_REG |
- * DEV_QUERY_REG3 | DEV_QUERY_REG5
- */
-#define MSB_POSITION_MSK	0x1f
-
-/* Device Query Registers Masks */
-
-/* DEV_QUERY_REG2 */
-#define NUM_EXTRA_POS_MSK	0x07
-
-/* When in IRQ mode read the device every THREAD_IRQ_SLEEP_SECS */
-#define THREAD_IRQ_SLEEP_SECS	2
-#define THREAD_IRQ_SLEEP_MSECS	(THREAD_IRQ_SLEEP_SECS * MSEC_PER_SEC)
-
-/*
- * When in Polling mode and no data received for NO_DATA_THRES msecs
- * reduce the polling rate to NO_DATA_SLEEP_MSECS
- */
-#define NO_DATA_THRES		(MSEC_PER_SEC)
-#define NO_DATA_SLEEP_MSECS	(MSEC_PER_SEC / 4)
-
-/* Control touchpad's No Deceleration option */
-static bool no_decel = true;
-module_param(no_decel, bool, 0644);
-MODULE_PARM_DESC(no_decel, "No Deceleration. Default = 1 (on)");
-
-/* Control touchpad's Reduced Reporting option */
-static bool reduce_report;
-module_param(reduce_report, bool, 0644);
-MODULE_PARM_DESC(reduce_report, "Reduced Reporting. Default = 0 (off)");
-
-/* Control touchpad's No Filter option */
-static bool no_filter;
-module_param(no_filter, bool, 0644);
-MODULE_PARM_DESC(no_filter, "No Filter. Default = 0 (off)");
-
-/*
- * touchpad Attention line is Active Low and Open Drain,
- * therefore should be connected to pulled up line
- * and the irq configuration should be set to Falling Edge Trigger
- */
-/* Control IRQ / Polling option */
-static bool polling_req;
-module_param(polling_req, bool, 0444);
-MODULE_PARM_DESC(polling_req, "Request Polling. Default = 0 (use irq)");
-
-/* Control Polling Rate */
-static int scan_rate = 80;
-module_param(scan_rate, int, 0644);
-MODULE_PARM_DESC(scan_rate, "Polling rate in times/sec. Default = 80");
-
-/* The main device structure */
-struct synaptics_i2c {
-	struct i2c_client	*client;
-	struct input_dev	*input;
-	struct delayed_work	dwork;
-	int			no_data_count;
-	int			no_decel_param;
-	int			reduce_report_param;
-	int			no_filter_param;
-	int			scan_rate_param;
-	int			scan_ms;
-};
-
-static inline void set_scan_rate(struct synaptics_i2c *touch, int scan_rate)
-{
-	touch->scan_ms = MSEC_PER_SEC / scan_rate;
-	touch->scan_rate_param = scan_rate;
-}
-
-/*
- * Driver's initial design makes no race condition possible on i2c bus,
- * so there is no need in any locking.
- * Keep it in mind, while playing with the code.
- */
-static s32 synaptics_i2c_reg_get(struct i2c_client *client, u16 reg)
-{
-	int ret;
-
-	ret = i2c_smbus_write_byte_data(client, PAGE_SEL_REG, reg >> 8);
-	if (ret == 0)
-		ret = i2c_smbus_read_byte_data(client, reg & 0xff);
-
-	return ret;
-}
-
-static s32 synaptics_i2c_reg_set(struct i2c_client *client, u16 reg, u8 val)
-{
-	int ret;
-
-	ret = i2c_smbus_write_byte_data(client, PAGE_SEL_REG, reg >> 8);
-	if (ret == 0)
-		ret = i2c_smbus_write_byte_data(client, reg & 0xff, val);
-
-	return ret;
-}
-
-static s32 synaptics_i2c_word_get(struct i2c_client *client, u16 reg)
-{
-	int ret;
-
-	ret = i2c_smbus_write_byte_data(client, PAGE_SEL_REG, reg >> 8);
-	if (ret == 0)
-		ret = i2c_smbus_read_word_data(client, reg & 0xff);
-
-	return ret;
-}
-
-static int synaptics_i2c_config(struct i2c_client *client)
-{
-	int ret, control;
-	u8 int_en;
-
-	/* set Report Rate to Device Highest (>=80) and Sleep to normal */
-	ret = synaptics_i2c_reg_set(client, DEV_CONTROL_REG, 0xc1);
-	if (ret)
-		return ret;
-
-	/* set Interrupt Disable to Func20 / Enable to Func10) */
-	int_en = (polling_req) ? 0 : INT_ENA_ABS_MSK | INT_ENA_REL_MSK;
-	ret = synaptics_i2c_reg_set(client, INTERRUPT_EN_REG, int_en);
-	if (ret)
-		return ret;
-
-	control = synaptics_i2c_reg_get(client, GENERAL_2D_CONTROL_REG);
-	/* No Deceleration */
-	control |= no_decel ? 1 << NO_DECELERATION : 0;
-	/* Reduced Reporting */
-	control |= reduce_report ? 1 << REDUCE_REPORTING : 0;
-	/* No Filter */
-	control |= no_filter ? 1 << NO_FILTER : 0;
-	ret = synaptics_i2c_reg_set(client, GENERAL_2D_CONTROL_REG, control);
-	if (ret)
-		return ret;
-
-	return 0;
-}
-
-static int synaptics_i2c_reset_config(struct i2c_client *client)
-{
-	int ret;
-
-	/* Reset the Touchpad */
-	ret = synaptics_i2c_reg_set(client, DEV_COMMAND_REG, RESET_COMMAND);
-	if (ret) {
-		dev_err(&client->dev, "Unable to reset device\n");
-	} else {
-		usleep_range(SOFT_RESET_DELAY_US, SOFT_RESET_DELAY_US + 100);
-		ret = synaptics_i2c_config(client);
-		if (ret)
-			dev_err(&client->dev, "Unable to config device\n");
-	}
-
-	return ret;
-}
-
-static int synaptics_i2c_check_error(struct i2c_client *client)
-{
-	int status, ret = 0;
-
-	status = i2c_smbus_read_byte_data(client, DEVICE_STATUS_REG) &
-		(CONFIGURED_MSK | ERROR_MSK);
-
-	if (status != CONFIGURED_MSK)
-		ret = synaptics_i2c_reset_config(client);
-
-	return ret;
-}
-
-static bool synaptics_i2c_get_input(struct synaptics_i2c *touch)
-{
-	struct input_dev *input = touch->input;
-	int xy_delta, gesture;
-	s32 data;
-	s8 x_delta, y_delta;
-
-	/* Deal with spontaneous resets and errors */
-	if (synaptics_i2c_check_error(touch->client))
-		return false;
-
-	/* Get Gesture Bit */
-	data = synaptics_i2c_reg_get(touch->client, DATA_REG0);
-	gesture = (data >> GESTURE) & 0x1;
-
-	/*
-	 * Get Relative axes. we have to get them in one shot,
-	 * so we get 2 bytes starting from REL_X_REG.
-	 */
-	xy_delta = synaptics_i2c_word_get(touch->client, REL_X_REG) & 0xffff;
-
-	/* Separate X from Y */
-	x_delta = xy_delta & 0xff;
-	y_delta = (xy_delta >> REGISTER_LENGTH) & 0xff;
-
-	/* Report the button event */
-	input_report_key(input, BTN_LEFT, gesture);
-
-	/* Report the deltas */
-	input_report_rel(input, REL_X, x_delta);
-	input_report_rel(input, REL_Y, -y_delta);
-	input_sync(input);
-
-	return xy_delta || gesture;
-}
-
-static irqreturn_t synaptics_i2c_irq(int irq, void *dev_id)
-{
-	struct synaptics_i2c *touch = dev_id;
-
-	mod_delayed_work(system_wq, &touch->dwork, 0);
-
-	return IRQ_HANDLED;
-}
-
-static void synaptics_i2c_check_params(struct synaptics_i2c *touch)
-{
-	bool reset = false;
-
-	if (scan_rate != touch->scan_rate_param)
-		set_scan_rate(touch, scan_rate);
-
-	if (no_decel != touch->no_decel_param) {
-		touch->no_decel_param = no_decel;
-		reset = true;
-	}
-
-	if (no_filter != touch->no_filter_param) {
-		touch->no_filter_param = no_filter;
-		reset = true;
-	}
-
-	if (reduce_report != touch->reduce_report_param) {
-		touch->reduce_report_param = reduce_report;
-		reset = true;
-	}
-
-	if (reset)
-		synaptics_i2c_reset_config(touch->client);
-}
-
-/* Control the Device polling rate / Work Handler sleep time */
-static unsigned long synaptics_i2c_adjust_delay(struct synaptics_i2c *touch,
-						bool have_data)
-{
-	unsigned long delay, nodata_count_thres;
-
-	if (polling_req) {
-		delay = touch->scan_ms;
-		if (have_data) {
-			touch->no_data_count = 0;
-		} else {
-			nodata_count_thres = NO_DATA_THRES / touch->scan_ms;
-			if (touch->no_data_count < nodata_count_thres)
-				touch->no_data_count++;
-			else
-				delay = NO_DATA_SLEEP_MSECS;
-		}
-		return msecs_to_jiffies(delay);
-	} else {
-		delay = msecs_to_jiffies(THREAD_IRQ_SLEEP_MSECS);
-		return round_jiffies_relative(delay);
-	}
-}
-
-/* Work Handler */
-static void synaptics_i2c_work_handler(struct work_struct *work)
-{
-	bool have_data;
-	struct synaptics_i2c *touch =
-			container_of(work, struct synaptics_i2c, dwork.work);
-	unsigned long delay;
-
-	synaptics_i2c_check_params(touch);
-
-	have_data = synaptics_i2c_get_input(touch);
-	delay = synaptics_i2c_adjust_delay(touch, have_data);
-
-	/*
-	 * While interrupt driven, there is no real need to poll the device.
-	 * But touchpads are very sensitive, so there could be errors
-	 * related to physical environment and the attention line isn't
-	 * necessarily asserted. In such case we can lose the touchpad.
-	 * We poll the device once in THREAD_IRQ_SLEEP_SECS and
-	 * if error is detected, we try to reset and reconfigure the touchpad.
-	 */
-	mod_delayed_work(system_wq, &touch->dwork, delay);
-}
-
-static int synaptics_i2c_open(struct input_dev *input)
-{
-	struct synaptics_i2c *touch = input_get_drvdata(input);
-	int ret;
-
-	ret = synaptics_i2c_reset_config(touch->client);
-	if (ret)
-		return ret;
-
-	if (polling_req)
-		mod_delayed_work(system_wq, &touch->dwork,
-				msecs_to_jiffies(NO_DATA_SLEEP_MSECS));
-
-	return 0;
-}
-
-static void synaptics_i2c_close(struct input_dev *input)
-{
-	struct synaptics_i2c *touch = input_get_drvdata(input);
-
-	if (!polling_req)
-		synaptics_i2c_reg_set(touch->client, INTERRUPT_EN_REG, 0);
-
-	cancel_delayed_work_sync(&touch->dwork);
-
-	/* Save some power */
-	synaptics_i2c_reg_set(touch->client, DEV_CONTROL_REG, DEEP_SLEEP);
-}
-
-static void synaptics_i2c_set_input_params(struct synaptics_i2c *touch)
-{
-	struct input_dev *input = touch->input;
-
-	input->name = touch->client->name;
-	input->phys = touch->client->adapter->name;
-	input->id.bustype = BUS_I2C;
-	input->id.version = synaptics_i2c_word_get(touch->client,
-						   INFO_QUERY_REG0);
-	input->dev.parent = &touch->client->dev;
-	input->open = synaptics_i2c_open;
-	input->close = synaptics_i2c_close;
-	input_set_drvdata(input, touch);
-
-	/* Register the device as mouse */
-	__set_bit(EV_REL, input->evbit);
-	__set_bit(REL_X, input->relbit);
-	__set_bit(REL_Y, input->relbit);
-
-	/* Register device's buttons and keys */
-	__set_bit(EV_KEY, input->evbit);
-	__set_bit(BTN_LEFT, input->keybit);
-}
-
-static struct synaptics_i2c *synaptics_i2c_touch_create(struct i2c_client *client)
-{
-	struct synaptics_i2c *touch;
-
-	touch = kzalloc(sizeof(*touch), GFP_KERNEL);
-	if (!touch)
-		return NULL;
-
-	touch->client = client;
-	touch->no_decel_param = no_decel;
-	touch->scan_rate_param = scan_rate;
-	set_scan_rate(touch, scan_rate);
-	INIT_DELAYED_WORK(&touch->dwork, synaptics_i2c_work_handler);
-
-	return touch;
-}
-
-static int synaptics_i2c_probe(struct i2c_client *client)
-{
-	int ret;
-	struct synaptics_i2c *touch;
-
-	touch = synaptics_i2c_touch_create(client);
-	if (!touch)
-		return -ENOMEM;
-
-	ret = synaptics_i2c_reset_config(client);
-	if (ret)
-		goto err_mem_free;
-
-	if (client->irq < 1)
-		polling_req = true;
-
-	touch->input = input_allocate_device();
-	if (!touch->input) {
-		ret = -ENOMEM;
-		goto err_mem_free;
-	}
-
-	synaptics_i2c_set_input_params(touch);
-
-	if (!polling_req) {
-		dev_dbg(&touch->client->dev,
-			 "Requesting IRQ: %d\n", touch->client->irq);
-
-		ret = request_irq(touch->client->irq, synaptics_i2c_irq,
-				  IRQ_TYPE_EDGE_FALLING,
-				  DRIVER_NAME, touch);
-		if (ret) {
-			dev_warn(&touch->client->dev,
-				  "IRQ request failed: %d, "
-				  "falling back to polling\n", ret);
-			polling_req = true;
-			synaptics_i2c_reg_set(touch->client,
-					      INTERRUPT_EN_REG, 0);
-		}
-	}
-
-	if (polling_req)
-		dev_dbg(&touch->client->dev,
-			 "Using polling at rate: %d times/sec\n", scan_rate);
-
-	/* Register the device in input subsystem */
-	ret = input_register_device(touch->input);
-	if (ret) {
-		dev_err(&client->dev,
-			 "Input device register failed: %d\n", ret);
-		goto err_input_free;
-	}
-
-	i2c_set_clientdata(client, touch);
-
-	return 0;
-
-err_input_free:
-	input_free_device(touch->input);
-err_mem_free:
-	kfree(touch);
-
-	return ret;
-}
-
-static void synaptics_i2c_remove(struct i2c_client *client)
-{
-	struct synaptics_i2c *touch = i2c_get_clientdata(client);
-
-	if (!polling_req)
-		free_irq(client->irq, touch);
-
-	input_unregister_device(touch->input);
-	kfree(touch);
-}
-
-static int synaptics_i2c_suspend(struct device *dev)
-{
-	struct i2c_client *client = to_i2c_client(dev);
-	struct synaptics_i2c *touch = i2c_get_clientdata(client);
-
-	cancel_delayed_work_sync(&touch->dwork);
-
-	/* Save some power */
-	synaptics_i2c_reg_set(touch->client, DEV_CONTROL_REG, DEEP_SLEEP);
-
-	return 0;
-}
-
-static int synaptics_i2c_resume(struct device *dev)
-{
-	int ret;
-	struct i2c_client *client = to_i2c_client(dev);
-	struct synaptics_i2c *touch = i2c_get_clientdata(client);
-
-	ret = synaptics_i2c_reset_config(client);
-	if (ret)
-		return ret;
-
-	mod_delayed_work(system_wq, &touch->dwork,
-				msecs_to_jiffies(NO_DATA_SLEEP_MSECS));
-
-	return 0;
-}
-
-static DEFINE_SIMPLE_DEV_PM_OPS(synaptics_i2c_pm, synaptics_i2c_suspend,
-				synaptics_i2c_resume);
-
-static const struct i2c_device_id synaptics_i2c_id_table[] = {
-	{ "synaptics_i2c" },
-	{ }
-};
-MODULE_DEVICE_TABLE(i2c, synaptics_i2c_id_table);
-
-#ifdef CONFIG_OF
-static const struct of_device_id synaptics_i2c_of_match[] = {
-	{ .compatible = "synaptics,synaptics_i2c", },
-	{ },
-};
-MODULE_DEVICE_TABLE(of, synaptics_i2c_of_match);
-#endif
-
-static struct i2c_driver synaptics_i2c_driver = {
-	.driver = {
-		.name	= DRIVER_NAME,
-		.of_match_table = of_match_ptr(synaptics_i2c_of_match),
-		.pm	= pm_sleep_ptr(&synaptics_i2c_pm),
-	},
-
-	.probe		= synaptics_i2c_probe,
-	.remove		= synaptics_i2c_remove,
-
-	.id_table	= synaptics_i2c_id_table,
-};
-
-module_i2c_driver(synaptics_i2c_driver);
-
-MODULE_DESCRIPTION("Synaptics I2C touchpad driver");
-MODULE_AUTHOR("Mike Rapoport, Igor Grinberg, Compulab");
-MODULE_LICENSE("GPL");
-
-- 
2.52.0.239.gd5f0c6e74e-goog


-- 
Dmitry

^ permalink raw reply related

* Re: [PATCH v2] input: lkkbd: disable pending work before freeing device
From: Dmitry Torokhov @ 2025-12-12  8:46 UTC (permalink / raw)
  To: Minseong Kim; +Cc: linux-input, linux-kernel, stable
In-Reply-To: <20251212052314.16139-1-ii4gsp@gmail.com>

On Fri, Dec 12, 2025 at 02:23:14PM +0900, Minseong Kim wrote:
> lkkbd_interrupt() schedules lk->tq via schedule_work(), and the work
> handler lkkbd_reinit() dereferences the lkkbd structure and its
> serio/input_dev fields.
> 
> lkkbd_disconnect() and error paths in lkkbd_connect() free the lkkbd
> structure without preventing the reinit work from being queued again
> until serio_close() returns. This can allow the work handler to run
> after the structure has been freed, leading to a potential use-after-free.
> 
> Use disable_work_sync() instead of cancel_work_sync() to ensure the
> reinit work cannot be re-queued, and call it both in lkkbd_disconnect()
> and in lkkbd_connect() error paths after serio_open().
> 
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Cc: stable@vger.kernel.org
> Signed-off-by: Minseong Kim <ii4gsp@gmail.com>

Applied, thank you.

-- 
Dmitry

^ permalink raw reply

* Re: [PATCH] HID: validate report length and constants
From: Davide Beatrici @ 2025-12-12  6:22 UTC (permalink / raw)
  To: Benjamin Tissoires
  Cc: Terry Junge, linux-kernel, linux-input, jikos, benjamin.tissoires
In-Reply-To: <iq4fdv5yak7xqiitlsmglsulsdzqaklsqdcv2rxswsduwqxfpy@lknyfow3yxwg>

> IMO, the simplest is the HID-BPF route, as it's a matter of going to 
> the
> udev-hid-bpf project [1], add your program in the testing dir, and
> submit a merge request. This way your device will be fixed and I'll
> eventually take care of putting the HID-BPF program in
> drivers/hid/bpf/progs so it gets installed in all distributions.

I apologize for the delay, I had to figure out why OpenMandriva's kernel 
was
not exposing the hid_bpf_ops structure.

Turns out CONFIG_HID_BPF had to be enabled and CONFIG_FUNCTION_TRACER 
too.

Here's the merge request for udev-hid-bpf:
https://gitlab.freedesktop.org/libevdev/udev-hid-bpf/-/merge_requests/212

> have a new kernel driver for this device which maps to .raw_event()
> and rejects reports of size 1.

I actually just realized my previous mouse, a Kysona M600, has a 
specific
driver (hid-kysona) that seemingly handles battery status reports.

That may be the cause for it randomly stopping registering clicks and 
scrolls
until it is moved (i.e. registers a movement).

But that's a story for another thread!

I wonder if we can put together a single universal driver for these 
devices...

^ permalink raw reply

* [PATCH v2] input: lkkbd: disable pending work before freeing device
From: Minseong Kim @ 2025-12-12  5:23 UTC (permalink / raw)
  To: dmitry.torokhov; +Cc: linux-input, linux-kernel, stable
In-Reply-To: <20251211031131.27141-1-ii4gsp@gmail.com>

lkkbd_interrupt() schedules lk->tq via schedule_work(), and the work
handler lkkbd_reinit() dereferences the lkkbd structure and its
serio/input_dev fields.

lkkbd_disconnect() and error paths in lkkbd_connect() free the lkkbd
structure without preventing the reinit work from being queued again
until serio_close() returns. This can allow the work handler to run
after the structure has been freed, leading to a potential use-after-free.

Use disable_work_sync() instead of cancel_work_sync() to ensure the
reinit work cannot be re-queued, and call it both in lkkbd_disconnect()
and in lkkbd_connect() error paths after serio_open().

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc: stable@vger.kernel.org
Signed-off-by: Minseong Kim <ii4gsp@gmail.com>
---
 drivers/input/keyboard/lkkbd.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/input/keyboard/lkkbd.c b/drivers/input/keyboard/lkkbd.c
index c035216dd27c..12a467ce00b5 100644
--- a/drivers/input/keyboard/lkkbd.c
+++ b/drivers/input/keyboard/lkkbd.c
@@ -670,7 +670,8 @@ static int lkkbd_connect(struct serio *serio, struct serio_driver *drv)
 
 	return 0;
 
- fail3:	serio_close(serio);
+ fail3: disable_work_sync(&lk->tq);
+	serio_close(serio);
  fail2:	serio_set_drvdata(serio, NULL);
  fail1:	input_free_device(input_dev);
 	kfree(lk);
@@ -684,6 +685,8 @@ static void lkkbd_disconnect(struct serio *serio)
 {
 	struct lkkbd *lk = serio_get_drvdata(serio);
 
+	disable_work_sync(&lk->tq);
+
 	input_get_device(lk->dev);
 	input_unregister_device(lk->dev);
 	serio_close(serio);
-- 
2.34.1


^ permalink raw reply related

* [PATCH] input: lkkbd: disable pending work before freeing device
From: Minseong Kim @ 2025-12-12  5:16 UTC (permalink / raw)
  To: linux-input; +Cc: dmitry.torokhov, linux-kernel, stable
In-Reply-To: <20251211031131.27141-1-ii4gsp@gmail.com>

lkkbd_interrupt() schedules lk->tq via schedule_work(), and the work
handler lkkbd_reinit() dereferences the lkkbd structure and its
serio/input_dev fields.

lkkbd_disconnect() and error paths in lkkbd_connect() free the lkkbd
structure without preventing the reinit work from being queued again
until serio_close() returns. This can allow the work handler to run
after the structure has been freed, leading to a potential use-after-free.

Use disable_work_sync() instead of cancel_work_sync() to ensure the
reinit work cannot be re-queued, and call it both in lkkbd_disconnect()
and in lkkbd_connect() error paths after serio_open().

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc: stable@vger.kernel.org
Signed-off-by: Minseong Kim <ii4gsp@gmail.com>
---
 drivers/input/keyboard/lkkbd.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/input/keyboard/lkkbd.c b/drivers/input/keyboard/lkkbd.c
index c035216dd27c..12a467ce00b5 100644
--- a/drivers/input/keyboard/lkkbd.c
+++ b/drivers/input/keyboard/lkkbd.c
@@ -670,7 +670,8 @@ static int lkkbd_connect(struct serio *serio, struct serio_driver *drv)
 
 	return 0;
 
- fail3:	serio_close(serio);
+ fail3: disable_work_sync(&lk->tq);
+	serio_close(serio);
  fail2:	serio_set_drvdata(serio, NULL);
  fail1:	input_free_device(input_dev);
 	kfree(lk);
@@ -684,6 +685,8 @@ static void lkkbd_disconnect(struct serio *serio)
 {
 	struct lkkbd *lk = serio_get_drvdata(serio);
 
+	disable_work_sync(&lk->tq);
+
 	input_get_device(lk->dev);
 	input_unregister_device(lk->dev);
 	serio_close(serio);
-- 
2.34.1


^ permalink raw reply related

* [PATCH] input: lkkbd: disable pending work before freeing device
From: Minseong Kim @ 2025-12-12  5:14 UTC (permalink / raw)
  To: dmitry.torokhov; +Cc: linux-input, linux-kernel, stable
In-Reply-To: <20251211031131.27141-1-ii4gsp@gmail.com>

lkkbd_interrupt() schedules lk->tq via schedule_work(), and the work
handler lkkbd_reinit() dereferences the lkkbd structure and its
serio/input_dev fields.

lkkbd_disconnect() and error paths in lkkbd_connect() free the lkkbd
structure without preventing the reinit work from being queued again
until serio_close() returns. This can allow the work handler to run
after the structure has been freed, leading to a potential use-after-free.

Use disable_work_sync() instead of cancel_work_sync() to ensure the
reinit work cannot be re-queued, and call it both in lkkbd_disconnect()
and in lkkbd_connect() error paths after serio_open().

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc: stable@vger.kernel.org
Signed-off-by: Minseong Kim <ii4gsp@gmail.com>
---
 drivers/input/keyboard/lkkbd.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/input/keyboard/lkkbd.c b/drivers/input/keyboard/lkkbd.c
index c035216dd27c..12a467ce00b5 100644
--- a/drivers/input/keyboard/lkkbd.c
+++ b/drivers/input/keyboard/lkkbd.c
@@ -670,7 +670,8 @@ static int lkkbd_connect(struct serio *serio, struct serio_driver *drv)
 
 	return 0;
 
- fail3:	serio_close(serio);
+ fail3: disable_work_sync(&lk->tq);
+	serio_close(serio);
  fail2:	serio_set_drvdata(serio, NULL);
  fail1:	input_free_device(input_dev);
 	kfree(lk);
@@ -684,6 +685,8 @@ static void lkkbd_disconnect(struct serio *serio)
 {
 	struct lkkbd *lk = serio_get_drvdata(serio);
 
+	disable_work_sync(&lk->tq);
+
 	input_get_device(lk->dev);
 	input_unregister_device(lk->dev);
 	serio_close(serio);
-- 
2.34.1


^ permalink raw reply related

* Re: [PATCH v1 3/3] dt-bindings: google,cros-ec-keyb: add fn-key and f-keymap props
From: Dmitry Torokhov @ 2025-12-12  4:44 UTC (permalink / raw)
  To: Fabio Baltieri
  Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Benson Leung,
	Guenter Roeck, Tzung-Bi Shih, Simon Glass, linux-input,
	devicetree, chrome-platform, linux-kernel
In-Reply-To: <aTm1PVLrS7Ra0OTF@google.com>

On Wed, Dec 10, 2025 at 06:00:29PM +0000, Fabio Baltieri wrote:
> Hey Rob, thanks for the review.
> 
> On Tue, Dec 09, 2025 at 01:22:43PM -0600, Rob Herring wrote:
> > On Tue, Dec 09, 2025 at 03:47:06PM +0000, Fabio Baltieri wrote:
> > > +  fn-key:
> > > +    $ref: /schemas/types.yaml#/definitions/uint32
> > > +    description: |
> > > +      An u32 containing the coordinate of the Fn key, use the MATRIX_KEY(row,
> > > +      col, code) macro, code is ignored.
> > > +
> > > +  fn-keymap:
> > 
> > If keymap is linux,keymap, then this should perhaps be linux,fn-keymap. 
> > Depends if we still think linux,keymap is Linux specific?
> 
> I'm open for suggestions, trying to understand the pattern, these are
> specific to this binding I think if anything they should be
> google,fn-key and google,fn-keymap, similarly to the existing
> google,needs-ghost-filter -- no idea why function-row-physmap was not
> prefixed but I guess it slipped in and now it's not worth changing it.

Just double the number of rows in the regular keymap to accommodate the
FN modifier, no need for separate keymap. Also no need to have fn-key
property, use whatever key that reports KEY_FN. See how it is done in
drivers/input/keyboard/tegra-kbc.c

Thanks.

-- 
Dmitry

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox