diff --git a/drivers/input/touchscreen/synaptics_i2c_rmi4.c b/drivers/input/touchscreen/synaptics_i2c_rmi4.c index 6bdeb559e5cf15d2918ecbccea2031e377cb36bb..0ae5eb6f19eabb5df23c84ced6111f4cd16d5049 100644 --- a/drivers/input/touchscreen/synaptics_i2c_rmi4.c +++ b/drivers/input/touchscreen/synaptics_i2c_rmi4.c @@ -97,6 +97,11 @@ enum object_type { OBJECT_TYPE_HAND_EDGE = 0x08 }; +enum DOZE_MODE { + DOZE_SLEEP = 0, + DOZE_ACTIVE = 1 +}; + #define DEVICE_CONFIGURED 0x1 #define RMI4_VTG_MIN_UV 2700000 @@ -1672,6 +1677,14 @@ static int synaptics_rmi4_parse_dt(struct device *dev, return rc; } + rc = of_property_read_u32(np, "synaptics,doze-interval-active", &temp_val); + if (!rc) + rmi4_pdata->doze_interval_active = temp_val; + + rc = of_property_read_u32(np, "synaptics,doze-interval-sleep", &temp_val); + if (!rc) + rmi4_pdata->doze_interval_sleep = temp_val; + rc = of_property_read_u32(np, "synaptics,palm-detect-threshold", &temp_val); if (!rc) rmi4_pdata->palm_detect_threshold = temp_val; @@ -3044,6 +3057,24 @@ static void synaptics_rmi4_init_work(struct work_struct *work) rmi4_data->suspended = false; } +static int synaptics_rmi4_set_doze_interval(struct synaptics_rmi4_data + *rmi4_data, int active) +{ + int retval = 0; + unsigned char interval; + + interval = active ? rmi4_data->board->doze_interval_active : + rmi4_data->board->doze_interval_sleep; + + if (interval) + retval = synaptics_rmi4_i2c_write(rmi4_data, + rmi4_data->f01_ctrl_base_addr + 1 + + rmi4_data->num_of_intr_regs, + &interval, 1); + + return retval; +} + /** * synaptics_rmi4_probe() * @@ -3196,6 +3227,8 @@ static int synaptics_rmi4_probe(struct i2c_client *client, goto err_free_gpios; } + synaptics_rmi4_set_doze_interval(rmi4_data, DOZE_ACTIVE); + if (rmi4_data->board->disp_maxx) rmi4_data->disp_maxx = rmi4_data->board->disp_maxx; else @@ -3849,6 +3882,8 @@ static int synaptics_rmi4_suspend(struct device *dev) return 0; } + synaptics_rmi4_set_doze_interval(rmi4_data, DOZE_SLEEP); + if (device_may_wakeup(&rmi4_data->i2c_client->dev)) { need_wakeup = 1; rmi4_data->suspended = true; @@ -3927,6 +3962,8 @@ static int synaptics_rmi4_resume(struct device *dev) return 0; } + synaptics_rmi4_set_doze_interval(rmi4_data, DOZE_ACTIVE); + if (device_may_wakeup(&rmi4_data->i2c_client->dev)) { need_wakeup = 0; rmi4_data->suspended = 0; diff --git a/include/linux/input/synaptics_dsx.h b/include/linux/input/synaptics_dsx.h index 9c908a770d154d5a2f9d9283d76d57d88213c9f1..25947a1c7882f00c3f722a0a2c645993d4f89c60 100644 --- a/include/linux/input/synaptics_dsx.h +++ b/include/linux/input/synaptics_dsx.h @@ -81,6 +81,8 @@ struct synaptics_rmi4_platform_data { unsigned pon_delay; unsigned palm_detect_threshold; unsigned palm_detect_keycode; + unsigned doze_interval_active; + unsigned doze_interval_sleep; const char *fw_image_name; int (*gpio_config)(unsigned gpio, bool configure); struct synaptics_rmi4_capacitance_button_map *capacitance_button_map;