Linux Input/HID development
 help / color / mirror / Atom feed
* [PATCH] Input: zinitix: iterate contact slots by finger count
@ 2026-04-08  5:19 Thanh Nguyen
  2026-06-30  9:11 ` Linus Walleij
  0 siblings, 1 reply; 4+ messages in thread
From: Thanh Nguyen @ 2026-04-08  5:19 UTC (permalink / raw)
  To: dmitry.torokhov
  Cc: linux-input, linux-kernel, linus.walleij, timon37, Thanh Nguyen

On affected devices (for example Samsung A3 2015), the value in
touch_event.finger_mask appears to behave as a count of reported slots
rather than a bitmask. Using for_each_set_bit() can then skip valid
contacts and break multitouch gestures.

Keep filtering by SUB_BIT_EXIST to avoid reporting shadow contacts, but
iterate from slot 0 up to min(finger_mask, MAX_SUPPORTED_FINGER_NUM).
This follows the maintainer feedback to treat the field as a possible
count while preserving the anti-shadow check.

Fixes: e941dc13fd37 ("Input: zinitix - do not report shadow fingers")
Link: https://bugzilla.kernel.org/show_bug.cgi?id=221278
Signed-off-by: Thanh Nguyen <thanhnguyxn07@gmail.com>
---
v2:
 - Address maintainer feedback: do not revert e941dc13fd37.
 - Keep SUB_BIT_EXIST filtering to avoid shadow contacts.
 - Treat finger_mask as a slot-count bound and iterate 0..min(mask, max).

 drivers/input/touchscreen/zinitix.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/input/touchscreen/zinitix.c b/drivers/input/touchscreen/zinitix.c
index 716d6fa60..a2edae7df 100644
--- a/drivers/input/touchscreen/zinitix.c
+++ b/drivers/input/touchscreen/zinitix.c
@@ -471,7 +471,8 @@ static irqreturn_t zinitix_ts_irq_handler(int irq, void *bt541_handler)
 	}
 
 	finger_mask = touch_event.finger_mask;
-	for_each_set_bit(i, &finger_mask, MAX_SUPPORTED_FINGER_NUM) {
+	for (i = 0; i < min_t(unsigned long, finger_mask,
+			MAX_SUPPORTED_FINGER_NUM); i++) {
 		const struct point_coord *p = &touch_event.point_coord[i];
 
 		/* Only process contacts that are actually reported */
-- 
2.51.0.windows.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] Input: zinitix: iterate contact slots by finger count
  2026-04-08  5:19 [PATCH] Input: zinitix: iterate contact slots by finger count Thanh Nguyen
@ 2026-06-30  9:11 ` Linus Walleij
  2026-07-05  7:13   ` Nikita Travkin
  0 siblings, 1 reply; 4+ messages in thread
From: Linus Walleij @ 2026-06-30  9:11 UTC (permalink / raw)
  To: Thanh Nguyen, Nikita Travkin
  Cc: dmitry.torokhov, linux-input, linux-kernel, linus.walleij,
	timon37

Hi Thanh,

sorry for slow reply!

On Wed, Apr 8, 2026 at 6:19 AM Thanh Nguyen <thanhnguyxn07@gmail.com> wrote:
>
> On affected devices (for example Samsung A3 2015), the value in
> touch_event.finger_mask appears to behave as a count of reported slots
> rather than a bitmask. Using for_each_set_bit() can then skip valid
> contacts and break multitouch gestures.
>
> Keep filtering by SUB_BIT_EXIST to avoid reporting shadow contacts, but
> iterate from slot 0 up to min(finger_mask, MAX_SUPPORTED_FINGER_NUM).
> This follows the maintainer feedback to treat the field as a possible
> count while preserving the anti-shadow check.
>
> Fixes: e941dc13fd37 ("Input: zinitix - do not report shadow fingers")
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=221278
> Signed-off-by: Thanh Nguyen <thanhnguyxn07@gmail.com>
> ---
> v2:
>  - Address maintainer feedback: do not revert e941dc13fd37.
>  - Keep SUB_BIT_EXIST filtering to avoid shadow contacts.
>  - Treat finger_mask as a slot-count bound and iterate 0..min(mask, max).

I can test this if need be, but maybe Nikita want to check it
first?

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Input: zinitix: iterate contact slots by finger count
  2026-06-30  9:11 ` Linus Walleij
