Module Name:    src
Committed By:   isaki
Date:           Tue Apr 30 06:05:02 UTC 2019

Modified Files:
        src/sys/dev/pci [isaki-audio2]: eap.c

Log Message:
More adapt to audio2.
- Use set_format.
- Remove an empty method.
- XXX DAC1 and secondary audio device support should be removed.
  Now mixing two (or more) sources is done by audio layer.


To generate a diff of this commit:
cvs rdiff -u -r1.99.2.2 -r1.99.2.3 src/sys/dev/pci/eap.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/eap.c
diff -u src/sys/dev/pci/eap.c:1.99.2.2 src/sys/dev/pci/eap.c:1.99.2.3
--- src/sys/dev/pci/eap.c:1.99.2.2	Sun Apr 21 07:55:25 2019
+++ src/sys/dev/pci/eap.c	Tue Apr 30 06:05:02 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: eap.c,v 1.99.2.2 2019/04/21 07:55:25 isaki Exp $	*/
+/*	$NetBSD: eap.c,v 1.99.2.3 2019/04/30 06:05:02 isaki Exp $	*/
 /*      $OpenBSD: eap.c,v 1.6 1999/10/05 19:24:42 csapuntz Exp $ */
 
 /*
@@ -50,8 +50,13 @@
  * ftp://download.intel.com/ial/scalableplatforms/audio/ac97r21.pdf
  */
 
+/*
+ * TODO:
+ * - Remove DAC1 and secondary audio device support.
+ */
+
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: eap.c,v 1.99.2.2 2019/04/21 07:55:25 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: eap.c,v 1.99.2.3 2019/04/30 06:05:02 isaki Exp $");
 
 #include "midi.h"
 #include "joy_eap.h"
