From 9db2172413c39aae92f3533390c98c87ce025cd7 Mon Sep 17 00:00:00 2001 From: Shiyong Li Date: Tue, 3 Mar 2020 11:20:16 -0800 Subject: [PATCH] sec_mmi: timeout to wait for wake lock at suspend As sec_mmi_pre_suspend() is called in the path of display-off, too long blocking would possibly cause user space module "Display Controller" to be out of syncing display power state. Set a timeout for checking wake lock instead of waiting for forever. Change-Id: Ie72bda93eaaf66e89ed34d33911ec1fdfea5b0cb Signed-off-by: Shiyong Li Reviewed-on: https://gerrit.mot.com/1506510 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Igor Kovalenko Submit-Approved: Jira Key --- drivers/input/touchscreen/sec_mmi/sec_ts_mmi_class.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/input/touchscreen/sec_mmi/sec_ts_mmi_class.c b/drivers/input/touchscreen/sec_mmi/sec_ts_mmi_class.c index 240db41eb399..49a1b356c55b 100644 --- a/drivers/input/touchscreen/sec_mmi/sec_ts_mmi_class.c +++ b/drivers/input/touchscreen/sec_mmi/sec_ts_mmi_class.c @@ -42,6 +42,8 @@ } \ } +#define WAKELOCK_CHECKING_TIMEOUT_MS 300 + static ssize_t sec_mmi_suppression_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size); static ssize_t sec_mmi_suppression_show(struct device *dev, @@ -766,6 +768,7 @@ static int sec_mmi_wait_for_ready(struct device *dev) { static int sec_mmi_pre_suspend(struct device *dev) { struct sec_ts_data *ts = dev_get_drvdata(dev); unsigned long start_wait_jiffies = jiffies; + unsigned int timeout = 0; if (!ts) { dev_err(dev, "Failed to get driver data"); @@ -775,6 +778,11 @@ static int sec_mmi_pre_suspend(struct device *dev) { do { if (!ts->wakelock.active) break; + if (++timeout > WAKELOCK_CHECKING_TIMEOUT_MS) { + dev_err(dev, "%s: %d ms timeout of checking wakelock\n", + __func__, WAKELOCK_CHECKING_TIMEOUT_MS); + return -ETIMEDOUT; + } usleep_range(1000, 1000); } while (1);