Convert WSS driver to use non-broken indirect configuration.
This commit is contained in:
parent
51e120ae5a
commit
8fdd7cab62
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: ad1848.c,v 1.38 1997/08/19 23:35:45 augustss Exp $ */
|
/* $NetBSD: ad1848.c,v 1.39 1997/08/20 15:26:25 augustss Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1994 John Brezak
|
* Copyright (c) 1994 John Brezak
|
||||||
@ -66,11 +66,6 @@
|
|||||||
* Portions also supplied from the SoundBlaster driver for NetBSD.
|
* Portions also supplied from the SoundBlaster driver for NetBSD.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
* Todo:
|
|
||||||
* - Need datasheet for CS4231 (for use with GUS MAX)
|
|
||||||
* - Use fast audio_dma
|
|
||||||
*/
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
#include <sys/errno.h>
|
#include <sys/errno.h>
|
||||||
@ -483,6 +478,14 @@ bad:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Unmap the I/O ports */
|
||||||
|
void
|
||||||
|
ad1848_unmap(sc)
|
||||||
|
struct ad1848_softc *sc;
|
||||||
|
{
|
||||||
|
bus_space_unmap(sc->sc_iot, sc->sc_ioh, AD1848_NPORT);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attach hardware to driver, attach hardware driver to audio
|
* Attach hardware to driver, attach hardware driver to audio
|
||||||
* pseudo-device driver .
|
* pseudo-device driver .
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: ad1848var.h,v 1.18 1997/07/31 22:33:25 augustss Exp $ */
|
/* $NetBSD: ad1848var.h,v 1.19 1997/08/20 15:26:27 augustss Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1994 John Brezak
|
* Copyright (c) 1994 John Brezak
|
||||||
@ -107,6 +107,7 @@ struct ad1848_softc {
|
|||||||
|
|
||||||
#ifdef _KERNEL
|
#ifdef _KERNEL
|
||||||
int ad1848_probe __P((struct ad1848_softc *));
|
int ad1848_probe __P((struct ad1848_softc *));
|
||||||
|
void ad1848_unmap __P((struct ad1848_softc *));
|
||||||
void ad1848_attach __P((struct ad1848_softc *));
|
void ad1848_attach __P((struct ad1848_softc *));
|
||||||
|
|
||||||
int ad1848_open __P((void *, int));
|
int ad1848_open __P((void *, int));
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: wss.c,v 1.32 1997/08/19 23:50:06 augustss Exp $ */
|
/* $NetBSD: wss.c,v 1.33 1997/08/20 15:26:29 augustss Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1994 John Brezak
|
* Copyright (c) 1994 John Brezak
|
||||||
@ -128,7 +128,8 @@ struct wss_softc {
|
|||||||
|
|
||||||
int mic_mute, cd_mute, dac_mute;
|
int mic_mute, cd_mute, dac_mute;
|
||||||
int mad_chip_type; /* chip type if MAD emulation of WSS */
|
int mad_chip_type; /* chip type if MAD emulation of WSS */
|
||||||
bus_space_handle_t sc_mad_ioh; /* handle */
|
bus_space_handle_t sc_mad_ioh; /* MAD handle */
|
||||||
|
bus_space_handle_t sc_mad_ioh1, sc_mad_ioh2, sc_mad_ioh3;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct audio_device wss_device = {
|
struct audio_device wss_device = {
|
||||||
@ -150,8 +151,11 @@ int wss_query_devinfo __P((void *, mixer_devinfo_t *));
|
|||||||
static int wss_to_vol __P((mixer_ctrl_t *, struct ad1848_volume *));
|
static int wss_to_vol __P((mixer_ctrl_t *, struct ad1848_volume *));
|
||||||
static int wss_from_vol __P((mixer_ctrl_t *, struct ad1848_volume *));
|
static int wss_from_vol __P((mixer_ctrl_t *, struct ad1848_volume *));
|
||||||
|
|
||||||
|
static int wssfind __P((struct device *, struct wss_softc *, struct isa_attach_args *));
|
||||||
|
|
||||||
static int madprobe __P((struct wss_softc *, int));
|
static int madprobe __P((struct wss_softc *, int));
|
||||||
static void madprobedone __P((struct wss_softc *));
|
static void madattach __P((struct wss_softc *));
|
||||||
|
static void madunmap __P((struct wss_softc *));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Define our interface to the higher level audio driver.
|
* Define our interface to the higher level audio driver.
|
||||||
@ -207,10 +211,31 @@ struct cfdriver wss_cd = {
|
|||||||
int
|
int
|
||||||
wssprobe(parent, match, aux)
|
wssprobe(parent, match, aux)
|
||||||
struct device *parent;
|
struct device *parent;
|
||||||
void *match, *aux;
|
#ifdef __BROKEN_INDIRECT_CONFIG
|
||||||
|
void *match;
|
||||||
|
#else
|
||||||
|
struct cfdata *match;
|
||||||
|
#endif
|
||||||
|
void *aux;
|
||||||
|
{
|
||||||
|
struct wss_softc probesc, *sc = &probesc;
|
||||||
|
|
||||||
|
if (wssfind(parent, sc, aux)) {
|
||||||
|
bus_space_unmap(sc->sc_iot, sc->sc_ioh, WSS_CODEC);
|
||||||
|
ad1848_unmap(&sc->sc_ad1848);
|
||||||
|
madunmap(sc);
|
||||||
|
return 1;
|
||||||
|
} else
|
||||||
|
/* Everything is already unmapped */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
wssfind(parent, sc, ia)
|
||||||
|
struct device *parent;
|
||||||
|
struct wss_softc *sc;
|
||||||
|
struct isa_attach_args *ia;
|
||||||
{
|
{
|
||||||
struct wss_softc *sc = match;
|
|
||||||
struct isa_attach_args *ia = aux;
|
|
||||||
static u_char interrupt_bits[12] = {
|
static u_char interrupt_bits[12] = {
|
||||||
-1, -1, -1, -1, -1, -1, -1, 0x08, -1, 0x10, 0x18, 0x20
|
-1, -1, -1, -1, -1, -1, -1, 0x08, -1, 0x10, 0x18, 0x20
|
||||||
};
|
};
|
||||||
@ -224,12 +249,12 @@ wssprobe(parent, match, aux)
|
|||||||
|
|
||||||
if (!WSS_BASE_VALID(ia->ia_iobase)) {
|
if (!WSS_BASE_VALID(ia->ia_iobase)) {
|
||||||
DPRINTF(("wss: configured iobase %x invalid\n", ia->ia_iobase));
|
DPRINTF(("wss: configured iobase %x invalid\n", ia->ia_iobase));
|
||||||
return 0;
|
goto bad1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Map the ports upto the AD1848 port */
|
/* Map the ports upto the AD1848 port */
|
||||||
if (bus_space_map(sc->sc_iot, ia->ia_iobase, WSS_CODEC, 0, &sc->sc_ioh))
|
if (bus_space_map(sc->sc_iot, ia->ia_iobase, WSS_CODEC, 0, &sc->sc_ioh))
|
||||||
return 0;
|
goto bad1;
|
||||||
|
|
||||||
sc->sc_ad1848.sc_iot = sc->sc_iot;
|
sc->sc_ad1848.sc_iot = sc->sc_iot;
|
||||||
sc->sc_ad1848.sc_iobase = ia->ia_iobase + WSS_CODEC;
|
sc->sc_ad1848.sc_iobase = ia->ia_iobase + WSS_CODEC;
|
||||||
@ -274,15 +299,12 @@ wssprobe(parent, match, aux)
|
|||||||
bus_space_write_1(sc->sc_iot, sc->sc_ioh, WSS_CONFIG,
|
bus_space_write_1(sc->sc_iot, sc->sc_ioh, WSS_CONFIG,
|
||||||
(interrupt_bits[ia->ia_irq] | dma_bits[ia->ia_drq]));
|
(interrupt_bits[ia->ia_irq] | dma_bits[ia->ia_drq]));
|
||||||
|
|
||||||
if (sc->mad_chip_type != MAD_NONE)
|
|
||||||
madprobedone(sc);
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
bad:
|
bad:
|
||||||
bus_space_unmap(sc->sc_iot, sc->sc_ioh, WSS_CODEC);
|
bus_space_unmap(sc->sc_iot, sc->sc_ioh, WSS_CODEC);
|
||||||
if (sc->mad_chip_type != MAD_NONE)
|
bad1:
|
||||||
bus_space_unmap(sc->sc_iot, sc->sc_mad_ioh, MAD_NPORT);
|
madunmap(sc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -299,6 +321,13 @@ wssattach(parent, self, aux)
|
|||||||
struct isa_attach_args *ia = (struct isa_attach_args *)aux;
|
struct isa_attach_args *ia = (struct isa_attach_args *)aux;
|
||||||
int version;
|
int version;
|
||||||
|
|
||||||
|
if (!wssfind(parent, sc, ia)) {
|
||||||
|
printf("wssattach: wssfind failed\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
madattach(sc);
|
||||||
|
|
||||||
sc->sc_ad1848.sc_recdrq = ia->ia_drq;
|
sc->sc_ad1848.sc_recdrq = ia->ia_drq;
|
||||||
sc->sc_ad1848.sc_isa = parent;
|
sc->sc_ad1848.sc_isa = parent;
|
||||||
|
|
||||||
@ -846,15 +875,17 @@ madprobe(sc, iobase)
|
|||||||
{ M_WSS_PORT0, M_WSS_PORT1, M_WSS_PORT2, M_WSS_PORT3 };
|
{ M_WSS_PORT0, M_WSS_PORT1, M_WSS_PORT2, M_WSS_PORT3 };
|
||||||
int i;
|
int i;
|
||||||
int chip_type;
|
int chip_type;
|
||||||
bus_space_handle_t hdl1, hdl2, hdl3;
|
|
||||||
|
|
||||||
if (bus_space_map(sc->sc_iot, MAD_BASE, MAD_NPORT, 0, &sc->sc_mad_ioh))
|
if (bus_space_map(sc->sc_iot, MAD_BASE, MAD_NPORT, 0, &sc->sc_mad_ioh))
|
||||||
return MAD_NONE;
|
return MAD_NONE;
|
||||||
|
|
||||||
/* Allocate bus space that the MAD chip wants */
|
/* Allocate bus space that the MAD chip wants */
|
||||||
if (bus_space_map(sc->sc_iot, MAD_REG1, MAD_LEN1, 0, &hdl1)) goto bad1;
|
if (bus_space_map(sc->sc_iot, MAD_REG1, MAD_LEN1, 0, &sc->sc_mad_ioh1))
|
||||||
if (bus_space_map(sc->sc_iot, MAD_REG2, MAD_LEN2, 0, &hdl2)) goto bad2;
|
goto bad1;
|
||||||
if (bus_space_map(sc->sc_iot, MAD_REG3, MAD_LEN3, 0, &hdl3)) goto bad3;
|
if (bus_space_map(sc->sc_iot, MAD_REG2, MAD_LEN2, 0, &sc->sc_mad_ioh2))
|
||||||
|
goto bad2;
|
||||||
|
if (bus_space_map(sc->sc_iot, MAD_REG3, MAD_LEN3, 0, &sc->sc_mad_ioh3))
|
||||||
|
goto bad3;
|
||||||
|
|
||||||
DPRINTF(("mad: Detect using password = 0xE2\n"));
|
DPRINTF(("mad: Detect using password = 0xE2\n"));
|
||||||
if (!detect_mad16(sc, MAD_82C928)) {
|
if (!detect_mad16(sc, MAD_82C928)) {
|
||||||
@ -896,23 +927,38 @@ madprobe(sc, iobase)
|
|||||||
|
|
||||||
return chip_type;
|
return chip_type;
|
||||||
bad:
|
bad:
|
||||||
bus_space_unmap(sc->sc_iot, hdl3, MAD_LEN3);
|
bus_space_unmap(sc->sc_iot, sc->sc_mad_ioh3, MAD_LEN3);
|
||||||
bad3:
|
bad3:
|
||||||
bus_space_unmap(sc->sc_iot, hdl2, MAD_LEN2);
|
bus_space_unmap(sc->sc_iot, sc->sc_mad_ioh2, MAD_LEN2);
|
||||||
bad2:
|
bad2:
|
||||||
bus_space_unmap(sc->sc_iot, hdl1, MAD_LEN1);
|
bus_space_unmap(sc->sc_iot, sc->sc_mad_ioh1, MAD_LEN1);
|
||||||
bad1:
|
bad1:
|
||||||
bus_space_unmap(sc->sc_iot, sc->sc_mad_ioh, MAD_NPORT);
|
bus_space_unmap(sc->sc_iot, sc->sc_mad_ioh, MAD_NPORT);
|
||||||
return MAD_NONE;
|
return MAD_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
madprobedone(sc)
|
madunmap(sc)
|
||||||
|
struct wss_softc *sc;
|
||||||
|
{
|
||||||
|
if (sc->mad_chip_type == MAD_NONE)
|
||||||
|
return;
|
||||||
|
bus_space_unmap(sc->sc_iot, sc->sc_mad_ioh, MAD_NPORT);
|
||||||
|
bus_space_unmap(sc->sc_iot, sc->sc_mad_ioh1, MAD_LEN1);
|
||||||
|
bus_space_unmap(sc->sc_iot, sc->sc_mad_ioh2, MAD_LEN2);
|
||||||
|
bus_space_unmap(sc->sc_iot, sc->sc_mad_ioh3, MAD_LEN3);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
madattach(sc)
|
||||||
struct wss_softc *sc;
|
struct wss_softc *sc;
|
||||||
{
|
{
|
||||||
int chip_type = sc->mad_chip_type;
|
int chip_type = sc->mad_chip_type;
|
||||||
unsigned char cs4231_mode;
|
unsigned char cs4231_mode;
|
||||||
|
|
||||||
|
if (chip_type == MAD_NONE)
|
||||||
|
return;
|
||||||
|
|
||||||
cs4231_mode =
|
cs4231_mode =
|
||||||
strncmp(sc->sc_ad1848.chip_name, "CS4248", 6) == 0 ||
|
strncmp(sc->sc_ad1848.chip_name, "CS4248", 6) == 0 ||
|
||||||
strncmp(sc->sc_ad1848.chip_name, "CS4231", 6) == 0 ? 0x02 : 0;
|
strncmp(sc->sc_ad1848.chip_name, "CS4231", 6) == 0 ? 0x02 : 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user