platform/x86: x86-android-tablets: Fix broken touchscreen on Chuwi Hi8 with Windows...
authorHans de Goede <hdegoede@redhat.com>
Wed, 10 Aug 2022 14:19:34 +0000 (16:19 +0200)
committerHans de Goede <hdegoede@redhat.com>
Mon, 15 Aug 2022 11:20:28 +0000 (13:20 +0200)
The x86-android-tablets handling for the Chuwi Hi8 is only necessary with
the Android BIOS and it is causing problems with the Windows BIOS version.

Specifically when trying to register the already present touchscreen
x86_acpi_irq_helper_get() calls acpi_unregister_gsi(), this breaks
the working of the touchscreen and also leads to an oops:

[   14.248946] ------------[ cut here ]------------
[   14.248954] remove_proc_entry: removing non-empty directory 'irq/75', leaking at least 'MSSL0001:00'
[   14.248983] WARNING: CPU: 3 PID: 440 at fs/proc/generic.c:718 remove_proc_entry
...
[   14.249293]  unregister_irq_proc+0xe0/0x100
[   14.249305]  free_desc+0x29/0x70
[   14.249312]  irq_free_descs+0x4b/0x80
[   14.249320]  mp_unmap_irq+0x5c/0x60
[   14.249329]  acpi_unregister_gsi_ioapic+0x2a/0x40
[   14.249338]  x86_acpi_irq_helper_get+0x4b/0x190 [x86_android_tablets]
[   14.249355]  x86_android_tablet_init+0x178/0xe34 [x86_android_tablets]

Add an init callback for the Chuwi Hi8, which detects when the Windows BIOS
is in use and exits with -ENODEV in that case, fixing this.

Fixes: 84c2dcdd475f ("platform/x86: x86-android-tablets: Add an init() callback to struct x86_dev_info")
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20220810141934.140771-1-hdegoede@redhat.com
drivers/platform/x86/x86-android-tablets.c

index 4803759..4acd6fa 100644 (file)
@@ -663,9 +663,23 @@ static const struct x86_i2c_client_info chuwi_hi8_i2c_clients[] __initconst = {
        },
 };
 
+static int __init chuwi_hi8_init(void)
+{
+       /*
+        * Avoid the acpi_unregister_gsi() call in x86_acpi_irq_helper_get()
+        * breaking the touchscreen + logging various errors when the Windows
+        * BIOS is used.
+        */
+       if (acpi_dev_present("MSSL0001", NULL, 1))
+               return -ENODEV;
+
+       return 0;
+}
+
 static const struct x86_dev_info chuwi_hi8_info __initconst = {
        .i2c_client_info = chuwi_hi8_i2c_clients,
        .i2c_client_count = ARRAY_SIZE(chuwi_hi8_i2c_clients),
+       .init = chuwi_hi8_init,
 };
 
 #define CZC_EC_EXTRA_PORT      0x68