|
@@ -30,6 +30,7 @@
|
|
#include <linux/input.h>
|
|
#include <linux/input.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/acpi.h>
|
|
#include <linux/acpi.h>
|
|
|
|
+#include <linux/dmi.h>
|
|
#include <acpi/button.h>
|
|
#include <acpi/button.h>
|
|
|
|
|
|
#define PREFIX "ACPI: "
|
|
#define PREFIX "ACPI: "
|
|
@@ -76,6 +77,22 @@ static const struct acpi_device_id button_device_ids[] = {
|
|
};
|
|
};
|
|
MODULE_DEVICE_TABLE(acpi, button_device_ids);
|
|
MODULE_DEVICE_TABLE(acpi, button_device_ids);
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Some devices which don't even have a lid in anyway have a broken _LID
|
|
|
|
+ * method (e.g. pointing to a floating gpio pin) causing spurious LID events.
|
|
|
|
+ */
|
|
|
|
+static const struct dmi_system_id lid_blacklst[] = {
|
|
|
|
+ {
|
|
|
|
+ /* GP-electronic T701 */
|
|
|
|
+ .matches = {
|
|
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
|
|
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "T701"),
|
|
|
|
+ DMI_MATCH(DMI_BIOS_VERSION, "BYT70A.YNCHENG.WIN.007"),
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ {}
|
|
|
|
+};
|
|
|
|
+
|
|
static int acpi_button_add(struct acpi_device *device);
|
|
static int acpi_button_add(struct acpi_device *device);
|
|
static int acpi_button_remove(struct acpi_device *device);
|
|
static int acpi_button_remove(struct acpi_device *device);
|
|
static void acpi_button_notify(struct acpi_device *device, u32 event);
|
|
static void acpi_button_notify(struct acpi_device *device, u32 event);
|
|
@@ -475,6 +492,9 @@ static int acpi_button_add(struct acpi_device *device)
|
|
char *name, *class;
|
|
char *name, *class;
|
|
int error;
|
|
int error;
|
|
|
|
|
|
|
|
+ if (!strcmp(hid, ACPI_BUTTON_HID_LID) && dmi_check_system(lid_blacklst))
|
|
|
|
+ return -ENODEV;
|
|
|
|
+
|
|
button = kzalloc(sizeof(struct acpi_button), GFP_KERNEL);
|
|
button = kzalloc(sizeof(struct acpi_button), GFP_KERNEL);
|
|
if (!button)
|
|
if (!button)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|