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.
This commit is contained in:
parent
c8111254a1
commit
33ac82dfff
|
@ -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 <jmcneill@invisible.ca>
|
||||
* 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 <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: com_acpi.c,v 1.1 2002/12/28 06:20:15 jmcneill Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <sys/device.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/termios.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
|
||||
#include <dev/isa/isavar.h>
|
||||
#include <dev/isa/isadmavar.h>
|
||||
|
||||
#include <dev/acpi/acpica.h>
|
||||
#include <dev/acpi/acpireg.h>
|
||||
#include <dev/acpi/acpivar.h>
|
||||
|
||||
#include <dev/ic/comvar.h>
|
||||
|
||||
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);
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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 <jmcneill@invisible.ca>
|
||||
* 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 <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: wss_acpi.c,v 1.1 2002/12/28 06:20:15 jmcneill Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <sys/device.h>
|
||||
#include <sys/proc.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
|
||||
#include <sys/audioio.h>
|
||||
#include <dev/audio_if.h>
|
||||
|
||||
#include <dev/isa/isavar.h>
|
||||
#include <dev/isa/isadmavar.h>
|
||||
|
||||
#include <dev/acpi/acpica.h>
|
||||
#include <dev/acpi/acpireg.h>
|
||||
#include <dev/acpi/acpivar.h>
|
||||
|
||||
#include <dev/isa/ad1848var.h>
|
||||
#include <dev/isa/wssreg.h>
|
||||
#include <dev/isa/wssvar.h>
|
||||
|
||||
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);
|
||||
}
|
Loading…
Reference in New Issue