Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/jmcneill-audiomp3]: src/sys/arch/hp700/gsc adapt to audiomp api changes



details:   https://anonhg.NetBSD.org/src/rev/6647fe084d2f
branches:  jmcneill-audiomp3
changeset: 771366:6647fe084d2f
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Sun Nov 20 15:23:46 2011 +0000

description:
adapt to audiomp api changes

diffstat:

 sys/arch/hp700/gsc/harmony.c    |  71 +++++++++++++++++++++++++++++-----------
 sys/arch/hp700/gsc/harmonyvar.h |   4 +-
 2 files changed, 54 insertions(+), 21 deletions(-)

diffs (275 lines):

diff -r 66f46e3c0538 -r 6647fe084d2f sys/arch/hp700/gsc/harmony.c
--- a/sys/arch/hp700/gsc/harmony.c      Sun Nov 20 15:00:49 2011 +0000
+++ b/sys/arch/hp700/gsc/harmony.c      Sun Nov 20 15:23:46 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: harmony.c,v 1.23 2011/07/01 18:33:09 dyoung Exp $      */
+/*     $NetBSD: harmony.c,v 1.23.4.1 2011/11/20 15:23:46 jmcneill Exp $        */
 
 /*     $OpenBSD: harmony.c,v 1.23 2004/02/13 21:28:19 mickey Exp $     */
 
@@ -70,7 +70,7 @@
 #include <sys/ioctl.h>
 #include <sys/device.h>
 #include <sys/proc.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
 #include <uvm/uvm_extern.h>
 
 #if NRND > 0
@@ -108,14 +108,15 @@
 int    harmony_set_port(void *, mixer_ctrl_t *);
 int    harmony_get_port(void *, mixer_ctrl_t *);
 int    harmony_query_devinfo(void *, mixer_devinfo_t *);
-void * harmony_allocm(void *, int, size_t, struct malloc_type *, int);
-void   harmony_freem(void *, void *, struct malloc_type *);
+void * harmony_allocm(void *, int, size_t);
+void   harmony_freem(void *, void *, size_t);
 size_t harmony_round_buffersize(void *, int, size_t);
 int    harmony_get_props(void *);
 int    harmony_trigger_output(void *, void *, void *, int,
     void (*)(void *), void *, const audio_params_t *);
 int    harmony_trigger_input(void *, void *, void *, int,
     void (*)(void *), void *, const audio_params_t *);
+void   harmony_get_locks(void *, kmutex_t **, kmutex_t **);
 
 const struct audio_hw_if harmony_sa_hw_if = {
        harmony_open,
@@ -144,6 +145,9 @@
        harmony_get_props,
        harmony_trigger_output,
        harmony_trigger_input,
+       NULL,
+       NULL,
+       harmony_get_locks,
 };
 
 int harmony_match(device_t, struct cfdata *, void *);
@@ -209,6 +213,9 @@
        sc->sc_bt = ga->ga_iot;
        sc->sc_dmat = ga->ga_dmatag;
 
