|
@@ -17,6 +17,7 @@
|
|
|
#include <linux/i2c.h>
|
|
|
#include <linux/input.h>
|
|
|
#include <linux/input/mt.h>
|
|
|
+#include <linux/input/touchscreen.h>
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/of.h>
|
|
|
|
|
@@ -52,11 +53,7 @@ struct icn8318_data {
|
|
|
struct i2c_client *client;
|
|
|
struct input_dev *input;
|
|
|
struct gpio_desc *wake_gpio;
|
|
|
- u32 max_x;
|
|
|
- u32 max_y;
|
|
|
- bool invert_x;
|
|
|
- bool invert_y;
|
|
|
- bool swap_x_y;
|
|
|
+ struct touchscreen_properties prop;
|
|
|
};
|
|
|
|
|
|
static int icn8318_read_touch_data(struct i2c_client *client,
|
|
@@ -91,7 +88,7 @@ static irqreturn_t icn8318_irq(int irq, void *dev_id)
|
|
|
struct icn8318_data *data = dev_id;
|
|
|
struct device *dev = &data->client->dev;
|
|
|
struct icn8318_touch_data touch_data;
|
|
|
- int i, ret, x, y;
|
|
|
+ int i, ret;
|
|
|
|
|
|
ret = icn8318_read_touch_data(data->client, &touch_data);
|
|
|
if (ret < 0) {
|
|
@@ -124,22 +121,9 @@ static irqreturn_t icn8318_irq(int irq, void *dev_id)
|
|
|
if (!act)
|
|
|
continue;
|
|
|
|
|
|
- x = be16_to_cpu(touch->x);
|
|
|
- y = be16_to_cpu(touch->y);
|
|
|
-
|
|
|
- if (data->invert_x)
|
|
|
- x = data->max_x - x;
|
|
|
-
|
|
|
- if (data->invert_y)
|
|
|
- y = data->max_y - y;
|
|
|
-
|
|
|
- if (!data->swap_x_y) {
|
|
|
- input_event(data->input, EV_ABS, ABS_MT_POSITION_X, x);
|
|
|
- input_event(data->input, EV_ABS, ABS_MT_POSITION_Y, y);
|
|
|
- } else {
|
|
|
- input_event(data->input, EV_ABS, ABS_MT_POSITION_X, y);
|
|
|
- input_event(data->input, EV_ABS, ABS_MT_POSITION_Y, x);
|
|
|
- }
|
|
|
+ touchscreen_report_pos(data->input, &data->prop,
|
|
|
+ be16_to_cpu(touch->x),
|
|
|
+ be16_to_cpu(touch->y), true);
|
|
|
}
|
|
|
|
|
|
input_mt_sync_frame(data->input);
|
|
@@ -200,10 +184,8 @@ static int icn8318_probe(struct i2c_client *client,
|
|
|
const struct i2c_device_id *id)
|
|
|
{
|
|
|
struct device *dev = &client->dev;
|
|
|
- struct device_node *np = dev->of_node;
|
|
|
struct icn8318_data *data;
|
|
|
struct input_dev *input;
|
|
|
- u32 fuzz_x = 0, fuzz_y = 0;
|
|
|
int error;
|
|
|
|
|
|
if (!client->irq) {
|
|
@@ -223,19 +205,6 @@ static int icn8318_probe(struct i2c_client *client,
|
|
|
return error;
|
|
|
}
|
|
|
|
|
|
- if (of_property_read_u32(np, "touchscreen-size-x", &data->max_x) ||
|
|
|
- of_property_read_u32(np, "touchscreen-size-y", &data->max_y)) {
|
|
|
- dev_err(dev, "Error touchscreen-size-x and/or -y missing\n");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
- /* Optional */
|
|
|
- of_property_read_u32(np, "touchscreen-fuzz-x", &fuzz_x);
|
|
|
- of_property_read_u32(np, "touchscreen-fuzz-y", &fuzz_y);
|
|
|
- data->invert_x = of_property_read_bool(np, "touchscreen-inverted-x");
|
|
|
- data->invert_y = of_property_read_bool(np, "touchscreen-inverted-y");
|
|
|
- data->swap_x_y = of_property_read_bool(np, "touchscreen-swapped-x-y");
|
|
|
-
|
|
|
input = devm_input_allocate_device(dev);
|
|
|
if (!input)
|
|
|
return -ENOMEM;
|
|
@@ -246,16 +215,14 @@ static int icn8318_probe(struct i2c_client *client,
|
|
|
input->close = icn8318_stop;
|
|
|
input->dev.parent = dev;
|
|
|
|
|
|
- if (!data->swap_x_y) {
|
|
|
- input_set_abs_params(input, ABS_MT_POSITION_X, 0,
|
|
|
- data->max_x, fuzz_x, 0);
|
|
|
- input_set_abs_params(input, ABS_MT_POSITION_Y, 0,
|
|
|
- data->max_y, fuzz_y, 0);
|
|
|
- } else {
|
|
|
- input_set_abs_params(input, ABS_MT_POSITION_X, 0,
|
|
|
- data->max_y, fuzz_y, 0);
|
|
|
- input_set_abs_params(input, ABS_MT_POSITION_Y, 0,
|
|
|
- data->max_x, fuzz_x, 0);
|
|
|
+ input_set_capability(input, EV_ABS, ABS_MT_POSITION_X);
|
|
|
+ input_set_capability(input, EV_ABS, ABS_MT_POSITION_Y);
|
|
|
+
|
|
|
+ touchscreen_parse_properties(input, true, &data->prop);
|
|
|
+ if (!input_abs_get_max(input, ABS_MT_POSITION_X) ||
|
|
|
+ !input_abs_get_max(input, ABS_MT_POSITION_Y)) {
|
|
|
+ dev_err(dev, "Error touchscreen-size-x and/or -y missing\n");
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
error = input_mt_init_slots(input, ICN8318_MAX_TOUCHES,
|