Commit 645a397d authored by Lucas Stach's avatar Lucas Stach Committed by Dmitry Torokhov

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: default avatarLucas Stach <l.stach@pengutronix.de>
Tested-by: default avatarNick Dyer <nick@shmanahar.org>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent fd629294
...@@ -32,15 +32,15 @@ void rmi_2d_sensor_abs_process(struct rmi_2d_sensor *sensor, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment