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