From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933813AbcBCHsd (ORCPT ); Wed, 3 Feb 2016 02:48:33 -0500 Received: from mail-by2on0082.outbound.protection.outlook.com ([207.46.100.82]:51200 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933379AbcBCHs1 (ORCPT ); Wed, 3 Feb 2016 02:48:27 -0500 Authentication-Results: spf=pass (sender IP is 137.71.25.55) smtp.mailfrom=analog.com; arm.com; dkim=none (message not signed) header.d=none;arm.com; dmarc=bestguesspass action=none header.from=analog.com; Reply-To: Subject: Re: [PATCH v3 3/3] input: touchscreen: ad7879: add device tree support References: <1454455218-13004-1-git-send-email-stefan@agner.ch> <1454455218-13004-3-git-send-email-stefan@agner.ch> To: Stefan Agner , , CC: , , , , , , , , From: Michael Hennerich Organization: Analog Devices Inc. Message-ID: <56B1AF22.9070404@analog.com> Date: Wed, 3 Feb 2016 08:41:22 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <1454455218-13004-3-git-send-email-stefan@agner.ch> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BN1BFFO11FD046;1:zbcpCiwvztN1n078F4AC/GbSHl7XHc5NO178Pa34flsrUUmaTHGtqt7sBeVc9Tr9JnsjOPdsZ7fXU97hvtYhXmoyBrwb8IzrJqLLFeJ0xivG+g8A4NMm//wxJ/KzPwYmMLUlJnkuAgxgbOq2TqG+TN8xPKOQR+syMWF62/Sak7dpXpB0kawTwdqswc0E89jvMaqiZxLD83b4zcnpB5PBtvx7V5V9KCMeje8IRW83V/wLNyP1EhxMEq/OiwfeLkqXhfUfJTvK1WbpqykP7g9G+6H4yzLDfD4nZYjvzlkiQ+GZSYsyu9eBUTVUUNp/HMYg+eNHcLwlAwjmVxQkfvBlwGlNJKBTMkn6gQkiuTdul1lLhhK5Veb3NFPdxIrt5k+rFUNN1afSPfoHtQqM62Pryr1i7Afu2b1rDFnNLfFuZxVmywCYGB7ksyab2K4yEAWJplbOj7I7vFogEnMfR/70/QL0hF4ifGOpEk9PxnvRa2j6+vkOzik6A3VOzcl2R3ZD X-Forefront-Antispam-Report: CIP:137.71.25.55;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(438002)(3190300001)(377454003)(199003)(189002)(479174004)(24454002)(2906002)(4326007)(80316001)(19580395003)(189998001)(230700001)(83506001)(19580405001)(586003)(86362001)(106466001)(3450700001)(54356999)(50466002)(76176999)(36756003)(53806999)(43066003)(50986999)(1220700001)(47776003)(23746002)(65806001)(4001350100001)(6806005)(5001970100001)(2950100001)(5001770100001)(5008740100001)(1096002)(33656002)(77096005)(65816999)(11100500001)(87266999)(65956001)(87936001);DIR:OUT;SFP:1101;SCL:1;SRVR:BY1PR0301MB0839;H:nwd2mta1.analog.com;FPR:;SPF:Pass;MLV:sfv;A:1;MX:1;LANG:en; X-MS-Office365-Filtering-Correlation-Id: 6959e5b6-82b2-4443-6fdd-08d32c6e6549 X-Microsoft-Exchange-Diagnostics: 1;BY1PR0301MB0839;2:bivonwMMzEtzyVxdIAYW5E68y7gwQPjCN+i/BK/oWCXbPCUlHY12UQ/Qrq/e1PP6Hiq5TBS4hSAi3l0x7w+zb94BpLATPNXMQuXTFFFe54WTkEMY02Geyfje8OrMWwP6CXGpmwcvo6LWWRpU45EUqL92jY//FJ4elGXG9vHC0O5IF69pw+d6el5eSToAjZFR;3:MfdNSwqhQb6RSd+90xmkhKbz5GViSCw5JK0mPiD0M+tU9NXi4shEIRq3dVuv1mniwDrCquV993oVbjbQlYRE1P1zHzkDjT12p9RSR/AgKmbBaGNRe1P9c7ZhrcOws8LBRAbeNBSWZHeDlBDUUgpvXHZ4fSDA9ZxxtZvcwuzFj2SoUnWf+9WRMQ7rbYZxrLlhcbsvb3XXapdhYbA33imrRuFh/rL3Lg38ZIRNNHK8eZ0nsFCPp+r9irfwdOB6OJkkqtUwN9W1WPRSYyf4MTnNjQ==;25:x8L/bh6LB2PeDwLVpYDuvzFNgKy7T9Isu1c9O7BssDLFSBF+fxSg+rbo4TeYKzid1g5Ii5xrFpz/SpaxVe7Y+BW+gjEYhS9EfxGESPs4nwfjpEX/heCNh4HZ05kMHe19rWVMKFh9oJay8Vy1oxGRaTFp3rOicNsx975BOhtgSgo2KC2i5k9+ROGKz6JZf+TffSxQuNUP873V/W8uPi/u/GpyKUW9wgf2rbfc07nHKrWDUuxkwIPVxlzwPoAcqQow X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(8251501002);SRVR:BY1PR0301MB0839; X-Microsoft-Exchange-Diagnostics: 1;BY1PR0301MB0839;20:V1THSx+hL8BcIwHBl28iX+ssdLcGQvw43RBlMNNiayfAip4iW/gG9Zbls862Alu43fGN6niz1/N1b5q22GMMT41sbKgEzj9xjcwo5ZpEstS5M8t63uMQrQn16j6cSi1uF/wpWyT3WdNUSAH6FZbI3rBq2hZYwt6tj6LBaTbUK55+F1OVOmB1FNuN5LZoI7ud6riIEbbReKL5JuAnj7lOUt+eiWE7l4C8Cuvht3UgFERECQhLek/CA2nNQJGrSXreVb7u5k25epfapGh90T0nEdC3/D685ykpl5QHpFoQVM2rY75fShvMLH9O+W4IRdAAlRAi/RxW1tB35p0VgCVv9dvC3M5VdoJBsEQ9F/ykhLeOk3+ZfHyeTNs86B1LWvLLwnigt+Eb+jTgOgQn6c3ugdNqm9VT1IU28t7AylaG1qKzYjdJl7brMDKGmAERe2KLVsmAuDQiXH4UJ1cVufY7yoSDZoeekoOVU7YtNDbE5KLe6mkEfHBSna9X15+GO9ZC X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(232431446821674); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(13023025)(13015025)(13024025)(8121501046)(5005006)(13017025)(13018025)(3002001)(10201501046);SRVR:BY1PR0301MB0839;BCL:0;PCL:0;RULEID:;SRVR:BY1PR0301MB0839; X-Microsoft-Exchange-Diagnostics: 1;BY1PR0301MB0839;4:LYBLcNpp99K/LjeO6pW//RgfmtdnI5QXf+NpJ535kAci2iquRmR9nk/q5x1rZZu7rSFqLZz+/uDnviSUN5jQMDnI4u7OBd838tTPZWu9zr3gccifHltbchB1vyHS0CUa/kYaMvIIxDybfwtxcdPCL4RjdQoTNjwquftGUHa4+O3JeNGnGs4UlZX8TqIokt/nprp2ILdQQ5gVnz04Qo7ngNgMqi4qt0SSXDhAE7oshFRr3yOTSD7nTmhJK/BI8JgqNR1qlpEqsXgEtFobGpd6ghMMqs6h2kimoqT77rRGXzzUBhXJy2l2e1Vy84cT+f5UkN4Uq+m8XdJ1ozV50rPiy296c81nUxQKh7i97xjRBQp37if39VvHFH4B7FT5dIx9TXerA9LNwFx0kg/+L5k26dA8f1XySpTcltJ0Ed4VTRrJYzFcvpa7az0oXrNkS7OoMRsRCmquYYJlNEzgh4ukVZ2Arv6BnuTNrxNwDihH/kRl9Xd7blxYTK/98j4XN2Zx X-Forefront-PRVS: 08417837C5 X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;BY1PR0301MB0839;23:hORrnINh4iyp4GrsVsYuqblPXz28TLYpRoR?= =?Windows-1252?Q?SfgzG6ODNwobsXm84BR05Gj8G2t2NqbBb9P/dCZForRhoqXhiou/Xbrj?= =?Windows-1252?Q?mx2CxkgTv4KONYVPBdIddsYEbXOQY73autKEFvV+nLKzP7mAmGNHRfOE?= =?Windows-1252?Q?LUKZ7EDU9diRFo8qy/3n/wBrO5miYk6yamT4tFIQtwMP4O/pd+G6zdg/?= =?Windows-1252?Q?Btcn401eDf9stdTTnYIjYVA+SWmH/NXXFKgGY3C6KEM/iM1gjpWt1TgP?= =?Windows-1252?Q?j0Ge/WnejJu5hgAQeyZny6WbHS7IiNI0W1NKBOjKIz9P3DJHVbtbuOQI?= =?Windows-1252?Q?FHNX4M5hNmGI73rfhrw8uCRwB/K0vrGz6thOsLw4VQr18D2BIwBL+qHe?= =?Windows-1252?Q?vyqCEE3ctDpmeVh2I8PodjxYVj6ptGzkYToH9tyxgpm6Y1noDMj2/Fts?= =?Windows-1252?Q?H+VSXO06V1RAa9jeR8yXrVLpjlHc6Zm1BZ36ri567RJS6hLa0OvR6TUg?= =?Windows-1252?Q?k2ltGELMxyk+SatfXwR/TOerEXCbp01w2VL2ZTM2NRG9d3FG/1EbZEqU?= =?Windows-1252?Q?nPKQzG/7KOgFVbW+Jmal/GeNHzToxDzQ5kU5YuB2D6jhfyk8LnszHsS1?= =?Windows-1252?Q?N0nlHj6AeT0tcOYD3K+jwrwGji8p4ZONjJskwAyYZfJyKpzUbA9xYQun?= =?Windows-1252?Q?Cqk7Ei+MGnr0RGrybQhAdXUN8/onuS4LVhCQImU38P+uBGx57S6MPjDv?= =?Windows-1252?Q?PZH6qVjw+nic7CtPavl2qFKv7IXWLUnBxsDHURB4O4AWwaSNa9bcKAM/?= =?Windows-1252?Q?CZAR/iSHM37GpO/jjEtPbGYxB1GqJOeDYEct4UsHirN0ldhY1WHdKNhj?= =?Windows-1252?Q?yrkOaz+6Pu+2rGIHCyHCrlMIbiE05MCmbgIfpxwznHYPRNw7Mh2310qo?= =?Windows-1252?Q?hGZ+3UsA1s7rPRiYhylWnhWTXlJm02d1LHZ2MCVynVxFAgn7d2QMvYKN?= =?Windows-1252?Q?Nn9fP3u4V9Ef5AoQDST/RrHQK2eRQT9tOc9h1E6tZ6cLt4hLAHUsubaR?= =?Windows-1252?Q?4Ba7Iie/5Vqa0Cim+AvDmigoEs7yOWQpkhRqYxWMXPvlpMIVA1clYM+5?= =?Windows-1252?Q?zlM5UnwsKHF2W60fRShC+20ckpNP0O+jc93uZp7SG/MGO9buizmo+iKH?= =?Windows-1252?Q?PyVQPnIaaAJnncC97bH8w4jGRqlQb+ASqt4MFuPQUxY19GhJT5VTOrBU?= =?Windows-1252?Q?PrnuR136sI0QdS623TCinfp8xNT0EqxUrnKVbUWJdVxpsSmOVZRtDDje?= =?Windows-1252?Q?4cSk0?= X-Microsoft-Exchange-Diagnostics: 1;BY1PR0301MB0839;5:wrJO5q4wFknKWFa+RRLl9Qa60O1mrBIJp3wEShNZjyRAEFa7U8KwBB7CgbQ9LEak3EZ8/+kkIJd3xIIqNKXPU/mE4ABz0NxjhLW03LCQD+4bAWEtgQaQ1nH6UCCa65rWTm2L2A6flNDXhaE62g5rRA==;24:OttnpO5qai9ZkeTvQlOgw5yszmNInOwmr7MVqE7nCLjgbmlFp+o7cfMQer/KHQ7SjZforBIbzFmfKSSAyjSAeap17u9ZXwosKIZIO6O+GnQ= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: analog.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Feb 2016 07:48:24.5148 (UTC) X-MS-Exchange-CrossTenant-Id: eaa689b4-8f87-40e0-9c6f-7228de4d754a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=eaa689b4-8f87-40e0-9c6f-7228de4d754a;Ip=[137.71.25.55];Helo=[nwd2mta1.analog.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR0301MB0839 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 02/03/2016 12:20 AM, Stefan Agner wrote: > Add device tree support for the I2C and SPI variant of AD7879(-1). > This allows to specify the touchscreen controller as a I2C client > node or SPI slave device. Most of the options available in platform > data are also available as device tree properties, the only exception > being GPIO capabilities, which can not be activated through device > tree currently. > > Acked-by: Rob Herring > Signed-off-by: Stefan Agner Acked-by: Michael Hennerich > --- > Changes since v2: > - do not free driver data and irq on remove (since we are using devm now) > Changes since v1: > - Move device tree parsing to main driver file ad7879.c > - Use common touchscreen_parse_properties for common properties > - Use device_property_* API > - Use struct ad7879 directly to store parsed values > - Support SPI variant through device tree too (untested) > - Add vendor prefix to vendor specific dt properties > > .../bindings/input/touchscreen/ad7879.txt | 53 ++++++++ > drivers/input/touchscreen/ad7879-i2c.c | 10 ++ > drivers/input/touchscreen/ad7879-spi.c | 10 ++ > drivers/input/touchscreen/ad7879.c | 145 +++++++++++++-------- > 4 files changed, 161 insertions(+), 57 deletions(-) > create mode 100644 Documentation/devicetree/bindings/input/touchscreen/ad7879.txt > > diff --git a/Documentation/devicetree/bindings/input/touchscreen/ad7879.txt b/Documentation/devicetree/bindings/input/touchscreen/ad7879.txt > new file mode 100644 > index 0000000..e3f22d2 > --- /dev/null > +++ b/Documentation/devicetree/bindings/input/touchscreen/ad7879.txt > @@ -0,0 +1,53 @@ > +* Analog Devices AD7879(-1)/AD7889(-1) touchscreen interface (SPI/I2C) > + > +Required properties: > +- compatible : for SPI slave, use "adi,ad7879" > + for I2C slave, use "adi,ad7879-1" > +- reg : SPI chipselect/I2C slave address > + See spi-bus.txt for more SPI slave properties > +- interrupt-parent : the phandle for the interrupt controller > +- interrupts : touch controller interrupt > +- touchscreen-max-pressure : maximum reported pressure > +- adi,resistance-plate-x : total resistance of X-plate (for pressure > + calculation) > +Optional properties: > +- touchscreen-swapped-x-y : X and Y axis are swapped (boolean) > +- adi,first-conversion-delay : 0-12: In 128us steps (starting with 128us) > + 13 : 2.560ms > + 14 : 3.584ms > + 15 : 4.096ms > + This property has to be a '/bits/ 8' value > +- adi,acquisition-time : 0: 2us > + 1: 4us > + 2: 8us > + 3: 16us > + This property has to be a '/bits/ 8' value > +- adi,median-filter-size : 0: disabled > + 1: 4 measurements > + 2: 8 measurements > + 3: 16 measurements > + This property has to be a '/bits/ 8' value > +- adi,averaging : 0: 2 middle values (1 if median disabled) > + 1: 4 middle values > + 2: 8 middle values > + 3: 16 values > + This property has to be a '/bits/ 8' value > +- adi,conversion-interval: : 0 : convert one time only > + 1-255: 515us + val * 35us (up to 9.440ms) > + This property has to be a '/bits/ 8' value > + > +Example: > + > + ad7879@2c { > + compatible = "adi,ad7879-1"; > + reg = <0x2c>; > + interrupt-parent = <&gpio1>; > + interrupts = <13 IRQ_TYPE_EDGE_FALLING>; > + touchscreen-max-pressure = <4096>; > + adi,resistance-plate-x = <120>; > + adi,first-conversion-delay = /bits/ 8 <3>; > + adi,acquisition-time = /bits/ 8 <1>; > + adi,median-filter-size = /bits/ 8 <2>; > + adi,averaging = /bits/ 8 <1>; > + adi,conversion-interval = /bits/ 8 <255>; > + }; > diff --git a/drivers/input/touchscreen/ad7879-i2c.c b/drivers/input/touchscreen/ad7879-i2c.c > index d66962c..58f72e0 100644 > --- a/drivers/input/touchscreen/ad7879-i2c.c > +++ b/drivers/input/touchscreen/ad7879-i2c.c > @@ -10,6 +10,7 @@ > #include > #include > #include > +#include > #include > > #include "ad7879.h" > @@ -91,10 +92,19 @@ static const struct i2c_device_id ad7879_id[] = { > }; > MODULE_DEVICE_TABLE(i2c, ad7879_id); > > +#ifdef CONFIG_OF > +static const struct of_device_id ad7879_i2c_dt_ids[] = { > + { .compatible = "adi,ad7879-1", }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, ad7879_i2c_dt_ids); > +#endif > + > static struct i2c_driver ad7879_i2c_driver = { > .driver = { > .name = "ad7879", > .pm = &ad7879_pm_ops, > + .of_match_table = of_match_ptr(ad7879_i2c_dt_ids), > }, > .probe = ad7879_i2c_probe, > .remove = ad7879_i2c_remove, > diff --git a/drivers/input/touchscreen/ad7879-spi.c b/drivers/input/touchscreen/ad7879-spi.c > index 48033c2..d42b6b9 100644 > --- a/drivers/input/touchscreen/ad7879-spi.c > +++ b/drivers/input/touchscreen/ad7879-spi.c > @@ -10,6 +10,7 @@ > #include > #include > #include > +#include > > #include "ad7879.h" > > @@ -146,10 +147,19 @@ static int ad7879_spi_remove(struct spi_device *spi) > return 0; > } > > +#ifdef CONFIG_OF > +static const struct of_device_id ad7879_spi_dt_ids[] = { > + { .compatible = "adi,ad7879", }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, ad7879_spi_dt_ids); > +#endif > + > static struct spi_driver ad7879_spi_driver = { > .driver = { > .name = "ad7879", > .pm = &ad7879_pm_ops, > + .of_match_table = of_match_ptr(ad7879_spi_dt_ids), > }, > .probe = ad7879_spi_probe, > .remove = ad7879_spi_remove, > diff --git a/drivers/input/touchscreen/ad7879.c b/drivers/input/touchscreen/ad7879.c > index abd0220..093cb04 100644 > --- a/drivers/input/touchscreen/ad7879.c > +++ b/drivers/input/touchscreen/ad7879.c > @@ -31,6 +31,7 @@ > #include > #include > > +#include > #include > #include > #include "ad7879.h" > @@ -126,7 +127,6 @@ struct ad7879 { > u8 pen_down_acc_interval; > u8 median; > u16 x_plate_ohms; > - u16 pressure_max; > u16 cmd_crtl1; > u16 cmd_crtl2; > u16 cmd_crtl3; > @@ -186,7 +186,7 @@ static int ad7879_report(struct ad7879 *ts) > * Sample found inconsistent, pressure is beyond > * the maximum. Don't report it to user space. > */ > - if (Rt > ts->pressure_max) > + if (Rt > input_abs_get_max(input_dev, ABS_PRESSURE)) > return -EINVAL; > > /* > @@ -469,7 +469,7 @@ static void ad7879_gpio_remove(struct ad7879 *ts) > { > const struct ad7879_platform_data *pdata = dev_get_platdata(ts->dev); > > - if (pdata->gpio_export) > + if (pdata && pdata->gpio_export) > gpiochip_remove(&ts->gc); > > } > @@ -485,6 +485,29 @@ static inline void ad7879_gpio_remove(struct ad7879 *ts) > } > #endif > > +static int ad7879_parse_dt(struct device *dev, struct ad7879 *ts) > +{ > + int err; > + u32 tmp; > + > + err = device_property_read_u32(dev, "adi,resistance-plate-x", &tmp); > + if (err) { > + dev_err(dev, "failed to get resistance-plate-x property\n"); > + return err; > + } > + ts->x_plate_ohms = (u16)tmp; > + > + device_property_read_u8(dev, "adi,first-conversion-delay", &ts->first_conversion_delay); > + device_property_read_u8(dev, "adi,acquisition-time", &ts->acquisition_time); > + device_property_read_u8(dev, "adi,median-filter-size", &ts->median); > + device_property_read_u8(dev, "adi,averaging", &ts->averaging); > + device_property_read_u8(dev, "adi,conversion-interval", &ts->pen_down_acc_interval); > + > + ts->swap_xy = device_property_read_bool(dev, "touchscreen-swapped-x-y"); > + > + return 0; > +} > + > struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq, > const struct ad7879_bus_ops *bops) > { > @@ -495,22 +518,37 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq, > u16 revid; > > if (!irq) { > - dev_err(dev, "no IRQ?\n"); > - err = -EINVAL; > - goto err_out; > + dev_err(dev, "No IRQ specified\n"); > + return ERR_PTR(-EINVAL); > } > > - if (!pdata) { > - dev_err(dev, "no platform data?\n"); > - err = -EINVAL; > - goto err_out; > + ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL); > + if (!ts) > + return ERR_PTR(-ENOMEM); > + > + if (pdata) { > + /* Platform data use swapped axis (backward compatibility) */ > + ts->swap_xy = !pdata->swap_xy; > + > + ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; > + > + ts->first_conversion_delay = pdata->first_conversion_delay; > + ts->acquisition_time = pdata->acquisition_time; > + ts->averaging = pdata->averaging; > + ts->pen_down_acc_interval = pdata->pen_down_acc_interval; > + ts->median = pdata->median; > + > + } else if (dev->of_node) { > + ad7879_parse_dt(dev, ts); > + } else { > + dev_err(dev, "No platform data\n"); > + return ERR_PTR(-EINVAL); > } > > - ts = kzalloc(sizeof(*ts), GFP_KERNEL); > - input_dev = input_allocate_device(); > - if (!ts || !input_dev) { > - err = -ENOMEM; > - goto err_free_mem; > + input_dev = devm_input_allocate_device(dev); > + if (!input_dev) { > + dev_err(dev, "Failed to allocate input device\n"); > + return ERR_PTR(-ENOMEM); > } > > ts->bops = bops; > @@ -518,20 +556,7 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq, > ts->input = input_dev; > ts->irq = irq; > > - /* Use swapped axis by default (backward compatibility) */ > - ts->swap_xy = !pdata->swap_xy; > - > setup_timer(&ts->timer, ad7879_timer, (unsigned long) ts); > - > - ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; > - ts->pressure_max = pdata->pressure_max ? : ~0; > - > - ts->first_conversion_delay = pdata->first_conversion_delay; > - ts->acquisition_time = pdata->acquisition_time; > - ts->averaging = pdata->averaging; > - ts->pen_down_acc_interval = pdata->pen_down_acc_interval; > - ts->median = pdata->median; > - > snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(dev)); > > input_dev->name = "AD7879 Touchscreen"; > @@ -552,21 +577,33 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq, > __set_bit(EV_KEY, input_dev->evbit); > __set_bit(BTN_TOUCH, input_dev->keybit); > > - input_set_abs_params(input_dev, ABS_X, > - pdata->x_min ? : 0, > - pdata->x_max ? : MAX_12BIT, > - 0, 0); > - input_set_abs_params(input_dev, ABS_Y, > - pdata->y_min ? : 0, > - pdata->y_max ? : MAX_12BIT, > - 0, 0); > - input_set_abs_params(input_dev, ABS_PRESSURE, > - pdata->pressure_min, pdata->pressure_max, 0, 0); > + if (pdata) { > + input_set_abs_params(input_dev, ABS_X, > + pdata->x_min ? : 0, > + pdata->x_max ? : MAX_12BIT, > + 0, 0); > + input_set_abs_params(input_dev, ABS_Y, > + pdata->y_min ? : 0, > + pdata->y_max ? : MAX_12BIT, > + 0, 0); > + input_set_abs_params(input_dev, ABS_PRESSURE, > + pdata->pressure_min, > + pdata->pressure_max ? : ~0, > + 0, 0); > + } else { > + input_set_abs_params(input_dev, ABS_X, 0, MAX_12BIT, 0, 0); > + input_set_abs_params(input_dev, ABS_Y, 0, MAX_12BIT, 0, 0); > + touchscreen_parse_properties(input_dev, false); > + if (!input_abs_get_max(input_dev, ABS_PRESSURE)) { > + dev_err(dev, "Touchscreen pressure is not specified\n"); > + return ERR_PTR(-EINVAL); > + } > + } > > err = ad7879_write(ts, AD7879_REG_CTRL2, AD7879_RESET); > if (err < 0) { > dev_err(dev, "Failed to write %s\n", input_dev->name); > - goto err_free_mem; > + return ERR_PTR(err); > } > > revid = ad7879_read(ts, AD7879_REG_REVID); > @@ -575,8 +612,7 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq, > if (input_dev->id.product != devid) { > dev_err(dev, "Failed to probe %s (%x vs %x)\n", > input_dev->name, devid, revid); > - err = -ENODEV; > - goto err_free_mem; > + return ERR_PTR(-ENODEV); > } > > ts->cmd_crtl3 = AD7879_YPLUS_BIT | > @@ -596,23 +632,25 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq, > AD7879_ACQ(ts->acquisition_time) | > AD7879_TMR(ts->pen_down_acc_interval); > > - err = request_threaded_irq(ts->irq, NULL, ad7879_irq, > - IRQF_TRIGGER_FALLING | IRQF_ONESHOT, > - dev_name(dev), ts); > + err = devm_request_threaded_irq(dev, ts->irq, NULL, ad7879_irq, > + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, > + dev_name(dev), ts); > if (err) { > - dev_err(dev, "irq %d busy?\n", ts->irq); > - goto err_free_mem; > + dev_err(dev, "Failed to request IRQ: %d\n", err); > + return ERR_PTR(err); > } > > __ad7879_disable(ts); > > err = sysfs_create_group(&dev->kobj, &ad7879_attr_group); > if (err) > - goto err_free_irq; > + goto err_out; > > - err = ad7879_gpio_add(ts, pdata); > - if (err) > - goto err_remove_attr; > + if (pdata) { > + err = ad7879_gpio_add(ts, pdata); > + if (err) > + goto err_remove_attr; > + } > > err = input_register_device(input_dev); > if (err) > @@ -624,11 +662,6 @@ err_remove_gpio: > ad7879_gpio_remove(ts); > err_remove_attr: > sysfs_remove_group(&dev->kobj, &ad7879_attr_group); > -err_free_irq: > - free_irq(ts->irq, ts); > -err_free_mem: > - input_free_device(input_dev); > - kfree(ts); > err_out: > return ERR_PTR(err); > } > @@ -638,9 +671,7 @@ void ad7879_remove(struct ad7879 *ts) > { > ad7879_gpio_remove(ts); > sysfs_remove_group(&ts->dev->kobj, &ad7879_attr_group); > - free_irq(ts->irq, ts); > input_unregister_device(ts->input); > - kfree(ts); > } > EXPORT_SYMBOL(ad7879_remove); > > -- Greetings, Michael -- Analog Devices GmbH Wilhelm-Wagenfeld-Str. 6 80807 Muenchen Sitz der Gesellschaft: Muenchen; Registergericht: Muenchen HRB 40368; Geschaeftsfuehrer:Dr.Carsten Suckrow, Thomas Wessel, William A. Martin, Margaret Seif