diff options
author | duson <dusonlin@emc.com.tw> | 2015-04-12 16:01:05 -0700 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2015-04-14 10:21:42 -0700 |
commit | b9bced0eecd77067f4659b90d5ab2fb32485c3e2 (patch) | |
tree | 3d6ac23419b7eefd8829ae9ae9de03588d6c37ef /drivers/input/mouse/elan_i2c_core.c | |
parent | 8b8a518ef16be2de27207991e32fc32b0475c767 (diff) |
Input: elan_i2c - adjust for newer firmware pressure reporting
Get pressure format flag from firmware to check if we need to normalize
pressure data before reporting it.
Signed-off-by: Duson Lin <dusonlin@emc.com.tw>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input/mouse/elan_i2c_core.c')
-rw-r--r-- | drivers/input/mouse/elan_i2c_core.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c index 375d98f47483..22f38521c083 100644 --- a/drivers/input/mouse/elan_i2c_core.c +++ b/drivers/input/mouse/elan_i2c_core.c @@ -4,7 +4,7 @@ * Copyright (c) 2013 ELAN Microelectronics Corp. * * Author: 林政維 (Duson Lin) <dusonlin@emc.com.tw> - * Version: 1.5.6 + * Version: 1.5.7 * * Based on cyapa driver: * copyright (c) 2011-2012 Cypress Semiconductor, Inc. @@ -40,8 +40,7 @@ #include "elan_i2c.h" #define DRIVER_NAME "elan_i2c" -#define ELAN_DRIVER_VERSION "1.5.6" -#define ETP_PRESSURE_OFFSET 25 +#define ELAN_DRIVER_VERSION "1.5.7" #define ETP_MAX_PRESSURE 255 #define ETP_FWIDTH_REDUCE 90 #define ETP_FINGER_WIDTH 15 @@ -81,7 +80,7 @@ struct elan_tp_data { u8 sm_version; u8 iap_version; u16 fw_checksum; - + int pressure_adjustment; u8 mode; bool irq_wake; @@ -229,6 +228,11 @@ static int elan_query_device_info(struct elan_tp_data *data) if (error) return error; + error = data->ops->get_pressure_adjustment(data->client, + &data->pressure_adjustment); + if (error) + return error; + return 0; } @@ -726,8 +730,8 @@ static void elan_report_contact(struct elan_tp_data *data, struct input_dev *input = data->input; unsigned int pos_x, pos_y; unsigned int pressure, mk_x, mk_y; - unsigned int area_x, area_y, major, minor, new_pressure; - + unsigned int area_x, area_y, major, minor; + unsigned int scaled_pressure; if (contact_valid) { pos_x = ((finger_data[0] & 0xf0) << 4) | @@ -756,15 +760,16 @@ static void elan_report_contact(struct elan_tp_data *data, major = max(area_x, area_y); minor = min(area_x, area_y); - new_pressure = pressure + ETP_PRESSURE_OFFSET; - if (new_pressure > ETP_MAX_PRESSURE) - new_pressure = ETP_MAX_PRESSURE; + scaled_pressure = pressure + data->pressure_adjustment; + + if (scaled_pressure > ETP_MAX_PRESSURE) + scaled_pressure = ETP_MAX_PRESSURE; input_mt_slot(input, contact_num); input_mt_report_slot_state(input, MT_TOOL_FINGER, true); input_report_abs(input, ABS_MT_POSITION_X, pos_x); input_report_abs(input, ABS_MT_POSITION_Y, data->max_y - pos_y); - input_report_abs(input, ABS_MT_PRESSURE, new_pressure); + input_report_abs(input, ABS_MT_PRESSURE, scaled_pressure); input_report_abs(input, ABS_TOOL_WIDTH, mk_x); input_report_abs(input, ABS_MT_TOUCH_MAJOR, major); input_report_abs(input, ABS_MT_TOUCH_MINOR, minor); |