Again, This patch probably needs. Signed-off-by: Michael Hennerich <Michael.Hennerich@xxxxxxxxxx> and you can add Acked-by: Jonathan Cameron <jic23@xxxxxxxxx> p.s. For those not following original thread this is a fix for am misunderstanding of mine when I wrote the original code. (Thanks!) > Remove redundant gpio_request: > The GPIO used as trigger IRQ, is also requested as gpio, but actually never read. > > Use platform resource facility to get IRQs numbers and flags. > Make sure this driver can be used with any system IRQ, not necessarily limited to GPIO-IRQs. > Use dev_err(dev...) and friends instead of printk(KERN_ERR...) > > From: Michael Hennerich <Michael.Hennerich@xxxxxxxxxx> > > Index: drivers/staging/iio/trigger/iio-trig-gpio.c > =================================================================== > --- drivers/staging/iio/trigger/iio-trig-gpio.c (revision 7916) > +++ drivers/staging/iio/trigger/iio-trig-gpio.c (working copy) > @@ -13,7 +13,6 @@ > * TODO: > * > * Add board config elements to allow specification of startup settings. > - * Add configuration settings (irq type etc) > */ > > #include <linux/kernel.h> > @@ -30,7 +29,7 @@ > > struct iio_gpio_trigger_info { > struct mutex in_use; > - int gpio; > + unsigned int irq; > }; > /* > * Need to reference count these triggers and only enable gpio interrupts > @@ -57,78 +56,77 @@ > .attrs = iio_gpio_trigger_attrs, > }; > > -static int iio_gpio_trigger_probe(struct platform_device *dev) > +static int iio_gpio_trigger_probe(struct platform_device *pdev) > { > - int *pdata = dev->dev.platform_data; > struct iio_gpio_trigger_info *trig_info; > struct iio_trigger *trig, *trig2; > - int i, irq, ret = 0; > - if (!pdata) { > - printk(KERN_ERR "No IIO gpio trigger platform data found\n"); > - goto error_ret; > - } > - for (i = 0;; i++) { > - if (!gpio_is_valid(pdata[i])) > + unsigned long irqflags; > + struct resource *irq_res; > + int irq, ret = 0, irq_res_cnt = 0; > + > + do { > + irq_res = platform_get_resource(pdev, > + IORESOURCE_IRQ, irq_res_cnt); > + > + if (irq_res == NULL) { > + if (irq_res_cnt == 0) > + dev_err(&pdev->dev, "No GPIO IRQs specified"); > break; > - trig = iio_allocate_trigger(); > - if (!trig) { > - ret = -ENOMEM; > - goto error_free_completed_registrations; > } > + irqflags = (irq_res->flags & IRQF_TRIGGER_MASK) | IRQF_SHARED; > > - trig_info = kzalloc(sizeof(*trig_info), GFP_KERNEL); > - if (!trig_info) { > - ret = -ENOMEM; > - goto error_put_trigger; > - } > - trig->control_attrs = &iio_gpio_trigger_attr_group; > - trig->private_data = trig_info; > - trig_info->gpio = pdata[i]; > - trig->owner = THIS_MODULE; > - trig->name = kmalloc(IIO_TRIGGER_NAME_LENGTH, GFP_KERNEL); > - if (!trig->name) { > - ret = -ENOMEM; > - goto error_free_trig_info; > - } > - snprintf((char *)trig->name, > - IIO_TRIGGER_NAME_LENGTH, > - "gpiotrig%d", > - pdata[i]); > - ret = gpio_request(trig_info->gpio, trig->name); > - if (ret) > - goto error_free_name; > + for (irq = irq_res->start; irq <= irq_res->end; irq++) { > > - ret = gpio_direction_input(trig_info->gpio); > - if (ret) > - goto error_release_gpio; > + trig = iio_allocate_trigger(); > + if (!trig) { > + ret = -ENOMEM; > + goto error_free_completed_registrations; > + } > > - irq = gpio_to_irq(trig_info->gpio); > - if (irq < 0) { > - ret = irq; > - goto error_release_gpio; > - } > + trig_info = kzalloc(sizeof(*trig_info), GFP_KERNEL); > + if (!trig_info) { > + ret = -ENOMEM; > + goto error_put_trigger; > + } > + trig->control_attrs = &iio_gpio_trigger_attr_group; > + trig->private_data = trig_info; > + trig_info->irq = irq; > + trig->owner = THIS_MODULE; > + trig->name = kmalloc(IIO_TRIGGER_NAME_LENGTH, > + GFP_KERNEL); > + if (!trig->name) { > + ret = -ENOMEM; > + goto error_free_trig_info; > + } > + snprintf((char *)trig->name, > + IIO_TRIGGER_NAME_LENGTH, > + "irqtrig%d", irq); > > - ret = request_irq(irq, iio_gpio_trigger_poll, > - IRQF_TRIGGER_RISING, > - trig->name, > - trig); > - if (ret) > - goto error_release_gpio; > + ret = request_irq(irq, iio_gpio_trigger_poll, > + irqflags, trig->name, trig); > + if (ret) { > + dev_err(&pdev->dev, > + "request IRQ-%d failed", irq); > + goto error_free_name; > + } > > - ret = iio_trigger_register(trig); > - if (ret) > - goto error_release_irq; > + ret = iio_trigger_register(trig); > + if (ret) > + goto error_release_irq; > > - list_add_tail(&trig->alloc_list, &iio_gpio_trigger_list); > + list_add_tail(&trig->alloc_list, > + &iio_gpio_trigger_list); > + } > > - } > + irq_res_cnt++; > + } while (irq_res != NULL); > + > + > return 0; > > /* First clean up the partly allocated trigger */ > error_release_irq: > free_irq(irq, trig); > -error_release_gpio: > - gpio_free(trig_info->gpio); > error_free_name: > kfree(trig->name); > error_free_trig_info: > @@ -142,18 +140,16 @@ > &iio_gpio_trigger_list, > alloc_list) { > trig_info = trig->private_data; > - free_irq(gpio_to_irq(trig_info->gpio), trig); > - gpio_free(trig_info->gpio); > + free_irq(gpio_to_irq(trig_info->irq), trig); > kfree(trig->name); > kfree(trig_info); > iio_trigger_unregister(trig); > } > > -error_ret: > return ret; > } > > -static int iio_gpio_trigger_remove(struct platform_device *dev) > +static int iio_gpio_trigger_remove(struct platform_device *pdev) > { > struct iio_trigger *trig, *trig2; > struct iio_gpio_trigger_info *trig_info; > @@ -165,8 +161,7 @@ > alloc_list) { > trig_info = trig->private_data; > iio_trigger_unregister(trig); > - free_irq(gpio_to_irq(trig_info->gpio), trig); > - gpio_free(trig_info->gpio); > + free_irq(trig_info->irq, trig); > kfree(trig->name); > kfree(trig_info); > iio_put_trigger(trig); > > > ------------------------------------------------------------------ > ********* Analog Devices GmbH Open Platform Solutions > ** ***** > ** ** Wilhelm-Wagenfeld-Strasse 6 > ** ***** D-80807 Munich > ********* Germany > Registergericht München HRB 40368, Geschäftsführer: Thomas Wessel, William A. Martin, Margaret K. Seif > -- 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