summaryrefslogtreecommitdiff
path: root/sys/arch/hp300/dev
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2011-12-21 23:12:04 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2011-12-21 23:12:04 +0000
commitb909aca3812a992bda13f97d82c90b08658053d4 (patch)
tree948fa1cd2ddb9858d8ffd5ba76fe4f2da1324ab1 /sys/arch/hp300/dev
parent2348e0f29912799f5958c0165d793b37c57131a2 (diff)
Work-in-progress driver for the HP ``Audio1'' device found on the HP 9000/425e
(hp300) and the HP9000/705 and 9000/710 (hppa). 8-bit mono, 8KHz, no surprise since it is based upon a digital phone chip. Tested on 425e only so far, and playback only; configured in, but disabled, on hppa kernels until there are positive test reports (I am not sure the interrupt assignment on hppa is correct). And now people no longer can joke about audio on hp300.
Diffstat (limited to 'sys/arch/hp300/dev')
-rw-r--r--sys/arch/hp300/dev/arcofi_dio.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/sys/arch/hp300/dev/arcofi_dio.c b/sys/arch/hp300/dev/arcofi_dio.c
new file mode 100644
index 00000000000..56b07af0137
--- /dev/null
+++ b/sys/arch/hp300/dev/arcofi_dio.c
@@ -0,0 +1,105 @@
+/* $OpenBSD: arcofi_dio.c,v 1.1 2011/12/21 23:12:03 miod Exp $ */
+
+/*
+ * Copyright (c) 2011 Miodrag Vallat.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/device.h>
+
+#include <machine/autoconf.h>
+#include <machine/bus.h>
+#include <machine/intr.h>
+
+#include <sys/audioio.h>
+#include <dev/audio_if.h>
+#include <dev/ic/arcofivar.h>
+
+#include <hp300/dev/dioreg.h>
+#include <hp300/dev/diovar.h>
+
+#include <hp300/dev/diodevs.h>
+
+void arcofi_dio_attach(struct device *, struct device *, void *);
+int arcofi_dio_match(struct device *, void *, void *);
+
+struct arcofi_dio_softc {
+ struct arcofi_softc sc_arcofi;
+
+ struct isr sc_isr;
+};
+
+const struct cfattach arcofi_dio_ca = {
+ sizeof(struct arcofi_dio_softc),
+ arcofi_dio_match,
+ arcofi_dio_attach
+};
+
+extern struct hp300_bus_space_tag hp300_mem_tag; /* XXX */
+
+int
+arcofi_dio_match(struct device *parent, void *match, void *vaa)
+{
+ struct dio_attach_args *da = vaa;
+
+ if (da->da_id != DIO_DEVICE_ID_AUDIO)
+ return 0;
+
+ return 1;
+}
+
+void
+arcofi_dio_attach(struct device *parent, struct device *self, void *vaa)
+{
+ struct arcofi_dio_softc *adsc = (struct arcofi_dio_softc *)self;
+ struct arcofi_softc *sc = &adsc->sc_arcofi;
+ struct dio_attach_args *da = vaa;
+ bus_addr_t base;
+ unsigned int u;
+ int ipl;
+
+ for (u = 0; u < ARCOFI_NREGS; u++)
+ sc->sc_reg[u] = (u << 1) | 0x01;
+
+ base = (bus_addr_t)dio_scodetopa(da->da_scode);
+ sc->sc_iot = &hp300_mem_tag;
+ /*
+ * XXX We request BUS_SPACE_MAP_LINEAR only to be able to use DIO_IPL
+ * XXX below; this ought to be provided in the attach_args
+ */
+ if (bus_space_map(sc->sc_iot, base, DIOII_SIZEOFF, BUS_SPACE_MAP_LINEAR,
+ &sc->sc_ioh) != 0) {
+ printf(": can't map registers\n");
+ return;
+ }
+ ipl = DIO_IPL(bus_space_vaddr(sc->sc_iot, sc->sc_ioh));
+
+ sc->sc_sih = softintr_establish(IPL_SOFT, &arcofi_swintr, sc);
+ if (sc->sc_sih == NULL) {
+ printf(": can't register soft interrupt\n");
+ return;
+ }
+ adsc->sc_isr.isr_func = arcofi_hwintr;
+ adsc->sc_isr.isr_arg = sc;
+ adsc->sc_isr.isr_ipl = ipl;
+ adsc->sc_isr.isr_priority = IPL_AUDIO;
+ dio_intr_establish(&adsc->sc_isr, self->dv_xname);
+
+ printf(" ipl %d\n", ipl);
+
+ arcofi_attach(sc, "dio");
+}