- Main Page
- Related Pages
- Data Structures
- Files

- File List
- Globals

# drivers/gpio/gpio_irq_handler.c

Go to the documentation of this file.

    00001
    00041 #include <debug.h>
    00042 #include <util.h>
    00043 #include <slist.h>
    00044 #include <interrupt.h>
    00045 #include <chip/portmux.h>
    00046 #include <gpio/gpio_irq_handler.h>
    00047 #include <chip/gpio_irq_group.h>
    00048
    00052 struct gpio_irq_group {
    00053         struct slist    handler_list;
    00054 };
    00055
    00056 void gpio_priv_irq_group_interrupt(void *data)
    00057 {
    00058         struct gpio_irq_group           *irqg = data;
    00059         struct gpio_irq_handler         *irqh;
    00060
    00061         slist_for_each(&irqg->handler_list, irqh, node) {
    00062                 if (gpio_int_is_pending(irqh->pin)) {
    00063                         gpio_clear_int_flag(irqh->pin);
    00064                         irqh->handler(irqh->data);
    00065                 }
    00066         }
    00067 }
    00068
    00069 static void gpio_init_irq_groups(struct gpio_irq_group *irqg)
    00070 {
    00071         int i;
    00072
    00073         for (i = 0; i < GPIO_IRQ_NR_GROUPS; i++) {
    00074                 slist_init(&irqg[i].handler_list);
    00075                 gpio_setup_irq_group(i, &irqg[i]);
    00076         }
    00077 }
    00078
    00079 void gpio_register_irq_handler(struct gpio_irq_handler *irqh)
    00080 {
    00081         unsigned int flags;
    00082         int index;
    00083         static bool initialized = false;
    00084         static struct gpio_irq_group irqg[GPIO_IRQ_NR_GROUPS];
    00085
    00086         flags = cpu_irq_save();
    00087         if (!initialized) {
    00088                 initialized = true;
    00089                 gpio_init_irq_groups(irqg);
    00090         }
    00091
    00092         index = gpio_irq_group_pin2index(irqh->pin);
    00093         slist_insert_tail(&irqg[index].handler_list, &irqh->node);
    00094         cpu_irq_restore(flags);
    00095 }
    00096