static void atppc_acpi_attach(device_t parent, device_t self, void *aux) { struct atppc_softc *sc = device_private(self); struct atppc_acpi_softc *asc = device_private(self); struct acpi_attach_args *aa = aux; struct acpi_resources res; struct acpi_io *io; struct acpi_irq *irq; struct acpi_drq *drq; ACPI_STATUS rv; int nirq; sc->sc_dev_ok = ATPPC_NOATTACH; sc->sc_dev = self; /* parse resources */ rv = acpi_resource_parse(sc->sc_dev, aa->aa_node->ad_handle, "_CRS", &res, &acpi_resource_parse_ops_default); if (ACPI_FAILURE(rv)) return; /* find our i/o registers */ io = acpi_res_io(&res, 0); if (io == NULL) { aprint_error_dev(sc->sc_dev, "unable to find i/o register resource\n"); goto out; } /* find our IRQ */ irq = acpi_res_irq(&res, 0); if (irq == NULL) { aprint_error_dev(sc->sc_dev, "unable to find irq resource\n"); goto out; } nirq = irq->ar_irq; /* find our DRQ */ drq = acpi_res_drq(&res, 0); if (drq == NULL) { aprint_error_dev(sc->sc_dev, "unable to find drq resource\n"); goto out; } asc->sc_drq = drq->ar_drq; /* Attach */ sc->sc_iot = aa->aa_iot; sc->sc_has = 0; asc->sc_ic = aa->aa_ic; sc->sc_dev_ok = ATPPC_ATTACHED; if (bus_space_map(sc->sc_iot, io->ar_base, io->ar_length, 0, &sc->sc_ioh) != 0) { aprint_error_dev(self, "attempt to map bus space failed, device not " "properly attached.\n"); goto out; } sc->sc_ieh = isa_intr_establish(aa->aa_ic, nirq, (irq->ar_type == ACPI_EDGE_SENSITIVE) ? IST_EDGE : IST_LEVEL, IPL_TTY, atppcintr, sc->sc_dev); /* setup DMA hooks */ if (atppc_isadma_setup(sc, asc->sc_ic, asc->sc_drq) == 0) { sc->sc_has |= ATPPC_HAS_DMA; sc->sc_dma_start = atppc_acpi_dma_start; sc->sc_dma_finish = atppc_acpi_dma_finish; sc->sc_dma_abort = atppc_acpi_dma_abort; sc->sc_dma_malloc = atppc_acpi_dma_malloc; sc->sc_dma_free = atppc_acpi_dma_free; } sc->sc_has |= ATPPC_HAS_INTR; /* Run soft configuration attach */ atppc_sc_attach(sc); out: acpi_resource_cleanup(&res); }
/* Attach function: attach and configure parallel port controller on isa bus. */ static void atppc_isa_attach(device_t parent, device_t self, void *aux) { struct atppc_isa_softc *sc = device_private(self); struct atppc_softc *lsc = &sc->sc_atppc; struct isa_attach_args *ia = aux; printf(": AT Parallel Port\n"); lsc->sc_iot = ia->ia_iot; lsc->sc_dmat = ia->ia_dmat; lsc->sc_has = 0; sc->sc_ic = ia->ia_ic; sc->sc_iobase = ia->ia_io->ir_addr; if (bus_space_map(lsc->sc_iot, sc->sc_iobase, IO_LPTSIZE, 0, &lsc->sc_ioh) != 0) { aprint_error_dev(self, "attempt to map bus space failed, device not " "properly attached.\n"); lsc->sc_dev_ok = ATPPC_NOATTACH; return; } lsc->sc_dev = self; lsc->sc_dev_ok = ATPPC_ATTACHED; /* Assign interrupt handler */ if (!(device_cfdata(self)->cf_flags & ATPPC_FLAG_DISABLE_INTR) && ia->ia_irq->ir_irq != ISA_UNKNOWN_IRQ && ia->ia_nirq >= 1) { sc->sc_irq = ia->ia_irq[0].ir_irq; } else sc->sc_irq = -1; if (sc->sc_irq > 0) { /* Establish interrupt handler. */ lsc->sc_ieh = isa_intr_establish(sc->sc_ic, sc->sc_irq, IST_EDGE, IPL_ATPPC, atppcintr, lsc->sc_dev); lsc->sc_has |= ATPPC_HAS_INTR; } /* Configure DMA */ if (!(device_cfdata(self)->cf_flags & ATPPC_FLAG_DISABLE_DMA) && ia->ia_drq->ir_drq != ISA_UNKNOWN_DRQ && ia->ia_ndrq >= 1) sc->sc_drq = ia->ia_drq[0].ir_drq; else sc->sc_drq = -1; if (sc->sc_drq != -1 && atppc_isadma_setup(lsc, sc->sc_ic, sc->sc_drq) == 0) { lsc->sc_has |= ATPPC_HAS_DMA; /* setup DMA hooks */ lsc->sc_dma_start = atppc_isa_dma_start; lsc->sc_dma_finish = atppc_isa_dma_finish; lsc->sc_dma_abort = atppc_isa_dma_abort; lsc->sc_dma_malloc = atppc_isa_dma_malloc; lsc->sc_dma_free = atppc_isa_dma_free; } /* Run soft configuration attach */ atppc_sc_attach(lsc); return; }