Commit 62face0f authored by Hans de Goede's avatar Hans de Goede Committed by sanglipeng
Browse files

Input: soc_button_array - add invalid acpi_index DMI quirk handling

stable inclusion
from stable-v5.10.186
commit fe949c1662c98a7ea5eeb91f62c3698950726c8f
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I8J4KH

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=fe949c1662c98a7ea5eeb91f62c3698950726c8f



--------------------------------

[ Upstream commit 20a99a29 ]

Some devices have a wrong entry in their button array which points to
a GPIO which is required in another driver, so soc_button_array must
not claim it.

A specific example of this is the Lenovo Yoga Book X90F / X90L,
where the PNP0C40 home button entry points to a GPIO which is not
a home button and which is required by the lenovo-yogabook driver.

Add a DMI quirk table which can specify an ACPI GPIO resource index which
should be skipped; and add an entry for the Lenovo Yoga Book X90F / X90L
to this new DMI quirk table.

Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20230414072116.4497-1-hdegoede@redhat.com


Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarsanglipeng <sanglipeng1@jd.com>
parent 98cbe1e9
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -108,6 +108,27 @@ static const struct dmi_system_id dmi_use_low_level_irq[] = {
	{} /* Terminating entry */
};

/*
 * 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.
 */
@@ -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) {
			/*