Input: synaptics-rmi4 - fix axis-swap behavior
The documentation for the touchscreen-swapped-x-y property states that swapping is done after inverting if both are used. RMI4 did it the other way around, leading to inconsistent behavior with regard to other touchscreens. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Tested-by: Nick Dyer <nick@shmanahar.org> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
fd62929475
commit
645a397d32
@ -32,15 +32,15 @@ void rmi_2d_sensor_abs_process(struct rmi_2d_sensor *sensor,
|
|||||||
if (obj->type == RMI_2D_OBJECT_NONE)
|
if (obj->type == RMI_2D_OBJECT_NONE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (axis_align->swap_axes)
|
|
||||||
swap(obj->x, obj->y);
|
|
||||||
|
|
||||||
if (axis_align->flip_x)
|
if (axis_align->flip_x)
|
||||||
obj->x = sensor->max_x - obj->x;
|
obj->x = sensor->max_x - obj->x;
|
||||||
|
|
||||||
if (axis_align->flip_y)
|
if (axis_align->flip_y)
|
||||||
obj->y = sensor->max_y - obj->y;
|
obj->y = sensor->max_y - obj->y;
|
||||||
|
|
||||||
|
if (axis_align->swap_axes)
|
||||||
|
swap(obj->x, obj->y);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Here checking if X offset or y offset are specified is
|
* Here checking if X offset or y offset are specified is
|
||||||
* redundant. We just add the offsets or clip the values.
|
* redundant. We just add the offsets or clip the values.
|
||||||
@ -120,15 +120,15 @@ void rmi_2d_sensor_rel_report(struct rmi_2d_sensor *sensor, int x, int y)
|
|||||||
x = min(RMI_2D_REL_POS_MAX, max(RMI_2D_REL_POS_MIN, (int)x));
|
x = min(RMI_2D_REL_POS_MAX, max(RMI_2D_REL_POS_MIN, (int)x));
|
||||||
y = min(RMI_2D_REL_POS_MAX, max(RMI_2D_REL_POS_MIN, (int)y));
|
y = min(RMI_2D_REL_POS_MAX, max(RMI_2D_REL_POS_MIN, (int)y));
|
||||||
|
|
||||||
if (axis_align->swap_axes)
|
|
||||||
swap(x, y);
|
|
||||||
|
|
||||||
if (axis_align->flip_x)
|
if (axis_align->flip_x)
|
||||||
x = min(RMI_2D_REL_POS_MAX, -x);
|
x = min(RMI_2D_REL_POS_MAX, -x);
|
||||||
|
|
||||||
if (axis_align->flip_y)
|
if (axis_align->flip_y)
|
||||||
y = min(RMI_2D_REL_POS_MAX, -y);
|
y = min(RMI_2D_REL_POS_MAX, -y);
|
||||||
|
|
||||||
|
if (axis_align->swap_axes)
|
||||||
|
swap(x, y);
|
||||||
|
|
||||||
if (x || y) {
|
if (x || y) {
|
||||||
input_report_rel(sensor->input, REL_X, x);
|
input_report_rel(sensor->input, REL_X, x);
|
||||||
input_report_rel(sensor->input, REL_Y, y);
|
input_report_rel(sensor->input, REL_Y, y);
|
||||||
@ -141,17 +141,10 @@ static void rmi_2d_sensor_set_input_params(struct rmi_2d_sensor *sensor)
|
|||||||
struct input_dev *input = sensor->input;
|
struct input_dev *input = sensor->input;
|
||||||
int res_x;
|
int res_x;
|
||||||
int res_y;
|
int res_y;
|
||||||
|
int max_x, max_y;
|
||||||
int input_flags = 0;
|
int input_flags = 0;
|
||||||
|
|
||||||
if (sensor->report_abs) {
|
if (sensor->report_abs) {
|
||||||
if (sensor->axis_align.swap_axes) {
|
|
||||||
swap(sensor->max_x, sensor->max_y);
|
|
||||||
swap(sensor->axis_align.clip_x_low,
|
|
||||||
sensor->axis_align.clip_y_low);
|
|
||||||
swap(sensor->axis_align.clip_x_high,
|
|
||||||
sensor->axis_align.clip_y_high);
|
|
||||||
}
|
|
||||||
|
|
||||||
sensor->min_x = sensor->axis_align.clip_x_low;
|
sensor->min_x = sensor->axis_align.clip_x_low;
|
||||||
if (sensor->axis_align.clip_x_high)
|
if (sensor->axis_align.clip_x_high)
|
||||||
sensor->max_x = min(sensor->max_x,
|
sensor->max_x = min(sensor->max_x,
|
||||||
@ -163,14 +156,19 @@ static void rmi_2d_sensor_set_input_params(struct rmi_2d_sensor *sensor)
|
|||||||
sensor->axis_align.clip_y_high);
|
sensor->axis_align.clip_y_high);
|
||||||
|
|
||||||
set_bit(EV_ABS, input->evbit);
|
set_bit(EV_ABS, input->evbit);
|
||||||
input_set_abs_params(input, ABS_MT_POSITION_X, 0, sensor->max_x,
|
|
||||||
0, 0);
|
max_x = sensor->max_x;
|
||||||
input_set_abs_params(input, ABS_MT_POSITION_Y, 0, sensor->max_y,
|
max_y = sensor->max_y;
|
||||||
0, 0);
|
if (sensor->axis_align.swap_axes)
|
||||||
|
swap(max_x, max_y);
|
||||||
|
input_set_abs_params(input, ABS_MT_POSITION_X, 0, max_x, 0, 0);
|
||||||
|
input_set_abs_params(input, ABS_MT_POSITION_Y, 0, max_y, 0, 0);
|
||||||
|
|
||||||
if (sensor->x_mm && sensor->y_mm) {
|
if (sensor->x_mm && sensor->y_mm) {
|
||||||
res_x = (sensor->max_x - sensor->min_x) / sensor->x_mm;
|
res_x = (sensor->max_x - sensor->min_x) / sensor->x_mm;
|
||||||
res_y = (sensor->max_y - sensor->min_y) / sensor->y_mm;
|
res_y = (sensor->max_y - sensor->min_y) / sensor->y_mm;
|
||||||
|
if (sensor->axis_align.swap_axes)
|
||||||
|
swap(res_x, res_y);
|
||||||
|
|
||||||
input_abs_set_res(input, ABS_X, res_x);
|
input_abs_set_res(input, ABS_X, res_x);
|
||||||
input_abs_set_res(input, ABS_Y, res_y);
|
input_abs_set_res(input, ABS_Y, res_y);
|
||||||
|
Loading…
Reference in New Issue
Block a user