Exemplo 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);
}
Exemplo n.º 2
0
static int
s3c2410_bus_attach(struct uart_softc *sc)
{
	uintptr_t irq;

	sc->sc_hwiflow = 0;
	sc->sc_hwoflow = 0;

	irq = rman_get_start(sc->sc_ires);
	arm_unmask_irq(irq);
	arm_unmask_irq(get_sub_irq(irq, RX_OFF));
	arm_unmask_irq(get_sub_irq(irq, TX_OFF));
	arm_unmask_irq(get_sub_irq(irq, ERR_OFF));

	return (0);
}
Exemplo n.º 3
0
static void
s3c2410_bus_ungrab(struct uart_softc *sc)
{
	uintptr_t irq;

	irq = rman_get_start(sc->sc_ires);
	arm_unmask_irq(get_sub_irq(irq, RX_OFF));
}
Exemplo n.º 4
0
static int
s3c2410_bus_transmit(struct uart_softc *sc)
{
	uintptr_t irq;

	uart_lock(sc->sc_hwmtx);

	for (int i = 0; i < sc->sc_txdatasz; i++) {
		s3c2410_putc(&sc->sc_bas, sc->sc_txbuf[i]);
		uart_barrier(&sc->sc_bas);
	}

	sc->sc_txbusy = 1;

	uart_unlock(sc->sc_hwmtx);

	irq = rman_get_start(sc->sc_ires);
	arm_unmask_irq(get_sub_irq(irq, TX_OFF));

	return (0);
}