Message ID | 1453777477-29706-3-git-send-email-stefan@agner.ch (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
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(&spi->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(&spi->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 <linux/input.h> /* BUS_SPI */ 10 #include <linux/pm.h> 11 #include <linux/spi/spi.h> 12 #include <linux/module.h> 13 > 14 #include "ad7879.h" 15 16 #define AD7879_DEVID 0x7A /* AD7879/AD7889 */ 17 18 #define MAX_SPI_FREQ_HZ 5000000 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(&msg); 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 = &command[1]; 53 _rx_buf = rx_buf; 54 rx_buf = &command[2]; 55 } 56 57 ++xfers; 58 xfers[0].tx_buf = command; 59 xfers[0].len = 2; 60 spi_message_add_tail(&xfers[0], &msg); 61 ++xfers; 62 63 for (idx = 0; idx < count; ++idx) { 64 if (rx_buf) 65 xfers[idx].rx_buf = &rx_buf[idx]; 66 if (tx_buf) 67 xfers[idx].tx_buf = &tx_buf[idx]; 68 xfers[idx].len = 2; 69 spi_message_add_tail(&xfers[idx], &msg); 70 } 71 72 ret = spi_sync(spi, &msg); 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 ad7879_spi_xfer(spi, AD7879_READCMD(reg), 1, &dummy, &ret) ? : ret; 96 } 97 98 static int ad7879_spi_write(struct device *dev, u8 reg, u16 val) 99 { 100 struct spi_device *spi = to_spi_device(dev); 101 u16 dummy; 102 103 return ad7879_spi_xfer(spi, AD7879_WRITECMD(reg), 1, &val, &dummy); 104 } 105 106 static const struct ad7879_bus_ops ad7879_spi_bus_ops = { 107 .bustype = BUS_SPI, 108 .read = ad7879_spi_read, 109 .multi_read = ad7879_spi_multi_read, 110 .write = ad7879_spi_write, 111 }; 112 113 static int ad7879_spi_probe(struct spi_device *spi) 114 { 115 struct ad7879 *ts; 116 int err; 117 118 /* don't exceed max specified SPI CLK frequency */ 119 if (spi->max_speed_hz > MAX_SPI_FREQ_HZ) { 120 dev_err(&spi->dev, "SPI CLK %d Hz?\n", spi->max_speed_hz); 121 return -EINVAL; 122 } 123 124 spi->bits_per_word = 16; 125 err = spi_setup(spi); 126 if (err) { 127 dev_dbg(&spi->dev, "spi master doesn't support 16 bits/word\n"); 128 return err; 129 } 130 > 131 ts = ad7879_probe(&spi->dev, AD7879_DEVID, spi->irq, pdata, 132 dev_get_platdata(&spi->dev), &ad7879_spi_bus_ops); 133 if (IS_ERR(ts)) 134 return PTR_ERR(ts); --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
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 <linux/input.h> /* BUS_I2C */ 10 #include <linux/i2c.h> > 11 #include <linux/module.h> 12 #include <linux/types.h> 13 #include <linux/pm.h> 14 #include <linux/input/ad7879.h> 15 16 #include "ad7879.h" 17 18 #define AD7879_DEVID 0x79 /* 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", &tmp); 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", &tmp); 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", &pdata->first_conversion_delay); 88 of_property_read_u8(np, "acquisition-time", &pdata->acquisition_time); 89 of_property_read_u8(np, "median-filter-size", &pdata->median); 90 of_property_read_u8(np, "averaging", &pdata->averaging); 91 of_property_read_u8(np, "conversion-interval", &pdata->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 const struct i2c_device_id *id) 100 { 101 struct ad7879_platform_data *pdata; 102 struct ad7879 *ts; 103 104 if (!i2c_check_functionality(client->adapter, 105 I2C_FUNC_SMBUS_WORD_DATA)) { 106 dev_err(&client->dev, "SMBUS Word Data not Supported\n"); 107 return -EIO; 108 } 109 110 pdata = dev_get_platdata(&client->dev); 111 112 if (!pdata && IS_ENABLED(CONFIG_OF)) 113 pdata = ad7879_parse_dt(&client->dev); 114 115 if (IS_ERR_OR_NULL(pdata)) { 116 dev_err(&client->dev, "Need platform data\n"); 117 return PTR_ERR(pdata); 118 } 119 120 ts = ad7879_probe(&client->dev, AD7879_DEVID, client->irq, pdata, 121 &ad7879_i2c_bus_ops); 122 if (IS_ERR(ts)) 123 return PTR_ERR(ts); 124 125 i2c_set_clientdata(client, ts); 126 127 return 0; 128 } 129 130 static int ad7879_i2c_remove(struct i2c_client *client) 131 { 132 struct ad7879 *ts = i2c_get_clientdata(client); 133 134 ad7879_remove(ts); 135 136 return 0; 137 } 138 139 static const struct i2c_device_id ad7879_id[] = { 140 { "ad7879", 0 }, 141 { "ad7889", 0 }, 142 { } 143 }; 144 MODULE_DEVICE_TABLE(i2c, ad7879_id); 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
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 <stefan@agner.ch> 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 0000000..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 = <&gpio1>; > + 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 <linux/module.h> > #include <linux/types.h> > #include <linux/pm.h> > +#include <linux/input/ad7879.h> > > #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", &tmp); > + 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", &tmp); > + 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", &pdata->first_conversion_delay); > + of_property_read_u8(np, "acquisition-time", &pdata->acquisition_time); > + of_property_read_u8(np, "median-filter-size", &pdata->median); > + of_property_read_u8(np, "averaging", &pdata->averaging); > + of_property_read_u8(np, "conversion-interval", &pdata->pen_down_acc_interval); > + > + pdata->swap_xy = of_property_read_bool(np, "touchscreen-swapped-x-y"); > + > + return pdata; > +} > + > static int ad7879_i2c_probe(struct i2c_client *client, > const struct i2c_device_id *id) > { > + struct ad7879_platform_data *pdata; > struct ad7879 *ts; > > if (!i2c_check_functionality(client->adapter, > @@ -65,7 +107,17 @@ static int ad7879_i2c_probe(struct i2c_client *client, > return -EIO; > } > > - ts = ad7879_probe(&client->dev, AD7879_DEVID, client->irq, > + pdata = dev_get_platdata(&client->dev); > + > + if (!pdata && IS_ENABLED(CONFIG_OF)) > + pdata = ad7879_parse_dt(&client->dev); > + > + if (IS_ERR_OR_NULL(pdata)) { > + dev_err(&client->dev, "Need platform data\n"); > + return PTR_ERR(pdata); > + } > + > + ts = ad7879_probe(&client->dev, AD7879_DEVID, client->irq, pdata, > &ad7879_i2c_bus_ops); > if (IS_ERR(ts)) > return PTR_ERR(ts); > @@ -91,10 +143,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_dt_ids[] = { > + { .compatible = "adi,ad7879-1", }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids); > +#endif > + > static struct i2c_driver ad7879_i2c_driver = { > .driver = { > .name = "ad7879", > .pm = &ad7879_pm_ops, > + .of_match_table = of_match_ptr(ad7879_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..8ebe604 100644 > --- a/drivers/input/touchscreen/ad7879-spi.c > +++ b/drivers/input/touchscreen/ad7879-spi.c > @@ -128,7 +128,8 @@ static int ad7879_spi_probe(struct spi_device *spi) > return err; > } > > - ts = ad7879_probe(&spi->dev, AD7879_DEVID, spi->irq, &ad7879_spi_bus_ops); > + ts = ad7879_probe(&spi->dev, AD7879_DEVID, spi->irq, pdata, > + dev_get_platdata(&spi->dev), &ad7879_spi_bus_ops); > if (IS_ERR(ts)) > return PTR_ERR(ts); > > diff --git a/drivers/input/touchscreen/ad7879.c b/drivers/input/touchscreen/ad7879.c > index e290e7b..e763c77 100644 > --- a/drivers/input/touchscreen/ad7879.c > +++ b/drivers/input/touchscreen/ad7879.c > @@ -486,9 +486,9 @@ static inline void ad7879_gpio_remove(struct ad7879 *ts) > #endif > > struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq, > + struct ad7879_platform_data *pdata, > const struct ad7879_bus_ops *bops) > { > - struct ad7879_platform_data *pdata = dev_get_platdata(dev); > struct ad7879 *ts; > struct input_dev *input_dev; > int err; > diff --git a/drivers/input/touchscreen/ad7879.h b/drivers/input/touchscreen/ad7879.h > index 6fd13c4..fa363a0 100644 > --- a/drivers/input/touchscreen/ad7879.h > +++ b/drivers/input/touchscreen/ad7879.h > @@ -24,6 +24,7 @@ struct ad7879_bus_ops { > extern const struct dev_pm_ops ad7879_pm_ops; > > struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned irq, > + struct ad7879_platform_data *pdata, > const struct ad7879_bus_ops *bops); > void ad7879_remove(struct ad7879 *); > >
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 <stefan@agner.ch> > > > 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 0000000..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 = <&gpio1>; >> + 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 <linux/module.h> >> #include <linux/types.h> >> #include <linux/pm.h> >> +#include <linux/input/ad7879.h> >> >> #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", &tmp); >> + 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", &tmp); >> + 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", &pdata->first_conversion_delay); >> + of_property_read_u8(np, "acquisition-time", &pdata->acquisition_time); >> + of_property_read_u8(np, "median-filter-size", &pdata->median); >> + of_property_read_u8(np, "averaging", &pdata->averaging); >> + of_property_read_u8(np, "conversion-interval", &pdata->pen_down_acc_interval); >> + >> + pdata->swap_xy = of_property_read_bool(np, "touchscreen-swapped-x-y"); >> + >> + return pdata; >> +} >> + >> static int ad7879_i2c_probe(struct i2c_client *client, >> const struct i2c_device_id *id) >> { >> + struct ad7879_platform_data *pdata; >> struct ad7879 *ts; >> >> if (!i2c_check_functionality(client->adapter, >> @@ -65,7 +107,17 @@ static int ad7879_i2c_probe(struct i2c_client *client, >> return -EIO; >> } >> >> - ts = ad7879_probe(&client->dev, AD7879_DEVID, client->irq, >> + pdata = dev_get_platdata(&client->dev); >> + >> + if (!pdata && IS_ENABLED(CONFIG_OF)) >> + pdata = ad7879_parse_dt(&client->dev); >> + >> + if (IS_ERR_OR_NULL(pdata)) { >> + dev_err(&client->dev, "Need platform data\n"); >> + return PTR_ERR(pdata); >> + } >> + >> + ts = ad7879_probe(&client->dev, AD7879_DEVID, client->irq, pdata, >> &ad7879_i2c_bus_ops); >> if (IS_ERR(ts)) >> return PTR_ERR(ts); >> @@ -91,10 +143,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_dt_ids[] = { >> + { .compatible = "adi,ad7879-1", }, >> + { } >> +}; >> +MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids); >> +#endif >> + >> static struct i2c_driver ad7879_i2c_driver = { >> .driver = { >> .name = "ad7879", >> .pm = &ad7879_pm_ops, >> + .of_match_table = of_match_ptr(ad7879_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..8ebe604 100644 >> --- a/drivers/input/touchscreen/ad7879-spi.c >> +++ b/drivers/input/touchscreen/ad7879-spi.c >> @@ -128,7 +128,8 @@ static int ad7879_spi_probe(struct spi_device *spi) >> return err; >> } >> >> - ts = ad7879_probe(&spi->dev, AD7879_DEVID, spi->irq, &ad7879_spi_bus_ops); >> + ts = ad7879_probe(&spi->dev, AD7879_DEVID, spi->irq, pdata, >> + dev_get_platdata(&spi->dev), &ad7879_spi_bus_ops); >> if (IS_ERR(ts)) >> return PTR_ERR(ts); >> >> diff --git a/drivers/input/touchscreen/ad7879.c b/drivers/input/touchscreen/ad7879.c >> index e290e7b..e763c77 100644 >> --- a/drivers/input/touchscreen/ad7879.c >> +++ b/drivers/input/touchscreen/ad7879.c >> @@ -486,9 +486,9 @@ static inline void ad7879_gpio_remove(struct ad7879 *ts) >> #endif >> >> struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq, >> + struct ad7879_platform_data *pdata, >> const struct ad7879_bus_ops *bops) >> { >> - struct ad7879_platform_data *pdata = dev_get_platdata(dev); >> struct ad7879 *ts; >> struct input_dev *input_dev; >> int err; >> diff --git a/drivers/input/touchscreen/ad7879.h b/drivers/input/touchscreen/ad7879.h >> index 6fd13c4..fa363a0 100644 >> --- a/drivers/input/touchscreen/ad7879.h >> +++ b/drivers/input/touchscreen/ad7879.h >> @@ -24,6 +24,7 @@ struct ad7879_bus_ops { >> extern const struct dev_pm_ops ad7879_pm_ops; >> >> struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned irq, >> + struct ad7879_platform_data *pdata, >> const struct ad7879_bus_ops *bops); >> void ad7879_remove(struct ad7879 *); >> >> -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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 <stefan@agner.ch> > --- > .../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 0000000..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 = <&gpio1>; > + 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 <linux/module.h> > #include <linux/types.h> > #include <linux/pm.h> > +#include <linux/input/ad7879.h> > > #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", &tmp); > + 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", &tmp); > + 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", &pdata->first_conversion_delay); > + of_property_read_u8(np, "acquisition-time", &pdata->acquisition_time); > + of_property_read_u8(np, "median-filter-size", &pdata->median); > + of_property_read_u8(np, "averaging", &pdata->averaging); > + of_property_read_u8(np, "conversion-interval", &pdata->pen_down_acc_interval); > + > + pdata->swap_xy = of_property_read_bool(np, "touchscreen-swapped-x-y"); I'd prefer if we used device_property_* API instead of of_property_*, so that properties would work not only on OF, but also on other platforms and even legacy boards could potentially be converted to properties. Thanks.
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 <stefan@agner.ch> > --- > .../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 0000000..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 = <&gpio1>; > + 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>; > + }; -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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 0000000..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 = <&gpio1>; + 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 <linux/module.h> #include <linux/types.h> #include <linux/pm.h> +#include <linux/input/ad7879.h> #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", &tmp); + 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", &tmp); + 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", &pdata->first_conversion_delay); + of_property_read_u8(np, "acquisition-time", &pdata->acquisition_time); + of_property_read_u8(np, "median-filter-size", &pdata->median); + of_property_read_u8(np, "averaging", &pdata->averaging); + of_property_read_u8(np, "conversion-interval", &pdata->pen_down_acc_interval); + + pdata->swap_xy = of_property_read_bool(np, "touchscreen-swapped-x-y"); + + return pdata; +} + static int ad7879_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { + struct ad7879_platform_data *pdata; struct ad7879 *ts; if (!i2c_check_functionality(client->adapter, @@ -65,7 +107,17 @@ static int ad7879_i2c_probe(struct i2c_client *client, return -EIO; } - ts = ad7879_probe(&client->dev, AD7879_DEVID, client->irq, + pdata = dev_get_platdata(&client->dev); + + if (!pdata && IS_ENABLED(CONFIG_OF)) + pdata = ad7879_parse_dt(&client->dev); + + if (IS_ERR_OR_NULL(pdata)) { + dev_err(&client->dev, "Need platform data\n"); + return PTR_ERR(pdata); + } + + ts = ad7879_probe(&client->dev, AD7879_DEVID, client->irq, pdata, &ad7879_i2c_bus_ops); if (IS_ERR(ts)) return PTR_ERR(ts); @@ -91,10 +143,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_dt_ids[] = { + { .compatible = "adi,ad7879-1", }, + { } +}; +MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids); +#endif + static struct i2c_driver ad7879_i2c_driver = { .driver = { .name = "ad7879", .pm = &ad7879_pm_ops, + .of_match_table = of_match_ptr(ad7879_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..8ebe604 100644 --- a/drivers/input/touchscreen/ad7879-spi.c +++ b/drivers/input/touchscreen/ad7879-spi.c @@ -128,7 +128,8 @@ static int ad7879_spi_probe(struct spi_device *spi) return err; } - ts = ad7879_probe(&spi->dev, AD7879_DEVID, spi->irq, &ad7879_spi_bus_ops); + ts = ad7879_probe(&spi->dev, AD7879_DEVID, spi->irq, pdata, + dev_get_platdata(&spi->dev), &ad7879_spi_bus_ops); if (IS_ERR(ts)) return PTR_ERR(ts); diff --git a/drivers/input/touchscreen/ad7879.c b/drivers/input/touchscreen/ad7879.c index e290e7b..e763c77 100644 --- a/drivers/input/touchscreen/ad7879.c +++ b/drivers/input/touchscreen/ad7879.c @@ -486,9 +486,9 @@ static inline void ad7879_gpio_remove(struct ad7879 *ts) #endif struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq, + struct ad7879_platform_data *pdata, const struct ad7879_bus_ops *bops) { - struct ad7879_platform_data *pdata = dev_get_platdata(dev); struct ad7879 *ts; struct input_dev *input_dev; int err; diff --git a/drivers/input/touchscreen/ad7879.h b/drivers/input/touchscreen/ad7879.h index 6fd13c4..fa363a0 100644 --- a/drivers/input/touchscreen/ad7879.h +++ b/drivers/input/touchscreen/ad7879.h @@ -24,6 +24,7 @@ struct ad7879_bus_ops { extern const struct dev_pm_ops ad7879_pm_ops; struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned irq, + struct ad7879_platform_data *pdata, const struct ad7879_bus_ops *bops); void ad7879_remove(struct ad7879 *);
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 <stefan@agner.ch> --- .../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