File: [local] / funnyos / arch / testarm / dev / tairqc.c (download)
Revision 1.4, Fri Nov 2 12:36:13 2007 UTC (16 years, 6 months ago) by init
Branch: MAIN
Changes since 1.3: +3 -1 lines
return 0 indicating tairqc has been proberly attached
|
/*
* $Id: tairqc.c,v 1.4 2007/11/02 12:36:13 init Exp $
*/
#include <sys/types.h>
#include <sys/device.h>
#include <sys/bus.h>
#include <sys/kern_irq.h>
#include <arch/testarm/dev/tairqcvar.h>
#include <arch/testarm/dev/tairqcreg.h>
#include <libkern/printf.h>
/*
* testarm Interrupt Controller Unit support.
*/
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);
extern void (*irq_trampoline_func)(void);
struct tairqc_dd *irqcdd; /* current irq device */
struct driver tairqc_dr = {
sizeof(struct tairqc_dd),
tairqc_attach,
NULL,
NULL
};
int
tairqc_attach(struct device *self, uint32_t loc, uint8_t flags)
{
struct tairqc_dd *ddp = self->dv_devdata;
/* leap to parent's bus_handle */
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);
return(0);
}
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)
{
/*
* 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);
}