Re: [PATCH v4 1/4] iio: Support triggered events

2015-08-27 Thread Jonathan Cameron
On 20/08/15 20:43, Vladimir Barinov wrote:
 Verified event and buffer polling works concurrently on the same trigger with 
 hi-8435.
 The buffer interface part for hi-8435 was not sent.
 
 On 20.08.2015 22:37, Vladimir Barinov wrote:
 Support triggered events.

 This is useful for chips that don't have their own interrupt sources.
 It allows to use generic/standalone iio triggers for those drivers.

 Signed-off-by: Vladimir Barinov vladimir.bari...@cogentembedded.com
Applied with a certain amount of fuzz (the buffers have moved out into
their own directory).

Jonathan
 ---
 Changes in version 2:
 - initially added
 Changes in version 3:
 - fixed grammar in patch description
 - changed license header to match GNU Public License v2 or later
 Changes in version 4:
 - added pollfunc_event to separate triggering buffer and event
 interfaces. This allows runnig both from the same trigger
 - removed 'currentmode' for triggered buffer since useless
 - renamed parameters of iio_triggered_event_setup

   drivers/iio/Kconfig|  6 +++
   drivers/iio/Makefile   |  1 +
   drivers/iio/industrialio-core.c|  4 +-
   drivers/iio/industrialio-trigger.c | 12 +-
   drivers/iio/industrialio-triggered-event.c | 68 
 ++
   include/linux/iio/iio.h|  3 ++
   include/linux/iio/triggered_event.h| 11 +
   7 files changed, 101 insertions(+), 4 deletions(-)
   create mode 100644 drivers/iio/industrialio-triggered-event.c
   create mode 100644 include/linux/iio/triggered_event.h

 diff --git a/drivers/iio/Kconfig b/drivers/iio/Kconfig
 index 4011eff..8fcc92f 100644
 --- a/drivers/iio/Kconfig
 +++ b/drivers/iio/Kconfig
 @@ -58,6 +58,12 @@ config IIO_CONSUMERS_PER_TRIGGER
   This value controls the maximum number of consumers that a
   given trigger may handle. Default is 2.
   +config IIO_TRIGGERED_EVENT
 +tristate
 +select IIO_TRIGGER
 +help
 +  Provides helper functions for setting up triggered events.
 +
   source drivers/iio/accel/Kconfig
   source drivers/iio/adc/Kconfig
   source drivers/iio/amplifiers/Kconfig
 diff --git a/drivers/iio/Makefile b/drivers/iio/Makefile
 index 698afc2..40dc13e 100644
 --- a/drivers/iio/Makefile
 +++ b/drivers/iio/Makefile
 @@ -9,6 +9,7 @@ industrialio-$(CONFIG_IIO_TRIGGER) += industrialio-trigger.o
   industrialio-$(CONFIG_IIO_BUFFER_CB) += buffer_cb.o
 obj-$(CONFIG_IIO_TRIGGERED_BUFFER) += industrialio-triggered-buffer.o
 +obj-$(CONFIG_IIO_TRIGGERED_EVENT) += industrialio-triggered-event.o
   obj-$(CONFIG_IIO_KFIFO_BUF) += kfifo_buf.o
 obj-y += accel/
 diff --git a/drivers/iio/industrialio-core.c 
 b/drivers/iio/industrialio-core.c
 index b3fcc2c..2c3b6a1 100644
 --- a/drivers/iio/industrialio-core.c
 +++ b/drivers/iio/industrialio-core.c
 @@ -962,7 +962,7 @@ static void iio_device_unregister_sysfs(struct iio_dev 
 *indio_dev)
   static void iio_dev_release(struct device *device)
   {
   struct iio_dev *indio_dev = dev_to_iio_dev(device);
 -if (indio_dev-modes  INDIO_BUFFER_TRIGGERED)
 +if (indio_dev-modes  (INDIO_BUFFER_TRIGGERED | INDIO_EVENT_TRIGGERED))
   iio_device_unregister_trigger_consumer(indio_dev);
   iio_device_unregister_eventset(indio_dev);
   iio_device_unregister_sysfs(indio_dev);
 @@ -1241,7 +1241,7 @@ int iio_device_register(struct iio_dev *indio_dev)
   Failed to register event set\n);
   goto error_free_sysfs;
   }
 -if (indio_dev-modes  INDIO_BUFFER_TRIGGERED)
 +if (indio_dev-modes  (INDIO_BUFFER_TRIGGERED | INDIO_EVENT_TRIGGERED))
   iio_device_register_trigger_consumer(indio_dev);
 if ((indio_dev-modes  INDIO_ALL_BUFFER_MODES) 
 diff --git a/drivers/iio/industrialio-trigger.c 
 b/drivers/iio/industrialio-trigger.c
 index 570606c..ae2806a 100644
 --- a/drivers/iio/industrialio-trigger.c
 +++ b/drivers/iio/industrialio-trigger.c
 @@ -366,10 +366,18 @@ static ssize_t iio_trigger_write_current(struct device 
 *dev,
 indio_dev-trig = trig;
   -if (oldtrig)
 +if (oldtrig) {
 +if (indio_dev-modes  INDIO_EVENT_TRIGGERED)
 +iio_trigger_detach_poll_func(oldtrig,
 + indio_dev-pollfunc_event);
   iio_trigger_put(oldtrig);
 -if (indio_dev-trig)
 +}
 +if (indio_dev-trig) {
   iio_trigger_get(indio_dev-trig);
 +if (indio_dev-modes  INDIO_EVENT_TRIGGERED)
 +iio_trigger_attach_poll_func(indio_dev-trig,
 + indio_dev-pollfunc_event);
 +}
 return len;
   }
 diff --git a/drivers/iio/industrialio-triggered-event.c 
 b/drivers/iio/industrialio-triggered-event.c
 new file mode 100644
 index 000..8cc254f
 --- /dev/null
 +++ b/drivers/iio/industrialio-triggered-event.c
 @@ -0,0 +1,68 @@
 +/*
 + * Copyright (C) 2015 Cogent Embedded, Inc.
 + *
 + * This program is free software; you can redistribute  it and/or modify it
 

[PATCH v4 1/4] iio: Support triggered events

2015-08-20 Thread Vladimir Barinov
Support triggered events.

This is useful for chips that don't have their own interrupt sources.
It allows to use generic/standalone iio triggers for those drivers.

Signed-off-by: Vladimir Barinov vladimir.bari...@cogentembedded.com
---
Changes in version 2:
- initially added
Changes in version 3:
- fixed grammar in patch description
- changed license header to match GNU Public License v2 or later
Changes in version 4:
- added pollfunc_event to separate triggering buffer and event
interfaces. This allows runnig both from the same trigger
- removed 'currentmode' for triggered buffer since useless
- renamed parameters of iio_triggered_event_setup

 drivers/iio/Kconfig|  6 +++
 drivers/iio/Makefile   |  1 +
 drivers/iio/industrialio-core.c|  4 +-
 drivers/iio/industrialio-trigger.c | 12 +-
 drivers/iio/industrialio-triggered-event.c | 68 ++
 include/linux/iio/iio.h|  3 ++
 include/linux/iio/triggered_event.h| 11 +
 7 files changed, 101 insertions(+), 4 deletions(-)
 create mode 100644 drivers/iio/industrialio-triggered-event.c
 create mode 100644 include/linux/iio/triggered_event.h

diff --git a/drivers/iio/Kconfig b/drivers/iio/Kconfig
index 4011eff..8fcc92f 100644
--- a/drivers/iio/Kconfig
+++ b/drivers/iio/Kconfig
@@ -58,6 +58,12 @@ config IIO_CONSUMERS_PER_TRIGGER
This value controls the maximum number of consumers that a
given trigger may handle. Default is 2.
 
+config IIO_TRIGGERED_EVENT
+   tristate
+   select IIO_TRIGGER
+   help
+ Provides helper functions for setting up triggered events.
+
 source drivers/iio/accel/Kconfig
 source drivers/iio/adc/Kconfig
 source drivers/iio/amplifiers/Kconfig
diff --git a/drivers/iio/Makefile b/drivers/iio/Makefile
index 698afc2..40dc13e 100644
--- a/drivers/iio/Makefile
+++ b/drivers/iio/Makefile
@@ -9,6 +9,7 @@ industrialio-$(CONFIG_IIO_TRIGGER) += industrialio-trigger.o
 industrialio-$(CONFIG_IIO_BUFFER_CB) += buffer_cb.o
 
 obj-$(CONFIG_IIO_TRIGGERED_BUFFER) += industrialio-triggered-buffer.o
+obj-$(CONFIG_IIO_TRIGGERED_EVENT) += industrialio-triggered-event.o
 obj-$(CONFIG_IIO_KFIFO_BUF) += kfifo_buf.o
 
 obj-y += accel/
diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
index b3fcc2c..2c3b6a1 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -962,7 +962,7 @@ static void iio_device_unregister_sysfs(struct iio_dev 
*indio_dev)
 static void iio_dev_release(struct device *device)
 {
struct iio_dev *indio_dev = dev_to_iio_dev(device);
-   if (indio_dev-modes  INDIO_BUFFER_TRIGGERED)
+   if (indio_dev-modes  (INDIO_BUFFER_TRIGGERED | INDIO_EVENT_TRIGGERED))
iio_device_unregister_trigger_consumer(indio_dev);
iio_device_unregister_eventset(indio_dev);
iio_device_unregister_sysfs(indio_dev);
@@ -1241,7 +1241,7 @@ int iio_device_register(struct iio_dev *indio_dev)
Failed to register event set\n);
goto error_free_sysfs;
}
-   if (indio_dev-modes  INDIO_BUFFER_TRIGGERED)
+   if (indio_dev-modes  (INDIO_BUFFER_TRIGGERED | INDIO_EVENT_TRIGGERED))
iio_device_register_trigger_consumer(indio_dev);
 
if ((indio_dev-modes  INDIO_ALL_BUFFER_MODES) 
diff --git a/drivers/iio/industrialio-trigger.c 
b/drivers/iio/industrialio-trigger.c
index 570606c..ae2806a 100644
--- a/drivers/iio/industrialio-trigger.c
+++ b/drivers/iio/industrialio-trigger.c
@@ -366,10 +366,18 @@ static ssize_t iio_trigger_write_current(struct device 
*dev,
 
indio_dev-trig = trig;
 
-   if (oldtrig)
+   if (oldtrig) {
+   if (indio_dev-modes  INDIO_EVENT_TRIGGERED)
+   iio_trigger_detach_poll_func(oldtrig,
+indio_dev-pollfunc_event);
iio_trigger_put(oldtrig);
-   if (indio_dev-trig)
+   }
+   if (indio_dev-trig) {
iio_trigger_get(indio_dev-trig);
+   if (indio_dev-modes  INDIO_EVENT_TRIGGERED)
+   iio_trigger_attach_poll_func(indio_dev-trig,
+indio_dev-pollfunc_event);
+   }
 
return len;
 }
diff --git a/drivers/iio/industrialio-triggered-event.c 
b/drivers/iio/industrialio-triggered-event.c
new file mode 100644
index 000..8cc254f
--- /dev/null
+++ b/drivers/iio/industrialio-triggered-event.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2015 Cogent Embedded, Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#include linux/kernel.h
+#include linux/export.h
+#include linux/module.h
+#include