.. | .. |
---|
| 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: |
---|