Annotation of funnyos/arch/testarm/dev/tairqc.c, Revision 1.3
1.1 init 1: /*
1.3 ! init 2: * $Id: tairqc.c,v 1.2 2007/11/01 13:03:01 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);
! 53: }
! 54:
! 55:
! 56: void
! 57: tairqc_mask_intr(uint8_t intrno)
! 58: {
! 59: bus_write_1(irqcdd->td_bushandlep, irqcdd->td_ioaddr + TAIRQC_OFF_IRQMASK, intrno);
! 60: }
! 61:
! 62:
! 63: void
! 64: tairqc_unmask_intr(uint8_t intrno)
! 65: {
! 66: bus_write_1(irqcdd->td_bushandlep, irqcdd->td_ioaddr + TAIRQC_OFF_IRQUNMASK, intrno);
! 67: }
! 68:
! 69:
! 70: uint32_t
! 71: tairqc_intrstatus(void)
! 72: {
! 73: bus_read_4(irqcdd->td_bushandlep, irqcdd->td_ioaddr + TAIRQC_OFF_IRQSTATUS);
1.1 init 74: }
75:
76:
77: void
78: tairqc_irq(void)
79: {
80: /*
1.3 ! init 81: * Process an IRQ.
1.1 init 82: */
1.3 ! init 83: uint32_t irqstatus;
! 84:
! 85: /* read intr status; one bit per intr source */
! 86: irqstatus = tairqc_intrstatus();
1.1 init 87:
1.3 ! init 88: printf("irqc: irq status 0x%x\n", irqstatus);
1.1 init 89: }
90:
CVSweb