From f4e210ff8da0a95f14991d00cf3f9232045948b0 Mon Sep 17 00:00:00 2001 From: Ondrej Jirman Date: Tue, 1 Oct 2019 02:21:43 +0200 Subject: [PATCH 080/351] input: cyttsp4: Restart on wakeup (wakeup by I2C read doesn't work) Signed-off-by: Ondrej Jirman --- drivers/input/touchscreen/cyttsp4_core.c | 30 ++++++++++++++++-------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/drivers/input/touchscreen/cyttsp4_core.c b/drivers/input/touchscreen/cyttsp4_core.c index 2c6de0e1961e..da82911b8605 100644 --- a/drivers/input/touchscreen/cyttsp4_core.c +++ b/drivers/input/touchscreen/cyttsp4_core.c @@ -26,7 +26,7 @@ #define CY_CORE_SLEEP_REQUEST_EXCLUSIVE_TIMEOUT 5000 #define CY_CORE_MODE_CHANGE_TIMEOUT 1000 #define CY_CORE_RESET_AND_WAIT_TIMEOUT 500 -#define CY_CORE_WAKEUP_TIMEOUT 50 +#define CY_CORE_WAKEUP_TIMEOUT 250 #define CY_CORE_STARTUP_RETRY_COUNT 3 @@ -123,13 +123,11 @@ static int cyttsp4_hw_reset(struct cyttsp4 *cd) return cyttsp4_hw_soft_reset(cd); gpiod_set_value_cansleep(cd->reset_gpio, 1); - msleep(20); - - gpiod_set_value_cansleep(cd->reset_gpio, 0); msleep(40); - gpiod_set_value_cansleep(cd->reset_gpio, 1); + gpiod_set_value_cansleep(cd->reset_gpio, 0); msleep(20); + return 0; } @@ -1510,12 +1508,14 @@ static int cyttsp4_core_sleep_(struct cyttsp4 *cd) } dev_vdbg(cd->dev, "%s: write DEEP SLEEP succeeded\n", __func__); + /* rc = cyttsp4_set_power(cd, 0); if (rc < 0) { dev_err(cd->dev, "%s: HW Power down fails r=%d\n", __func__, rc); goto error; } + */ /* Give time to FW to sleep */ msleep(50); @@ -1734,6 +1734,7 @@ static int cyttsp4_core_wake_(struct cyttsp4 *cd) u8 mode; int t; +#if 0 /* Already woken? */ mutex_lock(&cd->system_lock); if (cd->sleep_state == SS_SLEEP_OFF) { @@ -1751,7 +1752,8 @@ static int cyttsp4_core_wake_(struct cyttsp4 *cd) __func__, rc); /* Initiate a read transaction to wake up */ - cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), &mode); + rc = cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), &mode); + dev_err(dev, "Waking up by read rc=%d\n", rc); } else dev_vdbg(cd->dev, "%s: HW power up succeeds\n", __func__); @@ -1768,7 +1770,13 @@ static int cyttsp4_core_wake_(struct cyttsp4 *cd) cyttsp4_queue_startup_(cd); mutex_unlock(&cd->system_lock); } - +#else + mutex_lock(&cd->system_lock); + cd->int_status &= ~CY_INT_AWAKE; + /* Try starting up */ + cyttsp4_queue_startup_(cd); + mutex_unlock(&cd->system_lock); +#endif mutex_lock(&cd->system_lock); cd->sleep_state = SS_SLEEP_OFF; mutex_unlock(&cd->system_lock); @@ -1982,6 +1990,7 @@ struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops, return ERR_PTR(-ENOMEM); } + cd->irq = irq; cd->signals = cyttsp4_default_signals; cd->n_signals = ARRAY_SIZE(cyttsp4_default_signals); @@ -1995,7 +2004,8 @@ struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops, cd->vdd_supply = devm_regulator_get(dev, "vdd"); if (IS_ERR(cd->vdd_supply)) { rc = PTR_ERR(cd->vdd_supply); - dev_err(dev, "can't get vdd power (%d)\n", rc); + if (rc != -EPROBE_DEFER) + dev_err(dev, "can't get vdd power (%d)\n", rc); return ERR_PTR(rc); } @@ -2009,14 +2019,14 @@ struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops, if (IS_ERR(cd->reset_gpio)) { rc = PTR_ERR(cd->reset_gpio); dev_err(dev, "can't get reset gpio (%d)\n", rc); - return ERR_PTR(rc); + goto error_disable_vdd; } cd->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); if (IS_ERR(cd->reset_gpio)) { rc = PTR_ERR(cd->reset_gpio); dev_err(dev, "can't get reset gpio (%d)\n", rc); - return ERR_PTR(rc); + goto error_disable_vdd; } cd->xfer_buf = devm_kzalloc(dev, xfer_buf_size, GFP_KERNEL); -- 2.34.0