On Fri, Feb 26, 2016 at 11:36 AM, Lars-Peter Clausen <lars@xxxxxxxxxx> wrote: > With the recently introduced hrtimer based trigger we have a fully > functional replacement for the RTC timer trigger that is more flexible and > has a better interface to instantiate and manage the trigger instances. The > RTC trigger timer could only be instantiated using platform devices which > makes it unsuitable for modern devicetree based platforms, while the > hrtimer trigger has a configfs based interface that allows creating and > deletion of triggers at runtime. > > In addition since a few years the periodic RTC timer is internally always > emulated using a hrtimer using the hrtimer interface directly will yield > the same timing precision. So using the RTC timer won't have any advantages > on this front either. > > There is also no evidence that the periodic RTC trigger is currently > actually being used on any system. So considering all this remove the > driver. Also remove the related item from the TODO list. > > Signed-off-by: Lars-Peter Clausen <lars@xxxxxxxxxx> Acked-by: Daniel Baluta <daniel.baluta@xxxxxxxxx> > --- > drivers/staging/iio/TODO | 8 - > drivers/staging/iio/trigger/Kconfig | 10 - > drivers/staging/iio/trigger/Makefile | 1 - > .../staging/iio/trigger/iio-trig-periodic-rtc.c | 216 --------------------- > 4 files changed, 235 deletions(-) > delete mode 100644 drivers/staging/iio/trigger/iio-trig-periodic-rtc.c > > diff --git a/drivers/staging/iio/TODO b/drivers/staging/iio/TODO > index c22a0ed..93a8968 100644 > --- a/drivers/staging/iio/TODO > +++ b/drivers/staging/iio/TODO > @@ -58,14 +58,6 @@ different requirements. This one suits mid range > frequencies (100Hz - 4kHz). > 2) Lots of testing > > -Periodic Timer trigger > -1) Move to a more general hardware periodic timer request > -subsystem. Current approach is abusing purpose of RTC. > -Initial discussions have taken place, but no actual code > -is in place as yet. This topic will be reopened on lkml > -shortly. I don't really envision this patch being merged > -in anything like its current form. > - > GPIO trigger > 1) Add control over the type of interrupt etc. This will > necessitate a header that is also visible from arch board > diff --git a/drivers/staging/iio/trigger/Kconfig b/drivers/staging/iio/trigger/Kconfig > index 710a2f3..0b01d24 100644 > --- a/drivers/staging/iio/trigger/Kconfig > +++ b/drivers/staging/iio/trigger/Kconfig > @@ -5,16 +5,6 @@ comment "Triggers - standalone" > > if IIO_TRIGGER > > -config IIO_PERIODIC_RTC_TRIGGER > - tristate "Periodic RTC triggers" > - depends on RTC_CLASS > - help > - Provides support for using periodic capable real time > - clocks as IIO triggers. > - > - To compile this driver as a module, choose M here: the > - module will be called iio-trig-periodic-rtc. > - > config IIO_BFIN_TMR_TRIGGER > tristate "Blackfin TIMER trigger" > depends on BLACKFIN > diff --git a/drivers/staging/iio/trigger/Makefile b/drivers/staging/iio/trigger/Makefile > index 238481b..1300a21 100644 > --- a/drivers/staging/iio/trigger/Makefile > +++ b/drivers/staging/iio/trigger/Makefile > @@ -2,5 +2,4 @@ > # Makefile for triggers not associated with iio-devices > # > > -obj-$(CONFIG_IIO_PERIODIC_RTC_TRIGGER) += iio-trig-periodic-rtc.o > obj-$(CONFIG_IIO_BFIN_TMR_TRIGGER) += iio-trig-bfin-timer.o > diff --git a/drivers/staging/iio/trigger/iio-trig-periodic-rtc.c b/drivers/staging/iio/trigger/iio-trig-periodic-rtc.c > deleted file mode 100644 > index 00d1393..0000000 > --- a/drivers/staging/iio/trigger/iio-trig-periodic-rtc.c > +++ /dev/null > @@ -1,216 +0,0 @@ > -/* The industrial I/O periodic RTC trigger driver > - * > - * 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. > - * > - * This is a heavily rewritten version of the periodic timer system in > - * earlier version of industrialio. It supplies the same functionality > - * but via a trigger rather than a specific periodic timer system. > - */ > - > -#include <linux/platform_device.h> > -#include <linux/kernel.h> > -#include <linux/module.h> > -#include <linux/slab.h> > -#include <linux/rtc.h> > -#include <linux/iio/iio.h> > -#include <linux/iio/trigger.h> > - > -static LIST_HEAD(iio_prtc_trigger_list); > -static DEFINE_MUTEX(iio_prtc_trigger_list_lock); > - > -struct iio_prtc_trigger_info { > - struct rtc_device *rtc; > - unsigned int frequency; > - struct rtc_task task; > - bool state; > -}; > - > -static int iio_trig_periodic_rtc_set_state(struct iio_trigger *trig, bool state) > -{ > - struct iio_prtc_trigger_info *trig_info = iio_trigger_get_drvdata(trig); > - int ret; > - > - if (trig_info->frequency == 0 && state) > - return -EINVAL; > - dev_dbg(&trig_info->rtc->dev, "trigger frequency is %u\n", > - trig_info->frequency); > - ret = rtc_irq_set_state(trig_info->rtc, &trig_info->task, state); > - if (!ret) > - trig_info->state = state; > - > - return ret; > -} > - > -static ssize_t iio_trig_periodic_read_freq(struct device *dev, > - struct device_attribute *attr, > - char *buf) > -{ > - struct iio_trigger *trig = to_iio_trigger(dev); > - struct iio_prtc_trigger_info *trig_info = iio_trigger_get_drvdata(trig); > - > - return sprintf(buf, "%u\n", trig_info->frequency); > -} > - > -static ssize_t iio_trig_periodic_write_freq(struct device *dev, > - struct device_attribute *attr, > - const char *buf, > - size_t len) > -{ > - struct iio_trigger *trig = to_iio_trigger(dev); > - struct iio_prtc_trigger_info *trig_info = iio_trigger_get_drvdata(trig); > - unsigned int val; > - int ret; > - > - ret = kstrtouint(buf, 10, &val); > - if (ret) > - goto error_ret; > - > - if (val > 0) { > - ret = rtc_irq_set_freq(trig_info->rtc, &trig_info->task, val); > - if (ret == 0 && trig_info->state && trig_info->frequency == 0) > - ret = rtc_irq_set_state(trig_info->rtc, > - &trig_info->task, 1); > - } else { > - ret = rtc_irq_set_state(trig_info->rtc, &trig_info->task, 0); > - } > - if (ret) > - goto error_ret; > - > - trig_info->frequency = val; > - > - return len; > - > -error_ret: > - return ret; > -} > - > -static DEVICE_ATTR(frequency, S_IRUGO | S_IWUSR, > - iio_trig_periodic_read_freq, > - iio_trig_periodic_write_freq); > - > -static struct attribute *iio_trig_prtc_attrs[] = { > - &dev_attr_frequency.attr, > - NULL, > -}; > - > -static const struct attribute_group iio_trig_prtc_attr_group = { > - .attrs = iio_trig_prtc_attrs, > -}; > - > -static const struct attribute_group *iio_trig_prtc_attr_groups[] = { > - &iio_trig_prtc_attr_group, > - NULL > -}; > - > -static void iio_prtc_trigger_poll(void *private_data) > -{ > - iio_trigger_poll(private_data); > -} > - > -static const struct iio_trigger_ops iio_prtc_trigger_ops = { > - .owner = THIS_MODULE, > - .set_trigger_state = &iio_trig_periodic_rtc_set_state, > -}; > - > -static int iio_trig_periodic_rtc_probe(struct platform_device *dev) > -{ > - char **pdata = dev->dev.platform_data; > - struct iio_prtc_trigger_info *trig_info; > - struct iio_trigger *trig, *trig2; > - > - int i, ret; > - > - for (i = 0;; i++) { > - if (!pdata[i]) > - break; > - trig = iio_trigger_alloc("periodic%s", pdata[i]); > - if (!trig) { > - ret = -ENOMEM; > - goto error_free_completed_registrations; > - } > - list_add(&trig->alloc_list, &iio_prtc_trigger_list); > - > - trig_info = kzalloc(sizeof(*trig_info), GFP_KERNEL); > - if (!trig_info) { > - ret = -ENOMEM; > - goto error_put_trigger_and_remove_from_list; > - } > - iio_trigger_set_drvdata(trig, trig_info); > - trig->ops = &iio_prtc_trigger_ops; > - /* RTC access */ > - trig_info->rtc = rtc_class_open(pdata[i]); > - if (!trig_info->rtc) { > - ret = -EINVAL; > - goto error_free_trig_info; > - } > - trig_info->task.func = iio_prtc_trigger_poll; > - trig_info->task.private_data = trig; > - ret = rtc_irq_register(trig_info->rtc, &trig_info->task); > - if (ret) > - goto error_close_rtc; > - trig->dev.groups = iio_trig_prtc_attr_groups; > - ret = iio_trigger_register(trig); > - if (ret) > - goto error_unregister_rtc_irq; > - } > - return 0; > -error_unregister_rtc_irq: > - rtc_irq_unregister(trig_info->rtc, &trig_info->task); > -error_close_rtc: > - rtc_class_close(trig_info->rtc); > -error_free_trig_info: > - kfree(trig_info); > -error_put_trigger_and_remove_from_list: > - list_del(&trig->alloc_list); > - iio_trigger_put(trig); > -error_free_completed_registrations: > - list_for_each_entry_safe(trig, > - trig2, > - &iio_prtc_trigger_list, > - alloc_list) { > - trig_info = iio_trigger_get_drvdata(trig); > - rtc_irq_unregister(trig_info->rtc, &trig_info->task); > - rtc_class_close(trig_info->rtc); > - kfree(trig_info); > - iio_trigger_unregister(trig); > - } > - return ret; > -} > - > -static int iio_trig_periodic_rtc_remove(struct platform_device *dev) > -{ > - struct iio_trigger *trig, *trig2; > - struct iio_prtc_trigger_info *trig_info; > - > - mutex_lock(&iio_prtc_trigger_list_lock); > - list_for_each_entry_safe(trig, > - trig2, > - &iio_prtc_trigger_list, > - alloc_list) { > - trig_info = iio_trigger_get_drvdata(trig); > - rtc_irq_unregister(trig_info->rtc, &trig_info->task); > - rtc_class_close(trig_info->rtc); > - kfree(trig_info); > - iio_trigger_unregister(trig); > - } > - mutex_unlock(&iio_prtc_trigger_list_lock); > - return 0; > -} > - > -static struct platform_driver iio_trig_periodic_rtc_driver = { > - .probe = iio_trig_periodic_rtc_probe, > - .remove = iio_trig_periodic_rtc_remove, > - .driver = { > - .name = "iio_prtc_trigger", > - }, > -}; > - > -module_platform_driver(iio_trig_periodic_rtc_driver); > - > -MODULE_AUTHOR("Jonathan Cameron <jic23@xxxxxxxxxx>"); > -MODULE_DESCRIPTION("Periodic realtime clock trigger for the iio subsystem"); > -MODULE_LICENSE("GPL v2"); > -- > 2.1.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-iio" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html