linux/drivers/input/touchscreen
Hans de Goede 423622a90a Input: goodix - ensure int GPIO is in input for gpio_count == 1 && gpio_int_idx == 0 case
Add a special case for gpio_count == 1 && gpio_int_idx == 0 to
goodix_add_acpi_gpio_mappings().

It seems that on newer x86/ACPI devices the reset and irq GPIOs are no
longer listed as GPIO resources instead there is only 1 GpioInt resource
and _PS0 does the whole reset sequence for us.

This means that we must call acpi_device_fix_up_power() on these devices
to ensure that the chip is reset before we try to use it.

This part was already fixed in commit 3de93e6ed2 ("Input: goodix - call
acpi_device_fix_up_power() in some cases") by adding a call to
acpi_device_fix_up_power() to the generic "Unexpected ACPI resources"
catch all.

But it turns out that this case on some hw needs some more special
handling. Specifically the firmware may bootup with the IRQ pin in
output mode. The reset sequence from ACPI _PS0 (executed by
acpi_device_fix_up_power()) should put the pin in input mode,
but the GPIO subsystem has cached the direction at bootup, causing
request_irq() to fail due to gpiochip_lock_as_irq() failure:

[    9.119864] Goodix-TS i2c-GDIX1002:00: Unexpected ACPI resources: gpio_count 1, gpio_int_idx 0
[    9.317443] Goodix-TS i2c-GDIX1002:00: ID 911, version: 1060
[    9.321902] input: Goodix Capacitive TouchScreen as /devices/pci0000:00/0000:00:17.0/i2c_designware.4/i2c-5/i2c-GDIX1002:00/input/input8
[    9.327840] gpio gpiochip0: (INT3453:00): gpiochip_lock_as_irq: tried to flag a GPIO set as output for IRQ
[    9.327856] gpio gpiochip0: (INT3453:00): unable to lock HW IRQ 26 for IRQ
[    9.327861] genirq: Failed to request resources for GDIX1002:00 (irq 131) on irqchip intel-gpio
[    9.327912] Goodix-TS i2c-GDIX1002:00: request IRQ failed: -5

Fix this by adding a special case for gpio_count == 1 && gpio_int_idx == 0
which adds an ACPI GPIO lookup table for the int GPIO even though we cannot
use it for reset purposes (as there is no reset GPIO).

Adding the lookup will make the gpiod_int = gpiod_get(..., GPIOD_IN) call
succeed, which will explicitly set the direction to input fixing the issue.

Note this re-uses the acpi_goodix_int_first_gpios[] lookup table, since
there is only 1 GPIO in the ACPI resources the reset entry in that
lookup table will amount to a no-op.

Reported-and-tested-by: Michael Smith <1973.mjsmith@gmail.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20231003215144.69527-1-hdegoede@redhat.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
2023-10-04 07:21:45 -07:00
..
88pm860x-ts.c
Kconfig Input: add support for Azoteq IQS7210A/7211A/E 2023-07-12 14:32:44 -07:00
Makefile Input: add support for Azoteq IQS7210A/7211A/E 2023-07-12 14:32:44 -07:00
ad7877.c Input: ad7877 - switch to DEFINE_SIMPLE_DEV_PM_OPS() and pm_sleep_ptr() 2023-01-09 20:25:23 -08:00
ad7879-i2c.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
ad7879-spi.c
ad7879.c
ad7879.h
ads7846.c gpiolib: remove gpio_set_debounce() 2023-03-06 12:33:01 +02:00
ar1021_i2c.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
atmel_mxt_ts.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
auo-pixcir-ts.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
bcm_iproc_tsc.c Input: bcm_iproc_tsc - drop of_match_ptr for ID table 2023-03-17 04:17:37 -07:00
bu21013_ts.c Input: bu21013_ts - use local 'client->dev' variable in probe() 2023-07-07 16:54:30 -07:00
bu21029_ts.c Input: bu21029_ts - use local 'client->dev' variable in probe() 2023-07-07 16:54:30 -07:00
chipone_icn8318.c Input: chipone_icn8318 - simplify with dev_err_probe() 2023-07-07 16:54:28 -07:00
chipone_icn8505.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
colibri-vf50-ts.c
cy8ctma140.c Input: cy8ctma140 - simplify with dev_err_probe() 2023-07-07 16:54:28 -07:00
cy8ctmg110_ts.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
cyttsp4_core.c Input: cyttsp4_core - change del_timer_sync() to timer_shutdown_sync() 2023-05-01 17:50:16 -07:00
cyttsp4_core.h
cyttsp4_i2c.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
cyttsp4_spi.c Input: cyttsp4 - use EXPORT_GPL_RUNTIME_DEV_PM_OPS() 2023-01-27 14:49:53 -08:00
cyttsp5.c Input: Explicitly include correct DT includes 2023-07-17 10:03:07 -07:00
cyttsp_core.c Input: cyttsp - use EXPORT_GPL_SIMPLE_DEV_PM_OPS() 2023-01-27 14:49:53 -08:00
cyttsp_core.h Input: cyttsp - remove public header 2021-06-01 21:13:11 -07:00
cyttsp_i2c.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
cyttsp_i2c_common.c
cyttsp_spi.c Input: cyttsp - use EXPORT_GPL_SIMPLE_DEV_PM_OPS() 2023-01-27 14:49:53 -08:00
da9034-ts.c
da9052_tsi.c
dynapro.c
edt-ft5x06.c Input: edf-ft5x06 - simplify with dev_err_probe() 2023-07-07 16:54:28 -07:00
eeti_ts.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
egalax_ts.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
egalax_ts_serial.c
ektf2127.c Input: ektf2127 - simplify with dev_err_probe() 2023-07-07 16:54:28 -07:00
elants_i2c.c Input: elants_i2c - simplify with dev_err_probe() 2023-07-07 16:54:28 -07:00
elo.c Input: elo - fix an error code in elo_connect() 2021-02-18 14:39:42 -08:00
exc3000.c Merge branch 'next' into for-linus 2023-08-30 16:06:38 -07:00
fsl-imx25-tcq.c
fujitsu_ts.c
goodix.c Input: goodix - ensure int GPIO is in input for gpio_count == 1 && gpio_int_idx == 0 case 2023-10-04 07:21:45 -07:00
goodix.h Input: goodix - fix race on driver unbind 2022-02-28 23:26:30 -08:00
goodix_fwupload.c Input: goodix - fix memory leak in goodix_firmware_upload 2021-12-09 21:20:29 -08:00
gunze.c input: drop empty comment blocks 2022-09-29 16:25:42 -07:00
hampshire.c
hideep.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
himax_hx83112b.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
hp680_ts_input.c
htcpen.c isa: Make the remove callback for isa drivers return void 2021-01-26 07:42:27 +01:00
hycon-hy46xx.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
hynitron_cstxxx.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
ili210x.c Input: Explicitly include correct DT includes 2023-07-17 10:03:07 -07:00
ilitek_ts_i2c.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
imagis.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
imx6ul_tsc.c Input: imx6ul_tsc - switch to DEFINE_SIMPLE_DEV_PM_OPS() and pm_sleep_ptr() 2023-01-09 20:25:26 -08:00
inexio.c
ipaq-micro-ts.c Input: ipaq-micro-ts - fix DEFINE_SIMPLE_DEV_PM_OPS typo 2023-01-27 14:52:06 -08:00
iqs5xx.c Input: Explicitly include correct DT includes 2023-07-17 10:03:07 -07:00
iqs7211.c Input: iqs7211 - point to match data directly 2023-07-13 12:02:01 -07:00
jornada720_ts.c
lpc32xx_ts.c Input: lpc32xx_ts - convert to use devm_* api 2023-07-10 17:44:30 -07:00
mainstone-wm97xx.c ARM: pxa: remove unused board files 2023-01-20 11:23:44 +01:00
max11801_ts.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
mc13783_ts.c
mcs5000_ts.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
melfas_mip4.c Input: melfas_mip4 - simplify with dev_err_probe() 2023-07-07 16:54:29 -07:00
migor_ts.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
mk712.c
mms114.c Input: mms114 - add support for touch keys 2023-07-18 23:21:23 -07:00
msg2638.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
mtouch.c
mxs-lradc-ts.c
novatek-nvt-ts.c Input: novatek-nvt-ts - add touchscreen model number to description 2023-07-10 11:50:38 -07:00
pcap_ts.c
penmount.c
pixcir_i2c_ts.c Input: Explicitly include correct DT includes 2023-07-17 10:03:07 -07:00
raspberrypi-ts.c Input: raspberrypi-ts - fix refcount leak in rpi_ts_probe 2023-04-13 23:08:11 -07:00
raydium_i2c_ts.c Input: raydium_i2c_ts - simplify with dev_err_probe() 2023-07-07 16:54:29 -07:00
resistive-adc-touch.c Input: resistive-adc-touch - simplify with dev_err_probe() 2023-07-07 16:54:29 -07:00
rohm_bu21023.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
s6sy761.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
silead.c Input: silead - simplify with dev_err_probe() 2023-07-07 16:54:29 -07:00
sis_i2c.c Input: sis_i2c - simplify with dev_err_probe() 2023-07-07 16:54:30 -07:00
st1232.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
stmfts.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
stmpe-ts.c Input: stmpe-ts - add description for 'prop' struct member 2021-01-19 19:03:18 -08:00
sun4i-ts.c Input updates for 6.4 merge window: 2023-05-01 17:18:56 -07:00
sur40.c Input: move from strlcpy with unused retval to strscpy 2022-08-18 15:44:08 -07:00
surface3_spi.c Input: surface3_spi - simplify with dev_err_probe() 2023-07-07 16:54:30 -07:00
sx8654.c Input: sx8643 - simplify with dev_err_probe() 2023-07-07 16:54:30 -07:00
ti_am335x_tsc.c Input: Explicitly include correct DT includes 2023-07-17 10:03:07 -07:00
touchit213.c
touchright.c
touchwin.c
tps6507x-ts.c Input: tps6507x-ts - remove variable loops 2022-10-24 05:18:55 -07:00
ts4800-ts.c
tsc40.c
tsc200x-core.c Input: tsc200x - use EXPORT_GPL_SIMPLE_DEV_PM_OPS() 2023-01-27 14:49:53 -08:00
tsc200x-core.h Input: tsc200x - make tsc200x_remove() return void 2021-10-12 19:48:54 -07:00
tsc2004.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
tsc2005.c Input: tsc200x - use EXPORT_GPL_SIMPLE_DEV_PM_OPS() 2023-01-27 14:49:53 -08:00
tsc2007.h Input: tsc2007 - convert to GPIO descriptors 2021-03-15 17:12:02 -07:00
tsc2007_core.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
tsc2007_iio.c
usbtouchscreen.c Input: move from strlcpy with unused retval to strscpy 2022-08-18 15:44:08 -07:00
wacom_i2c.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
wacom_w8001.c Input: move from strlcpy with unused retval to strscpy 2022-08-18 15:44:08 -07:00
wdt87xx_i2c.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
wm97xx-core.c Input: wm97xx - switch to DEFINE_SIMPLE_DEV_PM_OPS() and pm_sleep_ptr() 2023-01-09 20:25:28 -08:00
wm831x-ts.c Input: move to use request_irq by IRQF_NO_AUTOEN flag 2021-03-25 15:27:56 -07:00
wm9705.c
wm9712.c
wm9713.c
zet6223.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
zforce_ts.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00
zinitix.c Input: Switch i2c drivers back to use .probe() 2023-05-17 09:59:11 -07:00