Ejemplo n.º 1
0
static int
s3c2410_bus_ipend(struct uart_softc *sc)
{
	uint32_t ufstat, txmask, rxmask;
	uintptr_t irq;
	int ipend = 0;

	uart_lock(sc->sc_hwmtx);
	ufstat = bus_space_read_4(sc->sc_bas.bst, sc->sc_bas.bsh, SSCOM_UFSTAT);
	uart_unlock(sc->sc_hwmtx);

	txmask = rxmask = 0;
	switch (s3c2xx0_softc->sc_cpu) {
	case CPU_S3C2410:
		txmask = UFSTAT_TXCOUNT;
		rxmask = UFSTAT_RXCOUNT;
		break;
	case CPU_S3C2440:
		txmask = S3C2440_UFSTAT_TXCOUNT;
		rxmask = S3C2440_UFSTAT_RXCOUNT;
		break;
	}
	if ((ufstat & txmask) == 0) {
		if (sc->sc_txbusy != 0)
			ipend |= SER_INT_TXIDLE;
		irq = rman_get_start(sc->sc_ires);
		arm_mask_irq(get_sub_irq(irq, TX_OFF));
	}
	if ((ufstat & rxmask) > 0) {
		ipend |= SER_INT_RXREADY;
	}

	return (ipend);
}
Ejemplo n.º 2
0
static void
s3c2410_bus_grab(struct uart_softc *sc)
{
	uintptr_t irq;

	irq = rman_get_start(sc->sc_ires);
	arm_mask_irq(get_sub_irq(irq, RX_OFF));
}
Ejemplo n.º 3
0
/**
 *	omap_teardown_intr 
 *
 *	RETURNS:
 *	0 on success
 */
int
omap_teardown_intr(device_t dev, device_t child, struct resource *res,
					 void *cookie)
{
	unsigned int i;

	/* Mask (disable) all the interrupts in the range ... will probably be only one */
	for (i = rman_get_start(res); (i < NIRQ) && (i <= rman_get_end(res)); i++) {
		arm_mask_irq(i);
	}
	
	return (BUS_TEARDOWN_INTR(device_get_parent(dev), child, res, cookie));
}
Ejemplo n.º 4
0
int
arm_remove_irqhandler(int irq, void *cookie)
{
	struct intr_event *event;
	int error;

	event = intr_events[irq];
	arm_mask_irq(irq);

	error = intr_event_remove_handler(cookie);

	if (!CK_SLIST_EMPTY(&event->ie_handlers))
		arm_unmask_irq(irq);
	return (error);
}
Ejemplo n.º 5
0
void
arm_handler_execute(struct trapframe *frame, int irqnb)
{
	struct intr_event *event;
	int i;

	PCPU_INC(cnt.v_intr);
	i = -1;
	while ((i = arm_get_next_irq(i)) != -1) {
		intrcnt[i]++;
		event = intr_events[i];
		if (intr_event_handle(event, frame) != 0) {
			/* XXX: Log stray IRQs */
			arm_mask_irq(i);
		}
	}
}
Ejemplo n.º 6
0
void
intr_irq_handler(struct trapframe *frame)
{
	struct intr_event *event;
	int i;

	VM_CNT_INC(v_intr);
	i = -1;
	while ((i = arm_get_next_irq(i)) != -1) {
		intrcnt[i]++;
		event = intr_events[i];
		if (intr_event_handle(event, frame) != 0) {
			/* XXX: Log stray IRQs */
			arm_mask_irq(i);
		}
	}
#ifdef HWPMC_HOOKS
	if (pmc_hook && (PCPU_GET(curthread)->td_pflags & TDP_CALLCHAIN))
		pmc_hook(PCPU_GET(curthread), PMC_FN_USER_CALLCHAIN, frame);
#endif
}