+       mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
+       mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_SCHED);
+
        if (bus_space_map(sc->sc_bt, ga->ga_hpa, HARMONY_NREGS, 0,
            &sc->sc_bh) != 0) {
                aprint_error(": couldn't map registers\n");
@@ -230,14 +237,14 @@
 
        if (bus_dmamem_alloc(sc->sc_dmat, sizeof(struct harmony_empty),
            PAGE_SIZE, 0, &sc->sc_empty_seg, 1, &sc->sc_empty_rseg,
-           BUS_DMA_NOWAIT) != 0) {
+           BUS_DMA_WAITOK) != 0) {
                aprint_error(": could not alloc DMA memory\n");
                bus_space_unmap(sc->sc_bt, sc->sc_bh, HARMONY_NREGS);
                return;
        }
        if (bus_dmamem_map(sc->sc_dmat, &sc->sc_empty_seg, 1,
            sizeof(struct harmony_empty), (void **)&sc->sc_empty_kva,
-           BUS_DMA_NOWAIT) != 0) {
+           BUS_DMA_WAITOK) != 0) {
                aprint_error(": couldn't map DMA memory\n");
                bus_dmamem_free(sc->sc_dmat, &sc->sc_empty_seg,
                    sc->sc_empty_rseg);
@@ -245,7 +252,7 @@
                return;
        }
        if (bus_dmamap_create(sc->sc_dmat, sizeof(struct harmony_empty), 1,
-           sizeof(struct harmony_empty), 0, BUS_DMA_NOWAIT,
+           sizeof(struct harmony_empty), 0, BUS_DMA_WAITOK,
            &sc->sc_empty_map) != 0) {
                aprint_error(": can't create DMA map\n");
                bus_dmamem_unmap(sc->sc_dmat, (void *)sc->sc_empty_kva,
@@ -256,7 +263,7 @@
                return;
        }
        if (bus_dmamap_load(sc->sc_dmat, sc->sc_empty_map, sc->sc_empty_kva,
-           sizeof(struct harmony_empty), NULL, BUS_DMA_NOWAIT) != 0) {
+           sizeof(struct harmony_empty), NULL, BUS_DMA_WAITOK) != 0) {
                aprint_error(": can't load DMA map\n");
                bus_dmamap_destroy(sc->sc_dmat, sc->sc_empty_map);
                bus_dmamem_unmap(sc->sc_dmat, (void *)sc->sc_empty_kva,
@@ -283,7 +290,7 @@
            offsetof(struct harmony_empty, playback[0][0]),
            PLAYBACK_EMPTYS * HARMONY_BUFSIZE, BUS_DMASYNC_PREWRITE);
 
-       (void) hp700_intr_establish(IPL_AUDIO, harmony_intr, sc, ga->ga_ir,
+       (void) hp700_intr_establish(IPL_SCHED, harmony_intr, sc, ga->ga_ir,
             ga->ga_irq);
 
        /* set defaults */
@@ -372,6 +379,8 @@
        ADD_CLKALLICA(sc);
 #endif
 
+       mutex_spin_enter(&sc->sc_intr_lock);
+
        harmony_intr_disable(sc);
 
        dstatus = READ_REG(sc, HARMONY_DSTATUS);
@@ -394,6 +403,8 @@
 
        harmony_intr_enable(sc);
 
+       mutex_spin_exit(&sc->sc_intr_lock);
+
        return r;
 }
 
@@ -1044,32 +1055,31 @@
 }
 
 void *
-harmony_allocm(void *vsc, int dir, size_t size, struct malloc_type *pool,
-    int flags)
+harmony_allocm(void *vsc, int dir, size_t size)
 {
        struct harmony_softc *sc;
        struct harmony_dma *d;
        int rseg;
 
        sc = vsc;
-       d = malloc(sizeof(struct harmony_dma), pool, flags);
+       d = kmem_alloc(sizeof(*d), KM_SLEEP);
        if (d == NULL)
                goto fail;
 
-       if (bus_dmamap_create(sc->sc_dmat, size, 1, size, 0, BUS_DMA_NOWAIT,
+       if (bus_dmamap_create(sc->sc_dmat, size, 1, size, 0, BUS_DMA_WAITOK,
            &d->d_map) != 0)
                goto fail1;
 
        if (bus_dmamem_alloc(sc->sc_dmat, size, PAGE_SIZE, 0, &d->d_seg, 1,
-           &rseg, BUS_DMA_NOWAIT) != 0)
+           &rseg, BUS_DMA_WAITOK) != 0)
                goto fail2;
 
        if (bus_dmamem_map(sc->sc_dmat, &d->d_seg, 1, size, &d->d_kva,
-           BUS_DMA_NOWAIT) != 0)
+           BUS_DMA_WAITOK) != 0)
                goto fail3;
 
        if (bus_dmamap_load(sc->sc_dmat, d->d_map, d->d_kva, size, NULL,
-           BUS_DMA_NOWAIT) != 0)
+           BUS_DMA_WAITOK) != 0)
                goto fail4;
 
        d->d_next = sc->sc_dmas;
@@ -1084,13 +1094,13 @@
 fail2:
        bus_dmamap_destroy(sc->sc_dmat, d->d_map);
 fail1:
