All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Alistair Francis <alistair23@gmail.com>
Cc: "Alistair Francis" <alistair@alistair23.me>,
	linux-arm-kernel <linux-arm-kernel@lists.infradead.org>,
	devicetree <devicetree@vger.kernel.org>,
	linux-input <linux-input@vger.kernel.org>,
	"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
	"Mylene Josserand" <mylene.josserand@free-electrons.com>,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Andreas Kemnade" <andreas@kemnade.info>,
	"Henrik Rydberg" <rydberg@bitmath.org>,
	"Rob Herring" <robh+dt@kernel.org>,
	"Mylène Josserand" <mylene.josserand@bootlin.com>,
	"Maxime Ripard" <maxime.ripard@bootlin.com>
Subject: Re: [PATCH v2 1/4] Input: Add driver for Cypress Generation 5 touchscreen
Date: Sun, 12 Dec 2021 21:45:48 -0800	[thread overview]
Message-ID: <YbbeDFJERtP0mAIQ@google.com> (raw)
In-Reply-To: <CAKmqyKOFZOLpjMY+kj2CLibFhYJ3-tL+9+cKEVzgSn9Mzq30gw@mail.gmail.com>

On Wed, Dec 01, 2021 at 10:27:46PM +1000, Alistair Francis wrote:
>  On Sat, Nov 6, 2021 at 4:47 PM Dmitry Torokhov
> <dmitry.torokhov@gmail.com> wrote:
> >
> > Hi Alistair,
> >
> > On Wed, Nov 03, 2021 at 09:48:27PM +1000, Alistair Francis wrote:
> > > From: Mylčne Josserand <mylene.josserand@bootlin.com>
> > >
...
> > > +                            si->tch_hdr.max,
> > > +                            si->xy_mode + 3 + si->tch_hdr.ofs,
> > > +                            si->tch_hdr.bofs);
> > > +
> > > +     num_cur_tch = tch.hdr;
> > > +     if (num_cur_tch > max_tch) {
> > > +             dev_err(dev, "Num touch err detected (n=%d)\n", num_cur_tch);
> > > +             num_cur_tch = max_tch;
> > > +     }
> > > +
> > > +     if (num_cur_tch == 0 && ts->num_prv_rec == 0)
> > > +             return 0;
> > > +
> > > +     /* extract xy_data for all currently reported touches */
> > > +     if (num_cur_tch)
> > > +             cyttsp5_get_mt_touches(ts, &tch, num_cur_tch);
> > > +     else
> > > +             cyttsp5_mt_lift_all(ts);
> >
> > Not needed with INPUT_MT_DROP_UNUSED.
> 
> I tried INPUT_MT_DROP_UNUSED and I still need this function

I am curious why that is. Probably call to input_mt_sync_frame() was in
a wrong place?

...

