diff options
Diffstat (limited to 'drivers/input/misc/soc_button_array.c')
| -rw-r--r-- | drivers/input/misc/soc_button_array.c | 30 | 
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c index 09489380afda..e79f5497948b 100644 --- a/drivers/input/misc/soc_button_array.c +++ b/drivers/input/misc/soc_button_array.c @@ -109,6 +109,27 @@ static const struct dmi_system_id dmi_use_low_level_irq[] = {  };  /* + * Some devices have a wrong entry which points to a GPIO which is + * required in another driver, so this driver must not claim it. + */ +static const struct dmi_system_id dmi_invalid_acpi_index[] = { +	{ +		/* +		 * Lenovo Yoga Book X90F / X90L, the PNP0C40 home button entry +		 * points to a GPIO which is not a home button and which is +		 * required by the lenovo-yogabook driver. +		 */ +		.matches = { +			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), +			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"), +			DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "YETI-11"), +		}, +		.driver_data = (void *)1l, +	}, +	{} /* Terminating entry */ +}; + +/*   * Get the Nth GPIO number from the ACPI object.   */  static int soc_button_lookup_gpio(struct device *dev, int acpi_index, @@ -137,6 +158,8 @@ soc_button_device_create(struct platform_device *pdev,  	struct platform_device *pd;  	struct gpio_keys_button *gpio_keys;  	struct gpio_keys_platform_data *gpio_keys_pdata; +	const struct dmi_system_id *dmi_id; +	int invalid_acpi_index = -1;  	int error, gpio, irq;  	int n_buttons = 0; @@ -154,10 +177,17 @@ soc_button_device_create(struct platform_device *pdev,  	gpio_keys = (void *)(gpio_keys_pdata + 1);  	n_buttons = 0; +	dmi_id = dmi_first_match(dmi_invalid_acpi_index); +	if (dmi_id) +		invalid_acpi_index = (long)dmi_id->driver_data; +  	for (info = button_info; info->name; info++) {  		if (info->autorepeat != autorepeat)  			continue; +		if (info->acpi_index == invalid_acpi_index) +			continue; +  		error = soc_button_lookup_gpio(&pdev->dev, info->acpi_index, &gpio, &irq);  		if (error || irq < 0) {  			/*  | 
