void audioamd_attach(struct audioamd_softc *sc, int pri) { /* * Set up glue for MI code early; we use some of it here. */ sc->sc_am7930.sc_glue = &audioamd_glue; mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_HIGH); am7930_init(&sc->sc_am7930, AUDIOAMD_POLL_MODE); auiop = &sc->sc_au; /* Copy bus tag & handle for use by am7930_trap */ sc->sc_au.au_bt = sc->sc_bt; sc->sc_au.au_bh = sc->sc_bh; (void)bus_intr_establish2(sc->sc_bt, pri, IPL_HIGH, am7930hwintr, sc, amd7930_trap); sc->sc_sicookie = softint_establish(SOFTINT_SERIAL, am7930swintr, sc); if (sc->sc_sicookie == NULL) { printf("\n%s: cannot establish software interrupt\n", sc->sc_am7930.sc_dev.dv_xname); return; } printf(" softpri %d\n", IPL_SOFTAUDIO); evcnt_attach_dynamic(&sc->sc_intrcnt, EVCNT_TYPE_INTR, NULL, sc->sc_am7930.sc_dev.dv_xname, "intr"); audio_attach_mi(&sa_hw_if, sc, &sc->sc_am7930.sc_dev); }
void vsaudio_attach(struct device *parent, struct device *self, void *aux) { struct vsbus_attach_args *va = aux; struct vsaudio_softc *sc = (struct vsaudio_softc *)self; if (bus_space_map(va->va_iot, va->va_paddr, AM7930_DREG_SIZE << 2, 0, &sc->sc_bh) != 0) { printf(": can't map registers\n"); return; } sc->sc_bt = va->va_iot; /* * Set up glue for MI code early; we use some of it here. */ sc->sc_am7930.sc_glue = &vsaudio_glue; am7930_init(&sc->sc_am7930, AUDIOAMD_POLL_MODE); scb_vecalloc(va->va_cvec, vsaudio_hwintr, sc, SCB_ISTACK, &sc->sc_intrcnt); sc->sc_cvec = va->va_cvec; evcount_attach(&sc->sc_intrcnt, self->dv_xname, &sc->sc_cvec); sc->sc_swintr = softintr_establish(IPL_SOFT, &vsaudio_swintr, sc); printf("\n"); audio_attach_mi(&vsaudio_hw_if, sc, &sc->sc_am7930.sc_dev); }