> > > +
> > > +static int cyttsp5_deassert_int(struct cyttsp5 *ts)
> > > +{
> > > +     u16 size;
> > > +     u8 buf[2];
> > > +     int rc;
> > > +
> > > +     rc = regmap_bulk_read(ts->regmap, HID_INPUT_REG, buf, 2);
> > > +     if (rc < 0)
> > > +             return rc;
> > > +
> > > +     size = get_unaligned_le16(&buf[0]);
> > > +     if (size == 2 || size == 0)
> > > +             return 0;
> >
> > If you were to use level interrupts this probably would not be needed.
> 
> I have tried with/without this and I still can't get level interrupts working.

Does the platform support level interrupts?

...
> > > +static int cyttsp5_probe(struct device *dev, struct regmap *regmap, int irq,
> > > +                      const char *name)
> > > +{
> > > +     struct cyttsp5 *ts;
> > > +     struct cyttsp5_sysinfo *si;
> > > +     int rc = 0, i;
> > > +
> > > +     ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL);
> > > +     if (!ts)
> > > +             return -ENOMEM;
> > > +
> > > +     /* Initialize device info */
> > > +     ts->regmap = regmap;
> > > +     ts->dev = dev;
> > > +     si = &ts->sysinfo;
> > > +     dev_set_drvdata(dev, ts);
> > > +
> > > +     /* Initialize mutexes and spinlocks */
> > > +     mutex_init(&ts->system_lock);
> > > +
> > > +     /* Initialize wait queue */
> > > +     init_waitqueue_head(&ts->wait_q);
> > > +
> > > +     /* Power up the device */
> > > +     ts->vdd = regulator_get(dev, "vdd");
> >
> > Do not mix managed an unmanaged resources. You are leaking this
> > regulator.
> 
> I'm not clear what I should do differently here.

devm_regulator_get().

> 
> >
> > > +     if (IS_ERR(ts->vdd)) {
> > > +             rc = PTR_ERR(ts->vdd);
> > > +             dev_set_drvdata(dev, NULL);
> > > +             kfree(ts);

You can't call kfree() for memory allocated with devm_kzalloc().

> > > +             return rc;
> > > +     }
> > > +
> > > +     rc = regulator_enable(ts->vdd);
> > > +     if (rc) {
> > > +             regulator_put(ts->vdd);
> > > +             dev_set_drvdata(dev, NULL);
> > > +             kfree(ts);
> > > +             return rc;
> > > +     }
> > > +
> > > +     /* Reset the gpio to be in a reset state */
> > > +     ts->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
> > > +     if (IS_ERR(ts->reset_gpio)) {
> > > +             rc = PTR_ERR(ts->reset_gpio);
> > > +             dev_err(dev, "Failed to request reset gpio, error %d\n", rc);
> > > +             return rc;
> > > +     }
> > > +     gpiod_set_value(ts->reset_gpio, 1);
> > > +
> > > +     /* Need a delay to have device up */
> > > +     msleep(20);
> > > +
> > > +     rc = devm_request_threaded_irq(dev, irq, NULL, cyttsp5_handle_irq,
> > > +                                    IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
> >
> > Please do not override platform setup with hardcoded triggers. Also, it
> > is strongly recommended to use level interrupts for these peripherals.
> >
> > This is also likely unsafe if controller is not completely shut off and
> > is capable of generating interrupts given input device is not yet
> > allocated.
> 
> I have dropped the `IRQF_TRIGGER_FALLING |`
> 
> I have tried to use level interrupts, but I can't get the device
> working with them.

That is weird, does the interrupt controller support level interrupts?

Thanks.

-- 
Dmitry

WARNING: multiple messages have this Message-ID (diff)
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Alistair Francis <alistair23@gmail.com>
Cc: "Alistair Francis" <alistair@alistair23.me>,
	linux-arm-kernel <linux-arm-kernel@lists.infradead.org>,
	devicetree <devicetree@vger.kernel.org>,
	linux-input <linux-input@vger.kernel.org>,
	"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
	"Mylene Josserand" <mylene.josserand@free-electrons.com>,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Andreas Kemnade" <andreas@kemnade.info>,
	"Henrik Rydberg" <rydberg@bitmath.org>,
	"Rob Herring" <robh+dt@kernel.org>,
	"Mylène Josserand" <mylene.josserand@bootlin.com>,
	"Maxime Ripard" <maxime.ripard@bootlin.com>
Subject: Re: [PATCH v2 1/4] Input: Add driver for Cypress Generation 5 touchscreen
Date: Sun, 12 Dec 2021 21:45:48 -0800	[thread overview]
Message-ID: <YbbeDFJERtP0mAIQ@google.com> (raw)
In-Reply-To: <CAKmqyKOFZOLpjMY+kj2CLibFhYJ3-tL+9+cKEVzgSn9Mzq30gw@mail.gmail.com>

On Wed, Dec 01, 2021 at 10:27:46PM +1000, Alistair Francis wrote:
>  On Sat, Nov 6, 2021 at 4:47 PM Dmitry Torokhov
> <dmitry.torokhov@gmail.com> wrote:
> >
> > Hi Alistair,
> >
> > On Wed, Nov 03, 2021 at 09:48:27PM +1000, Alistair Francis wrote:
> > > From: Mylčne Josserand <mylene.josserand@bootlin.com>
> > >
...
> > > +                            si->tch_hdr.max,
> > > +                            si->xy_mode + 3 + si->tch_hdr.ofs,
> > > +                            si->tch_hdr.bofs);
> > > +
> > > +     num_cur_tch = tch.hdr;
> > > +     if (num_cur_tch > max_tch) {
> > > +             dev_err(dev, "Num touch err detected (n=%d)\n", num_cur_tch);
> > > +             num_cur_tch = max_tch;
> > > +     }
> > > +
> > > +     if (num_cur_tch == 0 && ts->num_prv_rec == 0)
> > > +             return 0;
> > > +
> > > +     /* extract xy_data for all currently reported touches */
> > > +     if (num_cur_tch)
> > > +             cyttsp5_get_mt_touches(ts, &tch, num_cur_tch);
> > > +     else
> > > +             cyttsp5_mt_lift_all(ts);
> >
> > Not needed with INPUT_MT_DROP_UNUSED.
> 
> I tried INPUT_MT_DROP_UNUSED and I still need this function

I am curious why that is. Probably call to input_mt_sync_frame() was in
a wrong place?

...

> > > +
> > > +static int cyttsp5_deassert_int(struct cyttsp5 *ts)
> > > +{
> > > +     u16 size;
> > > +     u8 buf[2];
> > > +     int rc;
> > > +
> > > +     rc = regmap_bulk_read(ts->regmap, HID_INPUT_REG, buf, 2);
> > > +     if (rc < 0)
> > > +             return rc;
> > > +
> > > +     size = get_unaligned_le16(&buf[0]);
> > > +     if (size == 2 || size == 0)
> > > +             return 0;
> >
> > If you were to use level interrupts this probably would not be needed.
> 
> I have tried with/without this and I still can't get level interrupts working.

Does the platform support level interrupts?

...
> > > +static int cyttsp5_probe(struct device *dev, struct regmap *regmap, int irq,
> > > +                      const char *name)
> > > +{
> > > +     struct cyttsp5 *ts;
> > > +     struct cyttsp5_sysinfo *si;
> > > +     int rc = 0, i;
> > > +
> > > +     ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL);
> > > +     if (!ts)
> > > +             return -ENOMEM;
> > > +
> > > +     /* Initialize device info */
> > > +     ts->regmap = regmap;
> > > +     ts->dev = dev;
> > > +     si = &ts->sysinfo;
> > > +     dev_set_drvdata(dev, ts);
> > > +
> > > +     /* Initialize mutexes and spinlocks */
> > > +     mutex_init(&ts->system_lock);
> > > +
> > > +     /* Initialize wait queue */
> > > +     init_waitqueue_head(&ts->wait_q);
> > > +
> > > +     /* Power up the device */
> > > +     ts->vdd = regulator_get(dev, "vdd");
> >
> > Do not mix managed an unmanaged resources. You are leaking this
> > regulator.
> 
> I'm not clear what I should do differently here.

devm_regulator_get().

> 
> >
> > > +     if (IS_ERR(ts->vdd)) {
> > > +             rc = PTR_ERR(ts->vdd);
> > > +             dev_set_drvdata(dev, NULL);
> > > +             kfree(ts);

You can't call kfree() for memory allocated with devm_kzalloc().

> > > +             return rc;
> > > +     }
> > > +
> > > +     rc = regulator_enable(ts->vdd);
> > > +     if (rc) {
> > > +             regulator_put(ts->vdd);
> > > +             dev_set_drvdata(dev, NULL);
> > > +             kfree(ts);
> > > +             return rc;
> > > +     }
> > > +
> > > +     /* Reset the gpio to be in a reset state */
> > > +     ts->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
> > > +     if (IS_ERR(ts->reset_gpio)) {
> > > +             rc = PTR_ERR(ts->reset_gpio);
> > > +             dev_err(dev, "Failed to request reset gpio, error %d\n", rc);
> > > +             return rc;
> > > +     }
> > > +     gpiod_set_value(ts->reset_gpio, 1);
> > > +
> > > +     /* Need a delay to have device up */
> > > +     msleep(20);
> > > +
> > > +     rc = devm_request_threaded_irq(dev, irq, NULL, cyttsp5_handle_irq,
> > > +                                    IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
> >
> > Please do not override platform setup with hardcoded triggers. Also, it
> > is strongly recommended to use level interrupts for these peripherals.
> >
> > This is also likely unsafe if controller is not completely shut off and
> > is capable of generating interrupts given input device is not yet
> > allocated.
> 
> I have dropped the `IRQF_TRIGGER_FALLING |`
> 
> I have tried to use level interrupts, but I can't get the device
> working with them.

That is weird, does the interrupt controller support level interrupts?

Thanks.

-- 
Dmitry

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2021-12-13  5:45 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-03 11:48 [PATCH v2 0/4] Add support for the Cypress cyttsp5 Alistair Francis
2021-11-03 11:48 ` Alistair Francis
2021-11-03 11:48 ` [PATCH v2 1/4] Input: Add driver for Cypress Generation 5 touchscreen Alistair Francis
2021-11-03 11:48   ` Alistair Francis
2021-11-05 15:01   ` Andreas Kemnade
2021-11-05 15:01     ` Andreas Kemnade
2021-11-06  6:47   ` Dmitry Torokhov
2021-11-06  6:47     ` Dmitry Torokhov
2021-12-01 12:27     ` Alistair Francis
2021-12-01 12:27       ` Alistair Francis
2021-12-13  5:45       ` Dmitry Torokhov [this message]
2021-12-13  5:45         ` Dmitry Torokhov
2021-12-13 18:49         ` Andreas Kemnade
2021-12-13 18:49           ` Andreas Kemnade
2021-12-18 22:18         ` Andreas Kemnade
2021-12-18 22:18           ` Andreas Kemnade
2021-12-21 23:28           ` Alistair Francis
2021-12-21 23:28             ` Alistair Francis
2021-12-23 13:47   ` Andy Shevchenko
2021-12-23 13:47     ` Andy Shevchenko
2021-11-03 11:48 ` [PATCH v2 2/4] Documentation: DT: bindings: input: Add documentation for cyttsp5 Alistair Francis
2021-11-03 11:48   ` Alistair Francis
2021-11-03 23:07   ` Rob Herring
2021-11-03 23:07     ` Rob Herring
2021-11-05 14:21   ` Andreas Kemnade
2021-11-05 14:21     ` Andreas Kemnade
2021-11-10 12:59     ` Alistair Francis
2021-11-10 12:59       ` Alistair Francis
2021-11-10 17:36       ` Andreas Kemnade
2021-11-10 17:36         ` Andreas Kemnade
2021-11-11 15:16         ` Linus Walleij
2021-11-11 15:16           ` Linus Walleij
2021-11-18 12:51           ` Alistair Francis
2021-11-18 12:51             ` Alistair Francis
2021-11-03 11:48 ` [PATCH v2 3/4] ARM: imx_v6_v7_defconfig: Enable the cyttsp5 touchscreen Alistair Francis
2021-11-03 11:48   ` Alistair Francis
2021-11-03 11:48 ` [PATCH v2 4/4] ARM: dts: imx7d: remarkable2: Enable the cyttsp5 Alistair Francis
2021-11-03 11:48   ` Alistair Francis
2021-11-06  2:25   ` Dmitry Torokhov
2021-11-06  2:25     ` Dmitry Torokhov
2021-11-05 14:52 ` [PATCH v2 0/4] Add support for the Cypress cyttsp5 Andreas Kemnade
2021-11-05 14:52   ` Andreas Kemnade
2021-11-25  9:44   ` Alistair Francis
2021-11-25  9:44     ` Alistair Francis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YbbeDFJERtP0mAIQ@google.com \
    --to=dmitry.torokhov@gmail.com \
    --cc=alistair23@gmail.com \
    --cc=alistair@alistair23.me \
    --cc=andreas@kemnade.info \
    --cc=devicetree@vger.kernel.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maxime.ripard@bootlin.com \
    --cc=mylene.josserand@bootlin.com \
    --cc=mylene.josserand@free-electrons.com \
    --cc=robh+dt@kernel.org \
    --cc=rydberg@bitmath.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.