All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6] Trigger locking rework and splitting up trigger.h
@ 2011-07-13 14:05 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
                   ` (6 more replies)
  0 siblings, 7 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 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

-- 
1.7.3.4


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [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

end of thread, other threads:[~2011-08-22 13:03 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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 ` [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 ` [PATCH 4/6] staging:iio: prevent removal of module connected to trigger Jonathan Cameron
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 ` [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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.