diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.c b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.c index 63f903eb09ff..6544ac4cbea5 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.c +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.c @@ -1127,6 +1127,13 @@ static int goodix_parse_dt(struct device_node *node, if (board_data->edge_ctrl) ts_info("support goodix edge mode"); + if (of_property_read_bool(node, "goodix,gesture-wait-pm")) { + ts_info("gesture-wait-pm set"); + board_data->gesture_wait_pm = true; + } else { + board_data->gesture_wait_pm = false; + } + return 0; } #endif @@ -2063,6 +2070,36 @@ static int goodix_ts_pm_resume(struct device *dev) return goodix_ts_resume(core_data); } +#elif defined (CONFIG_TOUCHSCREEN_GOODIX_BRL_SPI) +static int goodix_ts_pm_suspend(struct device *dev) +{ + struct goodix_ts_core *core_data = + dev_get_drvdata(dev); + + ts_debug("CALL BACK TP PM SUSPEND"); + + atomic_set(&core_data->pm_resume, 0); + + return 0; +} +/** + * goodix_ts_pm_resume - PM resume function + * Called by kernel during system wakeup + */ +static int goodix_ts_pm_resume(struct device *dev) +{ + struct goodix_ts_core *core_data = + dev_get_drvdata(dev); + + ts_debug("CALL BACK TP PM RESUME"); + + atomic_set(&core_data->pm_resume, 1); + + if (core_data->board_data.gesture_wait_pm) + wake_up_interruptible(&core_data->pm_wq); + + return 0; +} #endif #endif @@ -2424,6 +2461,10 @@ static int goodix_ts_probe(struct platform_device *pdev) goto err_register_gesture_wakelock; } + if (core_data->board_data.gesture_wait_pm) + init_waitqueue_head(&core_data->pm_wq); + atomic_set(&core_data->pm_resume, 1); + /* debug node init */ goodix_tools_init(); @@ -2489,6 +2530,9 @@ static const struct dev_pm_ops dev_pm_ops = { && !defined(CONFIG_INPUT_TOUCHSCREEN_MMI) .suspend = goodix_ts_pm_suspend, .resume = goodix_ts_pm_resume, +#elif defined (CONFIG_TOUCHSCREEN_GOODIX_BRL_SPI) + .suspend = goodix_ts_pm_suspend, + .resume = goodix_ts_pm_resume, #endif }; #endif diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.h b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.h index 44384f598514..46f5a44e5a28 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.h +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.h @@ -294,6 +294,7 @@ struct goodix_ts_board_data { bool interpolation_ctrl; bool report_rate_ctrl; bool edge_ctrl; + bool gesture_wait_pm; }; enum goodix_fw_update_mode { @@ -536,6 +537,8 @@ struct goodix_ts_core { #ifdef CONFIG_GTP_FOD unsigned char gesture_type; #endif + atomic_t pm_resume; + wait_queue_head_t pm_wq; }; /* external module structures */ diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_gesture_fod.c b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_gesture_fod.c index 3a515bc874df..6e11f6229078 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_gesture_fod.c +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_gesture_fod.c @@ -379,6 +379,17 @@ static int gsx_gesture_ist(struct goodix_ts_core *cd, #endif if (atomic_read(&cd->suspended) == 0 || cd->gesture_type == 0) return EVT_CONTINUE; + + if (cd->board_data.gesture_wait_pm) { + PM_WAKEUP_EVENT(cd->gesture_wakelock, 3000); + /* Waiting for pm resume completed */ + ret = wait_event_interruptible_timeout(cd->pm_wq, atomic_read(&cd->pm_resume), msecs_to_jiffies(700)); + if (!ret) { + ts_err("system(spi) can't finished resuming procedure."); + return IRQ_HANDLED; + } + } + ret = hw_ops->event_handler(cd, &gs_event); if (ret) { ts_err("failed get gesture data");