1/*	$NetBSD: ad1848_isa.c,v 1.40 2019/06/08 08:02:38 isaki 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 supplied from the SoundBlaster driver for NetBSD.
95 */
96
97#include <sys/cdefs.h>
98__KERNEL_RCSID(0, "$NetBSD: ad1848_isa.c,v 1.40 2019/06/08 08:02:38 isaki 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/syslog.h>
105#include <sys/device.h>
106#include <sys/proc.h>
107#include <sys/buf.h>
108#include <sys/cpu.h>
109#include <sys/bus.h>
110#include <sys/audioio.h>
111#include <sys/malloc.h>
112
113#include <dev/audio/audio_if.h>
114
115#include <dev/isa/isavar.h>
116#include <dev/isa/isadmavar.h>
117
118#include <dev/ic/ad1848reg.h>
119#include <dev/ic/cs4231reg.h>
120#include <dev/ic/cs4237reg.h>
121#include <dev/isa/ad1848var.h>
122#include <dev/isa/cs4231var.h>
123
124#ifdef AUDIO_DEBUG
125#define DPRINTF(x)	if (ad1848debug) printf x
126extern int	ad1848debug;
127#else
128#define DPRINTF(x)
129#endif
130
131static int ad1848_isa_read( struct ad1848_softc *, int);
132static void ad1848_isa_write( struct ad1848_softc *, int, int);
133
134int
135ad1848_isa_read(struct ad1848_softc *sc, int index)
136{
137
138	return bus_space_read_1(sc->sc_iot, sc->sc_ioh, index);
139}
140
141void
142ad1848_isa_write(struct ad1848_softc *sc, int index, int value)
143{
144
145	bus_space_write_1(sc->sc_iot, sc->sc_ioh, index, value);
146}
147
148/*
149 * Map and probe for the ad1848 chip
150 */
151int
152ad1848_isa_mapprobe(struct ad1848_isa_softc *isc, int iobase)
153{
154	struct ad1848_softc *sc;
155
156	sc = &isc->sc_ad1848;
157	if (!AD1848_BASE_VALID(iobase)) {
158#ifdef AUDIO_DEBUG
159		printf("ad1848: configured iobase %04x invalid\n", iobase);
160#endif
161		return 0;
162	}
163
164	/* Map the AD1848 ports */
165	if (bus_space_map(sc->sc_iot, iobase, AD1848_NPORT, 0, &sc->sc_ioh))
166		return 0;
167
168	if (!ad1848_isa_probe(isc)) {
169		bus_space_unmap(sc->sc_iot, sc->sc_ioh, AD1848_NPORT);
170		return 0;
171	} else
172		return 1;
173}
174
175/*
176 * Probe for the ad1848 chip
177 */
178int
179ad1848_isa_probe(struct ad1848_isa_softc *isc)
180{
181	struct ad1848_softc *sc;
182	u_char tmp, tmp1 = 0xff, tmp2 = 0xff;
183	int i, t;
184
185	sc = &isc->sc_ad1848;
186	sc->sc_readreg = ad1848_isa_read;
187	sc->sc_writereg = ad1848_isa_write;
188
189	/* Is there an ad1848 chip ? */
190	sc->MCE_bit = MODE_CHANGE_ENABLE;
191	sc->mode = 1;	/* MODE 1 = original ad1848/ad1846/cs4248 */
192
193	/*
194	 * Check that the I/O address is in use.
195	 *
196	 * The SP_IN_INIT bit of the base I/O port is known to be 0 after the
197	 * chip has performed its power-on initialization. Just assume
198	 * this has happened before the OS is starting.
199	 *
200	 * If the I/O address is unused, inb() typically returns 0xff.
201	 */
202	tmp = ADREAD(sc, AD1848_IADDR);
203	if (tmp & SP_IN_INIT) { /* Not a AD1848 */
204		DPRINTF(("ad_detect_A %x\n", tmp));
205		goto bad;
206	}
207
208	/*
209	 * Test if it's possible to change contents of the indirect registers.
210	 * Registers 0 and 1 are ADC volume registers.  The bit 0x10 is read
211	 * only so try to avoid using it.  The bit 0x20 is the mic preamp
212	 * enable; on some chips it is always the same in both registers, so
213	 * we avoid tests where they are different.
214	 */
215	ad_write(sc, 0, 0x8a);
216	ad_write(sc, 1, 0x45);	/* 0x55 with bit 0x10 clear */
217	tmp1 = ad_read(sc, 0);
218	tmp2 = ad_read(sc, 1);
219
220	if (tmp1 != 0x8a || tmp2 != 0x45) {
221		DPRINTF(("ad_detect_B (%x/%x)\n", tmp1, tmp2));
222		goto bad;
223	}
224
225	ad_write(sc, 0, 0x65);
226	ad_write(sc, 1, 0xaa);
227	tmp1 = ad_read(sc, 0);
228	tmp2 = ad_read(sc, 1);
229
230	if (tmp1 != 0x65 || tmp2 != 0xaa) {
231		DPRINTF(("ad_detect_C (%x/%x)\n", tmp1, tmp2));
232		goto bad;
233	}
234
235	/*
236	 * The indirect register I12 has some read only bits. Lets
237	 * try to change them.
238	 */
239	tmp = ad_read(sc, SP_MISC_INFO);
240	ad_write(sc, SP_MISC_INFO, (~tmp) & 0x0f);
241
242	/* Here, AD1845 may sometimes be busy.  Wait til it becomes ready. */
243	for (t = 0; t < 100000 && ADREAD(sc, AD1848_IADDR) & SP_IN_INIT; t++)
244		;
245#ifdef AUDIO_DEBUG
246	if (t)
247		DPRINTF(("ad1848_isa_probe: t %d\n", t));
248#endif
249
250	if ((tmp & 0x0f) != ((tmp1 = ad_read(sc, SP_MISC_INFO)) & 0x0f)) {
251		DPRINTF(("ad_detect_D (%x)\n", tmp1));
252		goto bad;
253	}
254
255	/*
256	 * MSB and 4 LSBs of the reg I12 tell the chip revision.
257	 *
258	 * A preliminary version of the AD1846 data sheet stated that it
259	 * used an ID field of 0x0B.  The current version, however,
260	 * states that the AD1846 uses ID 0x0A, just like the AD1848K.
261	 *
262	 * this switch statement will need updating as newer clones arrive....
263	 */
264	switch (tmp1 & 0x8f) {
265	case 0x09:
266		sc->chip_name = "AD1848J";
267		break;
268	case 0x0A:
269		sc->chip_name = "AD1848K";
270		break;
271#if 0	/* See above */
272	case 0x0B:
273		sc->chip_name = "AD1846";
274		break;
275#endif
276	case 0x81:
277		sc->chip_name = "CS4248revB"; /* or CS4231 rev B; see below */
278		break;
279	case 0x89:
280		sc->chip_name = "CS4248";
281		break;
282	case 0x8A:
283		sc->chip_name = "broken"; /* CS4231/AD1845; see below */
284		break;
285	default:
286		sc->chip_name = "unknown";
287		DPRINTF(("ad1848: unknown codec version 0x%02x\n",
288			 tmp1 & 0x8f));
289		break;
290	}
291
292	/*
293	 * The original AD1848/CS4248 has just 16 indirect registers. This
294	 * means that I0 and I16 should return the same value (etc.).
295	 * Ensure that the Mode2 enable bit of I12 is 0. Otherwise this test
296	 * fails with CS4231, AD1845, etc.
297	 */
298	ad_write(sc, SP_MISC_INFO, 0);	/* Mode2 = disabled */
299
300	for (i = 0; i < 16; i++)
301		if ((tmp1 = ad_read(sc, i)) != (tmp2 = ad_read(sc, i + 16))) {
302			if (i != SP_TEST_AND_INIT) {
303				DPRINTF(("ad_detect_F(%d/%x/%x)\n", i, tmp1, tmp2));
304				goto bad;
305			}
306		}
307
308	/*
309	 * Try to switch the chip to mode2 (CS4231) by setting the MODE2 bit
310	 * The bit 0x80 is always 1 in CS4248, CS4231, and AD1845.
311	 */
312	ad_write(sc, SP_MISC_INFO, MODE2);	/* Set mode2, clear 0x80 */
313
314	tmp1 = ad_read(sc, SP_MISC_INFO);
315	if ((tmp1 & 0xc0) == (0x80 | MODE2)) {
316		/*
317		 *      CS4231 or AD1845 detected - is it?
318		 *
319		 *	Verify that setting I2 doesn't change I18.
320		 */
321		ad_write(sc, 18, 0x88); /* Set I18 to known value */
322
323		ad_write(sc, 2, 0x45);
324		if ((tmp2 = ad_read(sc, 18)) != 0x45) { /* No change -> CS4231? */
325			ad_write(sc, 2, 0xaa);
326			if ((tmp2 = ad_read(sc, 18)) == 0xaa) {     /* Rotten bits? */
327				DPRINTF(("ad_detect_H(%x)\n", tmp2));
328				goto bad;
329			}
330
331			sc->mode = 2;
332
333			/*
334			 *  It's a CS4231, or another clone with 32 registers.
335			 *  Let's find out which by checking I25.
336			 */
337			if ((tmp1 & 0x8f) == 0x8a) {
338				tmp1 = ad_read(sc, CS_VERSION_ID);
339				switch (tmp1 & 0xe7) {
340				case 0xA0:
341					sc->chip_name = "CS4231A";
342					break;
343				case 0x80:
344					/*  XXX I25 no good, AD1845 same as CS4231 */
345					/*
346					 * XXX
347					 * This test is correct only after reset
348					 */
349					if (ad_read(sc, 17) & 0xf0) {
350						sc->chip_name = "AD1845";
351						sc->is_ad1845 = 1;
352					} else
353						sc->chip_name = "CS4231";
354					break;
355				case 0x82:
356					sc->chip_name = "CS4232";
357					break;
358				case 0xa2:
359					sc->chip_name = "CS4232C";
360					break;
361				case 0x03:
362				case 0x83:
363					sc->chip_name = "CS4236";
364
365					/*
366					 * Try to switch to mode3 (CS4236B or
367					 * CS4237B) by setting CMS to 3.  A
368					 * plain CS4236 will not react to
369					 * LLBM settings.
370					 */
371					ad_write(sc, SP_MISC_INFO, MODE3);
372
373					tmp1 = ad_read(sc, CS_LEFT_LINE_CONTROL);
374					ad_write(sc, CS_LEFT_LINE_CONTROL, 0xe0);
375					tmp2 = ad_read(sc, CS_LEFT_LINE_CONTROL);
376					if (tmp2 == 0xe0) {
377						/*
378						 * it's a CS4237B or another
379						 * clone supporting mode 3.
380						 * Let's determine which by
381						 * enabling extended registers
382						 * and checking X25.
383						 */
384						tmp2 = ad_xread(sc, CS_X_CHIP_VERSION);
385						switch (tmp2 & X_CHIP_VERSIONF_CID) {
386						case X_CHIP_CID_CS4236BB:
387							sc->chip_name = "CS4236BrevB";
388							break;
389						case X_CHIP_CID_CS4236B:
390							sc->chip_name = "CS4236B";
391							break;
392						case X_CHIP_CID_CS4237B:
393							sc->chip_name = "CS4237B";
394							break;
395						default:
396							sc->chip_name = "CS4236B compatible";
397							DPRINTF(("cs4236: unknown mode 3 compatible codec, version 0x%02x\n", tmp2));
398							break;
399						}
400						sc->mode = 3;
401					}
402
403					/* restore volume control information */
404					ad_write(sc, CS_LEFT_LINE_CONTROL, tmp1);
405					break;
406				}
407			}
408		}
409	}
410
411	/* Wait for 1848 to init */
412	while (ADREAD(sc, AD1848_IADDR) & SP_IN_INIT)
413		;
414
415	/* Wait for 1848 to autocal */
416	ADWRITE(sc, AD1848_IADDR, SP_TEST_AND_INIT);
417	while (ADREAD(sc, AD1848_IDATA) & AUTO_CAL_IN_PROG)
418		;
419
420	return 1;
421bad:
422	return 0;
423}
424
425/* Unmap the I/O ports */
426void
427ad1848_isa_unmap(struct ad1848_isa_softc *isc)
428{
429	struct ad1848_softc *sc;
430
431	sc = &isc->sc_ad1848;
432	bus_space_unmap(sc->sc_iot, sc->sc_ioh, AD1848_NPORT);
433}
434
435/*
436 * Attach hardware to driver, attach hardware driver to audio
437 * pseudo-device driver .
438 */
439void
440ad1848_isa_attach(struct ad1848_isa_softc *isc)
441{
442	struct ad1848_softc *sc;
443	int error;
444
445	sc = &isc->sc_ad1848;
446	sc->sc_readreg = ad1848_isa_read;
447	sc->sc_writereg = ad1848_isa_write;
448
449	if (isc->sc_playdrq != -1) {
450		isc->sc_play_maxsize = isa_dmamaxsize(isc->sc_ic,
451		    isc->sc_playdrq);
452		error = isa_dmamap_create(isc->sc_ic, isc->sc_playdrq,
453		    isc->sc_play_maxsize, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW);
454		if (error) {
455			aprint_error_dev(sc->sc_dev, "can't create map for drq %d\n",
456			    isc->sc_playdrq);
457			return;
458		}
459	}
460	if (isc->sc_recdrq != -1 && isc->sc_recdrq != isc->sc_playdrq) {
461		isc->sc_rec_maxsize = isa_dmamaxsize(isc->sc_ic,
462		    isc->sc_recdrq);
463		error = isa_dmamap_create(isc->sc_ic, isc->sc_recdrq,
464		    isc->sc_rec_maxsize, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW);
465		if (error) {
466			aprint_error_dev(sc->sc_dev, "can't create map for drq %d\n",
467			    isc->sc_recdrq);
468			isa_dmamap_destroy(isc->sc_ic, isc->sc_playdrq);
469			return;
470		}
471	}
472
473	ad1848_attach(sc);
474}
475
476int
477ad1848_isa_open(void *addr, int flags)
478{
479	struct ad1848_isa_softc *isc;
480	struct ad1848_softc *sc;
481	int error, state;
482
483	isc = addr;
484	sc = &isc->sc_ad1848;
485	DPRINTF(("ad1848_isa_open: sc=%p\n", isc));
486	state = 0;
487
488	if (isc->sc_playdrq != -1) {
489		error = isa_drq_alloc(isc->sc_ic, isc->sc_playdrq);
490		if (error != 0)
491			return EBUSY;
492		state |= 1;
493	}
494	if (isc->sc_recdrq != -1 && isc->sc_recdrq != isc->sc_playdrq) {
495		error = isa_drq_alloc(isc->sc_ic, isc->sc_recdrq);
496		if (error != 0)
497			goto bad;
498		state |= 2;
499	}
500
501#ifndef AUDIO_NO_POWER_CTL
502	/* Power-up chip */
503	if (isc->powerctl) {
504		KASSERT(mutex_owned(&sc->sc_intr_lock));
505		isc->powerctl(isc->powerarg, flags);
506	}
507#endif
508
509	/* Init and mute wave output */
510	ad1848_mute_wave_output(sc, WAVE_MUTE2_INIT, 1);
511
512	error = ad1848_open(sc, flags);
513	if (error) {
514#ifndef AUDIO_NO_POWER_CTL
515		if (isc->powerctl) {
516			KASSERT(mutex_owned(&sc->sc_intr_lock));
517			isc->powerctl(isc->powerarg, 0);
518		}
519#endif
520		goto bad;
521	}
522
523	DPRINTF(("ad1848_isa_open: opened\n"));
524	return 0;
525
526bad:
527	if (state & 1)
528		isa_drq_free(isc->sc_ic, isc->sc_playdrq);
529	if (state & 2)
530		isa_drq_free(isc->sc_ic, isc->sc_recdrq);
531
532	return error;
533}
534
535void
536ad1848_isa_close(void *addr)
537{
538	struct ad1848_isa_softc *isc;
539	struct ad1848_softc *sc;
540
541	DPRINTF(("ad1848_isa_close: stop DMA\n"));
542	isc = addr;
543	sc = &isc->sc_ad1848;
544	ad1848_close(sc);
545
546#ifndef AUDIO_NO_POWER_CTL
547	/* Power-down chip */
548	if (isc->powerctl) {
549		KASSERT(mutex_owned(&sc->sc_intr_lock));
550		isc->powerctl(isc->powerarg, 0);
551	}
552#endif
553
554	if (isc->sc_playdrq != -1)
555		isa_drq_free(isc->sc_ic, isc->sc_playdrq);
556	if (isc->sc_recdrq != -1 && isc->sc_recdrq != isc->sc_playdrq)
557		isa_drq_free(isc->sc_ic, isc->sc_recdrq);
558}
559
560int
561ad1848_isa_trigger_input(
562	void *addr,
563	void *start, void *end,
564	int blksize,
565	void (*intr)(void *),
566	void *arg,
567	const audio_params_t *param)
568{
569	struct ad1848_isa_softc *isc;
570	struct ad1848_softc *sc;
571	uint8_t reg;
572
573	isc = addr;
574	sc = &isc->sc_ad1848;
575	isa_dmastart(isc->sc_ic, isc->sc_recdrq, start,
576	    (char *)end - (char *)start, NULL,
577	    DMAMODE_READ | DMAMODE_LOOPDEMAND, BUS_DMA_NOWAIT);
578
579	isc->sc_recrun = 1;
580	if (sc->mode == 2 && isc->sc_playdrq != isc->sc_recdrq) {
581		isc->sc_rintr = intr;
582		isc->sc_rarg = arg;
583	} else {
584		isc->sc_pintr = intr;
585		isc->sc_parg = arg;
586	}
587
588	/*
589	 * Calculate number of transfers.
590	 * Note that ADPCM is always transferred 4 bytes at at a time.
591	 */
592	blksize = (param->encoding == AUDIO_ENCODING_ADPCM) ? blksize / 4 - 1 :
593	    (blksize * 8) / (param->precision * param->channels) - 1;
594
595	if (sc->mode >= 2) {
596		ad_write(sc, CS_LOWER_REC_CNT, blksize & 0xff);
597		ad_write(sc, CS_UPPER_REC_CNT, blksize >> 8);
598	} else {
599		ad_write(sc, SP_LOWER_BASE_COUNT, blksize & 0xff);
600		ad_write(sc, SP_UPPER_BASE_COUNT, blksize >> 8);
601	}
602
603	reg = ad_read(sc, SP_INTERFACE_CONFIG);
604	ad_write(sc, SP_INTERFACE_CONFIG, CAPTURE_ENABLE|reg);
605
606	return 0;
607}
608
609int
610ad1848_isa_trigger_output(
611	void *addr,
612	void *start, void *end,
613	int blksize,
614	void (*intr)(void *),
615	void *arg,
616	const audio_params_t *param)
617{
618	struct ad1848_isa_softc *isc;
619	struct ad1848_softc *sc;
620	uint8_t reg;
621
622	isc = addr;
623	sc = &isc->sc_ad1848;
624	isa_dmastart(isc->sc_ic, isc->sc_playdrq, start,
625	    (char *)end - (char *)start, NULL,
626	    DMAMODE_WRITE | DMAMODE_LOOPDEMAND, BUS_DMA_NOWAIT);
627
628	isc->sc_playrun = 1;
629	isc->sc_pintr = intr;
630	isc->sc_parg = arg;
631
632	/*
633	 * Calculate number of transfers.
634	 * Note that ADPCM is always transferred 4 bytes at at a time.
635	 */
636	blksize = (param->encoding == AUDIO_ENCODING_ADPCM) ? blksize / 4 - 1 :
637	    (blksize * 8) / (param->precision * param->channels) - 1;
638
639	ad_write(sc, SP_LOWER_BASE_COUNT, blksize & 0xff);
640	ad_write(sc, SP_UPPER_BASE_COUNT, blksize >> 8);
641
642	/* Unmute wave output */
643	ad1848_mute_wave_output(sc, WAVE_MUTE2, 0);
644
645	reg = ad_read(sc, SP_INTERFACE_CONFIG);
646	ad_write(sc, SP_INTERFACE_CONFIG, PLAYBACK_ENABLE|reg);
647
648	return 0;
649}
650
651int
652ad1848_isa_halt_input(void *addr)
653{
654	struct ad1848_isa_softc *isc;
655	struct ad1848_softc *sc;
656
657	isc = addr;
658	sc = &isc->sc_ad1848;
659	if (isc->sc_recrun) {
660		ad1848_halt_input(sc);
661		isa_dmaabort(isc->sc_ic, isc->sc_recdrq);
662		isc->sc_recrun = 0;
663	}
664
665	return 0;
666}
667
668int
669ad1848_isa_halt_output(void *addr)
670{
671	struct ad1848_isa_softc *isc;
672	struct ad1848_softc *sc;
673
674	isc = addr;
675	sc = &isc->sc_ad1848;
676	if (isc->sc_playrun) {
677		/* Mute wave output */
678		ad1848_mute_wave_output(sc, WAVE_MUTE2, 1);
679
680		ad1848_halt_output(sc);
681		isa_dmaabort(isc->sc_ic, isc->sc_playdrq);
682		isc->sc_playrun = 0;
683	}
684
685	return 0;
686}
687
688int
689ad1848_isa_intr(void *arg)
690{
691	struct ad1848_isa_softc *isc;
692	struct ad1848_softc *sc;
693	int retval;
694	u_char status;
695
696	isc = arg;
697	sc = &isc->sc_ad1848;
698
699	KASSERT(mutex_owned(&sc->sc_intr_lock));
700
701	retval = 0;
702	/* Get intr status */
703	status = ADREAD(sc, AD1848_STATUS);
704
705#ifdef AUDIO_DEBUG
706	if (ad1848debug > 1)
707		printf("ad1848_isa_intr: pintr=%p rintr=%p status=%x\n",
708		    isc->sc_pintr, isc->sc_rintr, status);
709#endif
710	isc->sc_interrupts++;
711
712	/* Handle interrupt */
713	if ((status & INTERRUPT_STATUS) != 0) {
714		if (sc->mode == 2 && isc->sc_playdrq != isc->sc_recdrq) {
715			status = ad_read(sc, CS_IRQ_STATUS);
716			if ((status & CS_IRQ_PI) && isc->sc_playrun) {
717				(*isc->sc_pintr)(isc->sc_parg);
718				retval = 1;
719			}
720			if ((status & CS_IRQ_CI) && isc->sc_recrun) {
721				(*isc->sc_rintr)(isc->sc_rarg);
722				retval = 1;
723			}
724		} else {
725			if (isc->sc_playrun) {
726				(*isc->sc_pintr)(isc->sc_parg);
727				retval = 1;
728			}
729		}
730
731		/* Clear interrupt */
732		ADWRITE(sc, AD1848_STATUS, 0);
733	}
734	return retval;
735}
736
737void *
738ad1848_isa_malloc(
739	void *addr,
740	int direction,
741	size_t size)
742{
743	struct ad1848_isa_softc *isc;
744	int drq;
745
746	isc = addr;
747	if (direction == AUMODE_PLAY)
748		drq = isc->sc_playdrq;
749	else
750		drq = isc->sc_recdrq;
751	return isa_malloc(isc->sc_ic, drq, size, M_DEVBUF, M_WAITOK);
752}
753
754void
755ad1848_isa_free(void *addr, void *ptr, size_t size)
756{
757
758	isa_free(ptr, M_DEVBUF);
759}
760
761size_t
762ad1848_isa_round_buffersize(void *addr, int direction, size_t size)
763{
764	struct ad1848_isa_softc *isc;
765	bus_size_t maxsize;
766
767	isc = addr;
768	if (direction == AUMODE_PLAY)
769		maxsize = isc->sc_play_maxsize;
770	else if (isc->sc_recdrq == isc->sc_playdrq)
771		maxsize = isc->sc_play_maxsize;
772	else
773		maxsize = isc->sc_rec_maxsize;
774
775	if (size > maxsize)
776		size = maxsize;
777	return size;
778}
779
780int
781ad1848_isa_get_props(void *addr)
782{
783	struct ad1848_isa_softc *isc;
784
785	isc = addr;
786	return AUDIO_PROP_PLAYBACK | AUDIO_PROP_CAPTURE |
787		(isc->sc_playdrq != isc->sc_recdrq ? AUDIO_PROP_FULLDUPLEX : 0);
788}
789