From fd4fb1f6633b21042ff084868323e15e708fe1cd Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Sun, 1 Jan 2017 22:11:20 +0100 Subject: [PATCH 16/16] Input: silead: Do not try to directly access the GPIO when using ACPI pm On some x86 tablets we cannot directly access the GPIOs as they are claimed by the ACPI tables, so check it the i2c client is not being power-managed by ACPI before trying to get the power pin GPIO. Note this is a workaround patch to fix this until Andy' gpiolib-ACPI patches which make gpiolib more strict land, once those are landed this patch is no longer needed. Signed-off-by: Hans de Goede --- drivers/input/touchscreen/silead.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/drivers/input/touchscreen/silead.c b/drivers/input/touchscreen/silead.c index c0ba40c09699..30fba3cbe277 100644 --- a/drivers/input/touchscreen/silead.c +++ b/drivers/input/touchscreen/silead.c @@ -31,6 +31,7 @@ #include #include +#include #include #define SILEAD_TS_NAME "silead_ts" @@ -517,12 +518,21 @@ static int silead_ts_probe(struct i2c_client *client, if (error) return error; - /* Power GPIO pin */ - data->gpio_power = devm_gpiod_get_optional(dev, "power", GPIOD_OUT_LOW); - if (IS_ERR(data->gpio_power)) { - if (PTR_ERR(data->gpio_power) != -EPROBE_DEFER) - dev_err(dev, "Shutdown GPIO request failed\n"); - return PTR_ERR(data->gpio_power); + /* + * If device power is not managed by ACPI, get the power_gpio + * and manage it ourselves. + */ +#ifdef CONFIG_ACPI + if (!acpi_bus_power_manageable(ACPI_HANDLE(dev))) +#endif + { + data->gpio_power = devm_gpiod_get_optional(dev, "power", + GPIOD_OUT_LOW); + if (IS_ERR(data->gpio_power)) { + if (PTR_ERR(data->gpio_power) != -EPROBE_DEFER) + dev_err(dev, "Power GPIO request failed\n"); + return PTR_ERR(data->gpio_power); + } } error = silead_ts_setup(client); -- 2.13.0