void ess_pnpbios_attach(struct device *parent, struct device *self, void *aux) { struct ess_softc *sc = (void *)self; struct pnpbiosdev_attach_args *aa = aux; if (pnpbios_io_map(aa->pbt, aa->resc, 0, &sc->sc_iot, &sc->sc_ioh)) { printf(": can't map i/o space\n"); return; } sc->sc_ic = aa->ic; /* XXX These are only for setting chip configuration registers. */ pnpbios_getiobase(aa->pbt, aa->resc, 0, 0, &sc->sc_iobase); sc->sc_audio1.ist = IST_EDGE; sc->sc_audio2.ist = IST_EDGE; if (pnpbios_getirqnum(aa->pbt, aa->resc, 0, &sc->sc_audio1.irq, NULL)) { printf(": can't get IRQ\n"); return; } if (pnpbios_getirqnum(aa->pbt, aa->resc, 1, &sc->sc_audio2.irq, NULL)) sc->sc_audio2.irq = -1; if (pnpbios_getdmachan(aa->pbt, aa->resc, 0, &sc->sc_audio1.drq)) { printf(": can't get DMA channel\n"); return; } if (pnpbios_getdmachan(aa->pbt, aa->resc, 1, &sc->sc_audio2.drq)) sc->sc_audio2.drq = -1; printf("\n"); pnpbios_print_devres(self, aa); printf("%s", device_xname(self)); if (!essmatch(sc)) { aprint_error_dev(&sc->sc_dev, "essmatch failed\n"); pnpbios_io_unmap(aa->pbt, aa->resc, 0, sc->sc_iot, sc->sc_ioh); return; } essattach(sc, 0); }
void npx_pnpbios_attach(struct device *parent, struct device *self, void *aux) { struct npx_softc *sc = (void *)self; struct pnpbiosdev_attach_args *aa = aux; int irq, ist; if (pnpbios_io_map(aa->pbt, aa->resc, 0, &sc->sc_iot, &sc->sc_ioh)) { printf(": can't map i/o space\n"); return; } printf("\n"); pnpbios_print_devres(self, aa); if (pnpbios_getirqnum(aa->pbt, aa->resc, 0, &irq, &ist) != 0) { printf("%s: unable to get IRQ number or type\n", sc->sc_dev.dv_xname); return; } sc->sc_type = npxprobe1(sc->sc_iot, sc->sc_ioh, irq); switch (sc->sc_type) { case NPX_INTERRUPT: printf("%s: interrupting at irq %d\n", sc->sc_dev.dv_xname, irq); lcr0(rcr0() & ~CR0_NE); sc->sc_ih = isa_intr_establish(0/*XXX*/, irq, ist, IPL_NONE, npxintr, NULL); break; case NPX_EXCEPTION: printf("%s: using exception 16\n", sc->sc_dev.dv_xname); break; case NPX_BROKEN: printf("%s: error reporting broken; not using\n", sc->sc_dev.dv_xname); sc->sc_type = NPX_NONE; return; case NPX_NONE: panic("npx_pnpbios_attach"); } npxattach(sc); }
void ym_pnpbios_attach(device_t parent, device_t self, void *aux) { struct ym_softc *sc = device_private(self); struct ad1848_softc *ac = &sc->sc_ad1848.sc_ad1848; struct pnpbiosdev_attach_args *aa = aux; ac->sc_dev = self; if (pnpbios_io_map(aa->pbt, aa->resc, 0, &sc->sc_iot, &sc->sc_sb_ioh) != 0) { printf(": can't map sb i/o space\n"); return; } if (pnpbios_io_map(aa->pbt, aa->resc, 1, &sc->sc_iot, &sc->sc_ioh) != 0) { printf(": can't map sb i/o space\n"); return; } if (pnpbios_io_map(aa->pbt, aa->resc, 2, &sc->sc_iot, &sc->sc_opl_ioh) != 0) { printf(": can't map opl i/o space\n"); return; } #if NMPU_YM > 0 if (pnpbios_io_map(aa->pbt, aa->resc, 3, &sc->sc_iot, &sc->sc_mpu_ioh) != 0) { printf(": can't map mpu i/o space\n"); return; } #endif if (pnpbios_io_map(aa->pbt, aa->resc, 4, &sc->sc_iot, &sc->sc_controlioh) != 0) { printf(": can't map control i/o space\n"); return; } sc->sc_ic = aa->ic; if (pnpbios_getirqnum(aa->pbt, aa->resc, 0, &sc->ym_irq, NULL)) { printf(": can't get IRQ\n"); return; } if (pnpbios_getdmachan(aa->pbt, aa->resc, 0, &sc->ym_playdrq)) { printf(": can't get DMA channel\n"); return; } if (pnpbios_getdmachan(aa->pbt, aa->resc, 1, &sc->ym_recdrq)) sc->ym_recdrq = sc->ym_playdrq; /* half-duplex mode */ printf("\n"); pnpbios_print_devres(self, aa); printf("%s", device_xname(self)); ac->sc_iot = sc->sc_iot; if (bus_space_subregion(sc->sc_iot, sc->sc_ioh, WSS_CODEC, AD1848_NPORT, &ac->sc_ioh)) { aprint_error_dev(self, "bus_space_subregion failed\n"); return; } ac->mode = 2; ac->MCE_bit = MODE_CHANGE_ENABLE; sc->sc_ad1848.sc_ic = sc->sc_ic; ym_attach(sc); }