Re: [PATCH] iio-trig-gpio:Remove redundant gpio_request

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux