Re: [PATCH] gpio: show IRQ settings even if GPIO direction is "output"

From: Janakiram Sistla
Date: Tue Nov 17 2009 - 06:45:58 EST


On Tue, Nov 17, 2009 at 5:01 PM, Rodolfo Giometti <giometti@xxxxxxxx> wrote:
> Some architectures (as PXA 27x for example) may define GPIO IRQ lines
> as outputs since internal circuitry supports such configuration.
>
> This patch simply detects if a GPIO is a IRQ line or not just looking
> for IRQ line number, "desc" and "desc->action" fields.
>
> Signed-off-by: Rodolfo Giometti <giometti@xxxxxxxx>
> Cc: raffaele.recalcati@xxxxxxxxxx
> ---
>  drivers/gpio/gpiolib.c |   82 ++++++++++++++++++++++++------------------------
>  1 files changed, 41 insertions(+), 41 deletions(-)
>
> diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
> index 50de0f5..298b66f 100644
> --- a/drivers/gpio/gpiolib.c
> +++ b/drivers/gpio/gpiolib.c
> @@ -1381,6 +1381,8 @@ static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip)
>        unsigned                gpio = chip->base;
>        struct gpio_desc        *gdesc = &gpio_desc[gpio];
>        int                     is_out;
> +       int                     irq;
> +       struct irq_desc         *desc;
>
>        for (i = 0; i < chip->ngpio; i++, gpio++, gdesc++) {
>                if (!test_bit(FLAG_REQUESTED, &gdesc->flags))
> @@ -1394,48 +1396,46 @@ static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip)
>                                ? (chip->get(chip, i) ? "hi" : "lo")
>                                : "?  ");
>
> -               if (!is_out) {
> -                       int             irq = gpio_to_irq(gpio);
> -                       struct irq_desc *desc = irq_to_desc(irq);
> -
> -                       /* This races with request_irq(), set_irq_type(),
> -                        * and set_irq_wake() ... but those are "rare".
> -                        *
> -                        * More significantly, trigger type flags aren't
> -                        * currently maintained by genirq.
> -                        */
> -                       if (irq >= 0 && desc->action) {
> -                               char *trigger;
> -
> -                               switch (desc->status & IRQ_TYPE_SENSE_MASK) {
> -                               case IRQ_TYPE_NONE:
> -                                       trigger = "(default)";
> -                                       break;
> -                               case IRQ_TYPE_EDGE_FALLING:
> -                                       trigger = "edge-falling";
> -                                       break;
> -                               case IRQ_TYPE_EDGE_RISING:
> -                                       trigger = "edge-rising";
> -                                       break;
> -                               case IRQ_TYPE_EDGE_BOTH:
> -                                       trigger = "edge-both";
> -                                       break;
> -                               case IRQ_TYPE_LEVEL_HIGH:
> -                                       trigger = "level-high";
> -                                       break;
> -                               case IRQ_TYPE_LEVEL_LOW:
> -                                       trigger = "level-low";
> -                                       break;
> -                               default:
> -                                       trigger = "?trigger?";
> -                                       break;
> -                               }
> -
> -                               seq_printf(s, " irq-%d %s%s",
> -                                       irq, trigger,
> -                                       (desc->status & IRQ_WAKEUP)
> -                                               ? " wakeup" : "");
> +               irq = gpio_to_irq(gpio);
> +               desc = irq_to_desc(irq);
> +
> +               /* This races with request_irq(), set_irq_type(),
> +                * and set_irq_wake() ... but those are "rare".
> +                *
> +                * More significantly, trigger type flags aren't
> +                * currently maintained by genirq.
> +                */
> +               if (irq >= 0 && desc && desc->action) {
> +                       char *trigger;
> +
> +                       switch (desc->status & IRQ_TYPE_SENSE_MASK) {
> +                       case IRQ_TYPE_NONE:
> +                               trigger = "(default)";
> +                               break;
> +                       case IRQ_TYPE_EDGE_FALLING:
> +                               trigger = "edge-falling";
> +                               break;
> +                       case IRQ_TYPE_EDGE_RISING:
> +                               trigger = "edge-rising";
> +                               break;
> +                       case IRQ_TYPE_EDGE_BOTH:
> +                               trigger = "edge-both";
> +                               break;
> +                       case IRQ_TYPE_LEVEL_HIGH:
> +                               trigger = "level-high";
> +                               break;
> +                       case IRQ_TYPE_LEVEL_LOW:
> +                               trigger = "level-low";
> +                               break;
> +                       default:
> +                               trigger = "?trigger?";
> +                               break;
>                        }
> +
> +                       seq_printf(s, " irq-%d %s%s",
> +                               irq, trigger,
> +                               (desc->status & IRQ_WAKEUP)
> +                                       ? " wakeup" : "");
>                }
>
>                seq_printf(s, "\n");
> --
> 1.6.3.3

Is there any valid test scenario that makes use of this
patch???Detecting GPIO if it is IRQ in kernel what is the advantage?


Regards,
Ram.
¢éì¹»®&Þ~º&¶¬?+-±éݶ¥?w®?Ë?±Êâméb?ìdz¹Þ?)í?æèw*jg¬±¨¶????Ý¢j/?êäz¹Þ??à2?Þ?¨è­Ú&¢)ß¡«a¶Úþø®G«?éh®æj:+v?¨?wè?Ù¥>W?±êÞiÛaxPjØm¶?ÿà -»+?ùd?_