xref: /netbsd-src/sys/dev/ic/ad1848.c (revision 100a3398b8d3c64e571cff36b46c23431b410e09)
1 /*	$NetBSD: ad1848.c,v 1.34 2024/02/09 22:08:34 andvar Exp $	*/
2 
3 /*-
4  * Copyright (c) 1999, 2008 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Ken Hornstein and John Kohl.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 /*
32  * Copyright (c) 1994 John Brezak
33  * Copyright (c) 1991-1993 Regents of the University of California.
34  * All rights reserved.
35  *
36  * Redistribution and use in source and binary forms, with or without
37  * modification, are permitted provided that the following conditions
38  * are met:
39  * 1. Redistributions of source code must retain the above copyright
40  *    notice, this list of conditions and the following disclaimer.
41  * 2. Redistributions in binary form must reproduce the above copyright
42  *    notice, this list of conditions and the following disclaimer in the
43  *    documentation and/or other materials provided with the distribution.
44  * 3. All advertising materials mentioning features or use of this software
45  *    must display the following acknowledgement:
46  *	This product includes software developed by the Computer Systems
47  *	Engineering Group at Lawrence Berkeley Laboratory.
48  * 4. Neither the name of the University nor of the Laboratory may be used
49  *    to endorse or promote products derived from this software without
50  *    specific prior written permission.
51  *
52  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62  * SUCH DAMAGE.
63  *
64  */
65 
66 /*
67  * Copyright by Hannu Savolainen 1994
68  *
69  * Redistribution and use in source and binary forms, with or without
70  * modification, are permitted provided that the following conditions are
71  * met: 1. Redistributions of source code must retain the above copyright
72  * notice, this list of conditions and the following disclaimer. 2.
73  * Redistributions in binary form must reproduce the above copyright notice,
74  * this list of conditions and the following disclaimer in the documentation
75  * and/or other materials provided with the distribution.
76  *
77  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
78  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
79  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
80  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
81  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
82  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
83  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
84  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
85  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
86  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
87  * SUCH DAMAGE.
88  *
89  */
90 /*
91  * Portions of this code are from the VOXware support for the ad1848
92  * by Hannu Savolainen <hannu@voxware.pp.fi>
93  *
94  * Portions also ripped from the SoundBlaster driver for NetBSD.
95  */
96 
97 #include <sys/cdefs.h>
98 __KERNEL_RCSID(0, "$NetBSD: ad1848.c,v 1.34 2024/02/09 22:08:34 andvar Exp $");
99 
100 #include <sys/param.h>
101 #include <sys/systm.h>
102 #include <sys/errno.h>
103 #include <sys/ioctl.h>
104 #include <sys/device.h>
105 #include <sys/fcntl.h>
106 /*#include <sys/syslog.h>*/
107 /*#include <sys/proc.h>*/
108 
109 #include <sys/cpu.h>
110 #include <sys/bus.h>
111 
112 #include <sys/audioio.h>
113 #include <dev/audio/audio_if.h>
114 
115 #include <dev/ic/ad1848reg.h>
116 #include <dev/ic/cs4231reg.h>
117 #include <dev/ic/cs4237reg.h>
118 #include <dev/ic/ad1848var.h>
119 #if 0
120 #include <dev/isa/cs4231var.h>
121 #endif
122 
123 /*
124  * AD1845 on some machines don't match the AD1845 doc
125  * and defining AD1845_HACK to 1 works around the problems.
126  * options AD1845_HACK=0  should work if you have ``correct'' one.
127  */
128 #ifndef AD1845_HACK
129 #define AD1845_HACK	1	/* weird mixer, can't play slinear_be */
130 #endif
131 
132 #ifdef AUDIO_DEBUG
133 #define DPRINTF(x)	if (ad1848debug) printf x
134 int	ad1848debug = 0;
135 void ad1848_dump_regs(struct ad1848_softc *);
136 #else
137 #define DPRINTF(x)
138 #endif
139 
140 /* The HW supports more frequencies but I chose several major ones. */
141 static const struct audio_format ad1848_formats[] = {
142 	{
143 		.mode		= AUMODE_PLAY | AUMODE_RECORD,
144 		.encoding	= AUDIO_ENCODING_SLINEAR_LE,
145 		.validbits	= 16,
146 		.precision	= 16,
147 		.channels	= 2,
148 		.channel_mask	= AUFMT_STEREO,
149 		.frequency_type	= 6,
150 		.frequency	= { 8000, 11025, 16000, 22050, 44100, 48000 },
151 	},
152 };
153 #define AD1848_NFORMATS __arraycount(ad1848_formats)
154 
155 /*
156  * Initial values for the indirect registers of CS4248/AD1848.
157  */
158 static const int ad1848_init_values[] = {
159     GAIN_12|INPUT_MIC_GAIN_ENABLE,	/* Left Input Control */
160     GAIN_12|INPUT_MIC_GAIN_ENABLE,	/* Right Input Control */
161     ATTEN_12,				/* Left Aux #1 Input Control */
162     ATTEN_12,				/* Right Aux #1 Input Control */
163     ATTEN_12,				/* Left Aux #2 Input Control */
164     ATTEN_12,				/* Right Aux #2 Input Control */
165     /* bits 5-0 are attenuation select */
166     ATTEN_12,				/* Left DAC output Control */
167     ATTEN_12,				/* Right DAC output Control */
168     CLOCK_XTAL1|FMT_PCM8,		/* Clock and Data Format */
169     SINGLE_DMA|AUTO_CAL_ENABLE,		/* Interface Config */
170     INTERRUPT_ENABLE,			/* Pin control */
171     0x00,				/* Test and Init */
172     MODE2,				/* Misc control */
173     ATTEN_0<<2,				/* Digital Mix Control */
174     0,					/* Upper base Count */
175     0,					/* Lower base Count */
176 
177     /* These are for CS4231 &c. only (additional registers): */
178     0,					/* Alt feature 1 */
179     0,					/* Alt feature 2 */
180     ATTEN_12,				/* Left line in */
181     ATTEN_12,				/* Right line in */
182     0,					/* Timer low */
183     0,					/* Timer high */
184     0,					/* unused */
185     0,					/* unused */
186     0,					/* IRQ status */
187     0,					/* unused */
188 			/* Mono input (a.k.a speaker) (mic) Control */
189     MONO_INPUT_MUTE|ATTEN_6,		/* mute speaker by default */
190     0,					/* unused */
191     0,					/* record format */
192     0,					/* Crystal Clock Select */
193     0,					/* upper record count */
194     0					/* lower record count */
195 };
196 
197 
198 int
ad1848_to_vol(mixer_ctrl_t * cp,struct ad1848_volume * vol)199 ad1848_to_vol(mixer_ctrl_t *cp, struct ad1848_volume *vol)
200 {
201 
202 	if (cp->un.value.num_channels == 1) {
203 		vol->left =
204 		vol->right = cp->un.value.level[AUDIO_MIXER_LEVEL_MONO];
205 		return 1;
206 	}
207 	else if (cp->un.value.num_channels == 2) {
208 		vol->left  = cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT];
209 		vol->right = cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT];
210 		return 1;
211 	}
212 	return 0;
213 }
214 
215 int
ad1848_from_vol(mixer_ctrl_t * cp,struct ad1848_volume * vol)216 ad1848_from_vol(mixer_ctrl_t *cp, struct ad1848_volume *vol)
217 {
218 
219 	if (cp->un.value.num_channels == 1) {
220 		cp->un.value.level[AUDIO_MIXER_LEVEL_MONO] = vol->left;
221 		return 1;
222 	}
223 	else if (cp->un.value.num_channels == 2) {
224 		cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT] = vol->left;
225 		cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = vol->right;
226 		return 1;
227 	}
228 	return 0;
229 }
230 
231 
232 int
ad_read(struct ad1848_softc * sc,int reg)233 ad_read(struct ad1848_softc *sc, int reg)
234 {
235 	int x;
236 
237 	ADWRITE(sc, AD1848_IADDR, (reg & 0xff) | sc->MCE_bit);
238 	x = ADREAD(sc, AD1848_IDATA);
239 	/*  printf("(%02x<-%02x) ", reg|sc->MCE_bit, x); */
240 	return x;
241 }
242 
243 void
ad_write(struct ad1848_softc * sc,int reg,int data)244 ad_write(struct ad1848_softc *sc, int reg, int data)
245 {
246 
247 	ADWRITE(sc, AD1848_IADDR, (reg & 0xff) | sc->MCE_bit);
248 	ADWRITE(sc, AD1848_IDATA, data & 0xff);
249 	/* printf("(%02x->%02x) ", reg|sc->MCE_bit, data); */
250 }
251 
252 /*
253  * extended registers (mode 3) require an additional level of
254  * indirection through CS_XREG (I23).
255  */
256 
257 int
ad_xread(struct ad1848_softc * sc,int reg)258 ad_xread(struct ad1848_softc *sc, int reg)
259 {
260 	int x;
261 
262 	ADWRITE(sc, AD1848_IADDR, CS_XREG | sc->MCE_bit);
263 	ADWRITE(sc, AD1848_IDATA, (reg | ALT_F3_XRAE) & 0xff);
264 	x = ADREAD(sc, AD1848_IDATA);
265 
266 	return x;
267 }
268 
269 void
ad_xwrite(struct ad1848_softc * sc,int reg,int val)270 ad_xwrite(struct ad1848_softc *sc, int reg, int val)
271 {
272 
273 	ADWRITE(sc, AD1848_IADDR, CS_XREG | sc->MCE_bit);
274 	ADWRITE(sc, AD1848_IDATA, (reg | ALT_F3_XRAE) & 0xff);
275 	ADWRITE(sc, AD1848_IDATA, val & 0xff);
276 }
277 
278 static void
ad_set_MCE(struct ad1848_softc * sc,int state)279 ad_set_MCE(struct ad1848_softc *sc, int state)
280 {
281 
282 	if (state)
283 		sc->MCE_bit = MODE_CHANGE_ENABLE;
284 	else
285 		sc->MCE_bit = 0;
286 	ADWRITE(sc, AD1848_IADDR, sc->MCE_bit);
287 }
288 
289 static void
wait_for_calibration(struct ad1848_softc * sc)290 wait_for_calibration(struct ad1848_softc *sc)
291 {
292 	int timeout;
293 
294 	DPRINTF(("ad1848: Auto calibration started.\n"));
295 	/*
296 	 * Wait until the auto calibration process has finished.
297 	 *
298 	 * 1) Wait until the chip becomes ready (reads don't return 0x80).
299 	 * 2) Wait until the ACI bit of I11 gets on and then off.
300 	 *    Because newer chips are fast we may never see the ACI
301 	 *    bit go on.  Just delay a little instead.
302 	 */
303 	timeout = 10000;
304 	while (timeout > 0 && ADREAD(sc, AD1848_IADDR) == SP_IN_INIT) {
305 		delay(10);
306 		timeout--;
307 	}
308 	if (timeout <= 0) {
309 		DPRINTF(("ad1848: Auto calibration timed out(1).\n"));
310 	}
311 
312 	/* Set register addr */
313 	ADWRITE(sc, AD1848_IADDR, SP_TEST_AND_INIT);
314 	/* Wait for address to appear when read back. */
315 	timeout = 100000;
316 	while (timeout > 0 &&
317 	       (ADREAD(sc, AD1848_IADDR)&SP_IADDR_MASK) != SP_TEST_AND_INIT) {
318 		delay(10);
319 		timeout--;
320 	}
321 	if (timeout <= 0) {
322 		DPRINTF(("ad1848: Auto calibration timed out(1.5).\n"));
323 	}
324 
325 	if (!(ad_read(sc, SP_TEST_AND_INIT) & AUTO_CAL_IN_PROG)) {
326 		if (sc->mode > 1) {
327 			/* A new chip, just delay a little. */
328 			delay(100);	/* XXX what should it be? */
329 		} else {
330 			timeout = 10000;
331 			while (timeout > 0 &&
332 			       !(ad_read(sc, SP_TEST_AND_INIT) &
333 				 AUTO_CAL_IN_PROG)) {
334 				delay(10);
335 				timeout--;
336 			}
337 			if (timeout <= 0) {
338 				DPRINTF(("ad1848: Auto calibration timed out(2).\n"));
339 			}
340 		}
341 	}
342 
343 	timeout = 10000;
344 	while (timeout > 0 &&
345 	       ad_read(sc, SP_TEST_AND_INIT) & AUTO_CAL_IN_PROG) {
346 		delay(10);
347 		timeout--;
348 	}
349 	if (timeout <= 0) {
350 		DPRINTF(("ad1848: Auto calibration timed out(3).\n"));
351 	}
352 }
353 
354 #ifdef AUDIO_DEBUG
355 void
ad1848_dump_regs(struct ad1848_softc * sc)356 ad1848_dump_regs(struct ad1848_softc *sc)
357 {
358 	int i;
359 	u_char r;
360 
361 	printf("ad1848 status=%02x", ADREAD(sc, AD1848_STATUS));
362 	printf(" regs: ");
363 	for (i = 0; i < 16; i++) {
364 		r = ad_read(sc, i);
365 		printf("%02x ", r);
366 	}
367 	if (sc->mode >= 2) {
368 		for (i = 16; i < 32; i++) {
369 			r = ad_read(sc, i);
370 			printf("%02x ", r);
371 		}
372 	}
373 	printf("\n");
374 }
375 #endif /* AUDIO_DEBUG */
376 
377 
378 /*
379  * Attach hardware to driver, attach hardware driver to audio
380  * pseudo-device driver .
381  */
382 void
ad1848_attach(struct ad1848_softc * sc)383 ad1848_attach(struct ad1848_softc *sc)
384 {
385 	static struct ad1848_volume vol_mid = {220, 220};
386 	static struct ad1848_volume vol_0   = {0, 0};
387 	int i;
388 	int timeout;
389 
390 	/* Initialize the ad1848... */
391 	for (i = 0; i < 0x10; i++) {
392 		ad_write(sc, i, ad1848_init_values[i]);
393 		timeout = 100000;
394 		while (timeout > 0 && ADREAD(sc, AD1848_IADDR) & SP_IN_INIT)
395 			timeout--;
396 	}
397 	/* ...and additional CS4231 stuff too */
398 	if (sc->mode >= 2) {
399 		ad_write(sc, SP_INTERFACE_CONFIG, 0); /* disable SINGLE_DMA */
400 		for (i = 0x10; i < 0x20; i++)
401 			if (ad1848_init_values[i] != 0) {
402 				ad_write(sc, i, ad1848_init_values[i]);
403 				timeout = 100000;
404 				while (timeout > 0 &&
405 				       ADREAD(sc, AD1848_IADDR) & SP_IN_INIT)
406 					timeout--;
407 			}
408 	}
409 	ad1848_reset(sc);
410 
411 	/* Set default gains */
412 	ad1848_set_rec_gain(sc, &vol_mid);
413 	ad1848_set_channel_gain(sc, AD1848_DAC_CHANNEL, &vol_mid);
414 	ad1848_set_channel_gain(sc, AD1848_MONITOR_CHANNEL, &vol_0);
415 	ad1848_set_channel_gain(sc, AD1848_AUX1_CHANNEL, &vol_mid);	/* CD volume */
416 	sc->mute[AD1848_MONITOR_CHANNEL] = MUTE_ALL;
417 	if (sc->mode >= 2
418 #if AD1845_HACK
419 	    && sc->is_ad1845 == 0
420 #endif
421 		) {
422 		ad1848_set_channel_gain(sc, AD1848_AUX2_CHANNEL, &vol_mid); /* CD volume */
423 		ad1848_set_channel_gain(sc, AD1848_LINE_CHANNEL, &vol_mid);
424 		ad1848_set_channel_gain(sc, AD1848_MONO_CHANNEL, &vol_0);
425 		sc->mute[AD1848_MONO_CHANNEL] = MUTE_ALL;
426 	} else
427 		ad1848_set_channel_gain(sc, AD1848_AUX2_CHANNEL, &vol_0);
428 
429 	/* Set default port */
430 	ad1848_set_rec_port(sc, MIC_IN_PORT);
431 
432 	printf(": %s", sc->chip_name);
433 }
434 
435 /*
436  * Various routines to interface to higher level audio driver
437  */
438 static const struct ad1848_mixerinfo {
439 	int  left_reg;
440 	int  right_reg;
441 	int  atten_bits;
442 	int  atten_mask;
443 } mixer_channel_info[] =
444 {
445   { SP_LEFT_AUX2_CONTROL, SP_RIGHT_AUX2_CONTROL, AUX_INPUT_ATTEN_BITS,
446     AUX_INPUT_ATTEN_MASK },
447   { SP_LEFT_AUX1_CONTROL, SP_RIGHT_AUX1_CONTROL, AUX_INPUT_ATTEN_BITS,
448     AUX_INPUT_ATTEN_MASK },
449   { SP_LEFT_OUTPUT_CONTROL, SP_RIGHT_OUTPUT_CONTROL,
450     OUTPUT_ATTEN_BITS, OUTPUT_ATTEN_MASK },
451   { CS_LEFT_LINE_CONTROL, CS_RIGHT_LINE_CONTROL, LINE_INPUT_ATTEN_BITS,
452     LINE_INPUT_ATTEN_MASK },
453   { CS_MONO_IO_CONTROL, 0, MONO_INPUT_ATTEN_BITS, MONO_INPUT_ATTEN_MASK },
454   { CS_MONO_IO_CONTROL, 0, 0, 0 },
455   { SP_DIGITAL_MIX, 0, OUTPUT_ATTEN_BITS, MIX_ATTEN_MASK }
456 };
457 
458 /*
459  *  This function doesn't set the mute flags but does use them.
460  *  The mute flags reflect the mutes that have been applied by the user.
461  *  However, the driver occasionally wants to mute devices (e.g. when changing
462  *  sampling rate). These operations should not affect the mute flags.
463  */
464 
465 void
ad1848_mute_channel(struct ad1848_softc * sc,int device,int mute)466 ad1848_mute_channel(struct ad1848_softc *sc, int device, int mute)
467 {
468 	u_char reg;
469 
470 	reg = ad_read(sc, mixer_channel_info[device].left_reg);
471 
472 	if (mute & MUTE_LEFT) {
473 		if (device == AD1848_MONITOR_CHANNEL) {
474 			if (sc->open_mode & FREAD)
475 				ad1848_mute_wave_output(sc, WAVE_UNMUTE1, 0);
476 			ad_write(sc, mixer_channel_info[device].left_reg,
477 				 reg & ~DIGITAL_MIX1_ENABLE);
478 		} else if (device == AD1848_OUT_CHANNEL)
479 			ad_write(sc, mixer_channel_info[device].left_reg,
480 				 reg | MONO_OUTPUT_MUTE);
481 		else
482 			ad_write(sc, mixer_channel_info[device].left_reg,
483 				 reg | 0x80);
484 	} else if (!(sc->mute[device] & MUTE_LEFT)) {
485 		if (device == AD1848_MONITOR_CHANNEL) {
486 			ad_write(sc, mixer_channel_info[device].left_reg,
487 				 reg | DIGITAL_MIX1_ENABLE);
488 			if (sc->open_mode & FREAD)
489 				ad1848_mute_wave_output(sc, WAVE_UNMUTE1, 1);
490 		} else if (device == AD1848_OUT_CHANNEL)
491 			ad_write(sc, mixer_channel_info[device].left_reg,
492 				 reg & ~MONO_OUTPUT_MUTE);
493 		else
494 			ad_write(sc, mixer_channel_info[device].left_reg,
495 				 reg & ~0x80);
496 	}
497 
498 	if (!mixer_channel_info[device].right_reg)
499 		return;
500 
501 	reg = ad_read(sc, mixer_channel_info[device].right_reg);
502 
503 	if (mute & MUTE_RIGHT) {
504 		ad_write(sc, mixer_channel_info[device].right_reg, reg | 0x80);
505 	} else if (!(sc->mute[device] & MUTE_RIGHT)) {
506 		ad_write(sc, mixer_channel_info[device].right_reg, reg &~0x80);
507 	}
508 }
509 
510 int
ad1848_set_channel_gain(struct ad1848_softc * sc,int device,struct ad1848_volume * gp)511 ad1848_set_channel_gain(struct ad1848_softc *sc, int device,
512     struct ad1848_volume *gp)
513 {
514 	const struct ad1848_mixerinfo *info;
515 	u_char reg;
516 	u_int atten;
517 
518 	info = &mixer_channel_info[device];
519 	sc->gains[device] = *gp;
520 
521 	atten = (AUDIO_MAX_GAIN - gp->left) * (info->atten_bits + 1) /
522 		(AUDIO_MAX_GAIN + 1);
523 
524 	reg = ad_read(sc, info->left_reg) & (info->atten_mask);
525 	if (device == AD1848_MONITOR_CHANNEL)
526 		reg |= ((atten & info->atten_bits) << 2);
527 	else
528 		reg |= ((atten & info->atten_bits));
529 
530 	ad_write(sc, info->left_reg, reg);
531 
532 	if (!info->right_reg)
533 		return 0;
534 
535 	atten = (AUDIO_MAX_GAIN - gp->right) * (info->atten_bits + 1) /
536 		(AUDIO_MAX_GAIN + 1);
537 	reg = ad_read(sc, info->right_reg);
538 	reg &= info->atten_mask;
539 	ad_write(sc, info->right_reg, (atten & info->atten_bits) | reg);
540 
541 	return 0;
542 }
543 
544 int
ad1848_get_device_gain(struct ad1848_softc * sc,int device,struct ad1848_volume * gp)545 ad1848_get_device_gain(struct ad1848_softc *sc, int device,
546     struct ad1848_volume *gp)
547 {
548 
549 	*gp = sc->gains[device];
550 	return 0;
551 }
552 
553 int
ad1848_get_rec_gain(struct ad1848_softc * sc,struct ad1848_volume * gp)554 ad1848_get_rec_gain(struct ad1848_softc *sc, struct ad1848_volume *gp)
555 {
556 
557 	*gp = sc->rec_gain;
558 	return 0;
559 }
560 
561 int
ad1848_set_rec_gain(struct ad1848_softc * sc,struct ad1848_volume * gp)562 ad1848_set_rec_gain(struct ad1848_softc *sc, struct ad1848_volume *gp)
563 {
564 	u_char reg, gain;
565 
566 	DPRINTF(("ad1848_set_rec_gain: %d:%d\n", gp->left, gp->right));
567 
568 	sc->rec_gain = *gp;
569 
570 	gain = (gp->left * (GAIN_22_5 + 1)) / (AUDIO_MAX_GAIN + 1);
571 	reg = ad_read(sc, SP_LEFT_INPUT_CONTROL);
572 	reg &= INPUT_GAIN_MASK;
573 	ad_write(sc, SP_LEFT_INPUT_CONTROL, (gain & 0x0f) | reg);
574 
575 	gain = (gp->right * (GAIN_22_5 + 1)) / (AUDIO_MAX_GAIN + 1);
576 	reg = ad_read(sc, SP_RIGHT_INPUT_CONTROL);
577 	reg &= INPUT_GAIN_MASK;
578 	ad_write(sc, SP_RIGHT_INPUT_CONTROL, (gain & 0x0f) | reg);
579 
580 	return 0;
581 }
582 
583 void
ad1848_mute_wave_output(struct ad1848_softc * sc,int mute,int set)584 ad1848_mute_wave_output(struct ad1848_softc *sc, int mute, int set)
585 {
586 	int m;
587 
588 	DPRINTF(("ad1848_mute_wave_output: %d, %d\n", mute, set));
589 
590 	if (mute == WAVE_MUTE2_INIT) {
591 		sc->wave_mute_status = 0;
592 		mute = WAVE_MUTE2;
593 	}
594 	if (set)
595 		m = sc->wave_mute_status |= mute;
596 	else
597 		m = sc->wave_mute_status &= ~mute;
598 
599 	if (m & WAVE_MUTE0 || ((m & WAVE_UNMUTE1) == 0 && m & WAVE_MUTE2))
600 		ad1848_mute_channel(sc, AD1848_DAC_CHANNEL, MUTE_ALL);
601 	else
602 		ad1848_mute_channel(sc, AD1848_DAC_CHANNEL,
603 					    sc->mute[AD1848_DAC_CHANNEL]);
604 }
605 
606 int
ad1848_set_mic_gain(struct ad1848_softc * sc,struct ad1848_volume * gp)607 ad1848_set_mic_gain(struct ad1848_softc *sc, struct ad1848_volume *gp)
608 {
609 	u_char reg;
610 
611 	DPRINTF(("cs4231_set_mic_gain: %d\n", gp->left));
612 
613 	if (gp->left > AUDIO_MAX_GAIN/2) {
614 		sc->mic_gain_on = 1;
615 		reg = ad_read(sc, SP_LEFT_INPUT_CONTROL);
616 		ad_write(sc, SP_LEFT_INPUT_CONTROL,
617 			 reg | INPUT_MIC_GAIN_ENABLE);
618 	} else {
619 		sc->mic_gain_on = 0;
620 		reg = ad_read(sc, SP_LEFT_INPUT_CONTROL);
621 		ad_write(sc, SP_LEFT_INPUT_CONTROL,
622 			 reg & ~INPUT_MIC_GAIN_ENABLE);
623 	}
624 
625 	return 0;
626 }
627 
628 int
ad1848_get_mic_gain(struct ad1848_softc * sc,struct ad1848_volume * gp)629 ad1848_get_mic_gain(struct ad1848_softc *sc, struct ad1848_volume *gp)
630 {
631 	if (sc->mic_gain_on)
632 		gp->left = gp->right = AUDIO_MAX_GAIN;
633 	else
634 		gp->left = gp->right = AUDIO_MIN_GAIN;
635 	return 0;
636 }
637 
638 static const ad1848_devmap_t *
ad1848_mixer_find_dev(const ad1848_devmap_t * map,int cnt,mixer_ctrl_t * cp)639 ad1848_mixer_find_dev(const ad1848_devmap_t *map, int cnt, mixer_ctrl_t *cp)
640 {
641 	int i;
642 
643 	for (i = 0; i < cnt; i++) {
644 		if (map[i].id == cp->dev) {
645 			return (&map[i]);
646 		}
647 	}
648 	return 0;
649 }
650 
651 int
ad1848_mixer_get_port(struct ad1848_softc * ac,const struct ad1848_devmap * map,int cnt,mixer_ctrl_t * cp)652 ad1848_mixer_get_port(struct ad1848_softc *ac, const struct ad1848_devmap *map,
653     int cnt, mixer_ctrl_t *cp)
654 {
655 	const ad1848_devmap_t *entry;
656 	struct ad1848_volume vol;
657 	int error;
658 	int dev;
659 
660 	error = EINVAL;
661 	if (!(entry = ad1848_mixer_find_dev(map, cnt, cp)))
662 		return ENXIO;
663 
664 	dev = entry->dev;
665 
666 	switch (entry->kind) {
667 	case AD1848_KIND_LVL:
668 		if (cp->type != AUDIO_MIXER_VALUE)
669 			break;
670 
671 		if (dev < AD1848_AUX2_CHANNEL ||
672 		    dev > AD1848_MONITOR_CHANNEL)
673 			break;
674 
675 		if (cp->un.value.num_channels != 1 &&
676 		    mixer_channel_info[dev].right_reg == 0)
677 			break;
678 
679 		error = ad1848_get_device_gain(ac, dev, &vol);
680 		if (!error)
681 			ad1848_from_vol(cp, &vol);
682 
683 		break;
684 
685 	case AD1848_KIND_MUTE:
686 		if (cp->type != AUDIO_MIXER_ENUM) break;
687 
688 		cp->un.ord = ac->mute[dev] ? 1 : 0;
689 		error = 0;
690 		break;
691 
692 	case AD1848_KIND_RECORDGAIN:
693 		if (cp->type != AUDIO_MIXER_VALUE) break;
694 
695 		error = ad1848_get_rec_gain(ac, &vol);
696 		if (!error)
697 			ad1848_from_vol(cp, &vol);
698 
699 		break;
700 
701 	case AD1848_KIND_MICGAIN:
702 		if (cp->type != AUDIO_MIXER_VALUE) break;
703 
704 		error = ad1848_get_mic_gain(ac, &vol);
705 		if (!error)
706 			ad1848_from_vol(cp, &vol);
707 
708 		break;
709 
710 	case AD1848_KIND_RECORDSOURCE:
711 		if (cp->type != AUDIO_MIXER_ENUM) break;
712 		cp->un.ord = ad1848_get_rec_port(ac);
713 		error = 0;
714 		break;
715 
716 	default:
717 		printf ("Invalid kind\n");
718 		break;
719 	}
720 
721 	return error;
722 }
723 
724 int
ad1848_mixer_set_port(struct ad1848_softc * ac,const struct ad1848_devmap * map,int cnt,mixer_ctrl_t * cp)725 ad1848_mixer_set_port(struct ad1848_softc *ac, const struct ad1848_devmap *map,
726     int cnt, mixer_ctrl_t *cp)
727 {
728 	const ad1848_devmap_t *entry;
729 	struct ad1848_volume vol;
730 	int error;
731 	int dev;
732 
733 	error = EINVAL;
734 	if (!(entry = ad1848_mixer_find_dev(map, cnt, cp)))
735 		return ENXIO;
736 
737 	dev = entry->dev;
738 
739 	switch (entry->kind) {
740 	case AD1848_KIND_LVL:
741 		if (cp->type != AUDIO_MIXER_VALUE)
742 			break;
743 
744 		if (dev < AD1848_AUX2_CHANNEL ||
745 		    dev > AD1848_MONITOR_CHANNEL)
746 			break;
747 
748 		if (cp->un.value.num_channels != 1 &&
749 		    mixer_channel_info[dev].right_reg == 0)
750 			break;
751 
752 		ad1848_to_vol(cp, &vol);
753 		error = ad1848_set_channel_gain(ac, dev, &vol);
754 		break;
755 
756 	case AD1848_KIND_MUTE:
757 		if (cp->type != AUDIO_MIXER_ENUM) break;
758 
759 		ac->mute[dev] = (cp->un.ord ? MUTE_ALL : 0);
760 		ad1848_mute_channel(ac, dev, ac->mute[dev]);
761 		error = 0;
762 		break;
763 
764 	case AD1848_KIND_RECORDGAIN:
765 		if (cp->type != AUDIO_MIXER_VALUE) break;
766 
767 		ad1848_to_vol(cp, &vol);
768 		error = ad1848_set_rec_gain(ac, &vol);
769 		break;
770 
771 	case AD1848_KIND_MICGAIN:
772 		if (cp->type != AUDIO_MIXER_VALUE) break;
773 
774 		ad1848_to_vol(cp, &vol);
775 		error = ad1848_set_mic_gain(ac, &vol);
776 		break;
777 
778 	case AD1848_KIND_RECORDSOURCE:
779 		if (cp->type != AUDIO_MIXER_ENUM) break;
780 
781 		error = ad1848_set_rec_port(ac,  cp->un.ord);
782 		break;
783 
784 	default:
785 		printf ("Invalid kind\n");
786 		break;
787 	}
788 
789 	return error;
790 }
791 
792 int
ad1848_query_format(void * addr,audio_format_query_t * afp)793 ad1848_query_format(void *addr, audio_format_query_t *afp)
794 {
795 
796 	return audio_query_format(ad1848_formats, AD1848_NFORMATS, afp);
797 }
798 
799 int
ad1848_set_format(void * addr,int setmode,const audio_params_t * p,const audio_params_t * r,audio_filter_reg_t * pfil,audio_filter_reg_t * rfil)800 ad1848_set_format(void *addr, int setmode,
801     const audio_params_t *p, const audio_params_t *r,
802     audio_filter_reg_t *pfil, audio_filter_reg_t *rfil)
803 {
804 	struct ad1848_softc *sc;
805 	int rate;
806 	int error;
807 
808 	/* *p and *r are the identical because !AUDIO_PROP_INDEPENDENT. */
809 	DPRINTF(("%s: %u %u %u %u\n", __func__,
810 	    p->encoding, p->precision, p->channels, p->sample_rate));
811 
812 	sc = addr;
813 
814 	rate = p->sample_rate;
815 	error = ad1848_set_speed(sc, &rate);
816 	if (error)
817 		return error;
818 
819 	sc->format_bits = FMT_TWOS_COMP >> 5;
820 	sc->channels = p->channels;
821 	sc->precision = p->precision;
822 	sc->need_commit = 1;
823 
824 	DPRINTF(("%s succeeded\n", __func__));
825 	return 0;
826 }
827 
828 int
ad1848_set_rec_port(struct ad1848_softc * sc,int port)829 ad1848_set_rec_port(struct ad1848_softc *sc, int port)
830 {
831 	u_char inp, reg;
832 
833 	DPRINTF(("ad1848_set_rec_port: 0x%x\n", port));
834 
835 	if (port == MIC_IN_PORT)
836 		inp = MIC_INPUT;
837 	else if (port == LINE_IN_PORT)
838 		inp = LINE_INPUT;
839 	else if (port == DAC_IN_PORT)
840 		inp = MIXED_DAC_INPUT;
841 	else if (sc->mode >= 2 && port == AUX1_IN_PORT)
842 		inp = AUX_INPUT;
843 	else
844 		return EINVAL;
845 
846 	reg = ad_read(sc, SP_LEFT_INPUT_CONTROL);
847 	reg &= INPUT_SOURCE_MASK;
848 	ad_write(sc, SP_LEFT_INPUT_CONTROL, (inp|reg));
849 
850 	reg = ad_read(sc, SP_RIGHT_INPUT_CONTROL);
851 	reg &= INPUT_SOURCE_MASK;
852 	ad_write(sc, SP_RIGHT_INPUT_CONTROL, (inp|reg));
853 
854 	sc->rec_port = port;
855 
856 	return 0;
857 }
858 
859 int
ad1848_get_rec_port(struct ad1848_softc * sc)860 ad1848_get_rec_port(struct ad1848_softc *sc)
861 {
862 	return sc->rec_port;
863 }
864 
865 int
ad1848_open(void * addr,int flags)866 ad1848_open(void *addr, int flags)
867 {
868 	struct ad1848_softc *sc;
869 	u_char reg;
870 
871 	sc = addr;
872 	DPRINTF(("ad1848_open: sc=%p\n", sc));
873 
874 	sc->open_mode = flags;
875 
876 	/* Enable interrupts */
877 	DPRINTF(("ad1848_open: enable intrs\n"));
878 	reg = ad_read(sc, SP_PIN_CONTROL);
879 	ad_write(sc, SP_PIN_CONTROL, reg | INTERRUPT_ENABLE);
880 
881 	/* If recording && monitoring, the playback part is also used. */
882 	if (flags & FREAD && sc->mute[AD1848_MONITOR_CHANNEL] == 0)
883 		ad1848_mute_wave_output(sc, WAVE_UNMUTE1, 1);
884 
885 #ifdef AUDIO_DEBUG
886 	if (ad1848debug)
887 		ad1848_dump_regs(sc);
888 #endif
889 
890 	return 0;
891 }
892 
893 void
ad1848_close(void * addr)894 ad1848_close(void *addr)
895 {
896 	struct ad1848_softc *sc;
897 	u_char reg;
898 
899 	sc = addr;
900 	sc->open_mode = 0;
901 
902 	ad1848_mute_wave_output(sc, WAVE_UNMUTE1, 0);
903 
904 	/* Disable interrupts */
905 	DPRINTF(("ad1848_close: disable intrs\n"));
906 	reg = ad_read(sc, SP_PIN_CONTROL);
907 	ad_write(sc, SP_PIN_CONTROL, reg & ~INTERRUPT_ENABLE);
908 
909 #ifdef AUDIO_DEBUG
910 	if (ad1848debug)
911 		ad1848_dump_regs(sc);
912 #endif
913 }
914 
915 /*
916  * Lower-level routines
917  */
918 int
ad1848_commit_settings(void * addr)919 ad1848_commit_settings(void *addr)
920 {
921 	struct ad1848_softc *sc;
922 	int timeout;
923 	u_char fs;
924 
925 	sc = addr;
926 	if (!sc->need_commit)
927 		return 0;
928 
929 	mutex_spin_enter(&sc->sc_intr_lock);
930 
931 	ad1848_mute_wave_output(sc, WAVE_MUTE0, 1);
932 
933 	ad_set_MCE(sc, 1);	/* Enables changes to the format select reg */
934 
935 	fs = sc->speed_bits | (sc->format_bits << 5);
936 
937 	if (sc->channels == 2)
938 		fs |= FMT_STEREO;
939 
940 	/*
941 	 * OPL3-SA2 (YMF711) is sometimes busy here.
942 	 * Wait until it becomes ready.
943 	 */
944 	for (timeout = 0;
945 	    timeout < 1000 && ADREAD(sc, AD1848_IADDR) & SP_IN_INIT; timeout++)
946 		delay(10);
947 
948 	ad_write(sc, SP_CLOCK_DATA_FORMAT, fs);
949 
950 	/*
951 	 * If mode >= 2 (CS4231), set I28 also.
952 	 * It's the capture format register.
953 	 */
954 	if (sc->mode >= 2) {
955 		/*
956 		 * Gravis Ultrasound MAX SDK sources says something about
957 		 * errata sheets, with the implication that these inb()s
958 		 * are necessary.
959 		 */
960 		(void)ADREAD(sc, AD1848_IDATA);
961 		(void)ADREAD(sc, AD1848_IDATA);
962 		/* Write to I8 starts resynchronization. Wait for completion. */
963 		timeout = 100000;
964 		while (timeout > 0 && ADREAD(sc, AD1848_IADDR) == SP_IN_INIT)
965 			timeout--;
966 
967 		ad_write(sc, CS_REC_FORMAT, fs);
968 		(void)ADREAD(sc, AD1848_IDATA);
969 		(void)ADREAD(sc, AD1848_IDATA);
970 		/* Now wait for resync for capture side of the house */
971 	}
972 	/*
973 	 * Write to I8 starts resynchronization. Wait until it completes.
974 	 */
975 	timeout = 100000;
976 	while (timeout > 0 && ADREAD(sc, AD1848_IADDR) == SP_IN_INIT) {
977 		delay(10);
978 		timeout--;
979 	}
980 
981 	if (ADREAD(sc, AD1848_IADDR) == SP_IN_INIT)
982 		printf("ad1848_commit: Auto calibration timed out\n");
983 
984 	/*
985 	 * Starts the calibration process and
986 	 * enters playback mode after it.
987 	 */
988 	ad_set_MCE(sc, 0);
989 	wait_for_calibration(sc);
990 
991 	ad1848_mute_wave_output(sc, WAVE_MUTE0, 0);
992 
993 	mutex_spin_exit(&sc->sc_intr_lock);
994 
995 	sc->need_commit = 0;
996 
997 	return 0;
998 }
999 
1000 void
ad1848_reset(struct ad1848_softc * sc)1001 ad1848_reset(struct ad1848_softc *sc)
1002 {
1003 	u_char r;
1004 
1005 	DPRINTF(("ad1848_reset\n"));
1006 
1007 	/* Clear the PEN and CEN bits */
1008 	r = ad_read(sc, SP_INTERFACE_CONFIG);
1009 	r &= ~(CAPTURE_ENABLE | PLAYBACK_ENABLE);
1010 	ad_write(sc, SP_INTERFACE_CONFIG, r);
1011 
1012 	if (sc->mode >= 2) {
1013 		ADWRITE(sc, AD1848_IADDR, CS_IRQ_STATUS);
1014 		ADWRITE(sc, AD1848_IDATA, 0);
1015 	}
1016 	/* Clear interrupt status */
1017 	ADWRITE(sc, AD1848_STATUS, 0);
1018 #ifdef AUDIO_DEBUG
1019 	if (ad1848debug)
1020 		ad1848_dump_regs(sc);
1021 #endif
1022 }
1023 
1024 int
ad1848_set_speed(struct ad1848_softc * sc,u_int * argp)1025 ad1848_set_speed(struct ad1848_softc *sc, u_int *argp)
1026 {
1027 	/*
1028 	 * The sampling speed is encoded in the least significant nible of I8.
1029 	 * The LSB selects the clock source (0=24.576 MHz, 1=16.9344 MHz) and
1030 	 * other three bits select the divisor (indirectly):
1031 	 *
1032 	 * The available speeds are in the following table. Keep the speeds in
1033 	 * the increasing order.
1034 	 */
1035 	typedef struct {
1036 		int	speed;
1037 		u_char	bits;
1038 	} speed_struct;
1039 	u_long arg;
1040 
1041 	static const speed_struct speed_table[] =  {
1042 		{5510, (0 << 1) | 1},
1043 		{5510, (0 << 1) | 1},
1044 		{6620, (7 << 1) | 1},
1045 		{8000, (0 << 1) | 0},
1046 		{9600, (7 << 1) | 0},
1047 		{11025, (1 << 1) | 1},
1048 		{16000, (1 << 1) | 0},
1049 		{18900, (2 << 1) | 1},
1050 		{22050, (3 << 1) | 1},
1051 		{27420, (2 << 1) | 0},
1052 		{32000, (3 << 1) | 0},
1053 		{33075, (6 << 1) | 1},
1054 		{37800, (4 << 1) | 1},
1055 		{44100, (5 << 1) | 1},
1056 		{48000, (6 << 1) | 0}
1057 	};
1058 
1059 	int i, n, selected;
1060 
1061 	arg = *argp;
1062 	selected = -1;
1063 	n = sizeof(speed_table) / sizeof(speed_struct);
1064 
1065 	if (arg < speed_table[0].speed)
1066 		selected = 0;
1067 	if (arg > speed_table[n - 1].speed)
1068 		selected = n - 1;
1069 
1070 	for (i = 1 /*really*/ ; selected == -1 && i < n; i++)
1071 		if (speed_table[i].speed == arg)
1072 			selected = i;
1073 		else if (speed_table[i].speed > arg) {
1074 			int diff1, diff2;
1075 
1076 			diff1 = arg - speed_table[i - 1].speed;
1077 			diff2 = speed_table[i].speed - arg;
1078 
1079 			if (diff1 < diff2)
1080 				selected = i - 1;
1081 			else
1082 				selected = i;
1083 		}
1084 
1085 	if (selected == -1) {
1086 		printf("ad1848: Can't find speed???\n");
1087 		selected = 3;
1088 	}
1089 
1090 	sc->speed_bits = speed_table[selected].bits;
1091 	sc->need_commit = 1;
1092 	*argp = speed_table[selected].speed;
1093 
1094 	return 0;
1095 }
1096 
1097 /*
1098  * Halt I/O
1099  */
1100 int
ad1848_halt_output(void * addr)1101 ad1848_halt_output(void *addr)
1102 {
1103 	struct ad1848_softc *sc;
1104 	u_char reg;
1105 
1106 	DPRINTF(("ad1848: ad1848_halt_output\n"));
1107 	sc = addr;
1108 	reg = ad_read(sc, SP_INTERFACE_CONFIG);
1109 	ad_write(sc, SP_INTERFACE_CONFIG, reg & ~PLAYBACK_ENABLE);
1110 
1111 	return 0;
1112 }
1113 
1114 int
ad1848_halt_input(void * addr)1115 ad1848_halt_input(void *addr)
1116 {
1117 	struct ad1848_softc *sc;
1118 	u_char reg;
1119 
1120 	DPRINTF(("ad1848: ad1848_halt_input\n"));
1121 	sc = addr;
1122 	reg = ad_read(sc, SP_INTERFACE_CONFIG);
1123 	ad_write(sc, SP_INTERFACE_CONFIG, reg & ~CAPTURE_ENABLE);
1124 
1125 	return 0;
1126 }
1127 
1128 void
ad1848_get_locks(void * addr,kmutex_t ** intr,kmutex_t ** thread)1129 ad1848_get_locks(void *addr, kmutex_t **intr, kmutex_t **thread)
1130 {
1131 	struct ad1848_softc *sc;
1132 
1133 	sc = addr;
1134 	*intr = &sc->sc_intr_lock;
1135 	*thread = &sc->sc_lock;
1136 }
1137 
1138 void
ad1848_init_locks(struct ad1848_softc * sc,int ipl)1139 ad1848_init_locks(struct ad1848_softc *sc, int ipl)
1140 {
1141 
1142 	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
1143 	mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, ipl);
1144 }
1145 
1146 void
ad1848_destroy_locks(struct ad1848_softc * sc)1147 ad1848_destroy_locks(struct ad1848_softc *sc)
1148 {
1149 
1150 	mutex_destroy(&sc->sc_lock);
1151 	mutex_destroy(&sc->sc_intr_lock);
1152 }
1153