107 lines
3.3 KiB
Diff
107 lines
3.3 KiB
Diff
|
From f74ca64f38e0e7724a8ac6cb032a715aa4b14e17 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Ond=C5=99ej=20Jirman?= <megi@xff.cz>
|
||
|
Date: Mon, 14 Oct 2019 18:00:32 +0200
|
||
|
Subject: [PATCH 073/464] input: cyttsp4: Make the driver not hog the system's
|
||
|
workqueue
|
||
|
|
||
|
The driver's work items can take 100's of ms, use a separate
|
||
|
thread for this.
|
||
|
|
||
|
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||
|
---
|
||
|
drivers/input/touchscreen/cyttsp4_core.c | 20 ++++++++++++++------
|
||
|
drivers/input/touchscreen/cyttsp4_core.h | 3 ++-
|
||
|
2 files changed, 16 insertions(+), 7 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/input/touchscreen/cyttsp4_core.c b/drivers/input/touchscreen/cyttsp4_core.c
|
||
|
index b8f100d7bbea..cb235f560439 100644
|
||
|
--- a/drivers/input/touchscreen/cyttsp4_core.c
|
||
|
+++ b/drivers/input/touchscreen/cyttsp4_core.c
|
||
|
@@ -720,7 +720,7 @@ static void cyttsp4_queue_startup_(struct cyttsp4 *cd)
|
||
|
{
|
||
|
if (cd->startup_state == STARTUP_NONE) {
|
||
|
cd->startup_state = STARTUP_QUEUED;
|
||
|
- schedule_work(&cd->startup_work);
|
||
|
+ queue_work(cd->wq, &cd->startup_work);
|
||
|
dev_dbg(cd->dev, "%s: cyttsp4_startup queued\n", __func__);
|
||
|
} else {
|
||
|
dev_dbg(cd->dev, "%s: startup_state = %d\n", __func__,
|
||
|
@@ -1236,9 +1236,7 @@ static void cyttsp4_watchdog_timer(struct timer_list *t)
|
||
|
|
||
|
dev_vdbg(cd->dev, "%s: Watchdog timer triggered\n", __func__);
|
||
|
|
||
|
- schedule_work(&cd->watchdog_work);
|
||
|
-
|
||
|
- return;
|
||
|
+ queue_work(cd->wq, &cd->watchdog_work);
|
||
|
}
|
||
|
|
||
|
static int cyttsp4_request_exclusive(struct cyttsp4 *cd, void *ownptr,
|
||
|
@@ -2047,6 +2045,13 @@ struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops,
|
||
|
goto error_disable_vdd;
|
||
|
}
|
||
|
|
||
|
+ cd->wq = alloc_workqueue("cyttsp4", WQ_SYSFS, 0);
|
||
|
+ if (!cd->wq) {
|
||
|
+ rc = -ENOMEM;
|
||
|
+ dev_err(dev, "failed to allocate workqueue\n");
|
||
|
+ goto error_disable_vdd;
|
||
|
+ }
|
||
|
+
|
||
|
/* Initialize device info */
|
||
|
cd->dev = dev;
|
||
|
cd->bus_ops = ops;
|
||
|
@@ -2070,7 +2075,7 @@ struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops,
|
||
|
if (rc) {
|
||
|
dev_err(cd->dev, "failed to request IRQ %d, err: %d\n",
|
||
|
cd->irq, rc);
|
||
|
- goto error_disable_vdd;
|
||
|
+ goto error_free_wq;
|
||
|
}
|
||
|
|
||
|
/* Setup watchdog timer */
|
||
|
@@ -2104,6 +2109,8 @@ struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops,
|
||
|
cyttsp4_stop_wd_timer(cd);
|
||
|
pm_runtime_disable(dev);
|
||
|
cyttsp4_free_si_ptrs(cd);
|
||
|
+error_free_wq:
|
||
|
+ destroy_workqueue(cd->wq);
|
||
|
error_disable_vdd:
|
||
|
gpiod_set_value_cansleep(cd->reset_gpio, 1);
|
||
|
gpiod_set_value_cansleep(cd->power_gpio, 0);
|
||
|
@@ -2131,8 +2138,9 @@ int cyttsp4_remove(struct cyttsp4 *cd)
|
||
|
pm_runtime_suspend(dev);
|
||
|
pm_runtime_disable(dev);
|
||
|
|
||
|
- cancel_work_sync(&cd->startup_work);
|
||
|
cyttsp4_stop_wd_timer(cd);
|
||
|
+ cancel_work_sync(&cd->startup_work);
|
||
|
+ destroy_workqueue(cd->wq);
|
||
|
cyttsp4_free_si_ptrs(cd);
|
||
|
return 0;
|
||
|
}
|
||
|
diff --git a/drivers/input/touchscreen/cyttsp4_core.h b/drivers/input/touchscreen/cyttsp4_core.h
|
||
|
index cff547979b28..ac2d7b303f39 100644
|
||
|
--- a/drivers/input/touchscreen/cyttsp4_core.h
|
||
|
+++ b/drivers/input/touchscreen/cyttsp4_core.h
|
||
|
@@ -62,7 +62,7 @@ enum cyttsp_cmd_bits {
|
||
|
};
|
||
|
|
||
|
/* Timeout in ms. */
|
||
|
-#define CY_WATCHDOG_TIMEOUT 1000
|
||
|
+#define CY_WATCHDOG_TIMEOUT 10000
|
||
|
|
||
|
#define CY_MAX_PRINT_SIZE 512
|
||
|
#ifdef VERBOSE_DEBUG
|
||
|
@@ -316,6 +316,7 @@ struct cyttsp4 {
|
||
|
enum cyttsp4_startup_state startup_state;
|
||
|
int int_status;
|
||
|
wait_queue_head_t wait_q;
|
||
|
+ struct workqueue_struct *wq;
|
||
|
int irq;
|
||
|
struct work_struct startup_work;
|
||
|
struct work_struct watchdog_work;
|
||
|
--
|
||
|
2.34.1
|
||
|
|