aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Cameron <jic23@kernel.org>2016-03-06 19:36:39 +0000
committerJonathan Cameron <jic23@kernel.org>2016-03-06 19:36:39 +0000
commit180669cd4cffea49ecfc44b67a5b59ad70d73b1d (patch)
tree9900df4a925d4192cf26da430478155c58bd09f6
parentea8dbc04b773630df55204f12cbb09c85a8c93ab (diff)
downloadiio-messing.tar.gz
configfs versionmessing
-rw-r--r--drivers/iio/trigger/Kconfig1
-rw-r--r--drivers/iio/trigger/iio-trig-loop.c187
2 files changed, 47 insertions, 141 deletions
diff --git a/drivers/iio/trigger/Kconfig b/drivers/iio/trigger/Kconfig
index bc6e2ec67a75ad..d83d2ee32bd45a 100644
--- a/drivers/iio/trigger/Kconfig
+++ b/drivers/iio/trigger/Kconfig
@@ -7,6 +7,7 @@ menu "Triggers - standalone"
config IIO_TIGHTLOOP_TRIGGER
tristate "A kthread based hammering loop trigger"
+ depends on IIO_SW_TRIGGER
help
A horrible bodge as an experiment.
diff --git a/drivers/iio/trigger/iio-trig-loop.c b/drivers/iio/trigger/iio-trig-loop.c
index deeea23df8aa00..5d85a588e9a3bc 100644
--- a/drivers/iio/trigger/iio-trig-loop.c
+++ b/drivers/iio/trigger/iio-trig-loop.c
@@ -35,80 +35,17 @@
#include <linux/iio/iio.h>
#include <linux/iio/trigger.h>
+#include <linux/iio/sw_trigger.h>
-struct iio_loop_trig {
- struct iio_trigger *trig;
+struct iio_loop_info {
+ struct iio_sw_trigger swt;
struct task_struct *task;
int id;
struct list_head l;
};
-static LIST_HEAD(iio_loop_trig_list);
-static DEFINE_MUTEX(iio_loop_trig_list_mut);
-
-static int iio_loop_trigger_probe(int id);
-static ssize_t iio_loop_trig_add(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t len)
-{
- int ret;
- unsigned long input;
-
- ret = kstrtoul(buf, 10, &input);
- if (ret)
- return ret;
- ret = iio_loop_trigger_probe(input);
- if (ret)
- return ret;
- return len;
-}
-static DEVICE_ATTR(add_trigger, S_IWUSR, NULL, &iio_loop_trig_add);
-
-static int iio_loop_trigger_remove(int id);
-static ssize_t iio_loop_trig_remove(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t len)
-{
- int ret;
- unsigned long input;
-
- ret = kstrtoul(buf, 10, &input);
- if (ret)
- return ret;
- ret = iio_loop_trigger_remove(input);
- if (ret)
- return ret;
- return len;
-}
-
-static DEVICE_ATTR(remove_trigger, S_IWUSR, NULL, &iio_loop_trig_remove);
-
-static struct attribute *iio_loop_trig_attrs[] = {
- &dev_attr_add_trigger.attr,
- &dev_attr_remove_trigger.attr,
- NULL,
-};
-
-static const struct attribute_group iio_loop_trig_group = {
- .attrs = iio_loop_trig_attrs,
-};
-
-static const struct attribute_group *iio_loop_trig_groups[] = {
- &iio_loop_trig_group,
- NULL
-};
-
-/* Nothing to actually do upon release */
-static void iio_trigger_loop_release(struct device *dev)
-{
-}
-
-static struct device iio_loop_trig_dev = {
- .bus = &iio_bus_type,
- .groups = iio_loop_trig_groups,
- .release = &iio_trigger_loop_release,
+static struct config_item_type iio_loop_type = {
+ .ct_owner = THIS_MODULE,
};
static int iio_loop_thread(void *data)
@@ -126,7 +63,7 @@ static int iio_loop_thread(void *data)
static int iio_loop_trigger_set_state(struct iio_trigger *trig, bool state)
{
- struct iio_loop_trig *loop_trig = iio_trigger_get_drvdata(trig);
+ struct iio_loop_info *loop_trig = iio_trigger_get_drvdata(trig);
if (state) {
loop_trig->task = kthread_run(iio_loop_thread, trig, trig->name);
@@ -147,97 +84,65 @@ static const struct iio_trigger_ops iio_loop_trigger_ops = {
.owner = THIS_MODULE,
};
-static int iio_loop_trigger_probe(int id)
+static struct iio_sw_trigger *iio_trig_loop_probe(const char *name)
{
- struct iio_loop_trig *t;
+ struct iio_loop_info *trig_info;
int ret;
- bool foundit = false;
-
- mutex_lock(&iio_loop_trig_list_mut);
- list_for_each_entry(t, &iio_loop_trig_list, l)
- if (id == t->id) {
- foundit = true;
- break;
- }
- if (foundit) {
- ret = -EINVAL;
- goto out1;
- }
- t = kmalloc(sizeof(*t), GFP_KERNEL);
- if (t == NULL) {
- ret = -ENOMEM;
- goto out1;
- }
- t->id = id;
- t->trig = iio_trigger_alloc("looptrig%d", id);
- if (!t->trig) {
+
+ trig_info = kzalloc(sizeof(*trig_info), GFP_KERNEL);
+ if (!trig_info)
+ return ERR_PTR(-ENOMEM);
+
+ trig_info->swt.trigger = iio_trigger_alloc("%s", name);
+ if (!trig_info->swt.trigger) {
ret = -ENOMEM;
- goto free_t;
+ goto err_free_trig_info;
}
- t->trig->ops = &iio_loop_trigger_ops;
- t->trig->dev.parent = &iio_loop_trig_dev;
- iio_trigger_set_drvdata(t->trig, t);
+ iio_trigger_set_drvdata(trig_info->swt.trigger, trig_info);
+ trig_info->swt.trigger->ops = &iio_loop_trigger_ops;
- ret = iio_trigger_register(t->trig);
+ ret = iio_trigger_register(trig_info->swt.trigger);
if (ret)
- goto out2;
- list_add(&t->l, &iio_loop_trig_list);
- __module_get(THIS_MODULE);
- mutex_unlock(&iio_loop_trig_list_mut);
-
+ goto err_free_trigger;
- return 0;
+ iio_swt_group_init_type_name(&trig_info->swt, name, &iio_loop_type);
+
+ return &trig_info->swt;
-out2:
- iio_trigger_put(t->trig);
-free_t:
- kfree(t);
-out1:
- mutex_unlock(&iio_loop_trig_list_mut);
- return ret;
+err_free_trigger:
+ iio_trigger_free(trig_info->swt.trigger);
+err_free_trig_info:
+ kfree(trig_info);
+
+ return ERR_PTR(ret);
}
-static int iio_loop_trigger_remove(int id)
+static int iio_trig_loop_remove(struct iio_sw_trigger *swt)
{
- bool foundit = false;
- struct iio_loop_trig *t;
-
- mutex_lock(&iio_loop_trig_list_mut);
- list_for_each_entry(t, &iio_loop_trig_list, l)
- if (id == t->id) {
- foundit = true;
- break;
- }
- if (!foundit) {
- mutex_unlock(&iio_loop_trig_list_mut);
- return -EINVAL;
- }
+ struct iio_loop_info *trig_info;
- iio_trigger_unregister(t->trig);
- iio_trigger_free(t->trig);
+ trig_info = iio_trigger_get_drvdata(swt->trigger);
- list_del(&t->l);
- kfree(t);
- module_put(THIS_MODULE);
- mutex_unlock(&iio_loop_trig_list_mut);
+ iio_trigger_unregister(swt->trigger);
+ iio_trigger_free(swt->trigger);
+ kfree(trig_info);
return 0;
}
-static int __init iio_loop_trig_init(void)
-{
- device_initialize(&iio_loop_trig_dev);
- dev_set_name(&iio_loop_trig_dev, "iio_loop_trigger");
- return device_add(&iio_loop_trig_dev);
-}
-module_init(iio_loop_trig_init);
+static const struct iio_sw_trigger_ops iio_trig_loop_ops = {
+ .probe = iio_trig_loop_probe,
+ .remove = iio_trig_loop_remove,
+};
-static void __exit iio_loop_trig_exit(void)
-{
- device_unregister(&iio_loop_trig_dev);
-}
-module_exit(iio_loop_trig_exit);
+static struct iio_sw_trigger_type iio_trig_loop = {
+ .name = "loop",
+ .owner = THIS_MODULE,
+ .ops = &iio_trig_loop_ops,
+};
+
+module_iio_sw_trigger_driver(iio_trig_loop);
MODULE_AUTHOR("Jonathan Cameron <jic23@kernel.org>");
MODULE_DESCRIPTION("Loop based trigger for the iio subsystem");