[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.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