Thread (27 messages) 27 messages, 3 authors, 2013-02-06

Re: [PATCH v2 3/9] HID: multitouch: add support for Nexio 42" panel

From: Benjamin Tissoires <hidden>
Date: 2013-02-04 13:42:28
Also in: lkml

On Mon, Feb 4, 2013 at 12:42 PM, Henrik Rydberg [off-list ref] wrote:
Hi Benjamin,
quoted
quoted
Why not an index here?
Just because an index is not sufficient. You need two things: an index
within the field, and the actual field (a pointer to a struct
hid_field). Each .value is local to a field, and even if in most of
the case, the contact count is alone in its field, it would mean to
take the risk that a new device does not follow this logic.
The field value is passed to process_mt_event() in a fairly
straight-forward fashion, I was imagining that behavior could be
copied somehow.
quoted
So the actual pointer to the contact count value seemed to be the
shortest way to do it. But it can be easily changed.
Keeping a pointer into the core structure creates unwanted
dependencies to the scope of that value, making an eventual core
refactoring even harder, not to mention trickier to debug. So even
though it looks neat in the code, it pushes the problem forward.
quoted
quoted
quoted
@@ -251,6 +257,9 @@ static ssize_t mt_set_quirks(struct device *dev,

      td->mtclass.quirks = val;

+     if (!td->contactcount)
+             td->mtclass.quirks &= ~MT_QUIRK_CONTACT_CNT_ACCURATE;
+
Why override the overrider here?
This callback is called from the user-space through the sysfs
attribute. So, it is not called in the same time that the
mt_post_parse function. This is just to avoid a user setting this
quirk once the device is up and running leading to a potential oops.
Yes, but the quirk _is_ user modifiable. Hence, the problem lies in
equating the user-modifiable quirk with the branch control of the
program.
I'm not sure I understood what you meant there.
The quirk is indeed user modifiable, but through the callback
mt_set_quirks() only. If the HID field Contact Count is not present,
this quirk should not be allowed to be present, thus the two removals
of the quirk in met_set_quirks() and mt_post_parse(). As there are no
other entry points, I'm quite confuse to understand where the pitfall
is.
quoted
quoted
An index into the the struct actually passed in mt_report() feels safer.
again, you need to store "field" and "usage->usage_index". Agree, it
would be safer but it will take more space... :)
If you think the code change is not only correct, but also moves the
whole code base in a good direction, by all means.
Ok, will do. After a deeper look at it, I can even have two int
indexes (and no pointers): one for the field and one other for the
value within the field.

Cheers,
Benjamin
quoted
quoted
quoted
@@ -750,11 +765,15 @@ static void mt_post_parse_default_settings(struct mt_device *td)
 static void mt_post_parse(struct mt_device *td)
 {
      struct mt_fields *f = td->fields;
+     struct mt_class *cls = &td->mtclass;

      if (td->touches_by_report > 0) {
              int field_count_per_touch = f->length / td->touches_by_report;
              td->last_slot_field = f->usages[field_count_per_touch - 1];
      }
+
+     if (!td->contactcount)
+             cls->quirks &= ~MT_QUIRK_CONTACT_CNT_ACCURATE;
Since MT_QUIRK_CONTACT_CNT_ACCURATE is a quirk, modifiable by the
user, it should probably not validate num_expected in the code. Better
use the contact count index or something equivalent for that.
As when the user changes the quirk, we validate it, this is not required.
True, barring the comments above.

Thanks,
Henrik
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help