Annotation of funnyos/arch/testarm/dev/tairqc.c, Revision 1.4
1.1 init 1: /*
1.4 ! init 2: * $Id: tairqc.c,v 1.3 2007/11/02 12:35:24 init Exp $
1.1 init 3: */
4: #include <sys/types.h>
5: #include <sys/device.h>
6: #include <sys/bus.h>
1.3 init 7: #include <sys/kern_irq.h>
1.1 init 8:
9: #include <arch/testarm/dev/tairqcvar.h>
10: #include <arch/testarm/dev/tairqcreg.h>
1.3 init 11: #include <libkern/printf.h>
1.1 init 12:
13: /*
14: * testarm Interrupt Controller Unit support.
15: */
16: int tairqc_attach(struct device *self, uint32_t loc, uint8_t flags);
1.3 init 17: void tairqc_mask_intr(uint8_t intrno);
18: void tairqc_unmask_intr(uint8_t intrno);
19: uint32_t tairqc_intrstatus(void);
1.1 init 20: void tairqc_irq(void);
21:
1.3 init 22: extern void (*irq_trampoline_func)(void);
23: struct tairqc_dd *irqcdd; /* current irq device */
1.1 init 24:
25: struct driver tairqc_dr = {
26: sizeof(struct tairqc_dd),
27: tairqc_attach,
1.2 init 28: NULL,
1.1 init 29: NULL
30: };
31:
32:
33: int
34: tairqc_attach(struct device *self, uint32_t loc, uint8_t flags)
35: {
36: struct tairqc_dd *ddp = self->dv_devdata;
37:
38: /* leap to parent's bus_handle */
39: ddp->td_bushandlep = self->dv_parent->dv_aux;
40:
1.3 init 41: /* save locator */
42: ddp->td_ioaddr = loc ? loc : TAIRQC_REG_BASE;
1.1 init 43:
1.3 init 44: irqcdd = ddp;
45:
46: printf("testarm IRQ Controller (2=cons, 3=ether, 4=rtc, 6=mp)\n");
47:
48: /* override trampoline so core irq jumps to us */
49: irq_trampoline_func = tairqc_irq;
50:
51: /* XXX unmask rtc intr */
52: tairqc_unmask_intr(4);
1.4 ! init 53:
! 54: return(0);
1.3 init 55: }
56:
57:
58: void
59: tairqc_mask_intr(uint8_t intrno)
60: {
61: bus_write_1(irqcdd->td_bushandlep, irqcdd->td_ioaddr + TAIRQC_OFF_IRQMASK, intrno);
62: }
63:
64:
65: void
66: tairqc_unmask_intr(uint8_t intrno)
67: {
68: bus_write_1(irqcdd->td_bushandlep, irqcdd->td_ioaddr + TAIRQC_OFF_IRQUNMASK, intrno);
69: }
70:
71:
72: uint32_t
73: tairqc_intrstatus(void)
74: {
75: bus_read_4(irqcdd->td_bushandlep, irqcdd->td_ioaddr + TAIRQC_OFF_IRQSTATUS);
1.1 init 76: }
77:
78:
79: void
80: tairqc_irq(void)
81: {
82: /*
1.3 init 83: * Process an IRQ.
1.1 init 84: */
1.3 init 85: uint32_t irqstatus;
86:
87: /* read intr status; one bit per intr source */
88: irqstatus = tairqc_intrstatus();
1.1 init 89:
1.3 init 90: printf("irqc: irq status 0x%x\n", irqstatus);
1.1 init 91: }
92:
CVSweb