@@ -69,7 +74,6 @@ __KERNEL_RCSID(0, "$NetBSD: eap.c,v 1.99
 #include <sys/audioio.h>
 
 #include <dev/audio_if.h>
-#include <dev/auconv.h>
 #include <dev/midi_if.h>
 
 #include <dev/pci/pcidevs.h>
@@ -109,9 +113,9 @@ CFATTACH_DECL_NEW(eap, sizeof(struct eap
 
 static int	eap_open(void *, int);
 static int	eap_query_format(void *, struct audio_format_query *);
-static int	eap_set_params(void *, int, int, audio_params_t *,
-			       audio_params_t *, stream_filter_list_t *,
-			       stream_filter_list_t *);
+static int	eap_set_format(void *, int,
+			       const audio_params_t *, const audio_params_t *,
+			       audio_filter_reg_t *, audio_filter_reg_t *);
 static int	eap_trigger_output(void *, void *, void *, int,
 				   void (*)(void *), void *,
 				   const audio_params_t *);
@@ -129,7 +133,6 @@ static int	eap1371_mixer_get_port(void *
 static int	eap1370_query_devinfo(void *, mixer_devinfo_t *);
 static void	*eap_malloc(void *, int, size_t);
 static void	eap_free(void *, void *, size_t);
-static size_t	eap_round_buffersize(void *, int, size_t);
 static int	eap_get_props(void *);
 static void	eap1370_set_mixer(struct eap_softc *, int, int);
 static uint32_t eap1371_src_wait(struct eap_softc *);
@@ -157,7 +160,7 @@ static void	eap_uart_txrdy(struct eap_so
 static const struct audio_hw_if eap1370_hw_if = {
 	.open			= eap_open,
 	.query_format		= eap_query_format,
-	.set_params		= eap_set_params,
+	.set_format		= eap_set_format,
 	.halt_output		= eap_halt_output,
 	.halt_input		= eap_halt_input,
 	.getdev			= eap_getdev,
@@ -166,7 +169,6 @@ static const struct audio_hw_if eap1370_
 	.query_devinfo		= eap1370_query_devinfo,
 	.allocm			= eap_malloc,
 	.freem			= eap_free,
-	.round_buffersize	= eap_round_buffersize,
 	.get_props		= eap_get_props,
 	.trigger_output		= eap_trigger_output,
 	.trigger_input		= eap_trigger_input,
@@ -176,7 +178,7 @@ static const struct audio_hw_if eap1370_
 static const struct audio_hw_if eap1371_hw_if = {
 	.open			= eap_open,
 	.query_format		= eap_query_format,
-	.set_params		= eap_set_params,
+	.set_format		= eap_set_format,
 	.halt_output		= eap_halt_output,
 	.halt_input		= eap_halt_input,
 	.getdev			= eap_getdev,
@@ -185,7 +187,6 @@ static const struct audio_hw_if eap1371_
 	.query_devinfo		= eap1371_query_devinfo,
 	.allocm			= eap_malloc,
 	.freem			= eap_free,
-	.round_buffersize	= eap_round_buffersize,
 	.get_props		= eap_get_props,
 	.trigger_output		= eap_trigger_output,
 	.trigger_input		= eap_trigger_input,
@@ -209,24 +210,19 @@ static struct audio_device eap_device = 
 	"eap"
 };
 
-#define EAP_NFORMATS	4
-#define EAP_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	= { 4000, 48000 }, \
-	}
-static const struct audio_format eap_formats[EAP_NFORMATS] = {
-	EAP_FORMAT(AUDIO_ENCODING_SLINEAR_LE, 16, 2, AUFMT_STEREO),
-	EAP_FORMAT(AUDIO_ENCODING_SLINEAR_LE, 16, 1, AUFMT_MONAURAL),
-	EAP_FORMAT(AUDIO_ENCODING_ULINEAR_LE,  8, 2, AUFMT_STEREO),
-	EAP_FORMAT(AUDIO_ENCODING_ULINEAR_LE,  8, 1, AUFMT_MONAURAL),
+static const struct audio_format eap_formats[] = {
+	{
+		.mode		= AUMODE_PLAY | AUMODE_RECORD,
+		.encoding	= AUDIO_ENCODING_SLINEAR_LE,
+		.validbits	= 16,
+		.precision	= 16,
+		.channels	= 2,
+		.channel_mask	= AUFMT_STEREO,
+		.frequency_type	= 2,
+		.frequency	= { 4000, 48000 },
+	},
 };
+#define EAP_NFORMATS	__arraycount(eap_formats)
 
 static int
 eap_match(device_t parent, cfdata_t match, void *aux)
@@ -944,54 +940,37 @@ eap_query_format(void *addr, struct audi
 }
 
 static int
-eap_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)
+eap_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 eap_instance *ei;
 	struct eap_softc *sc;
-	struct audio_params *p;
-	stream_filter_list_t *fil;
-	int mode, i;
 	uint32_t div;
 
 	ei = addr;
 	sc = device_private(ei->parent);
 
-	for (mode = AUMODE_RECORD; mode != -1;
-	     mode = mode == AUMODE_RECORD ? AUMODE_PLAY : -1) {
-		if ((setmode & mode) == 0)
-			continue;
-
-		p = mode == AUMODE_PLAY ? play : rec;
-
-		fil = mode == AUMODE_PLAY ? pfil : rfil;
-		i = auconv_set_converter(eap_formats, EAP_NFORMATS,
-					 mode, p, FALSE, fil);
-		if (i < 0)
-			return EINVAL;
-	}
-
 	if (sc->sc_1371) {
 		eap1371_set_dac_rate(ei, play->sample_rate);
 		eap1371_set_adc_rate(sc, rec->sample_rate);
 	} else if (ei->index == EAP_DAC2) {
 		/* Set the speed */
-		DPRINTFN(2, ("eap_set_params: old ICSC = 0x%08x\n",
+		DPRINTFN(2, ("%s: old ICSC = 0x%08x\n", __func__,
 			     EREAD4(sc, EAP_ICSC)));
 		div = EREAD4(sc, EAP_ICSC) & ~EAP_PCLKBITS;
 		/*
+		 * *play and *rec are the identical on es1370 because
+		 * !AUDIO_PROP_INDEPENDENT.
+		 */
+
+		/*
 		 * XXX
 		 * The -2 isn't documented, but seemed to make the wall
 		 * time match
 		 * what I expect.  - mycroft
 		 */
-		if (usemode == AUMODE_RECORD)
-			div |= EAP_SET_PCLKDIV(EAP_XTAL_FREQ /
-				rec->sample_rate - 2);
-		else
-			div |= EAP_SET_PCLKDIV(EAP_XTAL_FREQ /
-				play->sample_rate - 2);
+		div |= EAP_SET_PCLKDIV(EAP_XTAL_FREQ / play->sample_rate - 2);
 #if 0
 		div |= EAP_CCB_INTRM;
 #else
@@ -1001,27 +980,27 @@ eap_set_params(void *addr, int setmode, 
 		 */
 #endif
 		EWRITE4(sc, EAP_ICSC, div);
-		DPRINTFN(2, ("eap_set_params: set ICSC = 0x%08x\n", div));
+		DPRINTFN(2, ("%s: set ICSC = 0x%08x\n", __func__, div));
 	} else {
 		/*
 		 * The FM DAC has only a few fixed-frequency choises, so
 		 * pick out the best candidate.
 		 */
 		div = EREAD4(sc, EAP_ICSC);
-		DPRINTFN(2, ("eap_set_params: old ICSC = 0x%08x\n", div));
+		DPRINTFN(2, ("%s: old ICSC = 0x%08x\n", __func__, div));
 
 		div &= ~EAP_WTSRSEL;
-		if (play->sample_rate < 8268)
+		if (play->sample_rate == 5512)
 			div |= EAP_WTSRSEL_5;
-		else if (play->sample_rate < 16537)
+		else if (play->sample_rate == 11025)
 			div |= EAP_WTSRSEL_11;
-		else if (play->sample_rate < 33075)
+		else if (play->sample_rate == 22050)
 			div |= EAP_WTSRSEL_22;
 		else
 			div |= EAP_WTSRSEL_44;
 
 		EWRITE4(sc, EAP_ICSC, div);
-		DPRINTFN(2, ("eap_set_params: set ICSC = 0x%08x\n", div));
+		DPRINTFN(2, ("%s: set ICSC = 0x%08x\n", __func__, div));
 	}
 
 	return 0;
@@ -1659,13 +1638,6 @@ eap_free(void *addr, void *ptr, size_t s
 	}
 }
 
-static size_t
-eap_round_buffersize(void *addr, int direction, size_t size)
-{
-
-	return size;
-}
-
 static int
 eap_get_props(void *addr)
 {
@@ -1675,8 +1647,8 @@ eap_get_props(void *addr)
 
 	ei = addr;
 	sc = device_private(ei->parent);
-	prop = AUDIO_PROP_MMAP | AUDIO_PROP_FULLDUPLEX |
-	    AUDIO_PROP_INDEPENDENT;
+	prop = AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT |
+	    AUDIO_PROP_FULLDUPLEX;
 	/* The es1370 only has one clock, so it's not independent */
 	if (!sc->sc_1371 && ei->index == EAP_DAC2)
 		prop &= ~AUDIO_PROP_INDEPENDENT;

Reply via email to