On Wed, Mar 27, 2019 at 02:39:27PM +0100, Marco Felsch wrote: > A few vendor specific bindings are now covered by common bindings. > > Let the driver parse the common bindings to make use of common > inverting and swapping mechnism. Aslo make use of > touchscreen_report_pos() to ensure the correct inverting-swapping > order. > > The vendor specific properties are used as default (backward > compatibility) and gets overwritten by common bindings. > > Signed-off-by: Marco Felsch <m.felsch@xxxxxxxxxxxxxx> Applied, thank you. > --- > drivers/input/touchscreen/ads7846.c | 38 +++++++++++++++++++++++------ > 1 file changed, 30 insertions(+), 8 deletions(-) > > diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c > index 5a7a8425d619..2fe3b91f1db8 100644 > --- a/drivers/input/touchscreen/ads7846.c > +++ b/drivers/input/touchscreen/ads7846.c > @@ -23,6 +23,7 @@ > #include <linux/sched.h> > #include <linux/delay.h> > #include <linux/input.h> > +#include <linux/input/touchscreen.h> > #include <linux/interrupt.h> > #include <linux/slab.h> > #include <linux/pm.h> > @@ -132,6 +133,8 @@ struct ads7846 { > > u16 penirq_recheck_delay_usecs; > > + struct touchscreen_properties core_prop; > + > struct mutex lock; > bool stopped; /* P: lock */ > bool disabled; /* P: lock */ > @@ -826,17 +829,13 @@ static void ads7846_report_state(struct ads7846 *ts) > if (Rt) { > struct input_dev *input = ts->input; > > - if (ts->swap_xy) > - swap(x, y); > - > if (!ts->pendown) { > input_report_key(input, BTN_TOUCH, 1); > ts->pendown = true; > dev_vdbg(&ts->spi->dev, "DOWN\n"); > } > > - input_report_abs(input, ABS_X, x); > - input_report_abs(input, ABS_Y, y); > + touchscreen_report_pos(input, &ts->core_prop, x, y, false); > input_report_abs(input, ABS_PRESSURE, ts->pressure_max - Rt); > > input_sync(input); > @@ -1188,6 +1187,7 @@ static const struct ads7846_platform_data *ads7846_probe_dt(struct device *dev) > struct ads7846_platform_data *pdata; > struct device_node *node = dev->of_node; > const struct of_device_id *match; > + u32 value; > > if (!node) { > dev_err(dev, "Device does not have associated DT data\n"); > @@ -1226,10 +1226,18 @@ static const struct ads7846_platform_data *ads7846_probe_dt(struct device *dev) > of_property_read_u16(node, "ti,x-max", &pdata->x_max); > of_property_read_u16(node, "ti,y-max", &pdata->y_max); > > + /* > + * touchscreen-max-pressure gets parsed during > + * touchscreen_parse_properties() > + */ > of_property_read_u16(node, "ti,pressure-min", &pdata->pressure_min); > + if (!of_property_read_u32(node, "touchscreen-min-pressure", &value)) > + pdata->pressure_min = (u16) value; > of_property_read_u16(node, "ti,pressure-max", &pdata->pressure_max); > > of_property_read_u16(node, "ti,debounce-max", &pdata->debounce_max); > + if (!of_property_read_u32(node, "touchscreen-average-samples", &value)) > + pdata->debounce_max = (u16) value; > of_property_read_u16(node, "ti,debounce-tol", &pdata->debounce_tol); > of_property_read_u16(node, "ti,debounce-rep", &pdata->debounce_rep); > > @@ -1314,10 +1322,7 @@ static int ads7846_probe(struct spi_device *spi) > ts->model = pdata->model ? : 7846; > ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100; > ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; > - ts->pressure_max = pdata->pressure_max ? : ~0; > - > ts->vref_mv = pdata->vref_mv; > - ts->swap_xy = pdata->swap_xy; > > if (pdata->filter != NULL) { > if (pdata->filter_init != NULL) { > @@ -1368,6 +1373,23 @@ static int ads7846_probe(struct spi_device *spi) > input_set_abs_params(input_dev, ABS_PRESSURE, > pdata->pressure_min, pdata->pressure_max, 0, 0); > > + /* > + * Parse common framework properties. Must be done here to ensure the > + * correct behaviour in case of using the legacy vendor bindings. The > + * general binding value overrides the vendor specific one. > + */ > + touchscreen_parse_properties(ts->input, false, &ts->core_prop); > + ts->pressure_max = input_abs_get_max(input_dev, ABS_PRESSURE) ? : ~0; > + > + /* > + * Check if legacy ti,swap-xy binding is used instead of > + * touchscreen-swapped-x-y > + */ > + if (!ts->core_prop.swap_x_y && pdata->swap_xy) { > + swap(input_dev->absinfo[ABS_X], input_dev->absinfo[ABS_Y]); > + ts->core_prop.swap_x_y = true; > + } > + > ads7846_setup_spi_msg(ts, pdata); > > ts->reg = regulator_get(&spi->dev, "vcc"); > -- > 2.20.1 > -- Dmitry