Re: [PATCH 2/2] HID: alps: Refactor axis resolution logic

From: Jiri Kosina
Date: Thu Apr 09 2020 - 18:21:18 EST


On Mon, 6 Apr 2020, Artem Borisov wrote:

> AUI1657 doesn't follow the same logic for resolution calculation, since
> the resulting values are incorrect. Instead, it reports the actual
> resolution values in place of the pitch ones.
> While we're at it, also refactor the whole resolution logic to make it more
> generic and sensible for multiple device support.

Let's add Masaki Ota to ack this change if possible.

Would it be possible to be a little bit more verbose in the changelog,
explaining *how* (or why) is the patch making the logic more generic and
sensible?

Thanks!

> Signed-off-by: Artem Borisov <dedsa2002@xxxxxxxxx>
> ---
> drivers/hid/hid-alps.c | 41 +++++++++++++++++++++++++----------------
> 1 file changed, 25 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/hid/hid-alps.c b/drivers/hid/hid-alps.c
> index c2a2bd528890..494c08cca645 100644
> --- a/drivers/hid/hid-alps.c
> +++ b/drivers/hid/hid-alps.c
> @@ -83,8 +83,8 @@ enum dev_num {
> * @max_fingers: total number of fingers
> * @has_sp: boolean of sp existense
> * @sp_btn_info: button information
> - * @x_active_len_mm: active area length of X (mm)
> - * @y_active_len_mm: active area length of Y (mm)
> + * @x_res: resolution of X
> + * @y_res: resolution of Y
> * @x_max: maximum x coordinate value
> * @y_max: maximum y coordinate value
> * @x_min: minimum x coordinate value
> @@ -100,9 +100,10 @@ struct alps_dev {
> enum dev_num dev_type;
> u8 max_fingers;
> u8 has_sp;
> + u8 no_pitch;
> u8 sp_btn_info;
> - u32 x_active_len_mm;
> - u32 y_active_len_mm;
> + u32 x_res;
> + u32 y_res;
> u32 x_max;
> u32 y_max;
> u32 x_min;
> @@ -550,10 +551,6 @@ static int u1_init(struct hid_device *hdev, struct alps_dev *pri_data)
> dev_err(&hdev->dev, "failed U1_RESO_DWN_ABS (%d)\n", ret);
> goto exit;
> }
> - pri_data->x_active_len_mm =
> - (pitch_x * (sen_line_num_x - 1)) / 10;
> - pri_data->y_active_len_mm =
> - (pitch_y * (sen_line_num_y - 1)) / 10;
>
> pri_data->x_max =
> (resolution << 2) * (sen_line_num_x - 1);
> @@ -562,6 +559,18 @@ static int u1_init(struct hid_device *hdev, struct alps_dev *pri_data)
> (resolution << 2) * (sen_line_num_y - 1);
> pri_data->y_min = 1;
>
> + if (pri_data->no_pitch) {
> + pri_data->x_res = pitch_x;
> + pri_data->y_res = pitch_y;
> + } else {
> + pri_data->x_res =
> + (pri_data->x_max - 1) /
> + ((pitch_x * (sen_line_num_x - 1)) / 10);
> + pri_data->y_res =
> + (pri_data->y_max - 1) /
> + ((pitch_y * (sen_line_num_y - 1)) / 10);
> + }
> +
> ret = u1_read_write_register(hdev, ADDRESS_U1_PAD_BTN,
> &tmp, 0, true);
> if (ret < 0) {
> @@ -622,7 +631,7 @@ static int T4_init(struct hid_device *hdev, struct alps_dev *pri_data)
> pri_data->x_min = T4_COUNT_PER_ELECTRODE;
> pri_data->y_max = sen_line_num_y * T4_COUNT_PER_ELECTRODE;
> pri_data->y_min = T4_COUNT_PER_ELECTRODE;
> - pri_data->x_active_len_mm = pri_data->y_active_len_mm = 0;
> + pri_data->x_res = pri_data->y_res = 0;
> pri_data->btn_cnt = 1;
>
> ret = t4_read_write_register(hdev, PRM_SYS_CONFIG_1, &tmp, 0, true);
> @@ -675,7 +684,7 @@ static int alps_input_configured(struct hid_device *hdev, struct hid_input *hi)
> struct alps_dev *data = hid_get_drvdata(hdev);
> struct input_dev *input = hi->input, *input2;
> int ret;
> - int res_x, res_y, i;
> + int i;
>
> data->input = input;
>
> @@ -706,12 +715,9 @@ static int alps_input_configured(struct hid_device *hdev, struct hid_input *hi)
> input_set_abs_params(input, ABS_MT_POSITION_Y,
> data->y_min, data->y_max, 0, 0);
>
> - if (data->x_active_len_mm && data->y_active_len_mm) {
> - res_x = (data->x_max - 1) / data->x_active_len_mm;
> - res_y = (data->y_max - 1) / data->y_active_len_mm;
> -
> - input_abs_set_res(input, ABS_MT_POSITION_X, res_x);
> - input_abs_set_res(input, ABS_MT_POSITION_Y, res_y);
> + if (data->x_res && data->y_res) {
> + input_abs_set_res(input, ABS_MT_POSITION_X, data->x_res);
> + input_abs_set_res(input, ABS_MT_POSITION_Y, data->y_res);
> }
>
> input_set_abs_params(input, ABS_MT_PRESSURE, 0, 64, 0, 0);
> @@ -802,8 +808,11 @@ static int alps_probe(struct hid_device *hdev, const struct hid_device_id *id)
> break;
> case HID_DEVICE_ID_ALPS_U1_DUAL:
> case HID_DEVICE_ID_ALPS_U1:
> + data->dev_type = U1;
> + break;
> case HID_DEVICE_ID_ALPS_1657:
> data->dev_type = U1;
> + data->no_pitch = 1;
> break;
> default:
> data->dev_type = UNKNOWN;
> --
> 2.26.0
>

--
Jiri Kosina
SUSE Labs