* 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
* [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
* [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 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
* 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
* 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
* [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] 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
* 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
* [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 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
* 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 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] 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
* [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
* [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
* [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
* 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] 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
* [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
* 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
* 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
* [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
* [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 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
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox