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(-)
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);
--
2.39.2
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;
--
With Best Regards,
Andy Shevchenko
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.
--
Dmitry
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.
--
With Best Regards,
Andy Shevchenko
© 2016 - 2026 Red Hat, Inc.