linux-uconsole/drivers/input/touchscreen
Linus Walleij ef1a6ab36d Input: zinitix - do not report shadow fingers
[ Upstream commit e941dc13fd ]

I observed the following problem with the BT404 touch pad
running the Phosh UI:

When e.g. typing on the virtual keyboard pressing "g" would
produce "ggg".

After some analysis it turns out the firmware reports that three
fingers hit that coordinate at the same time, finger 0, 2 and
4 (of the five available 0,1,2,3,4).

DOWN
  Zinitix-TS 3-0020: finger 0 down (246, 395)
  Zinitix-TS 3-0020: finger 1 up (0, 0)
  Zinitix-TS 3-0020: finger 2 down (246, 395)
  Zinitix-TS 3-0020: finger 3 up (0, 0)
  Zinitix-TS 3-0020: finger 4 down (246, 395)
UP
  Zinitix-TS 3-0020: finger 0 up (246, 395)
  Zinitix-TS 3-0020: finger 2 up (246, 395)
  Zinitix-TS 3-0020: finger 4 up (246, 395)

This is one touch and release: i.e. this is all reported on
touch (down) and release.

There is a field in the struct touch_event called finger_cnt
which is actually a bitmask of the fingers active in the
event.

Rename this field finger_mask as this matches the use contents
better, then use for_each_set_bit() to iterate over just the
fingers that are actally active.

Factor out a finger reporting function zinitix_report_fingers()
to handle all fingers.

Also be more careful in reporting finger down/up: we were
reporting every event with input_mt_report_slot_state(..., true);
but this should only be reported on finger down or move,
not on finger up, so also add code to check p->sub_status
to see what is happening and report correctly.

After this my Zinitix BT404 touchscreen report fingers
flawlessly.

The vendor drive I have notably does not use the "finger_cnt"
and contains obviously incorrect code like this:

  if (touch_dev->touch_info.finger_cnt > MAX_SUPPORTED_FINGER_NUM)
      touch_dev->touch_info.finger_cnt = MAX_SUPPORTED_FINGER_NUM;

