int auvia_intr(void *arg) { struct auvia_softc *sc = arg; struct auvia_softc_chan *ch; u_int8_t r; int i = 0; ch = &sc->sc_record; r = CH_READ1(sc, ch, AUVIA_RP_STAT); if (r & AUVIA_RPSTAT_INTR) { if (sc->sc_record.sc_intr) sc->sc_record.sc_intr(sc->sc_record.sc_arg); /* clear interrupts */ CH_WRITE1(sc, ch, AUVIA_RP_STAT, AUVIA_RPSTAT_INTR); i++; } ch = &sc->sc_play; r = CH_READ1(sc, ch, AUVIA_RP_STAT); if (r & AUVIA_RPSTAT_INTR) { if (sc->sc_play.sc_intr) sc->sc_play.sc_intr(sc->sc_play.sc_arg); /* clear interrupts */ CH_WRITE1(sc, ch, AUVIA_RP_STAT, AUVIA_RPSTAT_INTR); i++; } return (i? 1 : 0); }
static int auvia_intr(void *arg) { struct auvia_softc *sc; struct auvia_softc_chan *ch; u_int8_t r; int rval; sc = arg; rval = 0; ch = &sc->sc_record; mutex_spin_enter(&sc->sc_intr_lock); r = CH_READ1(sc, ch, AUVIA_RP_STAT); if (r & AUVIA_RPSTAT_INTR) { if (sc->sc_record.sc_intr) sc->sc_record.sc_intr(sc->sc_record.sc_arg); /* clear interrupts */ CH_WRITE1(sc, ch, AUVIA_RP_STAT, AUVIA_RPSTAT_INTR); rval = 1; } ch = &sc->sc_play; r = CH_READ1(sc, ch, AUVIA_RP_STAT); if (r & AUVIA_RPSTAT_INTR) { if (sc->sc_play.sc_intr) sc->sc_play.sc_intr(sc->sc_play.sc_arg); /* clear interrupts */ CH_WRITE1(sc, ch, AUVIA_RP_STAT, AUVIA_RPSTAT_INTR); rval = 1; } mutex_spin_exit(&sc->sc_intr_lock); return rval; }