On Fri, Sep 23, 2016 at 02:41:14PM +0200, H. Nikolaus Schaller wrote: > commit b98abe52fa8e ("Input: add common DT binding for touchscreens") > introduced common DT bindings for touchscreens [1] and a helper function to > parse the DT. > > commit ed7c9870c9bc ("Input: of_touchscreen - add support for inverted / swapped axes") > added another helper for parsing axis inversion and swapping > and applying them to x and y coordinates. > > Both helpers have been integrated to accommodate any orientation of the > touch panel in relation to the LCD. > > A new feature is to introduce scaling the min/max ADC values to the screen > size. > > This makes it possible to pre-calibrate the touch so that is (almost) > exactly matches the LCD pixel coordinates it is glued onto. This allows to > well enough operate the touch before a user space calibration step can > improve the precision. This appears to be the prior patch's commit msg, or you don't need ADC values in DT for this one? > > [1]: Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt > > Signed-off-by: H. Nikolaus Schaller <hns@xxxxxxxxxxxxx> > --- > .../devicetree/bindings/input/ads7846.txt | 9 +++- > drivers/input/touchscreen/ads7846.c | 60 ++++++++++++++++++---- > 2 files changed, 57 insertions(+), 12 deletions(-) > > diff --git a/Documentation/devicetree/bindings/input/ads7846.txt b/Documentation/devicetree/bindings/input/ads7846.txt > index 9fc47b0..29f91ed 100644 > --- a/Documentation/devicetree/bindings/input/ads7846.txt > +++ b/Documentation/devicetree/bindings/input/ads7846.txt > @@ -26,6 +26,12 @@ Additional required properties: > > Optional properties: > > +You can optionally specify any of the touchscreen parameters described in > + > + Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt > + > +This allows to scale, invert or swap coordinates and define the fuzz factors. > + > ti,vref-delay-usecs vref supply delay in usecs, 0 for > external vref (u16). > ti,vref-mv The VREF voltage, in millivolts (u16). > @@ -33,7 +39,7 @@ Optional properties: > (ADS7846). > ti,keep-vref-on set to keep vref on for differential > measurements as well > - ti,swap-xy swap x and y axis > + ti,swap-xy deprecated name for touchscreen-swapped-x-y > ti,settle-delay-usec Settling time of the analog signals; > a function of Vcc and the capacitance > on the X/Y drivers. If set to non-zero, > @@ -82,6 +88,7 @@ Example for a TSC2046 chip connected to an McSPI controller of an OMAP SoC:: > pendown-gpio = <&gpio1 8 0>; > vcc-supply = <®_vcc3>; > > + touchscreen-swapped-x-y; > ti,x-min = /bits/ 16 <0>; > ti,x-max = /bits/ 16 <8000>; > ti,y-min = /bits/ 16 <0>; > diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c > index 1ce3ecb..400e421 100644 > --- a/drivers/input/touchscreen/ads7846.c > +++ b/drivers/input/touchscreen/ads7846.c > @@ -34,6 +34,7 @@ > #include <linux/spi/ads7846.h> > #include <linux/regulator/consumer.h> > #include <linux/module.h> > +#include <linux/input/touchscreen.h> > #include <asm/irq.h> > > /* > @@ -109,8 +110,13 @@ struct ads7846 { > u16 vref_delay_usecs; > u16 x_plate_ohms; > u16 pressure_max; > + u16 x_min; > + u16 x_max; > + u16 y_min; > + u16 y_max; > + > + struct touchscreen_properties prop; > > - bool swap_xy; > bool use_internal; > > struct ads7846_packet *packet; > @@ -825,22 +831,36 @@ static void ads7846_report_state(struct ads7846 *ts) > */ > if (Rt) { > struct input_dev *input = ts->input; > + int sx, sy; > + > + dev_dbg(&ts->spi->dev, > + "Raw point(%4d,%4d), pressure (%4u)\n", > + x, y, Rt); > + > + /* scale ADC values to desired output range */ > + sx = (ts->prop.max_x * (x - ts->x_min)) > + / (ts->x_max - ts->x_min); > + sy = (ts->prop.max_y * (y - ts->y_min)) > + / (ts->y_max - ts->y_min); > > - if (ts->swap_xy) > - swap(x, y); > + dev_dbg(&ts->spi->dev, > + "Scaled point(%4d,%4d), pressure (%4u)\n", > + sx, sy, Rt); > > + /* report event */ > 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(ts->input, &ts->prop, > + (unsigned int) sx, (unsigned int) sy, > + false); > input_report_abs(input, ABS_PRESSURE, ts->pressure_max - Rt); > > input_sync(input); > - dev_vdbg(&ts->spi->dev, "%4d/%4d/%4d\n", x, y, Rt); > + dev_vdbg(&ts->spi->dev, "%4d/%4d/%4d\n", sx, sy, Rt); > } > } > > @@ -1212,6 +1232,8 @@ static const struct ads7846_platform_data *ads7846_probe_dt(struct device *dev) > pdata->keep_vref_on = of_property_read_bool(node, "ti,keep-vref-on"); > > pdata->swap_xy = of_property_read_bool(node, "ti,swap-xy"); > + if (pdata->swap_xy) > + dev_notice(dev, "please update device tree to use touchscreen-swapped-x-y"); > > of_property_read_u16(node, "ti,settle-delay-usec", > &pdata->settle_delay_usecs); > @@ -1315,7 +1337,6 @@ static int ads7846_probe(struct spi_device *spi) > 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) { > @@ -1355,18 +1376,35 @@ static int ads7846_probe(struct spi_device *spi) > input_dev->dev.parent = &spi->dev; > > input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); > + input_dev->absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | > + BIT_MASK(ABS_PRESSURE); > input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); > + > + ts->x_min = pdata->x_min ? : 0; > + ts->x_max = pdata->x_max ? : MAX_12BIT; > + ts->y_min = pdata->y_min ? : 0; > + ts->y_max = pdata->y_max ? : MAX_12BIT; > + > input_set_abs_params(input_dev, ABS_X, > - pdata->x_min ? : 0, > - pdata->x_max ? : MAX_12BIT, > + ts->x_min, > + ts->x_max, > 0, 0); > input_set_abs_params(input_dev, ABS_Y, > - pdata->y_min ? : 0, > - pdata->y_max ? : MAX_12BIT, > + ts->y_min, > + ts->y_max, > 0, 0); > input_set_abs_params(input_dev, ABS_PRESSURE, > pdata->pressure_min, pdata->pressure_max, 0, 0); > > + if (spi->dev.of_node) { > + input_abs_set_min(input_dev, ABS_X, 0); > + input_abs_set_min(input_dev, ABS_Y, 0); > + > + touchscreen_parse_properties(ts->input, false, &ts->prop); > + } > + > + ts->prop.swap_x_y |= pdata->swap_xy; > + > ads7846_setup_spi_msg(ts, pdata); > > ts->reg = regulator_get(&spi->dev, "vcc"); > -- > 2.7.3 > > -- > To unsubscribe from this list: send the line "unsubscribe devicetree" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html