diff --git a/drivers/input/touchscreen/himax_v2_mmi/Android.mk b/drivers/input/touchscreen/himax_v2_mmi/Android.mk index d7c262af4192..0e916a51ee8e 100644 --- a/drivers/input/touchscreen/himax_v2_mmi/Android.mk +++ b/drivers/input/touchscreen/himax_v2_mmi/Android.mk @@ -14,6 +14,10 @@ ifneq ($(BOARD_USES_TOUCH_PALM),) KERNEL_CFLAGS += CONFIG_INPUT_TOUCHSCREEN_HIMAX_V2_MMI_ENABLE_PALM=y endif +ifneq ($(BOARD_USES_DOUBLE_TAP),) + KERNEL_CFLAGS += CONFIG_INPUT_HIMAX_V2_MMI_ENABLE_DOUBLE_TAP=y +endif + include $(CLEAR_VARS) LOCAL_MODULE := himax_v2_mmi.ko LOCAL_MODULE_TAGS := optional diff --git a/drivers/input/touchscreen/himax_v2_mmi/Kbuild b/drivers/input/touchscreen/himax_v2_mmi/Kbuild index 450d609237c7..ef0437cd3116 100644 --- a/drivers/input/touchscreen/himax_v2_mmi/Kbuild +++ b/drivers/input/touchscreen/himax_v2_mmi/Kbuild @@ -20,6 +20,10 @@ ifneq ($(filter m y,$(CONFIG_INPUT_TOUCHSCREEN_HIMAX_V2_MMI_ENABLE_PALM)),) EXTRA_CFLAGS += -DHIMAX_PALM_SENSOR_EN endif +ifneq ($(filter m y,$(CONFIG_INPUT_HIMAX_V2_MMI_ENABLE_DOUBLE_TAP)),) + EXTRA_CFLAGS += -DHIMAX_V2_SENSOR_EN +endif + obj-m := himax_v2_mmi.o ifneq ($(filter m y,$(CONFIG_INPUT_TOUCHSCREEN_HIMAX_V2_MMI_0FLASH)),) diff --git a/drivers/input/touchscreen/himax_v2_mmi/himax_common.c b/drivers/input/touchscreen/himax_v2_mmi/himax_common.c index 9b07b2bcea7a..bd9f9614ebe1 100644 --- a/drivers/input/touchscreen/himax_v2_mmi/himax_common.c +++ b/drivers/input/touchscreen/himax_v2_mmi/himax_common.c @@ -63,6 +63,29 @@ static struct sensors_classdev __maybe_unused palm_sensors_touch_cdev = { static void himax_palm_detect_func(struct himax_ts_data *ts, bool detected); #endif +#ifdef HIMAX_V2_SENSOR_EN +static struct sensors_classdev __maybe_unused sensors_touch_cdev = { + .name = "dt-gesture", + .vendor = "Himax", + .version = 1, + .type = SENSOR_TYPE_MOTO_DOUBLE_TAP, + .max_range = "5.0", + .resolution = "5.0", + .sensor_power = "1", + .min_delay = 0, + .max_delay = 0, + /* WAKE_UP & ON_CHANGE */ + .flags = 1 | 2, + .fifo_reserved_event_count = 0, + .fifo_max_event_count = 0, + .enabled = 0, + .delay_msec = 200, + .sensors_enable = NULL, + .sensors_poll_delay = NULL, +}; +#define REPORT_MAX_COUNT 10000 +#endif + #define SUPPORT_FINGER_DATA_CHECKSUM 0x0F #define TS_WAKE_LOCK_TIMEOUT (5000) #define FRAME_COUNT 5 @@ -1515,17 +1538,27 @@ END: static void himax_wake_event_report(void) { int KEY_EVENT = g_target_report_data->SMWP_event_chk; - +#ifdef HIMAX_V2_SENSOR_EN + static int report_cnt = 0; +#endif if (g_ts_dbg != 0) I("%s: Entering!\n", __func__); if (KEY_EVENT) { +#ifdef HIMAX_V2_SENSOR_EN + input_report_abs(private_ts->sensor_pdata->input_sensor_dev, ABS_DISTANCE, ++report_cnt); + I("input report: %d", report_cnt); + if (report_cnt >= REPORT_MAX_COUNT) + report_cnt = 0; + input_sync(private_ts->sensor_pdata->input_sensor_dev); +#else I(" %s SMART WAKEUP KEY event %d press\n", __func__, KEY_EVENT); input_report_key(private_ts->input_dev, KEY_EVENT, 1); input_sync(private_ts->input_dev); I(" %s SMART WAKEUP KEY event %d release\n", __func__, KEY_EVENT); input_report_key(private_ts->input_dev, KEY_EVENT, 0); input_sync(private_ts->input_dev); +#endif FAKE_POWER_KEY_SEND = true; #ifdef HX_GESTURE_TRACK I("gest_start_x= %d, gest_start_y= %d, gest_end_x= %d, gest_end_y= %d\n", gest_start_x, gest_start_y, @@ -2989,6 +3022,97 @@ int himax_palm_detect_sensor_remove(struct himax_ts_data *data) } #endif +#ifdef HIMAX_V2_SENSOR_EN +static int himax_tap_detect_sensor_set_enable(struct sensors_classdev *sensors_cdev, + unsigned int enable) +{ + int ret = 0; + struct himax_ts_data *ts = private_ts; + + if (enable) { + ts->SMWP_enable = 1; + ts->gesture_cust_en[0] = 1; + I("%s,here:%d, gesture_cust_en[0] = %d\n", __func__, __LINE__, ts->gesture_cust_en[0]); + } else { + ts->SMWP_enable = 0; + ts->gesture_cust_en[0] = 0; + I("%s,here:%d, gesture_cust_en[0] = %d\n", __func__, __LINE__, ts->gesture_cust_en[0]); + } + + g_core_fp.fp_set_SMWP_enable(ts->SMWP_enable, ts->suspended); + HX_SMWP_EN = ts->SMWP_enable; + I("%s: SMART_WAKEUP_enable = %d.\n", __func__, HX_SMWP_EN); + + return ret; +} + +static int himax_tap_detect_sensor_init(struct himax_ts_data *data) +{ + struct himax_tap_sensor_platform_data *sensor_pdata; + struct input_dev *sensor_input_dev; + int err; + + sensor_input_dev = input_allocate_device(); + if (!sensor_input_dev) { + E("Failed to allocate device"); + goto exit; + } + + sensor_pdata = devm_kzalloc(&sensor_input_dev->dev, + sizeof(struct himax_tap_sensor_platform_data), + GFP_KERNEL); + if (!sensor_pdata) { + E("Failed to allocate memory"); + goto free_sensor_pdata; + } + data->sensor_pdata = sensor_pdata; + + __set_bit(EV_ABS, sensor_input_dev->evbit); + __set_bit(EV_SYN, sensor_input_dev->evbit); + input_set_abs_params(sensor_input_dev, ABS_DISTANCE, + 0, REPORT_MAX_COUNT, 0, 0); + sensor_input_dev->name = "double-tap"; + data->sensor_pdata->input_sensor_dev = sensor_input_dev; + + err = input_register_device(sensor_input_dev); + if (err) { + E("Unable to register device, err=%d", err); + goto free_sensor_input_dev; + } + + sensor_pdata->ps_cdev = sensors_touch_cdev; + sensor_pdata->ps_cdev.sensors_enable = himax_tap_detect_sensor_set_enable; + sensor_pdata->data = data; + + err = sensors_classdev_register(&sensor_input_dev->dev, + &sensor_pdata->ps_cdev); + if (err) + goto unregister_sensor_input_device; + + return 0; + +unregister_sensor_input_device: + input_unregister_device(data->sensor_pdata->input_sensor_dev); +free_sensor_input_dev: + input_free_device(data->sensor_pdata->input_sensor_dev); +free_sensor_pdata: + devm_kfree(&sensor_input_dev->dev, sensor_pdata); + data->sensor_pdata= NULL; +exit: + return 1; +} + +int himax_tap_detect_sensor_remove(struct himax_ts_data *data) +{ + sensors_classdev_unregister(&data->sensor_pdata->ps_cdev); + input_unregister_device(data->sensor_pdata->input_sensor_dev); + devm_kfree(&data->sensor_pdata->input_sensor_dev->dev, + data->sensor_pdata); + data->sensor_pdata = NULL; + return 0; +} +#endif + void himax_ts_work(struct himax_ts_data *ts) { @@ -3586,6 +3710,13 @@ FW_force_upgrade: } #endif +#ifdef HIMAX_V2_SENSOR_EN + if (himax_tap_detect_sensor_init(ts)) { + E(" %s: himax_tap_detect_sensor_init failed!\n", __func__); + goto err_create_tap_sensor_failed; + } +#endif + himax_ts_register_interrupt(); #ifdef CONFIG_TOUCHSCREEN_HIMAX_DEBUG @@ -3602,6 +3733,9 @@ FW_force_upgrade: g_hx_chip_inited = true; return 0; +#ifdef HIMAX_V2_SENSOR_EN +err_create_tap_sensor_failed: +#endif #ifdef HIMAX_PALM_SENSOR_EN err_create_palm_sensor_failed: #endif diff --git a/drivers/input/touchscreen/himax_v2_mmi/himax_common.h b/drivers/input/touchscreen/himax_v2_mmi/himax_common.h index 086b54a54f03..c5a1360e98ae 100755 --- a/drivers/input/touchscreen/himax_v2_mmi/himax_common.h +++ b/drivers/input/touchscreen/himax_v2_mmi/himax_common.h @@ -43,6 +43,9 @@ #include #define SENSOR_TYPE_MOTO_TOUCH_PALM (SENSOR_TYPE_DEVICE_PRIVATE_BASE + 31) #endif +#ifdef HIMAX_V2_SENSOR_EN +#include +#endif #if defined(CONFIG_DRM) #include @@ -82,6 +85,14 @@ enum palm_sensor_lazy_set { }; #endif +#ifdef HIMAX_V2_SENSOR_EN +struct himax_tap_sensor_platform_data { + struct input_dev *input_sensor_dev; + struct sensors_classdev ps_cdev; + struct himax_ts_data *data; +}; +#endif + /*===========Himax Option function=============*/ #define HX_RST_PIN_FUNC #define HX_RESUME_SEND_CMD @@ -90,7 +101,11 @@ enum palm_sensor_lazy_set { /*#define HX_SHARP_ENABLE_PON*/ /*#define HX_NEW_EVENT_STACK_FORMAT*/ /*#define HX_AUTO_UPDATE_FW*/ -/*#define HX_SMART_WAKEUP*/ +#ifdef HIMAX_V2_SENSOR_EN +#define HX_SMART_WAKEUP +#else +//#define HX_SMART_WAKEUP +#endif /*#define HX_GESTURE_TRACK*/ /*#define HX_HIGH_SENSE*/ #ifdef HIMAX_PALM_SENSOR_EN @@ -493,6 +508,10 @@ struct himax_ts_data { #endif #endif +#ifdef HIMAX_V2_SENSOR_EN + struct himax_tap_sensor_platform_data *sensor_pdata; +#endif + }; struct himax_debug { diff --git a/drivers/input/touchscreen/himax_v2_mmi/himax_platform_QCT_SPI.c b/drivers/input/touchscreen/himax_v2_mmi/himax_platform_QCT_SPI.c index 8253d4086762..5ecbe43fd1b0 100755 --- a/drivers/input/touchscreen/himax_v2_mmi/himax_platform_QCT_SPI.c +++ b/drivers/input/touchscreen/himax_v2_mmi/himax_platform_QCT_SPI.c @@ -928,6 +928,12 @@ int drm_notifier_callback(struct notifier_block *self, I("%s: palm detection is enabled", __func__); return 1; } +#endif +#ifdef HIMAX_V2_SENSOR_EN + if (ts->SMWP_enable) { + I("%s: tap detection is enabled", __func__); + return 1; + } #endif break; }