version 1.2, 2007/11/01 13:03:01 |
version 1.3, 2007/11/02 12:35:24 |
|
|
#include <sys/types.h> |
#include <sys/types.h> |
#include <sys/device.h> |
#include <sys/device.h> |
#include <sys/bus.h> |
#include <sys/bus.h> |
|
#include <sys/kern_irq.h> |
|
|
#include <arch/testarm/dev/tairqcvar.h> |
#include <arch/testarm/dev/tairqcvar.h> |
#include <arch/testarm/dev/tairqcreg.h> |
#include <arch/testarm/dev/tairqcreg.h> |
|
#include <libkern/printf.h> |
|
|
/* |
/* |
* testarm Interrupt Controller Unit support. |
* testarm Interrupt Controller Unit support. |
*/ |
*/ |
int tairqc_attach(struct device *self, uint32_t loc, uint8_t flags); |
int tairqc_attach(struct device *self, uint32_t loc, uint8_t flags); |
|
void tairqc_mask_intr(uint8_t intrno); |
|
void tairqc_unmask_intr(uint8_t intrno); |
|
uint32_t tairqc_intrstatus(void); |
void tairqc_irq(void); |
void tairqc_irq(void); |
|
|
|
extern void (*irq_trampoline_func)(void); |
|
struct tairqc_dd *irqcdd; /* current irq device */ |
|
|
struct driver tairqc_dr = { |
struct driver tairqc_dr = { |
sizeof(struct tairqc_dd), |
sizeof(struct tairqc_dd), |
|
|
/* leap to parent's bus_handle */ |
/* leap to parent's bus_handle */ |
ddp->td_bushandlep = self->dv_parent->dv_aux; |
ddp->td_bushandlep = self->dv_parent->dv_aux; |
|
|
|
/* save locator */ |
|
ddp->td_ioaddr = loc ? loc : TAIRQC_REG_BASE; |
|
|
|
irqcdd = ddp; |
|
|
|
printf("testarm IRQ Controller (2=cons, 3=ether, 4=rtc, 6=mp)\n"); |
|
|
|
/* override trampoline so core irq jumps to us */ |
|
irq_trampoline_func = tairqc_irq; |
|
|
|
/* XXX unmask rtc intr */ |
|
tairqc_unmask_intr(4); |
} |
} |
|
|
|
|
void |
void |
|
tairqc_mask_intr(uint8_t intrno) |
|
{ |
|
bus_write_1(irqcdd->td_bushandlep, irqcdd->td_ioaddr + TAIRQC_OFF_IRQMASK, intrno); |
|
} |
|
|
|
|
|
void |
|
tairqc_unmask_intr(uint8_t intrno) |
|
{ |
|
bus_write_1(irqcdd->td_bushandlep, irqcdd->td_ioaddr + TAIRQC_OFF_IRQUNMASK, intrno); |
|
} |
|
|
|
|
|
uint32_t |
|
tairqc_intrstatus(void) |
|
{ |
|
bus_read_4(irqcdd->td_bushandlep, irqcdd->td_ioaddr + TAIRQC_OFF_IRQSTATUS); |
|
} |
|
|
|
|
|
void |
tairqc_irq(void) |
tairqc_irq(void) |
{ |
{ |
/* |
/* |
* Process an IRQ |
* Process an IRQ. |
*/ |
*/ |
|
uint32_t irqstatus; |
|
|
|
/* read intr status; one bit per intr source */ |
|
irqstatus = tairqc_intrstatus(); |
|
|
|
printf("irqc: irq status 0x%x\n", irqstatus); |
} |
} |
|
|