]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/iio/industrialio-trigger.c
iio: trigger: clean up viio_trigger_alloc()
[karo-tx-linux.git] / drivers / iio / industrialio-trigger.c
index 54c4d5854ff0455d845003815067701544189d41..978e1592c2a37869eac3b07a48f27354dc6036ff 100644 (file)
@@ -518,46 +518,45 @@ static void iio_trig_subirqunmask(struct irq_data *d)
 static struct iio_trigger *viio_trigger_alloc(const char *fmt, va_list vargs)
 {
        struct iio_trigger *trig;
+       int i;
+
        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);
-
-               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;
-               }
+       if (!trig)
+               return NULL;
 
-               trig->name = kvasprintf(GFP_KERNEL, fmt, 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);
-               }
-               get_device(&trig->dev);
+       trig->dev.type = &iio_trig_type;
+       trig->dev.bus = &iio_bus_type;
+       device_initialize(&trig->dev);
+
+       mutex_init(&trig->pool_lock);
+       trig->subirq_base = irq_alloc_descs(-1, 0,
+                                           CONFIG_IIO_CONSUMERS_PER_TRIGGER,
+                                           0);
+       if (trig->subirq_base < 0)
+               goto free_trig;
+
+       trig->name = kvasprintf(GFP_KERNEL, fmt, vargs);
+       if (trig->name == NULL)
+               goto free_descs;
+
+       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);
        }
+       get_device(&trig->dev);
 
        return trig;
+
+free_descs:
+       irq_free_descs(trig->subirq_base, CONFIG_IIO_CONSUMERS_PER_TRIGGER);
+free_trig:
+       kfree(trig);
+       return NULL;
 }
 
 struct iio_trigger *iio_trigger_alloc(const char *fmt, ...)