Module: xenomai-3
Branch: master
Commit: c3de626c97fd5422ee56a6c23ff9d0a0adb227a2
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c3de626c97fd5422ee56a6c23ff9d0a0adb227a2

Author: Philippe Gerum <r...@xenomai.org>
Date:   Sat Feb 11 12:36:12 2017 +0100

drivers/gpio: decouple GPIO_TRIGGER enumeration from IRQ_TYPEs

At this chance, fix a misconfiguration with GPIO_TRIGGER_EDGE_BOTH.

---

 kernel/drivers/gpio/gpio-core.c |   29 ++++++++++++++---------------
 1 file changed, 14 insertions(+), 15 deletions(-)

diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c
index 3acc555..b8cb044 100644
--- a/kernel/drivers/gpio/gpio-core.c
+++ b/kernel/drivers/gpio/gpio-core.c
@@ -54,13 +54,7 @@ static int request_gpio_irq(unsigned int gpio, struct 
rtdm_gpio_pin *pin,
                            struct rtdm_gpio_chan *chan,
                            int trigger)
 {
-       static const int trigger_flags[] = {
-               IRQ_TYPE_EDGE_RISING,
-               IRQ_TYPE_EDGE_FALLING,
-               IRQ_TYPE_LEVEL_HIGH,
-               IRQ_TYPE_LEVEL_LOW,
-       };
-       int irq_trigger, ret;
+       int ret, irq_trigger;
        unsigned int irq;
 
        if (trigger & ~GPIO_TRIGGER_MASK)
@@ -84,14 +78,19 @@ static int request_gpio_irq(unsigned int gpio, struct 
rtdm_gpio_pin *pin,
 
        rtdm_event_clear(&pin->event);
        irq = gpio_to_irq(gpio);
-       /*
-        * Assumes GPIO_TRIGGER_xx values are forming a continuous
-        * sequence of bits starting at bit #0.
-        */
-       if (trigger) {
-               irq_trigger = trigger_flags[ffs(trigger) - 1];
+
+       irq_trigger = 0;
+       if (trigger & GPIO_TRIGGER_EDGE_RISING)
+               irq_trigger |= IRQ_TYPE_EDGE_RISING;
+       if (trigger & GPIO_TRIGGER_EDGE_FALLING)
+               irq_trigger |= IRQ_TYPE_EDGE_FALLING;
+       if (trigger & GPIO_TRIGGER_LEVEL_HIGH)
+               irq_trigger |= IRQ_TYPE_LEVEL_HIGH;
+       if (trigger & GPIO_TRIGGER_LEVEL_LOW)
+               irq_trigger |= IRQ_TYPE_LEVEL_LOW;
+
+       if (irq_trigger)
                irq_set_irq_type(irq, irq_trigger);
-       }
        
        ret = rtdm_irq_request(&pin->irqh, irq, gpio_pin_interrupt,
                               0, pin->name, pin);
@@ -101,7 +100,7 @@ static int request_gpio_irq(unsigned int gpio, struct 
rtdm_gpio_pin *pin,
        }
 
        chan->requested = true;
-       
+
        rtdm_irq_enable(&pin->irqh);
 
        return 0;


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
https://xenomai.org/mailman/listinfo/xenomai-git

Reply via email to