Thread (22 messages) 22 messages, 7 authors, 2021-12-23

Re: [PATCH v2 1/4] Input: Add driver for Cypress Generation 5 touchscreen

From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date: 2021-12-13 05:45:55
Also in: linux-devicetree, linux-input, lkml

On Wed, Dec 01, 2021 at 10:27:46PM +1000, Alistair Francis wrote:
 On Sat, Nov 6, 2021 at 4:47 PM Dmitry Torokhov
[off-list ref] wrote:
quoted
Hi Alistair,

On Wed, Nov 03, 2021 at 09:48:27PM +1000, Alistair Francis wrote:
quoted
From: Mylčne Josserand <redacted>
...
quoted
quoted
+                            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?

...
quoted
quoted
+
+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?

...
quoted
quoted
+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().
quoted
quoted
+     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().
quoted
quoted
+             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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help