diff --git a/drivers/input/touchscreen/ili9882_mmi/Android.mk b/drivers/input/touchscreen/ili9882_mmi/Android.mk index 4b0116551a03..80f61d580f2b 100644 --- a/drivers/input/touchscreen/ili9882_mmi/Android.mk +++ b/drivers/input/touchscreen/ili9882_mmi/Android.mk @@ -67,6 +67,10 @@ ifeq ($(GTP_ENABLE_DDA_STYLUS),true) KBUILD_OPTIONS += CONFIG_GTP_DDA_STYLUS=y endif +ifeq ($(BOARD_USES_DOUBLE_TAP_CTRL),true) + KBUILD_OPTIONS += CONFIG_BOARD_USES_DOUBLE_TAP_CTRL=y +endif + include $(CLEAR_VARS) ifneq ($(BOARD_USES_DOUBLE_TAP),) LOCAL_ADDITIONAL_DEPENDENCIES += $(KERNEL_MODULES_OUT)/sensors_class.ko diff --git a/drivers/input/touchscreen/ili9882_mmi/Kbuild b/drivers/input/touchscreen/ili9882_mmi/Kbuild index 62b3e7b9b34e..f3a8915dc471 100644 --- a/drivers/input/touchscreen/ili9882_mmi/Kbuild +++ b/drivers/input/touchscreen/ili9882_mmi/Kbuild @@ -17,6 +17,10 @@ ifneq ($(filter m y,$(CONFIG_INPUT_ILI_0FLASH_MMI_NOTIFY_TOUCH_STATE)),) EXTRA_CFLAGS += -DILI_SET_TOUCH_STATE endif +ifneq ($(filter m y, $(CONFIG_BOARD_USES_DOUBLE_TAP_CTRL)),) + EXTRA_CFLAGS += -DCONFIG_BOARD_USES_DOUBLE_TAP_CTRL +endif + ifneq ($(filter m y,$(CONFIG_INPUT_ILI_PANEL_NOTIFICATIONS)),) EXTRA_CFLAGS += -DILI_CONFIG_PANEL_NOTIFICATIONS endif diff --git a/drivers/input/touchscreen/ili9882_mmi/ili9882.h b/drivers/input/touchscreen/ili9882_mmi/ili9882.h index 5397c218334c..2480aee2cfa5 100755 --- a/drivers/input/touchscreen/ili9882_mmi/ili9882.h +++ b/drivers/input/touchscreen/ili9882_mmi/ili9882.h @@ -220,6 +220,14 @@ do { \ pr_info("ILITEK: (%s, %d): " fmt, __func__, __LINE__, ##arg); \ } while (0) +#define GET_TS_DATA(dev) { \ + ts_data = dev_get_drvdata(dev); \ + if (!ts_data) { \ + ILI_ERR("Failed to get driver data"); \ + return -ENODEV; \ + } \ +} + #define ERR_ALLOC_MEM(X) ((IS_ERR(X) || X == NULL) ? 1 : 0) #define K (1024) #define M (K * K) diff --git a/drivers/input/touchscreen/ili9882_mmi/ili_mmi_class.c b/drivers/input/touchscreen/ili9882_mmi/ili_mmi_class.c index 5f4cf919216e..9288941996f5 100644 --- a/drivers/input/touchscreen/ili9882_mmi/ili_mmi_class.c +++ b/drivers/input/touchscreen/ili9882_mmi/ili_mmi_class.c @@ -184,6 +184,12 @@ static int ili_mmi_firmware_update(struct device *dev, char *fwname) static int ili_mmi_panel_state(struct device *dev, enum ts_mmi_pm_mode from, enum ts_mmi_pm_mode to) { + struct ilitek_ts_data __maybe_unused *ts_data; +#if defined(CONFIG_BOARD_USES_DOUBLE_TAP_CTRL) + unsigned char gesture_type = 0; +#endif + GET_TS_DATA(dev); + ILI_INFO("%s: panel state change: %d->%d\n", __func__, from, to); ILI_INFO("panel state change: %d->%d\n", from, to); switch (to) { @@ -191,27 +197,32 @@ static int ili_mmi_panel_state(struct device *dev, #ifdef ILI_SET_TOUCH_STATE ilits->should_enable_gesture = true; touch_set_state(TS_MMI_PM_GESTURE, TOUCH_PANEL_IDX_PRIMARY); +#else + ilits->should_enable_gesture = false; #endif - break; - case TS_MMI_PM_GESTURE_SINGLE: - ilits->ges_sym.single_tap = SINGLE_TAP; - ILI_INFO("enable single gesture mode\n"); - break; - case TS_MMI_PM_GESTURE_DOUBLE: - ilits->ges_sym.double_tap = DOUBLE_TAP; - ILI_INFO("enable double gesture mode\n"); - break; - case TS_MMI_PM_GESTURE_SWITCH: -#ifdef ILI_SET_TOUCH_STATE - ilits->should_enable_gesture = true; - touch_set_state(TS_MMI_PM_GESTURE, TOUCH_PANEL_IDX_PRIMARY); -#endif +#if defined(CONFIG_BOARD_USES_DOUBLE_TAP_CTRL) + if (ts_data->imports && ts_data->imports->get_gesture_type) { + ts_data->imports->get_gesture_type(ts_data->dev, &gesture_type); + } + + if (gesture_type & TS_MMI_GESTURE_SINGLE) { + ilits->ges_sym.single_tap = SINGLE_TAP; + ILI_INFO("enable single gesture mode\n"); + } + + if (gesture_type & TS_MMI_GESTURE_DOUBLE) { + ilits->ges_sym.double_tap = DOUBLE_TAP; + ILI_INFO("enable double gesture mode\n"); + } + /*---write command to enter "wakeup gesture mode"---*/ ili_sleep_handler(TP_SUSPEND); ilits->ges_sym.single_tap = OFF; ilits->ges_sym.double_tap = OFF; +#endif break; + case TS_MMI_PM_DEEPSLEEP: ilits->should_enable_gesture = false; #ifdef ILI_SET_TOUCH_STATE