[BACK]Return to tairqc.c CVS log [TXT][DIR] Up to [local] / funnyos / arch / testarm / dev

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