@ 2026-07-05  7:13   ` Nikita Travkin
  2026-07-05 11:17     ` Thành Nguyễn
  0 siblings, 1 reply; 4+ messages in thread
From: Nikita Travkin @ 2026-07-05  7:13 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Thanh Nguyen, dmitry.torokhov, linux-input, linux-kernel,
	linus.walleij, timon37

Linus Walleij писал(а) 30.06.2026 14:11:
> Hi Thanh,
> 
> sorry for slow reply!
> 
> On Wed, Apr 8, 2026 at 6:19 AM Thanh Nguyen <thanhnguyxn07@gmail.com> wrote:
>>
>> On affected devices (for example Samsung A3 2015), the value in
>> touch_event.finger_mask appears to behave as a count of reported slots
>> rather than a bitmask. Using for_each_set_bit() can then skip valid
>> contacts and break multitouch gestures.
>>
>> Keep filtering by SUB_BIT_EXIST to avoid reporting shadow contacts, but
>> iterate from slot 0 up to min(finger_mask, MAX_SUPPORTED_FINGER_NUM).
>> This follows the maintainer feedback to treat the field as a possible
>> count while preserving the anti-shadow check.
>>
>> Fixes: e941dc13fd37 ("Input: zinitix - do not report shadow fingers")
>> Link: https://bugzilla.kernel.org/show_bug.cgi?id=221278
>> Signed-off-by: Thanh Nguyen <thanhnguyxn07@gmail.com>
>> ---
>> v2:
>>  - Address maintainer feedback: do not revert e941dc13fd37.
>>  - Keep SUB_BIT_EXIST filtering to avoid shadow contacts.
>>  - Treat finger_mask as a slot-count bound and iterate 0..min(mask, max).
> 
> I can test this if need be, but maybe Nikita want to check it
> first?
> 

Hi!

I've quickly checked it on my gt58 (bt532) but it made me remember that
on this device/chip it seems like only "TOUCH_MODE=0" is supported and
reported fingers don't have extra "width"/"angle" fields. (I have a
vague recollection that this was somehow related to touchkeys being
enabled or not) Otherwise on this chip (firmware? touch_mode?) the
finger count is indeed a count and not a mask. 

Given we have an EXIST bit IMO it still makes sense to make this change.
Maybe also worth adding a short comment why we're treating mask as
count if Linus's devices report mask and your/mine report count...

Nikita

> Yours,
> Linus Walleij

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Input: zinitix: iterate contact slots by finger count
  2026-07-05  7:13   ` Nikita Travkin
@ 2026-07-05 11:17     ` Thành Nguyễn
  0 siblings, 0 replies; 4+ messages in thread
From: Thành Nguyễn @ 2026-07-05 11:17 UTC (permalink / raw)
  To: nikita
  Cc: linusw, dmitry.torokhov, linux-input, linux-kernel, linus.walleij,
	timon37

Hi Nikita, Linus, and Dmitry,

Thank you all for the feedback and for confirming the fix on your end, Nikita.

Unfortunately, since it's been a while since I submitted the v2 patch,
I recently had to completely wipe my development machine and no longer
have the local environment or the original patch files to create a v3.

Since the logic in v2 is sound and the only change needed is a brief
comment explaining the dual mask/count nature of `finger_mask`, would
one of you be willing to add that comment and apply the patch on my
behalf? I'd really appreciate it.

Thanks again for your time and help with getting this merged!

Best regards,
Thanh Nguyen

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-07-05 11:17 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-08  5:19 [PATCH] Input: zinitix: iterate contact slots by finger count Thanh Nguyen
2026-06-30  9:11 ` Linus Walleij
2026-07-05  7:13   ` Nikita Travkin
2026-07-05 11:17     ` Thành Nguyễn

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox