Re: [PATCH v9 4/5] iio: trigger: Introduce IIO hrtimer based trigger
Tested-by: Matt Ranostay On Fri, Oct 23, 2015 at 5:32 AM, Daniel Baluta wrote: > This patch registers a new IIO software trigger interrupt source > based on high resolution timers. > > Notice that if configfs is enabled we create sampling_frequency > attribute allowing users to change hrtimer period (1/sampling_frequency). > > The IIO hrtimer trigger has a long history, this patch is based on > an older version from Marten and Lars-Peter. > > Signed-off-by: Marten Svanfeldt > Signed-off-by: Lars-Peter Clausen > Signed-off-by: Daniel Baluta > --- > drivers/iio/trigger/Kconfig| 10 ++ > drivers/iio/trigger/Makefile | 2 + > drivers/iio/trigger/iio-trig-hrtimer.c | 193 > + > 3 files changed, 205 insertions(+) > create mode 100644 drivers/iio/trigger/iio-trig-hrtimer.c > > diff --git a/drivers/iio/trigger/Kconfig b/drivers/iio/trigger/Kconfig > index 7999612..519e677 100644 > --- a/drivers/iio/trigger/Kconfig > +++ b/drivers/iio/trigger/Kconfig > @@ -5,6 +5,16 @@ > > menu "Triggers - standalone" > > +config IIO_HRTIMER_TRIGGER > + tristate "High resolution timer trigger" > + depends on IIO_SW_TRIGGER > + help > + Provides a frequency based IIO trigger using high resolution > + timers as interrupt source. > + > + To compile this driver as a module, choose M here: the > + module will be called iio-trig-hrtimer. > + > config IIO_INTERRUPT_TRIGGER > tristate "Generic interrupt trigger" > help > diff --git a/drivers/iio/trigger/Makefile b/drivers/iio/trigger/Makefile > index 0694dae..fe06eb5 100644 > --- a/drivers/iio/trigger/Makefile > +++ b/drivers/iio/trigger/Makefile > @@ -3,5 +3,7 @@ > # > > # When adding new entries keep the list in alphabetical order > + > +obj-$(CONFIG_IIO_HRTIMER_TRIGGER) += iio-trig-hrtimer.o > obj-$(CONFIG_IIO_INTERRUPT_TRIGGER) += iio-trig-interrupt.o > obj-$(CONFIG_IIO_SYSFS_TRIGGER) += iio-trig-sysfs.o > diff --git a/drivers/iio/trigger/iio-trig-hrtimer.c > b/drivers/iio/trigger/iio-trig-hrtimer.c > new file mode 100644 > index 000..5e6d451 > --- /dev/null > +++ b/drivers/iio/trigger/iio-trig-hrtimer.c > @@ -0,0 +1,193 @@ > +/** > + * The industrial I/O periodic hrtimer trigger driver > + * > + * Copyright (C) Intuitive Aerial AB > + * Written by Marten Svanfeldt, mar...@intuitiveaerial.com > + * Copyright (C) 2012, Analog Device Inc. > + * Author: Lars-Peter Clausen > + * Copyright (C) 2015, Intel Corporation > + * > + * 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 > +#include > +#include > + > +#include > +#include > +#include > + > +/* default sampling frequency - 100Hz */ > +#define HRTIMER_DEFAULT_SAMPLING_FREQUENCY 100 > + > +struct iio_hrtimer_info { > + struct iio_sw_trigger swt; > + struct hrtimer timer; > + unsigned long sampling_frequency; > + ktime_t period; > +}; > + > +static struct config_item_type iio_hrtimer_type = { > + .ct_owner = THIS_MODULE, > +}; > + > +static > +ssize_t iio_hrtimer_show_sampling_frequency(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct iio_trigger *trig = to_iio_trigger(dev); > + struct iio_hrtimer_info *info = iio_trigger_get_drvdata(trig); > + > + return snprintf(buf, PAGE_SIZE, "%lu\n", info->sampling_frequency); > +} > + > +static > +ssize_t iio_hrtimer_store_sampling_frequency(struct device *dev, > +struct device_attribute *attr, > +const char *buf, size_t len) > +{ > + struct iio_trigger *trig = to_iio_trigger(dev); > + struct iio_hrtimer_info *info = iio_trigger_get_drvdata(trig); > + unsigned long val; > + int ret; > + > + ret = kstrtoul(buf, 10, ); > + if (ret) > + return ret; > + > + if (!val || val > NSEC_PER_SEC) > + return -EINVAL; > + > + info->sampling_frequency = val; > + info->period = ktime_set(0, NSEC_PER_SEC / val); > + > + return len; > +} > + > +static DEVICE_ATTR(sampling_frequency, S_IRUGO | S_IWUSR, > + iio_hrtimer_show_sampling_frequency, > + iio_hrtimer_store_sampling_frequency); > + > +static struct attribute *iio_hrtimer_attrs[] = { > + _attr_sampling_frequency.attr, > + NULL > +}; > + > +static const struct attribute_group iio_hrtimer_attr_group = { > + .attrs = iio_hrtimer_attrs, > +}; > + > +static const struct attribute_group *iio_hrtimer_attr_groups[] = { > + _hrtimer_attr_group, > + NULL > +}; > + > +static enum hrtimer_restart iio_hrtimer_trig_handler(struct hrtimer *timer) > +{ > +
Re: [PATCH v9 4/5] iio: trigger: Introduce IIO hrtimer based trigger
Tested-by: Matt RanostayOn Fri, Oct 23, 2015 at 5:32 AM, Daniel Baluta wrote: > This patch registers a new IIO software trigger interrupt source > based on high resolution timers. > > Notice that if configfs is enabled we create sampling_frequency > attribute allowing users to change hrtimer period (1/sampling_frequency). > > The IIO hrtimer trigger has a long history, this patch is based on > an older version from Marten and Lars-Peter. > > Signed-off-by: Marten Svanfeldt > Signed-off-by: Lars-Peter Clausen > Signed-off-by: Daniel Baluta > --- > drivers/iio/trigger/Kconfig| 10 ++ > drivers/iio/trigger/Makefile | 2 + > drivers/iio/trigger/iio-trig-hrtimer.c | 193 > + > 3 files changed, 205 insertions(+) > create mode 100644 drivers/iio/trigger/iio-trig-hrtimer.c > > diff --git a/drivers/iio/trigger/Kconfig b/drivers/iio/trigger/Kconfig > index 7999612..519e677 100644 > --- a/drivers/iio/trigger/Kconfig > +++ b/drivers/iio/trigger/Kconfig > @@ -5,6 +5,16 @@ > > menu "Triggers - standalone" > > +config IIO_HRTIMER_TRIGGER > + tristate "High resolution timer trigger" > + depends on IIO_SW_TRIGGER > + help > + Provides a frequency based IIO trigger using high resolution > + timers as interrupt source. > + > + To compile this driver as a module, choose M here: the > + module will be called iio-trig-hrtimer. > + > config IIO_INTERRUPT_TRIGGER > tristate "Generic interrupt trigger" > help > diff --git a/drivers/iio/trigger/Makefile b/drivers/iio/trigger/Makefile > index 0694dae..fe06eb5 100644 > --- a/drivers/iio/trigger/Makefile > +++ b/drivers/iio/trigger/Makefile > @@ -3,5 +3,7 @@ > # > > # When adding new entries keep the list in alphabetical order > + > +obj-$(CONFIG_IIO_HRTIMER_TRIGGER) += iio-trig-hrtimer.o > obj-$(CONFIG_IIO_INTERRUPT_TRIGGER) += iio-trig-interrupt.o > obj-$(CONFIG_IIO_SYSFS_TRIGGER) += iio-trig-sysfs.o > diff --git a/drivers/iio/trigger/iio-trig-hrtimer.c > b/drivers/iio/trigger/iio-trig-hrtimer.c > new file mode 100644 > index 000..5e6d451 > --- /dev/null > +++ b/drivers/iio/trigger/iio-trig-hrtimer.c > @@ -0,0 +1,193 @@ > +/** > + * The industrial I/O periodic hrtimer trigger driver > + * > + * Copyright (C) Intuitive Aerial AB > + * Written by Marten Svanfeldt, mar...@intuitiveaerial.com > + * Copyright (C) 2012, Analog Device Inc. > + * Author: Lars-Peter Clausen > + * Copyright (C) 2015, Intel Corporation > + * > + * 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 > +#include > +#include > + > +#include > +#include > +#include > + > +/* default sampling frequency - 100Hz */ > +#define HRTIMER_DEFAULT_SAMPLING_FREQUENCY 100 > + > +struct iio_hrtimer_info { > + struct iio_sw_trigger swt; > + struct hrtimer timer; > + unsigned long sampling_frequency; > + ktime_t period; > +}; > + > +static struct config_item_type iio_hrtimer_type = { > + .ct_owner = THIS_MODULE, > +}; > + > +static > +ssize_t iio_hrtimer_show_sampling_frequency(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct iio_trigger *trig = to_iio_trigger(dev); > + struct iio_hrtimer_info *info = iio_trigger_get_drvdata(trig); > + > + return snprintf(buf, PAGE_SIZE, "%lu\n", info->sampling_frequency); > +} > + > +static > +ssize_t iio_hrtimer_store_sampling_frequency(struct device *dev, > +struct device_attribute *attr, > +const char *buf, size_t len) > +{ > + struct iio_trigger *trig = to_iio_trigger(dev); > + struct iio_hrtimer_info *info = iio_trigger_get_drvdata(trig); > + unsigned long val; > + int ret; > + > + ret = kstrtoul(buf, 10, ); > + if (ret) > + return ret; > + > + if (!val || val > NSEC_PER_SEC) > + return -EINVAL; > + > + info->sampling_frequency = val; > + info->period = ktime_set(0, NSEC_PER_SEC / val); > + > + return len; > +} > + > +static DEVICE_ATTR(sampling_frequency, S_IRUGO | S_IWUSR, > + iio_hrtimer_show_sampling_frequency, > + iio_hrtimer_store_sampling_frequency); > + > +static struct attribute *iio_hrtimer_attrs[] = { > + _attr_sampling_frequency.attr, > + NULL > +}; > + > +static const struct attribute_group iio_hrtimer_attr_group = { > + .attrs = iio_hrtimer_attrs, > +}; > + > +static const struct attribute_group *iio_hrtimer_attr_groups[] = { > +
[PATCH v9 4/5] iio: trigger: Introduce IIO hrtimer based trigger
This patch registers a new IIO software trigger interrupt source based on high resolution timers. Notice that if configfs is enabled we create sampling_frequency attribute allowing users to change hrtimer period (1/sampling_frequency). The IIO hrtimer trigger has a long history, this patch is based on an older version from Marten and Lars-Peter. Signed-off-by: Marten Svanfeldt Signed-off-by: Lars-Peter Clausen Signed-off-by: Daniel Baluta --- drivers/iio/trigger/Kconfig| 10 ++ drivers/iio/trigger/Makefile | 2 + drivers/iio/trigger/iio-trig-hrtimer.c | 193 + 3 files changed, 205 insertions(+) create mode 100644 drivers/iio/trigger/iio-trig-hrtimer.c diff --git a/drivers/iio/trigger/Kconfig b/drivers/iio/trigger/Kconfig index 7999612..519e677 100644 --- a/drivers/iio/trigger/Kconfig +++ b/drivers/iio/trigger/Kconfig @@ -5,6 +5,16 @@ menu "Triggers - standalone" +config IIO_HRTIMER_TRIGGER + tristate "High resolution timer trigger" + depends on IIO_SW_TRIGGER + help + Provides a frequency based IIO trigger using high resolution + timers as interrupt source. + + To compile this driver as a module, choose M here: the + module will be called iio-trig-hrtimer. + config IIO_INTERRUPT_TRIGGER tristate "Generic interrupt trigger" help diff --git a/drivers/iio/trigger/Makefile b/drivers/iio/trigger/Makefile index 0694dae..fe06eb5 100644 --- a/drivers/iio/trigger/Makefile +++ b/drivers/iio/trigger/Makefile @@ -3,5 +3,7 @@ # # When adding new entries keep the list in alphabetical order + +obj-$(CONFIG_IIO_HRTIMER_TRIGGER) += iio-trig-hrtimer.o obj-$(CONFIG_IIO_INTERRUPT_TRIGGER) += iio-trig-interrupt.o obj-$(CONFIG_IIO_SYSFS_TRIGGER) += iio-trig-sysfs.o diff --git a/drivers/iio/trigger/iio-trig-hrtimer.c b/drivers/iio/trigger/iio-trig-hrtimer.c new file mode 100644 index 000..5e6d451 --- /dev/null +++ b/drivers/iio/trigger/iio-trig-hrtimer.c @@ -0,0 +1,193 @@ +/** + * The industrial I/O periodic hrtimer trigger driver + * + * Copyright (C) Intuitive Aerial AB + * Written by Marten Svanfeldt, mar...@intuitiveaerial.com + * Copyright (C) 2012, Analog Device Inc. + * Author: Lars-Peter Clausen + * Copyright (C) 2015, Intel Corporation + * + * 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 +#include +#include + +#include +#include +#include + +/* default sampling frequency - 100Hz */ +#define HRTIMER_DEFAULT_SAMPLING_FREQUENCY 100 + +struct iio_hrtimer_info { + struct iio_sw_trigger swt; + struct hrtimer timer; + unsigned long sampling_frequency; + ktime_t period; +}; + +static struct config_item_type iio_hrtimer_type = { + .ct_owner = THIS_MODULE, +}; + +static +ssize_t iio_hrtimer_show_sampling_frequency(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct iio_trigger *trig = to_iio_trigger(dev); + struct iio_hrtimer_info *info = iio_trigger_get_drvdata(trig); + + return snprintf(buf, PAGE_SIZE, "%lu\n", info->sampling_frequency); +} + +static +ssize_t iio_hrtimer_store_sampling_frequency(struct device *dev, +struct device_attribute *attr, +const char *buf, size_t len) +{ + struct iio_trigger *trig = to_iio_trigger(dev); + struct iio_hrtimer_info *info = iio_trigger_get_drvdata(trig); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 10, ); + if (ret) + return ret; + + if (!val || val > NSEC_PER_SEC) + return -EINVAL; + + info->sampling_frequency = val; + info->period = ktime_set(0, NSEC_PER_SEC / val); + + return len; +} + +static DEVICE_ATTR(sampling_frequency, S_IRUGO | S_IWUSR, + iio_hrtimer_show_sampling_frequency, + iio_hrtimer_store_sampling_frequency); + +static struct attribute *iio_hrtimer_attrs[] = { + _attr_sampling_frequency.attr, + NULL +}; + +static const struct attribute_group iio_hrtimer_attr_group = { + .attrs = iio_hrtimer_attrs, +}; + +static const struct attribute_group *iio_hrtimer_attr_groups[] = { + _hrtimer_attr_group, + NULL +}; + +static enum hrtimer_restart iio_hrtimer_trig_handler(struct hrtimer *timer) +{ + struct iio_hrtimer_info *info; + + info = container_of(timer, struct iio_hrtimer_info, timer); + + hrtimer_forward_now(timer, info->period); + iio_trigger_poll(info->swt.trigger); + + return HRTIMER_RESTART; +} + +static int iio_trig_hrtimer_set_state(struct iio_trigger *trig, bool state) +{ + struct iio_hrtimer_info *trig_info; + +
[PATCH v9 4/5] iio: trigger: Introduce IIO hrtimer based trigger
This patch registers a new IIO software trigger interrupt source based on high resolution timers. Notice that if configfs is enabled we create sampling_frequency attribute allowing users to change hrtimer period (1/sampling_frequency). The IIO hrtimer trigger has a long history, this patch is based on an older version from Marten and Lars-Peter. Signed-off-by: Marten SvanfeldtSigned-off-by: Lars-Peter Clausen Signed-off-by: Daniel Baluta --- drivers/iio/trigger/Kconfig| 10 ++ drivers/iio/trigger/Makefile | 2 + drivers/iio/trigger/iio-trig-hrtimer.c | 193 + 3 files changed, 205 insertions(+) create mode 100644 drivers/iio/trigger/iio-trig-hrtimer.c diff --git a/drivers/iio/trigger/Kconfig b/drivers/iio/trigger/Kconfig index 7999612..519e677 100644 --- a/drivers/iio/trigger/Kconfig +++ b/drivers/iio/trigger/Kconfig @@ -5,6 +5,16 @@ menu "Triggers - standalone" +config IIO_HRTIMER_TRIGGER + tristate "High resolution timer trigger" + depends on IIO_SW_TRIGGER + help + Provides a frequency based IIO trigger using high resolution + timers as interrupt source. + + To compile this driver as a module, choose M here: the + module will be called iio-trig-hrtimer. + config IIO_INTERRUPT_TRIGGER tristate "Generic interrupt trigger" help diff --git a/drivers/iio/trigger/Makefile b/drivers/iio/trigger/Makefile index 0694dae..fe06eb5 100644 --- a/drivers/iio/trigger/Makefile +++ b/drivers/iio/trigger/Makefile @@ -3,5 +3,7 @@ # # When adding new entries keep the list in alphabetical order + +obj-$(CONFIG_IIO_HRTIMER_TRIGGER) += iio-trig-hrtimer.o obj-$(CONFIG_IIO_INTERRUPT_TRIGGER) += iio-trig-interrupt.o obj-$(CONFIG_IIO_SYSFS_TRIGGER) += iio-trig-sysfs.o diff --git a/drivers/iio/trigger/iio-trig-hrtimer.c b/drivers/iio/trigger/iio-trig-hrtimer.c new file mode 100644 index 000..5e6d451 --- /dev/null +++ b/drivers/iio/trigger/iio-trig-hrtimer.c @@ -0,0 +1,193 @@ +/** + * The industrial I/O periodic hrtimer trigger driver + * + * Copyright (C) Intuitive Aerial AB + * Written by Marten Svanfeldt, mar...@intuitiveaerial.com + * Copyright (C) 2012, Analog Device Inc. + * Author: Lars-Peter Clausen + * Copyright (C) 2015, Intel Corporation + * + * 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 +#include +#include + +#include +#include +#include + +/* default sampling frequency - 100Hz */ +#define HRTIMER_DEFAULT_SAMPLING_FREQUENCY 100 + +struct iio_hrtimer_info { + struct iio_sw_trigger swt; + struct hrtimer timer; + unsigned long sampling_frequency; + ktime_t period; +}; + +static struct config_item_type iio_hrtimer_type = { + .ct_owner = THIS_MODULE, +}; + +static +ssize_t iio_hrtimer_show_sampling_frequency(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct iio_trigger *trig = to_iio_trigger(dev); + struct iio_hrtimer_info *info = iio_trigger_get_drvdata(trig); + + return snprintf(buf, PAGE_SIZE, "%lu\n", info->sampling_frequency); +} + +static +ssize_t iio_hrtimer_store_sampling_frequency(struct device *dev, +struct device_attribute *attr, +const char *buf, size_t len) +{ + struct iio_trigger *trig = to_iio_trigger(dev); + struct iio_hrtimer_info *info = iio_trigger_get_drvdata(trig); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 10, ); + if (ret) + return ret; + + if (!val || val > NSEC_PER_SEC) + return -EINVAL; + + info->sampling_frequency = val; + info->period = ktime_set(0, NSEC_PER_SEC / val); + + return len; +} + +static DEVICE_ATTR(sampling_frequency, S_IRUGO | S_IWUSR, + iio_hrtimer_show_sampling_frequency, + iio_hrtimer_store_sampling_frequency); + +static struct attribute *iio_hrtimer_attrs[] = { + _attr_sampling_frequency.attr, + NULL +}; + +static const struct attribute_group iio_hrtimer_attr_group = { + .attrs = iio_hrtimer_attrs, +}; + +static const struct attribute_group *iio_hrtimer_attr_groups[] = { + _hrtimer_attr_group, + NULL +}; + +static enum hrtimer_restart iio_hrtimer_trig_handler(struct hrtimer *timer) +{ + struct iio_hrtimer_info *info; + + info = container_of(timer, struct iio_hrtimer_info, timer); + + hrtimer_forward_now(timer, info->period); + iio_trigger_poll(info->swt.trigger); + + return HRTIMER_RESTART; +} + +static int iio_trig_hrtimer_set_state(struct