As MAX_SUPPORTED_FINGER_NUM is an ordinal and the field is
a bitmask this seems quite confused.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20220228233017.2270599-1-linus.walleij@linaro.org
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-04-08 14:39:48 +02:00
..
88pm860x-ts.c Input: remove dev_err() usage after platform_get_irq() 2019-08-14 10:49:01 -07:00
ad7877.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 64 2019-05-24 17:36:46 +02:00
ad7879-i2c.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 149 2019-05-30 11:25:18 -07:00
ad7879-spi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 149 2019-05-30 11:25:18 -07:00
ad7879.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 149 2019-05-30 11:25:18 -07:00
ad7879.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 149 2019-05-30 11:25:18 -07:00
ads7846.c Input: ads7846 - fix unaligned access on 7845 2020-12-30 11:53:14 +01:00
ar1021_i2c.c Input: ar1021 - fix typo in preprocessor macro name 2019-11-11 16:02:30 -08:00
atmel_mxt_ts.c Input: atmel_mxt_ts - fix double free in mxt_read_info_block 2021-12-29 12:26:01 +01:00
auo-pixcir-ts.c Linux 5.2 2019-07-15 09:42:32 -07:00
bcm_iproc_tsc.c Input: remove dev_err() usage after platform_get_irq() 2019-08-14 10:49:01 -07:00
bu21013_ts.c Input: bu21013_ts - switch to using standard touchscreen properties 2019-09-02 09:07:38 -07:00
bu21029_ts.c Input: add bu21029 touch driver 2018-06-24 15:20:12 -07:00
chipone_icn8318.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
chipone_icn8505.c Input: icn8505 - Switch to firmware_request_platform for retreiving the fw 2020-03-20 14:57:54 +01:00
colibri-vf50-ts.c Input: colibri-vf50-ts - remove unneeded gpio.h header file 2019-10-27 11:14:22 -07:00
cy8ctma140.c Input: add driver for the Cypress CY8CTMA140 touchscreen 2020-05-09 22:26:48 -07:00
cy8ctmg110_ts.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 176 2019-05-30 11:29:19 -07:00
cyttsp4_core.c Input: introduce input_mt_report_slot_inactive() 2020-05-12 13:18:26 -07:00
cyttsp4_core.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 284 2019-06-05 17:36:37 +02:00
cyttsp4_i2c.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 284 2019-06-05 17:36:37 +02:00
cyttsp4_spi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 284 2019-06-05 17:36:37 +02:00
cyttsp_core.c Input: introduce input_mt_report_slot_inactive() 2020-05-12 13:18:26 -07:00
cyttsp_core.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 267 2019-06-05 17:30:29 +02:00
cyttsp_i2c.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 284 2019-06-05 17:36:37 +02:00
cyttsp_i2c_common.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 284 2019-06-05 17:36:37 +02:00
cyttsp_spi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 284 2019-06-05 17:36:37 +02:00
da9034-ts.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
da9052_tsi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
dynapro.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
edt-ft5x06.c Input: Use fallthrough pseudo-keyword 2020-07-07 11:25:54 -07:00
eeti_ts.c Linux 5.2 2019-07-15 09:42:32 -07:00
egalax_ts.c Input: egalax_ts - add system wakeup support 2018-09-18 15:28:07 -07:00
egalax_ts_serial.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
ektf2127.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
elants_i2c.c Input: elants_i2c - do not check Remark ID on eKTH3900/eKTH5312 2021-12-29 12:26:06 +01:00
elo.c Input: elo - fix an error code in elo_connect() 2021-03-04 11:38:10 +01:00
exc3000.c Input: exc3000 - add support to query model and fw_version 2020-08-06 17:34:19 -07:00
fsl-imx25-tcq.c Input: remove dev_err() usage after platform_get_irq() 2019-08-14 10:49:01 -07:00
fujitsu_ts.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
goodix.c Input: goodix - add id->model mapping for the "9111" model 2021-12-29 12:26:06 +01:00
gunze.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 156 2019-05-30 11:26:35 -07:00
hampshire.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
hideep.c Input: hideep - fix the uninitialized use in hideep_nvm_unlock() 2021-07-20 16:05:44 +02:00
hp680_ts_input.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
htcpen.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
ili210x.c Input: ili210x - add missing negation for touch indication on ili210x 2021-05-11 14:47:34 +02:00
imx6ul_tsc.c Input: imx6ul_tsc - unify open/close and PM paths 2020-09-16 10:38:57 -07:00
inexio.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
ipaq-micro-ts.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
iqs5xx.c Input: Use fallthrough pseudo-keyword 2020-07-07 11:25:54 -07:00
jornada720_ts.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
Kconfig Input: resistive-adc-touch - fix kconfig dependency on IIO_BUFFER 2020-11-11 17:50:12 -08:00
lpc32xx_ts.c Input: remove dev_err() usage after platform_get_irq() 2019-08-14 10:49:01 -07:00
mainstone-wm97xx.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
Makefile Input: add zinitix touchscreen driver 2020-10-04 16:08:09 -07:00
max11801_ts.c Input: Use fallthrough pseudo-keyword 2020-07-07 11:25:54 -07:00
mc13783_ts.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
mcs5000_ts.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
melfas_mip4.c Input: introduce input_mt_report_slot_inactive() 2020-05-12 13:18:26 -07:00
migor_ts.c Input: migor_ts - convert to SPDX identifiers 2018-11-12 11:52:05 -08:00
mk712.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
mms114.c Merge branch 'for-linus' into next 2020-05-17 21:10:28 -07:00
mtouch.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
mxs-lradc-ts.c Input: mxs-lradc-ts - use devm_platform_ioremap_resource() 2019-07-24 12:48:47 +03:00
of_touchscreen.c Input: touchscreen - avoid bitwise vs logical OR warning 2021-12-22 09:30:58 +01:00
pcap_ts.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
penmount.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
pixcir_i2c_ts.c Input: pixcir_i2c_ts - remove platform data 2019-10-09 14:56:40 -07:00
raspberrypi-ts.c Input: introduce input_mt_report_slot_inactive() 2020-05-12 13:18:26 -07:00
raydium_i2c_ts.c Input: raydium_ts_i2c - do not send zero length 2021-03-04 11:38:23 +01:00
resistive-adc-touch.c input: touchscreen: resistive-adc-touch: add generic resistive ADC touchscreen 2018-06-10 13:26:40 +01:00
rohm_bu21023.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 282 2019-06-05 17:36:37 +02:00
s3c2410_ts.c ARM: s3c: adc: move header to linux/soc/samsung 2020-08-19 21:44:11 +02:00
s6sy761.c Input: s6sy761 - fix coordinate read bit shift 2021-04-21 13:00:54 +02:00
silead.c Input: silead - add workaround for x86 BIOS-es which bring the chip up in a stuck state 2021-05-22 11:40:52 +02:00
sis_i2c.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 282 2019-06-05 17:36:37 +02:00
st1232.c Input: st1232 - switch to using MT-B protocol 2019-10-28 21:04:27 -07:00
stmfts.c Input: stmfts - fix a & vs && typo 2020-09-16 10:38:58 -07:00
stmpe-ts.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
sun4i-ts.c Input: sun4i-ts - add a check for devm_thermal_zone_of_sensor_register 2020-01-10 14:42:52 -08:00
sur40.c Input: sur40 - fix an error code in sur40_probe() 2021-03-04 11:38:09 +01:00
surface3_spi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 441 2019-06-05 17:37:17 +02:00
sx8654.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
ti_am335x_tsc.c Input: ti_am335x_tsc - remove set but not used variable 'tscadc_dev' 2019-02-19 10:38:19 -08:00
touchit213.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
touchright.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
touchwin.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
tps6507x-ts.c Input: tsc6507x-ts - switch to using polled mode of input devices 2019-10-29 17:13:41 -07:00
ts4800-ts.c Input: ts4800-ts - switch to using polled mode of input devices 2019-10-29 17:13:40 -07:00
tsc40.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 315 2019-06-05 17:37:05 +02:00
tsc200x-core.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
tsc200x-core.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
tsc2004.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
tsc2005.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
tsc2007.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
tsc2007_core.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
tsc2007_iio.c iio: remove explicit IIO device parent assignment 2020-06-14 11:49:59 +01:00
ucb1400_ts.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
usbtouchscreen.c Input: usbtouchscreen - fix control-request directions 2021-07-14 16:55:37 +02:00
wacom_i2c.c Input: wacom_i2c - remove unneeded gpio.h header file 2019-10-27 11:14:25 -07:00
wacom_w8001.c Input: wacom_w8001 - allocate additional space for 'phys' 2019-08-20 12:03:46 -07:00
wdt87xx_i2c.c Input: wdt87xx_i2c - replace mdelay() with msleep() in wdt87xx_resume() 2018-07-27 11:59:05 -07:00
wm97xx-core.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
wm831x-ts.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
wm9705.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
wm9712.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
wm9713.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
zet6223.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
zforce_ts.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 282 2019-06-05 17:36:37 +02:00
zinitix.c Input: zinitix - do not report shadow fingers 2022-04-08 14:39:48 +02:00
zylonite-wm97xx.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00