]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/staging/iio/industrialio-trigger.c
staging:iio:trigger handle name attr in core, remove old alloc and register any contr...
[karo-tx-linux.git] / drivers / staging / iio / industrialio-trigger.c
index 86d026b2ec31945de1229ded5b7c8b8988136e21..e83edacaec8929191fb55df37927a9432aa4898f 100644 (file)
@@ -38,6 +38,19 @@ static DEFINE_SPINLOCK(iio_trigger_idr_lock);
 static LIST_HEAD(iio_trigger_list);
 static DEFINE_MUTEX(iio_trigger_list_lock);
 
+/**
+ * iio_trigger_read_name() - retrieve useful identifying name
+ **/
+static ssize_t iio_trigger_read_name(struct device *dev,
+                                    struct device_attribute *attr,
+                                    char *buf)
+{
+       struct iio_trigger *trig = dev_get_drvdata(dev);
+       return sprintf(buf, "%s\n", trig->name);
+}
+
+static DEVICE_ATTR(name, S_IRUGO, iio_trigger_read_name, NULL);
+
 /**
  * iio_trigger_register_sysfs() - create a device for this trigger
  * @trig_info: the trigger
@@ -46,20 +59,16 @@ static DEFINE_MUTEX(iio_trigger_list_lock);
  **/
 static int iio_trigger_register_sysfs(struct iio_trigger *trig_info)
 {
-       int ret = 0;
-
-       if (trig_info->control_attrs)
-               ret = sysfs_create_group(&trig_info->dev.kobj,
-                                        trig_info->control_attrs);
-
-       return ret;
+       return sysfs_add_file_to_group(&trig_info->dev.kobj,
+                                      &dev_attr_name.attr,
+                                      NULL);
 }
 
 static void iio_trigger_unregister_sysfs(struct iio_trigger *trig_info)
 {
-       if (trig_info->control_attrs)
-               sysfs_remove_group(&trig_info->dev.kobj,
-                                  trig_info->control_attrs);
+       sysfs_remove_file_from_group(&trig_info->dev.kobj,
+                                          &dev_attr_name.attr,
+                                          NULL);
 }
 
 
@@ -205,18 +214,6 @@ void iio_trigger_notify_done(struct iio_trigger *trig)
 }
 EXPORT_SYMBOL(iio_trigger_notify_done);
 
-/**
- * iio_trigger_read_name() - retrieve useful identifying name
- **/
-ssize_t iio_trigger_read_name(struct device *dev,
-                             struct device_attribute *attr,
-                             char *buf)
-{
-       struct iio_trigger *trig = dev_get_drvdata(dev);
-       return sprintf(buf, "%s\n", trig->name);
-}
-EXPORT_SYMBOL(iio_trigger_read_name);
-
 /* Trigger Consumer related functions */
 
 /* Complexity in here.  With certain triggers (datardy) an acknowledgement
@@ -355,6 +352,7 @@ static void iio_trig_release(struct device *device)
                irq_free_descs(trig->subirq_base,
                               CONFIG_IIO_CONSUMERS_PER_TRIGGER);
        }
+       kfree(trig->name);
        kfree(trig);
        iio_put();
 }
@@ -381,8 +379,9 @@ static void iio_trig_subirqunmask(struct irq_data *d)
        trig->subirqs[d->irq - trig->subirq_base].enabled = true;
 }
 
-struct iio_trigger *iio_allocate_trigger_named(const char *name)
+struct iio_trigger *iio_allocate_trigger(const char *fmt, ...)
 {
+       va_list vargs;
        struct iio_trigger *trig;
        trig = kzalloc(sizeof *trig, GFP_KERNEL);
        if (trig) {
@@ -392,40 +391,40 @@ struct iio_trigger *iio_allocate_trigger_named(const char *name)
                device_initialize(&trig->dev);
                dev_set_drvdata(&trig->dev, (void *)trig);
 
-               if (name) {
-                       mutex_init(&trig->pool_lock);
-                       trig->subirq_base
-                               = irq_alloc_descs(-1, 0,
-                                       CONFIG_IIO_CONSUMERS_PER_TRIGGER,
-                                       0);
-                       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);
-                       }
+               mutex_init(&trig->pool_lock);
+               trig->subirq_base
+                       = irq_alloc_descs(-1, 0,
+                                         CONFIG_IIO_CONSUMERS_PER_TRIGGER,
+                                         0);
+               if (trig->subirq_base < 0) {
+                       kfree(trig);
+                       return NULL;
+               }
+               va_start(vargs, fmt);
+               trig->name = kvasprintf(GFP_KERNEL, fmt, vargs);
+               va_end(vargs);
+               if (trig->name == NULL) {
+                       irq_free_descs(trig->subirq_base,
+                                      CONFIG_IIO_CONSUMERS_PER_TRIGGER);
+                       kfree(trig);
+                       return NULL;
+               }
+               trig->subirq_chip.name = trig->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)