* [PATCH 1/6] staging:iio:triggers reorder module put and device put to ensure that the ops are still there if put results in device deletion.
2011-07-13 14:05 [PATCH 0/6] Trigger locking rework and splitting up trigger.h Jonathan Cameron
@ 2011-07-13 14:05 ` Jonathan Cameron
2011-07-13 14:05 ` [PATCH 2/6] staging:iio:trigger:sysfs trigger: Add a release function to avoid warning on module removal Jonathan Cameron
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2011-07-13 14:05 UTC (permalink / raw)
To: greg, linux-iio; +Cc: Jonathan Cameron
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/trigger.h | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/staging/iio/trigger.h b/drivers/staging/iio/trigger.h
index 325e086..234c774 100644
--- a/drivers/staging/iio/trigger.h
+++ b/drivers/staging/iio/trigger.h
@@ -104,14 +104,14 @@ static inline struct iio_trigger *to_iio_trigger(struct device *d)
static inline void iio_put_trigger(struct iio_trigger *trig)
{
- put_device(&trig->dev);
module_put(trig->ops->owner);
+ put_device(&trig->dev);
};
static inline void iio_get_trigger(struct iio_trigger *trig)
{
- __module_get(trig->ops->owner);
get_device(&trig->dev);
+ __module_get(trig->ops->owner);
};
/**
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/6] staging:iio:trigger:sysfs trigger: Add a release function to avoid warning on module removal.
2011-07-13 14:05 [PATCH 0/6] Trigger locking rework and splitting up trigger.h Jonathan Cameron
2011-07-13 14:05 ` [PATCH 1/6] staging:iio:triggers reorder module put and device put to ensure that the ops are still there if put results in device deletion Jonathan Cameron
@ 2011-07-13 14:05 ` Jonathan Cameron
2011-07-13 14:05 ` [PATCH 3/6] staging:iio:pollfunc: Make explicit that private data is always pointer to a struct iio_dev Jonathan Cameron
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2011-07-13 14:05 UTC (permalink / raw)
To: greg, linux-iio; +Cc: Jonathan Cameron
The device is static and should never actually be deleted. The release
is just to avoid a warning from the kernel.
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/trigger/iio-trig-sysfs.c | 7 +++++++
1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/drivers/staging/iio/trigger/iio-trig-sysfs.c b/drivers/staging/iio/trigger/iio-trig-sysfs.c
index 346b30c..174dc65 100644
--- a/drivers/staging/iio/trigger/iio-trig-sysfs.c
+++ b/drivers/staging/iio/trigger/iio-trig-sysfs.c
@@ -77,9 +77,16 @@ static const struct attribute_group *iio_sysfs_trig_groups[] = {
NULL
};
+
+/* Nothing to actually do upon release */
+static void iio_trigger_sysfs_release(struct device *dev)
+{
+}
+
static struct device iio_sysfs_trig_dev = {
.bus = &iio_bus_type,
.groups = iio_sysfs_trig_groups,
+ .release = &iio_trigger_sysfs_release,
};
static ssize_t iio_sysfs_trigger_poll(struct device *dev,
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/6] staging:iio:pollfunc: Make explicit that private data is always pointer to a struct iio_dev.
2011-07-13 14:05 [PATCH 0/6] Trigger locking rework and splitting up trigger.h Jonathan Cameron
2011-07-13 14:05 ` [PATCH 1/6] staging:iio:triggers reorder module put and device put to ensure that the ops are still there if put results in device deletion Jonathan Cameron
2011-07-13 14:05 ` [PATCH 2/6] staging:iio:trigger:sysfs trigger: Add a release function to avoid warning on module removal Jonathan Cameron
@ 2011-07-13 14:05 ` Jonathan Cameron
2011-07-13 14:05 ` [PATCH 4/6] staging:iio: prevent removal of module connected to trigger Jonathan Cameron
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2011-07-13 14:05 UTC (permalink / raw)
To: greg, linux-iio; +Cc: Jonathan Cameron
This is always true, so lets make it explicit.
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/accel/adis16201_ring.c | 2 +-
drivers/staging/iio/accel/adis16203_ring.c | 2 +-
drivers/staging/iio/accel/adis16204_ring.c | 2 +-
drivers/staging/iio/accel/adis16209_ring.c | 2 +-
drivers/staging/iio/accel/adis16240_ring.c | 2 +-
drivers/staging/iio/accel/lis3l02dq_ring.c | 2 +-
drivers/staging/iio/adc/ad7298_ring.c | 2 +-
drivers/staging/iio/adc/ad7476_ring.c | 2 +-
drivers/staging/iio/adc/ad7606_ring.c | 3 +--
drivers/staging/iio/adc/ad7793.c | 2 +-
drivers/staging/iio/adc/ad7887_ring.c | 2 +-
drivers/staging/iio/adc/ad799x_ring.c | 2 +-
drivers/staging/iio/adc/max1363_ring.c | 2 +-
drivers/staging/iio/gyro/adis16260_ring.c | 2 +-
drivers/staging/iio/imu/adis16400_ring.c | 2 +-
drivers/staging/iio/industrialio-trigger.c | 4 ++--
drivers/staging/iio/meter/ade7758_ring.c | 2 +-
drivers/staging/iio/trigger.h | 6 +++---
18 files changed, 21 insertions(+), 22 deletions(-)
diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
index 9913354..ef83dc6 100644
--- a/drivers/staging/iio/accel/adis16201_ring.c
+++ b/drivers/staging/iio/accel/adis16201_ring.c
@@ -57,7 +57,7 @@ static int adis16201_read_ring_data(struct iio_dev *indio_dev, u8 *rx)
static irqreturn_t adis16201_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct adis16201_state *st = iio_priv(indio_dev);
struct iio_ring_buffer *ring = indio_dev->ring;
diff --git a/drivers/staging/iio/accel/adis16203_ring.c b/drivers/staging/iio/accel/adis16203_ring.c
index 049174d..4398fd9 100644
--- a/drivers/staging/iio/accel/adis16203_ring.c
+++ b/drivers/staging/iio/accel/adis16203_ring.c
@@ -59,7 +59,7 @@ static int adis16203_read_ring_data(struct device *dev, u8 *rx)
static irqreturn_t adis16203_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct adis16203_state *st = iio_priv(indio_dev);
struct iio_ring_buffer *ring = indio_dev->ring;
diff --git a/drivers/staging/iio/accel/adis16204_ring.c b/drivers/staging/iio/accel/adis16204_ring.c
index b173856..385e350 100644
--- a/drivers/staging/iio/accel/adis16204_ring.c
+++ b/drivers/staging/iio/accel/adis16204_ring.c
@@ -57,7 +57,7 @@ static int adis16204_read_ring_data(struct device *dev, u8 *rx)
static irqreturn_t adis16204_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct adis16204_state *st = iio_priv(indio_dev);
struct iio_ring_buffer *ring = indio_dev->ring;
int i = 0;
diff --git a/drivers/staging/iio/accel/adis16209_ring.c b/drivers/staging/iio/accel/adis16209_ring.c
index 7547ddb..1652f15 100644
--- a/drivers/staging/iio/accel/adis16209_ring.c
+++ b/drivers/staging/iio/accel/adis16209_ring.c
@@ -57,7 +57,7 @@ static int adis16209_read_ring_data(struct device *dev, u8 *rx)
static irqreturn_t adis16209_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct adis16209_state *st = iio_priv(indio_dev);
struct iio_ring_buffer *ring = indio_dev->ring;
diff --git a/drivers/staging/iio/accel/adis16240_ring.c b/drivers/staging/iio/accel/adis16240_ring.c
index 9bb4ff8..9d4ba15 100644
--- a/drivers/staging/iio/accel/adis16240_ring.c
+++ b/drivers/staging/iio/accel/adis16240_ring.c
@@ -54,7 +54,7 @@ static int adis16240_read_ring_data(struct device *dev, u8 *rx)
static irqreturn_t adis16240_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct adis16240_state *st = iio_priv(indio_dev);
struct iio_ring_buffer *ring = indio_dev->ring;
diff --git a/drivers/staging/iio/accel/lis3l02dq_ring.c b/drivers/staging/iio/accel/lis3l02dq_ring.c
index c53985e..7f7dca4 100644
--- a/drivers/staging/iio/accel/lis3l02dq_ring.c
+++ b/drivers/staging/iio/accel/lis3l02dq_ring.c
@@ -160,7 +160,7 @@ static int lis3l02dq_get_ring_element(struct iio_dev *indio_dev,
static irqreturn_t lis3l02dq_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct iio_ring_buffer *ring = indio_dev->ring;
int len = 0;
size_t datasize = ring->access->get_bytes_per_datum(ring);
diff --git a/drivers/staging/iio/adc/ad7298_ring.c b/drivers/staging/iio/adc/ad7298_ring.c
index 7423d4a..ab828a9 100644
--- a/drivers/staging/iio/adc/ad7298_ring.c
+++ b/drivers/staging/iio/adc/ad7298_ring.c
@@ -117,7 +117,7 @@ static int ad7298_ring_preenable(struct iio_dev *indio_dev)
static irqreturn_t ad7298_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct ad7298_state *st = iio_priv(indio_dev);
struct iio_ring_buffer *ring = indio_dev->ring;
s64 time_ns;
diff --git a/drivers/staging/iio/adc/ad7476_ring.c b/drivers/staging/iio/adc/ad7476_ring.c
index 86bbba8..2597fda 100644
--- a/drivers/staging/iio/adc/ad7476_ring.c
+++ b/drivers/staging/iio/adc/ad7476_ring.c
@@ -76,7 +76,7 @@ static int ad7476_ring_preenable(struct iio_dev *indio_dev)
static irqreturn_t ad7476_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct ad7476_state *st = iio_priv(indio_dev);
s64 time_ns;
__u8 *rxbuf;
diff --git a/drivers/staging/iio/adc/ad7606_ring.c b/drivers/staging/iio/adc/ad7606_ring.c
index f8f574a..52b0c1d 100644
--- a/drivers/staging/iio/adc/ad7606_ring.c
+++ b/drivers/staging/iio/adc/ad7606_ring.c
@@ -80,8 +80,7 @@ static int ad7606_ring_preenable(struct iio_dev *indio_dev)
static irqreturn_t ad7606_trigger_handler_th_bh(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
- struct ad7606_state *st = iio_priv(indio_dev);
+ struct ad7606_state *st = iio_priv(pf->indio_dev);
gpio_set_value(st->pdata->gpio_convst, 1);
diff --git a/drivers/staging/iio/adc/ad7793.c b/drivers/staging/iio/adc/ad7793.c
index ab6f109..aab7528 100644
--- a/drivers/staging/iio/adc/ad7793.c
+++ b/drivers/staging/iio/adc/ad7793.c
@@ -401,7 +401,7 @@ static int ad7793_ring_postdisable(struct iio_dev *indio_dev)
static irqreturn_t ad7793_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct iio_ring_buffer *ring = indio_dev->ring;
struct ad7793_state *st = iio_priv(indio_dev);
s64 dat64[2];
diff --git a/drivers/staging/iio/adc/ad7887_ring.c b/drivers/staging/iio/adc/ad7887_ring.c
index b77b120..05ae4a0 100644
--- a/drivers/staging/iio/adc/ad7887_ring.c
+++ b/drivers/staging/iio/adc/ad7887_ring.c
@@ -112,7 +112,7 @@ static int ad7887_ring_postdisable(struct iio_dev *indio_dev)
static irqreturn_t ad7887_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct ad7887_state *st = iio_priv(indio_dev);
struct iio_ring_buffer *ring = indio_dev->ring;
s64 time_ns;
diff --git a/drivers/staging/iio/adc/ad799x_ring.c b/drivers/staging/iio/adc/ad799x_ring.c
index d84efd6..7980fe5 100644
--- a/drivers/staging/iio/adc/ad799x_ring.c
+++ b/drivers/staging/iio/adc/ad799x_ring.c
@@ -105,7 +105,7 @@ static int ad799x_ring_preenable(struct iio_dev *indio_dev)
static irqreturn_t ad799x_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct ad799x_state *st = iio_priv(indio_dev);
struct iio_ring_buffer *ring = indio_dev->ring;
s64 time_ns;
diff --git a/drivers/staging/iio/adc/max1363_ring.c b/drivers/staging/iio/adc/max1363_ring.c
index 696676f..caa63cb 100644
--- a/drivers/staging/iio/adc/max1363_ring.c
+++ b/drivers/staging/iio/adc/max1363_ring.c
@@ -104,7 +104,7 @@ static int max1363_ring_preenable(struct iio_dev *indio_dev)
static irqreturn_t max1363_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct max1363_state *st = iio_priv(indio_dev);
s64 time_ns;
__u8 *rxbuf;
diff --git a/drivers/staging/iio/gyro/adis16260_ring.c b/drivers/staging/iio/gyro/adis16260_ring.c
index 92d1fac..36f72c3 100644
--- a/drivers/staging/iio/gyro/adis16260_ring.c
+++ b/drivers/staging/iio/gyro/adis16260_ring.c
@@ -60,7 +60,7 @@ static int adis16260_read_ring_data(struct device *dev, u8 *rx)
static irqreturn_t adis16260_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct adis16260_state *st = iio_priv(indio_dev);
struct iio_ring_buffer *ring = indio_dev->ring;
int i = 0;
diff --git a/drivers/staging/iio/imu/adis16400_ring.c b/drivers/staging/iio/imu/adis16400_ring.c
index ef38477..56385d3 100644
--- a/drivers/staging/iio/imu/adis16400_ring.c
+++ b/drivers/staging/iio/imu/adis16400_ring.c
@@ -111,7 +111,7 @@ static int adis16350_spi_read_all(struct device *dev, u8 *rx)
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 iio_dev *indio_dev = pf->indio_dev;
struct adis16400_state *st = iio_priv(indio_dev);
struct iio_ring_buffer *ring = indio_dev->ring;
int i = 0, j, ret = 0;
diff --git a/drivers/staging/iio/industrialio-trigger.c b/drivers/staging/iio/industrialio-trigger.c
index 4a7ea6a..602be5c 100644
--- a/drivers/staging/iio/industrialio-trigger.c
+++ b/drivers/staging/iio/industrialio-trigger.c
@@ -273,7 +273,7 @@ struct iio_poll_func
*iio_alloc_pollfunc(irqreturn_t (*h)(int irq, void *p),
irqreturn_t (*thread)(int irq, void *p),
int type,
- void *private,
+ struct iio_dev *indio_dev,
const char *fmt,
...)
{
@@ -293,7 +293,7 @@ struct iio_poll_func
pf->h = h;
pf->thread = thread;
pf->type = type;
- pf->private_data = private;
+ pf->indio_dev = indio_dev;
return pf;
}
diff --git a/drivers/staging/iio/meter/ade7758_ring.c b/drivers/staging/iio/meter/ade7758_ring.c
index c9271d0..c29beec 100644
--- a/drivers/staging/iio/meter/ade7758_ring.c
+++ b/drivers/staging/iio/meter/ade7758_ring.c
@@ -60,7 +60,7 @@ out:
static irqreturn_t ade7758_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
- struct iio_dev *indio_dev = pf->private_data;
+ struct iio_dev *indio_dev = pf->indio_dev;
struct iio_ring_buffer *ring = indio_dev->ring;
struct ade7758_state *st = iio_priv(indio_dev);
s64 dat64[2];
diff --git a/drivers/staging/iio/trigger.h b/drivers/staging/iio/trigger.h
index 234c774..010da1d 100644
--- a/drivers/staging/iio/trigger.h
+++ b/drivers/staging/iio/trigger.h
@@ -76,7 +76,7 @@ struct iio_trigger {
/**
* struct iio_poll_func - poll function pair
*
- * @private_data: data specific to device (passed into poll func)
+ * @indio_dev: data specific to device (passed into poll func)
* @h: the function that is actually run on trigger
* @thread: threaded interrupt part
* @type: the type of interrupt (basically if oneshot)
@@ -88,7 +88,7 @@ struct iio_trigger {
* passes it via here.
**/
struct iio_poll_func {
- void *private_data;
+ struct iio_dev *indio_dev;
irqreturn_t (*h)(int irq, void *p);
irqreturn_t (*thread)(int irq, void *p);
int type;
@@ -180,7 +180,7 @@ struct iio_poll_func
*iio_alloc_pollfunc(irqreturn_t (*h)(int irq, void *p),
irqreturn_t (*thread)(int irq, void *p),
int type,
- void *private,
+ struct iio_dev *indio_dev,
const char *fmt,
...);
void iio_dealloc_pollfunc(struct iio_poll_func *pf);
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 4/6] staging:iio: prevent removal of module connected to trigger.
2011-07-13 14:05 [PATCH 0/6] Trigger locking rework and splitting up trigger.h Jonathan Cameron
` (2 preceding siblings ...)
2011-07-13 14:05 ` [PATCH 3/6] staging:iio:pollfunc: Make explicit that private data is always pointer to a struct iio_dev Jonathan Cameron
@ 2011-07-13 14:05 ` Jonathan Cameron
2011-07-13 14:05 ` [PATCH 5/6] staging:iio:rename trigger_consumer.h to indicate it is core only Jonathan Cameron
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2011-07-13 14:05 UTC (permalink / raw)
To: greg, linux-iio; +Cc: Jonathan Cameron
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/adc/ad7298_ring.c | 5 -----
drivers/staging/iio/adc/ad7476_ring.c | 6 ------
drivers/staging/iio/adc/ad7606_ring.c | 5 -----
drivers/staging/iio/adc/ad7793.c | 6 ------
drivers/staging/iio/adc/ad7887_ring.c | 6 ------
drivers/staging/iio/adc/ad799x_ring.c | 6 ------
drivers/staging/iio/adc/max1363_ring.c | 5 -----
drivers/staging/iio/industrialio-trigger.c | 3 +++
drivers/staging/iio/meter/ade7758_ring.c | 6 ------
9 files changed, 3 insertions(+), 45 deletions(-)
diff --git a/drivers/staging/iio/adc/ad7298_ring.c b/drivers/staging/iio/adc/ad7298_ring.c
index ab828a9..5b87926 100644
--- a/drivers/staging/iio/adc/ad7298_ring.c
+++ b/drivers/staging/iio/adc/ad7298_ring.c
@@ -189,11 +189,6 @@ error_ret:
void ad7298_ring_cleanup(struct iio_dev *indio_dev)
{
- if (indio_dev->trig) {
- iio_put_trigger(indio_dev->trig);
- iio_trigger_dettach_poll_func(indio_dev->trig,
- indio_dev->pollfunc);
- }
iio_dealloc_pollfunc(indio_dev->pollfunc);
iio_sw_rb_free(indio_dev->ring);
}
diff --git a/drivers/staging/iio/adc/ad7476_ring.c b/drivers/staging/iio/adc/ad7476_ring.c
index 2597fda..41d6b8d 100644
--- a/drivers/staging/iio/adc/ad7476_ring.c
+++ b/drivers/staging/iio/adc/ad7476_ring.c
@@ -152,12 +152,6 @@ error_ret:
void ad7476_ring_cleanup(struct iio_dev *indio_dev)
{
- /* ensure that the trigger has been detached */
- if (indio_dev->trig) {
- iio_put_trigger(indio_dev->trig);
- iio_trigger_dettach_poll_func(indio_dev->trig,
- indio_dev->pollfunc);
- }
iio_dealloc_pollfunc(indio_dev->pollfunc);
iio_sw_rb_free(indio_dev->ring);
}
diff --git a/drivers/staging/iio/adc/ad7606_ring.c b/drivers/staging/iio/adc/ad7606_ring.c
index 52b0c1d..1c563ec 100644
--- a/drivers/staging/iio/adc/ad7606_ring.c
+++ b/drivers/staging/iio/adc/ad7606_ring.c
@@ -197,11 +197,6 @@ error_ret:
void ad7606_ring_cleanup(struct iio_dev *indio_dev)
{
- if (indio_dev->trig) {
- iio_put_trigger(indio_dev->trig);
- iio_trigger_dettach_poll_func(indio_dev->trig,
- indio_dev->pollfunc);
- }
iio_dealloc_pollfunc(indio_dev->pollfunc);
iio_sw_rb_free(indio_dev->ring);
}
diff --git a/drivers/staging/iio/adc/ad7793.c b/drivers/staging/iio/adc/ad7793.c
index aab7528..8a5857c 100644
--- a/drivers/staging/iio/adc/ad7793.c
+++ b/drivers/staging/iio/adc/ad7793.c
@@ -469,12 +469,6 @@ error_ret:
static void ad7793_ring_cleanup(struct iio_dev *indio_dev)
{
- /* ensure that the trigger has been detached */
- if (indio_dev->trig) {
- iio_put_trigger(indio_dev->trig);
- iio_trigger_dettach_poll_func(indio_dev->trig,
- indio_dev->pollfunc);
- }
iio_dealloc_pollfunc(indio_dev->pollfunc);
iio_sw_rb_free(indio_dev->ring);
}
diff --git a/drivers/staging/iio/adc/ad7887_ring.c b/drivers/staging/iio/adc/ad7887_ring.c
index 05ae4a0..cc39eee 100644
--- a/drivers/staging/iio/adc/ad7887_ring.c
+++ b/drivers/staging/iio/adc/ad7887_ring.c
@@ -188,12 +188,6 @@ error_ret:
void ad7887_ring_cleanup(struct iio_dev *indio_dev)
{
- /* ensure that the trigger has been detached */
- if (indio_dev->trig) {
- iio_put_trigger(indio_dev->trig);
- iio_trigger_dettach_poll_func(indio_dev->trig,
- indio_dev->pollfunc);
- }
iio_dealloc_pollfunc(indio_dev->pollfunc);
iio_sw_rb_free(indio_dev->ring);
}
diff --git a/drivers/staging/iio/adc/ad799x_ring.c b/drivers/staging/iio/adc/ad799x_ring.c
index 7980fe5..e268a61 100644
--- a/drivers/staging/iio/adc/ad799x_ring.c
+++ b/drivers/staging/iio/adc/ad799x_ring.c
@@ -204,12 +204,6 @@ error_ret:
void ad799x_ring_cleanup(struct iio_dev *indio_dev)
{
- /* ensure that the trigger has been detached */
- if (indio_dev->trig) {
- iio_put_trigger(indio_dev->trig);
- iio_trigger_dettach_poll_func(indio_dev->trig,
- indio_dev->pollfunc);
- }
iio_dealloc_pollfunc(indio_dev->pollfunc);
iio_sw_rb_free(indio_dev->ring);
}
diff --git a/drivers/staging/iio/adc/max1363_ring.c b/drivers/staging/iio/adc/max1363_ring.c
index caa63cb..d4db91d 100644
--- a/drivers/staging/iio/adc/max1363_ring.c
+++ b/drivers/staging/iio/adc/max1363_ring.c
@@ -195,11 +195,6 @@ error_ret:
void max1363_ring_cleanup(struct iio_dev *indio_dev)
{
/* ensure that the trigger has been detached */
- if (indio_dev->trig) {
- iio_put_trigger(indio_dev->trig);
- iio_trigger_dettach_poll_func(indio_dev->trig,
- indio_dev->pollfunc);
- }
iio_dealloc_pollfunc(indio_dev->pollfunc);
iio_sw_rb_free(indio_dev->ring);
}
diff --git a/drivers/staging/iio/industrialio-trigger.c b/drivers/staging/iio/industrialio-trigger.c
index 602be5c..1bc3f14 100644
--- a/drivers/staging/iio/industrialio-trigger.c
+++ b/drivers/staging/iio/industrialio-trigger.c
@@ -229,6 +229,8 @@ int iio_trigger_attach_poll_func(struct iio_trigger *trig,
bool notinuse
= bitmap_empty(trig->pool, CONFIG_IIO_CONSUMERS_PER_TRIGGER);
+ /* Prevent the module being removed whilst attached to a trigger */
+ __module_get(pf->indio_dev->info->driver_module);
pf->irq = iio_trigger_get_irq(trig);
ret = request_threaded_irq(pf->irq, pf->h, pf->thread,
pf->type, pf->name,
@@ -255,6 +257,7 @@ int iio_trigger_dettach_poll_func(struct iio_trigger *trig,
}
iio_trigger_put_irq(trig, pf->irq);
free_irq(pf->irq, pf);
+ module_put(pf->indio_dev->info->driver_module);
error_ret:
return ret;
diff --git a/drivers/staging/iio/meter/ade7758_ring.c b/drivers/staging/iio/meter/ade7758_ring.c
index c29beec..2dec532 100644
--- a/drivers/staging/iio/meter/ade7758_ring.c
+++ b/drivers/staging/iio/meter/ade7758_ring.c
@@ -127,12 +127,6 @@ static const struct iio_ring_setup_ops ade7758_ring_setup_ops = {
void ade7758_unconfigure_ring(struct iio_dev *indio_dev)
{
- /* ensure that the trigger has been detached */
- if (indio_dev->trig) {
- iio_put_trigger(indio_dev->trig);
- iio_trigger_dettach_poll_func(indio_dev->trig,
- indio_dev->pollfunc);
- }
iio_dealloc_pollfunc(indio_dev->pollfunc);
iio_sw_rb_free(indio_dev->ring);
}
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 5/6] staging:iio:rename trigger_consumer.h to indicate it is core only.
2011-07-13 14:05 [PATCH 0/6] Trigger locking rework and splitting up trigger.h Jonathan Cameron
` (3 preceding siblings ...)
2011-07-13 14:05 ` [PATCH 4/6] staging:iio: prevent removal of module connected to trigger Jonathan Cameron
@ 2011-07-13 14:05 ` Jonathan Cameron
2011-07-13 14:05 ` [PATCH 6/6] staging:iio: spit trigger.h into provider and consumer parts Jonathan Cameron
2011-08-22 13:03 ` [PATCH 0/6] Trigger locking rework and splitting up trigger.h Jonathan Cameron
6 siblings, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2011-07-13 14:05 UTC (permalink / raw)
To: greg, linux-iio; +Cc: Jonathan Cameron
Need this out the way to create a trigger_consumer.h that actually is
for trigger consumers.
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/iio_core_trigger.h | 47 ++++++++++++++++++++++++++++
drivers/staging/iio/industrialio-core.c | 2 +-
drivers/staging/iio/industrialio-trigger.c | 2 +-
drivers/staging/iio/trigger_consumer.h | 47 ----------------------------
4 files changed, 49 insertions(+), 49 deletions(-)
diff --git a/drivers/staging/iio/iio_core_trigger.h b/drivers/staging/iio/iio_core_trigger.h
new file mode 100644
index 0000000..9d52d96
--- /dev/null
+++ b/drivers/staging/iio/iio_core_trigger.h
@@ -0,0 +1,47 @@
+
+/* The industrial I/O core, trigger consumer handling functions
+ *
+ * Copyright (c) 2008 Jonathan Cameron
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+
+#ifdef CONFIG_IIO_TRIGGER
+/**
+ * iio_device_register_trigger_consumer() - set up an iio_dev to use triggers
+ * @dev_info: iio_dev associated with the device that will consume the trigger
+ **/
+int iio_device_register_trigger_consumer(struct iio_dev *dev_info);
+
+/**
+ * iio_device_unregister_trigger_consumer() - reverse the registration process
+ * @dev_info: iio_dev associated with the device that consumed the trigger
+ **/
+int iio_device_unregister_trigger_consumer(struct iio_dev *dev_info);
+
+#else
+
+/**
+ * iio_device_register_trigger_consumer() - set up an iio_dev to use triggers
+ * @dev_info: iio_dev associated with the device that will consume the trigger
+ **/
+static int iio_device_register_trigger_consumer(struct iio_dev *dev_info)
+{
+ return 0;
+};
+
+/**
+ * iio_device_unregister_trigger_consumer() - reverse the registration process
+ * @dev_info: iio_dev associated with the device that consumed the trigger
+ **/
+static int iio_device_unregister_trigger_consumer(struct iio_dev *dev_info)
+{
+ return 0;
+};
+
+#endif /* CONFIG_TRIGGER_CONSUMER */
+
+
+
diff --git a/drivers/staging/iio/industrialio-core.c b/drivers/staging/iio/industrialio-core.c
index 51115b4..a9628ed 100644
--- a/drivers/staging/iio/industrialio-core.c
+++ b/drivers/staging/iio/industrialio-core.c
@@ -22,7 +22,7 @@
#include <linux/cdev.h>
#include <linux/slab.h>
#include "iio.h"
-#include "trigger_consumer.h"
+#include "iio_core_trigger.h"
#define IIO_ID_PREFIX "device"
#define IIO_ID_FORMAT IIO_ID_PREFIX "%d"
diff --git a/drivers/staging/iio/industrialio-trigger.c b/drivers/staging/iio/industrialio-trigger.c
index 1bc3f14..27da975 100644
--- a/drivers/staging/iio/industrialio-trigger.c
+++ b/drivers/staging/iio/industrialio-trigger.c
@@ -17,7 +17,7 @@
#include "iio.h"
#include "trigger.h"
-#include "trigger_consumer.h"
+#include "iio_core_trigger.h"
/* RFC - Question of approach
* Make the common case (single sensor single trigger)
diff --git a/drivers/staging/iio/trigger_consumer.h b/drivers/staging/iio/trigger_consumer.h
deleted file mode 100644
index 9d52d96..0000000
--- a/drivers/staging/iio/trigger_consumer.h
+++ /dev/null
@@ -1,47 +0,0 @@
-
-/* The industrial I/O core, trigger consumer handling functions
- *
- * Copyright (c) 2008 Jonathan Cameron
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation.
- */
-
-#ifdef CONFIG_IIO_TRIGGER
-/**
- * iio_device_register_trigger_consumer() - set up an iio_dev to use triggers
- * @dev_info: iio_dev associated with the device that will consume the trigger
- **/
-int iio_device_register_trigger_consumer(struct iio_dev *dev_info);
-
-/**
- * iio_device_unregister_trigger_consumer() - reverse the registration process
- * @dev_info: iio_dev associated with the device that consumed the trigger
- **/
-int iio_device_unregister_trigger_consumer(struct iio_dev *dev_info);
-
-#else
-
-/**
- * iio_device_register_trigger_consumer() - set up an iio_dev to use triggers
- * @dev_info: iio_dev associated with the device that will consume the trigger
- **/
-static int iio_device_register_trigger_consumer(struct iio_dev *dev_info)
-{
- return 0;
-};
-
-/**
- * iio_device_unregister_trigger_consumer() - reverse the registration process
- * @dev_info: iio_dev associated with the device that consumed the trigger
- **/
-static int iio_device_unregister_trigger_consumer(struct iio_dev *dev_info)
-{
- return 0;
-};
-
-#endif /* CONFIG_TRIGGER_CONSUMER */
-
-
-
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 6/6] staging:iio: spit trigger.h into provider and consumer parts.
2011-07-13 14:05 [PATCH 0/6] Trigger locking rework and splitting up trigger.h Jonathan Cameron
` (4 preceding siblings ...)
2011-07-13 14:05 ` [PATCH 5/6] staging:iio:rename trigger_consumer.h to indicate it is core only Jonathan Cameron
@ 2011-07-13 14:05 ` Jonathan Cameron
2011-08-22 13:03 ` [PATCH 0/6] Trigger locking rework and splitting up trigger.h Jonathan Cameron
6 siblings, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2011-07-13 14:05 UTC (permalink / raw)
To: greg, linux-iio; +Cc: Jonathan Cameron
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/accel/adis16201_ring.c | 2 +-
drivers/staging/iio/accel/adis16203_ring.c | 2 +-
drivers/staging/iio/accel/adis16204_ring.c | 2 +-
drivers/staging/iio/accel/adis16209_ring.c | 2 +-
drivers/staging/iio/accel/adis16240_ring.c | 2 +-
drivers/staging/iio/accel/lis3l02dq_ring.c | 1 +
drivers/staging/iio/adc/ad7298_ring.c | 2 +-
drivers/staging/iio/adc/ad7476_ring.c | 2 +-
drivers/staging/iio/adc/ad7606_ring.c | 2 +-
drivers/staging/iio/adc/ad7793.c | 1 +
drivers/staging/iio/adc/ad7887_ring.c | 2 +-
drivers/staging/iio/adc/ad799x_ring.c | 2 +-
drivers/staging/iio/adc/max1363_ring.c | 2 +-
drivers/staging/iio/gyro/adis16260_ring.c | 2 +-
drivers/staging/iio/imu/adis16400_ring.c | 2 +-
drivers/staging/iio/industrialio-trigger.c | 1 +
drivers/staging/iio/meter/ade7758_ring.c | 2 +-
drivers/staging/iio/trigger.h | 42 +----------------------
drivers/staging/iio/trigger_consumer.h | 52 ++++++++++++++++++++++++++++
19 files changed, 70 insertions(+), 55 deletions(-)
diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
index ef83dc6..bb75121 100644
--- a/drivers/staging/iio/accel/adis16201_ring.c
+++ b/drivers/staging/iio/accel/adis16201_ring.c
@@ -6,7 +6,7 @@
#include "../iio.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "adis16201.h"
diff --git a/drivers/staging/iio/accel/adis16203_ring.c b/drivers/staging/iio/accel/adis16203_ring.c
index 4398fd9..993e239 100644
--- a/drivers/staging/iio/accel/adis16203_ring.c
+++ b/drivers/staging/iio/accel/adis16203_ring.c
@@ -6,7 +6,7 @@
#include "../iio.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "adis16203.h"
/**
diff --git a/drivers/staging/iio/accel/adis16204_ring.c b/drivers/staging/iio/accel/adis16204_ring.c
index 385e350..847f438 100644
--- a/drivers/staging/iio/accel/adis16204_ring.c
+++ b/drivers/staging/iio/accel/adis16204_ring.c
@@ -6,7 +6,7 @@
#include "../iio.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "adis16204.h"
/**
diff --git a/drivers/staging/iio/accel/adis16209_ring.c b/drivers/staging/iio/accel/adis16209_ring.c
index 1652f15..f889fe7 100644
--- a/drivers/staging/iio/accel/adis16209_ring.c
+++ b/drivers/staging/iio/accel/adis16209_ring.c
@@ -6,7 +6,7 @@
#include "../iio.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "adis16209.h"
/**
diff --git a/drivers/staging/iio/accel/adis16240_ring.c b/drivers/staging/iio/accel/adis16240_ring.c
index 9d4ba15..051ba64 100644
--- a/drivers/staging/iio/accel/adis16240_ring.c
+++ b/drivers/staging/iio/accel/adis16240_ring.c
@@ -6,7 +6,7 @@
#include "../iio.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "adis16240.h"
/**
diff --git a/drivers/staging/iio/accel/lis3l02dq_ring.c b/drivers/staging/iio/accel/lis3l02dq_ring.c
index 7f7dca4..5c6fe13 100644
--- a/drivers/staging/iio/accel/lis3l02dq_ring.c
+++ b/drivers/staging/iio/accel/lis3l02dq_ring.c
@@ -9,6 +9,7 @@
#include "../ring_sw.h"
#include "../kfifo_buf.h"
#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "lis3l02dq.h"
/**
diff --git a/drivers/staging/iio/adc/ad7298_ring.c b/drivers/staging/iio/adc/ad7298_ring.c
index 5b87926..741818c 100644
--- a/drivers/staging/iio/adc/ad7298_ring.c
+++ b/drivers/staging/iio/adc/ad7298_ring.c
@@ -14,7 +14,7 @@
#include "../iio.h"
#include "../ring_generic.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "ad7298.h"
diff --git a/drivers/staging/iio/adc/ad7476_ring.c b/drivers/staging/iio/adc/ad7476_ring.c
index 41d6b8d..b109afb 100644
--- a/drivers/staging/iio/adc/ad7476_ring.c
+++ b/drivers/staging/iio/adc/ad7476_ring.c
@@ -16,7 +16,7 @@
#include "../iio.h"
#include "../ring_generic.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "ad7476.h"
diff --git a/drivers/staging/iio/adc/ad7606_ring.c b/drivers/staging/iio/adc/ad7606_ring.c
index 1c563ec..e642430 100644
--- a/drivers/staging/iio/adc/ad7606_ring.c
+++ b/drivers/staging/iio/adc/ad7606_ring.c
@@ -14,7 +14,7 @@
#include "../iio.h"
#include "../ring_generic.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "ad7606.h"
diff --git a/drivers/staging/iio/adc/ad7793.c b/drivers/staging/iio/adc/ad7793.c
index 8a5857c..1bcb3eb 100644
--- a/drivers/staging/iio/adc/ad7793.c
+++ b/drivers/staging/iio/adc/ad7793.c
@@ -22,6 +22,7 @@
#include "../ring_generic.h"
#include "../ring_sw.h"
#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "ad7793.h"
diff --git a/drivers/staging/iio/adc/ad7887_ring.c b/drivers/staging/iio/adc/ad7887_ring.c
index cc39eee..6b3daf4 100644
--- a/drivers/staging/iio/adc/ad7887_ring.c
+++ b/drivers/staging/iio/adc/ad7887_ring.c
@@ -15,7 +15,7 @@
#include "../iio.h"
#include "../ring_generic.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "ad7887.h"
diff --git a/drivers/staging/iio/adc/ad799x_ring.c b/drivers/staging/iio/adc/ad799x_ring.c
index e268a61..8f1fc52 100644
--- a/drivers/staging/iio/adc/ad799x_ring.c
+++ b/drivers/staging/iio/adc/ad799x_ring.c
@@ -19,7 +19,7 @@
#include "../iio.h"
#include "../ring_generic.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "ad799x.h"
diff --git a/drivers/staging/iio/adc/max1363_ring.c b/drivers/staging/iio/adc/max1363_ring.c
index d4db91d..be601e0 100644
--- a/drivers/staging/iio/adc/max1363_ring.c
+++ b/drivers/staging/iio/adc/max1363_ring.c
@@ -17,7 +17,7 @@
#include "../iio.h"
#include "../ring_generic.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "max1363.h"
diff --git a/drivers/staging/iio/gyro/adis16260_ring.c b/drivers/staging/iio/gyro/adis16260_ring.c
index 36f72c3..10f8a66 100644
--- a/drivers/staging/iio/gyro/adis16260_ring.c
+++ b/drivers/staging/iio/gyro/adis16260_ring.c
@@ -6,7 +6,7 @@
#include "../iio.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "adis16260.h"
/**
diff --git a/drivers/staging/iio/imu/adis16400_ring.c b/drivers/staging/iio/imu/adis16400_ring.c
index 56385d3..3fc2403 100644
--- a/drivers/staging/iio/imu/adis16400_ring.c
+++ b/drivers/staging/iio/imu/adis16400_ring.c
@@ -7,7 +7,7 @@
#include "../iio.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "adis16400.h"
/**
diff --git a/drivers/staging/iio/industrialio-trigger.c b/drivers/staging/iio/industrialio-trigger.c
index 27da975..6940f8c 100644
--- a/drivers/staging/iio/industrialio-trigger.c
+++ b/drivers/staging/iio/industrialio-trigger.c
@@ -18,6 +18,7 @@
#include "iio.h"
#include "trigger.h"
#include "iio_core_trigger.h"
+#include "trigger_consumer.h"
/* RFC - Question of approach
* Make the common case (single sensor single trigger)
diff --git a/drivers/staging/iio/meter/ade7758_ring.c b/drivers/staging/iio/meter/ade7758_ring.c
index 2dec532..1e2a096 100644
--- a/drivers/staging/iio/meter/ade7758_ring.c
+++ b/drivers/staging/iio/meter/ade7758_ring.c
@@ -13,7 +13,7 @@
#include "../iio.h"
#include "../ring_sw.h"
-#include "../trigger.h"
+#include "../trigger_consumer.h"
#include "ade7758.h"
/**
diff --git a/drivers/staging/iio/trigger.h b/drivers/staging/iio/trigger.h
index 010da1d..56f8baf 100644
--- a/drivers/staging/iio/trigger.h
+++ b/drivers/staging/iio/trigger.h
@@ -73,29 +73,6 @@ struct iio_trigger {
struct mutex pool_lock;
};
-/**
- * struct iio_poll_func - poll function pair
- *
- * @indio_dev: data specific to device (passed into poll func)
- * @h: the function that is actually run on trigger
- * @thread: threaded interrupt part
- * @type: the type of interrupt (basically if oneshot)
- * @name: name used to identify the trigger consumer.
- * @irq: the corresponding irq as allocated from the
- * trigger pool
- * @timestamp: some devices need a timestamp grabbed as soon
- * as possible after the trigger - hence handler
- * passes it via here.
- **/
-struct iio_poll_func {
- struct iio_dev *indio_dev;
- irqreturn_t (*h)(int irq, void *p);
- irqreturn_t (*thread)(int irq, void *p);
- int type;
- char *name;
- int irq;
- s64 timestamp;
-};
static inline struct iio_trigger *to_iio_trigger(struct device *d)
{
@@ -151,7 +128,7 @@ int iio_trigger_dettach_poll_func(struct iio_trigger *trig,
**/
void iio_trigger_poll(struct iio_trigger *trig, s64 time);
void iio_trigger_poll_chained(struct iio_trigger *trig, s64 time);
-void iio_trigger_notify_done(struct iio_trigger *trig);
+
irqreturn_t iio_trigger_generic_data_rdy_poll(int irq, void *private);
@@ -176,23 +153,6 @@ static inline void iio_trigger_put_irq(struct iio_trigger *trig, int irq)
mutex_unlock(&trig->pool_lock);
};
-struct iio_poll_func
-*iio_alloc_pollfunc(irqreturn_t (*h)(int irq, void *p),
- irqreturn_t (*thread)(int irq, void *p),
- int type,
- struct iio_dev *indio_dev,
- const char *fmt,
- ...);
-void iio_dealloc_pollfunc(struct iio_poll_func *pf);
-irqreturn_t iio_pollfunc_store_time(int irq, void *p);
-
-/*
- * Two functions for common case where all that happens is a pollfunc
- * is attached and detached from a trigger
- */
-int iio_triggered_ring_postenable(struct iio_dev *indio_dev);
-int iio_triggered_ring_predisable(struct iio_dev *indio_dev);
-
struct iio_trigger *iio_allocate_trigger(const char *fmt, ...)
__attribute__((format(printf, 1, 2)));
void iio_free_trigger(struct iio_trigger *trig);
diff --git a/drivers/staging/iio/trigger_consumer.h b/drivers/staging/iio/trigger_consumer.h
new file mode 100644
index 0000000..418e0bd
--- /dev/null
+++ b/drivers/staging/iio/trigger_consumer.h
@@ -0,0 +1,52 @@
+/* The industrial I/O core, trigger consumer functions
+ *
+ * Copyright (c) 2008-2011 Jonathan Cameron
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+
+/**
+ * struct iio_poll_func - poll function pair
+ *
+ * @indio_dev: data specific to device (passed into poll func)
+ * @h: the function that is actually run on trigger
+ * @thread: threaded interrupt part
+ * @type: the type of interrupt (basically if oneshot)
+ * @name: name used to identify the trigger consumer.
+ * @irq: the corresponding irq as allocated from the
+ * trigger pool
+ * @timestamp: some devices need a timestamp grabbed as soon
+ * as possible after the trigger - hence handler
+ * passes it via here.
+ **/
+struct iio_poll_func {
+ struct iio_dev *indio_dev;
+ irqreturn_t (*h)(int irq, void *p);
+ irqreturn_t (*thread)(int irq, void *p);
+ int type;
+ char *name;
+ int irq;
+ s64 timestamp;
+};
+
+
+struct iio_poll_func
+*iio_alloc_pollfunc(irqreturn_t (*h)(int irq, void *p),
+ irqreturn_t (*thread)(int irq, void *p),
+ int type,
+ struct iio_dev *indio_dev,
+ const char *fmt,
+ ...);
+void iio_dealloc_pollfunc(struct iio_poll_func *pf);
+irqreturn_t iio_pollfunc_store_time(int irq, void *p);
+
+void iio_trigger_notify_done(struct iio_trigger *trig);
+
+/*
+ * Two functions for common case where all that happens is a pollfunc
+ * is attached and detached from a trigger
+ */
+int iio_triggered_ring_postenable(struct iio_dev *indio_dev);
+int iio_triggered_ring_predisable(struct iio_dev *indio_dev);
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 0/6] Trigger locking rework and splitting up trigger.h
2011-07-13 14:05 [PATCH 0/6] Trigger locking rework and splitting up trigger.h Jonathan Cameron
` (5 preceding siblings ...)
2011-07-13 14:05 ` [PATCH 6/6] staging:iio: spit trigger.h into provider and consumer parts Jonathan Cameron
@ 2011-08-22 13:03 ` Jonathan Cameron
6 siblings, 0 replies; 8+ messages in thread
From: Jonathan Cameron @ 2011-08-22 13:03 UTC (permalink / raw)
To: Jonathan Cameron; +Cc: Hennerich, Michael, linux-iio
Hi All,
This set have been around for a while. I've not seen any issues yet
and no one has screamed so I'll probably assume they are fine and send
on to Greg shortly.
Michael, you've been testing on the iio-blue.git tree which has these.
Any sign of problems yet?
Thanks,
Jonathan
> This is the result of actually checking the locking code for
> triggers and ensuring saferemoval.
>
> One kicker in here. Any driver that can do dynamic creation / removal
> of triggers (currently only sysfs trigger), must be very very careful.
> It's possible post this series for two devices to apparently be connected
> to a trigger with the same name, but only one be connected to the current
> instance of that trigger. To my mind, if you've got into this mess, your
> userspace is borked anyway and it doesn't actually cause a crash (unlike
> before this set), it just doesn't work as expected.
>
> If anyone can see a case I've missed, please do point it out.
>
> Note this also includes the trigger.h split and the semantic change
> discussed in 'Splitting trigger header in two and barriers'.
>
> That is, if your driver is currently using a trigger (other than one
> it provides), you will not be able to remove the module. The previous
> approach of just disconnected on removal would double release some stuff
> anyway causing lots of unpleasant messages.
>
> Whilst this stuff is definitely broken in current mainline, I'm not
> proposing to rush this set out.
>
> Thanks,
>
> Jonathan
>
> Jonathan Cameron (6):
> staging:iio:triggers reorder module put and device put to ensure that
> the ops are still there if put results in device deletion.
> staging:iio:trigger:sysfs trigger: Add a release function to avoid
> warning on module removal.
> staging:iio:pollfunc: Make explicit that private data is always
> pointer to a struct iio_dev.
> staging:iio: prevent removal of module connected to trigger.
> staging:iio:rename trigger_consumer.h to indicate it is core only.
> staging:iio: spit trigger.h into provider and consumer parts.
>
> drivers/staging/iio/accel/adis16201_ring.c | 4 +-
> drivers/staging/iio/accel/adis16203_ring.c | 4 +-
> drivers/staging/iio/accel/adis16204_ring.c | 4 +-
> drivers/staging/iio/accel/adis16209_ring.c | 4 +-
> drivers/staging/iio/accel/adis16240_ring.c | 4 +-
> drivers/staging/iio/accel/lis3l02dq_ring.c | 3 +-
> drivers/staging/iio/adc/ad7298_ring.c | 9 +---
> drivers/staging/iio/adc/ad7476_ring.c | 10 +---
> drivers/staging/iio/adc/ad7606_ring.c | 10 +---
> drivers/staging/iio/adc/ad7793.c | 9 +---
> drivers/staging/iio/adc/ad7887_ring.c | 10 +---
> drivers/staging/iio/adc/ad799x_ring.c | 10 +---
> drivers/staging/iio/adc/max1363_ring.c | 9 +---
> drivers/staging/iio/gyro/adis16260_ring.c | 4 +-
> drivers/staging/iio/iio_core_trigger.h | 47 +++++++++++++++++
> drivers/staging/iio/imu/adis16400_ring.c | 4 +-
> drivers/staging/iio/industrialio-core.c | 2 +-
> drivers/staging/iio/industrialio-trigger.c | 8 ++-
> drivers/staging/iio/meter/ade7758_ring.c | 10 +---
> drivers/staging/iio/trigger.h | 46 +----------------
> drivers/staging/iio/trigger/iio-trig-sysfs.c | 7 +++
> drivers/staging/iio/trigger_consumer.h | 71 ++++++++++++++------------
> 22 files changed, 134 insertions(+), 155 deletions(-)
> create mode 100644 drivers/staging/iio/iio_core_trigger.h
>
^ permalink raw reply [flat|nested] 8+ messages in thread