* [PATCH 01/12] staging:iio:tsl2563 take advantage of new iio_device_allocate private data.
2011-04-13 13:42 [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
@ 2011-04-13 13:42 ` Jonathan Cameron
2011-04-13 13:42 ` [PATCH 02/12] staging:iio:light:tsl2563 constify gain level table Jonathan Cameron
` (11 subsequent siblings)
12 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-13 13:42 UTC (permalink / raw)
To: linux-iio; +Cc: Michael.Hennerich, Jonathan Cameron
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/light/tsl2563.c | 68 +++++++++++++++--------------------
1 files changed, 29 insertions(+), 39 deletions(-)
diff --git a/drivers/staging/iio/light/tsl2563.c b/drivers/staging/iio/light/tsl2563.c
index 35d94c6..8c00584 100644
--- a/drivers/staging/iio/light/tsl2563.c
+++ b/drivers/staging/iio/light/tsl2563.c
@@ -115,7 +115,6 @@ static struct tsl2563_gainlevel_coeff tsl2563_gainlevel_table[] = {
struct tsl2563_chip {
struct mutex lock;
struct i2c_client *client;
- struct iio_dev *indio_dev;
struct delayed_work poweroff_work;
struct work_struct work_thresh;
@@ -470,8 +469,7 @@ static unsigned int adc_to_lux(u32 adc0, u32 adc1)
static ssize_t tsl2563_adc_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
- struct iio_dev *indio_dev = dev_get_drvdata(dev);
- struct tsl2563_chip *chip = indio_dev->dev_data;
+ struct tsl2563_chip *chip = iio_priv(dev_get_drvdata(dev));
struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
int ret;
@@ -508,8 +506,7 @@ static u32 calib_adc(u32 adc, u32 calib)
static ssize_t tsl2563_lux_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
- struct iio_dev *indio_dev = dev_get_drvdata(dev);
- struct tsl2563_chip *chip = indio_dev->dev_data;
+ struct tsl2563_chip *chip = iio_priv(dev_get_drvdata(dev));
u32 calib0, calib1;
int ret;
@@ -537,8 +534,7 @@ static ssize_t format_calib(char *buf, int len, u32 calib)
static ssize_t tsl2563_calib_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
- struct iio_dev *indio_dev = dev_get_drvdata(dev);
- struct tsl2563_chip *chip = indio_dev->dev_data;
+ struct tsl2563_chip *chip = iio_priv(dev_get_drvdata(dev));
struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
int ret;
@@ -561,8 +557,7 @@ static ssize_t tsl2563_calib_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t len)
{
- struct iio_dev *indio_dev = dev_get_drvdata(dev);
- struct tsl2563_chip *chip = indio_dev->dev_data;
+ struct tsl2563_chip *chip = iio_priv(dev_get_drvdata(dev));
struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
int value;
u32 calib;
@@ -598,8 +593,7 @@ static ssize_t tsl2563_show_name(struct device *dev,
struct device_attribute *attr,
char *buf)
{
- struct iio_dev *indio_dev = dev_get_drvdata(dev);
- struct tsl2563_chip *chip = indio_dev->dev_data;
+ struct tsl2563_chip *chip = iio_priv(dev_get_drvdata(dev));
return sprintf(buf, "%s\n", chip->client->name);
}
@@ -623,8 +617,7 @@ static ssize_t tsl2563_read_thresh(struct device *dev,
struct device_attribute *attr,
char *buf)
{
- struct iio_dev *indio_dev = dev_get_drvdata(dev);
- struct tsl2563_chip *chip = indio_dev->dev_data;
+ struct tsl2563_chip *chip = iio_priv(dev_get_drvdata(dev));
struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
u16 val = 0;
switch (this_attr->address) {
@@ -643,8 +636,7 @@ static ssize_t tsl2563_write_thresh(struct device *dev,
const char *buf,
size_t len)
{
- struct iio_dev *indio_dev = dev_get_drvdata(dev);
- struct tsl2563_chip *chip = indio_dev->dev_data;
+ struct tsl2563_chip *chip = iio_priv(dev_get_drvdata(dev));
struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
unsigned long val;
int ret;
@@ -690,7 +682,7 @@ static int tsl2563_int_th(struct iio_dev *dev_info,
s64 timestamp,
int not_test)
{
- struct tsl2563_chip *chip = dev_info->dev_data;
+ struct tsl2563_chip *chip = iio_priv(dev_info);
chip->event_timestamp = timestamp;
schedule_work(&chip->work_thresh);
@@ -705,7 +697,7 @@ static void tsl2563_int_bh(struct work_struct *work_s)
struct tsl2563_chip, work_thresh);
u8 cmd = TSL2563_CMD | TSL2563_CLEARINT;
- iio_push_event(chip->indio_dev, 0,
+ iio_push_event(iio_priv_to_dev(chip), 0,
IIO_UNMOD_EVENT_CODE(IIO_EV_CLASS_LIGHT,
0,
IIO_EV_TYPE_THRESH,
@@ -725,7 +717,7 @@ static ssize_t tsl2563_write_interrupt_config(struct device *dev,
size_t len)
{
struct iio_dev *indio_dev = dev_get_drvdata(dev);
- struct tsl2563_chip *chip = indio_dev->dev_data;
+ struct tsl2563_chip *chip = iio_priv(indio_dev);
struct iio_event_attr *this_attr = to_iio_event_attr(attr);
int input, ret = 0;
@@ -771,8 +763,7 @@ static ssize_t tsl2563_read_interrupt_config(struct device *dev,
struct device_attribute *attr,
char *buf)
{
- struct iio_dev *indio_dev = dev_get_drvdata(dev);
- struct tsl2563_chip *chip = indio_dev->dev_data;
+ struct tsl2563_chip *chip = iio_priv(dev_get_drvdata(dev));
int ret;
u8 rxbuf;
ssize_t len;
@@ -816,16 +807,19 @@ static struct i2c_driver tsl2563_i2c_driver;
static int __devinit tsl2563_probe(struct i2c_client *client,
const struct i2c_device_id *device_id)
{
+ struct iio_dev *indio_dev;
struct tsl2563_chip *chip;
struct tsl2563_platform_data *pdata = client->dev.platform_data;
int err = 0;
int ret;
u8 id;
- chip = kzalloc(sizeof(*chip), GFP_KERNEL);
- if (!chip)
+ indio_dev = iio_allocate_device(sizeof(*chip));
+ if (!indio_dev)
return -ENOMEM;
+ chip = iio_priv(indio_dev);
+
INIT_WORK(&chip->work_thresh, tsl2563_int_bh);
i2c_set_clientdata(client, chip);
chip->client = client;
@@ -857,26 +851,22 @@ static int __devinit tsl2563_probe(struct i2c_client *client,
dev_info(&client->dev, "model %d, rev. %d\n", id >> 4, id & 0x0f);
- chip->indio_dev = iio_allocate_device(0);
- if (!chip->indio_dev)
- goto fail1;
- chip->indio_dev->attrs = &tsl2563_group;
- chip->indio_dev->dev.parent = &client->dev;
- chip->indio_dev->dev_data = (void *)(chip);
- chip->indio_dev->driver_module = THIS_MODULE;
- chip->indio_dev->modes = INDIO_DIRECT_MODE;
+ indio_dev->attrs = &tsl2563_group;
+ indio_dev->dev.parent = &client->dev;
+ indio_dev->driver_module = THIS_MODULE;
+ indio_dev->modes = INDIO_DIRECT_MODE;
if (client->irq) {
- chip->indio_dev->num_interrupt_lines = 1;
- chip->indio_dev->event_attrs
+ indio_dev->num_interrupt_lines = 1;
+ indio_dev->event_attrs
= &tsl2563_event_attribute_group;
}
- ret = iio_device_register(chip->indio_dev);
+ ret = iio_device_register(indio_dev);
if (ret)
goto fail1;
if (client->irq) {
ret = iio_register_interrupt_line(client->irq,
- chip->indio_dev,
+ indio_dev,
0,
IRQF_TRIGGER_RISING,
client->name);
@@ -894,9 +884,9 @@ static int __devinit tsl2563_probe(struct i2c_client *client,
return 0;
fail3:
if (client->irq)
- iio_unregister_interrupt_line(chip->indio_dev, 0);
+ iio_unregister_interrupt_line(indio_dev, 0);
fail2:
- iio_device_unregister(chip->indio_dev);
+ iio_device_unregister(indio_dev);
fail1:
kfree(chip);
return err;
@@ -905,6 +895,7 @@ fail1:
static int tsl2563_remove(struct i2c_client *client)
{
struct tsl2563_chip *chip = i2c_get_clientdata(client);
+ struct iio_dev *indio_dev = iio_priv_to_dev(chip);
if (!chip->int_enabled)
cancel_delayed_work(&chip->poweroff_work);
/* Ensure that interrupts are disabled - then flush any bottom halves */
@@ -913,10 +904,9 @@ static int tsl2563_remove(struct i2c_client *client)
flush_scheduled_work();
tsl2563_set_power(chip, 0);
if (client->irq)
- iio_unregister_interrupt_line(chip->indio_dev, 0);
- iio_device_unregister(chip->indio_dev);
+ iio_unregister_interrupt_line(indio_dev, 0);
+ iio_device_unregister(indio_dev);
- kfree(chip);
return 0;
}
--
1.7.3.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH 02/12] staging:iio:light:tsl2563 constify gain level table.
2011-04-13 13:42 [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
2011-04-13 13:42 ` [PATCH 01/12] staging:iio:tsl2563 take advantage of new iio_device_allocate private data Jonathan Cameron
@ 2011-04-13 13:42 ` Jonathan Cameron
2011-04-13 13:42 ` [PATCH 03/12] staging:iio:adis16300 replace unnecessary event line registration Jonathan Cameron
` (10 subsequent siblings)
12 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-13 13:42 UTC (permalink / raw)
To: linux-iio; +Cc: Michael.Hennerich, Jonathan Cameron
Trivial cleanup.
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/light/tsl2563.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/staging/iio/light/tsl2563.c b/drivers/staging/iio/light/tsl2563.c
index 8c00584..19b7215 100644
--- a/drivers/staging/iio/light/tsl2563.c
+++ b/drivers/staging/iio/light/tsl2563.c
@@ -92,7 +92,7 @@ struct tsl2563_gainlevel_coeff {
u16 max;
};
-static struct tsl2563_gainlevel_coeff tsl2563_gainlevel_table[] = {
+static const struct tsl2563_gainlevel_coeff tsl2563_gainlevel_table[] = {
{
.gaintime = TSL2563_TIMING_400MS | TSL2563_TIMING_GAIN16,
.min = 0,
@@ -122,7 +122,7 @@ struct tsl2563_chip {
/* Remember state for suspend and resume functions */
pm_message_t state;
- struct tsl2563_gainlevel_coeff *gainlevel;
+ struct tsl2563_gainlevel_coeff const *gainlevel;
u16 low_thres;
u16 high_thres;
--
1.7.3.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH 03/12] staging:iio:adis16300 replace unnecessary event line registration.
2011-04-13 13:42 [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
2011-04-13 13:42 ` [PATCH 01/12] staging:iio:tsl2563 take advantage of new iio_device_allocate private data Jonathan Cameron
2011-04-13 13:42 ` [PATCH 02/12] staging:iio:light:tsl2563 constify gain level table Jonathan Cameron
@ 2011-04-13 13:42 ` Jonathan Cameron
2011-04-13 13:42 ` [PATCH 04/12] staging:iio:adis16350 " Jonathan Cameron
` (9 subsequent siblings)
12 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-13 13:42 UTC (permalink / raw)
To: linux-iio; +Cc: Michael.Hennerich, Jonathan Cameron
Whilst the adis16300 does indeed support events, currently the driver
does not. The trigger code should never use that infrastructure.
Untested
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/imu/adis16300_core.c | 26 +--------------
drivers/staging/iio/imu/adis16300_trigger.c | 48 ++++++++++++---------------
2 files changed, 22 insertions(+), 52 deletions(-)
diff --git a/drivers/staging/iio/imu/adis16300_core.c b/drivers/staging/iio/imu/adis16300_core.c
index 0734d4a..903bb30 100644
--- a/drivers/staging/iio/imu/adis16300_core.c
+++ b/drivers/staging/iio/imu/adis16300_core.c
@@ -563,14 +563,6 @@ static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("409 546 819 1638");
static IIO_CONST_ATTR_NAME("adis16300");
-static struct attribute *adis16300_event_attributes[] = {
- NULL
-};
-
-static struct attribute_group adis16300_event_attribute_group = {
- .attrs = adis16300_event_attributes,
-};
-
static struct attribute *adis16300_attributes[] = {
&iio_dev_attr_gyro_x_calibbias.dev_attr.attr,
&iio_dev_attr_accel_x_calibbias.dev_attr.attr,
@@ -635,8 +627,6 @@ static int __devinit adis16300_probe(struct spi_device *spi)
}
st->indio_dev->dev.parent = &spi->dev;
- st->indio_dev->num_interrupt_lines = 1;
- st->indio_dev->event_attrs = &adis16300_event_attribute_group;
st->indio_dev->attrs = &adis16300_attribute_group;
st->indio_dev->dev_data = (void *)(st);
st->indio_dev->driver_module = THIS_MODULE;
@@ -658,17 +648,9 @@ static int __devinit adis16300_probe(struct spi_device *spi)
}
if (spi->irq) {
- ret = iio_register_interrupt_line(spi->irq,
- st->indio_dev,
- 0,
- IRQF_TRIGGER_RISING,
- "adis16300");
- if (ret)
- goto error_uninitialize_ring;
-
ret = adis16300_probe_trigger(st->indio_dev);
if (ret)
- goto error_unregister_line;
+ goto error_uninitialize_ring;
}
/* Get the device into a sane initial state */
@@ -679,9 +661,6 @@ static int __devinit adis16300_probe(struct spi_device *spi)
error_remove_trigger:
adis16300_remove_trigger(st->indio_dev);
-error_unregister_line:
- if (spi->irq)
- iio_unregister_interrupt_line(st->indio_dev, 0);
error_uninitialize_ring:
iio_ring_buffer_unregister(st->indio_dev->ring);
error_unreg_ring_funcs:
@@ -714,9 +693,6 @@ static int adis16300_remove(struct spi_device *spi)
flush_scheduled_work();
adis16300_remove_trigger(indio_dev);
- if (spi->irq)
- iio_unregister_interrupt_line(indio_dev, 0);
-
iio_ring_buffer_unregister(indio_dev->ring);
iio_device_unregister(indio_dev);
adis16300_unconfigure_ring(indio_dev);
diff --git a/drivers/staging/iio/imu/adis16300_trigger.c b/drivers/staging/iio/imu/adis16300_trigger.c
index d6677b6..fd7656f 100644
--- a/drivers/staging/iio/imu/adis16300_trigger.c
+++ b/drivers/staging/iio/imu/adis16300_trigger.c
@@ -15,21 +15,13 @@
/**
* adis16300_data_rdy_trig_poll() the event handler for the data rdy trig
**/
-static int adis16300_data_rdy_trig_poll(struct iio_dev *dev_info,
- int index,
- s64 timestamp,
- int no_test)
+static irqreturn_t adis16300_data_rdy_trig_poll(int irq, void *private)
{
- struct adis16300_state *st = iio_dev_get_devdata(dev_info);
- struct iio_trigger *trig = st->trig;
-
- iio_trigger_poll(trig, timestamp);
-
+ disable_irq_nosync(irq);
+ iio_trigger_poll(private, iio_get_time_ns());
return IRQ_HANDLED;
}
-IIO_EVENT_SH(data_rdy_trig, &adis16300_data_rdy_trig_poll);
-
static IIO_TRIGGER_NAME_ATTR;
static struct attribute *adis16300_trigger_attrs[] = {
@@ -49,22 +41,9 @@ static int adis16300_data_rdy_trigger_set_state(struct iio_trigger *trig,
{
struct adis16300_state *st = trig->private_data;
struct iio_dev *indio_dev = st->indio_dev;
- int ret = 0;
dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
- ret = adis16300_set_irq(&st->indio_dev->dev, state);
- if (state == false) {
- iio_remove_event_from_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]
- ->ev_list);
- /* possible quirk with handler currently worked around
- by ensuring the work queue is empty */
- flush_scheduled_work();
- } else {
- iio_add_event_to_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]->ev_list);
- }
- return ret;
+ return adis16300_set_irq(&st->indio_dev->dev, state);
}
/**
@@ -85,12 +64,24 @@ int adis16300_probe_trigger(struct iio_dev *indio_dev)
struct adis16300_state *st = indio_dev->dev_data;
st->trig = iio_allocate_trigger();
+ if (st->trig == NULL) {
+ ret = -ENOMEM;
+ goto error_ret;
+ }
+ ret = request_irq(st->us->irq,
+ adis16300_data_rdy_trig_poll,
+ IRQF_TRIGGER_RISING,
+ "adis16300",
+ st->trig);
+ if (ret)
+ goto error_free_trig;
+
st->trig->name = kasprintf(GFP_KERNEL,
"adis16300-dev%d",
indio_dev->id);
if (!st->trig->name) {
ret = -ENOMEM;
- goto error_free_trig;
+ goto error_free_irq;
}
st->trig->dev.parent = &st->us->dev;
st->trig->owner = THIS_MODULE;
@@ -109,9 +100,11 @@ int adis16300_probe_trigger(struct iio_dev *indio_dev)
error_free_trig_name:
kfree(st->trig->name);
+error_free_irq:
+ free_irq(st->us->irq, st->trig);
error_free_trig:
iio_free_trigger(st->trig);
-
+error_ret:
return ret;
}
@@ -121,5 +114,6 @@ void adis16300_remove_trigger(struct iio_dev *indio_dev)
iio_trigger_unregister(state->trig);
kfree(state->trig->name);
+ free_irq(state->us->irq, state->trig);
iio_free_trigger(state->trig);
}
--
1.7.3.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH 04/12] staging:iio:adis16350 replace unnecessary event line registration.
2011-04-13 13:42 [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
` (2 preceding siblings ...)
2011-04-13 13:42 ` [PATCH 03/12] staging:iio:adis16300 replace unnecessary event line registration Jonathan Cameron
@ 2011-04-13 13:42 ` Jonathan Cameron
2011-04-13 13:43 ` [PATCH 05/12] staging:iio:adis16400 " Jonathan Cameron
` (8 subsequent siblings)
12 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-13 13:42 UTC (permalink / raw)
To: linux-iio; +Cc: Michael.Hennerich, Jonathan Cameron
Whilst the adis163500 does indeed support events, currently the driver
does not. The trigger code should never use that infrastructure.
Untested
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/imu/adis16350_core.c | 26 +--------------
drivers/staging/iio/imu/adis16350_trigger.c | 48 ++++++++++++---------------
2 files changed, 22 insertions(+), 52 deletions(-)
diff --git a/drivers/staging/iio/imu/adis16350_core.c b/drivers/staging/iio/imu/adis16350_core.c
index 2081924..741502d 100644
--- a/drivers/staging/iio/imu/adis16350_core.c
+++ b/drivers/staging/iio/imu/adis16350_core.c
@@ -584,14 +584,6 @@ static const struct attribute_group adis16350_attribute_group = {
.attrs = adis16350_attributes,
};
-static struct attribute *adis16350_event_attributes[] = {
- NULL,
-};
-
-static struct attribute_group adis16350_event_attribute_group = {
- .attrs = adis16350_event_attributes,
-};
-
static int __devinit adis16350_probe(struct spi_device *spi)
{
int ret, regdone = 0;
@@ -624,8 +616,6 @@ static int __devinit adis16350_probe(struct spi_device *spi)
}
st->indio_dev->dev.parent = &spi->dev;
- st->indio_dev->num_interrupt_lines = 1;
- st->indio_dev->event_attrs = &adis16350_event_attribute_group;
st->indio_dev->attrs = &adis16350_attribute_group;
st->indio_dev->dev_data = (void *)(st);
st->indio_dev->driver_module = THIS_MODULE;
@@ -647,17 +637,9 @@ static int __devinit adis16350_probe(struct spi_device *spi)
}
if (spi->irq) {
- ret = iio_register_interrupt_line(spi->irq,
- st->indio_dev,
- 0,
- IRQF_TRIGGER_RISING,
- "adis16350");
- if (ret)
- goto error_uninitialize_ring;
-
ret = adis16350_probe_trigger(st->indio_dev);
if (ret)
- goto error_unregister_line;
+ goto error_uninitialize_ring;
}
/* Get the device into a sane initial state */
@@ -668,9 +650,6 @@ static int __devinit adis16350_probe(struct spi_device *spi)
error_remove_trigger:
adis16350_remove_trigger(st->indio_dev);
-error_unregister_line:
- if (spi->irq)
- iio_unregister_interrupt_line(st->indio_dev, 0);
error_uninitialize_ring:
iio_ring_buffer_unregister(st->indio_dev->ring);
error_unreg_ring_funcs:
@@ -703,9 +682,6 @@ static int adis16350_remove(struct spi_device *spi)
flush_scheduled_work();
adis16350_remove_trigger(indio_dev);
- if (spi->irq)
- iio_unregister_interrupt_line(indio_dev, 0);
-
iio_ring_buffer_unregister(indio_dev->ring);
iio_device_unregister(indio_dev);
adis16350_unconfigure_ring(indio_dev);
diff --git a/drivers/staging/iio/imu/adis16350_trigger.c b/drivers/staging/iio/imu/adis16350_trigger.c
index 739b7ec..8d35913 100644
--- a/drivers/staging/iio/imu/adis16350_trigger.c
+++ b/drivers/staging/iio/imu/adis16350_trigger.c
@@ -15,21 +15,13 @@
/**
* adis16350_data_rdy_trig_poll() the event handler for the data rdy trig
**/
-static int adis16350_data_rdy_trig_poll(struct iio_dev *dev_info,
- int index,
- s64 timestamp,
- int no_test)
+static irqreturn_t adis16350_data_rdy_trig_poll(int irq, void *private)
{
- struct adis16350_state *st = iio_dev_get_devdata(dev_info);
- struct iio_trigger *trig = st->trig;
-
- iio_trigger_poll(trig, timestamp);
-
+ disable_irq_nosync(irq);
+ iio_trigger_poll(private, iio_get_time_ns());
return IRQ_HANDLED;
}
-IIO_EVENT_SH(data_rdy_trig, &adis16350_data_rdy_trig_poll);
-
static IIO_TRIGGER_NAME_ATTR;
static struct attribute *adis16350_trigger_attrs[] = {
@@ -49,22 +41,9 @@ static int adis16350_data_rdy_trigger_set_state(struct iio_trigger *trig,
{
struct adis16350_state *st = trig->private_data;
struct iio_dev *indio_dev = st->indio_dev;
- int ret = 0;
dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
- ret = adis16350_set_irq(&st->indio_dev->dev, state);
- if (state == false) {
- iio_remove_event_from_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]
- ->ev_list);
- /* possible quirk with handler currently worked around
- by ensuring the work queue is empty */
- flush_scheduled_work();
- } else {
- iio_add_event_to_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]->ev_list);
- }
- return ret;
+ return adis16350_set_irq(&st->indio_dev->dev, state);
}
/**
@@ -85,12 +64,24 @@ int adis16350_probe_trigger(struct iio_dev *indio_dev)
struct adis16350_state *st = indio_dev->dev_data;
st->trig = iio_allocate_trigger();
+ if (st->trig == NULL) {
+ ret = -ENOMEM;
+ goto error_ret;
+ }
+ ret = request_irq(st->us->irq,
+ adis16350_data_rdy_trig_poll,
+ IRQF_TRIGGER_RISING,
+ "adis16350",
+ st->trig);
+ if (ret)
+ goto error_free_trig;
+
st->trig->name = kasprintf(GFP_KERNEL,
"adis16350-dev%d",
indio_dev->id);
if (!st->trig->name) {
ret = -ENOMEM;
- goto error_free_trig;
+ goto error_free_irq;
}
st->trig->dev.parent = &st->us->dev;
st->trig->owner = THIS_MODULE;
@@ -109,9 +100,11 @@ int adis16350_probe_trigger(struct iio_dev *indio_dev)
error_free_trig_name:
kfree(st->trig->name);
+error_free_irq:
+ free_irq(st->us->irq, st->trig);
error_free_trig:
iio_free_trigger(st->trig);
-
+error_ret:
return ret;
}
@@ -121,5 +114,6 @@ void adis16350_remove_trigger(struct iio_dev *indio_dev)
iio_trigger_unregister(state->trig);
kfree(state->trig->name);
+ free_irq(state->us->irq, state->trig);
iio_free_trigger(state->trig);
}
--
1.7.3.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH 05/12] staging:iio:adis16400 replace unnecessary event line registration.
2011-04-13 13:42 [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
` (3 preceding siblings ...)
2011-04-13 13:42 ` [PATCH 04/12] staging:iio:adis16350 " Jonathan Cameron
@ 2011-04-13 13:43 ` Jonathan Cameron
2011-04-13 13:55 ` Michael Hennerich
2011-04-13 13:43 ` [PATCH 06/12] staging:iio:adis16260 " Jonathan Cameron
` (7 subsequent siblings)
12 siblings, 1 reply; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-13 13:43 UTC (permalink / raw)
To: linux-iio; +Cc: Michael.Hennerich, Jonathan Cameron
Whilst the adis16400 does indeed support events, currently the driver
does not. The trigger code should never use that infrastructure.
Untested
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/imu/adis16400_core.c | 26 +--------------
drivers/staging/iio/imu/adis16400_trigger.c | 47 +++++++++++---------------
2 files changed, 21 insertions(+), 52 deletions(-)
diff --git a/drivers/staging/iio/imu/adis16400_core.c b/drivers/staging/iio/imu/adis16400_core.c
index 3439239..b8831dc 100644
--- a/drivers/staging/iio/imu/adis16400_core.c
+++ b/drivers/staging/iio/imu/adis16400_core.c
@@ -552,14 +552,6 @@ static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("409 546 819 1638");
static IIO_CONST_ATTR_NAME("adis16400");
-static struct attribute *adis16400_event_attributes[] = {
- NULL
-};
-
-static struct attribute_group adis16400_event_attribute_group = {
- .attrs = adis16400_event_attributes,
-};
-
static struct attribute *adis16400_attributes[] = {
&iio_dev_attr_gyro_x_calibbias.dev_attr.attr,
&iio_dev_attr_gyro_y_calibbias.dev_attr.attr,
@@ -629,8 +621,6 @@ static int __devinit adis16400_probe(struct spi_device *spi)
}
st->indio_dev->dev.parent = &spi->dev;
- st->indio_dev->num_interrupt_lines = 1;
- st->indio_dev->event_attrs = &adis16400_event_attribute_group;
st->indio_dev->attrs = &adis16400_attribute_group;
st->indio_dev->dev_data = (void *)(st);
st->indio_dev->driver_module = THIS_MODULE;
@@ -652,17 +642,9 @@ static int __devinit adis16400_probe(struct spi_device *spi)
}
if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0) {
- ret = iio_register_interrupt_line(spi->irq,
- st->indio_dev,
- 0,
- IRQF_TRIGGER_RISING,
- "adis16400");
- if (ret)
- goto error_uninitialize_ring;
-
ret = adis16400_probe_trigger(st->indio_dev);
if (ret)
- goto error_unregister_line;
+ goto error_uninitialize_ring;
}
/* Get the device into a sane initial state */
@@ -674,9 +656,6 @@ static int __devinit adis16400_probe(struct spi_device *spi)
error_remove_trigger:
if (st->indio_dev->modes & INDIO_RING_TRIGGERED)
adis16400_remove_trigger(st->indio_dev);
-error_unregister_line:
- if (st->indio_dev->modes & INDIO_RING_TRIGGERED)
- iio_unregister_interrupt_line(st->indio_dev, 0);
error_uninitialize_ring:
iio_ring_buffer_unregister(st->indio_dev->ring);
error_unreg_ring_funcs:
@@ -710,9 +689,6 @@ static int adis16400_remove(struct spi_device *spi)
flush_scheduled_work();
adis16400_remove_trigger(indio_dev);
- if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0)
- iio_unregister_interrupt_line(indio_dev, 0);
-
iio_ring_buffer_unregister(st->indio_dev->ring);
adis16400_unconfigure_ring(indio_dev);
iio_device_unregister(indio_dev);
diff --git a/drivers/staging/iio/imu/adis16400_trigger.c b/drivers/staging/iio/imu/adis16400_trigger.c
index 36b5ff5..afa5e74 100644
--- a/drivers/staging/iio/imu/adis16400_trigger.c
+++ b/drivers/staging/iio/imu/adis16400_trigger.c
@@ -15,21 +15,13 @@
/**
* adis16400_data_rdy_trig_poll() the event handler for the data rdy trig
**/
-static int adis16400_data_rdy_trig_poll(struct iio_dev *dev_info,
- int index,
- s64 timestamp,
- int no_test)
+static irqreturn_t adis16400_data_rdy_trig_poll(int irq, void *private)
{
- struct adis16400_state *st = iio_dev_get_devdata(dev_info);
- struct iio_trigger *trig = st->trig;
-
- iio_trigger_poll(trig, timestamp);
-
+ disable_irq_nosync(irq);
+ iio_trigger_poll(private, iio_get_time_ns());
return IRQ_HANDLED;
}
-IIO_EVENT_SH(data_rdy_trig, &adis16400_data_rdy_trig_poll);
-
static IIO_TRIGGER_NAME_ATTR;
static struct attribute *adis16400_trigger_attrs[] = {
@@ -49,22 +41,9 @@ static int adis16400_data_rdy_trigger_set_state(struct iio_trigger *trig,
{
struct adis16400_state *st = trig->private_data;
struct iio_dev *indio_dev = st->indio_dev;
- int ret = 0;
dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
- ret = adis16400_set_irq(&st->indio_dev->dev, state);
- if (state == false) {
- iio_remove_event_from_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]
- ->ev_list);
- /* possible quirk with handler currently worked around
- by ensuring the work queue is empty */
- flush_scheduled_work();
- } else {
- iio_add_event_to_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]->ev_list);
- }
- return ret;
+ return adis16400_set_irq(&st->indio_dev->dev, state);
}
/**
@@ -85,12 +64,23 @@ int adis16400_probe_trigger(struct iio_dev *indio_dev)
struct adis16400_state *st = indio_dev->dev_data;
st->trig = iio_allocate_trigger();
+ if (st->trig == NULL) {
+ ret = -ENOMEM;
+ goto error_ret;
+ }
+ ret = request_irq(st->us->irq,
+ adis16400_data_rdy_trig_poll,
+ IRQF_TRIGGER_RISING,
+ "adis16400",
+ st->trig);
+ if (ret)
+ goto error_free_trig;
st->trig->name = kasprintf(GFP_KERNEL,
"adis16400-dev%d",
indio_dev->id);
if (!st->trig->name) {
ret = -ENOMEM;
- goto error_free_trig;
+ goto error_free_irq;
}
st->trig->dev.parent = &st->us->dev;
st->trig->owner = THIS_MODULE;
@@ -109,9 +99,11 @@ int adis16400_probe_trigger(struct iio_dev *indio_dev)
error_free_trig_name:
kfree(st->trig->name);
+error_free_irq:
+ free_irq(st->us->irq, st->trig);
error_free_trig:
iio_free_trigger(st->trig);
-
+error_ret:
return ret;
}
@@ -121,5 +113,6 @@ void adis16400_remove_trigger(struct iio_dev *indio_dev)
iio_trigger_unregister(state->trig);
kfree(state->trig->name);
+ free_irq(state->us->irq, state->trig);
iio_free_trigger(state->trig);
}
--
1.7.3.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [PATCH 05/12] staging:iio:adis16400 replace unnecessary event line registration.
2011-04-13 13:43 ` [PATCH 05/12] staging:iio:adis16400 " Jonathan Cameron
@ 2011-04-13 13:55 ` Michael Hennerich
2011-04-13 14:45 ` Jonathan Cameron
0 siblings, 1 reply; 18+ messages in thread
From: Michael Hennerich @ 2011-04-13 13:55 UTC (permalink / raw)
To: Jonathan Cameron; +Cc: linux-iio@vger.kernel.org
On 04/13/2011 03:43 PM, Jonathan Cameron wrote:
> Whilst the adis16400 does indeed support events, currently the driver
> does not. The trigger code should never use that infrastructure.
>
> Untested
>
> Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
> ---
> drivers/staging/iio/imu/adis16400_core.c | 26 +--------------
> drivers/staging/iio/imu/adis16400_trigger.c | 47 +++++++++++---------------
> 2 files changed, 21 insertions(+), 52 deletions(-)
>
> diff --git a/drivers/staging/iio/imu/adis16400_core.c b/drivers/staging/iio/imu/adis16400_core.c
> index 3439239..b8831dc 100644
> --- a/drivers/staging/iio/imu/adis16400_core.c
> +++ b/drivers/staging/iio/imu/adis16400_core.c
> @@ -552,14 +552,6 @@ static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("409 546 819 1638");
>
> static IIO_CONST_ATTR_NAME("adis16400");
>
> -static struct attribute *adis16400_event_attributes[] = {
> - NULL
> -};
> -
> -static struct attribute_group adis16400_event_attribute_group = {
> - .attrs = adis16400_event_attributes,
> -};
> -
> static struct attribute *adis16400_attributes[] = {
> &iio_dev_attr_gyro_x_calibbias.dev_attr.attr,
> &iio_dev_attr_gyro_y_calibbias.dev_attr.attr,
> @@ -629,8 +621,6 @@ static int __devinit adis16400_probe(struct spi_device *spi)
> }
>
> st->indio_dev->dev.parent = &spi->dev;
> - st->indio_dev->num_interrupt_lines = 1;
> - st->indio_dev->event_attrs = &adis16400_event_attribute_group;
> st->indio_dev->attrs = &adis16400_attribute_group;
> st->indio_dev->dev_data = (void *)(st);
> st->indio_dev->driver_module = THIS_MODULE;
> @@ -652,17 +642,9 @@ static int __devinit adis16400_probe(struct spi_device *spi)
> }
>
> if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0) {
> - ret = iio_register_interrupt_line(spi->irq,
> - st->indio_dev,
> - 0,
> - IRQF_TRIGGER_RISING,
> - "adis16400");
> - if (ret)
> - goto error_uninitialize_ring;
> -
> ret = adis16400_probe_trigger(st->indio_dev);
> if (ret)
> - goto error_unregister_line;
> + goto error_uninitialize_ring;
> }
>
> /* Get the device into a sane initial state */
> @@ -674,9 +656,6 @@ static int __devinit adis16400_probe(struct spi_device *spi)
> error_remove_trigger:
> if (st->indio_dev->modes & INDIO_RING_TRIGGERED)
> adis16400_remove_trigger(st->indio_dev);
> -error_unregister_line:
> - if (st->indio_dev->modes & INDIO_RING_TRIGGERED)
> - iio_unregister_interrupt_line(st->indio_dev, 0);
> error_uninitialize_ring:
> iio_ring_buffer_unregister(st->indio_dev->ring);
> error_unreg_ring_funcs:
> @@ -710,9 +689,6 @@ static int adis16400_remove(struct spi_device *spi)
> flush_scheduled_work();
>
> adis16400_remove_trigger(indio_dev);
> - if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0)
> - iio_unregister_interrupt_line(indio_dev, 0);
> -
> iio_ring_buffer_unregister(st->indio_dev->ring);
> adis16400_unconfigure_ring(indio_dev);
> iio_device_unregister(indio_dev);
> diff --git a/drivers/staging/iio/imu/adis16400_trigger.c b/drivers/staging/iio/imu/adis16400_trigger.c
> index 36b5ff5..afa5e74 100644
> --- a/drivers/staging/iio/imu/adis16400_trigger.c
> +++ b/drivers/staging/iio/imu/adis16400_trigger.c
> @@ -15,21 +15,13 @@
> /**
> * adis16400_data_rdy_trig_poll() the event handler for the data rdy trig
> **/
> -static int adis16400_data_rdy_trig_poll(struct iio_dev *dev_info,
> - int index,
> - s64 timestamp,
> - int no_test)
> +static irqreturn_t adis16400_data_rdy_trig_poll(int irq, void *private)
> {
> - struct adis16400_state *st = iio_dev_get_devdata(dev_info);
> - struct iio_trigger *trig = st->trig;
> -
> - iio_trigger_poll(trig, timestamp);
> -
> + disable_irq_nosync(irq);
> + iio_trigger_poll(private, iio_get_time_ns());
>
Is it save to call iio_trigger_poll() from the Top Half Hard-IRQ?
Instead of disable/enable irq shouldn't this be better a threaded_irq
with IRQF_ONESHOT?
> return IRQ_HANDLED;
> }
>
> -IIO_EVENT_SH(data_rdy_trig, &adis16400_data_rdy_trig_poll);
> -
> static IIO_TRIGGER_NAME_ATTR;
>
> static struct attribute *adis16400_trigger_attrs[] = {
> @@ -49,22 +41,9 @@ static int adis16400_data_rdy_trigger_set_state(struct iio_trigger *trig,
> {
> struct adis16400_state *st = trig->private_data;
> struct iio_dev *indio_dev = st->indio_dev;
> - int ret = 0;
>
> dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
> - ret = adis16400_set_irq(&st->indio_dev->dev, state);
> - if (state == false) {
> - iio_remove_event_from_list(&iio_event_data_rdy_trig,
> - &indio_dev->interrupts[0]
> - ->ev_list);
> - /* possible quirk with handler currently worked around
> - by ensuring the work queue is empty */
> - flush_scheduled_work();
> - } else {
> - iio_add_event_to_list(&iio_event_data_rdy_trig,
> - &indio_dev->interrupts[0]->ev_list);
> - }
> - return ret;
> + return adis16400_set_irq(&st->indio_dev->dev, state);
> }
>
> /**
> @@ -85,12 +64,23 @@ int adis16400_probe_trigger(struct iio_dev *indio_dev)
> struct adis16400_state *st = indio_dev->dev_data;
>
> st->trig = iio_allocate_trigger();
> + if (st->trig == NULL) {
> + ret = -ENOMEM;
> + goto error_ret;
> + }
> + ret = request_irq(st->us->irq,
> + adis16400_data_rdy_trig_poll,
> + IRQF_TRIGGER_RISING,
> + "adis16400",
> + st->trig);
>
threaded_irq with IRQF_ONESHOT?
> + if (ret)
> + goto error_free_trig;
> st->trig->name = kasprintf(GFP_KERNEL,
> "adis16400-dev%d",
> indio_dev->id);
> if (!st->trig->name) {
> ret = -ENOMEM;
> - goto error_free_trig;
> + goto error_free_irq;
> }
> st->trig->dev.parent = &st->us->dev;
> st->trig->owner = THIS_MODULE;
> @@ -109,9 +99,11 @@ int adis16400_probe_trigger(struct iio_dev *indio_dev)
>
> error_free_trig_name:
> kfree(st->trig->name);
> +error_free_irq:
> + free_irq(st->us->irq, st->trig);
> error_free_trig:
> iio_free_trigger(st->trig);
> -
> +error_ret:
> return ret;
> }
>
> @@ -121,5 +113,6 @@ void adis16400_remove_trigger(struct iio_dev *indio_dev)
>
> iio_trigger_unregister(state->trig);
> kfree(state->trig->name);
> + free_irq(state->us->irq, state->trig);
> iio_free_trigger(state->trig);
> }
>
--
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] 18+ messages in thread* Re: [PATCH 05/12] staging:iio:adis16400 replace unnecessary event line registration.
2011-04-13 13:55 ` Michael Hennerich
@ 2011-04-13 14:45 ` Jonathan Cameron
2011-04-17 18:41 ` Jonathan Cameron
0 siblings, 1 reply; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-13 14:45 UTC (permalink / raw)
To: michael.hennerich; +Cc: linux-iio@vger.kernel.org
...
>> iio_device_unregister(indio_dev);
>> diff --git a/drivers/staging/iio/imu/adis16400_trigger.c b/drivers/staging/iio/imu/adis16400_trigger.c
>> index 36b5ff5..afa5e74 100644
>> --- a/drivers/staging/iio/imu/adis16400_trigger.c
>> +++ b/drivers/staging/iio/imu/adis16400_trigger.c
>> @@ -15,21 +15,13 @@
>> /**
>> * adis16400_data_rdy_trig_poll() the event handler for the data rdy trig
>> **/
>> -static int adis16400_data_rdy_trig_poll(struct iio_dev *dev_info,
>> - int index,
>> - s64 timestamp,
>> - int no_test)
>> +static irqreturn_t adis16400_data_rdy_trig_poll(int irq, void *private)
>> {
>> - struct adis16400_state *st = iio_dev_get_devdata(dev_info);
>> - struct iio_trigger *trig = st->trig;
>> -
>> - iio_trigger_poll(trig, timestamp);
>> -
>> + disable_irq_nosync(irq);
>> + iio_trigger_poll(private, iio_get_time_ns());
>>
> Is it save to call iio_trigger_poll() from the Top Half Hard-IRQ?
> Instead of disable/enable irq shouldn't this be better a threaded_irq
> with IRQF_ONESHOT?
Yes. Actually after conversion to irq chips this is precisely what you
want to do. If you call it as threaded_irq with oneshot enabled,
then the triggered devices can't have top halves. That only really
matters if you either want a timestamp or you want to flip a gpio
to trigger the actual sampling. Note we can't do top halves at all
for software triggers. How to handle this is a corner I haven't cleaned
up yet.
When we switch over to that approach you don't disable this irq at all.
Rather you have the trigger_consumer as a threaded_irq with
IRQF_ONESHOT set. That serializes reads from the device and writing
to the buffer implementation. It's this serialization that motivates
the disabling of irq's here.
Having said that, the reason it is like this here, is that it
replicates what was previously happening. Without the hardware
I don't want to mess with it too much + most of this code is
going to go away shortly anyway!
To illustrate, take a look at accel/lis3l02dq (bit of a weird case)
or imu/adis16400 (untested right now) in
http://git.kernel.org/?p=linux/kernel/git/jic23/iio-onwards.git
in a few mins (just pushed).
Ripping out the relevant bits...
from adis16400_trigger.c
static irqreturn_t adis16400_data_rdy_trig_poll(int irq, void *private)
{
iio_trigger_poll(private, iio_get_time_ns());
return IRQ_HANDLED;
}
int adis16400_probe_trigger(struct iio_dev *indio_dev)
{
...
ret = request_irq(st->us->irq,
adis16400_data_rdy_trig_poll,
IRQF_TRIGGER_RISING,
"adis16400",
st->trig);
...
}
from adis16400_ring.c
static irqreturn_t adis16400_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->private_data;
struct adis16400_state *st = iio_dev_get_devdata(indio_dev);
... do stuff...
iio_trigger_notify_done(st->indio_dev->trig);
... clean up ...
return IRQ_HANDLED;
}
int adis16400_configure_ring(struct iio_dev *indio_dev)
{
...
indio_dev->pollfunc->private_data = indio_dev;
indio_dev->pollfunc->h = &iio_pollfunc_store_time;
indio_dev->pollfunc->thread = &adis16400_trigger_handler;
indio_dev->pollfunc->type = IRQF_ONESHOT;
indio_dev->pollfunc->name =
kasprintf(GFP_KERNEL, "adis16400_consumer%d", indio_dev->id);
...
}
Sometimes some fiddling is needed in the reenable for the interrupt to make sure
we don't get stuck with it high (for interrupts that don't clear unless a read
occurs - see lis3l02dq).
>
>> return IRQ_HANDLED;
>> }
>>
>> -IIO_EVENT_SH(data_rdy_trig, &adis16400_data_rdy_trig_poll);
>> -
>> static IIO_TRIGGER_NAME_ATTR;
>>
>> static struct attribute *adis16400_trigger_attrs[] = {
>> @@ -49,22 +41,9 @@ static int adis16400_data_rdy_trigger_set_state(struct iio_trigger *trig,
>> {
>> struct adis16400_state *st = trig->private_data;
>> struct iio_dev *indio_dev = st->indio_dev;
>> - int ret = 0;
>>
>> dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
>> - ret = adis16400_set_irq(&st->indio_dev->dev, state);
>> - if (state == false) {
>> - iio_remove_event_from_list(&iio_event_data_rdy_trig,
>> - &indio_dev->interrupts[0]
>> - ->ev_list);
>> - /* possible quirk with handler currently worked around
>> - by ensuring the work queue is empty */
>> - flush_scheduled_work();
>> - } else {
>> - iio_add_event_to_list(&iio_event_data_rdy_trig,
>> - &indio_dev->interrupts[0]->ev_list);
>> - }
>> - return ret;
>> + return adis16400_set_irq(&st->indio_dev->dev, state);
>> }
>>
>> /**
>> @@ -85,12 +64,23 @@ int adis16400_probe_trigger(struct iio_dev *indio_dev)
>> struct adis16400_state *st = indio_dev->dev_data;
>>
>> st->trig = iio_allocate_trigger();
>> + if (st->trig == NULL) {
>> + ret = -ENOMEM;
>> + goto error_ret;
>> + }
>> + ret = request_irq(st->us->irq,
>> + adis16400_data_rdy_trig_poll,
>> + IRQF_TRIGGER_RISING,
>> + "adis16400",
>> + st->trig);
>>
>
> threaded_irq with IRQF_ONESHOT?
>
>> + if (ret)
>> + goto error_free_trig;
>> st->trig->name = kasprintf(GFP_KERNEL,
>> "adis16400-dev%d",
>> indio_dev->id);
>> if (!st->trig->name) {
>> ret = -ENOMEM;
>> - goto error_free_trig;
>> + goto error_free_irq;
>> }
>> st->trig->dev.parent = &st->us->dev;
>> st->trig->owner = THIS_MODULE;
>> @@ -109,9 +99,11 @@ int adis16400_probe_trigger(struct iio_dev *indio_dev)
>>
>> error_free_trig_name:
>> kfree(st->trig->name);
>> +error_free_irq:
>> + free_irq(st->us->irq, st->trig);
>> error_free_trig:
>> iio_free_trigger(st->trig);
>> -
>> +error_ret:
>> return ret;
>> }
>>
>> @@ -121,5 +113,6 @@ void adis16400_remove_trigger(struct iio_dev *indio_dev)
>>
>> iio_trigger_unregister(state->trig);
>> kfree(state->trig->name);
>> + free_irq(state->us->irq, state->trig);
>> iio_free_trigger(state->trig);
>> }
>>
>
>
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH 05/12] staging:iio:adis16400 replace unnecessary event line registration.
2011-04-13 14:45 ` Jonathan Cameron
@ 2011-04-17 18:41 ` Jonathan Cameron
2011-04-18 7:16 ` Hennerich, Michael
0 siblings, 1 reply; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-17 18:41 UTC (permalink / raw)
To: Jonathan Cameron; +Cc: michael.hennerich, linux-iio@vger.kernel.org
Hi Michael,
Did my reply answer your question such that you don't mind me sending
these (well rebased version anyway) on to Greg?
I'm really not liking my 100 patch queue :(
> ...
>>> iio_device_unregister(indio_dev);
>>> diff --git a/drivers/staging/iio/imu/adis16400_trigger.c b/drivers/staging/iio/imu/adis16400_trigger.c
>>> index 36b5ff5..afa5e74 100644
>>> --- a/drivers/staging/iio/imu/adis16400_trigger.c
>>> +++ b/drivers/staging/iio/imu/adis16400_trigger.c
>>> @@ -15,21 +15,13 @@
>>> /**
>>> * adis16400_data_rdy_trig_poll() the event handler for the data rdy trig
>>> **/
>>> -static int adis16400_data_rdy_trig_poll(struct iio_dev *dev_info,
>>> - int index,
>>> - s64 timestamp,
>>> - int no_test)
>>> +static irqreturn_t adis16400_data_rdy_trig_poll(int irq, void *private)
>>> {
>>> - struct adis16400_state *st = iio_dev_get_devdata(dev_info);
>>> - struct iio_trigger *trig = st->trig;
>>> -
>>> - iio_trigger_poll(trig, timestamp);
>>> -
>>> + disable_irq_nosync(irq);
>>> + iio_trigger_poll(private, iio_get_time_ns());
>>>
>> Is it save to call iio_trigger_poll() from the Top Half Hard-IRQ?
>> Instead of disable/enable irq shouldn't this be better a threaded_irq
>> with IRQF_ONESHOT?
> Yes. Actually after conversion to irq chips this is precisely what you
> want to do. If you call it as threaded_irq with oneshot enabled,
> then the triggered devices can't have top halves. That only really
> matters if you either want a timestamp or you want to flip a gpio
> to trigger the actual sampling. Note we can't do top halves at all
> for software triggers. How to handle this is a corner I haven't cleaned
> up yet.
>
> When we switch over to that approach you don't disable this irq at all.
> Rather you have the trigger_consumer as a threaded_irq with
> IRQF_ONESHOT set. That serializes reads from the device and writing
> to the buffer implementation. It's this serialization that motivates
> the disabling of irq's here.
>
> Having said that, the reason it is like this here, is that it
> replicates what was previously happening. Without the hardware
> I don't want to mess with it too much + most of this code is
> going to go away shortly anyway!
>
> To illustrate, take a look at accel/lis3l02dq (bit of a weird case)
> or imu/adis16400 (untested right now) in
> http://git.kernel.org/?p=linux/kernel/git/jic23/iio-onwards.git
> in a few mins (just pushed).
>
> Ripping out the relevant bits...
>
> from adis16400_trigger.c
>
> static irqreturn_t adis16400_data_rdy_trig_poll(int irq, void *private)
> {
> iio_trigger_poll(private, iio_get_time_ns());
> return IRQ_HANDLED;
> }
>
> int adis16400_probe_trigger(struct iio_dev *indio_dev)
> {
> ...
> ret = request_irq(st->us->irq,
> adis16400_data_rdy_trig_poll,
> IRQF_TRIGGER_RISING,
> "adis16400",
> st->trig);
> ...
> }
>
> from adis16400_ring.c
>
> static irqreturn_t adis16400_trigger_handler(int irq, void *p)
> {
> struct iio_poll_func *pf = p;
> struct iio_dev *indio_dev = pf->private_data;
> struct adis16400_state *st = iio_dev_get_devdata(indio_dev);
>
> ... do stuff...
>
> iio_trigger_notify_done(st->indio_dev->trig);
> ... clean up ...
> return IRQ_HANDLED;
> }
>
> int adis16400_configure_ring(struct iio_dev *indio_dev)
> {
> ...
> indio_dev->pollfunc->private_data = indio_dev;
> indio_dev->pollfunc->h = &iio_pollfunc_store_time;
> indio_dev->pollfunc->thread = &adis16400_trigger_handler;
> indio_dev->pollfunc->type = IRQF_ONESHOT;
> indio_dev->pollfunc->name =
> kasprintf(GFP_KERNEL, "adis16400_consumer%d", indio_dev->id);
>
> ...
> }
>
> Sometimes some fiddling is needed in the reenable for the interrupt to make sure
> we don't get stuck with it high (for interrupts that don't clear unless a read
> occurs - see lis3l02dq).
>
>>
>>> return IRQ_HANDLED;
>>> }
>>>
>>> -IIO_EVENT_SH(data_rdy_trig, &adis16400_data_rdy_trig_poll);
>>> -
>>> static IIO_TRIGGER_NAME_ATTR;
>>>
>>> static struct attribute *adis16400_trigger_attrs[] = {
>>> @@ -49,22 +41,9 @@ static int adis16400_data_rdy_trigger_set_state(struct iio_trigger *trig,
>>> {
>>> struct adis16400_state *st = trig->private_data;
>>> struct iio_dev *indio_dev = st->indio_dev;
>>> - int ret = 0;
>>>
>>> dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
>>> - ret = adis16400_set_irq(&st->indio_dev->dev, state);
>>> - if (state == false) {
>>> - iio_remove_event_from_list(&iio_event_data_rdy_trig,
>>> - &indio_dev->interrupts[0]
>>> - ->ev_list);
>>> - /* possible quirk with handler currently worked around
>>> - by ensuring the work queue is empty */
>>> - flush_scheduled_work();
>>> - } else {
>>> - iio_add_event_to_list(&iio_event_data_rdy_trig,
>>> - &indio_dev->interrupts[0]->ev_list);
>>> - }
>>> - return ret;
>>> + return adis16400_set_irq(&st->indio_dev->dev, state);
>>> }
>>>
>>> /**
>>> @@ -85,12 +64,23 @@ int adis16400_probe_trigger(struct iio_dev *indio_dev)
>>> struct adis16400_state *st = indio_dev->dev_data;
>>>
>>> st->trig = iio_allocate_trigger();
>>> + if (st->trig == NULL) {
>>> + ret = -ENOMEM;
>>> + goto error_ret;
>>> + }
>>> + ret = request_irq(st->us->irq,
>>> + adis16400_data_rdy_trig_poll,
>>> + IRQF_TRIGGER_RISING,
>>> + "adis16400",
>>> + st->trig);
>>>
>>
>> threaded_irq with IRQF_ONESHOT?
>>
>>> + if (ret)
>>> + goto error_free_trig;
>>> st->trig->name = kasprintf(GFP_KERNEL,
>>> "adis16400-dev%d",
>>> indio_dev->id);
>>> if (!st->trig->name) {
>>> ret = -ENOMEM;
>>> - goto error_free_trig;
>>> + goto error_free_irq;
>>> }
>>> st->trig->dev.parent = &st->us->dev;
>>> st->trig->owner = THIS_MODULE;
>>> @@ -109,9 +99,11 @@ int adis16400_probe_trigger(struct iio_dev *indio_dev)
>>>
>>> error_free_trig_name:
>>> kfree(st->trig->name);
>>> +error_free_irq:
>>> + free_irq(st->us->irq, st->trig);
>>> error_free_trig:
>>> iio_free_trigger(st->trig);
>>> -
>>> +error_ret:
>>> return ret;
>>> }
>>>
>>> @@ -121,5 +113,6 @@ void adis16400_remove_trigger(struct iio_dev *indio_dev)
>>>
>>> iio_trigger_unregister(state->trig);
>>> kfree(state->trig->name);
>>> + free_irq(state->us->irq, state->trig);
>>> iio_free_trigger(state->trig);
>>> }
>>>
>>
>>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 18+ messages in thread* RE: [PATCH 05/12] staging:iio:adis16400 replace unnecessary event line registration.
2011-04-17 18:41 ` Jonathan Cameron
@ 2011-04-18 7:16 ` Hennerich, Michael
0 siblings, 0 replies; 18+ messages in thread
From: Hennerich, Michael @ 2011-04-18 7:16 UTC (permalink / raw)
To: Jonathan Cameron; +Cc: linux-iio@vger.kernel.org
Jonathan Cameron wrote on 2011-04-17:
> Hi Michael,
>
> Did my reply answer your question such that you don't mind me sending
> these (well rebased version anyway) on to Greg?
Sure - it answered my question.
Acked-by: Michael Hennerich <michael.hennerich@analog.com>
>
> I'm really not liking my 100 patch queue :(
>> ...
>>>> iio_device_unregister(indio_dev); diff --git
>>>> a/drivers/staging/iio/imu/adis16400_trigger.c
>>>> b/drivers/staging/iio/imu/adis16400_trigger.c
>>>> index 36b5ff5..afa5e74 100644
>>>> --- a/drivers/staging/iio/imu/adis16400_trigger.c
>>>> +++ b/drivers/staging/iio/imu/adis16400_trigger.c
>>>> @@ -15,21 +15,13 @@
>>>> /**
>>>> * adis16400_data_rdy_trig_poll() the event handler for the data rdy
>>>> trig **/
>>>> -static int adis16400_data_rdy_trig_poll(struct iio_dev *dev_info,
>>>> - int index,
>>>> - s64 timestamp,
>>>> - int no_test)
>>>> +static irqreturn_t adis16400_data_rdy_trig_poll(int irq, void
>>>> +*private)
>>>> {
>>>> - struct adis16400_state *st = iio_dev_get_devdata(dev_info);
>>>> - struct iio_trigger *trig = st->trig;
>>>> -
>>>> - iio_trigger_poll(trig, timestamp);
>>>> -
>>>> + disable_irq_nosync(irq);
>>>> + iio_trigger_poll(private, iio_get_time_ns());
>>>>
>>> Is it save to call iio_trigger_poll() from the Top Half Hard-IRQ?
>>> Instead of disable/enable irq shouldn't this be better a threaded_irq
>>> with IRQF_ONESHOT?
>> Yes. Actually after conversion to irq chips this is precisely what you
>> want to do. If you call it as threaded_irq with oneshot enabled, then
>> the triggered devices can't have top halves. That only really matters
>> if you either want a timestamp or you want to flip a gpio to trigger
>> the actual sampling. Note we can't do top halves at all for software
>> triggers. How to handle this is a corner I haven't cleaned up yet.
>>
>> When we switch over to that approach you don't disable this irq at all.
>> Rather you have the trigger_consumer as a threaded_irq with
>> IRQF_ONESHOT set. That serializes reads from the device and writing to
>> the buffer implementation. It's this serialization that motivates the
>> disabling of irq's here.
>>
>> Having said that, the reason it is like this here, is that it
>> replicates what was previously happening. Without the hardware I don't
>> want to mess with it too much + most of this code is going to go away
>> shortly anyway!
>>
>> To illustrate, take a look at accel/lis3l02dq (bit of a weird case) or
>> imu/adis16400 (untested right now) in
>> http://git.kernel.org/?p=linux/kernel/git/jic23/iio-onwards.git in a
>> few mins (just pushed).
>>
>> Ripping out the relevant bits...
>>
>> from adis16400_trigger.c
>>
>> static irqreturn_t adis16400_data_rdy_trig_poll(int irq, void
>> *private) {
>> iio_trigger_poll(private, iio_get_time_ns());
>> return IRQ_HANDLED;
>> }
>>
>> int adis16400_probe_trigger(struct iio_dev *indio_dev) { ...
>> ret = request_irq(st->us->irq,
>> adis16400_data_rdy_trig_poll,
>> IRQF_TRIGGER_RISING,
>> "adis16400",
>> st->trig);
>> ...
>> }
>>
>> from adis16400_ring.c
>>
>> static irqreturn_t adis16400_trigger_handler(int irq, void *p) {
>> struct iio_poll_func *pf = p;
>> struct iio_dev *indio_dev = pf->private_data;
>> struct adis16400_state *st = iio_dev_get_devdata(indio_dev);
>>
>> ... do stuff...
>>
>> iio_trigger_notify_done(st->indio_dev->trig);
>> ... clean up ...
>> return IRQ_HANDLED;
>> }
>>
>> int adis16400_configure_ring(struct iio_dev *indio_dev) { ...
>> indio_dev->pollfunc->private_data = indio_dev;
>> indio_dev->pollfunc->h = &iio_pollfunc_store_time;
>> indio_dev->pollfunc->thread = &adis16400_trigger_handler;
>> indio_dev->pollfunc->type = IRQF_ONESHOT;
>> indio_dev->pollfunc->name =
>> kasprintf(GFP_KERNEL, "adis16400_consumer%d", indio_dev- id);
>>
>> ...
>> }
>>
>> Sometimes some fiddling is needed in the reenable for the interrupt to
>> make sure we don't get stuck with it high (for interrupts that don't
>> clear unless a read occurs - see lis3l02dq).
>>
>>>
>>>> return IRQ_HANDLED;
>>>> }
>>>> -IIO_EVENT_SH(data_rdy_trig, &adis16400_data_rdy_trig_poll);
>>>> -
>>>> static IIO_TRIGGER_NAME_ATTR;
>>>>
>>>> static struct attribute *adis16400_trigger_attrs[] = { @@ -49,22
>>>> +41,9 @@ static int adis16400_data_rdy_trigger_set_state(struct
>>>> iio_trigger *trig, {
>>>> struct adis16400_state *st = trig->private_data;
>>>> struct iio_dev *indio_dev = st->indio_dev;
>>>> - int ret = 0;
>>>>
>>>> dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
>>>> - ret = adis16400_set_irq(&st->indio_dev->dev, state);
>>>> - if (state == false) {
>>>> - iio_remove_event_from_list(&iio_event_data_rdy_trig,
>>>> - &indio_dev->interrupts[0]
>>>> - ->ev_list);
>>>> - /* possible quirk with handler currently worked around
>>>> - by ensuring the work queue is empty */
>>>> - flush_scheduled_work();
>>>> - } else {
>>>> - iio_add_event_to_list(&iio_event_data_rdy_trig,
>>>> - &indio_dev->interrupts[0]->ev_list);
>>>> - }
>>>> - return ret;
>>>> + return adis16400_set_irq(&st->indio_dev->dev, state);
>>>> }
>>>>
>>>> /**
>>>> @@ -85,12 +64,23 @@ int adis16400_probe_trigger(struct iio_dev
> *indio_dev)
>>>> struct adis16400_state *st = indio_dev->dev_data;
>>>>
>>>> st->trig = iio_allocate_trigger();
>>>> + if (st->trig == NULL) {
>>>> + ret = -ENOMEM;
>>>> + goto error_ret;
>>>> + }
>>>> + ret = request_irq(st->us->irq,
>>>> + adis16400_data_rdy_trig_poll,
>>>> + IRQF_TRIGGER_RISING,
>>>> + "adis16400",
>>>> + st->trig);
>>>>
>>>
>>> threaded_irq with IRQF_ONESHOT?
>>>
>>>> + if (ret)
>>>> + goto error_free_trig;
>>>> st->trig->name = kasprintf(GFP_KERNEL,
>>>> "adis16400-dev%d",
>>>> indio_dev->id);
>>>> if (!st->trig->name) {
>>>> ret = -ENOMEM;
>>>> - goto error_free_trig;
>>>> + goto error_free_irq;
>>>> }
>>>> st->trig->dev.parent = &st->us->dev;
>>>> st->trig->owner = THIS_MODULE;
>>>> @@ -109,9 +99,11 @@ int adis16400_probe_trigger(struct iio_dev
>>>> *indio_dev)
>>>>
>>>> error_free_trig_name:
>>>> kfree(st->trig->name);
>>>> +error_free_irq:
>>>> + free_irq(st->us->irq, st->trig);
>>>> error_free_trig:
>>>> iio_free_trigger(st->trig);
>>>> -
>>>> +error_ret:
>>>> return ret;
>>>> }
>>>> @@ -121,5 +113,6 @@ void adis16400_remove_trigger(struct iio_dev
>>>> *indio_dev)
>>>>
>>>> iio_trigger_unregister(state->trig); kfree(state->trig->name);
>>>> + free_irq(state->us->irq, state->trig);
>>>> iio_free_trigger(state->trig); }
>>>
>>>
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-iio"
>> in the body of a message to majordomo@vger.kernel.org More majordomo
>> info at http://vger.kernel.org/majordomo-info.html
>>
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] 18+ messages in thread
* [PATCH 06/12] staging:iio:adis16260 replace unnecessary event line registration.
2011-04-13 13:42 [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
` (4 preceding siblings ...)
2011-04-13 13:43 ` [PATCH 05/12] staging:iio:adis16400 " Jonathan Cameron
@ 2011-04-13 13:43 ` Jonathan Cameron
2011-04-13 13:43 ` [PATCH 07/12] staging:iio:adis16203 " Jonathan Cameron
` (6 subsequent siblings)
12 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-13 13:43 UTC (permalink / raw)
To: linux-iio; +Cc: Michael.Hennerich, Jonathan Cameron
Whilst the adis16260 does indeed support events, currently the driver
does not. The trigger code should never use that infrastructure.
Untested
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/gyro/adis16260_core.c | 25 +-------------
drivers/staging/iio/gyro/adis16260_trigger.c | 46 ++++++++++++--------------
2 files changed, 22 insertions(+), 49 deletions(-)
diff --git a/drivers/staging/iio/gyro/adis16260_core.c b/drivers/staging/iio/gyro/adis16260_core.c
index 26e3af4..a50b645 100644
--- a/drivers/staging/iio/gyro/adis16260_core.c
+++ b/drivers/staging/iio/gyro/adis16260_core.c
@@ -507,14 +507,6 @@ static IIO_DEVICE_ATTR(sampling_frequency_available,
static IIO_CONST_ATTR_NAME("adis16260");
-static struct attribute *adis16260_event_attributes[] = {
- NULL
-};
-
-static struct attribute_group adis16260_event_attribute_group = {
- .attrs = adis16260_event_attributes,
-};
-
#define ADIS16260_GYRO_ATTR_SET(axis) \
IIO_DEV_ATTR_GYRO##axis(adis16260_read_14bit_signed, \
ADIS16260_GYRO_OUT); \
@@ -603,8 +595,6 @@ static int __devinit adis16260_probe(struct spi_device *spi)
}
st->indio_dev->dev.parent = &spi->dev;
- st->indio_dev->num_interrupt_lines = 1;
- st->indio_dev->event_attrs = &adis16260_event_attribute_group;
if (pd && pd->direction)
switch (pd->direction) {
case 'x':
@@ -642,17 +632,9 @@ static int __devinit adis16260_probe(struct spi_device *spi)
}
if (spi->irq) {
- ret = iio_register_interrupt_line(spi->irq,
- st->indio_dev,
- 0,
- IRQF_TRIGGER_RISING,
- "adis16260");
- if (ret)
- goto error_uninitialize_ring;
-
ret = adis16260_probe_trigger(st->indio_dev);
if (ret)
- goto error_unregister_line;
+ goto error_uninitialize_ring;
}
/* Get the device into a sane initial state */
@@ -663,9 +645,6 @@ static int __devinit adis16260_probe(struct spi_device *spi)
error_remove_trigger:
adis16260_remove_trigger(st->indio_dev);
-error_unregister_line:
- if (spi->irq)
- iio_unregister_interrupt_line(st->indio_dev, 0);
error_uninitialize_ring:
iio_ring_buffer_unregister(st->indio_dev->ring);
error_unreg_ring_funcs:
@@ -698,8 +677,6 @@ static int adis16260_remove(struct spi_device *spi)
flush_scheduled_work();
adis16260_remove_trigger(indio_dev);
- if (spi->irq)
- iio_unregister_interrupt_line(indio_dev, 0);
iio_ring_buffer_unregister(st->indio_dev->ring);
iio_device_unregister(indio_dev);
diff --git a/drivers/staging/iio/gyro/adis16260_trigger.c b/drivers/staging/iio/gyro/adis16260_trigger.c
index 4a744c1..5eb3038 100644
--- a/drivers/staging/iio/gyro/adis16260_trigger.c
+++ b/drivers/staging/iio/gyro/adis16260_trigger.c
@@ -15,21 +15,13 @@
/**
* adis16260_data_rdy_trig_poll() the event handler for the data rdy trig
**/
-static int adis16260_data_rdy_trig_poll(struct iio_dev *dev_info,
- int index,
- s64 timestamp,
- int no_test)
+static irqreturn_t adis16260_data_rdy_trig_poll(int irq, void *private)
{
- struct adis16260_state *st = iio_dev_get_devdata(dev_info);
- struct iio_trigger *trig = st->trig;
-
- iio_trigger_poll(trig, timestamp);
-
+ disable_irq_nosync(irq);
+ iio_trigger_poll(private, iio_get_time_ns());
return IRQ_HANDLED;
}
-IIO_EVENT_SH(data_rdy_trig, &adis16260_data_rdy_trig_poll);
-
static IIO_TRIGGER_NAME_ATTR;
static struct attribute *adis16260_trigger_attrs[] = {
@@ -49,20 +41,9 @@ static int adis16260_data_rdy_trigger_set_state(struct iio_trigger *trig,
{
struct adis16260_state *st = trig->private_data;
struct iio_dev *indio_dev = st->indio_dev;
- int ret = 0;
dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
- ret = adis16260_set_irq(&st->indio_dev->dev, state);
- if (state == false) {
- iio_remove_event_from_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]
- ->ev_list);
- flush_scheduled_work();
- } else {
- iio_add_event_to_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]->ev_list);
- }
- return ret;
+ return adis16260_set_irq(&st->indio_dev->dev, state);
}
/**
@@ -82,12 +63,24 @@ int adis16260_probe_trigger(struct iio_dev *indio_dev)
struct adis16260_state *st = indio_dev->dev_data;
st->trig = iio_allocate_trigger();
+ if (st->trig == NULL) {
+ ret = -ENOMEM;
+ goto error_ret;
+ }
+ ret = request_irq(st->us->irq,
+ adis16260_data_rdy_trig_poll,
+ IRQF_TRIGGER_RISING,
+ "adis16260",
+ st->trig);
+ if (ret)
+ goto error_free_trig;
+
st->trig->name = kasprintf(GFP_KERNEL,
"adis16260-dev%d",
indio_dev->id);
if (!st->trig->name) {
ret = -ENOMEM;
- goto error_free_trig;
+ goto error_free_irq;
}
st->trig->dev.parent = &st->us->dev;
st->trig->owner = THIS_MODULE;
@@ -106,9 +99,11 @@ int adis16260_probe_trigger(struct iio_dev *indio_dev)
error_free_trig_name:
kfree(st->trig->name);
+error_free_irq:
+ free_irq(st->us->irq, st->trig);
error_free_trig:
iio_free_trigger(st->trig);
-
+error_ret:
return ret;
}
@@ -118,5 +113,6 @@ void adis16260_remove_trigger(struct iio_dev *indio_dev)
iio_trigger_unregister(state->trig);
kfree(state->trig->name);
+ free_irq(state->us->irq, state->trig);
iio_free_trigger(state->trig);
}
--
1.7.3.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH 07/12] staging:iio:adis16203 replace unnecessary event line registration.
2011-04-13 13:42 [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
` (5 preceding siblings ...)
2011-04-13 13:43 ` [PATCH 06/12] staging:iio:adis16260 " Jonathan Cameron
@ 2011-04-13 13:43 ` Jonathan Cameron
2011-04-13 13:43 ` [PATCH 08/12] staging:iio:adis16204 " Jonathan Cameron
` (5 subsequent siblings)
12 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-13 13:43 UTC (permalink / raw)
To: linux-iio; +Cc: Michael.Hennerich, Jonathan Cameron
Whilst the adis16203 does indeed support events, currently the driver
does not. The trigger code should never use that infrastructure.
Untested
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/accel/adis16203_core.c | 26 +-------------
drivers/staging/iio/accel/adis16203_trigger.c | 46 +++++++++++-------------
2 files changed, 22 insertions(+), 50 deletions(-)
diff --git a/drivers/staging/iio/accel/adis16203_core.c b/drivers/staging/iio/accel/adis16203_core.c
index e5a2a47..4043a97 100644
--- a/drivers/staging/iio/accel/adis16203_core.c
+++ b/drivers/staging/iio/accel/adis16203_core.c
@@ -394,14 +394,6 @@ static IIO_DEVICE_ATTR(reset, S_IWUSR, NULL, adis16203_write_reset, 0);
static IIO_CONST_ATTR(name, "adis16203");
-static struct attribute *adis16203_event_attributes[] = {
- NULL
-};
-
-static struct attribute_group adis16203_event_attribute_group = {
- .attrs = adis16203_event_attributes,
-};
-
static struct attribute *adis16203_attributes[] = {
&iio_dev_attr_in0_supply_raw.dev_attr.attr,
&iio_const_attr_in0_supply_scale.dev_attr.attr,
@@ -455,8 +447,6 @@ static int __devinit adis16203_probe(struct spi_device *spi)
}
st->indio_dev->dev.parent = &spi->dev;
- st->indio_dev->num_interrupt_lines = 1;
- st->indio_dev->event_attrs = &adis16203_event_attribute_group;
st->indio_dev->attrs = &adis16203_attribute_group;
st->indio_dev->dev_data = (void *)(st);
st->indio_dev->driver_module = THIS_MODULE;
@@ -478,17 +468,9 @@ static int __devinit adis16203_probe(struct spi_device *spi)
}
if (spi->irq) {
- ret = iio_register_interrupt_line(spi->irq,
- st->indio_dev,
- 0,
- IRQF_TRIGGER_RISING,
- "adis16203");
- if (ret)
- goto error_uninitialize_ring;
-
ret = adis16203_probe_trigger(st->indio_dev);
if (ret)
- goto error_unregister_line;
+ goto error_uninitialize_ring;
}
/* Get the device into a sane initial state */
@@ -499,9 +481,6 @@ static int __devinit adis16203_probe(struct spi_device *spi)
error_remove_trigger:
adis16203_remove_trigger(st->indio_dev);
-error_unregister_line:
- if (spi->irq)
- iio_unregister_interrupt_line(st->indio_dev, 0);
error_uninitialize_ring:
adis16203_uninitialize_ring(st->indio_dev->ring);
error_unreg_ring_funcs:
@@ -529,9 +508,6 @@ static int adis16203_remove(struct spi_device *spi)
flush_scheduled_work();
adis16203_remove_trigger(indio_dev);
- if (spi->irq)
- iio_unregister_interrupt_line(indio_dev, 0);
-
adis16203_uninitialize_ring(indio_dev->ring);
iio_device_unregister(indio_dev);
adis16203_unconfigure_ring(indio_dev);
diff --git a/drivers/staging/iio/accel/adis16203_trigger.c b/drivers/staging/iio/accel/adis16203_trigger.c
index 50be51c..dbc75bd 100644
--- a/drivers/staging/iio/accel/adis16203_trigger.c
+++ b/drivers/staging/iio/accel/adis16203_trigger.c
@@ -15,21 +15,13 @@
/**
* adis16203_data_rdy_trig_poll() the event handler for the data rdy trig
**/
-static int adis16203_data_rdy_trig_poll(struct iio_dev *dev_info,
- int index,
- s64 timestamp,
- int no_test)
+static irqreturn_t adis16203_data_rdy_trig_poll(int irq, void *private)
{
- struct adis16203_state *st = iio_dev_get_devdata(dev_info);
- struct iio_trigger *trig = st->trig;
-
- iio_trigger_poll(trig, timestamp);
-
+ disable_irq_nosync(irq);
+ iio_trigger_poll(private, iio_get_time_ns());
return IRQ_HANDLED;
}
-IIO_EVENT_SH(data_rdy_trig, &adis16203_data_rdy_trig_poll);
-
static DEVICE_ATTR(name, S_IRUGO, iio_trigger_read_name, NULL);
static struct attribute *adis16203_trigger_attrs[] = {
@@ -49,20 +41,9 @@ static int adis16203_data_rdy_trigger_set_state(struct iio_trigger *trig,
{
struct adis16203_state *st = trig->private_data;
struct iio_dev *indio_dev = st->indio_dev;
- int ret = 0;
dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
- ret = adis16203_set_irq(&st->indio_dev->dev, state);
- if (state == false) {
- iio_remove_event_from_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]
- ->ev_list);
- flush_scheduled_work();
- } else {
- iio_add_event_to_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]->ev_list);
- }
- return ret;
+ return adis16203_set_irq(&st->indio_dev->dev, state);
}
/**
@@ -82,12 +63,24 @@ int adis16203_probe_trigger(struct iio_dev *indio_dev)
struct adis16203_state *st = indio_dev->dev_data;
st->trig = iio_allocate_trigger();
+ if (st->trig == NULL) {
+ ret = -ENOMEM;
+ goto error_ret;
+ }
+
+ ret = request_irq(st->us->irq,
+ adis16203_data_rdy_trig_poll,
+ IRQF_TRIGGER_RISING,
+ "adis16203",
+ st->trig);
+ if (ret)
+ goto error_free_trig;
st->trig->name = kasprintf(GFP_KERNEL,
"adis16203-dev%d",
indio_dev->id);
if (!st->trig->name) {
ret = -ENOMEM;
- goto error_free_trig;
+ goto error_free_irq;
}
st->trig->dev.parent = &st->us->dev;
st->trig->owner = THIS_MODULE;
@@ -106,9 +99,11 @@ int adis16203_probe_trigger(struct iio_dev *indio_dev)
error_free_trig_name:
kfree(st->trig->name);
+error_free_irq:
+ free_irq(st->us->irq, st->trig);
error_free_trig:
iio_free_trigger(st->trig);
-
+error_ret:
return ret;
}
@@ -118,5 +113,6 @@ void adis16203_remove_trigger(struct iio_dev *indio_dev)
iio_trigger_unregister(state->trig);
kfree(state->trig->name);
+ free_irq(state->us->irq, state->trig);
iio_free_trigger(state->trig);
}
--
1.7.3.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH 08/12] staging:iio:adis16204 replace unnecessary event line registration.
2011-04-13 13:42 [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
` (6 preceding siblings ...)
2011-04-13 13:43 ` [PATCH 07/12] staging:iio:adis16203 " Jonathan Cameron
@ 2011-04-13 13:43 ` Jonathan Cameron
2011-04-13 13:43 ` [PATCH 09/12] staging:iio:adis16201 " Jonathan Cameron
` (4 subsequent siblings)
12 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-13 13:43 UTC (permalink / raw)
To: linux-iio; +Cc: Michael.Hennerich, Jonathan Cameron
Whilst the adis16204 does indeed support events, currently the driver
does not. The trigger code should never use that infrastructure.
Untested
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/accel/adis16204_core.c | 26 +-------------
drivers/staging/iio/accel/adis16204_trigger.c | 46 +++++++++++-------------
2 files changed, 22 insertions(+), 50 deletions(-)
diff --git a/drivers/staging/iio/accel/adis16204_core.c b/drivers/staging/iio/accel/adis16204_core.c
index 97376aa..fe44b25 100644
--- a/drivers/staging/iio/accel/adis16204_core.c
+++ b/drivers/staging/iio/accel/adis16204_core.c
@@ -432,14 +432,6 @@ static IIO_DEVICE_ATTR(reset, S_IWUSR, NULL, adis16204_write_reset, 0);
static IIO_CONST_ATTR(name, "adis16204");
-static struct attribute *adis16204_event_attributes[] = {
- NULL
-};
-
-static struct attribute_group adis16204_event_attribute_group = {
- .attrs = adis16204_event_attributes,
-};
-
static struct attribute *adis16204_attributes[] = {
&iio_dev_attr_in0_supply_raw.dev_attr.attr,
&iio_const_attr_in0_supply_scale.dev_attr.attr,
@@ -500,8 +492,6 @@ static int __devinit adis16204_probe(struct spi_device *spi)
}
st->indio_dev->dev.parent = &spi->dev;
- st->indio_dev->num_interrupt_lines = 1;
- st->indio_dev->event_attrs = &adis16204_event_attribute_group;
st->indio_dev->attrs = &adis16204_attribute_group;
st->indio_dev->dev_data = (void *)(st);
st->indio_dev->driver_module = THIS_MODULE;
@@ -523,17 +513,9 @@ static int __devinit adis16204_probe(struct spi_device *spi)
}
if (spi->irq) {
- ret = iio_register_interrupt_line(spi->irq,
- st->indio_dev,
- 0,
- IRQF_TRIGGER_RISING,
- "adis16204");
- if (ret)
- goto error_uninitialize_ring;
-
ret = adis16204_probe_trigger(st->indio_dev);
if (ret)
- goto error_unregister_line;
+ goto error_uninitialize_ring;
}
/* Get the device into a sane initial state */
@@ -544,9 +526,6 @@ static int __devinit adis16204_probe(struct spi_device *spi)
error_remove_trigger:
adis16204_remove_trigger(st->indio_dev);
-error_unregister_line:
- if (spi->irq)
- iio_unregister_interrupt_line(st->indio_dev, 0);
error_uninitialize_ring:
adis16204_uninitialize_ring(st->indio_dev->ring);
error_unreg_ring_funcs:
@@ -574,9 +553,6 @@ static int adis16204_remove(struct spi_device *spi)
flush_scheduled_work();
adis16204_remove_trigger(indio_dev);
- if (spi->irq)
- iio_unregister_interrupt_line(indio_dev, 0);
-
adis16204_uninitialize_ring(indio_dev->ring);
iio_device_unregister(indio_dev);
adis16204_unconfigure_ring(indio_dev);
diff --git a/drivers/staging/iio/accel/adis16204_trigger.c b/drivers/staging/iio/accel/adis16204_trigger.c
index 8e9db90..c1dcb94 100644
--- a/drivers/staging/iio/accel/adis16204_trigger.c
+++ b/drivers/staging/iio/accel/adis16204_trigger.c
@@ -15,21 +15,13 @@
/**
* adis16204_data_rdy_trig_poll() the event handler for the data rdy trig
**/
-static int adis16204_data_rdy_trig_poll(struct iio_dev *dev_info,
- int index,
- s64 timestamp,
- int no_test)
+static irqreturn_t adis16204_data_rdy_trig_poll(int irq, void *private)
{
- struct adis16204_state *st = iio_dev_get_devdata(dev_info);
- struct iio_trigger *trig = st->trig;
-
- iio_trigger_poll(trig, timestamp);
-
+ disable_irq_nosync(irq);
+ iio_trigger_poll(private, iio_get_time_ns());
return IRQ_HANDLED;
}
-IIO_EVENT_SH(data_rdy_trig, &adis16204_data_rdy_trig_poll);
-
static DEVICE_ATTR(name, S_IRUGO, iio_trigger_read_name, NULL);
static struct attribute *adis16204_trigger_attrs[] = {
@@ -49,20 +41,9 @@ static int adis16204_data_rdy_trigger_set_state(struct iio_trigger *trig,
{
struct adis16204_state *st = trig->private_data;
struct iio_dev *indio_dev = st->indio_dev;
- int ret = 0;
dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
- ret = adis16204_set_irq(&st->indio_dev->dev, state);
- if (state == false) {
- iio_remove_event_from_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]
- ->ev_list);
- flush_scheduled_work();
- } else {
- iio_add_event_to_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]->ev_list);
- }
- return ret;
+ return adis16204_set_irq(&st->indio_dev->dev, state);
}
/**
@@ -82,12 +63,24 @@ int adis16204_probe_trigger(struct iio_dev *indio_dev)
struct adis16204_state *st = indio_dev->dev_data;
st->trig = iio_allocate_trigger();
+ if (st->trig == NULL) {
+ ret = -ENOMEM;
+ goto error_ret;
+ }
+ ret = request_irq(st->us->irq,
+ adis16204_data_rdy_trig_poll,
+ IRQF_TRIGGER_RISING,
+ "adis16204",
+ st->trig);
+ if (ret)
+ goto error_free_trig;
+
st->trig->name = kasprintf(GFP_KERNEL,
"adis16204-dev%d",
indio_dev->id);
if (!st->trig->name) {
ret = -ENOMEM;
- goto error_free_trig;
+ goto error_free_irq;
}
st->trig->dev.parent = &st->us->dev;
st->trig->owner = THIS_MODULE;
@@ -106,9 +99,11 @@ int adis16204_probe_trigger(struct iio_dev *indio_dev)
error_free_trig_name:
kfree(st->trig->name);
+error_free_irq:
+ free_irq(st->us->irq, st->trig);
error_free_trig:
iio_free_trigger(st->trig);
-
+error_ret:
return ret;
}
@@ -118,5 +113,6 @@ void adis16204_remove_trigger(struct iio_dev *indio_dev)
iio_trigger_unregister(state->trig);
kfree(state->trig->name);
+ free_irq(state->us->irq, state->trig);
iio_free_trigger(state->trig);
}
--
1.7.3.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH 09/12] staging:iio:adis16201 replace unnecessary event line registration.
2011-04-13 13:42 [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
` (7 preceding siblings ...)
2011-04-13 13:43 ` [PATCH 08/12] staging:iio:adis16204 " Jonathan Cameron
@ 2011-04-13 13:43 ` Jonathan Cameron
2011-04-13 13:43 ` [PATCH 10/12] staging:iio:adis16240 " Jonathan Cameron
` (3 subsequent siblings)
12 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-13 13:43 UTC (permalink / raw)
To: linux-iio; +Cc: Michael.Hennerich, Jonathan Cameron
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/accel/adis16201_core.c | 26 +--------------
drivers/staging/iio/accel/adis16201_trigger.c | 45 +++++++++++--------------
2 files changed, 21 insertions(+), 50 deletions(-)
diff --git a/drivers/staging/iio/accel/adis16201_core.c b/drivers/staging/iio/accel/adis16201_core.c
index df1101c..08e42f4 100644
--- a/drivers/staging/iio/accel/adis16201_core.c
+++ b/drivers/staging/iio/accel/adis16201_core.c
@@ -479,14 +479,6 @@ static IIO_DEVICE_ATTR(reset, S_IWUSR, NULL, adis16201_write_reset, 0);
static IIO_CONST_ATTR(name, "adis16201");
-static struct attribute *adis16201_event_attributes[] = {
- NULL
-};
-
-static struct attribute_group adis16201_event_attribute_group = {
- .attrs = adis16201_event_attributes,
-};
-
static struct attribute *adis16201_attributes[] = {
&iio_dev_attr_in0_supply_raw.dev_attr.attr,
&iio_const_attr_in0_supply_scale.dev_attr.attr,
@@ -546,8 +538,6 @@ static int __devinit adis16201_probe(struct spi_device *spi)
}
st->indio_dev->dev.parent = &spi->dev;
- st->indio_dev->num_interrupt_lines = 1;
- st->indio_dev->event_attrs = &adis16201_event_attribute_group;
st->indio_dev->attrs = &adis16201_attribute_group;
st->indio_dev->dev_data = (void *)(st);
st->indio_dev->driver_module = THIS_MODULE;
@@ -569,17 +559,9 @@ static int __devinit adis16201_probe(struct spi_device *spi)
}
if (spi->irq) {
- ret = iio_register_interrupt_line(spi->irq,
- st->indio_dev,
- 0,
- IRQF_TRIGGER_RISING,
- "adis16201");
- if (ret)
- goto error_uninitialize_ring;
-
ret = adis16201_probe_trigger(st->indio_dev);
if (ret)
- goto error_unregister_line;
+ goto error_uninitialize_ring;
}
/* Get the device into a sane initial state */
@@ -590,9 +572,6 @@ static int __devinit adis16201_probe(struct spi_device *spi)
error_remove_trigger:
adis16201_remove_trigger(st->indio_dev);
-error_unregister_line:
- if (spi->irq)
- iio_unregister_interrupt_line(st->indio_dev, 0);
error_uninitialize_ring:
adis16201_uninitialize_ring(st->indio_dev->ring);
error_unreg_ring_funcs:
@@ -620,9 +599,6 @@ static int adis16201_remove(struct spi_device *spi)
flush_scheduled_work();
adis16201_remove_trigger(indio_dev);
- if (spi->irq)
- iio_unregister_interrupt_line(indio_dev, 0);
-
adis16201_uninitialize_ring(indio_dev->ring);
iio_device_unregister(indio_dev);
adis16201_unconfigure_ring(indio_dev);
diff --git a/drivers/staging/iio/accel/adis16201_trigger.c b/drivers/staging/iio/accel/adis16201_trigger.c
index 8a9cea19..8a48bdd 100644
--- a/drivers/staging/iio/accel/adis16201_trigger.c
+++ b/drivers/staging/iio/accel/adis16201_trigger.c
@@ -15,21 +15,13 @@
/**
* adis16201_data_rdy_trig_poll() the event handler for the data rdy trig
**/
-static int adis16201_data_rdy_trig_poll(struct iio_dev *dev_info,
- int index,
- s64 timestamp,
- int no_test)
+static irqreturn_t adis16201_data_rdy_trig_poll(int irq, void *private)
{
- struct adis16201_state *st = iio_dev_get_devdata(dev_info);
- struct iio_trigger *trig = st->trig;
-
- iio_trigger_poll(trig, timestamp);
-
+ disable_irq_nosync(irq);
+ iio_trigger_poll(private, iio_get_time_ns());
return IRQ_HANDLED;
}
-IIO_EVENT_SH(data_rdy_trig, &adis16201_data_rdy_trig_poll);
-
static DEVICE_ATTR(name, S_IRUGO, iio_trigger_read_name, NULL);
static struct attribute *adis16201_trigger_attrs[] = {
@@ -49,20 +41,9 @@ static int adis16201_data_rdy_trigger_set_state(struct iio_trigger *trig,
{
struct adis16201_state *st = trig->private_data;
struct iio_dev *indio_dev = st->indio_dev;
- int ret = 0;
dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
- ret = adis16201_set_irq(&st->indio_dev->dev, state);
- if (state == false) {
- iio_remove_event_from_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]
- ->ev_list);
- flush_scheduled_work();
- } else {
- iio_add_event_to_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]->ev_list);
- }
- return ret;
+ return adis16201_set_irq(&st->indio_dev->dev, state);
}
/**
@@ -82,12 +63,23 @@ int adis16201_probe_trigger(struct iio_dev *indio_dev)
struct adis16201_state *st = indio_dev->dev_data;
st->trig = iio_allocate_trigger();
+ if (st->trig == NULL) {
+ ret = -ENOMEM;
+ goto error_ret;
+ }
+ ret = request_irq(st->us->irq,
+ adis16201_data_rdy_trig_poll,
+ IRQF_TRIGGER_RISING,
+ "adis16201",
+ st->trig);
+ if (ret)
+ goto error_free_trig;
st->trig->name = kasprintf(GFP_KERNEL,
"adis16201-dev%d",
indio_dev->id);
if (!st->trig->name) {
ret = -ENOMEM;
- goto error_free_trig;
+ goto error_free_irq;
}
st->trig->dev.parent = &st->us->dev;
st->trig->owner = THIS_MODULE;
@@ -106,9 +98,11 @@ int adis16201_probe_trigger(struct iio_dev *indio_dev)
error_free_trig_name:
kfree(st->trig->name);
+error_free_irq:
+ free_irq(st->us->irq, st->trig);
error_free_trig:
iio_free_trigger(st->trig);
-
+error_ret:
return ret;
}
@@ -118,5 +112,6 @@ void adis16201_remove_trigger(struct iio_dev *indio_dev)
iio_trigger_unregister(state->trig);
kfree(state->trig->name);
+ free_irq(state->us->irq, state->trig);
iio_free_trigger(state->trig);
}
--
1.7.3.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH 10/12] staging:iio:adis16240 replace unnecessary event line registration.
2011-04-13 13:42 [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
` (8 preceding siblings ...)
2011-04-13 13:43 ` [PATCH 09/12] staging:iio:adis16201 " Jonathan Cameron
@ 2011-04-13 13:43 ` Jonathan Cameron
2011-04-13 13:43 ` [PATCH 11/12] staging:iio:adis16209 " Jonathan Cameron
` (2 subsequent siblings)
12 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-13 13:43 UTC (permalink / raw)
To: linux-iio; +Cc: Michael.Hennerich, Jonathan Cameron
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/accel/adis16240_core.c | 26 +-------------
drivers/staging/iio/accel/adis16240_trigger.c | 46 +++++++++++-------------
2 files changed, 22 insertions(+), 50 deletions(-)
diff --git a/drivers/staging/iio/accel/adis16240_core.c b/drivers/staging/iio/accel/adis16240_core.c
index 31f64ae..89ab810 100644
--- a/drivers/staging/iio/accel/adis16240_core.c
+++ b/drivers/staging/iio/accel/adis16240_core.c
@@ -424,14 +424,6 @@ static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("4096");
static IIO_CONST_ATTR_NAME("adis16240");
-static struct attribute *adis16240_event_attributes[] = {
- NULL
-};
-
-static struct attribute_group adis16240_event_attribute_group = {
- .attrs = adis16240_event_attributes,
-};
-
static struct attribute *adis16240_attributes[] = {
&iio_dev_attr_in0_supply_raw.dev_attr.attr,
&iio_const_attr_in0_supply_scale.dev_attr.attr,
@@ -492,8 +484,6 @@ static int __devinit adis16240_probe(struct spi_device *spi)
}
st->indio_dev->dev.parent = &spi->dev;
- st->indio_dev->num_interrupt_lines = 1;
- st->indio_dev->event_attrs = &adis16240_event_attribute_group;
st->indio_dev->attrs = &adis16240_attribute_group;
st->indio_dev->dev_data = (void *)(st);
st->indio_dev->driver_module = THIS_MODULE;
@@ -515,17 +505,9 @@ static int __devinit adis16240_probe(struct spi_device *spi)
}
if (spi->irq) {
- ret = iio_register_interrupt_line(spi->irq,
- st->indio_dev,
- 0,
- IRQF_TRIGGER_RISING,
- "adis16240");
- if (ret)
- goto error_uninitialize_ring;
-
ret = adis16240_probe_trigger(st->indio_dev);
if (ret)
- goto error_unregister_line;
+ goto error_uninitialize_ring;
}
/* Get the device into a sane initial state */
@@ -536,9 +518,6 @@ static int __devinit adis16240_probe(struct spi_device *spi)
error_remove_trigger:
adis16240_remove_trigger(st->indio_dev);
-error_unregister_line:
- if (spi->irq)
- iio_unregister_interrupt_line(st->indio_dev, 0);
error_uninitialize_ring:
iio_ring_buffer_unregister(st->indio_dev->ring);
error_unreg_ring_funcs:
@@ -566,9 +545,6 @@ static int adis16240_remove(struct spi_device *spi)
flush_scheduled_work();
adis16240_remove_trigger(indio_dev);
- if (spi->irq)
- iio_unregister_interrupt_line(indio_dev, 0);
-
iio_ring_buffer_unregister(indio_dev->ring);
iio_device_unregister(indio_dev);
adis16240_unconfigure_ring(indio_dev);
diff --git a/drivers/staging/iio/accel/adis16240_trigger.c b/drivers/staging/iio/accel/adis16240_trigger.c
index 6cb8681..c5a26ae 100644
--- a/drivers/staging/iio/accel/adis16240_trigger.c
+++ b/drivers/staging/iio/accel/adis16240_trigger.c
@@ -15,21 +15,13 @@
/**
* adis16240_data_rdy_trig_poll() the event handler for the data rdy trig
**/
-static int adis16240_data_rdy_trig_poll(struct iio_dev *dev_info,
- int index,
- s64 timestamp,
- int no_test)
+static irqreturn_t adis16240_data_rdy_trig_poll(int irq, void *trig)
{
- struct adis16240_state *st = iio_dev_get_devdata(dev_info);
- struct iio_trigger *trig = st->trig;
-
- iio_trigger_poll(trig, timestamp);
-
+ disable_irq_nosync(irq);
+ iio_trigger_poll(trig, iio_get_time_ns());
return IRQ_HANDLED;
}
-IIO_EVENT_SH(data_rdy_trig, &adis16240_data_rdy_trig_poll);
-
static IIO_TRIGGER_NAME_ATTR;
static struct attribute *adis16240_trigger_attrs[] = {
@@ -49,20 +41,9 @@ static int adis16240_data_rdy_trigger_set_state(struct iio_trigger *trig,
{
struct adis16240_state *st = trig->private_data;
struct iio_dev *indio_dev = st->indio_dev;
- int ret = 0;
dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
- ret = adis16240_set_irq(&st->indio_dev->dev, state);
- if (state == false) {
- iio_remove_event_from_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]
- ->ev_list);
- flush_scheduled_work();
- } else {
- iio_add_event_to_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]->ev_list);
- }
- return ret;
+ return adis16240_set_irq(&st->indio_dev->dev, state);
}
/**
@@ -82,12 +63,24 @@ int adis16240_probe_trigger(struct iio_dev *indio_dev)
struct adis16240_state *st = indio_dev->dev_data;
st->trig = iio_allocate_trigger();
+ if (st->trig == NULL) {
+ ret = -ENOMEM;
+ goto error_ret;
+ }
+ ret = request_irq(st->us->irq,
+ adis16240_data_rdy_trig_poll,
+ IRQF_TRIGGER_RISING,
+ "adis16240",
+ st->trig);
+ if (ret)
+ goto error_free_trig;
+
st->trig->name = kasprintf(GFP_KERNEL,
"adis16240-dev%d",
indio_dev->id);
if (!st->trig->name) {
ret = -ENOMEM;
- goto error_free_trig;
+ goto error_free_irq;
}
st->trig->dev.parent = &st->us->dev;
st->trig->owner = THIS_MODULE;
@@ -106,9 +99,11 @@ int adis16240_probe_trigger(struct iio_dev *indio_dev)
error_free_trig_name:
kfree(st->trig->name);
+error_free_irq:
+ free_irq(st->us->irq, st->trig);
error_free_trig:
iio_free_trigger(st->trig);
-
+error_ret:
return ret;
}
@@ -118,5 +113,6 @@ void adis16240_remove_trigger(struct iio_dev *indio_dev)
iio_trigger_unregister(state->trig);
kfree(state->trig->name);
+ free_irq(state->us->irq, state->trig);
iio_free_trigger(state->trig);
}
--
1.7.3.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH 11/12] staging:iio:adis16209 replace unnecessary event line registration.
2011-04-13 13:42 [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
` (9 preceding siblings ...)
2011-04-13 13:43 ` [PATCH 10/12] staging:iio:adis16240 " Jonathan Cameron
@ 2011-04-13 13:43 ` Jonathan Cameron
2011-04-13 13:43 ` [PATCH 12/12] staging:iio:ade7758 " Jonathan Cameron
2011-04-18 11:59 ` [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
12 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-13 13:43 UTC (permalink / raw)
To: linux-iio; +Cc: Michael.Hennerich, Jonathan Cameron
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/accel/adis16209_core.c | 26 +--------------
drivers/staging/iio/accel/adis16209_trigger.c | 45 +++++++++++--------------
2 files changed, 21 insertions(+), 50 deletions(-)
diff --git a/drivers/staging/iio/accel/adis16209_core.c b/drivers/staging/iio/accel/adis16209_core.c
index d2fb990..54b5bae 100644
--- a/drivers/staging/iio/accel/adis16209_core.c
+++ b/drivers/staging/iio/accel/adis16209_core.c
@@ -429,14 +429,6 @@ static IIO_DEVICE_ATTR(reset, S_IWUSR, NULL, adis16209_write_reset, 0);
static IIO_CONST_ATTR_NAME("adis16209");
-static struct attribute *adis16209_event_attributes[] = {
- NULL
-};
-
-static struct attribute_group adis16209_event_attribute_group = {
- .attrs = adis16209_event_attributes,
-};
-
static struct attribute *adis16209_attributes[] = {
&iio_dev_attr_in0_supply_raw.dev_attr.attr,
&iio_const_attr_in0_supply_scale.dev_attr.attr,
@@ -495,8 +487,6 @@ static int __devinit adis16209_probe(struct spi_device *spi)
}
st->indio_dev->dev.parent = &spi->dev;
- st->indio_dev->num_interrupt_lines = 1;
- st->indio_dev->event_attrs = &adis16209_event_attribute_group;
st->indio_dev->attrs = &adis16209_attribute_group;
st->indio_dev->dev_data = (void *)(st);
st->indio_dev->driver_module = THIS_MODULE;
@@ -518,17 +508,9 @@ static int __devinit adis16209_probe(struct spi_device *spi)
}
if (spi->irq) {
- ret = iio_register_interrupt_line(spi->irq,
- st->indio_dev,
- 0,
- IRQF_TRIGGER_RISING,
- "adis16209");
- if (ret)
- goto error_uninitialize_ring;
-
ret = adis16209_probe_trigger(st->indio_dev);
if (ret)
- goto error_unregister_line;
+ goto error_uninitialize_ring;
}
/* Get the device into a sane initial state */
@@ -539,9 +521,6 @@ static int __devinit adis16209_probe(struct spi_device *spi)
error_remove_trigger:
adis16209_remove_trigger(st->indio_dev);
-error_unregister_line:
- if (spi->irq)
- iio_unregister_interrupt_line(st->indio_dev, 0);
error_uninitialize_ring:
iio_ring_buffer_unregister(st->indio_dev->ring);
error_unreg_ring_funcs:
@@ -569,9 +548,6 @@ static int adis16209_remove(struct spi_device *spi)
flush_scheduled_work();
adis16209_remove_trigger(indio_dev);
- if (spi->irq)
- iio_unregister_interrupt_line(indio_dev, 0);
-
iio_ring_buffer_unregister(indio_dev->ring);
iio_device_unregister(indio_dev);
adis16209_unconfigure_ring(indio_dev);
diff --git a/drivers/staging/iio/accel/adis16209_trigger.c b/drivers/staging/iio/accel/adis16209_trigger.c
index d2980dc..488e482 100644
--- a/drivers/staging/iio/accel/adis16209_trigger.c
+++ b/drivers/staging/iio/accel/adis16209_trigger.c
@@ -15,21 +15,13 @@
/**
* adis16209_data_rdy_trig_poll() the event handler for the data rdy trig
**/
-static int adis16209_data_rdy_trig_poll(struct iio_dev *dev_info,
- int index,
- s64 timestamp,
- int no_test)
+static irqreturn_t adis16209_data_rdy_trig_poll(int irq, void *trig)
{
- struct adis16209_state *st = iio_dev_get_devdata(dev_info);
- struct iio_trigger *trig = st->trig;
-
- iio_trigger_poll(trig, timestamp);
-
+ disable_irq_nosync(irq);
+ iio_trigger_poll(trig, iio_get_time_ns());
return IRQ_HANDLED;
}
-IIO_EVENT_SH(data_rdy_trig, &adis16209_data_rdy_trig_poll);
-
static IIO_TRIGGER_NAME_ATTR;
static struct attribute *adis16209_trigger_attrs[] = {
@@ -49,20 +41,9 @@ static int adis16209_data_rdy_trigger_set_state(struct iio_trigger *trig,
{
struct adis16209_state *st = trig->private_data;
struct iio_dev *indio_dev = st->indio_dev;
- int ret = 0;
dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
- ret = adis16209_set_irq(&st->indio_dev->dev, state);
- if (state == false) {
- iio_remove_event_from_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]
- ->ev_list);
- flush_scheduled_work();
- } else {
- iio_add_event_to_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]->ev_list);
- }
- return ret;
+ return adis16209_set_irq(&st->indio_dev->dev, state);
}
/**
@@ -82,12 +63,23 @@ int adis16209_probe_trigger(struct iio_dev *indio_dev)
struct adis16209_state *st = indio_dev->dev_data;
st->trig = iio_allocate_trigger();
+ if (st->trig == NULL) {
+ ret = -ENOMEM;
+ goto error_ret;
+ }
+ ret = request_irq(st->us->irq,
+ adis16209_data_rdy_trig_poll,
+ IRQF_TRIGGER_RISING,
+ "adis16209",
+ st->trig);
+ if (ret)
+ goto error_free_trig;
st->trig->name = kasprintf(GFP_KERNEL,
"adis16209-dev%d",
indio_dev->id);
if (!st->trig->name) {
ret = -ENOMEM;
- goto error_free_trig;
+ goto error_free_irq;
}
st->trig->dev.parent = &st->us->dev;
st->trig->owner = THIS_MODULE;
@@ -106,9 +98,11 @@ int adis16209_probe_trigger(struct iio_dev *indio_dev)
error_free_trig_name:
kfree(st->trig->name);
+error_free_irq:
+ free_irq(st->us->irq, st->trig);
error_free_trig:
iio_free_trigger(st->trig);
-
+error_ret:
return ret;
}
@@ -118,5 +112,6 @@ void adis16209_remove_trigger(struct iio_dev *indio_dev)
iio_trigger_unregister(state->trig);
kfree(state->trig->name);
+ free_irq(state->us->irq, state->trig);
iio_free_trigger(state->trig);
}
--
1.7.3.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH 12/12] staging:iio:ade7758 replace unnecessary event line registration.
2011-04-13 13:42 [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
` (10 preceding siblings ...)
2011-04-13 13:43 ` [PATCH 11/12] staging:iio:adis16209 " Jonathan Cameron
@ 2011-04-13 13:43 ` Jonathan Cameron
2011-04-18 11:59 ` [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
12 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-13 13:43 UTC (permalink / raw)
To: linux-iio; +Cc: Michael.Hennerich, Jonathan Cameron
This was only used for triggering and hence should never have been
done this way in the first place. Needs to go prior to cleaning
out some of the registration functions.
Untested
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/meter/ade7758_core.c | 30 ++---------------
drivers/staging/iio/meter/ade7758_trigger.c | 48 ++++++++++++---------------
2 files changed, 24 insertions(+), 54 deletions(-)
diff --git a/drivers/staging/iio/meter/ade7758_core.c b/drivers/staging/iio/meter/ade7758_core.c
index 8d37ef7..cab31dd 100644
--- a/drivers/staging/iio/meter/ade7758_core.c
+++ b/drivers/staging/iio/meter/ade7758_core.c
@@ -23,7 +23,7 @@
#include "meter.h"
#include "ade7758.h"
-int ade7758_spi_write_reg_8(struct device *dev,
+static int ade7758_spi_write_reg_8(struct device *dev,
u8 reg_address,
u8 val)
{
@@ -292,7 +292,7 @@ error_ret:
return ret ? ret : len;
}
-int ade7758_reset(struct device *dev)
+static int ade7758_reset(struct device *dev)
{
int ret;
u8 val;
@@ -652,14 +652,6 @@ static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("26000 13000 65000 33000");
static IIO_CONST_ATTR(name, "ade7758");
-static struct attribute *ade7758_event_attributes[] = {
- NULL
-};
-
-static struct attribute_group ade7758_event_attribute_group = {
- .attrs = ade7758_event_attributes,
-};
-
static struct attribute *ade7758_attributes[] = {
&iio_dev_attr_temp_raw.dev_attr.attr,
&iio_const_attr_temp_offset.dev_attr.attr,
@@ -744,8 +736,6 @@ static int __devinit ade7758_probe(struct spi_device *spi)
}
st->indio_dev->dev.parent = &spi->dev;
- st->indio_dev->num_interrupt_lines = 1;
- st->indio_dev->event_attrs = &ade7758_event_attribute_group;
st->indio_dev->attrs = &ade7758_attribute_group;
st->indio_dev->dev_data = (void *)(st);
st->indio_dev->driver_module = THIS_MODULE;
@@ -767,17 +757,9 @@ static int __devinit ade7758_probe(struct spi_device *spi)
}
if (spi->irq) {
- ret = iio_register_interrupt_line(spi->irq,
- st->indio_dev,
- 0,
- IRQF_TRIGGER_FALLING,
- "ade7758");
- if (ret)
- goto error_uninitialize_ring;
-
ret = ade7758_probe_trigger(st->indio_dev);
if (ret)
- goto error_unregister_line;
+ goto error_uninitialize_ring;
}
/* Get the device into a sane initial state */
@@ -789,9 +771,6 @@ static int __devinit ade7758_probe(struct spi_device *spi)
error_remove_trigger:
if (st->indio_dev->modes & INDIO_RING_TRIGGERED)
ade7758_remove_trigger(st->indio_dev);
-error_unregister_line:
- if (st->indio_dev->modes & INDIO_RING_TRIGGERED)
- iio_unregister_interrupt_line(st->indio_dev, 0);
error_uninitialize_ring:
ade7758_uninitialize_ring(st->indio_dev->ring);
error_unreg_ring_funcs:
@@ -824,9 +803,6 @@ static int ade7758_remove(struct spi_device *spi)
flush_scheduled_work();
ade7758_remove_trigger(indio_dev);
- if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0)
- iio_unregister_interrupt_line(indio_dev, 0);
-
ade7758_uninitialize_ring(indio_dev->ring);
iio_device_unregister(indio_dev);
ade7758_unconfigure_ring(indio_dev);
diff --git a/drivers/staging/iio/meter/ade7758_trigger.c b/drivers/staging/iio/meter/ade7758_trigger.c
index 60abca0..0adfcc6 100644
--- a/drivers/staging/iio/meter/ade7758_trigger.c
+++ b/drivers/staging/iio/meter/ade7758_trigger.c
@@ -15,21 +15,13 @@
/**
* ade7758_data_rdy_trig_poll() the event handler for the data rdy trig
**/
-static int ade7758_data_rdy_trig_poll(struct iio_dev *dev_info,
- int index,
- s64 timestamp,
- int no_test)
+static irqreturn_t ade7758_data_rdy_trig_poll(int irq, void *private)
{
- struct ade7758_state *st = iio_dev_get_devdata(dev_info);
- struct iio_trigger *trig = st->trig;
-
- iio_trigger_poll(trig, timestamp);
-
+ disable_irq_nosync(irq);
+ iio_trigger_poll(private, iio_get_time_ns());
return IRQ_HANDLED;
}
-IIO_EVENT_SH(data_rdy_trig, &ade7758_data_rdy_trig_poll);
-
static DEVICE_ATTR(name, S_IRUGO, iio_trigger_read_name, NULL);
static struct attribute *ade7758_trigger_attrs[] = {
@@ -49,22 +41,9 @@ static int ade7758_data_rdy_trigger_set_state(struct iio_trigger *trig,
{
struct ade7758_state *st = trig->private_data;
struct iio_dev *indio_dev = st->indio_dev;
- int ret = 0;
dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
- ret = ade7758_set_irq(&st->indio_dev->dev, state);
- if (state == false) {
- iio_remove_event_from_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]
- ->ev_list);
- /* possible quirk with handler currently worked around
- by ensuring the work queue is empty */
- flush_scheduled_work();
- } else {
- iio_add_event_to_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]->ev_list);
- }
- return ret;
+ return ade7758_set_irq(&indio_dev->dev, state);
}
/**
@@ -84,13 +63,25 @@ int ade7758_probe_trigger(struct iio_dev *indio_dev)
int ret;
struct ade7758_state *st = indio_dev->dev_data;
+
st->trig = iio_allocate_trigger();
+ if (st->trig == NULL) {
+ ret = -ENOMEM;
+ goto error_ret;
+ }
+ ret = request_irq(st->us->irq,
+ ade7758_data_rdy_trig_poll,
+ IRQF_TRIGGER_FALLING, "ade7758",
+ st->trig);
+ if (ret)
+ goto error_free_trig;
+
st->trig->name = kasprintf(GFP_KERNEL,
"ade7758-dev%d",
indio_dev->id);
if (!st->trig->name) {
ret = -ENOMEM;
- goto error_free_trig;
+ goto error_free_irq;
}
st->trig->dev.parent = &st->us->dev;
st->trig->owner = THIS_MODULE;
@@ -109,9 +100,11 @@ int ade7758_probe_trigger(struct iio_dev *indio_dev)
error_free_trig_name:
kfree(st->trig->name);
+error_free_irq:
+ free_irq(st->us->irq, st->trig);
error_free_trig:
iio_free_trigger(st->trig);
-
+error_ret:
return ret;
}
@@ -121,5 +114,6 @@ void ade7758_remove_trigger(struct iio_dev *indio_dev)
iio_trigger_unregister(state->trig);
kfree(state->trig->name);
+ free_irq(state->us->irq, state->trig);
iio_free_trigger(state->trig);
}
--
1.7.3.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [PATCH 00/12] IIO: precursor cleanups to even system rewrite
2011-04-13 13:42 [PATCH 00/12] IIO: precursor cleanups to even system rewrite Jonathan Cameron
` (11 preceding siblings ...)
2011-04-13 13:43 ` [PATCH 12/12] staging:iio:ade7758 " Jonathan Cameron
@ 2011-04-18 11:59 ` Jonathan Cameron
12 siblings, 0 replies; 18+ messages in thread
From: Jonathan Cameron @ 2011-04-18 11:59 UTC (permalink / raw)
To: Jonathan Cameron; +Cc: linux-iio, Michael.Hennerich
Gone to Greg.
^ permalink raw reply [flat|nested] 18+ messages in thread