summaryrefslogtreecommitdiff
path: root/drivers/input
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-08-18 12:04:16 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-08-18 12:04:15 -0700
commit506ab3cee1829b9920b84faf4a5c717d4cc6cbae (patch)
treec0722eef2709ccfad1b97f635f87c44931429d82 /drivers/input
parent84209a3ac4fc56c9574d6036e77f8aeee6961400 (diff)
parentaee223238b3932989b8ab68fdae1dcbafd1c53b0 (diff)
Merge "input: touchscreen: correct the return value in ITE tech touch driver"
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/touchscreen/it7258_ts_i2c.c73
1 files changed, 50 insertions, 23 deletions
diff --git a/drivers/input/touchscreen/it7258_ts_i2c.c b/drivers/input/touchscreen/it7258_ts_i2c.c
index 9080a13069a8..88b1d3c013c7 100644
--- a/drivers/input/touchscreen/it7258_ts_i2c.c
+++ b/drivers/input/touchscreen/it7258_ts_i2c.c
@@ -117,6 +117,7 @@
#define PD_FLAGS_DATA_TYPE_BITS 0xF0
/* other types (like chip-detected gestures) exist but we do not care */
#define PD_FLAGS_DATA_TYPE_TOUCH 0x00
+#define PD_FLAGS_IDLE_TO_ACTIVE 0x10
/* a bit for each finger data that is valid (from lsb to msb) */
#define PD_FLAGS_HAVE_FINGERS 0x07
#define PD_PALM_FLAG_BIT 0x01
@@ -137,15 +138,15 @@
#define PINCTRL_STATE_RELEASE "pmx_ts_release"
struct finger_data {
- uint8_t xLo;
- uint8_t hi;
- uint8_t yLo;
- uint8_t pressure;
+ u8 xLo;
+ u8 hi;
+ u8 yLo;
+ u8 pressure;
} __packed;
struct point_data {
- uint8_t flags;
- uint8_t palm;
+ u8 flags;
+ u8 gesture_id;
struct finger_data fd[3];
} __packed;
@@ -179,7 +180,7 @@ struct it7260_ts_data {
const struct it7260_ts_platform_data *pdata;
struct regulator *vdd;
struct regulator *avdd;
- bool device_needs_wakeup;
+ bool in_low_power_mode;
bool suspended;
bool fw_upgrade_result;
bool cfg_upgrade_result;
@@ -743,18 +744,31 @@ out:
static int it7260_ts_chip_low_power_mode(struct it7260_ts_data *ts_data,
const u8 sleep_type)
{
- const uint8_t cmd_sleep[] = {CMD_PWR_CTL, 0x00, sleep_type};
- uint8_t dummy;
+ const u8 cmd_sleep[] = {CMD_PWR_CTL, 0x00, sleep_type};
+ u8 dummy;
+ int ret;
- if (sleep_type)
- it7260_i2c_write_no_ready_check(ts_data, BUF_COMMAND, cmd_sleep,
- sizeof(cmd_sleep));
- else
- it7260_i2c_read_no_ready_check(ts_data, BUF_QUERY, &dummy,
+ if (sleep_type) {
+ ret = it7260_i2c_write_no_ready_check(ts_data, BUF_COMMAND,
+ cmd_sleep, sizeof(cmd_sleep));
+ if (ret != IT_I2C_WRITE_RET)
+ dev_err(&ts_data->client->dev,
+ "Can't go to sleep or low power mode(%d) %d\n",
+ sleep_type, ret);
+ else
+ ret = 0;
+ } else {
+ ret = it7260_i2c_read_no_ready_check(ts_data, BUF_QUERY, &dummy,
sizeof(dummy));
+ if (ret != IT_I2C_READ_RET)
+ dev_err(&ts_data->client->dev,
+ "Can't go to active mode %d\n", ret);
+ else
+ ret = 0;
+ }
msleep(WAIT_CHANGE_MODE);
- return 0;
+ return ret;
}
static ssize_t sysfs_fw_upgrade_store(struct device *dev,
@@ -1226,18 +1240,28 @@ static irqreturn_t it7260_ts_threaded_handler(int irq, void *devid)
* schedule a work that tells the pm core to relax once the CPU
* cores are up.
*/
- if (ts_data->device_needs_wakeup) {
+ if ((pt_data.flags & PD_FLAGS_DATA_TYPE_BITS) ==
+ PD_FLAGS_IDLE_TO_ACTIVE &&
+ pt_data.gesture_id == 0) {
pm_stay_awake(&ts_data->client->dev);
input_report_key(input_dev, KEY_WAKEUP, 1);
input_sync(input_dev);
input_report_key(input_dev, KEY_WAKEUP, 0);
input_sync(input_dev);
schedule_work(&ts_data->work_pm_relax);
- return IRQ_HANDLED;
+ } else {
+ dev_dbg(&ts_data->client->dev,
+ "Ignore the touch data\n");
}
+ return IRQ_HANDLED;
}
- palm_detected = pt_data.palm & PD_PALM_FLAG_BIT;
+ /*
+ * Check if touch data also includes any palm gesture or not.
+ * If palm gesture is detected, then send the keycode parsed
+ * from the DT.
+ */
+ palm_detected = pt_data.gesture_id & PD_PALM_FLAG_BIT;
if (palm_detected && ts_data->pdata->palm_detect_en) {
input_report_key(input_dev,
ts_data->pdata->palm_detect_keycode, 1);
@@ -2084,7 +2108,7 @@ static int it7260_ts_resume(struct device *dev)
int retval;
if (device_may_wakeup(dev)) {
- if (ts_data->device_needs_wakeup) {
+ if (ts_data->in_low_power_mode) {
/* Set active current for the avdd regulator */
if (ts_data->pdata->avdd_lpm_cur) {
retval = reg_set_optimum_mode_check(
@@ -2095,7 +2119,7 @@ static int it7260_ts_resume(struct device *dev)
retval);
}
- ts_data->device_needs_wakeup = false;
+ ts_data->in_low_power_mode = false;
disable_irq_wake(ts_data->client->irq);
}
return 0;
@@ -2130,10 +2154,13 @@ static int it7260_ts_suspend(struct device *dev)
}
if (device_may_wakeup(dev)) {
- if (!ts_data->device_needs_wakeup) {
+ if (!ts_data->in_low_power_mode) {
/* put the device in low power idle mode */
- it7260_ts_chip_low_power_mode(ts_data,
+ retval = it7260_ts_chip_low_power_mode(ts_data,
PWR_CTL_LOW_POWER_MODE);
+ if (retval)
+ dev_err(dev, "Can't go to low power mode %d\n",
+ retval);
/* Set lpm current for avdd regulator */
if (ts_data->pdata->avdd_lpm_cur) {
@@ -2145,7 +2172,7 @@ static int it7260_ts_suspend(struct device *dev)
retval);
}
- ts_data->device_needs_wakeup = true;
+ ts_data->in_low_power_mode = true;
enable_irq_wake(ts_data->client->irq);
}
return 0;