Commit 7c494375 authored by Dmitry Torokhov's avatar Dmitry Torokhov

Input: improve parsing OF parameters for touchscreens

When applying touchscreen parameters specified in device tree let's make
sure we keep whatever setup was done by the driver and not reset the
missing values to zero.
Reported-by: default avatarPavel Machek <pavel@ucw.cz>
Tested-by: default avatarPavel Machek <pavel@ucw.cz>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 38e1b72b
...@@ -1041,7 +1041,7 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client, ...@@ -1041,7 +1041,7 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
0, tsdata->num_y * 64 - 1, 0, 0); 0, tsdata->num_y * 64 - 1, 0, 0);
if (!pdata) if (!pdata)
touchscreen_parse_of_params(input); touchscreen_parse_of_params(input, true);
error = input_mt_init_slots(input, MAX_SUPPORT_POINTS, INPUT_MT_DIRECT); error = input_mt_init_slots(input, MAX_SUPPORT_POINTS, INPUT_MT_DIRECT);
if (error) { if (error) {
......
...@@ -14,14 +14,22 @@ ...@@ -14,14 +14,22 @@
#include <linux/input/mt.h> #include <linux/input/mt.h>
#include <linux/input/touchscreen.h> #include <linux/input/touchscreen.h>
static u32 of_get_optional_u32(struct device_node *np, static bool touchscreen_get_prop_u32(struct device_node *np,
const char *property) const char *property,
unsigned int default_value,
unsigned int *value)
{ {
u32 val = 0; u32 val;
int error;
of_property_read_u32(np, property, &val); error = of_property_read_u32(np, property, &val);
if (error) {
*value = default_value;
return false;
}
return val; *value = val;
return true;
} }
static void touchscreen_set_params(struct input_dev *dev, static void touchscreen_set_params(struct input_dev *dev,
...@@ -54,34 +62,45 @@ static void touchscreen_set_params(struct input_dev *dev, ...@@ -54,34 +62,45 @@ static void touchscreen_set_params(struct input_dev *dev,
* input device accordingly. The function keeps previously setuped default * input device accordingly. The function keeps previously setuped default
* values if no value is specified via DT. * values if no value is specified via DT.
*/ */
void touchscreen_parse_of_params(struct input_dev *dev) void touchscreen_parse_of_params(struct input_dev *dev, bool multitouch)
{ {
struct device_node *np = dev->dev.parent->of_node; struct device_node *np = dev->dev.parent->of_node;
u32 maximum, fuzz; unsigned int axis;
unsigned int maximum, fuzz;
bool data_present;
input_alloc_absinfo(dev); input_alloc_absinfo(dev);
if (!dev->absinfo) if (!dev->absinfo)
return; return;
maximum = of_get_optional_u32(np, "touchscreen-size-x"); axis = multitouch ? ABS_MT_POSITION_X : ABS_X;
fuzz = of_get_optional_u32(np, "touchscreen-fuzz-x"); data_present = touchscreen_get_prop_u32(np, "touchscreen-size-x",
if (maximum || fuzz) { input_abs_get_max(dev, axis),
touchscreen_set_params(dev, ABS_X, maximum, fuzz); &maximum) |
touchscreen_set_params(dev, ABS_MT_POSITION_X, maximum, fuzz); touchscreen_get_prop_u32(np, "touchscreen-fuzz-x",
} input_abs_get_fuzz(dev, axis),
&fuzz);
if (data_present)
touchscreen_set_params(dev, axis, maximum, fuzz);
maximum = of_get_optional_u32(np, "touchscreen-size-y"); axis = multitouch ? ABS_MT_POSITION_Y : ABS_Y;
fuzz = of_get_optional_u32(np, "touchscreen-fuzz-y"); data_present = touchscreen_get_prop_u32(np, "touchscreen-size-y",
if (maximum || fuzz) { input_abs_get_max(dev, axis),
touchscreen_set_params(dev, ABS_Y, maximum, fuzz); &maximum) |
touchscreen_set_params(dev, ABS_MT_POSITION_Y, maximum, fuzz); touchscreen_get_prop_u32(np, "touchscreen-fuzz-y",
} input_abs_get_fuzz(dev, axis),
&fuzz);
if (data_present)
touchscreen_set_params(dev, axis, maximum, fuzz);
maximum = of_get_optional_u32(np, "touchscreen-max-pressure"); axis = multitouch ? ABS_MT_PRESSURE : ABS_PRESSURE;
fuzz = of_get_optional_u32(np, "touchscreen-fuzz-pressure"); data_present = touchscreen_get_prop_u32(np, "touchscreen-max-pressure",
if (maximum || fuzz) { input_abs_get_max(dev, axis),
touchscreen_set_params(dev, ABS_PRESSURE, maximum, fuzz); &maximum) |
touchscreen_set_params(dev, ABS_MT_PRESSURE, maximum, fuzz); touchscreen_get_prop_u32(np, "touchscreen-fuzz-pressure",
} input_abs_get_fuzz(dev, axis),
&fuzz);
if (data_present)
touchscreen_set_params(dev, axis, maximum, fuzz);
} }
EXPORT_SYMBOL(touchscreen_parse_of_params); EXPORT_SYMBOL(touchscreen_parse_of_params);
...@@ -709,7 +709,7 @@ static int tsc2005_probe(struct spi_device *spi) ...@@ -709,7 +709,7 @@ static int tsc2005_probe(struct spi_device *spi)
input_set_abs_params(input_dev, ABS_PRESSURE, 0, max_p, fudge_p, 0); input_set_abs_params(input_dev, ABS_PRESSURE, 0, max_p, fudge_p, 0);
if (np) if (np)
touchscreen_parse_of_params(input_dev); touchscreen_parse_of_params(input_dev, false);
input_dev->open = tsc2005_open; input_dev->open = tsc2005_open;
input_dev->close = tsc2005_close; input_dev->close = tsc2005_close;
......
...@@ -12,9 +12,10 @@ ...@@ -12,9 +12,10 @@
#include <linux/input.h> #include <linux/input.h>
#ifdef CONFIG_OF #ifdef CONFIG_OF
void touchscreen_parse_of_params(struct input_dev *dev); void touchscreen_parse_of_params(struct input_dev *dev, bool multitouch);
#else #else
static inline void touchscreen_parse_of_params(struct input_dev *dev) static inline void touchscreen_parse_of_params(struct input_dev *dev,
bool multitouch)
{ {
} }
#endif #endif
......
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