From 33ac82dfff8d6ba12da515eb290f2baeb928cd1a Mon Sep 17 00:00:00 2001 From: jmcneill Date: Sat, 28 Dec 2002 06:20:15 +0000 Subject: [PATCH] Add 'com at acpi' and 'wss at acpi' glue. These are both working great on my ThinkPad 600E. XXX isa_dmainit isn't called early enough for the 'audio at wss' attachment XXX to work, so I'm deferring the call to 'wssattach' until later on. This XXX should be fixed soon. --- sys/dev/acpi/com_acpi.c | 159 +++++++++++++++++++++++++++++++ sys/dev/acpi/files.acpi | 10 +- sys/dev/acpi/wss_acpi.c | 201 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 369 insertions(+), 1 deletion(-) create mode 100644 sys/dev/acpi/com_acpi.c create mode 100644 sys/dev/acpi/wss_acpi.c diff --git a/sys/dev/acpi/com_acpi.c b/sys/dev/acpi/com_acpi.c new file mode 100644 index 000000000000..c796e834ac7f --- /dev/null +++ b/sys/dev/acpi/com_acpi.c @@ -0,0 +1,159 @@ +/* $NetBSD: com_acpi.c,v 1.1 2002/12/28 06:20:15 jmcneill Exp $ */ + +/* + * Copyright (c) 2002 Jared D. McNeill + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__KERNEL_RCSID(0, "$NetBSD: com_acpi.c,v 1.1 2002/12/28 06:20:15 jmcneill Exp $"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include + +#include + +int com_acpi_match(struct device *, struct cfdata *, void *); +void com_acpi_attach(struct device *, struct device *, void *); + +struct com_acpi_softc { + struct com_softc sc_com; + void *sc_ih; +}; + +CFATTACH_DECL(com_acpi, sizeof(struct com_acpi_softc), com_acpi_match, + com_acpi_attach, NULL, NULL); + +/* + * Supported device IDs + */ + +static char *com_acpi_ids[] = { + "PNP0500", /* Standard PC COM port */ + "PNP0501", /* 16550A-compatible COM port */ + "PNP0510", /* Generic IRDA-compatible device */ + "PNP0511", /* Generic IRDA-compatible device */ + NULL +}; + +/* + * com_acpi_match: autoconf(9) match routine + */ +int +com_acpi_match(struct device *parent, struct cfdata *match, void *aux) +{ + struct acpi_attach_args *aa = aux; + char *id; + int i; + + if (aa->aa_node->ad_type != ACPI_TYPE_DEVICE) + return 0; + + for (id = com_acpi_ids[0]; id != NULL; id = com_acpi_ids[++i]) { + if (strcmp(aa->aa_node->ad_devinfo.HardwareId, + com_acpi_ids[i]) == 0) + return 1; + } + + /* No matches found */ + return 0; +} + +/* + * com_acpi_attach: autoconf(9) attach routine + */ +void +com_acpi_attach(struct device *parent, struct device *self, void *aux) +{ + struct com_acpi_softc *asc = (struct com_acpi_softc *)self; + struct com_softc *sc = &asc->sc_com; + struct acpi_attach_args *aa = aux; + struct acpi_resources res; + struct acpi_io *io; + struct acpi_irq *irq; + ACPI_STATUS rv; + + printf("\n"); + + /* parse resources */ + rv = acpi_resource_parse(&sc->sc_dev, aa->aa_node, &res, + &acpi_resource_parse_ops_default); + if (rv != AE_OK) { + printf("%s: unable to parse resources\n", sc->sc_dev.dv_xname); + return; + } + + /* find our i/o registers */ + io = acpi_res_io(&res, 0); + if (io == NULL) { + printf("%s: unable to find i/o register resource\n", + sc->sc_dev.dv_xname); + return; + } + + /* find our IRQ */ + irq = acpi_res_irq(&res, 0); + if (irq == NULL) { + printf("%s: unable to find irq resource\n", + sc->sc_dev.dv_xname); + return; + } + + if (com_is_console(aa->aa_iot, io->ar_base, &sc->sc_ioh)) + sc->sc_iot = aa->aa_iot; + else if (bus_space_map(sc->sc_iot, io->ar_base, io->ar_length, + 0, &sc->sc_ioh)) { + printf("%s: can't map i/o space\n", sc->sc_dev.dv_xname); + return; + } + sc->sc_iobase = io->ar_base; + + printf("%s", sc->sc_dev.dv_xname); + + if (comprobe1(sc->sc_iot, sc->sc_ioh) == 0) { + printf(": com probe failed\n"); + return; + } + + sc->sc_frequency = 115200 * 16; + + com_attach_subr(sc); + + asc->sc_ih = isa_intr_establish(aa->aa_ic, irq->ar_irq, 0, + IPL_SERIAL, comintr, sc); +} diff --git a/sys/dev/acpi/files.acpi b/sys/dev/acpi/files.acpi index 931c289ead50..4a1d2fdbf136 100644 --- a/sys/dev/acpi/files.acpi +++ b/sys/dev/acpi/files.acpi @@ -1,4 +1,4 @@ -# $NetBSD: files.acpi,v 1.7 2002/06/17 22:39:25 christos Exp $ +# $NetBSD: files.acpi,v 1.8 2002/12/28 06:20:15 jmcneill Exp $ include "dev/acpi/acpica/files.acpica" @@ -33,3 +33,11 @@ file dev/acpi/acpi_acad.c acpiacad device acpibat attach acpibat at acpi file dev/acpi/acpi_bat.c acpibat + +# Serial interface +attach com at acpi with com_acpi +file dev/acpi/com_acpi.c com_acpi + +# NeoMagic 256AV audio with CS4232 codec +attach wss at acpi with wss_acpi +file dev/acpi/wss_acpi.c wss_acpi diff --git a/sys/dev/acpi/wss_acpi.c b/sys/dev/acpi/wss_acpi.c new file mode 100644 index 000000000000..7befbd2b4ff6 --- /dev/null +++ b/sys/dev/acpi/wss_acpi.c @@ -0,0 +1,201 @@ +/* $NetBSD: wss_acpi.c,v 1.1 2002/12/28 06:20:15 jmcneill Exp $ */ + +/* + * Copyright (c) 2002 Jared D. McNeill + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__KERNEL_RCSID(0, "$NetBSD: wss_acpi.c,v 1.1 2002/12/28 06:20:15 jmcneill Exp $"); + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include + +int wss_acpi_match(struct device *, struct cfdata *, void *); +void wss_acpi_attach(struct device *, struct device *, void *); + +void wss_acpi_config_interrupts(struct device *); + +CFATTACH_DECL(wss_acpi, sizeof(struct wss_softc), wss_acpi_match, + wss_acpi_attach, NULL, NULL); + +/* + * Supported device IDs + */ + +static char *wss_acpi_ids[] = { + "CSC0100", /* NeoMagic 256AV with CS4232 codec */ + NULL +}; + +/* + * wss_acpi_match: autoconf(9) match routine + */ +int +wss_acpi_match(struct device *parent, struct cfdata *match, void *aux) +{ + struct acpi_attach_args *aa = aux; + char *id; + int i; + + if (aa->aa_node->ad_type != ACPI_TYPE_DEVICE) + return 0; + + for (id = wss_acpi_ids[0]; id != NULL; id = wss_acpi_ids[++i]) { + if (strcmp(aa->aa_node->ad_devinfo.HardwareId, + wss_acpi_ids[i]) == 0) + return 1; + } + + /* No matches found */ + return 0; +} + +/* + * wss_acpi_attach: autoconf(9) attach routine + */ +void +wss_acpi_attach(struct device *parent, struct device *self, void *aux) +{ + struct wss_softc *sc = (struct wss_softc *)self; + struct acpi_attach_args *aa = aux; + struct acpi_resources res; + struct acpi_io *dspio, *oplio; + struct acpi_irq *irq; + struct acpi_drq *playdrq, *recdrq; + ACPI_STATUS rv; + + printf(": NeoMagic 256AV audio\n"); + + /* Parse our resources */ + rv = acpi_resource_parse(&sc->sc_ad1848.sc_ad1848.sc_dev, + aa->aa_node, &res, &acpi_resource_parse_ops_default); + if (rv != AE_OK) { + printf("%s: unable to parse resources\n", + sc->sc_ad1848.sc_ad1848.sc_dev.dv_xname); + return; + } + + /* Find and map our i/o registers */ + sc->sc_iot = aa->aa_iot; + dspio = acpi_res_io(&res, 0); + oplio = acpi_res_io(&res, 1); + if (dspio == NULL || oplio == NULL) { + printf("%s: unable to find i/o registers resource\n", + sc->sc_ad1848.sc_ad1848.sc_dev.dv_xname); + return; + } + if (bus_space_map(sc->sc_iot, dspio->ar_base, dspio->ar_length, + 0, &sc->sc_ioh) != 0) { + printf("%s: unable to map i/o registers\n", + sc->sc_ad1848.sc_ad1848.sc_dev.dv_xname); + return; + } + if (bus_space_map(sc->sc_iot, oplio->ar_base, oplio->ar_length, + 0, &sc->sc_opl_ioh) != 0) { + printf("%s: unable to map opl i/o registers\n", + sc->sc_ad1848.sc_ad1848.sc_dev.dv_xname); + return; + } + + sc->wss_ic = aa->aa_ic; + + /* Find our IRQ */ + irq = acpi_res_irq(&res, 0); + if (irq == NULL) { + printf("%s: unable to find irq resource\n", + sc->sc_ad1848.sc_ad1848.sc_dev.dv_xname); + /* XXX bus_space_unmap */ + return; + } + sc->wss_irq = irq->ar_irq; + + /* Find our playback and record DRQs */ + playdrq = acpi_res_drq(&res, 0); + recdrq = acpi_res_drq(&res, 1); + if (playdrq == NULL || recdrq == NULL) { + printf("%s: unable to find drq resources\n", + sc->sc_ad1848.sc_ad1848.sc_dev.dv_xname); + /* XXX bus_space_unmap */ + return; + } + sc->wss_playdrq = playdrq->ar_drq; + sc->wss_recdrq = recdrq->ar_drq; + + sc->sc_ad1848.sc_ad1848.sc_iot = sc->sc_iot; + bus_space_subregion(sc->sc_iot, sc->sc_ioh, 0, 4, + &sc->sc_ad1848.sc_ad1848.sc_ioh); + + /* Look for the ad1848 */ + if (!ad1848_isa_probe(&sc->sc_ad1848)) { + printf("%s: ad1848 probe failed\n", + sc->sc_ad1848.sc_ad1848.sc_dev.dv_xname); + /* XXX cleanup */ + return; + } + + /* XXX */ + printf("%s: deferring audio attachment\n", + sc->sc_ad1848.sc_ad1848.sc_dev.dv_xname); + config_interrupts((struct device *)sc, wss_acpi_config_interrupts); +} + +/* + * XXX + */ +void +wss_acpi_config_interrupts(struct device *dev) +{ + struct wss_softc *sc = (struct wss_softc *)dev; + struct audio_attach_args arg; + + printf("%s", sc->sc_ad1848.sc_ad1848.sc_dev.dv_xname); + /* Attach our wss device */ + wssattach(sc); + + arg.type = AUDIODEV_TYPE_OPL; + arg.hwif = 0; + arg.hdl = 0; + config_found(dev, &arg, audioprint); +}