Message ID | 20240502185819.788716-3-andreas@kemnade.info (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Input: Add ektf2232 support | expand |
On Thu, May 2, 2024 at 9:58 PM Andreas Kemnade <andreas@kemnade.info> wrote: > > The chip is similar, but has status bits at different positions, > so use the correct bits. ... > + if (ts->shifted_status) { > + ektf2127_report2_contact(ts, 0, &buf[1], !!(buf[7] & 1)); > + ektf2127_report2_contact(ts, 1, &buf[4], !!(buf[7] & 2)); BIT(0) BIT(1) > + } else { > + ektf2127_report2_contact(ts, 0, &buf[1], !!(buf[7] & 2)); > + ektf2127_report2_contact(ts, 1, &buf[4], !!(buf[7] & 4)); BIT(1) BIT(2) > + } ... > + if (dev->of_node && > + of_device_is_compatible(dev->of_node, "elan,ektf2232")) if (device_is_compatible(...)) > + ts->shifted_status = true;
On Thu, May 02, 2024 at 10:16:01PM +0300, Andy Shevchenko wrote: > On Thu, May 2, 2024 at 9:58 PM Andreas Kemnade <andreas@kemnade.info> wrote: > > > > The chip is similar, but has status bits at different positions, > > so use the correct bits. > > ... > > > + if (ts->shifted_status) { Instead of the flag I think it would be better if you had ts->status_shift and did status = buf[7] >> ts->status_shift; ektf2127_report2_contact(ts, 0, &buf[1], status & BIT(0)); ektf2127_report2_contact(ts, 1, &buf[4], status & BIT(1)); > > + ektf2127_report2_contact(ts, 0, &buf[1], !!(buf[7] & 1)); > > + ektf2127_report2_contact(ts, 1, &buf[4], !!(buf[7] & 2)); > > BIT(0) > BIT(1) > > > + } else { > > + ektf2127_report2_contact(ts, 0, &buf[1], !!(buf[7] & 2)); > > + ektf2127_report2_contact(ts, 1, &buf[4], !!(buf[7] & 4)); > > BIT(1) > BIT(2) > > > + } > > ... > > > + if (dev->of_node && > > + of_device_is_compatible(dev->of_node, "elan,ektf2232")) > > if (device_is_compatible(...)) Actually I think this better come from data obtained via device_get_match_data(). > > > + ts->shifted_status = true; > Thanks.
On Fri, May 3, 2024 at 2:10 AM Dmitry Torokhov <dmitry.torokhov@gmail.com> wrote: > On Thu, May 02, 2024 at 10:16:01PM +0300, Andy Shevchenko wrote: > > On Thu, May 2, 2024 at 9:58 PM Andreas Kemnade <andreas@kemnade.info> wrote: ... > > > + if (ts->shifted_status) { > > Instead of the flag I think it would be better if you had > ts->status_shift and did > > status = buf[7] >> ts->status_shift; > ektf2127_report2_contact(ts, 0, &buf[1], status & BIT(0)); > ektf2127_report2_contact(ts, 1, &buf[4], status & BIT(1)); > > > > + ektf2127_report2_contact(ts, 0, &buf[1], !!(buf[7] & 1)); > > > + ektf2127_report2_contact(ts, 1, &buf[4], !!(buf[7] & 2)); > > > > BIT(0) > > BIT(1) > > > > > + } else { > > > + ektf2127_report2_contact(ts, 0, &buf[1], !!(buf[7] & 2)); > > > + ektf2127_report2_contact(ts, 1, &buf[4], !!(buf[7] & 4)); > > > > BIT(1) > > BIT(2) > > > > > + } ... > > > + if (dev->of_node && > > > + of_device_is_compatible(dev->of_node, "elan,ektf2232")) > > > > if (device_is_compatible(...)) > > Actually I think this better come from data obtained via > device_get_match_data(). > > > > + ts->shifted_status = true; I agree with your comments. Hopefully the author as well.
diff --git a/drivers/input/touchscreen/ektf2127.c b/drivers/input/touchscreen/ektf2127.c index cc3103b9cbfba..5c2a6bfc63d84 100644 --- a/drivers/input/touchscreen/ektf2127.c +++ b/drivers/input/touchscreen/ektf2127.c @@ -46,6 +46,7 @@ struct ektf2127_ts { struct input_dev *input; struct gpio_desc *power_gpios; struct touchscreen_properties prop; + bool shifted_status; }; static void ektf2127_parse_coordinates(const u8 *buf, unsigned int touch_count, @@ -112,8 +113,13 @@ static void ektf2127_report2_contact(struct ektf2127_ts *ts, int slot, static void ektf2127_report2_event(struct ektf2127_ts *ts, const u8 *buf) { - ektf2127_report2_contact(ts, 0, &buf[1], !!(buf[7] & 2)); - ektf2127_report2_contact(ts, 1, &buf[4], !!(buf[7] & 4)); + if (ts->shifted_status) { + ektf2127_report2_contact(ts, 0, &buf[1], !!(buf[7] & 1)); + ektf2127_report2_contact(ts, 1, &buf[4], !!(buf[7] & 2)); + } else { + ektf2127_report2_contact(ts, 0, &buf[1], !!(buf[7] & 2)); + ektf2127_report2_contact(ts, 1, &buf[4], !!(buf[7] & 4)); + } input_mt_sync_frame(ts->input); input_sync(ts->input); @@ -303,6 +309,10 @@ static int ektf2127_probe(struct i2c_client *client) return error; ts->input = input; + if (dev->of_node && + of_device_is_compatible(dev->of_node, "elan,ektf2232")) + ts->shifted_status = true; + input_set_drvdata(input, ts); error = devm_request_threaded_irq(dev, client->irq, @@ -329,6 +339,7 @@ static int ektf2127_probe(struct i2c_client *client) static const struct of_device_id ektf2127_of_match[] = { { .compatible = "elan,ektf2127" }, { .compatible = "elan,ektf2132" }, + { .compatible = "elan,ektf2232" }, {} }; MODULE_DEVICE_TABLE(of, ektf2127_of_match);
The chip is similar, but has status bits at different positions, so use the correct bits. Signed-off-by: Andreas Kemnade <andreas@kemnade.info> --- drivers/input/touchscreen/ektf2127.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)