From: Benjamin Bara <bbara93@gmail.com>
To: dmitry.torokhov@gmail.com
Cc: christophe.jaillet@wanadoo.fr, richard.leitner@linux.dev,
linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
benjamin.bara@skidata.com
Subject: [PATCH v2] Input: tsc2007 - enable GPIO chips that can sleep
Date: Fri, 15 Jul 2022 09:45:34 +0200 [thread overview]
Message-ID: <20220715074534.3116678-1-bbara93@gmail.com> (raw)
In-Reply-To: <CAJpcXm6WkLt0pv7UYJ7K413j37ja9M++YUs9VzzaWqOWs1iGfg@mail.gmail.com>
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 | 34 ++++++++++++++++++++----
2 files changed, 30 insertions(+), 5 deletions(-)
diff --git a/drivers/input/touchscreen/tsc2007.h b/drivers/input/touchscreen/tsc2007.h
index 69b08dd6c8df..cdd90d727160 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 *dev);
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..eba35ee1e28c 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);
}
+static 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,17 @@ 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) {
+ ts->get_pendown_state_cansleep = tsc2007_get_pendown_state_gpio_cansleep;
+
+ /* pendown pin is read during hard irq -> gpio chip is not allowed to sleep */
+ 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 prev parent reply other threads:[~2022-07-15 7:45 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-13 8:42 [PATCH] Input: tsc2007 - enable GPIO chips that can sleep Benjamin Bara
2022-07-13 8:56 ` Christophe JAILLET
2022-07-13 8:56 ` Christophe JAILLET
2022-07-15 7:14 ` Benjamin Bara
2022-07-15 7:45 ` Benjamin Bara [this message]
2022-07-15 0:33 ` 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=20220715074534.3116678-1-bbara93@gmail.com \
--to=bbara93@gmail.com \
--cc=benjamin.bara@skidata.com \
--cc=christophe.jaillet@wanadoo.fr \
--cc=dmitry.torokhov@gmail.com \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=richard.leitner@linux.dev \
/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.