* [PATCH 1/5] input: misc: AD714x: The interrupt status registers should be read in row. @ 2011-05-10 11:35 michael.hennerich 2011-05-10 11:35 ` [PATCH 2/5] input: misc: AD714x: Fix up input configuration michael.hennerich ` (4 more replies) 0 siblings, 5 replies; 10+ messages in thread From: michael.hennerich @ 2011-05-10 11:35 UTC (permalink / raw) To: dmitry.torokhov Cc: linux-input, jeff.dagenais, drivers, device-drivers-devel, Michael Hennerich From: Michael Hennerich <michael.hennerich@analog.com> The interrupt status registers should be read in row to avoid invalid data. Implement read sequence function for both bus options. Always use it for reading the interrupt status registers. Read sequence saves 50% of bus transactions compared to single register reads. So use it also for the result registers, which are also located in row. Update copyright notice. Signed-off-by: Michael Hennerich <michael.hennerich@analog.com> --- drivers/input/misc/ad714x-i2c.c | 30 ++++++++++++++++++++++++++++-- drivers/input/misc/ad714x-spi.c | 14 ++++++++++++-- drivers/input/misc/ad714x.c | 35 +++++++++++++++++------------------ drivers/input/misc/ad714x.h | 7 +++++-- 4 files changed, 62 insertions(+), 24 deletions(-) diff --git a/drivers/input/misc/ad714x-i2c.c b/drivers/input/misc/ad714x-i2c.c index e21deb1..fb6564e 100644 --- a/drivers/input/misc/ad714x-i2c.c +++ b/drivers/input/misc/ad714x-i2c.c @@ -1,7 +1,7 @@ /* * AD714X CapTouch Programmable Controller driver (I2C bus) * - * Copyright 2009 Analog Devices Inc. + * Copyright 2009-2011 Analog Devices Inc. * * Licensed under the GPL-2 or later. */ @@ -77,13 +77,39 @@ static int ad714x_i2c_read(struct device *dev, unsigned short reg, return ret; } +static int ad714x_i2c_read_seq(struct device *dev, unsigned short reg, + unsigned short *data, unsigned len) +{ + struct i2c_client *client = to_i2c_client(dev); + int ret = 0, i; + u8 *_reg = (u8 *)® + + u8 tx[2] = { + _reg[1], + _reg[0] + }; + + ret = i2c_master_send(client, tx, 2); + if (ret >= 0) + ret = i2c_master_recv(client, (u8 *)data, len * 2); + + if (unlikely(ret < 0)) + dev_err(&client->dev, "I2C read error\n"); + else + for (i = 0; i < len; i++) + data[i] = be16_to_cpu(data[i]); + + return ret; +} + static int __devinit ad714x_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ad714x_chip *chip; chip = ad714x_probe(&client->dev, BUS_I2C, client->irq, - ad714x_i2c_read, ad714x_i2c_write); + ad714x_i2c_read, ad714x_i2c_read_seq, + ad714x_i2c_write); if (IS_ERR(chip)) return PTR_ERR(chip); diff --git a/drivers/input/misc/ad714x-spi.c b/drivers/input/misc/ad714x-spi.c index 4120dd5..a0cb115 100644 --- a/drivers/input/misc/ad714x-spi.c +++ b/drivers/input/misc/ad714x-spi.c @@ -1,7 +1,7 @@ /* * AD714X CapTouch Programmable Controller driver (SPI bus) * - * Copyright 2009 Analog Devices Inc. + * Copyright 2009-2011 Analog Devices Inc. * * Licensed under the GPL-2 or later. */ @@ -39,6 +39,15 @@ static int ad714x_spi_read(struct device *dev, unsigned short reg, return spi_write_then_read(spi, (u8 *)&tx, 2, (u8 *)data, 2); } +static int ad714x_spi_read_seq(struct device *dev, unsigned short reg, + unsigned short *data, unsigned len) +{ + struct spi_device *spi = to_spi_device(dev); + unsigned short tx = AD714x_SPI_CMD_PREFIX | AD714x_SPI_READ | reg; + + return spi_write_then_read(spi, (u8 *)&tx, 2, (u8 *)data, len * 2); +} + static int ad714x_spi_write(struct device *dev, unsigned short reg, unsigned short data) { @@ -56,7 +65,8 @@ static int __devinit ad714x_spi_probe(struct spi_device *spi) struct ad714x_chip *chip; chip = ad714x_probe(&spi->dev, BUS_SPI, spi->irq, - ad714x_spi_read, ad714x_spi_write); + ad714x_spi_read, ad714x_spi_read_seq, + ad714x_spi_write); if (IS_ERR(chip)) return PTR_ERR(chip); diff --git a/drivers/input/misc/ad714x.c b/drivers/input/misc/ad714x.c index c431d09..eb352fb 100644 --- a/drivers/input/misc/ad714x.c +++ b/drivers/input/misc/ad714x.c @@ -1,7 +1,7 @@ /* * AD714X CapTouch Programmable Controller driver supporting AD7142/3/7/8/7A * - * Copyright 2009 Analog Devices Inc. + * Copyright 2009-2011 Analog Devices Inc. * * Licensed under the GPL-2 or later. */ @@ -131,8 +131,8 @@ struct ad714x_driver_data { * of spi/i2c device */ struct ad714x_chip { - unsigned short h_state; unsigned short l_state; + unsigned short h_state; unsigned short c_state; unsigned short adc_reg[STAGE_NUM]; unsigned short amb_reg[STAGE_NUM]; @@ -144,6 +144,7 @@ struct ad714x_chip { int irq; struct device *dev; ad714x_read_t read; + ad714x_read_seq_t read_seq; ad714x_write_t write; struct mutex mutex; @@ -279,9 +280,11 @@ static void ad714x_slider_cal_sensor_val(struct ad714x_chip *ad714x, int idx) struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx]; int i; + ad714x->read_seq(ad714x->dev, CDC_RESULT_S0 + hw->start_stage, + &ad714x->adc_reg[hw->start_stage], + hw->end_stage - hw->start_stage + 1); + for (i = hw->start_stage; i <= hw->end_stage; i++) { - ad714x->read(ad714x->dev, CDC_RESULT_S0 + i, - &ad714x->adc_reg[i]); ad714x->read(ad714x->dev, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM, &ad714x->amb_reg[i]); @@ -451,9 +454,11 @@ static void ad714x_wheel_cal_sensor_val(struct ad714x_chip *ad714x, int idx) struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx]; int i; + ad714x->read_seq(ad714x->dev, CDC_RESULT_S0 + hw->start_stage, + &ad714x->adc_reg[hw->start_stage], + hw->end_stage - hw->start_stage + 1); + for (i = hw->start_stage; i <= hw->end_stage; i++) { - ad714x->read(ad714x->dev, CDC_RESULT_S0 + i, - &ad714x->adc_reg[i]); ad714x->read(ad714x->dev, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM, &ad714x->amb_reg[i]); @@ -1025,9 +1030,7 @@ static void ad714x_hw_init(struct ad714x_chip *ad714x) ad714x->write(ad714x->dev, AD714X_STG_CAL_EN_REG, 0xFFF); /* clear all interrupts */ - ad714x->read(ad714x->dev, STG_LOW_INT_STA_REG, &data); - ad714x->read(ad714x->dev, STG_HIGH_INT_STA_REG, &data); - ad714x->read(ad714x->dev, STG_COM_INT_STA_REG, &data); + ad714x->read_seq(ad714x->dev, STG_LOW_INT_STA_REG, &ad714x->l_state, 3); } static irqreturn_t ad714x_interrupt_thread(int irq, void *data) @@ -1037,9 +1040,7 @@ static irqreturn_t ad714x_interrupt_thread(int irq, void *data) mutex_lock(&ad714x->mutex); - ad714x->read(ad714x->dev, STG_LOW_INT_STA_REG, &ad714x->l_state); - ad714x->read(ad714x->dev, STG_HIGH_INT_STA_REG, &ad714x->h_state); - ad714x->read(ad714x->dev, STG_COM_INT_STA_REG, &ad714x->c_state); + ad714x->read_seq(ad714x->dev, STG_LOW_INT_STA_REG, &ad714x->l_state, 3); for (i = 0; i < ad714x->hw->button_num; i++) ad714x_button_state_machine(ad714x, i); @@ -1057,7 +1058,8 @@ static irqreturn_t ad714x_interrupt_thread(int irq, void *data) #define MAX_DEVICE_NUM 8 struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, - ad714x_read_t read, ad714x_write_t write) + ad714x_read_t read, ad714x_read_seq_t read_seq, + ad714x_write_t write) { int i, alloc_idx; int error; @@ -1110,6 +1112,7 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, drv_mem += sizeof(*bt_drv) * ad714x->hw->button_num; ad714x->read = read; + ad714x->read_seq = read_seq; ad714x->write = write; ad714x->irq = irq; ad714x->dev = dev; @@ -1316,8 +1319,6 @@ EXPORT_SYMBOL(ad714x_disable); int ad714x_enable(struct ad714x_chip *ad714x) { - unsigned short data; - dev_dbg(ad714x->dev, "%s enter\n", __func__); mutex_lock(&ad714x->mutex); @@ -1331,9 +1332,7 @@ int ad714x_enable(struct ad714x_chip *ad714x) * otherwise we will get no chance to enter falling-edge irq again */ - ad714x->read(ad714x->dev, STG_LOW_INT_STA_REG, &data); - ad714x->read(ad714x->dev, STG_HIGH_INT_STA_REG, &data); - ad714x->read(ad714x->dev, STG_COM_INT_STA_REG, &data); + ad714x->read_seq(ad714x->dev, STG_LOW_INT_STA_REG, &ad714x->l_state, 3); mutex_unlock(&ad714x->mutex); diff --git a/drivers/input/misc/ad714x.h b/drivers/input/misc/ad714x.h index 45c54fb..58d5e4e 100644 --- a/drivers/input/misc/ad714x.h +++ b/drivers/input/misc/ad714x.h @@ -1,7 +1,7 @@ /* * AD714X CapTouch Programmable Controller driver (bus interfaces) * - * Copyright 2009 Analog Devices Inc. + * Copyright 2009-2011 Analog Devices Inc. * * Licensed under the GPL-2 or later. */ @@ -15,12 +15,15 @@ struct device; struct ad714x_chip; typedef int (*ad714x_read_t)(struct device *, unsigned short, unsigned short *); +typedef int (*ad714x_read_seq_t)(struct device *, unsigned short, + unsigned short *, unsigned len); typedef int (*ad714x_write_t)(struct device *, unsigned short, unsigned short); int ad714x_disable(struct ad714x_chip *ad714x); int ad714x_enable(struct ad714x_chip *ad714x); struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, - ad714x_read_t read, ad714x_write_t write); + ad714x_read_t read, ad714x_read_seq_t read_seq, + ad714x_write_t write); void ad714x_remove(struct ad714x_chip *ad714x); #endif -- 1.6.0.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/5] input: misc: AD714x: Fix up input configuration. 2011-05-10 11:35 [PATCH 1/5] input: misc: AD714x: The interrupt status registers should be read in row michael.hennerich @ 2011-05-10 11:35 ` michael.hennerich 2011-05-11 21:19 ` Dmitry Torokhov 2011-05-10 11:35 ` [PATCH 3/5] input: misc: AD714x: Fix thresh and completion interrupt mask and unmask functions michael.hennerich ` (3 subsequent siblings) 4 siblings, 1 reply; 10+ messages in thread From: michael.hennerich @ 2011-05-10 11:35 UTC (permalink / raw) To: dmitry.torokhov Cc: linux-input, jeff.dagenais, drivers, device-drivers-devel, Michael Hennerich From: Michael Hennerich <michael.hennerich@analog.com> Add missing input name, phys and parent dev. Signed-off-by: Michael Hennerich <michael.hennerich@analog.com> --- drivers/input/misc/ad714x.c | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-) diff --git a/drivers/input/misc/ad714x.c b/drivers/input/misc/ad714x.c index eb352fb..9d95397 100644 --- a/drivers/input/misc/ad714x.c +++ b/drivers/input/misc/ad714x.c @@ -151,6 +151,7 @@ struct ad714x_chip { unsigned product; unsigned version; + char phys[32]; }; static void ad714x_use_com_int(struct ad714x_chip *ad714x, @@ -1130,6 +1131,8 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, * Allocate and register AD714X input device */ alloc_idx = 0; + snprintf(ad714x->phys, sizeof(ad714x->phys), "%s/input0", + dev_name(dev)); /* a slider uses one input_dev instance */ if (ad714x->hw->slider_num > 0) { @@ -1152,6 +1155,10 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, input[alloc_idx]->id.bustype = bus_type; input[alloc_idx]->id.product = ad714x->product; input[alloc_idx]->id.version = ad714x->version; + input[alloc_idx]->name = "ad714x_captouch_slider"; + input[alloc_idx]->phys = ad714x->phys; + input[alloc_idx]->dev.parent = dev; + error = input_register_device(input[alloc_idx]); if (error) @@ -1182,6 +1189,9 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, input[alloc_idx]->id.bustype = bus_type; input[alloc_idx]->id.product = ad714x->product; input[alloc_idx]->id.version = ad714x->version; + input[alloc_idx]->name = "ad714x_captouch_wheel"; + input[alloc_idx]->phys = ad714x->phys; + input[alloc_idx]->dev.parent = dev; error = input_register_device(input[alloc_idx]); if (error) @@ -1215,6 +1225,9 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, input[alloc_idx]->id.bustype = bus_type; input[alloc_idx]->id.product = ad714x->product; input[alloc_idx]->id.version = ad714x->version; + input[alloc_idx]->name = "ad714x_captouch_pad"; + input[alloc_idx]->phys = ad714x->phys; + input[alloc_idx]->dev.parent = dev; error = input_register_device(input[alloc_idx]); if (error) @@ -1243,6 +1256,9 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, input[alloc_idx]->id.bustype = bus_type; input[alloc_idx]->id.product = ad714x->product; input[alloc_idx]->id.version = ad714x->version; + input[alloc_idx]->name = "ad714x_captouch_button"; + input[alloc_idx]->phys = ad714x->phys; + input[alloc_idx]->dev.parent = dev; error = input_register_device(input[alloc_idx]); if (error) -- 1.6.0.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 2/5] input: misc: AD714x: Fix up input configuration. 2011-05-10 11:35 ` [PATCH 2/5] input: misc: AD714x: Fix up input configuration michael.hennerich @ 2011-05-11 21:19 ` Dmitry Torokhov 0 siblings, 0 replies; 10+ messages in thread From: Dmitry Torokhov @ 2011-05-11 21:19 UTC (permalink / raw) To: michael.hennerich Cc: linux-input, jeff.dagenais, drivers, device-drivers-devel On Tue, May 10, 2011 at 01:35:06PM +0200, michael.hennerich@analog.com wrote: > From: Michael Hennerich <michael.hennerich@analog.com> > > Add missing input name, phys and parent dev. > > Signed-off-by: Michael Hennerich <michael.hennerich@analog.com> > --- > drivers/input/misc/ad714x.c | 16 ++++++++++++++++ > 1 files changed, 16 insertions(+), 0 deletions(-) > > diff --git a/drivers/input/misc/ad714x.c b/drivers/input/misc/ad714x.c > index eb352fb..9d95397 100644 > --- a/drivers/input/misc/ad714x.c > +++ b/drivers/input/misc/ad714x.c > @@ -151,6 +151,7 @@ struct ad714x_chip { > > unsigned product; > unsigned version; > + char phys[32]; > }; > > static void ad714x_use_com_int(struct ad714x_chip *ad714x, > @@ -1130,6 +1131,8 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, > * Allocate and register AD714X input device > */ > alloc_idx = 0; > + snprintf(ad714x->phys, sizeof(ad714x->phys), "%s/input0", > + dev_name(dev)); > > /* a slider uses one input_dev instance */ > if (ad714x->hw->slider_num > 0) { > @@ -1152,6 +1155,10 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, > input[alloc_idx]->id.bustype = bus_type; > input[alloc_idx]->id.product = ad714x->product; > input[alloc_idx]->id.version = ad714x->version; > + input[alloc_idx]->name = "ad714x_captouch_slider"; > + input[alloc_idx]->phys = ad714x->phys; > + input[alloc_idx]->dev.parent = dev; > + > > error = input_register_device(input[alloc_idx]); > if (error) > @@ -1182,6 +1189,9 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, > input[alloc_idx]->id.bustype = bus_type; > input[alloc_idx]->id.product = ad714x->product; > input[alloc_idx]->id.version = ad714x->version; > + input[alloc_idx]->name = "ad714x_captouch_wheel"; > + input[alloc_idx]->phys = ad714x->phys; > + input[alloc_idx]->dev.parent = dev; > > error = input_register_device(input[alloc_idx]); > if (error) > @@ -1215,6 +1225,9 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, > input[alloc_idx]->id.bustype = bus_type; > input[alloc_idx]->id.product = ad714x->product; > input[alloc_idx]->id.version = ad714x->version; > + input[alloc_idx]->name = "ad714x_captouch_pad"; > + input[alloc_idx]->phys = ad714x->phys; > + input[alloc_idx]->dev.parent = dev; > > error = input_register_device(input[alloc_idx]); > if (error) > @@ -1243,6 +1256,9 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, > input[alloc_idx]->id.bustype = bus_type; > input[alloc_idx]->id.product = ad714x->product; > input[alloc_idx]->id.version = ad714x->version; > + input[alloc_idx]->name = "ad714x_captouch_button"; > + input[alloc_idx]->phys = ad714x->phys; Now you have 3 devices with the same 'phys' and 'phys' is supposed to be unique. You could change the code so phys would end with input0, input1 and input2 respectively, but I'd just left phys as NULL though. Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/5] input: misc: AD714x: Fix thresh and completion interrupt mask and unmask functions 2011-05-10 11:35 [PATCH 1/5] input: misc: AD714x: The interrupt status registers should be read in row michael.hennerich 2011-05-10 11:35 ` [PATCH 2/5] input: misc: AD714x: Fix up input configuration michael.hennerich @ 2011-05-10 11:35 ` michael.hennerich 2011-05-10 11:35 ` [PATCH 4/5] input: misc: AD714x: Add option to specify irqflags michael.hennerich ` (2 subsequent siblings) 4 siblings, 0 replies; 10+ messages in thread From: michael.hennerich @ 2011-05-10 11:35 UTC (permalink / raw) To: dmitry.torokhov Cc: linux-input, jeff.dagenais, drivers, device-drivers-devel, Michael Hennerich From: Michael Hennerich <michael.hennerich@analog.com> Fix two issues in the thresh and completion interrupt mask and unmask functions. According to the AD714x datasheets the highest stage completion interrupt should be enabled. Fix mask computation. Signed-off-by: Michael Hennerich <michael.hennerich@analog.com> --- drivers/input/misc/ad714x.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/input/misc/ad714x.c b/drivers/input/misc/ad714x.c index 9d95397..89554eb 100644 --- a/drivers/input/misc/ad714x.c +++ b/drivers/input/misc/ad714x.c @@ -160,10 +160,10 @@ static void ad714x_use_com_int(struct ad714x_chip *ad714x, unsigned short data; unsigned short mask; - mask = ((1 << (end_stage + 1)) - 1) - (1 << start_stage); + mask = ((1 << (end_stage + 1)) - 1) - ((1 << start_stage) - 1); ad714x->read(ad714x->dev, STG_COM_INT_EN_REG, &data); - data |= 1 << start_stage; + data |= 1 << end_stage; ad714x->write(ad714x->dev, STG_COM_INT_EN_REG, data); ad714x->read(ad714x->dev, STG_HIGH_INT_EN_REG, &data); @@ -177,10 +177,10 @@ static void ad714x_use_thr_int(struct ad714x_chip *ad714x, unsigned short data; unsigned short mask; - mask = ((1 << (end_stage + 1)) - 1) - (1 << start_stage); + mask = ((1 << (end_stage + 1)) - 1) - ((1 << start_stage) - 1); ad714x->read(ad714x->dev, STG_COM_INT_EN_REG, &data); - data &= ~(1 << start_stage); + data &= ~(1 << end_stage); ad714x->write(ad714x->dev, STG_COM_INT_EN_REG, data); ad714x->read(ad714x->dev, STG_HIGH_INT_EN_REG, &data); -- 1.6.0.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 4/5] input: misc: AD714x: Add option to specify irqflags 2011-05-10 11:35 [PATCH 1/5] input: misc: AD714x: The interrupt status registers should be read in row michael.hennerich 2011-05-10 11:35 ` [PATCH 2/5] input: misc: AD714x: Fix up input configuration michael.hennerich 2011-05-10 11:35 ` [PATCH 3/5] input: misc: AD714x: Fix thresh and completion interrupt mask and unmask functions michael.hennerich @ 2011-05-10 11:35 ` michael.hennerich 2011-05-11 21:20 ` Dmitry Torokhov 2011-05-10 11:35 ` [PATCH 5/5] input: misc: AD714x: Fix captouch wheel option algorithm michael.hennerich 2011-05-11 21:15 ` [PATCH 1/5] input: misc: AD714x: The interrupt status registers should be read in row Dmitry Torokhov 4 siblings, 1 reply; 10+ messages in thread From: michael.hennerich @ 2011-05-10 11:35 UTC (permalink / raw) To: dmitry.torokhov Cc: linux-input, jeff.dagenais, drivers, device-drivers-devel, Michael Hennerich From: Michael Hennerich <michael.hennerich@analog.com> Add option to specify irqflags. Use IRQF_TRIGGER_LOW | IRQF_ONESHOT if not set otherwise. Update copyright notice. Signed-off-by: Michael Hennerich <michael.hennerich@analog.com> --- drivers/input/misc/ad714x.c | 4 +++- include/linux/input/ad714x.h | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/input/misc/ad714x.c b/drivers/input/misc/ad714x.c index 89554eb..3e97879 100644 --- a/drivers/input/misc/ad714x.c +++ b/drivers/input/misc/ad714x.c @@ -1268,7 +1268,9 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, } error = request_threaded_irq(ad714x->irq, NULL, ad714x_interrupt_thread, - IRQF_TRIGGER_FALLING, "ad714x_captouch", ad714x); + plat_data->irqflags ? plat_data->irqflags : + IRQF_TRIGGER_LOW | IRQF_ONESHOT, + "ad714x_captouch", ad714x); if (error) { dev_err(dev, "can't allocate irq %d\n", ad714x->irq); goto err_unreg_dev; diff --git a/include/linux/input/ad714x.h b/include/linux/input/ad714x.h index 0cbe5e8..d388d85 100644 --- a/include/linux/input/ad714x.h +++ b/include/linux/input/ad714x.h @@ -6,7 +6,7 @@ * The platform_data for the device's "struct device" holds this * information. * - * Copyright 2009 Analog Devices Inc. + * Copyright 2009-2011 Analog Devices Inc. * * Licensed under the GPL-2 or later. */ @@ -58,6 +58,7 @@ struct ad714x_platform_data { struct ad714x_button_plat *button; unsigned short stage_cfg_reg[STAGE_NUM][STAGE_CFGREG_NUM]; unsigned short sys_cfg_reg[SYS_CFGREG_NUM]; + unsigned long irqflags; }; #endif -- 1.6.0.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 4/5] input: misc: AD714x: Add option to specify irqflags 2011-05-10 11:35 ` [PATCH 4/5] input: misc: AD714x: Add option to specify irqflags michael.hennerich @ 2011-05-11 21:20 ` Dmitry Torokhov 0 siblings, 0 replies; 10+ messages in thread From: Dmitry Torokhov @ 2011-05-11 21:20 UTC (permalink / raw) To: michael.hennerich Cc: linux-input, jeff.dagenais, drivers, device-drivers-devel On Tue, May 10, 2011 at 01:35:08PM +0200, michael.hennerich@analog.com wrote: > From: Michael Hennerich <michael.hennerich@analog.com> > > Add option to specify irqflags. > Use IRQF_TRIGGER_LOW | IRQF_ONESHOT if not set otherwise. This would break existing users that expect IRQF_TRIGGER_FALLING. I'd leave the default flags as they were. Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 5/5] input: misc: AD714x: Fix captouch wheel option algorithm 2011-05-10 11:35 [PATCH 1/5] input: misc: AD714x: The interrupt status registers should be read in row michael.hennerich ` (2 preceding siblings ...) 2011-05-10 11:35 ` [PATCH 4/5] input: misc: AD714x: Add option to specify irqflags michael.hennerich @ 2011-05-10 11:35 ` michael.hennerich 2011-05-11 18:30 ` Jean-Francois Dagenais 2011-05-11 21:15 ` [PATCH 1/5] input: misc: AD714x: The interrupt status registers should be read in row Dmitry Torokhov 4 siblings, 1 reply; 10+ messages in thread From: michael.hennerich @ 2011-05-10 11:35 UTC (permalink / raw) To: dmitry.torokhov Cc: linux-input, jeff.dagenais, drivers, device-drivers-devel, Michael Hennerich From: Michael Hennerich <michael.hennerich@analog.com> As reported by Jean-Francois Dagenais, the wheel algorithm caused a divide by zero exception due to missing variable pre-initialization. In fact it turned out that the whole algorithm had several problems. It is therefore replaced with something that is known working. Signed-off-by: Michael Hennerich <michael.hennerich@analog.com> --- drivers/input/misc/ad714x.c | 109 ++++++++----------------------------------- 1 files changed, 19 insertions(+), 90 deletions(-) diff --git a/drivers/input/misc/ad714x.c b/drivers/input/misc/ad714x.c index 3e97879..bcc6c9b 100644 --- a/drivers/input/misc/ad714x.c +++ b/drivers/input/misc/ad714x.c @@ -79,13 +79,7 @@ struct ad714x_slider_drv { struct ad714x_wheel_drv { int abs_pos; int flt_pos; - int pre_mean_value; int pre_highest_stage; - int pre_mean_value_no_offset; - int mean_value; - int mean_value_no_offset; - int pos_offset; - int pos_ratio; int highest_stage; enum ad714x_device_state state; struct input_dev *input; @@ -408,7 +402,6 @@ static void ad714x_slider_state_machine(struct ad714x_chip *ad714x, int idx) ad714x_slider_cal_highest_stage(ad714x, idx); ad714x_slider_cal_abs_pos(ad714x, idx); ad714x_slider_cal_flt_pos(ad714x, idx); - input_report_abs(sw->input, ABS_X, sw->flt_pos); input_report_key(sw->input, BTN_TOUCH, 1); } else { @@ -474,104 +467,41 @@ static void ad714x_wheel_cal_sensor_val(struct ad714x_chip *ad714x, int idx) /* * When the scroll wheel is activated, we compute the absolute position based * on the sensor values. To calculate the position, we first determine the - * sensor that has the greatest response among the 8 sensors that constitutes - * the scrollwheel. Then we determined the 2 sensors on either sides of the + * sensor that has the greatest response among the sensors that constitutes + * the scrollwheel. Then we determined the sensors on either sides of the * sensor with the highest response and we apply weights to these sensors. The - * result of this computation gives us the mean value which defined by the - * following formula: - * For i= second_before_highest_stage to i= second_after_highest_stage - * v += Sensor response(i)*WEIGHT*(i+3) - * w += Sensor response(i) - * Mean_Value=v/w - * pos_on_scrollwheel = (Mean_Value - position_offset) / position_ratio + * result of this computation gives us the mean value. */ -#define WEIGHT_FACTOR 30 -/* This constant prevents the "PositionOffset" from reaching a big value */ -#define OFFSET_POSITION_CLAMP 120 static void ad714x_wheel_cal_abs_pos(struct ad714x_chip *ad714x, int idx) { struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx]; struct ad714x_wheel_drv *sw = &ad714x->sw->wheel[idx]; int stage_num = hw->end_stage - hw->start_stage + 1; - int second_before, first_before, highest, first_after, second_after; + int first_before, highest, first_after; int a_param, b_param; - /* Calculate Mean value */ - - second_before = (sw->highest_stage + stage_num - 2) % stage_num; first_before = (sw->highest_stage + stage_num - 1) % stage_num; highest = sw->highest_stage; first_after = (sw->highest_stage + stage_num + 1) % stage_num; - second_after = (sw->highest_stage + stage_num + 2) % stage_num; - - if (((sw->highest_stage - hw->start_stage) > 1) && - ((hw->end_stage - sw->highest_stage) > 1)) { - a_param = ad714x->sensor_val[second_before] * - (second_before - hw->start_stage + 3) + - ad714x->sensor_val[first_before] * - (second_before - hw->start_stage + 3) + - ad714x->sensor_val[highest] * - (second_before - hw->start_stage + 3) + - ad714x->sensor_val[first_after] * - (first_after - hw->start_stage + 3) + - ad714x->sensor_val[second_after] * - (second_after - hw->start_stage + 3); - } else { - a_param = ad714x->sensor_val[second_before] * - (second_before - hw->start_stage + 1) + - ad714x->sensor_val[first_before] * - (second_before - hw->start_stage + 2) + - ad714x->sensor_val[highest] * - (second_before - hw->start_stage + 3) + - ad714x->sensor_val[first_after] * - (first_after - hw->start_stage + 4) + - ad714x->sensor_val[second_after] * - (second_after - hw->start_stage + 5); - } - a_param *= WEIGHT_FACTOR; - b_param = ad714x->sensor_val[second_before] + + a_param = ad714x->sensor_val[highest] * + (highest - hw->start_stage) + + ad714x->sensor_val[first_before] * + (highest - hw->start_stage - 1) + + ad714x->sensor_val[first_after] * + (highest - hw->start_stage + 1); + b_param = ad714x->sensor_val[highest] + ad714x->sensor_val[first_before] + - ad714x->sensor_val[highest] + - ad714x->sensor_val[first_after] + - ad714x->sensor_val[second_after]; - - sw->pre_mean_value = sw->mean_value; - sw->mean_value = a_param / b_param; - - /* Calculate the offset */ - - if ((sw->pre_highest_stage == hw->end_stage) && - (sw->highest_stage == hw->start_stage)) - sw->pos_offset = sw->mean_value; - else if ((sw->pre_highest_stage == hw->start_stage) && - (sw->highest_stage == hw->end_stage)) - sw->pos_offset = sw->pre_mean_value; - - if (sw->pos_offset > OFFSET_POSITION_CLAMP) - sw->pos_offset = OFFSET_POSITION_CLAMP; - - /* Calculate the mean value without the offset */ - - sw->pre_mean_value_no_offset = sw->mean_value_no_offset; - sw->mean_value_no_offset = sw->mean_value - sw->pos_offset; - if (sw->mean_value_no_offset < 0) - sw->mean_value_no_offset = 0; - - /* Calculate ratio to scale down to NUMBER_OF_WANTED_POSITIONS */ - - if ((sw->pre_highest_stage == hw->end_stage) && - (sw->highest_stage == hw->start_stage)) - sw->pos_ratio = (sw->pre_mean_value_no_offset * 100) / - hw->max_coord; - else if ((sw->pre_highest_stage == hw->start_stage) && - (sw->highest_stage == hw->end_stage)) - sw->pos_ratio = (sw->mean_value_no_offset * 100) / - hw->max_coord; - sw->abs_pos = (sw->mean_value_no_offset * 100) / sw->pos_ratio; + ad714x->sensor_val[first_after]; + + sw->abs_pos = ((hw->max_coord / (hw->end_stage - hw->start_stage)) * + a_param) / b_param; + if (sw->abs_pos > hw->max_coord) sw->abs_pos = hw->max_coord; + else if (sw->abs_pos < 0) + sw->abs_pos = 0; } static void ad714x_wheel_cal_flt_pos(struct ad714x_chip *ad714x, int idx) @@ -645,9 +575,8 @@ static void ad714x_wheel_state_machine(struct ad714x_chip *ad714x, int idx) ad714x_wheel_cal_highest_stage(ad714x, idx); ad714x_wheel_cal_abs_pos(ad714x, idx); ad714x_wheel_cal_flt_pos(ad714x, idx); - input_report_abs(sw->input, ABS_WHEEL, - sw->abs_pos); + sw->flt_pos); input_report_key(sw->input, BTN_TOUCH, 1); } else { /* When the user lifts off the sensor, configure -- 1.6.0.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 5/5] input: misc: AD714x: Fix captouch wheel option algorithm 2011-05-10 11:35 ` [PATCH 5/5] input: misc: AD714x: Fix captouch wheel option algorithm michael.hennerich @ 2011-05-11 18:30 ` Jean-Francois Dagenais 0 siblings, 0 replies; 10+ messages in thread From: Jean-Francois Dagenais @ 2011-05-11 18:30 UTC (permalink / raw) To: Michael Hennerich Cc: dmitry.torokhov, linux-input, drivers, device-drivers-devel, Getz, Robin I confirm that this patchset works well with my setup. Good job! Nice touch for the irq flags, allows platform independence. My setup is as follows: Patched kernel 2.6.39-rc7 AD7147A connected using VGA port i2c bus and the INTA pin of a PCI card for the AD7147A INT line. I am using this single wheel config: static struct ad714x_wheel_plat wheel_platform_data = { .start_stage = 0, // int start_stage; .end_stage = 7, // int end_stage; .max_coord = 1024, // int max_coord; }; static struct ad714x_platform_data wheel_dev_platform_data = { .irqflags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT, .slider_num = 0, .wheel_num = 1, .touchpad_num = 0, .button_num = 0, .slider = 0, .wheel = &wheel_platform_data, // struct ad714x_wheel_plat *wheel; .touchpad = 0, // struct ad714x_touchpad_plat *touchpad; .button = 0, // struct ad714x_button_plat *button; .stage_cfg_reg = { /* unsigned short stage_cfg_reg[STAGE_NUM][STAGE_CFGREG_NUM] */ {0xfffe, 0x3fff, 0, 0x2626, 5664, 5664, 7080, 7080 }, {0xfffb, 0x3fff, 0, 0x2626, 5664, 5664, 7080, 7080 }, {0xffef, 0x3fff, 0, 0x2626, 5664, 5664, 7080, 7080 }, {0xffbf, 0x3fff, 0, 0x2626, 5664, 5664, 7080, 7080 }, {0xfeff, 0x3fff, 0, 0x2626, 5664, 5664, 7080, 7080 }, {0xfbff, 0x3fff, 0, 0x2626, 5664, 5664, 7080, 7080 }, {0xefff, 0x3fff, 0, 0x2626, 5664, 5664, 7080, 7080 }, {0xffff, 0x3ffe, 0, 0x2626, 5664, 5664, 7080, 7080 }, {0xffff, 0x3fff, 0, 0x0606, 0x01f4, 0x01f4, 0x0320, 0x0320}, {0xffff, 0x3fff, 0, 0x0606, 0x01f4, 0x01f4, 0x0320, 0x0320}, {0xffff, 0x3fff, 0, 0x0606, 0x01f4, 0x01f4, 0x0320, 0x0320}, {0xffff, 0x3fff, 0, 0x0606, 0x01f4, 0x01f4, 0x0320, 0x0320}, }, .sys_cfg_reg = {0x027e, 0x0000, 0x3233, 0x0819, 0x0832, 0x0000, 0x00ff, 0x0000}, /* unsigned short sys_cfg_reg[SYS_CFGREG_NUM] */ //.sys_cfg_reg = {0x2b2, 0xfff, 0x3233, 0x819, 0x832, 0xcff, 0xcff, 0x0}, /* unsigned short sys_cfg_reg[SYS_CFGREG_NUM] */ }; On May 10, 2011, at 7:35, <michael.hennerich@analog.com> <michael.hennerich@analog.com> wrote: > From: Michael Hennerich <michael.hennerich@analog.com> > > As reported by Jean-Francois Dagenais, the wheel algorithm caused a > divide by zero exception due to missing variable pre-initialization. > In fact it turned out that the whole algorithm had several problems. > It is therefore replaced with something that is known working. > > Signed-off-by: Michael Hennerich <michael.hennerich@analog.com> > --- > drivers/input/misc/ad714x.c | 109 ++++++++----------------------------------- > 1 files changed, 19 insertions(+), 90 deletions(-) > > diff --git a/drivers/input/misc/ad714x.c b/drivers/input/misc/ad714x.c > index 3e97879..bcc6c9b 100644 > --- a/drivers/input/misc/ad714x.c > +++ b/drivers/input/misc/ad714x.c > @@ -79,13 +79,7 @@ struct ad714x_slider_drv { > struct ad714x_wheel_drv { > int abs_pos; > int flt_pos; > - int pre_mean_value; > int pre_highest_stage; > - int pre_mean_value_no_offset; > - int mean_value; > - int mean_value_no_offset; > - int pos_offset; > - int pos_ratio; > int highest_stage; > enum ad714x_device_state state; > struct input_dev *input; > @@ -408,7 +402,6 @@ static void ad714x_slider_state_machine(struct ad714x_chip *ad714x, int idx) > ad714x_slider_cal_highest_stage(ad714x, idx); > ad714x_slider_cal_abs_pos(ad714x, idx); > ad714x_slider_cal_flt_pos(ad714x, idx); > - > input_report_abs(sw->input, ABS_X, sw->flt_pos); > input_report_key(sw->input, BTN_TOUCH, 1); > } else { > @@ -474,104 +467,41 @@ static void ad714x_wheel_cal_sensor_val(struct ad714x_chip *ad714x, int idx) > /* > * When the scroll wheel is activated, we compute the absolute position based > * on the sensor values. To calculate the position, we first determine the > - * sensor that has the greatest response among the 8 sensors that constitutes > - * the scrollwheel. Then we determined the 2 sensors on either sides of the > + * sensor that has the greatest response among the sensors that constitutes > + * the scrollwheel. Then we determined the sensors on either sides of the > * sensor with the highest response and we apply weights to these sensors. The > - * result of this computation gives us the mean value which defined by the > - * following formula: > - * For i= second_before_highest_stage to i= second_after_highest_stage > - * v += Sensor response(i)*WEIGHT*(i+3) > - * w += Sensor response(i) > - * Mean_Value=v/w > - * pos_on_scrollwheel = (Mean_Value - position_offset) / position_ratio > + * result of this computation gives us the mean value. > */ > > -#define WEIGHT_FACTOR 30 > -/* This constant prevents the "PositionOffset" from reaching a big value */ > -#define OFFSET_POSITION_CLAMP 120 > static void ad714x_wheel_cal_abs_pos(struct ad714x_chip *ad714x, int idx) > { > struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx]; > struct ad714x_wheel_drv *sw = &ad714x->sw->wheel[idx]; > int stage_num = hw->end_stage - hw->start_stage + 1; > - int second_before, first_before, highest, first_after, second_after; > + int first_before, highest, first_after; > int a_param, b_param; > > - /* Calculate Mean value */ > - > - second_before = (sw->highest_stage + stage_num - 2) % stage_num; > first_before = (sw->highest_stage + stage_num - 1) % stage_num; > highest = sw->highest_stage; > first_after = (sw->highest_stage + stage_num + 1) % stage_num; > - second_after = (sw->highest_stage + stage_num + 2) % stage_num; > - > - if (((sw->highest_stage - hw->start_stage) > 1) && > - ((hw->end_stage - sw->highest_stage) > 1)) { > - a_param = ad714x->sensor_val[second_before] * > - (second_before - hw->start_stage + 3) + > - ad714x->sensor_val[first_before] * > - (second_before - hw->start_stage + 3) + > - ad714x->sensor_val[highest] * > - (second_before - hw->start_stage + 3) + > - ad714x->sensor_val[first_after] * > - (first_after - hw->start_stage + 3) + > - ad714x->sensor_val[second_after] * > - (second_after - hw->start_stage + 3); > - } else { > - a_param = ad714x->sensor_val[second_before] * > - (second_before - hw->start_stage + 1) + > - ad714x->sensor_val[first_before] * > - (second_before - hw->start_stage + 2) + > - ad714x->sensor_val[highest] * > - (second_before - hw->start_stage + 3) + > - ad714x->sensor_val[first_after] * > - (first_after - hw->start_stage + 4) + > - ad714x->sensor_val[second_after] * > - (second_after - hw->start_stage + 5); > - } > - a_param *= WEIGHT_FACTOR; > > - b_param = ad714x->sensor_val[second_before] + > + a_param = ad714x->sensor_val[highest] * > + (highest - hw->start_stage) + > + ad714x->sensor_val[first_before] * > + (highest - hw->start_stage - 1) + > + ad714x->sensor_val[first_after] * > + (highest - hw->start_stage + 1); > + b_param = ad714x->sensor_val[highest] + > ad714x->sensor_val[first_before] + > - ad714x->sensor_val[highest] + > - ad714x->sensor_val[first_after] + > - ad714x->sensor_val[second_after]; > - > - sw->pre_mean_value = sw->mean_value; > - sw->mean_value = a_param / b_param; > - > - /* Calculate the offset */ > - > - if ((sw->pre_highest_stage == hw->end_stage) && > - (sw->highest_stage == hw->start_stage)) > - sw->pos_offset = sw->mean_value; > - else if ((sw->pre_highest_stage == hw->start_stage) && > - (sw->highest_stage == hw->end_stage)) > - sw->pos_offset = sw->pre_mean_value; > - > - if (sw->pos_offset > OFFSET_POSITION_CLAMP) > - sw->pos_offset = OFFSET_POSITION_CLAMP; > - > - /* Calculate the mean value without the offset */ > - > - sw->pre_mean_value_no_offset = sw->mean_value_no_offset; > - sw->mean_value_no_offset = sw->mean_value - sw->pos_offset; > - if (sw->mean_value_no_offset < 0) > - sw->mean_value_no_offset = 0; > - > - /* Calculate ratio to scale down to NUMBER_OF_WANTED_POSITIONS */ > - > - if ((sw->pre_highest_stage == hw->end_stage) && > - (sw->highest_stage == hw->start_stage)) > - sw->pos_ratio = (sw->pre_mean_value_no_offset * 100) / > - hw->max_coord; > - else if ((sw->pre_highest_stage == hw->start_stage) && > - (sw->highest_stage == hw->end_stage)) > - sw->pos_ratio = (sw->mean_value_no_offset * 100) / > - hw->max_coord; > - sw->abs_pos = (sw->mean_value_no_offset * 100) / sw->pos_ratio; > + ad714x->sensor_val[first_after]; > + > + sw->abs_pos = ((hw->max_coord / (hw->end_stage - hw->start_stage)) * > + a_param) / b_param; > + > if (sw->abs_pos > hw->max_coord) > sw->abs_pos = hw->max_coord; > + else if (sw->abs_pos < 0) > + sw->abs_pos = 0; > } > > static void ad714x_wheel_cal_flt_pos(struct ad714x_chip *ad714x, int idx) > @@ -645,9 +575,8 @@ static void ad714x_wheel_state_machine(struct ad714x_chip *ad714x, int idx) > ad714x_wheel_cal_highest_stage(ad714x, idx); > ad714x_wheel_cal_abs_pos(ad714x, idx); > ad714x_wheel_cal_flt_pos(ad714x, idx); > - > input_report_abs(sw->input, ABS_WHEEL, > - sw->abs_pos); > + sw->flt_pos); > input_report_key(sw->input, BTN_TOUCH, 1); > } else { > /* When the user lifts off the sensor, configure > -- > 1.6.0.2 > > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/5] input: misc: AD714x: The interrupt status registers should be read in row. 2011-05-10 11:35 [PATCH 1/5] input: misc: AD714x: The interrupt status registers should be read in row michael.hennerich ` (3 preceding siblings ...) 2011-05-10 11:35 ` [PATCH 5/5] input: misc: AD714x: Fix captouch wheel option algorithm michael.hennerich @ 2011-05-11 21:15 ` Dmitry Torokhov 2011-05-12 8:39 ` Hennerich, Michael 4 siblings, 1 reply; 10+ messages in thread From: Dmitry Torokhov @ 2011-05-11 21:15 UTC (permalink / raw) To: michael.hennerich Cc: linux-input, jeff.dagenais, drivers, device-drivers-devel Hi Michael, On Tue, May 10, 2011 at 01:35:05PM +0200, michael.hennerich@analog.com wrote: > > +static int ad714x_i2c_read_seq(struct device *dev, unsigned short reg, > + unsigned short *data, unsigned len) > +{ > + struct i2c_client *client = to_i2c_client(dev); > + int ret = 0, i; > + u8 *_reg = (u8 *)® > + > + u8 tx[2] = { > + _reg[1], > + _reg[0] > + }; Eww... I think this will also break on arches with different endianness. Can we pass the commands to be sent to the device as u8 array? -- Dmitry ^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: [PATCH 1/5] input: misc: AD714x: The interrupt status registers should be read in row. 2011-05-11 21:15 ` [PATCH 1/5] input: misc: AD714x: The interrupt status registers should be read in row Dmitry Torokhov @ 2011-05-12 8:39 ` Hennerich, Michael 0 siblings, 0 replies; 10+ messages in thread From: Hennerich, Michael @ 2011-05-12 8:39 UTC (permalink / raw) To: Dmitry Torokhov Cc: linux-input@vger.kernel.org, jeff.dagenais@gmail.com, Drivers, device-drivers-devel@blackfin.uclinux.org Dmitry Torokhov wrote on 2011-05-11: > Hi Michael, > > On Tue, May 10, 2011 at 01:35:05PM +0200, michael.hennerich@analog.com > wrote: >> >> +static int ad714x_i2c_read_seq(struct device *dev, unsigned short reg, >> + unsigned short *data, unsigned len) { + struct i2c_client *client >> = to_i2c_client(dev); + int ret = 0, i; + u8 *_reg = (u8 *)® + + u8 >> tx[2] = { + _reg[1], + _reg[0] + }; > > Eww... I think this will also break on arches with different endianness. > Can we pass the commands to be sent to the device as u8 array? > Hi Dmitry, Right - this is not endianness save, like the rest of the driver. I'll add a patch to the end of the sequence, which fixes both bus options. For SPI - also need to force the bus to spi->bits_per_word = 8 (which is the default), however some Blackfin boards set bits_per_word = 16, so we don't break them... 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 ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2011-05-12 8:39 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-05-10 11:35 [PATCH 1/5] input: misc: AD714x: The interrupt status registers should be read in row michael.hennerich 2011-05-10 11:35 ` [PATCH 2/5] input: misc: AD714x: Fix up input configuration michael.hennerich 2011-05-11 21:19 ` Dmitry Torokhov 2011-05-10 11:35 ` [PATCH 3/5] input: misc: AD714x: Fix thresh and completion interrupt mask and unmask functions michael.hennerich 2011-05-10 11:35 ` [PATCH 4/5] input: misc: AD714x: Add option to specify irqflags michael.hennerich 2011-05-11 21:20 ` Dmitry Torokhov 2011-05-10 11:35 ` [PATCH 5/5] input: misc: AD714x: Fix captouch wheel option algorithm michael.hennerich 2011-05-11 18:30 ` Jean-Francois Dagenais 2011-05-11 21:15 ` [PATCH 1/5] input: misc: AD714x: The interrupt status registers should be read in row Dmitry Torokhov 2011-05-12 8:39 ` Hennerich, Michael
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).