Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
On Mon, Jan 25, 2016 at 07:04:37PM -0800, Stefan Agner wrote: > Add device tree support for the I2C variant of AD7879 (AD7879-1). This > allows to specify the touchscreen controller as a I2C client node. > Most of the options available as platform data are also available as > device tree properties. Exporting the GPIO is currently not possible > through device tree. > > Signed-off-by: Stefan Agner > --- > .../bindings/input/touchscreen/ad7879-i2c.txt | 47 > drivers/input/touchscreen/ad7879-i2c.c | 63 > +- > drivers/input/touchscreen/ad7879-spi.c | 3 +- > drivers/input/touchscreen/ad7879.c | 2 +- > drivers/input/touchscreen/ad7879.h | 1 + > 5 files changed, 113 insertions(+), 3 deletions(-) > create mode 100644 > Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > > diff --git > a/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > new file mode 100644 > index 000..bf169a2 > --- /dev/null > +++ b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > @@ -0,0 +1,47 @@ > +* Analog Devices AD7879-1/AD7889-1 touchscreen interface (I2C) > + > +Required properties: > +- compatible: must be "adi,ad7879-1" > +- reg: i2c slave address > +- interrupt-parent: the phandle for the interrupt controller > +- interrupts: touch controller interrupt > +- resistance-plate-x : total resistance of X-plate (for pressure > + calculation) > +- touchscreen-max-pressure : maximum reported pressure > +- touchscreen-swapped-x-y: X and Y axis are swapped (boolean) > + Swapping is done after inverting the axis > +Optional properties: > +- first-conversion-delay : 0-12 in 128us steps (starting with 128us) > + 13: 2.560ms > + 14: 3.584ms > + 15: 4.096ms > +- acquisition-time : 0: 2us > + 1: 4us > + 2: 8us > + 3: 16us > +- median-filter-size : 0: disabled > + 1: 4 measurements > + 2: 8 measurements > + 3: 16 measurements > +- averaging : 0: 2 middle values (1 if median disabled) > + 1: 4 middle values > + 2: 8 middle values > + 3: 16 values > +- conversion-interval: : 0: convert one time only > + 1-255: 515us + val * 35us (up to 9.440ms) These all should be prefixed with "adi,". Also, please state the sizes are 8-bit. > + > +Example: > + > + ad7879@2c { > + compatible = "adi,ad7879-1"; > + reg = <0x2c>; > + interrupt-parent = <>; > + interrupts = <13 IRQ_TYPE_EDGE_FALLING>; > + resistance-plate-x = <120>; > + touchscreen-max-pressure = <4096>; > + first-conversion-delay = /bits/ 8 <3>; > + acquisition-time = /bits/ 8 <1>; > + median-filter-size = /bits/ 8 <2>; > + averaging = /bits/ 8 <1>; > + conversion-interval = /bits/ 8 <255>; > + };
Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
On Mon, Jan 25, 2016 at 07:04:37PM -0800, Stefan Agner wrote: > Add device tree support for the I2C variant of AD7879 (AD7879-1). This > allows to specify the touchscreen controller as a I2C client node. > Most of the options available as platform data are also available as > device tree properties. Exporting the GPIO is currently not possible > through device tree. > > Signed-off-by: Stefan Agner> --- > .../bindings/input/touchscreen/ad7879-i2c.txt | 47 > drivers/input/touchscreen/ad7879-i2c.c | 63 > +- > drivers/input/touchscreen/ad7879-spi.c | 3 +- > drivers/input/touchscreen/ad7879.c | 2 +- > drivers/input/touchscreen/ad7879.h | 1 + > 5 files changed, 113 insertions(+), 3 deletions(-) > create mode 100644 > Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > > diff --git > a/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > new file mode 100644 > index 000..bf169a2 > --- /dev/null > +++ b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > @@ -0,0 +1,47 @@ > +* Analog Devices AD7879-1/AD7889-1 touchscreen interface (I2C) > + > +Required properties: > +- compatible: must be "adi,ad7879-1" > +- reg: i2c slave address > +- interrupt-parent: the phandle for the interrupt controller > +- interrupts: touch controller interrupt > +- resistance-plate-x : total resistance of X-plate (for pressure > + calculation) > +- touchscreen-max-pressure : maximum reported pressure > +- touchscreen-swapped-x-y: X and Y axis are swapped (boolean) > + Swapping is done after inverting the axis > +Optional properties: > +- first-conversion-delay : 0-12 in 128us steps (starting with 128us) > + 13: 2.560ms > + 14: 3.584ms > + 15: 4.096ms > +- acquisition-time : 0: 2us > + 1: 4us > + 2: 8us > + 3: 16us > +- median-filter-size : 0: disabled > + 1: 4 measurements > + 2: 8 measurements > + 3: 16 measurements > +- averaging : 0: 2 middle values (1 if median disabled) > + 1: 4 middle values > + 2: 8 middle values > + 3: 16 values > +- conversion-interval: : 0: convert one time only > + 1-255: 515us + val * 35us (up to 9.440ms) These all should be prefixed with "adi,". Also, please state the sizes are 8-bit. > + > +Example: > + > + ad7879@2c { > + compatible = "adi,ad7879-1"; > + reg = <0x2c>; > + interrupt-parent = <>; > + interrupts = <13 IRQ_TYPE_EDGE_FALLING>; > + resistance-plate-x = <120>; > + touchscreen-max-pressure = <4096>; > + first-conversion-delay = /bits/ 8 <3>; > + acquisition-time = /bits/ 8 <1>; > + median-filter-size = /bits/ 8 <2>; > + averaging = /bits/ 8 <1>; > + conversion-interval = /bits/ 8 <255>; > + };
Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
Hi Stefan, On Mon, Jan 25, 2016 at 07:04:37PM -0800, Stefan Agner wrote: > Add device tree support for the I2C variant of AD7879 (AD7879-1). This > allows to specify the touchscreen controller as a I2C client node. > Most of the options available as platform data are also available as > device tree properties. Exporting the GPIO is currently not possible > through device tree. > > Signed-off-by: Stefan Agner > --- > .../bindings/input/touchscreen/ad7879-i2c.txt | 47 > drivers/input/touchscreen/ad7879-i2c.c | 63 > +- > drivers/input/touchscreen/ad7879-spi.c | 3 +- > drivers/input/touchscreen/ad7879.c | 2 +- > drivers/input/touchscreen/ad7879.h | 1 + > 5 files changed, 113 insertions(+), 3 deletions(-) > create mode 100644 > Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > > diff --git > a/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > new file mode 100644 > index 000..bf169a2 > --- /dev/null > +++ b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > @@ -0,0 +1,47 @@ > +* Analog Devices AD7879-1/AD7889-1 touchscreen interface (I2C) > + > +Required properties: > +- compatible: must be "adi,ad7879-1" > +- reg: i2c slave address > +- interrupt-parent: the phandle for the interrupt controller > +- interrupts: touch controller interrupt > +- resistance-plate-x : total resistance of X-plate (for pressure > + calculation) > +- touchscreen-max-pressure : maximum reported pressure > +- touchscreen-swapped-x-y: X and Y axis are swapped (boolean) > + Swapping is done after inverting the axis > +Optional properties: > +- first-conversion-delay : 0-12 in 128us steps (starting with 128us) > + 13: 2.560ms > + 14: 3.584ms > + 15: 4.096ms > +- acquisition-time : 0: 2us > + 1: 4us > + 2: 8us > + 3: 16us > +- median-filter-size : 0: disabled > + 1: 4 measurements > + 2: 8 measurements > + 3: 16 measurements > +- averaging : 0: 2 middle values (1 if median disabled) > + 1: 4 middle values > + 2: 8 middle values > + 3: 16 values > +- conversion-interval: : 0: convert one time only > + 1-255: 515us + val * 35us (up to 9.440ms) > + > +Example: > + > + ad7879@2c { > + compatible = "adi,ad7879-1"; > + reg = <0x2c>; > + interrupt-parent = <>; > + interrupts = <13 IRQ_TYPE_EDGE_FALLING>; > + resistance-plate-x = <120>; > + touchscreen-max-pressure = <4096>; > + first-conversion-delay = /bits/ 8 <3>; > + acquisition-time = /bits/ 8 <1>; > + median-filter-size = /bits/ 8 <2>; > + averaging = /bits/ 8 <1>; > + conversion-interval = /bits/ 8 <255>; > + }; > diff --git a/drivers/input/touchscreen/ad7879-i2c.c > b/drivers/input/touchscreen/ad7879-i2c.c > index d66962c..08a2c9a 100644 > --- a/drivers/input/touchscreen/ad7879-i2c.c > +++ b/drivers/input/touchscreen/ad7879-i2c.c > @@ -11,6 +11,7 @@ > #include > #include > #include > +#include > > #include "ad7879.h" > > @@ -54,9 +55,50 @@ static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { > .write = ad7879_i2c_write, > }; > > +static struct ad7879_platform_data *ad7879_parse_dt(struct device *dev) > +{ > + struct ad7879_platform_data *pdata; > + struct device_node *np = dev->of_node; > + int err; > + u32 tmp; > + > + if (!np) > + return NULL; > + > + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); > + > + if (!pdata) > + return ERR_PTR(-ENOMEM); > + > + err = of_property_read_u32(np, "resistance-plate-x", ); > + if (err) { > + dev_err(dev, "failed to get resistance-plate-x property\n"); > + return ERR_PTR(err); > + } > + pdata->x_plate_ohms = (u16)tmp; > + > + err = of_property_read_u32(np, "touchscreen-max-pressure", ); > + if (err) { > + dev_err(dev, "failed to get touchscreen-max-pressure > property\n"); > + return ERR_PTR(err); > + } > + pdata->pressure_min = (u16)tmp; > + > + of_property_read_u8(np, "first-conversion-delay", > >first_conversion_delay); > + of_property_read_u8(np, "acquisition-time", >acquisition_time); > + of_property_read_u8(np, "median-filter-size", >median); > + of_property_read_u8(np,
Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
Hi Stefan, On Mon, Jan 25, 2016 at 07:04:37PM -0800, Stefan Agner wrote: > Add device tree support for the I2C variant of AD7879 (AD7879-1). This > allows to specify the touchscreen controller as a I2C client node. > Most of the options available as platform data are also available as > device tree properties. Exporting the GPIO is currently not possible > through device tree. > > Signed-off-by: Stefan Agner> --- > .../bindings/input/touchscreen/ad7879-i2c.txt | 47 > drivers/input/touchscreen/ad7879-i2c.c | 63 > +- > drivers/input/touchscreen/ad7879-spi.c | 3 +- > drivers/input/touchscreen/ad7879.c | 2 +- > drivers/input/touchscreen/ad7879.h | 1 + > 5 files changed, 113 insertions(+), 3 deletions(-) > create mode 100644 > Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > > diff --git > a/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > new file mode 100644 > index 000..bf169a2 > --- /dev/null > +++ b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt > @@ -0,0 +1,47 @@ > +* Analog Devices AD7879-1/AD7889-1 touchscreen interface (I2C) > + > +Required properties: > +- compatible: must be "adi,ad7879-1" > +- reg: i2c slave address > +- interrupt-parent: the phandle for the interrupt controller > +- interrupts: touch controller interrupt > +- resistance-plate-x : total resistance of X-plate (for pressure > + calculation) > +- touchscreen-max-pressure : maximum reported pressure > +- touchscreen-swapped-x-y: X and Y axis are swapped (boolean) > + Swapping is done after inverting the axis > +Optional properties: > +- first-conversion-delay : 0-12 in 128us steps (starting with 128us) > + 13: 2.560ms > + 14: 3.584ms > + 15: 4.096ms > +- acquisition-time : 0: 2us > + 1: 4us > + 2: 8us > + 3: 16us > +- median-filter-size : 0: disabled > + 1: 4 measurements > + 2: 8 measurements > + 3: 16 measurements > +- averaging : 0: 2 middle values (1 if median disabled) > + 1: 4 middle values > + 2: 8 middle values > + 3: 16 values > +- conversion-interval: : 0: convert one time only > + 1-255: 515us + val * 35us (up to 9.440ms) > + > +Example: > + > + ad7879@2c { > + compatible = "adi,ad7879-1"; > + reg = <0x2c>; > + interrupt-parent = <>; > + interrupts = <13 IRQ_TYPE_EDGE_FALLING>; > + resistance-plate-x = <120>; > + touchscreen-max-pressure = <4096>; > + first-conversion-delay = /bits/ 8 <3>; > + acquisition-time = /bits/ 8 <1>; > + median-filter-size = /bits/ 8 <2>; > + averaging = /bits/ 8 <1>; > + conversion-interval = /bits/ 8 <255>; > + }; > diff --git a/drivers/input/touchscreen/ad7879-i2c.c > b/drivers/input/touchscreen/ad7879-i2c.c > index d66962c..08a2c9a 100644 > --- a/drivers/input/touchscreen/ad7879-i2c.c > +++ b/drivers/input/touchscreen/ad7879-i2c.c > @@ -11,6 +11,7 @@ > #include > #include > #include > +#include > > #include "ad7879.h" > > @@ -54,9 +55,50 @@ static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { > .write = ad7879_i2c_write, > }; > > +static struct ad7879_platform_data *ad7879_parse_dt(struct device *dev) > +{ > + struct ad7879_platform_data *pdata; > + struct device_node *np = dev->of_node; > + int err; > + u32 tmp; > + > + if (!np) > + return NULL; > + > + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); > + > + if (!pdata) > + return ERR_PTR(-ENOMEM); > + > + err = of_property_read_u32(np, "resistance-plate-x", ); > + if (err) { > + dev_err(dev, "failed to get resistance-plate-x property\n"); > + return ERR_PTR(err); > + } > + pdata->x_plate_ohms = (u16)tmp; > + > + err = of_property_read_u32(np, "touchscreen-max-pressure", ); > + if (err) { > + dev_err(dev, "failed to get touchscreen-max-pressure > property\n"); > + return ERR_PTR(err); > + } > + pdata->pressure_min = (u16)tmp; > + > + of_property_read_u8(np, "first-conversion-delay", > >first_conversion_delay); > + of_property_read_u8(np, "acquisition-time", >acquisition_time); > + of_property_read_u8(np, "median-filter-size", >median); > +
Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
On 2016-01-26 00:14, Michael Hennerich wrote: > On 01/26/2016 04:04 AM, Stefan Agner wrote: >> Add device tree support for the I2C variant of AD7879 (AD7879-1). This >> allows to specify the touchscreen controller as a I2C client node. >> Most of the options available as platform data are also available as >> device tree properties. Exporting the GPIO is currently not possible >> through device tree. >> >> Signed-off-by: Stefan Agner > > > Hi Stefan, > > Thanks for the patch - > There is something similar in our tree but I forgot to send it > mainline a long time ago. > > https://github.com/analogdevicesinc/linux/commit/69b16d4b616a4bbe9001d3f67d3ff54f3deb85ce Yeah I saw that patch. I tried to use the standard touchscreen properties where applicable. Also, my implementation is currently only for I2C. However, when I now think about it, I might as well move my code into ad7879.c which would enable to use the same bindings for SPI devices too. > > There are some build issues can you have a look? Yeah I saw, shame on me. Will fix them. > > I also don't understand why "exporting the GPIO is not possible > through device tree"? > > Can you explain? I should have written "not implemented" instead of "not possible". To implement proper device tree GPIO bindings it would need some more changes. I did not look into that, hence the current device tree bindings do not allow to enable the GPIO functionality. -- Stefan > > Regards, > Michael > > >> --- >> .../bindings/input/touchscreen/ad7879-i2c.txt | 47 >> drivers/input/touchscreen/ad7879-i2c.c | 63 >> +- >> drivers/input/touchscreen/ad7879-spi.c | 3 +- >> drivers/input/touchscreen/ad7879.c | 2 +- >> drivers/input/touchscreen/ad7879.h | 1 + >> 5 files changed, 113 insertions(+), 3 deletions(-) >> create mode 100644 >> Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt >> >> diff --git >> a/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt >> b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt >> new file mode 100644 >> index 000..bf169a2 >> --- /dev/null >> +++ b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt >> @@ -0,0 +1,47 @@ >> +* Analog Devices AD7879-1/AD7889-1 touchscreen interface (I2C) >> + >> +Required properties: >> +- compatible: must be "adi,ad7879-1" >> +- reg: i2c slave address >> +- interrupt-parent: the phandle for the interrupt controller >> +- interrupts: touch controller interrupt >> +- resistance-plate-x: total resistance of X-plate (for >> pressure >> + calculation) >> +- touchscreen-max-pressure : maximum reported pressure >> +- touchscreen-swapped-x-y : X and Y axis are swapped (boolean) >> + Swapping is done after inverting the axis >> +Optional properties: >> +- first-conversion-delay: 0-12 in 128us steps (starting with 128us) >> + 13: 2.560ms >> + 14: 3.584ms >> + 15: 4.096ms >> +- acquisition-time : 0: 2us >> + 1: 4us >> + 2: 8us >> + 3: 16us >> +- median-filter-size: 0: disabled >> + 1: 4 measurements >> + 2: 8 measurements >> + 3: 16 measurements >> +- averaging : 0: 2 middle values (1 if median disabled) >> + 1: 4 middle values >> + 2: 8 middle values >> + 3: 16 values >> +- conversion-interval: : 0: convert one time only >> + 1-255: 515us + val * 35us (up to 9.440ms) >> + >> +Example: >> + >> +ad7879@2c { >> +compatible = "adi,ad7879-1"; >> +reg = <0x2c>; >> +interrupt-parent = <>; >> +interrupts = <13 IRQ_TYPE_EDGE_FALLING>; >> +resistance-plate-x = <120>; >> +touchscreen-max-pressure = <4096>; >> +first-conversion-delay = /bits/ 8 <3>; >> +acquisition-time = /bits/ 8 <1>; >> +median-filter-size = /bits/ 8 <2>; >> +averaging = /bits/ 8 <1>; >> +conversion-interval = /bits/ 8 <255>; >> +}; >> diff --git a/drivers/input/touchscreen/ad7879-i2c.c >> b/drivers/input/touchscreen/ad7879-i2c.c >> index d66962c..08a2c9a 100644 >> --- a/drivers/input/touchscreen/ad7879-i2c.c >> +++ b/drivers/input/touchscreen/ad7879-i2c.c >> @@ -11,6 +11,7 @@ >> #include >> #include >> #include >> +#include >> >> #include "ad7879.h" >> >> @@ -54,9 +55,50 @@ static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { >> .write = ad7879_i2c_write, >> }; >> >> +static struct
Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
On 01/26/2016 04:04 AM, Stefan Agner wrote: Add device tree support for the I2C variant of AD7879 (AD7879-1). This allows to specify the touchscreen controller as a I2C client node. Most of the options available as platform data are also available as device tree properties. Exporting the GPIO is currently not possible through device tree. Signed-off-by: Stefan Agner Hi Stefan, Thanks for the patch - There is something similar in our tree but I forgot to send it mainline a long time ago. https://github.com/analogdevicesinc/linux/commit/69b16d4b616a4bbe9001d3f67d3ff54f3deb85ce There are some build issues can you have a look? I also don't understand why "exporting the GPIO is not possible through device tree"? Can you explain? Regards, Michael --- .../bindings/input/touchscreen/ad7879-i2c.txt | 47 drivers/input/touchscreen/ad7879-i2c.c | 63 +- drivers/input/touchscreen/ad7879-spi.c | 3 +- drivers/input/touchscreen/ad7879.c | 2 +- drivers/input/touchscreen/ad7879.h | 1 + 5 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt diff --git a/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt new file mode 100644 index 000..bf169a2 --- /dev/null +++ b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt @@ -0,0 +1,47 @@ +* Analog Devices AD7879-1/AD7889-1 touchscreen interface (I2C) + +Required properties: +- compatible: must be "adi,ad7879-1" +- reg: i2c slave address +- interrupt-parent: the phandle for the interrupt controller +- interrupts: touch controller interrupt +- resistance-plate-x : total resistance of X-plate (for pressure + calculation) +- touchscreen-max-pressure : maximum reported pressure +- touchscreen-swapped-x-y : X and Y axis are swapped (boolean) + Swapping is done after inverting the axis +Optional properties: +- first-conversion-delay : 0-12 in 128us steps (starting with 128us) + 13: 2.560ms + 14: 3.584ms + 15: 4.096ms +- acquisition-time : 0: 2us + 1: 4us + 2: 8us + 3: 16us +- median-filter-size : 0: disabled + 1: 4 measurements + 2: 8 measurements + 3: 16 measurements +- averaging: 0: 2 middle values (1 if median disabled) + 1: 4 middle values + 2: 8 middle values + 3: 16 values +- conversion-interval: : 0: convert one time only + 1-255: 515us + val * 35us (up to 9.440ms) + +Example: + + ad7879@2c { + compatible = "adi,ad7879-1"; + reg = <0x2c>; + interrupt-parent = <>; + interrupts = <13 IRQ_TYPE_EDGE_FALLING>; + resistance-plate-x = <120>; + touchscreen-max-pressure = <4096>; + first-conversion-delay = /bits/ 8 <3>; + acquisition-time = /bits/ 8 <1>; + median-filter-size = /bits/ 8 <2>; + averaging = /bits/ 8 <1>; + conversion-interval = /bits/ 8 <255>; + }; diff --git a/drivers/input/touchscreen/ad7879-i2c.c b/drivers/input/touchscreen/ad7879-i2c.c index d66962c..08a2c9a 100644 --- a/drivers/input/touchscreen/ad7879-i2c.c +++ b/drivers/input/touchscreen/ad7879-i2c.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "ad7879.h" @@ -54,9 +55,50 @@ static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { .write = ad7879_i2c_write, }; +static struct ad7879_platform_data *ad7879_parse_dt(struct device *dev) +{ + struct ad7879_platform_data *pdata; + struct device_node *np = dev->of_node; + int err; + u32 tmp; + + if (!np) + return NULL; + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + + if (!pdata) + return ERR_PTR(-ENOMEM); + + err = of_property_read_u32(np, "resistance-plate-x", ); + if (err) { + dev_err(dev, "failed to get resistance-plate-x property\n"); + return ERR_PTR(err); + } + pdata->x_plate_ohms = (u16)tmp; + + err = of_property_read_u32(np, "touchscreen-max-pressure", ); + if (err) { + dev_err(dev, "failed to get touchscreen-max-pressure property\n"); + return ERR_PTR(err); + } + pdata->pressure_min = (u16)tmp; + +
Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
On 01/26/2016 04:04 AM, Stefan Agner wrote: Add device tree support for the I2C variant of AD7879 (AD7879-1). This allows to specify the touchscreen controller as a I2C client node. Most of the options available as platform data are also available as device tree properties. Exporting the GPIO is currently not possible through device tree. Signed-off-by: Stefan AgnerHi Stefan, Thanks for the patch - There is something similar in our tree but I forgot to send it mainline a long time ago. https://github.com/analogdevicesinc/linux/commit/69b16d4b616a4bbe9001d3f67d3ff54f3deb85ce There are some build issues can you have a look? I also don't understand why "exporting the GPIO is not possible through device tree"? Can you explain? Regards, Michael --- .../bindings/input/touchscreen/ad7879-i2c.txt | 47 drivers/input/touchscreen/ad7879-i2c.c | 63 +- drivers/input/touchscreen/ad7879-spi.c | 3 +- drivers/input/touchscreen/ad7879.c | 2 +- drivers/input/touchscreen/ad7879.h | 1 + 5 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt diff --git a/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt new file mode 100644 index 000..bf169a2 --- /dev/null +++ b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt @@ -0,0 +1,47 @@ +* Analog Devices AD7879-1/AD7889-1 touchscreen interface (I2C) + +Required properties: +- compatible: must be "adi,ad7879-1" +- reg: i2c slave address +- interrupt-parent: the phandle for the interrupt controller +- interrupts: touch controller interrupt +- resistance-plate-x : total resistance of X-plate (for pressure + calculation) +- touchscreen-max-pressure : maximum reported pressure +- touchscreen-swapped-x-y : X and Y axis are swapped (boolean) + Swapping is done after inverting the axis +Optional properties: +- first-conversion-delay : 0-12 in 128us steps (starting with 128us) + 13: 2.560ms + 14: 3.584ms + 15: 4.096ms +- acquisition-time : 0: 2us + 1: 4us + 2: 8us + 3: 16us +- median-filter-size : 0: disabled + 1: 4 measurements + 2: 8 measurements + 3: 16 measurements +- averaging: 0: 2 middle values (1 if median disabled) + 1: 4 middle values + 2: 8 middle values + 3: 16 values +- conversion-interval: : 0: convert one time only + 1-255: 515us + val * 35us (up to 9.440ms) + +Example: + + ad7879@2c { + compatible = "adi,ad7879-1"; + reg = <0x2c>; + interrupt-parent = <>; + interrupts = <13 IRQ_TYPE_EDGE_FALLING>; + resistance-plate-x = <120>; + touchscreen-max-pressure = <4096>; + first-conversion-delay = /bits/ 8 <3>; + acquisition-time = /bits/ 8 <1>; + median-filter-size = /bits/ 8 <2>; + averaging = /bits/ 8 <1>; + conversion-interval = /bits/ 8 <255>; + }; diff --git a/drivers/input/touchscreen/ad7879-i2c.c b/drivers/input/touchscreen/ad7879-i2c.c index d66962c..08a2c9a 100644 --- a/drivers/input/touchscreen/ad7879-i2c.c +++ b/drivers/input/touchscreen/ad7879-i2c.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "ad7879.h" @@ -54,9 +55,50 @@ static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { .write = ad7879_i2c_write, }; +static struct ad7879_platform_data *ad7879_parse_dt(struct device *dev) +{ + struct ad7879_platform_data *pdata; + struct device_node *np = dev->of_node; + int err; + u32 tmp; + + if (!np) + return NULL; + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + + if (!pdata) + return ERR_PTR(-ENOMEM); + + err = of_property_read_u32(np, "resistance-plate-x", ); + if (err) { + dev_err(dev, "failed to get resistance-plate-x property\n"); + return ERR_PTR(err); + } + pdata->x_plate_ohms = (u16)tmp; + + err = of_property_read_u32(np, "touchscreen-max-pressure", ); + if (err) { + dev_err(dev, "failed to get touchscreen-max-pressure property\n"); + return ERR_PTR(err); + } + pdata->pressure_min =
Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
On 2016-01-26 00:14, Michael Hennerich wrote: > On 01/26/2016 04:04 AM, Stefan Agner wrote: >> Add device tree support for the I2C variant of AD7879 (AD7879-1). This >> allows to specify the touchscreen controller as a I2C client node. >> Most of the options available as platform data are also available as >> device tree properties. Exporting the GPIO is currently not possible >> through device tree. >> >> Signed-off-by: Stefan Agner> > > Hi Stefan, > > Thanks for the patch - > There is something similar in our tree but I forgot to send it > mainline a long time ago. > > https://github.com/analogdevicesinc/linux/commit/69b16d4b616a4bbe9001d3f67d3ff54f3deb85ce Yeah I saw that patch. I tried to use the standard touchscreen properties where applicable. Also, my implementation is currently only for I2C. However, when I now think about it, I might as well move my code into ad7879.c which would enable to use the same bindings for SPI devices too. > > There are some build issues can you have a look? Yeah I saw, shame on me. Will fix them. > > I also don't understand why "exporting the GPIO is not possible > through device tree"? > > Can you explain? I should have written "not implemented" instead of "not possible". To implement proper device tree GPIO bindings it would need some more changes. I did not look into that, hence the current device tree bindings do not allow to enable the GPIO functionality. -- Stefan > > Regards, > Michael > > >> --- >> .../bindings/input/touchscreen/ad7879-i2c.txt | 47 >> drivers/input/touchscreen/ad7879-i2c.c | 63 >> +- >> drivers/input/touchscreen/ad7879-spi.c | 3 +- >> drivers/input/touchscreen/ad7879.c | 2 +- >> drivers/input/touchscreen/ad7879.h | 1 + >> 5 files changed, 113 insertions(+), 3 deletions(-) >> create mode 100644 >> Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt >> >> diff --git >> a/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt >> b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt >> new file mode 100644 >> index 000..bf169a2 >> --- /dev/null >> +++ b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt >> @@ -0,0 +1,47 @@ >> +* Analog Devices AD7879-1/AD7889-1 touchscreen interface (I2C) >> + >> +Required properties: >> +- compatible: must be "adi,ad7879-1" >> +- reg: i2c slave address >> +- interrupt-parent: the phandle for the interrupt controller >> +- interrupts: touch controller interrupt >> +- resistance-plate-x: total resistance of X-plate (for >> pressure >> + calculation) >> +- touchscreen-max-pressure : maximum reported pressure >> +- touchscreen-swapped-x-y : X and Y axis are swapped (boolean) >> + Swapping is done after inverting the axis >> +Optional properties: >> +- first-conversion-delay: 0-12 in 128us steps (starting with 128us) >> + 13: 2.560ms >> + 14: 3.584ms >> + 15: 4.096ms >> +- acquisition-time : 0: 2us >> + 1: 4us >> + 2: 8us >> + 3: 16us >> +- median-filter-size: 0: disabled >> + 1: 4 measurements >> + 2: 8 measurements >> + 3: 16 measurements >> +- averaging : 0: 2 middle values (1 if median disabled) >> + 1: 4 middle values >> + 2: 8 middle values >> + 3: 16 values >> +- conversion-interval: : 0: convert one time only >> + 1-255: 515us + val * 35us (up to 9.440ms) >> + >> +Example: >> + >> +ad7879@2c { >> +compatible = "adi,ad7879-1"; >> +reg = <0x2c>; >> +interrupt-parent = <>; >> +interrupts = <13 IRQ_TYPE_EDGE_FALLING>; >> +resistance-plate-x = <120>; >> +touchscreen-max-pressure = <4096>; >> +first-conversion-delay = /bits/ 8 <3>; >> +acquisition-time = /bits/ 8 <1>; >> +median-filter-size = /bits/ 8 <2>; >> +averaging = /bits/ 8 <1>; >> +conversion-interval = /bits/ 8 <255>; >> +}; >> diff --git a/drivers/input/touchscreen/ad7879-i2c.c >> b/drivers/input/touchscreen/ad7879-i2c.c >> index d66962c..08a2c9a 100644 >> --- a/drivers/input/touchscreen/ad7879-i2c.c >> +++ b/drivers/input/touchscreen/ad7879-i2c.c >> @@ -11,6 +11,7 @@ >> #include >> #include >> #include >> +#include >> >> #include "ad7879.h" >> >> @@ -54,9 +55,50 @@ static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { >> .write = ad7879_i2c_write, >> }; >> >> +static
Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
Hi Stefan, [auto build test ERROR on input/next] [also build test ERROR on v4.5-rc1 next-20160125] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Stefan-Agner/input-touchscreen-ad7879-move-header-to-input-subdirectory/20160126-110813 base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next config: sh-allmodconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=sh All errors (new ones prefixed by >>): drivers/input/touchscreen/ad7879-i2c.c:151:1: error: 'st1232_ts_dt_ids' undeclared here (not in a function) >> drivers/input/touchscreen/ad7879-i2c.c:151:1: error: >> '__mod_of__st1232_ts_dt_ids_device_table' aliased to undefined symbol >> 'st1232_ts_dt_ids' vim +151 drivers/input/touchscreen/ad7879-i2c.c 145 146 #ifdef CONFIG_OF 147 static const struct of_device_id ad7879_dt_ids[] = { 148 { .compatible = "adi,ad7879-1", }, 149 { } 150 }; > 151 MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids); 152 #endif 153 154 static struct i2c_driver ad7879_i2c_driver = { --- 0-DAY kernel test infrastructureOpen Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation .config.gz Description: Binary data
Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
Hi Stefan, [auto build test ERROR on input/next] [also build test ERROR on v4.5-rc1 next-20160125] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Stefan-Agner/input-touchscreen-ad7879-move-header-to-input-subdirectory/20160126-110813 base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next config: x86_64-randconfig-s4-01261112 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All error/warnings (new ones prefixed by >>): In file included from drivers/input/touchscreen/ad7879-i2c.c:11:0: >> drivers/input/touchscreen/ad7879-i2c.c:151:25: error: 'st1232_ts_dt_ids' >> undeclared here (not in a function) MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids); ^ include/linux/module.h:223:21: note: in definition of macro 'MODULE_DEVICE_TABLE' extern const typeof(name) __mod_##type##__##name##_device_table \ ^ >> include/linux/module.h:223:27: error: >> '__mod_of__st1232_ts_dt_ids_device_table' aliased to undefined symbol >> 'st1232_ts_dt_ids' extern const typeof(name) __mod_##type##__##name##_device_table \ ^ >> drivers/input/touchscreen/ad7879-i2c.c:151:1: note: in expansion of macro >> 'MODULE_DEVICE_TABLE' MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids); ^ vim +/st1232_ts_dt_ids +151 drivers/input/touchscreen/ad7879-i2c.c 5 * 6 * Licensed under the GPL-2 or later. 7 */ 8 9 #include /* BUS_I2C */ 10 #include > 11 #include 12 #include 13 #include 14 #include 15 16 #include "ad7879.h" 17 18 #define AD7879_DEVID0x79/* AD7879-1/AD7889-1 */ 19 20 /* All registers are word-sized. 21 * AD7879 uses a high-byte first convention. 22 */ 23 static int ad7879_i2c_read(struct device *dev, u8 reg) 24 { 25 struct i2c_client *client = to_i2c_client(dev); 26 27 return i2c_smbus_read_word_swapped(client, reg); 28 } 29 30 static int ad7879_i2c_multi_read(struct device *dev, 31 u8 first_reg, u8 count, u16 *buf) 32 { 33 struct i2c_client *client = to_i2c_client(dev); 34 u8 idx; 35 36 i2c_smbus_read_i2c_block_data(client, first_reg, count * 2, (u8 *)buf); 37 38 for (idx = 0; idx < count; ++idx) 39 buf[idx] = swab16(buf[idx]); 40 41 return 0; 42 } 43 44 static int ad7879_i2c_write(struct device *dev, u8 reg, u16 val) 45 { 46 struct i2c_client *client = to_i2c_client(dev); 47 48 return i2c_smbus_write_word_swapped(client, reg, val); 49 } 50 51 static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { 52 .bustype= BUS_I2C, 53 .read = ad7879_i2c_read, 54 .multi_read = ad7879_i2c_multi_read, 55 .write = ad7879_i2c_write, 56 }; 57 58 static struct ad7879_platform_data *ad7879_parse_dt(struct device *dev) 59 { 60 struct ad7879_platform_data *pdata; 61 struct device_node *np = dev->of_node; 62 int err; 63 u32 tmp; 64 65 if (!np) 66 return NULL; 67 68 pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); 69 70 if (!pdata) 71 return ERR_PTR(-ENOMEM); 72 73 err = of_property_read_u32(np, "resistance-plate-x", ); 74 if (err) { 75 dev_err(dev, "failed to get resistance-plate-x property\n"); 76 return ERR_PTR(err); 77 } 78 pdata->x_plate_ohms = (u16)tmp; 79 80 err = of_property_read_u32(np, "touchscreen-max-pressure", ); 81 if (err) { 82 dev_err(dev, "failed to get touchscreen-max-pressure property\n"); 83 return ERR_PTR(err); 84 } 85 pdata->pressure_min = (u16)tmp; 86 87 of_property_read_u8(np, "first-conversion-delay", >first_conversion_delay); 88 of_property_read_u8(np, "acquisition-time", >acquisition_time); 89 of_property_read_u8(np, "median-filter-size", >median); 90 of_property_read_u8(np, "averaging", >averaging); 91 of_property_read_u8(np, "conversion-interval", >pen_down_acc_interval); 92 93 pdata->swap_xy = of_property_read_bool(np, "touchscreen-swapped-x-y"); 94 95 return pdata; 96 } 97 98 static int ad7879_i2c_probe(struct i2c_client *client, 99
Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
Hi Stefan, [auto build test ERROR on input/next] [also build test ERROR on v4.5-rc1 next-20160125] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Stefan-Agner/input-touchscreen-ad7879-move-header-to-input-subdirectory/20160126-110813 base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next config: x86_64-randconfig-x012-01260845 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All error/warnings (new ones prefixed by >>): In file included from drivers/input/touchscreen/ad7879-spi.c:14:0: >> drivers/input/touchscreen/ad7879.h:28:21: warning: 'struct >> ad7879_platform_data' declared inside parameter list const struct ad7879_bus_ops *bops); ^ >> drivers/input/touchscreen/ad7879.h:28:21: warning: its scope is only this >> definition or declaration, which is probably not what you want drivers/input/touchscreen/ad7879-spi.c: In function 'ad7879_spi_probe': >> drivers/input/touchscreen/ad7879-spi.c:131:55: error: 'pdata' undeclared >> (first use in this function) ts = ad7879_probe(>dev, AD7879_DEVID, spi->irq, pdata, ^ drivers/input/touchscreen/ad7879-spi.c:131:55: note: each undeclared identifier is reported only once for each function it appears in >> drivers/input/touchscreen/ad7879-spi.c:131:7: error: too many arguments to >> function 'ad7879_probe' ts = ad7879_probe(>dev, AD7879_DEVID, spi->irq, pdata, ^ In file included from drivers/input/touchscreen/ad7879-spi.c:14:0: drivers/input/touchscreen/ad7879.h:26:16: note: declared here struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned irq, ^ vim +/pdata +131 drivers/input/touchscreen/ad7879-spi.c 8 9 #include /* BUS_SPI */ 10 #include 11 #include 12 #include 13 > 14 #include "ad7879.h" 15 16 #define AD7879_DEVID0x7A/* AD7879/AD7889 */ 17 18 #define MAX_SPI_FREQ_HZ 500 19 #define AD7879_CMD_MAGIC 0xE000 20 #define AD7879_CMD_READ (1 << 10) 21 #define AD7879_CMD(reg) (AD7879_CMD_MAGIC | ((reg) & 0xF)) 22 #define AD7879_WRITECMD(reg) (AD7879_CMD(reg)) 23 #define AD7879_READCMD(reg) (AD7879_CMD(reg) | AD7879_CMD_READ) 24 25 /* 26 * ad7879_read/write are only used for initial setup and for sysfs controls. 27 * The main traffic is done in ad7879_collect(). 28 */ 29 30 static int ad7879_spi_xfer(struct spi_device *spi, 31 u16 cmd, u8 count, u16 *tx_buf, u16 *rx_buf) 32 { 33 struct spi_message msg; 34 struct spi_transfer *xfers; 35 void *spi_data; 36 u16 *command; 37 u16 *_rx_buf = _rx_buf; /* shut gcc up */ 38 u8 idx; 39 int ret; 40 41 xfers = spi_data = kzalloc(sizeof(*xfers) * (count + 2), GFP_KERNEL); 42 if (!spi_data) 43 return -ENOMEM; 44 45 spi_message_init(); 46 47 command = spi_data; 48 command[0] = cmd; 49 if (count == 1) { 50 /* ad7879_spi_{read,write} gave us buf on stack */ 51 command[1] = *tx_buf; 52 tx_buf = [1]; 53 _rx_buf = rx_buf; 54 rx_buf = [2]; 55 } 56 57 ++xfers; 58 xfers[0].tx_buf = command; 59 xfers[0].len = 2; 60 spi_message_add_tail([0], ); 61 ++xfers; 62 63 for (idx = 0; idx < count; ++idx) { 64 if (rx_buf) 65 xfers[idx].rx_buf = _buf[idx]; 66 if (tx_buf) 67 xfers[idx].tx_buf = _buf[idx]; 68 xfers[idx].len = 2; 69 spi_message_add_tail([idx], ); 70 } 71 72 ret = spi_sync(spi, ); 73 74 if (count == 1) 75 _rx_buf[0] = command[2]; 76 77 kfree(spi_data); 78 79 return ret; 80 } 81 82 static int ad7879_spi_multi_read(struct device *dev, 83 u8 first_reg, u8 count, u16 *buf) 84 { 85 struct spi_device *spi = to_spi_device(dev); 86 87 return ad7879_spi_xfer(spi, AD7879_READCMD(first_reg), count, NULL, buf); 88 } 89 90 static int ad7879_spi_read(struct device *dev, u8 reg) 91 { 92 struct spi_device *spi = to_spi_device(dev); 93 u16 ret, dummy; 94 95 return
[PATCH 3/3] input: touchscreen: ad7879: add device tree support
Add device tree support for the I2C variant of AD7879 (AD7879-1). This allows to specify the touchscreen controller as a I2C client node. Most of the options available as platform data are also available as device tree properties. Exporting the GPIO is currently not possible through device tree. Signed-off-by: Stefan Agner --- .../bindings/input/touchscreen/ad7879-i2c.txt | 47 drivers/input/touchscreen/ad7879-i2c.c | 63 +- drivers/input/touchscreen/ad7879-spi.c | 3 +- drivers/input/touchscreen/ad7879.c | 2 +- drivers/input/touchscreen/ad7879.h | 1 + 5 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt diff --git a/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt new file mode 100644 index 000..bf169a2 --- /dev/null +++ b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt @@ -0,0 +1,47 @@ +* Analog Devices AD7879-1/AD7889-1 touchscreen interface (I2C) + +Required properties: +- compatible: must be "adi,ad7879-1" +- reg: i2c slave address +- interrupt-parent: the phandle for the interrupt controller +- interrupts: touch controller interrupt +- resistance-plate-x : total resistance of X-plate (for pressure + calculation) +- touchscreen-max-pressure : maximum reported pressure +- touchscreen-swapped-x-y : X and Y axis are swapped (boolean) + Swapping is done after inverting the axis +Optional properties: +- first-conversion-delay : 0-12 in 128us steps (starting with 128us) + 13: 2.560ms + 14: 3.584ms + 15: 4.096ms +- acquisition-time : 0: 2us + 1: 4us + 2: 8us + 3: 16us +- median-filter-size : 0: disabled + 1: 4 measurements + 2: 8 measurements + 3: 16 measurements +- averaging: 0: 2 middle values (1 if median disabled) + 1: 4 middle values + 2: 8 middle values + 3: 16 values +- conversion-interval: : 0: convert one time only + 1-255: 515us + val * 35us (up to 9.440ms) + +Example: + + ad7879@2c { + compatible = "adi,ad7879-1"; + reg = <0x2c>; + interrupt-parent = <>; + interrupts = <13 IRQ_TYPE_EDGE_FALLING>; + resistance-plate-x = <120>; + touchscreen-max-pressure = <4096>; + first-conversion-delay = /bits/ 8 <3>; + acquisition-time = /bits/ 8 <1>; + median-filter-size = /bits/ 8 <2>; + averaging = /bits/ 8 <1>; + conversion-interval = /bits/ 8 <255>; + }; diff --git a/drivers/input/touchscreen/ad7879-i2c.c b/drivers/input/touchscreen/ad7879-i2c.c index d66962c..08a2c9a 100644 --- a/drivers/input/touchscreen/ad7879-i2c.c +++ b/drivers/input/touchscreen/ad7879-i2c.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "ad7879.h" @@ -54,9 +55,50 @@ static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { .write = ad7879_i2c_write, }; +static struct ad7879_platform_data *ad7879_parse_dt(struct device *dev) +{ + struct ad7879_platform_data *pdata; + struct device_node *np = dev->of_node; + int err; + u32 tmp; + + if (!np) + return NULL; + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + + if (!pdata) + return ERR_PTR(-ENOMEM); + + err = of_property_read_u32(np, "resistance-plate-x", ); + if (err) { + dev_err(dev, "failed to get resistance-plate-x property\n"); + return ERR_PTR(err); + } + pdata->x_plate_ohms = (u16)tmp; + + err = of_property_read_u32(np, "touchscreen-max-pressure", ); + if (err) { + dev_err(dev, "failed to get touchscreen-max-pressure property\n"); + return ERR_PTR(err); + } + pdata->pressure_min = (u16)tmp; + + of_property_read_u8(np, "first-conversion-delay", >first_conversion_delay); + of_property_read_u8(np, "acquisition-time", >acquisition_time); + of_property_read_u8(np, "median-filter-size", >median); + of_property_read_u8(np, "averaging", >averaging); + of_property_read_u8(np, "conversion-interval", >pen_down_acc_interval); + + pdata->swap_xy = of_property_read_bool(np, "touchscreen-swapped-x-y"); + + return
Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
Hi Stefan, [auto build test ERROR on input/next] [also build test ERROR on v4.5-rc1 next-20160125] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Stefan-Agner/input-touchscreen-ad7879-move-header-to-input-subdirectory/20160126-110813 base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next config: sh-allmodconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=sh All errors (new ones prefixed by >>): drivers/input/touchscreen/ad7879-i2c.c:151:1: error: 'st1232_ts_dt_ids' undeclared here (not in a function) >> drivers/input/touchscreen/ad7879-i2c.c:151:1: error: >> '__mod_of__st1232_ts_dt_ids_device_table' aliased to undefined symbol >> 'st1232_ts_dt_ids' vim +151 drivers/input/touchscreen/ad7879-i2c.c 145 146 #ifdef CONFIG_OF 147 static const struct of_device_id ad7879_dt_ids[] = { 148 { .compatible = "adi,ad7879-1", }, 149 { } 150 }; > 151 MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids); 152 #endif 153 154 static struct i2c_driver ad7879_i2c_driver = { --- 0-DAY kernel test infrastructureOpen Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation .config.gz Description: Binary data
Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
Hi Stefan, [auto build test ERROR on input/next] [also build test ERROR on v4.5-rc1 next-20160125] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Stefan-Agner/input-touchscreen-ad7879-move-header-to-input-subdirectory/20160126-110813 base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next config: x86_64-randconfig-s4-01261112 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All error/warnings (new ones prefixed by >>): In file included from drivers/input/touchscreen/ad7879-i2c.c:11:0: >> drivers/input/touchscreen/ad7879-i2c.c:151:25: error: 'st1232_ts_dt_ids' >> undeclared here (not in a function) MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids); ^ include/linux/module.h:223:21: note: in definition of macro 'MODULE_DEVICE_TABLE' extern const typeof(name) __mod_##type##__##name##_device_table \ ^ >> include/linux/module.h:223:27: error: >> '__mod_of__st1232_ts_dt_ids_device_table' aliased to undefined symbol >> 'st1232_ts_dt_ids' extern const typeof(name) __mod_##type##__##name##_device_table \ ^ >> drivers/input/touchscreen/ad7879-i2c.c:151:1: note: in expansion of macro >> 'MODULE_DEVICE_TABLE' MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids); ^ vim +/st1232_ts_dt_ids +151 drivers/input/touchscreen/ad7879-i2c.c 5 * 6 * Licensed under the GPL-2 or later. 7 */ 8 9 #include /* BUS_I2C */ 10 #include > 11 #include 12 #include 13 #include 14 #include 15 16 #include "ad7879.h" 17 18 #define AD7879_DEVID0x79/* AD7879-1/AD7889-1 */ 19 20 /* All registers are word-sized. 21 * AD7879 uses a high-byte first convention. 22 */ 23 static int ad7879_i2c_read(struct device *dev, u8 reg) 24 { 25 struct i2c_client *client = to_i2c_client(dev); 26 27 return i2c_smbus_read_word_swapped(client, reg); 28 } 29 30 static int ad7879_i2c_multi_read(struct device *dev, 31 u8 first_reg, u8 count, u16 *buf) 32 { 33 struct i2c_client *client = to_i2c_client(dev); 34 u8 idx; 35 36 i2c_smbus_read_i2c_block_data(client, first_reg, count * 2, (u8 *)buf); 37 38 for (idx = 0; idx < count; ++idx) 39 buf[idx] = swab16(buf[idx]); 40 41 return 0; 42 } 43 44 static int ad7879_i2c_write(struct device *dev, u8 reg, u16 val) 45 { 46 struct i2c_client *client = to_i2c_client(dev); 47 48 return i2c_smbus_write_word_swapped(client, reg, val); 49 } 50 51 static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { 52 .bustype= BUS_I2C, 53 .read = ad7879_i2c_read, 54 .multi_read = ad7879_i2c_multi_read, 55 .write = ad7879_i2c_write, 56 }; 57 58 static struct ad7879_platform_data *ad7879_parse_dt(struct device *dev) 59 { 60 struct ad7879_platform_data *pdata; 61 struct device_node *np = dev->of_node; 62 int err; 63 u32 tmp; 64 65 if (!np) 66 return NULL; 67 68 pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); 69 70 if (!pdata) 71 return ERR_PTR(-ENOMEM); 72 73 err = of_property_read_u32(np, "resistance-plate-x", ); 74 if (err) { 75 dev_err(dev, "failed to get resistance-plate-x property\n"); 76 return ERR_PTR(err); 77 } 78 pdata->x_plate_ohms = (u16)tmp; 79 80 err = of_property_read_u32(np, "touchscreen-max-pressure", ); 81 if (err) { 82 dev_err(dev, "failed to get touchscreen-max-pressure property\n"); 83 return ERR_PTR(err); 84 } 85 pdata->pressure_min = (u16)tmp; 86 87 of_property_read_u8(np, "first-conversion-delay", >first_conversion_delay); 88 of_property_read_u8(np, "acquisition-time", >acquisition_time); 89 of_property_read_u8(np, "median-filter-size", >median); 90 of_property_read_u8(np, "averaging", >averaging); 91 of_property_read_u8(np, "conversion-interval", >pen_down_acc_interval); 92 93 pdata->swap_xy = of_property_read_bool(np, "touchscreen-swapped-x-y"); 94 95 return pdata; 96 } 97 98 static int ad7879_i2c_probe(struct i2c_client *client, 99
[PATCH 3/3] input: touchscreen: ad7879: add device tree support
Add device tree support for the I2C variant of AD7879 (AD7879-1). This allows to specify the touchscreen controller as a I2C client node. Most of the options available as platform data are also available as device tree properties. Exporting the GPIO is currently not possible through device tree. Signed-off-by: Stefan Agner--- .../bindings/input/touchscreen/ad7879-i2c.txt | 47 drivers/input/touchscreen/ad7879-i2c.c | 63 +- drivers/input/touchscreen/ad7879-spi.c | 3 +- drivers/input/touchscreen/ad7879.c | 2 +- drivers/input/touchscreen/ad7879.h | 1 + 5 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt diff --git a/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt new file mode 100644 index 000..bf169a2 --- /dev/null +++ b/Documentation/devicetree/bindings/input/touchscreen/ad7879-i2c.txt @@ -0,0 +1,47 @@ +* Analog Devices AD7879-1/AD7889-1 touchscreen interface (I2C) + +Required properties: +- compatible: must be "adi,ad7879-1" +- reg: i2c slave address +- interrupt-parent: the phandle for the interrupt controller +- interrupts: touch controller interrupt +- resistance-plate-x : total resistance of X-plate (for pressure + calculation) +- touchscreen-max-pressure : maximum reported pressure +- touchscreen-swapped-x-y : X and Y axis are swapped (boolean) + Swapping is done after inverting the axis +Optional properties: +- first-conversion-delay : 0-12 in 128us steps (starting with 128us) + 13: 2.560ms + 14: 3.584ms + 15: 4.096ms +- acquisition-time : 0: 2us + 1: 4us + 2: 8us + 3: 16us +- median-filter-size : 0: disabled + 1: 4 measurements + 2: 8 measurements + 3: 16 measurements +- averaging: 0: 2 middle values (1 if median disabled) + 1: 4 middle values + 2: 8 middle values + 3: 16 values +- conversion-interval: : 0: convert one time only + 1-255: 515us + val * 35us (up to 9.440ms) + +Example: + + ad7879@2c { + compatible = "adi,ad7879-1"; + reg = <0x2c>; + interrupt-parent = <>; + interrupts = <13 IRQ_TYPE_EDGE_FALLING>; + resistance-plate-x = <120>; + touchscreen-max-pressure = <4096>; + first-conversion-delay = /bits/ 8 <3>; + acquisition-time = /bits/ 8 <1>; + median-filter-size = /bits/ 8 <2>; + averaging = /bits/ 8 <1>; + conversion-interval = /bits/ 8 <255>; + }; diff --git a/drivers/input/touchscreen/ad7879-i2c.c b/drivers/input/touchscreen/ad7879-i2c.c index d66962c..08a2c9a 100644 --- a/drivers/input/touchscreen/ad7879-i2c.c +++ b/drivers/input/touchscreen/ad7879-i2c.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "ad7879.h" @@ -54,9 +55,50 @@ static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { .write = ad7879_i2c_write, }; +static struct ad7879_platform_data *ad7879_parse_dt(struct device *dev) +{ + struct ad7879_platform_data *pdata; + struct device_node *np = dev->of_node; + int err; + u32 tmp; + + if (!np) + return NULL; + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + + if (!pdata) + return ERR_PTR(-ENOMEM); + + err = of_property_read_u32(np, "resistance-plate-x", ); + if (err) { + dev_err(dev, "failed to get resistance-plate-x property\n"); + return ERR_PTR(err); + } + pdata->x_plate_ohms = (u16)tmp; + + err = of_property_read_u32(np, "touchscreen-max-pressure", ); + if (err) { + dev_err(dev, "failed to get touchscreen-max-pressure property\n"); + return ERR_PTR(err); + } + pdata->pressure_min = (u16)tmp; + + of_property_read_u8(np, "first-conversion-delay", >first_conversion_delay); + of_property_read_u8(np, "acquisition-time", >acquisition_time); + of_property_read_u8(np, "median-filter-size", >median); + of_property_read_u8(np, "averaging", >averaging); + of_property_read_u8(np, "conversion-interval", >pen_down_acc_interval); + + pdata->swap_xy = of_property_read_bool(np, "touchscreen-swapped-x-y"); + +
Re: [PATCH 3/3] input: touchscreen: ad7879: add device tree support
Hi Stefan, [auto build test ERROR on input/next] [also build test ERROR on v4.5-rc1 next-20160125] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Stefan-Agner/input-touchscreen-ad7879-move-header-to-input-subdirectory/20160126-110813 base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next config: x86_64-randconfig-x012-01260845 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All error/warnings (new ones prefixed by >>): In file included from drivers/input/touchscreen/ad7879-spi.c:14:0: >> drivers/input/touchscreen/ad7879.h:28:21: warning: 'struct >> ad7879_platform_data' declared inside parameter list const struct ad7879_bus_ops *bops); ^ >> drivers/input/touchscreen/ad7879.h:28:21: warning: its scope is only this >> definition or declaration, which is probably not what you want drivers/input/touchscreen/ad7879-spi.c: In function 'ad7879_spi_probe': >> drivers/input/touchscreen/ad7879-spi.c:131:55: error: 'pdata' undeclared >> (first use in this function) ts = ad7879_probe(>dev, AD7879_DEVID, spi->irq, pdata, ^ drivers/input/touchscreen/ad7879-spi.c:131:55: note: each undeclared identifier is reported only once for each function it appears in >> drivers/input/touchscreen/ad7879-spi.c:131:7: error: too many arguments to >> function 'ad7879_probe' ts = ad7879_probe(>dev, AD7879_DEVID, spi->irq, pdata, ^ In file included from drivers/input/touchscreen/ad7879-spi.c:14:0: drivers/input/touchscreen/ad7879.h:26:16: note: declared here struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned irq, ^ vim +/pdata +131 drivers/input/touchscreen/ad7879-spi.c 8 9 #include /* BUS_SPI */ 10 #include 11 #include 12 #include 13 > 14 #include "ad7879.h" 15 16 #define AD7879_DEVID0x7A/* AD7879/AD7889 */ 17 18 #define MAX_SPI_FREQ_HZ 500 19 #define AD7879_CMD_MAGIC 0xE000 20 #define AD7879_CMD_READ (1 << 10) 21 #define AD7879_CMD(reg) (AD7879_CMD_MAGIC | ((reg) & 0xF)) 22 #define AD7879_WRITECMD(reg) (AD7879_CMD(reg)) 23 #define AD7879_READCMD(reg) (AD7879_CMD(reg) | AD7879_CMD_READ) 24 25 /* 26 * ad7879_read/write are only used for initial setup and for sysfs controls. 27 * The main traffic is done in ad7879_collect(). 28 */ 29 30 static int ad7879_spi_xfer(struct spi_device *spi, 31 u16 cmd, u8 count, u16 *tx_buf, u16 *rx_buf) 32 { 33 struct spi_message msg; 34 struct spi_transfer *xfers; 35 void *spi_data; 36 u16 *command; 37 u16 *_rx_buf = _rx_buf; /* shut gcc up */ 38 u8 idx; 39 int ret; 40 41 xfers = spi_data = kzalloc(sizeof(*xfers) * (count + 2), GFP_KERNEL); 42 if (!spi_data) 43 return -ENOMEM; 44 45 spi_message_init(); 46 47 command = spi_data; 48 command[0] = cmd; 49 if (count == 1) { 50 /* ad7879_spi_{read,write} gave us buf on stack */ 51 command[1] = *tx_buf; 52 tx_buf = [1]; 53 _rx_buf = rx_buf; 54 rx_buf = [2]; 55 } 56 57 ++xfers; 58 xfers[0].tx_buf = command; 59 xfers[0].len = 2; 60 spi_message_add_tail([0], ); 61 ++xfers; 62 63 for (idx = 0; idx < count; ++idx) { 64 if (rx_buf) 65 xfers[idx].rx_buf = _buf[idx]; 66 if (tx_buf) 67 xfers[idx].tx_buf = _buf[idx]; 68 xfers[idx].len = 2; 69 spi_message_add_tail([idx], ); 70 } 71 72 ret = spi_sync(spi, ); 73 74 if (count == 1) 75 _rx_buf[0] = command[2]; 76 77 kfree(spi_data); 78 79 return ret; 80 } 81 82 static int ad7879_spi_multi_read(struct device *dev, 83 u8 first_reg, u8 count, u16 *buf) 84 { 85 struct spi_device *spi = to_spi_device(dev); 86 87 return ad7879_spi_xfer(spi, AD7879_READCMD(first_reg), count, NULL, buf); 88 } 89 90 static int ad7879_spi_read(struct device *dev, u8 reg) 91 { 92 struct spi_device *spi = to_spi_device(dev); 93 u16 ret, dummy; 94 95 return