Skip to content

Commit

Permalink
Input: improve parsing OF parameters for touchscreens
Browse files Browse the repository at this point in the history
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: Pavel Machek <pavel@ucw.cz>
Tested-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
  • Loading branch information
Dmitry Torokhov committed Jun 25, 2015
1 parent 38e1b72 commit 7c49437
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 29 deletions.
2 changes: 1 addition & 1 deletion drivers/input/touchscreen/edt-ft5x06.c
Original file line number Diff line number Diff line change
Expand Up @@ -1041,7 +1041,7 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
0, tsdata->num_y * 64 - 1, 0, 0);

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);
if (error) {
Expand Down
69 changes: 44 additions & 25 deletions drivers/input/touchscreen/of_touchscreen.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,22 @@
#include <linux/input/mt.h>
#include <linux/input/touchscreen.h>

static u32 of_get_optional_u32(struct device_node *np,
const char *property)
static bool touchscreen_get_prop_u32(struct device_node *np,
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,
Expand Down Expand Up @@ -54,34 +62,45 @@ static void touchscreen_set_params(struct input_dev *dev,
* input device accordingly. The function keeps previously setuped default
* 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;
u32 maximum, fuzz;
unsigned int axis;
unsigned int maximum, fuzz;
bool data_present;

input_alloc_absinfo(dev);
if (!dev->absinfo)
return;

maximum = of_get_optional_u32(np, "touchscreen-size-x");
fuzz = of_get_optional_u32(np, "touchscreen-fuzz-x");
if (maximum || fuzz) {
touchscreen_set_params(dev, ABS_X, maximum, fuzz);
touchscreen_set_params(dev, ABS_MT_POSITION_X, maximum, fuzz);
}
axis = multitouch ? ABS_MT_POSITION_X : ABS_X;
data_present = touchscreen_get_prop_u32(np, "touchscreen-size-x",
input_abs_get_max(dev, axis),
&maximum) |
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");
fuzz = of_get_optional_u32(np, "touchscreen-fuzz-y");
if (maximum || fuzz) {
touchscreen_set_params(dev, ABS_Y, maximum, fuzz);
touchscreen_set_params(dev, ABS_MT_POSITION_Y, maximum, fuzz);
}
axis = multitouch ? ABS_MT_POSITION_Y : ABS_Y;
data_present = touchscreen_get_prop_u32(np, "touchscreen-size-y",
input_abs_get_max(dev, axis),
&maximum) |
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");
fuzz = of_get_optional_u32(np, "touchscreen-fuzz-pressure");
if (maximum || fuzz) {
touchscreen_set_params(dev, ABS_PRESSURE, maximum, fuzz);
touchscreen_set_params(dev, ABS_MT_PRESSURE, maximum, fuzz);
}
axis = multitouch ? ABS_MT_PRESSURE : ABS_PRESSURE;
data_present = touchscreen_get_prop_u32(np, "touchscreen-max-pressure",
input_abs_get_max(dev, axis),
&maximum) |
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);
2 changes: 1 addition & 1 deletion drivers/input/touchscreen/tsc2005.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

if (np)
touchscreen_parse_of_params(input_dev);
touchscreen_parse_of_params(input_dev, false);

input_dev->open = tsc2005_open;
input_dev->close = tsc2005_close;
Expand Down
5 changes: 3 additions & 2 deletions include/linux/input/touchscreen.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@
#include <linux/input.h>

#ifdef CONFIG_OF
void touchscreen_parse_of_params(struct input_dev *dev);
void touchscreen_parse_of_params(struct input_dev *dev, bool multitouch);
#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
Expand Down

0 comments on commit 7c49437

Please sign in to comment.