build/patch/kernel/archive/sunxi-6.1/patches.megous/input-cyttsp4-De-obfuscate-MT-signals-setup-platform-data.patch

265 lines
7.9 KiB
Diff
Raw Permalink Normal View History

From 2f6ce65b97d3773733a7955395f9e0214584f00f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20Jirman?= <megi@xff.cz>
Date: Sat, 28 Sep 2019 16:01:06 +0200
Subject: [PATCH 063/389] input: cyttsp4: De-obfuscate MT signals
setup/platform data
Original code does a lot of array math, and is needlessly complicated.
Make it easier to use and clean it up.
Signed-off-by: Ondrej Jirman <megi@xff.cz>
---
drivers/input/touchscreen/cyttsp4_core.c | 102 ++++++++++-------------
drivers/input/touchscreen/cyttsp4_core.h | 26 ------
include/linux/platform_data/cyttsp4.h | 27 ++++--
3 files changed, 66 insertions(+), 89 deletions(-)
diff --git a/drivers/input/touchscreen/cyttsp4_core.c b/drivers/input/touchscreen/cyttsp4_core.c
index c47a01362b7b..be8c460d4a37 100644
--- a/drivers/input/touchscreen/cyttsp4_core.c
+++ b/drivers/input/touchscreen/cyttsp4_core.c
@@ -853,31 +853,26 @@ static void cyttsp4_get_mt_touches(struct cyttsp4 *cd, int num_cur_tch)
struct device *dev = &cd->input->dev;
struct cyttsp4_sysinfo *si = cd->si;
struct cyttsp4_touch tch;
- int sig;
int i, j, t = 0;
int ids[max(CY_TMA1036_MAX_TCH, CY_TMA4XX_MAX_TCH)];
+ struct cyttsp4_signal_def* sig;
memset(ids, 0, si->si_ofs.tch_abs[CY_TCH_T].max * sizeof(int));
for (i = 0; i < num_cur_tch; i++) {
cyttsp4_get_touch(cd, &tch, si->xy_data +
- (i * si->si_ofs.tch_rec_size));
- if ((tch.abs[CY_TCH_T] < cd->pdata->frmwrk->abs
- [(CY_ABS_ID_OST * CY_NUM_ABS_SET) + CY_MIN_OST]) ||
- (tch.abs[CY_TCH_T] > cd->pdata->frmwrk->abs
- [(CY_ABS_ID_OST * CY_NUM_ABS_SET) + CY_MAX_OST])) {
+ (i * si->si_ofs.tch_rec_size));
+
+ sig = &cd->pdata->signals[CY_ABS_ID_OST];
+ if (tch.abs[CY_TCH_T] < sig->min ||
+ tch.abs[CY_TCH_T] > sig->max) {
dev_err(dev, "%s: tch=%d -> bad trk_id=%d max_id=%d\n",
- __func__, i, tch.abs[CY_TCH_T],
- cd->pdata->frmwrk->abs[(CY_ABS_ID_OST *
- CY_NUM_ABS_SET) + CY_MAX_OST]);
+ __func__, i, tch.abs[CY_TCH_T], sig->max);
continue;
}
/* use 0 based track id's */
- sig = cd->pdata->frmwrk->abs
- [(CY_ABS_ID_OST * CY_NUM_ABS_SET) + 0];
- if (sig != CY_IGNORE_VALUE) {
- t = tch.abs[CY_TCH_T] - cd->pdata->frmwrk->abs
- [(CY_ABS_ID_OST * CY_NUM_ABS_SET) + CY_MIN_OST];
+ if (sig->signal >= 0) {
+ t = tch.abs[CY_TCH_T] - sig->min;
if (tch.abs[CY_TCH_E] == CY_EV_LIFTOFF) {
dev_dbg(dev, "%s: t=%d e=%d lift-off\n",
__func__, t, tch.abs[CY_TCH_E]);
@@ -885,18 +880,18 @@ static void cyttsp4_get_mt_touches(struct cyttsp4 *cd, int num_cur_tch)
}
input_mt_slot(cd->input, t);
input_mt_report_slot_state(cd->input, MT_TOOL_FINGER,
- true);
+ true);
ids[t] = true;
}
/* all devices: position and pressure fields */
for (j = 0; j <= CY_ABS_W_OST; j++) {
- sig = cd->pdata->frmwrk->abs[((CY_ABS_X_OST + j) *
- CY_NUM_ABS_SET) + 0];
- if (sig != CY_IGNORE_VALUE)
- input_report_abs(cd->input, sig,
- tch.abs[CY_TCH_X + j]);
+ sig = &cd->pdata->signals[j];
+ if (sig->signal >= 0)
+ input_report_abs(cd->input, sig->signal,
+ tch.abs[CY_TCH_X + j]);
}
+
if (si->si_ofs.tch_rec_size > CY_TMA1036_TCH_REC_SIZE) {
/*
* TMA400 size and orientation fields:
@@ -909,12 +904,10 @@ static void cyttsp4_get_mt_touches(struct cyttsp4 *cd, int num_cur_tch)
/* Get the extended touch fields */
for (j = 0; j < CY_NUM_EXT_TCH_FIELDS; j++) {
- sig = cd->pdata->frmwrk->abs
- [((CY_ABS_MAJ_OST + j) *
- CY_NUM_ABS_SET) + 0];
- if (sig != CY_IGNORE_VALUE)
- input_report_abs(cd->input, sig,
- tch.abs[CY_TCH_MAJ + j]);
+ sig = &cd->pdata->signals[CY_ABS_MAJ_OST + j];
+ if (sig->signal >= 0)
+ input_report_abs(cd->input, sig->signal,
+ tch.abs[CY_TCH_MAJ + j]);
}
}
@@ -1884,7 +1877,7 @@ static void cyttsp4_mt_close(struct input_dev *input)
static int cyttsp4_setup_input_device(struct cyttsp4 *cd)
{
struct device *dev = cd->dev;
- int signal = CY_IGNORE_VALUE;
+ struct cyttsp4_signal_def *signal;
int max_x, max_y, max_p, min, max;
int max_x_tmp, max_y_tmp;
int i;
@@ -1909,37 +1902,30 @@ static int cyttsp4_setup_input_device(struct cyttsp4 *cd)
max_p = cd->si->si_ofs.max_p;
/* set event signal capabilities */
- for (i = 0; i < (cd->pdata->frmwrk->size / CY_NUM_ABS_SET); i++) {
- signal = cd->pdata->frmwrk->abs
- [(i * CY_NUM_ABS_SET) + CY_SIGNAL_OST];
- if (signal != CY_IGNORE_VALUE) {
- __set_bit(signal, cd->input->absbit);
- min = cd->pdata->frmwrk->abs
- [(i * CY_NUM_ABS_SET) + CY_MIN_OST];
- max = cd->pdata->frmwrk->abs
- [(i * CY_NUM_ABS_SET) + CY_MAX_OST];
- if (i == CY_ABS_ID_OST) {
- /* shift track ids down to start at 0 */
- max = max - min;
- min = min - min;
- } else if (i == CY_ABS_X_OST)
- max = max_x;
- else if (i == CY_ABS_Y_OST)
- max = max_y;
- else if (i == CY_ABS_P_OST)
- max = max_p;
- input_set_abs_params(cd->input, signal, min, max,
- cd->pdata->frmwrk->abs
- [(i * CY_NUM_ABS_SET) + CY_FUZZ_OST],
- cd->pdata->frmwrk->abs
- [(i * CY_NUM_ABS_SET) + CY_FLAT_OST]);
- dev_dbg(dev, "%s: register signal=%02X min=%d max=%d\n",
- __func__, signal, min, max);
- if ((i == CY_ABS_ID_OST) &&
- (cd->si->si_ofs.tch_rec_size <
- CY_TMA4XX_TCH_REC_SIZE))
- break;
- }
+ for (i = 0; i < cd->pdata->n_signals; i++) {
+ signal = &cd->pdata->signals[i];
+
+ __set_bit(signal->signal, cd->input->absbit);
+
+ max = signal->max;
+ min = signal->min;
+
+ if (signal->signal == ABS_MT_POSITION_X)
+ max = max_x;
+ else if (signal->signal == ABS_MT_POSITION_Y)
+ max = max_y;
+ else if (signal->signal == ABS_MT_PRESSURE)
+ max = max_p;
+
+ input_set_abs_params(cd->input, signal->signal, min, max,
+ signal->fuzz, signal->flat);
+ dev_dbg(dev, "%s: register signal=%02X min=%d max=%d\n",
+ __func__, signal->signal, min, max);
+
+ if ((i == CY_ABS_ID_OST) &&
+ (cd->si->si_ofs.tch_rec_size <
+ CY_TMA4XX_TCH_REC_SIZE))
+ break;
}
input_mt_init_slots(cd->input, cd->si->si_ofs.tch_abs[CY_TCH_T].max,
diff --git a/drivers/input/touchscreen/cyttsp4_core.h b/drivers/input/touchscreen/cyttsp4_core.h
index 05fb30058d87..995bfd0a54d0 100644
--- a/drivers/input/touchscreen/cyttsp4_core.h
+++ b/drivers/input/touchscreen/cyttsp4_core.h
@@ -357,32 +357,6 @@ enum cyttsp4_hst_mode_bits {
CY_HST_RESET = (1 << 0),
};
-/* abs settings */
-#define CY_IGNORE_VALUE 0xFFFF
-
-/* abs signal capabilities offsets in the frameworks array */
-enum cyttsp4_sig_caps {
- CY_SIGNAL_OST,
- CY_MIN_OST,
- CY_MAX_OST,
- CY_FUZZ_OST,
- CY_FLAT_OST,
- CY_NUM_ABS_SET /* number of signal capability fields */
-};
-
-/* abs axis signal offsets in the framworks array */
-enum cyttsp4_sig_ost {
- CY_ABS_X_OST,
- CY_ABS_Y_OST,
- CY_ABS_P_OST,
- CY_ABS_W_OST,
- CY_ABS_ID_OST,
- CY_ABS_MAJ_OST,
- CY_ABS_MIN_OST,
- CY_ABS_OR_OST,
- CY_NUM_ABS_OST /* number of abs signals */
-};
-
enum cyttsp4_flags {
CY_FLAG_NONE = 0x00,
CY_FLAG_HOVER = 0x04,
diff --git a/include/linux/platform_data/cyttsp4.h b/include/linux/platform_data/cyttsp4.h
index 362fa181ac04..1b5b30796e43 100644
--- a/include/linux/platform_data/cyttsp4.h
+++ b/include/linux/platform_data/cyttsp4.h
@@ -21,15 +21,31 @@
#define CY_TOUCH_SETTINGS_MAX 32
-struct touch_framework {
- const uint16_t *abs;
- uint8_t size;
-} __packed;
+/* abs axis signal offsets in the signals array */
+enum cyttsp4_sig_ost {
+ CY_ABS_X_OST,
+ CY_ABS_Y_OST,
+ CY_ABS_P_OST,
+ CY_ABS_W_OST,
+ CY_ABS_ID_OST,
+ CY_ABS_MAJ_OST,
+ CY_ABS_MIN_OST,
+ CY_ABS_OR_OST,
+ CY_NUM_ABS_OST /* number of abs signals */
+};
struct cyttsp4_virtual_key {
int code;
};
+struct cyttsp4_signal_def {
+ int signal;
+ int min;
+ int max;
+ int fuzz;
+ int flat;
+};
+
struct cyttsp4_platform_data {
char const *inp_dev_name;
unsigned short flags;
@@ -46,7 +62,8 @@ struct cyttsp4_platform_data {
int (*irq_stat)(struct cyttsp4_platform_data *pdata,
struct device *dev);
- struct touch_framework *frmwrk;
+ int n_signals;
+ struct cyttsp4_signal_def *signals;
int n_keys;
struct cyttsp4_virtual_key* keys;
--
2.35.3