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);
}
Beispiel #2
0
/* 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;
}