Setup irq correctly (PR#1179)

This commit is contained in:
brezak 1995-07-07 02:15:12 +00:00
parent 0bdd4aa7c2
commit dd3d2e28ed
2 changed files with 40 additions and 38 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: wss.c,v 1.5 1995/05/08 22:02:32 brezak Exp $ */
/* $NetBSD: wss.c,v 1.6 1995/07/07 02:15:12 brezak Exp $ */
/*
* Copyright (c) 1994 John Brezak
@ -52,10 +52,9 @@
#include <dev/isa/isavar.h>
#include <dev/isa/isadmavar.h>
#include <i386/isa/icu.h> /* XXX BROKEN; WHY? */
#include <dev/ic/ad1848reg.h>
#include <dev/isa/ad1848var.h>
#include <dev/isa/ad1848reg.h>
#include <dev/isa/wssreg.h>
/*
@ -77,8 +76,7 @@
#define WSS_RECORD_CLASS 10
#define WSS_MONITOR_CLASS 11
#define DEBUG /*XXX*/
#ifdef DEBUG
#ifdef AUDIO_DEBUG
#define DPRINTF(x) if (wssdebug) printf x
int wssdebug = 0;
#else
@ -91,7 +89,6 @@ struct wss_softc {
void *sc_ih; /* interrupt vectoring */
struct ad1848_softc sc_ad1848;
#define wss_iobase sc_ad1848.sc_iobase
#define wss_irq sc_ad1848.sc_irq
#define wss_drq sc_ad1848.sc_drq
@ -186,19 +183,27 @@ wssprobe(parent, self, aux)
-1, -1, -1, -1, -1, -1, -1, 0x08, -1, 0x10, 0x18, 0x20
};
static u_char dma_bits[4] = {1, 2, 0, 3};
char bits;
if (!WSS_BASE_VALID(ia->ia_iobase)) {
printf("wss: configured iobase %d invalid\n", ia->ia_iobase);
printf("wss: configured iobase %x invalid\n", ia->ia_iobase);
return 0;
}
sc->wss_iobase = iobase;
sc->sc_ad1848.sc_iobase = iobase;
/* Is there an ad1848 chip at the WSS iobase ? */
if (ad1848_probe(&sc->sc_ad1848) == 0)
return 0;
ia->ia_iosize = WSS_NPORT;
/* Setup WSS interrupt and DMA */
if (!WSS_DRQ_VALID(ia->ia_drq)) {
printf("wss: configured dma chan %d invalid\n", ia->ia_drq);
return 0;
}
sc->wss_drq = ia->ia_drq;
#ifdef NEWCONFIG
/*
* If the IRQ wasn't compiled in, auto-detect it.
@ -206,27 +211,21 @@ wssprobe(parent, self, aux)
if (ia->ia_irq == IRQUNK) {
ia->ia_irq = isa_discoverintr(ad1848_forceintr, &sc->sc_ad1848);
if (!WSS_IRQ_VALID(ia->ia_irq)) {
printf("wss: couldn't auto-detect interrupt");
printf("wss: couldn't auto-detect interrupt\n");
return 0;
}
}
else
#endif
ia->ia_iosize = WSS_NPORT;
/* Setup WSS interrupt and DMA */
if ((bits = interrupt_bits[sc->wss_irq]) == -1) {
printf("wss: invalid interrupt configuration (irq=%d)\n", sc->wss_irq);
return 0;
if (!WSS_IRQ_VALID(ia->ia_irq)) {
printf("wss: configured interrupt %d invalid\n", ia->ia_irq);
return 0;
}
#if 0
/* XXX Dual-DMA */
outb(sc->wss_iobase+WSS_CONFIG, (bits | 0x40));
if ((inb(sc->wss_iobase+WSS_STATUS) & 0x40) == 0)
printf("wss: IRQ?\n");
#endif
outb(sc->wss_iobase+WSS_CONFIG, (bits | dma_bits[sc->wss_drq]));
sc->wss_irq = ia->ia_irq;
outb(iobase+WSS_CONFIG,
(interrupt_bits[ia->ia_irq] | dma_bits[ia->ia_drq]));
return 1;
}
@ -243,25 +242,25 @@ wssattach(parent, self, aux)
register struct wss_softc *sc = (struct wss_softc *)self;
struct isa_attach_args *ia = (struct isa_attach_args *)aux;
register u_short iobase = ia->ia_iobase;
sc->wss_iobase = iobase;
sc->wss_drq = ia->ia_drq;
int err;
sc->sc_ad1848.sc_recdrq = ia->ia_drq;
#ifdef NEWCONFIG
isa_establish(&sc->sc_id, &sc->sc_dev);
#endif
sc->sc_ih = isa_intr_establish(ia->ia_irq, ISA_IST_EDGE, ISA_IPL_BIO,
ad1848_intr, &sc->sc_ad1848);
sc->sc_ih = isa_intr_establish(ia->ia_irq, ISA_IST_EDGE, ISA_IPL_AUDIO,
ad1848_intr, &sc->sc_ad1848);
ad1848_attach(&sc->sc_ad1848);
printf(" (vers %d)", inb(sc->wss_iobase+WSS_STATUS) & 0x1f);
printf(" (vers %d)", inb(iobase+WSS_STATUS) & WSS_VERSMASK);
printf("\n");
sc->sc_ad1848.parent = sc;
if (audio_hardware_attach(&wss_hw_if, &sc->sc_ad1848) != 0)
printf("wss: could not attach to audio pseudo-device driver\n");
if ((err = audio_hardware_attach(&wss_hw_if, &sc->sc_ad1848)) != 0)
printf("wss: could not attach to audio pseudo-device driver (%d)\n", err);
}
static int

View File

@ -1,4 +1,4 @@
/* $NetBSD: wssreg.h,v 1.2 1995/05/08 22:02:35 brezak Exp $ */
/* $NetBSD: wssreg.h,v 1.3 1995/07/07 02:15:15 brezak Exp $ */
/*
* Copyright (c) 1991-1993 Regents of the University of California.
@ -42,20 +42,23 @@
/*
* Macros to detect valid hardware configuration data.
*/
#define WSS_IRQ_VALID(mask) ((mask) & 0x00ac) /* IRQ 2,3,5,7 */
#define WSS_IRQ_VALID(irq) ((irq) == 7 || (irq) == 9 || \
(irq) == 10 || (irq) == 11)
#define WSS_DRQ_VALID(chan) ((chan) == 0 || (chan) == 1 || (chan) == 3)
#define WSS_BASE_VALID(base) ((base) == 0x0530 || \
(base) == 0x0604 || \
(base) == 0x0e80 || \
(base) == 0x0f40)
/* Default WSS base */
/* WSS registers */
#define WSS_BASE_ADDRESS 0x0530
/* WSS registers */
#define WSS_CONFIG 0x00
#define WSS_STATUS 0x03
#define WSS_CONFIG 0x00 /* write only */
#define WSS_STATUS 0x03 /* read only */
#define WSS_VERS 0x04
/* WSS status register bits */
#define WSS_16SLOT 0x80
#define WSS_DUALDMA 0x40
#define WSS_IRQACTIVE 0x40
#define WSS_VERS 0x04
#define WSS_VERSMASK 0x3f