Module Name:    src
Committed By:   isaki
Date:           Thu Apr 25 14:00:20 UTC 2019

Modified Files:
        src/sys/dev/isa [isaki-audio2]: ess.c

Log Message:
Adapt to audio2.
- Drop INDEPENDENT property.  Both play and rec share the sample rate.


To generate a diff of this commit:
cvs rdiff -u -r1.84.2.1 -r1.84.2.2 src/sys/dev/isa/ess.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/isa/ess.c
diff -u src/sys/dev/isa/ess.c:1.84.2.1 src/sys/dev/isa/ess.c:1.84.2.2
--- src/sys/dev/isa/ess.c:1.84.2.1	Sun Apr 21 05:11:22 2019
+++ src/sys/dev/isa/ess.c	Thu Apr 25 14:00:20 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: ess.c,v 1.84.2.1 2019/04/21 05:11:22 isaki Exp $	*/
+/*	$NetBSD: ess.c,v 1.84.2.2 2019/04/25 14:00:20 isaki Exp $	*/
 
 /*
  * Copyright 1997
@@ -66,7 +66,7 @@
 */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ess.c,v 1.84.2.1 2019/04/21 05:11:22 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ess.c,v 1.84.2.2 2019/04/25 14:00:20 isaki Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -83,8 +83,6 @@ __KERNEL_RCSID(0, "$NetBSD: ess.c,v 1.84
 #include <sys/malloc.h>
 
 #include <dev/audio_if.h>
-#include <dev/auconv.h>
-#include <dev/mulaw.h>
 
 #include <dev/isa/isavar.h>
 #include <dev/isa/isadmavar.h>
@@ -115,15 +113,14 @@ unsigned uuu;
 
 int	ess_setup_sc(struct ess_softc *, int);
 
-int	ess_open(void *, int);
 void	ess_close(void *);
 int	ess_getdev(void *, struct audio_device *);
-int	ess_drain(void *);
 
-int	ess_query_encoding(void *, struct audio_encoding *);
+int	ess_query_format(void *, audio_format_query_t *);
 
-int	ess_set_params(void *, int, int, audio_params_t *,
-	    audio_params_t *, stream_filter_list_t *, stream_filter_list_t *);
+int	ess_set_format(void *, int,
+	    const audio_params_t *, const audio_params_t *,
+	    audio_filter_reg_t *, audio_filter_reg_t *);
 
 int	ess_round_blocksize(void *, int, int, const audio_params_t *);
 
@@ -215,11 +212,9 @@ struct audio_device ess_device = {
  */
 
 const struct audio_hw_if ess_1788_hw_if = {
-	.open			= ess_open,
 	.close			= ess_close,
-	.drain			= ess_drain,
-	.query_encoding		= ess_query_encoding,
-	.set_params		= ess_set_params,
+	.query_format		= ess_query_format,
+	.set_format		= ess_set_format,
 	.round_blocksize	= ess_round_blocksize,
 	.halt_output		= ess_audio1_halt,
 	.halt_input		= ess_audio1_halt,
@@ -231,7 +226,6 @@ const struct audio_hw_if ess_1788_hw_if 
 	.allocm			= ess_malloc,
 	.freem			= ess_free,
 	.round_buffersize	= ess_round_buffersize,
-	.mappage		= ess_mappage,
 	.get_props		= ess_1788_get_props,
 	.trigger_output		= ess_audio1_trigger_output,
 	.trigger_input		= ess_audio1_trigger_input,
@@ -239,11 +233,9 @@ const struct audio_hw_if ess_1788_hw_if 
 };
 
 const struct audio_hw_if ess_1888_hw_if = {
-	.open			= ess_open,
 	.close			= ess_close,
-	.drain			= ess_drain,
-	.query_encoding		= ess_query_encoding,
-	.set_params		= ess_set_params,
+	.query_format		= ess_query_format,
+	.set_format		= ess_set_format,
 	.round_blocksize	= ess_round_blocksize,
 	.halt_output		= ess_audio2_halt,
 	.halt_input		= ess_audio1_halt,
@@ -255,35 +247,25 @@ const struct audio_hw_if ess_1888_hw_if 
 	.allocm			= ess_malloc,
 	.freem			= ess_free,
 	.round_buffersize	= ess_round_buffersize,
-	.mappage		= ess_mappage,
 	.get_props		= ess_1888_get_props,
 	.trigger_output		= ess_audio2_trigger_output,
 	.trigger_input		= ess_audio1_trigger_input,
 	.get_locks		= ess_get_locks,
 };
 
-#define ESS_NFORMATS	8
-#define ESS_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	= { ESS_MINRATE, ESS_MAXRATE }, \
-	}
-static const struct audio_format ess_formats[ESS_NFORMATS] = {
-	ESS_FORMAT(AUDIO_ENCODING_SLINEAR_LE, 16, 2, AUFMT_STEREO),
-	ESS_FORMAT(AUDIO_ENCODING_SLINEAR_LE, 16, 1, AUFMT_STEREO),
-	ESS_FORMAT(AUDIO_ENCODING_ULINEAR_LE, 16, 2, AUFMT_STEREO),
-	ESS_FORMAT(AUDIO_ENCODING_ULINEAR_LE, 16, 1, AUFMT_STEREO),
-	ESS_FORMAT(AUDIO_ENCODING_ULINEAR_LE,  8, 2, AUFMT_STEREO),
-	ESS_FORMAT(AUDIO_ENCODING_ULINEAR_LE,  8, 1, AUFMT_STEREO),
-	ESS_FORMAT(AUDIO_ENCODING_SLINEAR_LE,  8, 2, AUFMT_STEREO),
-	ESS_FORMAT(AUDIO_ENCODING_SLINEAR_LE,  8, 1, AUFMT_STEREO),
+static const struct audio_format ess_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	= { ESS_MINRATE, ESS_MAXRATE },
+	},
 };
