From: Benjamin Bara <bbara93@gmail.com>
To: dmitry.torokhov@gmail.com
Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
Benjamin Bara <benjamin.bara@skidata.com>,
Richard Leitner <richard.leitner@skidata.com>
Subject: [PATCH] Input: tsc2007 - enable GPIO chips that can sleep
Date: Wed, 13 Jul 2022 10:42:47 +0200 [thread overview]
Message-ID: <20220713084247.3090353-1-bbara93@gmail.com> (raw)
From: Benjamin Bara <benjamin.bara@skidata.com>
This enables the usage of "can_sleep" GPIO chips as "pin up" GPIO.
This might be the case if the GPIO chip is an expander behind i2c.
Signed-off-by: Benjamin Bara <benjamin.bara@skidata.com>
Signed-off-by: Richard Leitner <richard.leitner@skidata.com>
---
drivers/input/touchscreen/tsc2007.h | 1 +
drivers/input/touchscreen/tsc2007_core.c | 38 ++++++++++++++++++++----
2 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/drivers/input/touchscreen/tsc2007.h b/drivers/input/touchscreen/tsc2007.h
index 69b08dd6c8df..29bd1ff22c72 100644
--- a/drivers/input/touchscreen/tsc2007.h
+++ b/drivers/input/touchscreen/tsc2007.h
@@ -78,6 +78,7 @@ struct tsc2007 {
bool stopped;
int (*get_pendown_state)(struct device *);
+ int (*get_pendown_state_cansleep)(struct device *);
void (*clear_penirq)(void);
struct mutex mlock;
diff --git a/drivers/input/touchscreen/tsc2007_core.c b/drivers/input/touchscreen/tsc2007_core.c
index 3e871d182c40..0ad4c3c41297 100644
--- a/drivers/input/touchscreen/tsc2007_core.c
+++ b/drivers/input/touchscreen/tsc2007_core.c
@@ -20,6 +20,7 @@
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/gpio/consumer.h>
+#include <linux/gpio/driver.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/i2c.h>
@@ -108,6 +109,14 @@ bool tsc2007_is_pen_down(struct tsc2007 *ts)
return ts->get_pendown_state(&ts->client->dev);
}
+bool tsc2007_is_pen_down_cansleep(struct tsc2007 *ts)
+{
+ if (!ts->get_pendown_state_cansleep)
+ return true;
+
+ return ts->get_pendown_state_cansleep(&ts->client->dev);
+}
+
static irqreturn_t tsc2007_soft_irq(int irq, void *handle)
{
struct tsc2007 *ts = handle;
@@ -115,7 +124,7 @@ static irqreturn_t tsc2007_soft_irq(int irq, void *handle)
struct ts_event tc;
u32 rt;
- while (!ts->stopped && tsc2007_is_pen_down(ts)) {
+ while (!ts->stopped && tsc2007_is_pen_down_cansleep(ts)) {
/* pen is down, continue with the measurement */
@@ -125,7 +134,7 @@ static irqreturn_t tsc2007_soft_irq(int irq, void *handle)
rt = tsc2007_calculate_resistance(ts, &tc);
- if (!rt && !ts->get_pendown_state) {
+ if (!rt && !ts->get_pendown_state_cansleep) {
/*
* If pressure reported is 0 and we don't have
* callback to check pendown state, we have to
@@ -229,6 +238,14 @@ static int tsc2007_get_pendown_state_gpio(struct device *dev)
return gpiod_get_value(ts->gpiod);
}
+static int tsc2007_get_pendown_state_gpio_cansleep(struct device *dev)
+{
+ struct i2c_client *client = to_i2c_client(dev);
+ struct tsc2007 *ts = i2c_get_clientdata(client);
+
+ return gpiod_get_value_cansleep(ts->gpiod);
+}
+
static int tsc2007_probe_properties(struct device *dev, struct tsc2007 *ts)
{
u32 val32;
@@ -264,10 +281,21 @@ static int tsc2007_probe_properties(struct device *dev, struct tsc2007 *ts)
if (IS_ERR(ts->gpiod))
return PTR_ERR(ts->gpiod);
- if (ts->gpiod)
- ts->get_pendown_state = tsc2007_get_pendown_state_gpio;
- else
+ if (ts->gpiod) {
+ /* to support detection during the hard IRQ, the GPIO chip is required to not sleep.
+ * this might be the case if the GPIO is e.g. behind an i2c-based GPIO expander.
+ * it is fine to sleep later in the soft IRQ, as it is threaded.
+ */
+ ts->get_pendown_state_cansleep = tsc2007_get_pendown_state_gpio_cansleep;
+ if (gpiod_to_chip(ts->gpiod) && !gpiod_to_chip(ts->gpiod)->can_sleep) {
+ ts->get_pendown_state = tsc2007_get_pendown_state_gpio;
+ } else {
+ dev_dbg(dev, "Pen down GPIO chip can sleep\n");
+ }
+
+ } else {
dev_warn(dev, "Pen down GPIO is not specified in properties\n");
+ }
return 0;
}
--
2.34.1
next reply other threads:[~2022-07-13 8:43 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-13 8:42 Benjamin Bara [this message]
2022-07-13 8:56 ` [PATCH] Input: tsc2007 - enable GPIO chips that can sleep Christophe JAILLET
2022-07-13 8:56 ` Christophe JAILLET
2022-07-15 7:14 ` Benjamin Bara
2022-07-15 7:45 ` [PATCH v2] " Benjamin Bara
2022-07-15 0:33 ` [PATCH] " kernel test robot
2022-07-15 0:53 ` kernel test robot
2022-07-15 3:59 ` kernel test robot
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=20220713084247.3090353-1-bbara93@gmail.com \
--to=bbara93@gmail.com \
--cc=benjamin.bara@skidata.com \
--cc=dmitry.torokhov@gmail.com \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=richard.leitner@skidata.com \
/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.