|
@@ -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, ...)
|