platform/x86: x86-android-tablets: Fix keyboard touchscreen on Lenovo Yogabook1 X90
After commit 4014ae236b1d ("platform/x86: x86-android-tablets: Stop using gpiolib private APIs") the touchscreen in the keyboard half of the Lenovo Yogabook1 X90 stopped working with the following error: Goodix-TS i2c-goodix_ts: error -EBUSY: Failed to get irq GPIO The problem is that when getting the IRQ for instantiated i2c_client-s from a GPIO (rather then using an IRQ directly from the IOAPIC), x86_acpi_irq_helper_get() now properly requests the GPIO, which disallows other drivers from requesting it. Normally this is a good thing, but the goodix touchscreen also uses the IRQ as an output during reset to select which of its 2 possible I2C addresses should be used. Add a new free_gpio flag to struct x86_acpi_irq_data to deal with this and release the GPIO after getting the IRQ in this special case. Fixes: 4014ae236b1d ("platform/x86: x86-android-tablets: Stop using gpiolib private APIs") Cc: stable@vger.kernel.org Signed-off-by: Hans de Goede <hdegoede@redhat.com> Link: https://lore.kernel.org/r/20240216201721.239791-2-hdegoede@redhat.com
This commit is contained in:
parent
76d41fb063
commit
bd8905d709
@ -113,6 +113,9 @@ int x86_acpi_irq_helper_get(const struct x86_acpi_irq_data *data)
|
||||
if (irq_type != IRQ_TYPE_NONE && irq_type != irq_get_trigger_type(irq))
|
||||
irq_set_irq_type(irq, irq_type);
|
||||
|
||||
if (data->free_gpio)
|
||||
devm_gpiod_put(&x86_android_tablet_device->dev, gpiod);
|
||||
|
||||
return irq;
|
||||
case X86_ACPI_IRQ_TYPE_PMIC:
|
||||
status = acpi_get_handle(NULL, data->chip, &handle);
|
||||
|
@ -116,6 +116,7 @@ static const struct x86_i2c_client_info lenovo_yb1_x90_i2c_clients[] __initconst
|
||||
.trigger = ACPI_EDGE_SENSITIVE,
|
||||
.polarity = ACPI_ACTIVE_LOW,
|
||||
.con_id = "goodix_ts_irq",
|
||||
.free_gpio = true,
|
||||
},
|
||||
}, {
|
||||
/* Wacom Digitizer in keyboard half */
|
||||
|
@ -39,6 +39,7 @@ struct x86_acpi_irq_data {
|
||||
int index;
|
||||
int trigger; /* ACPI_EDGE_SENSITIVE / ACPI_LEVEL_SENSITIVE */
|
||||
int polarity; /* ACPI_ACTIVE_HIGH / ACPI_ACTIVE_LOW / ACPI_ACTIVE_BOTH */
|
||||
bool free_gpio; /* Release GPIO after getting IRQ (for TYPE_GPIOINT) */
|
||||
const char *con_id;
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user