-       free(d, pool);
+       kmem_free(d, sizeof(*d));
 fail:
        return (NULL);
 }
 
 void
-harmony_freem(void *vsc, void *ptr, struct malloc_type *pool)
+harmony_freem(void *vsc, void *ptr, size_t size)
 {
        struct harmony_softc *sc;
        struct harmony_dma *d, **dd;
@@ -1103,7 +1113,7 @@
                bus_dmamem_unmap(sc->sc_dmat, d->d_kva, d->d_size);
                bus_dmamem_free(sc->sc_dmat, &d->d_seg, 1);
                bus_dmamap_destroy(sc->sc_dmat, d->d_map);
-               free(d, pool);
+               kmem_free(d, sizeof(*d));
                return;
        }
        printf("%s: free rogue pointer\n", device_xname(sc->sc_dv));
@@ -1123,6 +1133,16 @@
        return AUDIO_PROP_FULLDUPLEX;
 }
 
+void
+harmony_get_locks(void *vsc, kmutex_t **intr, kmutex_t **thread)
+{
+       struct harmony_softc *sc;
+
+       sc = vsc;
+       *intr = &sc->sc_intr_lock;
+       *thread = &sc->sc_lock;
+}
+
 int
 harmony_trigger_output(void *vsc, void *start, void *end, int blksize,
     void (*intr)(void *), void *intrarg, const audio_params_t *param)
@@ -1141,6 +1161,8 @@
                return EINVAL;
        }
 
+       mutex_spin_enter(&sc->sc_intr_lock);
+
        c->c_intr = intr;
        c->c_intrarg = intrarg;
        c->c_blksz = blksize;
@@ -1155,6 +1177,8 @@
        harmony_start_cp(sc, 0);
        harmony_intr_enable(sc);
 
+       mutex_spin_exit(&sc->sc_intr_lock);
+
        return 0;
 }
 
@@ -1166,6 +1190,8 @@
        bus_addr_t nextaddr;
        bus_size_t togo;
 
+       KASSERT(mutex_owned(&sc->sc_intr_lock));
+
        c = &sc->sc_capture;
        if (sc->sc_capturing == 0)
                harmony_empty_input(sc);
@@ -1209,6 +1235,8 @@
        bus_addr_t nextaddr;
        bus_size_t togo;
 
+       KASSERT(mutex_owned(&sc->sc_intr_lock));
+
        c = &sc->sc_playback;
        if (sc->sc_playing == 0)
                harmony_empty_output(sc);
@@ -1258,6 +1286,8 @@
                return EINVAL;
        }
 
+       mutex_spin_enter(&sc->sc_intr_lock);
+
        c->c_intr = intr;
        c->c_intrarg = intrarg;
        c->c_blksz = blksize;
@@ -1268,10 +1298,11 @@
 
        sc->sc_capturing = 1;
 
-       harmony_start_pp(sc, 0);
        harmony_start_cp(sc, 1);
        harmony_intr_enable(sc);
 
+       mutex_spin_exit(&sc->sc_intr_lock);
+
        return 0;
 }
 
diff -r 66f46e3c0538 -r 6647fe084d2f sys/arch/hp700/gsc/harmonyvar.h
--- a/sys/arch/hp700/gsc/harmonyvar.h   Sun Nov 20 15:00:49 2011 +0000
+++ b/sys/arch/hp700/gsc/harmonyvar.h   Sun Nov 20 15:23:46 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: harmonyvar.h,v 1.4 2008/04/25 08:17:52 mjf Exp $       */
+/*     $NetBSD: harmonyvar.h,v 1.4.38.1 2011/11/20 15:23:46 jmcneill Exp $     */
 
 /*     $OpenBSD: harmonyvar.h,v 1.8 2003/08/15 13:25:53 mickey Exp $   */
 
@@ -80,6 +80,8 @@
 
 struct harmony_softc {
        device_t sc_dv;
+       kmutex_t sc_lock;
+       kmutex_t sc_intr_lock;
        struct audio_device sc_audev;
 
        bus_dma_tag_t sc_dmat;



Home | Main Index | Thread Index | Old Index