+#define ESS_NFORMATS __arraycount(ess_formats)
 
 #ifdef AUDIO_DEBUG
 void ess_printsc(struct ess_softc *);
@@ -1097,13 +1079,6 @@ skip:
  * Various routines to interface to higher level audio driver
  */
 
-int
-ess_open(void *addr, int flags)
-{
-
-	return 0;
-}
-
 void
 ess_close(void *addr)
 {
@@ -1118,27 +1093,6 @@ ess_close(void *addr)
 	DPRINTF(("ess_close: closed\n"));
 }
 
-/*
- * Wait for FIFO to drain, and analog section to settle.
- * XXX should check FIFO empty bit.
- */
-int
-ess_drain(void *addr)
-{
-	struct ess_softc *sc;
-
-	sc = addr;
-	mutex_exit(&sc->sc_lock);
-	kpause("essdr", FALSE, hz/20, &sc->sc_intr_lock); /* XXX */
-	if (!mutex_tryenter(&sc->sc_lock)) {
-		mutex_spin_exit(&sc->sc_intr_lock);
-		mutex_enter(&sc->sc_lock);
-		mutex_spin_enter(&sc->sc_intr_lock);
-	}
-
-	return 0;
-}
-
 /* XXX should use reference count */
 int
 ess_speaker_ctl(void *addr, int newstate)
@@ -1166,112 +1120,26 @@ ess_getdev(void *addr, struct audio_devi
 }
 
 int
-ess_query_encoding(void *addr, struct audio_encoding *fp)
+ess_query_format(void *addr, audio_format_query_t *afp)
 {
-	/*struct ess_softc *sc = addr;*/
 
-	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 = 0;
-		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 = 0;
-		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 0;
+	return audio_query_format(ess_formats, ESS_NFORMATS, afp);
 }
 
 int
-ess_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)
+ess_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 ess_softc *sc;
 	int rate;
 
-	DPRINTF(("ess_set_params: set=%d use=%d\n", setmode, usemode));
+	DPRINTF(("%s: set=%d\n", __func__, setmode));
 	sc = addr;
-	/*
-	 * The ES1887 manual (page 39, `Full-Duplex DMA Mode') claims that in
-	 * full-duplex operation the sample rates must be the same for both
-	 * channels.  This appears to be false; the only bit in common is the
-	 * clock source selection.  However, we'll be conservative here.
-	 * - mycroft
-	 */
-	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) {
-		if (auconv_set_converter(ess_formats, ESS_NFORMATS,
-					 AUMODE_RECORD, rec, FALSE, rfil) < 0)
-			return EINVAL;
-	}
-	if (setmode & AUMODE_PLAY) {
-		if (auconv_set_converter(ess_formats, ESS_NFORMATS,
-					 AUMODE_PLAY, play, FALSE, pfil) < 0)
-			return EINVAL;
-	}
-
-	if (usemode == AUMODE_RECORD)
-		rate = rec->sample_rate;
-	else
-		rate = play->sample_rate;
+	/* *play and *rec are the identical because !AUDIO_PROP_INDEPENDENT. */
 
+	rate = play->sample_rate;
 	ess_write_x_reg(sc, ESS_XCMD_SAMPLE_RATE, ess_srtotc(sc, rate));
 	ess_write_x_reg(sc, ESS_XCMD_FILTER_CLOCK, ess_srtofc(rate));
 
@@ -2306,25 +2174,18 @@ ess_round_buffersize(void *addr, int dir
 	return size;
 }
 
-paddr_t
-ess_mappage(void *addr, void *mem, off_t off, int prot)
-{
-
-	return isa_mappage(mem, off, prot);
-}
-
 int
 ess_1788_get_props(void *addr)
 {
 
-	return AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT;
+	return AUDIO_PROP_MMAP;
 }
 
 int
 ess_1888_get_props(void *addr)
 {
 
-	return AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT | AUDIO_PROP_FULLDUPLEX;
+	return AUDIO_PROP_MMAP | AUDIO_PROP_FULLDUPLEX;
 }
 
 void

Reply via email to