[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/arm/arm/intr.c

Version: -  FREEBSD  -  FREEBSD7  -  FREEBSD71  -  FREEBSD70  -  FREEBSD6  -  FREEBSD64  -  FREEBSD63  -  FREEBSD62  -  FREEBSD61  -  FREEBSD60  -  FREEBSD5  -  FREEBSD55  -  FREEBSD54  -  FREEBSD53  -  FREEBSD52  -  FREEBSD51  -  FREEBSD50  -  FREEBSD4  -  FREEBSD3  -  FREEBSD22  -  linux-2.6  -  linux-2.4.22  -  MK83  -  MK84  -  PLAN9  -  DFBSD  -  NETBSD  -  NETBSD5  -  NETBSD4  -  NETBSD3  -  NETBSD20  -  OPENBSD  -  xnu-517  -  xnu-792  -  xnu-792.6.70  -  xnu-1228  -  OPENSOLARIS  -  minix-3-1-1  -  TRUSTEDBSD-SEBSD  -  FREEBSD-LIBC  -  FREEBSD7-LIBC  -  FREEBSD6-LIBC  -  GLIBC27 
SearchContext: -  none  -  excerpts  -  bigexcerpts 

  1 /*      $NetBSD: intr.c,v 1.12 2003/07/15 00:24:41 lukem Exp $  */
  2 
  3 /*-
  4  * Copyright (c) 2004 Olivier Houchard.
  5  * Copyright (c) 1994-1998 Mark Brinicombe.
  6  * All rights reserved.
  7  *
  8  * Redistribution and use in source and binary forms, with or without
  9  * modification, are permitted provided that the following conditions
 10  * are met:
 11  * 1. Redistributions of source code must retain the above copyright
 12  *    notice, this list of conditions and the following disclaimer.
 13  * 2. Redistributions in binary form must reproduce the above copyright
 14  *    notice, this list of conditions and the following disclaimer in the
 15  *    documentation and/or other materials provided with the distribution.
 16  * 3. All advertising materials mentioning features or use of this software
 17  *    must display the following acknowledgement:
 18  *      This product includes software developed by Mark Brinicombe
 19  *      for the NetBSD Project.
 20  * 4. The name of the company nor the name of the author may be used to
 21  *    endorse or promote products derived from this software without specific
 22  *    prior written permission.
 23  *
 24  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 25  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 26  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 27  * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 28  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 29  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 30  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 34  * SUCH DAMAGE.
 35  *
 36  * Soft interrupt and other generic interrupt functions.
 37  */
 38 
 39 #include <sys/cdefs.h>
 40 __FBSDID("$FreeBSD: src/sys/arm/arm/intr.c,v 1.24 2008/09/11 12:36:13 raj Exp $");
 41 #include <sys/param.h>
 42 #include <sys/systm.h>
 43 #include <sys/syslog.h> 
 44 #include <sys/malloc.h>
 45 #include <sys/proc.h>
 46 #include <sys/bus.h>
 47 #include <sys/interrupt.h>
 48 #include <sys/conf.h>
 49 #include <machine/atomic.h>
 50 #include <machine/intr.h>
 51 #include <machine/cpu.h>
 52 
 53 typedef void (*mask_fn)(void *);
 54 
 55 static struct intr_event *intr_events[NIRQ];
 56 static int intrcnt_tab[NIRQ];
 57 static int intrcnt_index = 0;
 58 static int last_printed = 0;
 59 
 60 void    arm_handler_execute(struct trapframe *, int);
 61 
 62 void (*arm_post_filter)(void *) = NULL;
 63 
 64 void
 65 arm_setup_irqhandler(const char *name, driver_filter_t *filt, 
 66     void (*hand)(void*), void *arg, int irq, int flags, void **cookiep)
 67 {
 68         struct intr_event *event;
 69         int error;
 70 
 71         if (irq < 0 || irq >= NIRQ)
 72                 return;
 73         event = intr_events[irq];
 74         if (event == NULL) {
 75                 error = intr_event_create(&event, (void *)irq, 0, irq,
 76                     (mask_fn)arm_mask_irq, (mask_fn)arm_unmask_irq,
 77                     arm_post_filter, NULL, "intr%d:", irq);
 78                 if (error)
 79                         return;
 80                 intr_events[irq] = event;
 81                 last_printed += 
 82                     snprintf(intrnames + last_printed,
 83                     MAXCOMLEN + 1,
 84                     "irq%d: %s", irq, name);
 85                 last_printed++;
 86                 intrcnt_tab[irq] = intrcnt_index;
 87                 intrcnt_index++;
 88                 
 89         }
 90         intr_event_add_handler(event, name, filt, hand, arg,
 91             intr_priority(flags), flags, cookiep);
 92 }
 93 
 94 int
 95 arm_remove_irqhandler(int irq, void *cookie)
 96 {
 97         struct intr_event *event;
 98         int error;
 99 
100         event = intr_events[irq];
101         arm_mask_irq(irq);
102         
103         error = intr_event_remove_handler(cookie);
104 
105         if (!TAILQ_EMPTY(&event->ie_handlers))
106                 arm_unmask_irq(irq);
107         return (error);
108 }
109 
110 void dosoftints(void);
111 void
112 dosoftints(void)
113 {
114 }
115 
116 void
117 arm_handler_execute(struct trapframe *frame, int irqnb)
118 {
119         struct intr_event *event;
120         int i;
121 
122         PCPU_INC(cnt.v_intr);
123         while ((i = arm_get_next_irq()) != -1) {
124                 intrcnt[intrcnt_tab[i]]++;
125                 event = intr_events[i];
126                 if (intr_event_handle(event, frame) != 0) {
127                         /* XXX: Log stray IRQs */
128                         arm_mask_irq(i);
129                 }
130         }
131 }
132 

Cache object: 72d3576ca866a321681bf48ea51bf036


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.