| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (c) 2011-2015 Synaptics Incorporated |
|---|
| 3 | 4 | * Copyright (c) 2011 Unixphere |
|---|
| 4 | | - * |
|---|
| 5 | | - * This program is free software; you can redistribute it and/or modify it |
|---|
| 6 | | - * under the terms of the GNU General Public License version 2 as published by |
|---|
| 7 | | - * the Free Software Foundation. |
|---|
| 8 | 5 | */ |
|---|
| 9 | 6 | |
|---|
| 10 | 7 | #include <linux/kernel.h> |
|---|
| .. | .. |
|---|
| 415 | 412 | |
|---|
| 416 | 413 | /* Defs for Ctrl0. */ |
|---|
| 417 | 414 | #define RMI_F11_REPORT_MODE_MASK 0x07 |
|---|
| 415 | +#define RMI_F11_REPORT_MODE_CONTINUOUS (0 << 0) |
|---|
| 416 | +#define RMI_F11_REPORT_MODE_REDUCED (1 << 0) |
|---|
| 417 | +#define RMI_F11_REPORT_MODE_FS_CHANGE (2 << 0) |
|---|
| 418 | +#define RMI_F11_REPORT_MODE_FP_CHANGE (3 << 0) |
|---|
| 418 | 419 | #define RMI_F11_ABS_POS_FILT (1 << 3) |
|---|
| 419 | 420 | #define RMI_F11_REL_POS_FILT (1 << 4) |
|---|
| 420 | 421 | #define RMI_F11_REL_BALLISTICS (1 << 5) |
|---|
| .. | .. |
|---|
| 513 | 514 | struct rmi_2d_sensor_platform_data sensor_pdata; |
|---|
| 514 | 515 | unsigned long *abs_mask; |
|---|
| 515 | 516 | unsigned long *rel_mask; |
|---|
| 516 | | - unsigned long *result_bits; |
|---|
| 517 | 517 | }; |
|---|
| 518 | 518 | |
|---|
| 519 | 519 | enum f11_finger_state { |
|---|
| .. | .. |
|---|
| 1060 | 1060 | /* |
|---|
| 1061 | 1061 | ** init instance data, fill in values and create any sysfs files |
|---|
| 1062 | 1062 | */ |
|---|
| 1063 | | - f11 = devm_kzalloc(&fn->dev, sizeof(struct f11_data) + mask_size * 3, |
|---|
| 1063 | + f11 = devm_kzalloc(&fn->dev, sizeof(struct f11_data) + mask_size * 2, |
|---|
| 1064 | 1064 | GFP_KERNEL); |
|---|
| 1065 | 1065 | if (!f11) |
|---|
| 1066 | 1066 | return -ENOMEM; |
|---|
| .. | .. |
|---|
| 1079 | 1079 | + sizeof(struct f11_data)); |
|---|
| 1080 | 1080 | f11->rel_mask = (unsigned long *)((char *)f11 |
|---|
| 1081 | 1081 | + sizeof(struct f11_data) + mask_size); |
|---|
| 1082 | | - f11->result_bits = (unsigned long *)((char *)f11 |
|---|
| 1083 | | - + sizeof(struct f11_data) + mask_size * 2); |
|---|
| 1084 | 1082 | |
|---|
| 1085 | 1083 | set_bit(fn->irq_pos, f11->abs_mask); |
|---|
| 1086 | 1084 | set_bit(fn->irq_pos + 1, f11->rel_mask); |
|---|
| .. | .. |
|---|
| 1201 | 1199 | ctrl->ctrl0_11[RMI_F11_DELTA_Y_THRESHOLD] = |
|---|
| 1202 | 1200 | sensor->axis_align.delta_y_threshold; |
|---|
| 1203 | 1201 | |
|---|
| 1202 | + /* |
|---|
| 1203 | + * If distance threshold values are set, switch to reduced reporting |
|---|
| 1204 | + * mode so they actually get used by the controller. |
|---|
| 1205 | + */ |
|---|
| 1206 | + if (sensor->axis_align.delta_x_threshold || |
|---|
| 1207 | + sensor->axis_align.delta_y_threshold) { |
|---|
| 1208 | + ctrl->ctrl0_11[0] &= ~RMI_F11_REPORT_MODE_MASK; |
|---|
| 1209 | + ctrl->ctrl0_11[0] |= RMI_F11_REPORT_MODE_REDUCED; |
|---|
| 1210 | + } |
|---|
| 1211 | + |
|---|
| 1204 | 1212 | if (f11->sens_query.has_dribble) { |
|---|
| 1205 | 1213 | switch (sensor->dribble) { |
|---|
| 1206 | 1214 | case RMI_REG_STATE_OFF: |
|---|