Module Name: src Committed By: isaki Date: Sun Apr 21 12:54:25 UTC 2019
Modified Files: src/sys/arch/sgimips/hpc [isaki-audio2]: haltwo.c Log Message: Adapt to audio2. - The driver doesn't seem to support recording. To generate a diff of this commit: cvs rdiff -u -r1.24 -r1.24.2.1 src/sys/arch/sgimips/hpc/haltwo.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/arch/sgimips/hpc/haltwo.c diff -u src/sys/arch/sgimips/hpc/haltwo.c:1.24 src/sys/arch/sgimips/hpc/haltwo.c:1.24.2.1 --- src/sys/arch/sgimips/hpc/haltwo.c:1.24 Sat Mar 16 12:09:57 2019 +++ src/sys/arch/sgimips/hpc/haltwo.c Sun Apr 21 12:54:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: haltwo.c,v 1.24 2019/03/16 12:09:57 isaki Exp $ */ +/* $NetBSD: haltwo.c,v 1.24.2.1 2019/04/21 12:54:25 isaki Exp $ */ /* * Copyright (c) 2003 Ilpo Ruotsalainen @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: haltwo.c,v 1.24 2019/03/16 12:09:57 isaki Exp $"); +__KERNEL_RCSID(0, "$NetBSD: haltwo.c,v 1.24.2.1 2019/04/21 12:54:25 isaki Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -38,10 +38,6 @@ __KERNEL_RCSID(0, "$NetBSD: haltwo.c,v 1 #include <sys/audioio.h> #include <sys/kmem.h> #include <dev/audio_if.h> -#include <dev/auconv.h> -#include <dev/mulaw.h> - -#include <uvm/uvm_extern.h> #include <sys/bus.h> #include <machine/sysconf.h> @@ -58,9 +54,10 @@ __KERNEL_RCSID(0, "$NetBSD: haltwo.c,v 1 #define DPRINTF(x) #endif -static int haltwo_query_encoding(void *, struct audio_encoding *); -static int haltwo_set_params(void *, int, int, audio_params_t *, - audio_params_t *, stream_filter_list_t *, stream_filter_list_t *); +static int haltwo_query_format(void *, audio_format_query_t *); +static int haltwo_set_format(void *, int, + const audio_params_t *, const audio_params_t *, + audio_filter_reg_t *, audio_filter_reg_t *); static int haltwo_round_blocksize(void *, int, int, const audio_params_t *); static int haltwo_halt_output(void *); static int haltwo_halt_input(void *); @@ -79,8 +76,8 @@ static void haltwo_get_locks(void *, kmu static bool haltwo_shutdown(device_t, int); static const struct audio_hw_if haltwo_hw_if = { - .query_encoding = haltwo_query_encoding, - .set_params = haltwo_set_params, + .query_format = haltwo_query_format, + .set_format = haltwo_set_format, .round_blocksize = haltwo_round_blocksize, .halt_output = haltwo_halt_output, .halt_input = haltwo_halt_input, @@ -102,6 +99,18 @@ static const struct audio_device haltwo_ "haltwo" }; +static const struct audio_format haltwo_formats = { + .mode = AUMODE_PLAY, + .encoding = AUDIO_ENCODING_SLINEAR_NE, + .validbits = 16, + .precision = 16, + .channels = 2, + .channel_mask = AUFMT_STEREO, + .frequency_type = 2, + .frequency = { 44100, 48000 }, +}; +#define HALTWO_NFORMATS __arraycount(haltwo_formats) + static int haltwo_match(device_t, cfdata_t, void *); static void haltwo_attach(device_t, device_t, void *); static int haltwo_intr(void *); @@ -381,96 +390,29 @@ haltwo_intr(void *v) } static int -haltwo_query_encoding(void *v, struct audio_encoding *e) +haltwo_query_format(void *v, audio_format_query_t *afp) { - switch (e->index) { - case 0: - strcpy(e->name, AudioEslinear_le); - e->encoding = AUDIO_ENCODING_SLINEAR_LE; - e->precision = 16; - e->flags = 0; - break; - - case 1: - strcpy(e->name, AudioEslinear_be); - e->encoding = AUDIO_ENCODING_SLINEAR_BE; - e->precision = 16; - e->flags = 0; - break; - - case 2: - strcpy(e->name, AudioEmulaw); - e->encoding = AUDIO_ENCODING_ULAW; - e->precision = 8; - e->flags = AUDIO_ENCODINGFLAG_EMULATED; - break; - - default: - return EINVAL; - } - - return 0; + return audio_query_format(&haltwo_formats, 1, afp); } static int -haltwo_set_params(void *v, int setmode, int usemode, - audio_params_t *play, audio_params_t *rec, - stream_filter_list_t *pfil, stream_filter_list_t *rfil) +haltwo_set_format(void *v, int setmode, + const audio_params_t *play, const audio_params_t *rec, + audio_filter_reg_t *pfil, audio_filter_reg_t *rfil) { - audio_params_t hw; struct haltwo_softc *sc; - int master, inc, mod; + int inc; uint16_t tmp; sc = v; - if (play->sample_rate < 4000) - play->sample_rate = 4000; - if (play->sample_rate > 48000) - play->sample_rate = 48000; - - if (44100 % play->sample_rate < 48000 % play->sample_rate) - master = 44100; - else - master = 48000; - - /* HAL2 specification 3.1.2.21: Codecs should be driven with INC/MOD - * fractions equivalent to 4/N, where N is a positive integer. */ inc = 4; - mod = master * inc / play->sample_rate; - - /* Fixup upper layers idea of HW sample rate to the actual final rate */ - play->sample_rate = master * inc / mod; - - DPRINTF(("haltwo_set_params: master = %d inc = %d mod = %d" - " sample_rate = %ld\n", master, inc, mod, - play->sample_rate)); - - hw = *play; - switch (play->encoding) { - case AUDIO_ENCODING_ULAW: - if (play->precision != 8) - return EINVAL; - - hw.encoding = AUDIO_ENCODING_SLINEAR_LE; - pfil->append(pfil, mulaw_to_linear16, &hw); - play = &hw; - break; - case AUDIO_ENCODING_SLINEAR_BE: - case AUDIO_ENCODING_SLINEAR_LE: - break; - - default: - return EINVAL; - } - /* play points HW encoding */ /* Setup samplerate to HW */ haltwo_write_indirect(sc, HAL2_IREG_BRES1_C1, - master == 44100 ? 1 : 0, 0); + play->sample_rate == 44100 ? 1 : 0, 0); /* XXX Documentation disagrees but this seems to work XXX */ - haltwo_write_indirect(sc, HAL2_IREG_BRES1_C2, - inc, 0xFFFF & (inc - mod - 1)); + haltwo_write_indirect(sc, HAL2_IREG_BRES1_C2, inc, 0xFFFF); /* Setup endianness to HW */ haltwo_read_indirect(sc, HAL2_IREG_DMA_END, &tmp, NULL); @@ -710,7 +652,7 @@ static int haltwo_get_props(void *v) { - return 0; + return AUDIO_PROP_PLAYBACK; } static int