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
1.5.8