Kiev: Add ft8756 single-tap wakeup gesture

TP:
Report the signle-tap wakeup gesture to doble-tap Sensor through
touchscreen class.

NO_PROP_NEEDED

Change-Id: I243b3d7263d7da17232637973882640caa279732
Reviewed-on: https://gerrit.mot.com/1673468
SLTApproved: Slta Waiver
SME-Granted: SME Approvals Granted
Tested-by: Jira Key
Reviewed-by: Jichao Zou <zoujc@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
litong 2020-07-13 17:22:20 +08:00 • committed by litong20
commit 4642e2a1b6
4 changed files with 54 additions and 0 deletions

View file

@ -1598,6 +1598,10 @@ static int fts_parse_dt(struct device *dev, struct fts_ts_platform_data *pdata)
if (pdata->report_gesture_key)
FTS_INFO("Report tap gesture as key.");
pdata->notify_to_panel = of_property_read_bool(np, "focaltech,notify_to_panel");
if (pdata->notify_to_panel)
FTS_INFO("Notify touch status to panel.");
pdata->irq_gpio = of_get_named_gpio_flags(np, "focaltech,irq-gpio",
0, &pdata->irq_gpio_flags);
if (pdata->irq_gpio < 0)

View file

@ -62,6 +62,9 @@
#include <linux/kthread.h>
#include <linux/dma-mapping.h>
#include "focaltech_common.h"
#if defined(CONFIG_INPUT_TOUCHSCREEN_MMI)
#include <linux/touchscreen_mmi.h>
#endif
#ifdef FTS_USB_DETECT_EN
#include <linux/power_supply.h>
#endif
@ -140,6 +143,7 @@ struct fts_ts_platform_data {
bool report_gesture_key;
bool share_reset_gpio;
bool have_key;
bool notify_to_panel;
u32 key_number;
u32 keys[FTS_MAX_KEYS];
u32 key_y_coords[FTS_MAX_KEYS];
@ -265,6 +269,10 @@ struct fts_ts_data {
struct wakeup_source palm_gesture_read_wakelock;
#endif
#endif
#if defined(CONFIG_INPUT_TOUCHSCREEN_MMI)
struct ts_mmi_class_methods *imports;
#endif
};
/*****************************************************************************

View file

@ -241,6 +241,7 @@ int fts_create_gesture_sysfs(struct device *dev)
static void fts_gesture_report(struct input_dev *input_dev, int gesture_id)
{
int gesture;
int ret = 0;
#ifdef FOCALTECH_SENSOR_EN
static int report_cnt = 0;
#endif
@ -297,6 +298,7 @@ static void fts_gesture_report(struct input_dev *input_dev, int gesture_id)
if (gesture != -1) {
FTS_DEBUG("Gesture Code=%d", gesture);
#ifdef FOCALTECH_SENSOR_EN
#ifndef CONFIG_INPUT_TOUCHSCREEN_MMI
if (!(fts_data->wakeable && fts_data->should_enable_gesture)) {
FTS_INFO("Gesture got but wakeable not set. Skip this gesture.");
return;
@ -312,15 +314,35 @@ static void fts_gesture_report(struct input_dev *input_dev, int gesture_id)
ABS_DISTANCE, ++report_cnt);
input_sync(fts_data->sensor_pdata->input_sensor_dev);
}
#else
if (!fts_data->wakeable) {
FTS_INFO("Gesture got but wakeable not set. Skip this gesture.");
return;
}
/* report single tap */
if (gesture == KEY_GESTURE_U) {
if (fts_data->imports && fts_data->imports->report_gesture) {
struct gesture_event_data event;
FTS_INFO("invoke imported report gesture function\n");
event.evcode = 1;
/* call class method */
ret = fts_data->imports->report_gesture(&event);
++report_cnt;
}
}
#endif
FTS_INFO("input report: %d", report_cnt);
if (report_cnt >= REPORT_MAX_COUNT)
report_cnt = 0;
if (!ret) {
#ifdef CONFIG_HAS_WAKELOCK
wake_lock_timeout(&gesture_wakelock, msecs_to_jiffies(5000));
#else
__pm_wakeup_event(&gesture_wakelock, 5000);
#endif
}
#else
input_report_key(input_dev, gesture, 1);
input_sync(input_dev);
@ -331,6 +353,7 @@ static void fts_gesture_report(struct input_dev *input_dev, int gesture_id)
}
#ifdef FOCALTECH_SENSOR_EN
#ifndef CONFIG_INPUT_TOUCHSCREEN_MMI
static int fts_sensor_set_enable(struct sensors_classdev *sensors_cdev,
unsigned int enable)
{
@ -422,6 +445,7 @@ int fts_sensor_remove(struct fts_ts_data *data)
return 0;
}
#endif
#endif
/*****************************************************************************
* Name: fts_gesture_readdata
@ -629,8 +653,11 @@ int fts_gesture_init(struct fts_ts_data *ts_data)
#else
wakeup_source_init(&gesture_wakelock, "ets_wake_lock");
#endif
#ifndef CONFIG_INPUT_TOUCHSCREEN_MMI
if (!fts_sensor_init(ts_data))
#endif
initialized_sensor = true;
}
#endif

View file

@ -194,10 +194,12 @@ static int fts_mmi_firmware_update(struct device *dev, char *fwname)
static int fts_mmi_panel_state(struct device *dev,
enum ts_mmi_pm_mode from, enum ts_mmi_pm_mode to)
{
struct fts_ts_platform_data *pdata;
struct fts_ts_data *ts_data;
int ret = 0;
GET_TS_DATA(dev);
pdata = ts_data->pdata;
#ifdef FOCALTECH_SENSOR_EN
mutex_lock(&ts_data->state_mutex);
@ -205,6 +207,10 @@ static int fts_mmi_panel_state(struct device *dev,
switch (to) {
case TS_MMI_PM_DEEPSLEEP:
#ifdef CONFIG_PANEL_NOTIFICATIONS
if (pdata->notify_to_panel)
touch_set_state(TS_MMI_PM_DEEPSLEEP, TOUCH_PANEL_IDX_PRIMARY);
#endif
ret = fts_write_reg(FTS_REG_POWER_MODE, FTS_REG_POWER_MODE_SLEEP_VALUE);
if (ret < 0)
FTS_ERROR("set TP to sleep mode fail, ret=%d", ret);
@ -214,6 +220,10 @@ static int fts_mmi_panel_state(struct device *dev,
break;
case TS_MMI_PM_GESTURE:
#ifdef CONFIG_PANEL_NOTIFICATIONS
if (pdata->notify_to_panel)
touch_set_state(TS_MMI_PM_GESTURE, TOUCH_PANEL_IDX_PRIMARY);
#endif
#if FTS_GESTURE_EN
if (fts_gesture_suspend(ts_data) == 0) {
/* Enter into gesture mode(suspend) */
@ -347,7 +357,9 @@ static int fts_mmi_post_suspend(struct device *dev)
gpio_direction_output(ts_data->pdata->reset_gpio, 0);
}
fts_release_all_finger();
#ifdef FOCALTECH_SENSOR_EN
}
#endif
ts_data->suspended = true;
FTS_FUNC_EXIT();
@ -394,6 +406,9 @@ int fts_mmi_dev_register(struct fts_ts_data *ts_data) {
return ret;
}
/* initialize class imported methods */
ts_data->imports = &fts_mmi_methods.exports;
return 0;
}