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

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);
}