From 0f45f98d312ba6fe660b6aa70d0150f74f62ea3a Mon Sep 17 00:00:00 2001 From: Wentao Guan Date: Fri, 23 Oct 2026 18:52:18 +0800 Subject: [PATCH] Input: i8042 - drop the _CRS guess from the KBC skip list The _CRS heuristic cannot tell the boards apart. Both the working laptop and the affected desktop describe the controller with _DSD and no _CRS at all, so the check would drop the KBC on every desktop instead of only where it cannot be used. Drop it and the helpers it needed. The KaiTian board answers its controller (the self test returns 0x55), so it comes off the list too; only the 706 machines the Kylin LPC driver keeps disabled are skipped. Signed-off-by: Wentao Guan --- drivers/input/serio/i8042-phytio.h | 66 +----------------------------- 1 file changed, 2 insertions(+), 64 deletions(-) diff --git a/drivers/input/serio/i8042-phytio.h b/drivers/input/serio/i8042-phytio.h index 70e85bbcf1b2..47029203e401 100644 --- a/drivers/input/serio/i8042-phytio.h +++ b/drivers/input/serio/i8042-phytio.h @@ -6,8 +6,6 @@ #ifndef _I8042_PHYTIO_H #define _I8042_PHYTIO_H -#include -#include #include #include #include @@ -64,15 +62,10 @@ static inline void i8042_write_command(int val) } /* - * Boards that publish a KBCI8042 node but leave nothing behind the legacy - * ports: a read of 0x60/0x64 never completes, so i8042_probe() hangs. + * Boards whose keyboard controller cannot be used: touching 0x60/0x64 there + * hangs the machine before anything can be reported. */ static const struct dmi_system_id phytium_i8042_skip[] = { - { - .matches = { - DMI_MATCH(DMI_BOARD_NAME, "FD2000ZX200MB1"), - }, - }, /* 706 laptops, as listed by the Kylin LPC driver. */ { .matches = { @@ -107,55 +100,11 @@ static const struct dmi_system_id phytium_i8042_skip[] = { { } }; -static inline bool phytium_i8042_acpi_described(void) -{ - return IS_ENABLED(CONFIG_ACPI) && - acpi_dev_present("KBCI8042", NULL, -1); -} - -#ifdef CONFIG_ACPI -static int phytium_i8042_io_cb(struct acpi_resource *ares, void *data) -{ - bool *found = data; - - if (ares->type == ACPI_RESOURCE_TYPE_IO && - ares->data.io.minimum <= 0x60 && ares->data.io.maximum >= 0x64) - *found = true; - - return 1; -} - -/* Does _CRS describe the controller's own ports? */ -static inline bool phytium_i8042_acpi_has_ports(void) -{ - struct acpi_device *adev; - LIST_HEAD(res); - bool found = false; - - adev = acpi_dev_get_first_match_dev("KBCI8042", NULL, -1); - if (!adev) - return false; - - acpi_dev_get_resources(adev, &res, phytium_i8042_io_cb, &found); - acpi_dev_free_resource_list(&res); - acpi_dev_put(adev); - - return found; -} -#else -static inline bool phytium_i8042_acpi_has_ports(void) -{ - return true; -} -#endif - /* * Platform initialization */ static inline int i8042_platform_init(void) { - bool described = phytium_i8042_acpi_described(); - bool laptop; int kbd_irq, aux_irq; /* Check if we're running on Phytium CPU */ @@ -169,17 +118,6 @@ static inline int i8042_platform_init(void) return -ENODEV; } - /* - * Probe like before unless the firmware documents the controller - * without its ports. Laptops keep probing: an internal keyboard may - * be the only input. - */ - laptop = !IS_ENABLED(CONFIG_DMI) || chassis_types_is_laptop(); - if (described && !laptop && !phytium_i8042_acpi_has_ports()) { - pr_info("KBC has no ports described, skipping\n"); - return -ENODEV; - } - /* * The PIO controller hands out one Linux irq per latch bit and clears * the latch itself, so the irq is not shared with the other legacy