Module Name: src Committed By: isaki Date: Mon Apr 29 09:30:18 UTC 2019
Modified Files: src/sys/dev/pci [isaki-audio2]: sv.c Log Message: Adapt to audio2. - Drop INDEPENDENT property. Both play and rec seems to share the sample rate (however, they require different calculations?). - XXX It's better to modify frequency list more strictly. - Remove obsoleted and empty methods. To generate a diff of this commit: cvs rdiff -u -r1.54.2.1 -r1.54.2.2 src/sys/dev/pci/sv.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/sv.c diff -u src/sys/dev/pci/sv.c:1.54.2.1 src/sys/dev/pci/sv.c:1.54.2.2 --- src/sys/dev/pci/sv.c:1.54.2.1 Sun Apr 21 05:11:22 2019 +++ src/sys/dev/pci/sv.c Mon Apr 29 09:30:18 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sv.c,v 1.54.2.1 2019/04/21 05:11:22 isaki Exp $ */ +/* $NetBSD: sv.c,v 1.54.2.2 2019/04/29 09:30:18 isaki Exp $ */ /* $OpenBSD: sv.c,v 1.2 1998/07/13 01:50:15 csapuntz Exp $ */ /* @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sv.c,v 1.54.2.1 2019/04/21 05:11:22 isaki Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sv.c,v 1.54.2.2 2019/04/29 09:30:18 isaki Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -81,8 +81,6 @@ __KERNEL_RCSID(0, "$NetBSD: sv.c,v 1.54. #include <sys/audioio.h> #include <dev/audio_if.h> -#include <dev/mulaw.h> -#include <dev/auconv.h> #include <dev/ic/i8237reg.h> #include <dev/pci/svreg.h> @@ -141,10 +139,10 @@ static int sv_freemem(struct sv_softc *, static void sv_init_mixer(struct sv_softc *); static int sv_open(void *, int); -static int sv_query_encoding(void *, struct audio_encoding *); -static int sv_set_params(void *, int, int, audio_params_t *, - audio_params_t *, stream_filter_list_t *, - stream_filter_list_t *); +static int sv_query_format(void *, audio_format_query_t *); +static int sv_set_format(void *, int, + const audio_params_t *, const audio_params_t *, + audio_filter_reg_t *, audio_filter_reg_t *); static int sv_round_blocksize(void *, int, int, const audio_params_t *); static int sv_trigger_output(void *, void *, void *, int, void (*)(void *), void *, const audio_params_t *); @@ -158,8 +156,6 @@ static int sv_mixer_get_port(void *, mix static int sv_query_devinfo(void *, mixer_devinfo_t *); static void * sv_malloc(void *, int, size_t); static void sv_free(void *, void *, size_t); -static size_t sv_round_buffersize(void *, int, size_t); -static paddr_t sv_mappage(void *, void *, off_t, int); static int sv_get_props(void *); static void sv_get_locks(void *, kmutex_t **, kmutex_t **); @@ -169,8 +165,8 @@ void sv_dumpregs(struct sv_softc *sc) static const struct audio_hw_if sv_hw_if = { .open = sv_open, - .query_encoding = sv_query_encoding, - .set_params = sv_set_params, + .query_format = sv_query_format, + .set_format = sv_set_format, .round_blocksize = sv_round_blocksize, .halt_output = sv_halt_output, .halt_input = sv_halt_input, @@ -180,32 +176,25 @@ static const struct audio_hw_if sv_hw_if .query_devinfo = sv_query_devinfo, .allocm = sv_malloc, .freem = sv_free, - .round_buffersize = sv_round_buffersize, - .mappage = sv_mappage, .get_props = sv_get_props, .trigger_output = sv_trigger_output, .trigger_input = sv_trigger_input, .get_locks = sv_get_locks, }; -#define SV_NFORMATS 4 -#define SV_FORMAT(enc, prec, ch, chmask) \ - { \ - .mode = AUMODE_PLAY | AUMODE_RECORD, \ - .encoding = (enc), \ - .validbits = (prec), \ - .precision = (prec), \ - .channels = (ch), \ - .channel_mask = (chmask), \ - .frequency_type = 0, \ - .frequency = { 2000, 48000 }, \ - } -static const struct audio_format sv_formats[SV_NFORMATS] = { - SV_FORMAT(AUDIO_ENCODING_SLINEAR_LE, 16, 2, AUFMT_STEREO), - SV_FORMAT(AUDIO_ENCODING_SLINEAR_LE, 16, 1, AUFMT_MONAURAL), - SV_FORMAT(AUDIO_ENCODING_ULINEAR_LE, 8, 2, AUFMT_STEREO), - SV_FORMAT(AUDIO_ENCODING_ULINEAR_LE, 8, 1, AUFMT_MONAURAL), +static const struct audio_format sv_formats[] = { + { + .mode = AUMODE_PLAY | AUMODE_RECORD, + .encoding = AUDIO_ENCODING_SLINEAR_LE, + .validbits = 16, + .precision = 16, + .channels = 2, + .channel_mask = AUFMT_STEREO, + .frequency_type = 0, + .frequency = { 2000, 48000 }, + }, }; +#define SV_NFORMATS __arraycount(sv_formats) static void @@ -582,105 +571,25 @@ sv_open(void *addr, int flags) } static int -sv_query_encoding(void *addr, struct audio_encoding *fp) +sv_query_format(void *addr, audio_format_query_t *afp) { - switch (fp->index) { - case 0: - strcpy(fp->name, AudioEulinear); - fp->encoding = AUDIO_ENCODING_ULINEAR; - fp->precision = 8; - fp->flags = 0; - return 0; - case 1: - strcpy(fp->name, AudioEmulaw); - fp->encoding = AUDIO_ENCODING_ULAW; - fp->precision = 8; - fp->flags = AUDIO_ENCODINGFLAG_EMULATED; - return 0; - case 2: - strcpy(fp->name, AudioEalaw); - fp->encoding = AUDIO_ENCODING_ALAW; - fp->precision = 8; - fp->flags = AUDIO_ENCODINGFLAG_EMULATED; - return 0; - case 3: - strcpy(fp->name, AudioEslinear); - fp->encoding = AUDIO_ENCODING_SLINEAR; - fp->precision = 8; - fp->flags = AUDIO_ENCODINGFLAG_EMULATED; - return 0; - case 4: - strcpy(fp->name, AudioEslinear_le); - fp->encoding = AUDIO_ENCODING_SLINEAR_LE; - fp->precision = 16; - fp->flags = 0; - return 0; - case 5: - strcpy(fp->name, AudioEulinear_le); - fp->encoding = AUDIO_ENCODING_ULINEAR_LE; - fp->precision = 16; - fp->flags = AUDIO_ENCODINGFLAG_EMULATED; - return 0; - case 6: - strcpy(fp->name, AudioEslinear_be); - fp->encoding = AUDIO_ENCODING_SLINEAR_BE; - fp->precision = 16; - fp->flags = AUDIO_ENCODINGFLAG_EMULATED; - return 0; - case 7: - strcpy(fp->name, AudioEulinear_be); - fp->encoding = AUDIO_ENCODING_ULINEAR_BE; - fp->precision = 16; - fp->flags = AUDIO_ENCODINGFLAG_EMULATED; - return 0; - default: - return EINVAL; - } + return audio_query_format(sv_formats, SV_NFORMATS, afp); } static int -sv_set_params(void *addr, int setmode, int usemode, audio_params_t *play, - audio_params_t *rec, stream_filter_list_t *pfil, stream_filter_list_t *rfil) +sv_set_format(void *addr, int setmode, + const audio_params_t *play, const audio_params_t *rec, + audio_filter_reg_t *pfil, audio_filter_reg_t *rfil) { struct sv_softc *sc; - audio_params_t *p; uint32_t val; sc = addr; - p = NULL; - /* - * This device only has one clock, so make the sample rates match. - */ - if (play->sample_rate != rec->sample_rate && - usemode == (AUMODE_PLAY | AUMODE_RECORD)) { - if (setmode == AUMODE_PLAY) { - rec->sample_rate = play->sample_rate; - setmode |= AUMODE_RECORD; - } else if (setmode == AUMODE_RECORD) { - play->sample_rate = rec->sample_rate; - setmode |= AUMODE_PLAY; - } else - return EINVAL; - } - if (setmode & AUMODE_RECORD) { - p = rec; - if (auconv_set_converter(sv_formats, SV_NFORMATS, - AUMODE_RECORD, rec, FALSE, rfil) < 0) - return EINVAL; - } - if (setmode & AUMODE_PLAY) { - p = play; - if (auconv_set_converter(sv_formats, SV_NFORMATS, - AUMODE_PLAY, play, FALSE, pfil) < 0) - return EINVAL; - } - - if (p == NULL) - return 0; + /* *play and *rec are the identical because !AUDIO_PROP_INDEPENDENT. */ - val = p->sample_rate * 65536 / 48000; + val = play->sample_rate * 65536 / 48000; /* * If the sample rate is exactly 48 kHz, the fraction would overflow the * register, so we have to bias it. This causes a little clock drift. @@ -1440,34 +1349,10 @@ sv_free(void *addr, void *ptr, size_t si } } -static size_t -sv_round_buffersize(void *addr, int direction, size_t size) -{ - - return size; -} - -static paddr_t -sv_mappage(void *addr, void *mem, off_t off, int prot) -{ - struct sv_softc *sc; - struct sv_dma *p; - - sc = addr; - if (off < 0) - return -1; - for (p = sc->sc_dmas; p && KERNADDR(p) != mem; p = p->next) - continue; - if (p == NULL) - return -1; - return bus_dmamem_mmap(sc->sc_dmatag, p->segs, p->nsegs, - off, prot, BUS_DMA_WAITOK); -} - static int sv_get_props(void *addr) { - return AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT | AUDIO_PROP_FULLDUPLEX; + return AUDIO_PROP_MMAP | AUDIO_PROP_FULLDUPLEX; } static void