From: Jonathan Cameron <jic23@cam.ac.uk>
To: Jonathan Cameron <jic23@cam.ac.uk>
Cc: linux-iio@vger.kernel.org
Subject: Re: [PATCH 28/70] staging:iio: Add infrastructure for irq_chip based triggers
Date: Thu, 21 Apr 2011 17:51:42 +0100 [thread overview]
Message-ID: <4DB0609E.9020400@cam.ac.uk> (raw)
In-Reply-To: <1303067203-4894-29-git-send-email-jic23@cam.ac.uk>
Change of plan here.
It's perfectly possible, (but somewhat under utilized) to call irq_alloc_descs
to give us a dynamically allocated range of irq's. It may be dependant on sparse irq
though so will need to look into that or provide alternative method such
as this one.
> fix to merge back for the incorrect multiple trigger handling
>
> V2: Stop silly name duplication.
> Move pool handling to industrialio-trigger as that is the only user.
> Changed over to using irq_modify_status rather than the arm
> specific set_irq_flags as per Thomas Gleixner's suggestion.
>
> Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
> ---
> drivers/staging/Makefile | 2 +-
> drivers/staging/iio/Kconfig | 12 ++
> drivers/staging/iio/Makefile | 2 +
> drivers/staging/iio/iio-board-info.h | 24 +++
> drivers/staging/iio/iio-core.h | 13 ++
> drivers/staging/iio/industrialio-board-info.c | 25 +++
> drivers/staging/iio/industrialio-trigger.c | 200 +++++++++++++++++++++----
> drivers/staging/iio/trigger.h | 57 +++++++-
> 8 files changed, 298 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile
> index eb93012..0955c7c 100644
> --- a/drivers/staging/Makefile
> +++ b/drivers/staging/Makefile
> @@ -41,7 +41,7 @@ obj-$(CONFIG_VT6656) += vt6656/
> obj-$(CONFIG_HYPERV) += hv/
> obj-$(CONFIG_VME_BUS) += vme/
> obj-$(CONFIG_DX_SEP) += sep/
> -obj-$(CONFIG_IIO) += iio/
> +obj-y += iio/
> obj-$(CONFIG_CS5535_GPIO) += cs5535_gpio/
> obj-$(CONFIG_ZRAM) += zram/
> obj-$(CONFIG_XVMALLOC) += zram/
> diff --git a/drivers/staging/iio/Kconfig b/drivers/staging/iio/Kconfig
> index 6775bf9..df9aa08 100644
> --- a/drivers/staging/iio/Kconfig
> +++ b/drivers/staging/iio/Kconfig
> @@ -12,6 +12,10 @@ menuconfig IIO
> Documentation/industrialio for more information.
> if IIO
>
> +config IIO_BOARDINFO
> + boolean
> + default y
> +
> config IIO_RING_BUFFER
> bool "Enable ring buffer support within IIO"
> help
> @@ -42,12 +46,20 @@ endif # IIO_RINGBUFFER
>
> config IIO_TRIGGER
> boolean "Enable triggered sampling support"
> + depends on IIO_BOARDINFO
> help
> Provides IIO core support for triggers. Currently these
> are used to initialize capture of samples to push into
> ring buffers. The triggers are effectively a 'capture
> data now' interrupt.
>
> +config IIO_CONSUMERS_PER_TRIGGER
> + int "Maximum number of consumers per trigger"
> + depends on IIO_TRIGGER
> + default "2"
> + help
> + This value controls the maximum number of consumers that a
> + given trigger may handle. Default is 2.
>
> source "drivers/staging/iio/accel/Kconfig"
> source "drivers/staging/iio/adc/Kconfig"
> diff --git a/drivers/staging/iio/Makefile b/drivers/staging/iio/Makefile
> index bb5c95c..37b4d12 100644
> --- a/drivers/staging/iio/Makefile
> +++ b/drivers/staging/iio/Makefile
> @@ -2,6 +2,8 @@
> # Makefile for the industrial I/O core.
> #
>
> +obj-$(CONFIG_IIO_BOARDINFO) += industrialio-board-info.o
> +
> obj-$(CONFIG_IIO) += industrialio.o
> industrialio-y := industrialio-core.o
> industrialio-$(CONFIG_IIO_RING_BUFFER) += industrialio-ring.o
> diff --git a/drivers/staging/iio/iio-board-info.h b/drivers/staging/iio/iio-board-info.h
> new file mode 100644
> index 0000000..c608a4d
> --- /dev/null
> +++ b/drivers/staging/iio/iio-board-info.h
> @@ -0,0 +1,24 @@
> +/*
> + * Board information for IIO.
> + *
> + * Copyright (c) 2011 Jonathan Cameron <jic23@cam.ac.uk>
> + *
> + * 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_BOARDINFO
> +
> +/**
> + * iio_set_irq_pool() - provid iio with a pool of virtaul interrupts to use
> + * @start: start of the pool
> + * @num: number of interupts in the pool
> + **/
> +void iio_set_irq_pool(int start, int num);
> +
> +#else
> +
> +static inline void iio_set_irq_pool(int start, int num) {};
> +
> +#endif
> diff --git a/drivers/staging/iio/iio-core.h b/drivers/staging/iio/iio-core.h
> new file mode 100644
> index 0000000..2c4f433
> --- /dev/null
> +++ b/drivers/staging/iio/iio-core.h
> @@ -0,0 +1,13 @@
> +/*
> + * IIO core header. Should never be included by drivers.
> + *
> + * Copyright (c) 2011 Jonathan Cameron <jic23@cam.ac.uk>
> + *
> + * 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.
> + */
> +
> +#define IIO_MAX_POOL 128
> +extern int __iio_irqstart;
> +extern int __iio_irqnum;
> diff --git a/drivers/staging/iio/industrialio-board-info.c b/drivers/staging/iio/industrialio-board-info.c
> new file mode 100644
> index 0000000..28f9156
> --- /dev/null
> +++ b/drivers/staging/iio/industrialio-board-info.c
> @@ -0,0 +1,25 @@
> +/* IIO Board info
> + *
> + * Copyright (c) 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.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include "iio-core.h"
> +
> +int __iio_irqstart;
> +EXPORT_SYMBOL(__iio_irqstart);
> +int __iio_irqnum;
> +EXPORT_SYMBOL(__iio_irqnum);
> +
> +void __init iio_set_irq_pool(int start, int num)
> +{
> + __iio_irqstart = start;
> + __iio_irqnum = num;
> + if (num > IIO_MAX_POOL)
> + __iio_irqnum = IIO_MAX_POOL;
> +}
> diff --git a/drivers/staging/iio/industrialio-trigger.c b/drivers/staging/iio/industrialio-trigger.c
> index 083847c..9ccc789 100644
> --- a/drivers/staging/iio/industrialio-trigger.c
> +++ b/drivers/staging/iio/industrialio-trigger.c
> @@ -19,6 +19,7 @@
> #include "iio.h"
> #include "trigger.h"
> #include "trigger_consumer.h"
> +#include "iio-core.h"
>
> /* RFC - Question of approach
> * Make the common case (single sensor single trigger)
> @@ -38,6 +39,31 @@ static DEFINE_SPINLOCK(iio_trigger_idr_lock);
> static LIST_HEAD(iio_trigger_list);
> static DEFINE_MUTEX(iio_trigger_list_lock);
>
> +static DEFINE_MUTEX(iio_irq_pool_lock);
> +static unsigned long iio_irq_pool_mask[BITS_TO_LONGS(IIO_MAX_POOL)] = {};
> +
> +static int iio_irq_pool_get_range(int num)
> +{
> + int ret;
> +
> + mutex_lock(&iio_irq_pool_lock);
> + ret = bitmap_find_free_region(iio_irq_pool_mask,
> + __iio_irqnum, ilog2(num));
> + if (ret >= 0)
> + ret += __iio_irqstart;
> + mutex_unlock(&iio_irq_pool_lock);
> +
> + return ret;
> +}
> +
> +static void iio_irq_pool_put_range(int start, int num)
> +{
> + mutex_lock(&iio_irq_pool_lock);
> + bitmap_release_region(iio_irq_pool_mask,
> + start - __iio_irqstart, ilog2(num));
> + mutex_unlock(&iio_irq_pool_lock);
> +}
> +
> /**
> * iio_trigger_register_sysfs() - create a device for this trigger
> * @trig_info: the trigger
> @@ -163,6 +189,7 @@ static struct iio_trigger *iio_trigger_find_by_name(const char *name,
>
> void iio_trigger_poll(struct iio_trigger *trig, s64 time)
> {
> + int i;
> struct iio_poll_func *pf_cursor;
>
> list_for_each_entry(pf_cursor, &trig->pollfunc_list, list) {
> @@ -178,6 +205,13 @@ void iio_trigger_poll(struct iio_trigger *trig, s64 time)
> trig->use_count++;
> }
> }
> + if (!trig->use_count) {
> + for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++)
> + if (trig->subirqs[i].enabled) {
> + trig->use_count++;
> + generic_handle_irq(trig->subirq_base + i);
> + }
> + }
> }
> EXPORT_SYMBOL(iio_trigger_poll);
>
> @@ -219,16 +253,31 @@ int iio_trigger_attach_poll_func(struct iio_trigger *trig,
> int ret = 0;
> unsigned long flags;
>
> - spin_lock_irqsave(&trig->pollfunc_list_lock, flags);
> - list_add_tail(&pf->list, &trig->pollfunc_list);
> - spin_unlock_irqrestore(&trig->pollfunc_list_lock, flags);
> -
> - if (trig->set_trigger_state)
> - ret = trig->set_trigger_state(trig, true);
> - if (ret) {
> - printk(KERN_ERR "set trigger state failed\n");
> - list_del(&pf->list);
> + if (pf->thread) {
> + bool notinuse
> + = bitmap_empty(trig->pool,
> + CONFIG_IIO_CONSUMERS_PER_TRIGGER);
> +
> + pf->irq = iio_trigger_get_irq(trig);
> + ret = request_threaded_irq(pf->irq, pf->h, pf->thread,
> + pf->type, pf->name,
> + pf);
> + if (trig->set_trigger_state && notinuse) {
> + ret = trig->set_trigger_state(trig, true);
> + } else {
> + spin_lock_irqsave(&trig->pollfunc_list_lock, flags);
> + list_add_tail(&pf->list, &trig->pollfunc_list);
> + spin_unlock_irqrestore(&trig->pollfunc_list_lock, flags);
> +
> + if (trig->set_trigger_state)
> + ret = trig->set_trigger_state(trig, true);
> + }
> + if (ret) {
> + printk(KERN_ERR "set trigger state failed\n");
> + list_del(&pf->list);
> + }
> }
> +
> return ret;
> }
> EXPORT_SYMBOL(iio_trigger_attach_poll_func);
> @@ -240,37 +289,63 @@ int iio_trigger_dettach_poll_func(struct iio_trigger *trig,
> unsigned long flags;
> int ret = -EINVAL;
>
> - spin_lock_irqsave(&trig->pollfunc_list_lock, flags);
> - list_for_each_entry(pf_cursor, &trig->pollfunc_list, list)
> - if (pf_cursor == pf) {
> - ret = 0;
> - break;
> - }
> - if (!ret) {
> - if (list_is_singular(&trig->pollfunc_list)
> - && trig->set_trigger_state) {
> - spin_unlock_irqrestore(&trig->pollfunc_list_lock,
> - flags);
> - /* May sleep hence cannot hold the spin lock */
> + if (pf->thread) {
> + bool no_other_users
> + = (bitmap_weight(trig->pool,
> + CONFIG_IIO_CONSUMERS_PER_TRIGGER)
> + == 1);
> + if (trig->set_trigger_state && no_other_users) {
> ret = trig->set_trigger_state(trig, false);
> if (ret)
> goto error_ret;
> - spin_lock_irqsave(&trig->pollfunc_list_lock, flags);
> + } else
> + ret = 0;
> + iio_trigger_put_irq(trig, pf->irq);
> + free_irq(pf->irq, pf);
> + } else {
> + spin_lock_irqsave(&trig->pollfunc_list_lock, flags);
> + list_for_each_entry(pf_cursor, &trig->pollfunc_list, list)
> + if (pf_cursor == pf) {
> + ret = 0;
> + break;
> + }
> + if (!ret) {
> + if (list_is_singular(&trig->pollfunc_list)
> + && trig->set_trigger_state) {
> + spin_unlock_irqrestore(&trig
> + ->pollfunc_list_lock,
> + flags);
> + /* May sleep hence cannot hold the spin lock */
> + ret = trig->set_trigger_state(trig, false);
> + if (ret)
> + goto error_ret;
> + spin_lock_irqsave(&trig->pollfunc_list_lock,
> + flags);
> + }
> + /*
> + * Now we can delete safe in the knowledge that, if
> + * this is the last pollfunc then we have disabled
> + * the trigger anyway and so nothing should be able
> + * to call the pollfunc.
> + */
> + list_del(&pf_cursor->list);
> }
> - /*
> - * Now we can delete safe in the knowledge that, if this is
> - * the last pollfunc then we have disabled the trigger anyway
> - * and so nothing should be able to call the pollfunc.
> - */
> - list_del(&pf_cursor->list);
> + spin_unlock_irqrestore(&trig->pollfunc_list_lock, flags);
> }
> - spin_unlock_irqrestore(&trig->pollfunc_list_lock, flags);
>
> error_ret:
> return ret;
> }
> EXPORT_SYMBOL(iio_trigger_dettach_poll_func);
>
> +irqreturn_t iio_pollfunc_store_time(int irq, void *p)
> +{
> + struct iio_poll_func *pf = p;
> + pf->timestamp = iio_get_time_ns();
> + return IRQ_WAKE_THREAD;
> +}
> +EXPORT_SYMBOL(iio_pollfunc_store_time);
> +
> /**
> * iio_trigger_read_currrent() - trigger consumer sysfs query which trigger
> *
> @@ -337,6 +412,22 @@ static const struct attribute_group iio_trigger_consumer_attr_group = {
> static void iio_trig_release(struct device *device)
> {
> struct iio_trigger *trig = to_iio_trigger(device);
> + int i;
> +
> + if (trig->subirq_base) {
> + for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) {
> + irq_modify_status(trig->subirq_base + i,
> + IRQ_NOAUTOEN,
> + IRQ_NOREQUEST | IRQ_NOPROBE);
> + irq_set_chip(trig->subirq_base + i,
> + NULL);
> + irq_set_handler(trig->subirq_base + i,
> + NULL);
> + }
> +
> + iio_irq_pool_put_range(trig->subirq_base,
> + CONFIG_IIO_CONSUMERS_PER_TRIGGER);
> + }
> kfree(trig);
> iio_put();
> }
> @@ -345,11 +436,30 @@ static struct device_type iio_trig_type = {
> .release = iio_trig_release,
> };
>
> -struct iio_trigger *iio_allocate_trigger(void)
> +static void iio_trig_subirqmask(struct irq_data *d)
> +{
> + struct irq_chip *chip = irq_data_get_irq_chip(d);
> + struct iio_trigger *trig
> + = container_of(chip,
> + struct iio_trigger, subirq_chip);
> + trig->subirqs[d->irq - trig->subirq_base].enabled = false;
> +}
> +
> +static void iio_trig_subirqunmask(struct irq_data *d)
> +{
> + struct irq_chip *chip = irq_data_get_irq_chip(d);
> + struct iio_trigger *trig
> + = container_of(chip,
> + struct iio_trigger, subirq_chip);
> + trig->subirqs[d->irq - trig->subirq_base].enabled = true;
> +}
> +
> +struct iio_trigger *iio_allocate_trigger_named(const char *name)
> {
> struct iio_trigger *trig;
> trig = kzalloc(sizeof *trig, GFP_KERNEL);
> if (trig) {
> + int i;
> trig->dev.type = &iio_trig_type;
> trig->dev.bus = &iio_bus_type;
> device_initialize(&trig->dev);
> @@ -357,10 +467,40 @@ struct iio_trigger *iio_allocate_trigger(void)
> spin_lock_init(&trig->pollfunc_list_lock);
> INIT_LIST_HEAD(&trig->list);
> INIT_LIST_HEAD(&trig->pollfunc_list);
> +
> + if (name) {
> + mutex_init(&trig->pool_lock);
> + trig->subirq_base
> + = iio_irq_pool_get_range(
> + CONFIG_IIO_CONSUMERS_PER_TRIGGER);
> + if (trig->subirq_base < 0) {
> + kfree(trig);
> + return NULL;
> + }
> + trig->name = name;
> + trig->subirq_chip.name = name;
> + trig->subirq_chip.irq_mask = &iio_trig_subirqmask;
> + trig->subirq_chip.irq_unmask = &iio_trig_subirqunmask;
> + for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) {
> + irq_set_chip(trig->subirq_base + i,
> + &trig->subirq_chip);
> + irq_set_handler(trig->subirq_base + i,
> + &handle_simple_irq);
> + irq_modify_status(trig->subirq_base + i,
> + IRQ_NOREQUEST | IRQ_NOAUTOEN,
> + IRQ_NOPROBE);
> + }
> + }
> iio_get();
> }
> return trig;
> }
> +EXPORT_SYMBOL(iio_allocate_trigger_named);
> +
> +struct iio_trigger *iio_allocate_trigger(void)
> +{
> + return iio_allocate_trigger_named(NULL);
> +}
> EXPORT_SYMBOL(iio_allocate_trigger);
>
> void iio_free_trigger(struct iio_trigger *trig)
> diff --git a/drivers/staging/iio/trigger.h b/drivers/staging/iio/trigger.h
> index c6ab32f..0c44c5e 100644
> --- a/drivers/staging/iio/trigger.h
> +++ b/drivers/staging/iio/trigger.h
> @@ -6,9 +6,15 @@
> * under the terms of the GNU General Public License version 2 as published by
> * the Free Software Foundation.
> */
> +#include <linux/irq.h>
> +
> #ifndef _IIO_TRIGGER_H_
> #define _IIO_TRIGGER_H_
>
> +struct iio_subirq {
> + bool enabled;
> +};
> +
> /**
> * struct iio_trigger - industrial I/O trigger device
> *
> @@ -43,6 +49,13 @@ struct iio_trigger {
>
> int (*set_trigger_state)(struct iio_trigger *trig, bool state);
> int (*try_reenable)(struct iio_trigger *trig);
> +
> + struct irq_chip subirq_chip;
> + int subirq_base;
> +
> + struct iio_subirq subirqs[CONFIG_IIO_CONSUMERS_PER_TRIGGER];
> + unsigned long pool[BITS_TO_LONGS(CONFIG_IIO_CONSUMERS_PER_TRIGGER)];
> + struct mutex pool_lock;
> };
>
> static inline struct iio_trigger *to_iio_trigger(struct device *d)
> @@ -114,6 +127,27 @@ int iio_trigger_dettach_poll_func(struct iio_trigger *trig,
> void iio_trigger_poll(struct iio_trigger *trig, s64 time);
> void iio_trigger_notify_done(struct iio_trigger *trig);
>
> +static inline int iio_trigger_get_irq(struct iio_trigger *trig)
> +{
> + int ret;
> + mutex_lock(&trig->pool_lock);
> + ret = bitmap_find_free_region(trig->pool,
> + CONFIG_IIO_CONSUMERS_PER_TRIGGER,
> + ilog2(1));
> + mutex_unlock(&trig->pool_lock);
> + if (ret >= 0)
> + ret += trig->subirq_base;
> +
> + return ret;
> +};
> +
> +static inline void iio_trigger_put_irq(struct iio_trigger *trig, int irq)
> +{
> + mutex_lock(&trig->pool_lock);
> + clear_bit(irq - trig->subirq_base, trig->pool);
> + mutex_unlock(&trig->pool_lock);
> +};
> +
> /**
> * struct iio_poll_func - poll function pair
> *
> @@ -125,11 +159,14 @@ void iio_trigger_notify_done(struct iio_trigger *trig);
> * @poll_func_main: function in here is run after all immediates.
> * Reading from sensor etc typically involves
> * scheduling from here.
> - *
> - * The two stage approach used here is only important when multiple sensors are
> - * being triggered by a single trigger. This really comes into its own with
> - * simultaneous sampling devices where a simple latch command can be used to
> - * make the device store the values on all inputs.
> + * @h: the function that is actually run on trigger
> + * @thread: threaded interrupt part
> + * @type: the type of interrupt (basically if oneshot)
> + * @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 list_head list;
> @@ -137,12 +174,20 @@ struct iio_poll_func {
> void (*poll_func_immediate)(struct iio_dev *indio_dev);
> void (*poll_func_main)(struct iio_dev *private_data, s64 time);
>
> + irqreturn_t (*h)(int irq, void *p);
> + irqreturn_t (*thread)(int irq, void *p);
> + int type;
> + char *name;
> + int irq;
> + s64 timestamp;
> };
>
> int iio_alloc_pollfunc(struct iio_dev *indio_dev,
> void (*immediate)(struct iio_dev *indio_dev),
> void (*main)(struct iio_dev *private_data, s64 time));
>
> +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
> @@ -151,7 +196,7 @@ 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(void);
> -
> +struct iio_trigger *iio_allocate_trigger_named(const char *name);
> void iio_free_trigger(struct iio_trigger *trig);
>
> #endif /* _IIO_TRIGGER_H_ */
next prev parent reply other threads:[~2011-04-21 16:51 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-17 19:05 [PATCH 00/70] IIO: Major rework set (review request) Jonathan Cameron
2011-04-17 19:05 ` [PATCH 01/70] staging:iio: allow channels to be set up using a table of iio_channel_spec structures Jonathan Cameron
2011-04-17 19:05 ` [PATCH 02/70] staging:iio:lis3l02dq - move to new channel_spec approach Jonathan Cameron
2011-04-17 19:05 ` [PATCH 03/70] staging:iio:max1363 - move to channel_spec registration Jonathan Cameron
2011-04-17 19:05 ` [PATCH 04/70] staging:iio: remove ability to escalate events Jonathan Cameron
2011-04-17 19:05 ` [PATCH 05/70] staging:iio: Add polling of events on the ring access chrdev Jonathan Cameron
2011-04-17 19:05 ` [PATCH 06/70] staging:iio: remove legacy event chrdev for the buffers Jonathan Cameron
2011-04-17 19:05 ` [PATCH 07/70] staging:iio: Buffer device flattening Jonathan Cameron
2011-04-17 19:05 ` [PATCH 08/70] staging:iio:lis3l02dq: General cleanup Jonathan Cameron
2011-04-17 19:05 ` [PATCH 09/70] staging:iio: Push interrupt setup down into the drivers for event lines Jonathan Cameron
2011-04-17 19:05 ` [PATCH 10/70] staging:iio: lis3l02dq - separate entirely interrupt handling for thesholds from that for the datardy signal Jonathan Cameron
2011-04-17 19:05 ` [PATCH 11/70] staging:iio:sca3000 extract old event handling and move to poll for events from buffer Jonathan Cameron
2011-04-17 19:05 ` [PATCH 12/70] staging:iio:buffering remove unused parameter dead_offset from read_last_n in all buffer implementations Jonathan Cameron
2011-04-17 19:05 ` [PATCH 13/70] staging:iio:light:tsl2563 remove old style event registration Jonathan Cameron
2011-04-17 19:05 ` [PATCH 14/70] staging:iio:dac:ad5504 move from old to new event handling Jonathan Cameron
2011-04-17 19:05 ` [PATCH 15/70] staging:iio:adt7316 get rid of legacy event handling code Jonathan Cameron
2011-04-17 19:05 ` [PATCH 16/70] staging:iio:adc:ad7745 move from old to current event handling Jonathan Cameron
2011-04-17 19:05 ` [PATCH 17/70] staging:iio:adc:ad7816 " Jonathan Cameron
2011-04-17 19:05 ` [PATCH 18/70] staging:iio:adc:ad7150 move from deprecated " Jonathan Cameron
2011-04-17 19:05 ` [PATCH 19/70] staging:iio:adc:ad7152 remove unregister of interrupt line Jonathan Cameron
2011-04-17 19:05 ` [PATCH 20/70] staging:iio:adc:adt75 old to new event handling conversion Jonathan Cameron
2011-04-17 19:05 ` [PATCH 21/70] staging:iio:ad7291 move from old event system to current Jonathan Cameron
2011-04-17 19:05 ` [PATCH 22/70] staging:iio:adc:adt7410 move to current event handling Jonathan Cameron
2011-04-17 19:05 ` [PATCH 23/70] staging:iio:adt7310 " Jonathan Cameron
2011-04-17 19:05 ` [PATCH 24/70] staging:iio:adc:ad7314 remove unmatched unregister of event line Jonathan Cameron
2011-04-17 19:05 ` [PATCH 25/70] staging:iio:ad799x move to new event handling Jonathan Cameron
2011-04-17 19:05 ` [PATCH 26/70] staging:iio: Remove legacy " Jonathan Cameron
2011-04-17 19:06 ` [PATCH 27/70] staging:iio:lis3l02dq make threshold interrupt threaded Jonathan Cameron
2011-04-17 19:06 ` [PATCH 28/70] staging:iio: Add infrastructure for irq_chip based triggers Jonathan Cameron
2011-04-21 16:51 ` Jonathan Cameron [this message]
2011-04-26 15:10 ` Jonathan Cameron
2011-04-17 19:06 ` [PATCH 29/70] staging:iio:Documentation generic_buffer.c update to new abi for buffers + misc fixes Jonathan Cameron
2011-04-17 19:06 ` [PATCH 30/70] staging:iio:ring_sw add function needed for threaded irq Jonathan Cameron
2011-04-17 19:06 ` [PATCH 31/70] staging:iio: add generic data ready poll function Jonathan Cameron
2011-04-17 19:06 ` [PATCH 32/70] staging:iio:lis3l02dq move to threaded trigger handling Jonathan Cameron
2011-04-17 19:06 ` [PATCH 33/70] staging:iio:max1363 move to irqchip based threaded irq triggering Jonathan Cameron
2011-04-17 19:06 ` [PATCH 34/70] staging:iio:ad7476 use channel_spec Jonathan Cameron
2011-04-17 19:06 ` [PATCH 35/70] staging:iio:ad7476 move to irqchip based triggering Jonathan Cameron
2011-04-17 19:06 ` [PATCH 36/70] staging:iio:meter:ade7758 move to irqchip based trigger handling Jonathan Cameron
2011-04-17 19:06 ` [PATCH 37/70] staging:iio:adis16400 move to irq based triggers and channel spec channel registration Jonathan Cameron
2011-04-17 19:06 ` [PATCH 38/70] staging:iio:imu:adis16350 etc support into adis16400 driver Jonathan Cameron
2011-04-17 19:06 ` [PATCH 39/70] staging:iio:imu remove old adis16350. Support now in " Jonathan Cameron
2011-04-17 19:06 ` [PATCH 40/70] staging:iio:imu:adis16400 add support for adis16300 Jonathan Cameron
2011-04-17 19:06 ` [PATCH 41/70] staging:iio:imu remove adis16300 driver Jonathan Cameron
2011-04-17 19:06 ` [PATCH 42/70] staging:iio:accel:adis16201 move to irqchip based trigger handling Jonathan Cameron
2011-04-17 19:06 ` [PATCH 43/70] staging:iio:accel:adis16203 " Jonathan Cameron
2011-04-17 19:06 ` [PATCH 44/70] staging:iio:accel:adis16204 " Jonathan Cameron
2011-04-17 19:06 ` [PATCH 45/70] staging:iio:accel:adis16209 " Jonathan Cameron
2011-04-17 19:06 ` [PATCH 46/70] staging:iio:accel:adis16240 " Jonathan Cameron
2011-04-17 19:06 ` [PATCH 47/70] staging:iio:adc:ad7298 " Jonathan Cameron
2011-04-17 19:06 ` [PATCH 48/70] staging:iio:ad7606 conversion to irq_chip based polling Jonathan Cameron
2011-04-18 7:52 ` Hennerich, Michael
2011-04-18 9:57 ` Jonathan Cameron
2011-04-17 19:06 ` [PATCH 49/70] staging:iio:adc:ad7887 move to irqchip based trigger handling Jonathan Cameron
2011-04-17 19:06 ` [PATCH 50/70] staging:iio:adc:ad799x " Jonathan Cameron
2011-04-17 19:06 ` [PATCH 51/70] staging:iio:gyro:adis16260 " Jonathan Cameron
2011-04-17 19:06 ` [PATCH 52/70] staging:iio:trigger remove legacy pollfunc elements Jonathan Cameron
2011-04-17 19:06 ` [PATCH 53/70] staging:iio: Add core attribute handling for name of device Jonathan Cameron
2011-04-17 20:06 ` Jonathan Cameron
2011-04-18 12:17 ` Jonathan Cameron
2011-04-17 19:06 ` [PATCH 54/70] staging:iio: use the new central name attribute creation code Jonathan Cameron
2011-04-17 19:06 ` [PATCH 55/70] staging:iio:accel:adis16201 move to chan_spec based setup Jonathan Cameron
2011-04-17 19:06 ` [PATCH 56/70] staging:iio:accel:adis16203 " Jonathan Cameron
2011-04-17 19:06 ` [PATCH 57/70] staging:iio:accel:adis16204 " Jonathan Cameron
2011-04-17 19:06 ` [PATCH 58/70] staging:iio:accel:adis16209 " Jonathan Cameron
2011-04-17 19:06 ` [PATCH 59/70] staging:iio:accel: lis3l02dq add writing for calibscale and calibbias Jonathan Cameron
2011-04-17 19:06 ` [PATCH 60/70] staging:iio: Add chan info support for 'peak_raw' attributes Jonathan Cameron
2011-04-17 19:06 ` [PATCH 61/70] staging:iio:accel:adis16240 move to chan_spec based setup Jonathan Cameron
2011-04-17 19:06 ` [PATCH 62/70] staging:iio: Add angl parameters to the chan spec code Jonathan Cameron
2011-04-17 19:06 ` [PATCH 63/70] staging:iio:gyro:adis16260 move to chan_spec based setup Jonathan Cameron
2011-04-17 19:06 ` [PATCH 64/70] staging:iio: rip out scan_el attributes. Now handled as iio_dev_attrs like everything else Jonathan Cameron
2011-04-17 19:06 ` [PATCH 65/70] staging:iio:max1363 trivial removal of unused trig pointer Jonathan Cameron
2011-04-17 19:06 ` [PATCH 66/70] staging:iio:max1363 add new 2 channels parts form maxim, 11644-7 Jonathan Cameron
2011-04-17 19:06 ` [PATCH 67/70] staging:iio:trigger sysfs userspace trigger rework Jonathan Cameron
2011-04-17 19:06 ` [PATCH 68/70] staging:iio:core clean out unused elements Jonathan Cameron
2011-04-17 19:06 ` [PATCH 69/70] staging:iio:buffer - remove unused event code for buffer events Jonathan Cameron
2011-04-17 19:06 ` [PATCH 70/70] staging:iio:lis3l02dq remerge the two interrupt handlers Jonathan Cameron
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4DB0609E.9020400@cam.ac.uk \
--to=jic23@cam.ac.uk \
--cc=linux-iio@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.