xref: /netbsd-src/sys/arch/zaurus/dev/zaudio.c (revision a5847cc334d9a7029f6352b847e9e8d71a0f9e0c)
1 /*	$NetBSD: zaudio.c,v 1.15 2011/06/23 10:56:03 nonaka Exp $	*/
2 /*	$OpenBSD: zaurus_audio.c,v 1.8 2005/08/18 13:23:02 robert Exp $	*/
3 
4 /*
5  * Copyright (c) 2005 Christopher Pascoe <pascoe@openbsd.org>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /*-
21  * Copyright (c) 2009 NONAKA Kimihiro <nonaka@netbsd.org>
22  * All rights reserved.
23  *
24  * Redistribution and use in source and binary forms, with or without
25  * modification, are permitted provided that the following conditions
26  * are met:
27  * 1. Redistributions of source code must retain the above copyright
28  *    notice, this list of conditions and the following disclaimer.
29  * 2. Redistributions in binary form must reproduce the above copyright
30  *    notice, this list of conditions and the following disclaimer in the
31  *    documentation and/or other materials provided with the distribution.
32  *
33  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
34  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
35  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
36  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
37  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
38  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
39  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
41  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
42  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43  * SUCH DAMAGE.
44  */
45 
46 /*
47  * TODO:
48  *	- powerhooks (currently only works until first suspend)
49  */
50 
51 #include "opt_zaudio.h"
52 
53 #include <sys/cdefs.h>
54 __KERNEL_RCSID(0, "$NetBSD: zaudio.c,v 1.15 2011/06/23 10:56:03 nonaka Exp $");
55 
56 #include <sys/param.h>
57 #include <sys/systm.h>
58 #include <sys/callout.h>
59 #include <sys/device.h>
60 #include <sys/malloc.h>
61 #include <sys/kernel.h>
62 #include <sys/audioio.h>
63 #include <sys/mutex.h>
64 #include <sys/intr.h>
65 #include <sys/bus.h>
66 
67 #include <dev/audio_if.h>
68 #include <dev/mulaw.h>
69 #include <dev/auconv.h>
70 
71 #include <dev/i2c/i2cvar.h>
72 
73 #include <arm/xscale/pxa2x0reg.h>
74 #include <arm/xscale/pxa2x0var.h>
75 #include <arm/xscale/pxa2x0_i2c.h>
76 #include <arm/xscale/pxa2x0_i2s.h>
77 #include <arm/xscale/pxa2x0_dmac.h>
78 #include <arm/xscale/pxa2x0_gpio.h>
79 
80 #include <zaurus/zaurus/zaurus_var.h>
81 #include <zaurus/dev/wm8750reg.h>
82 #include <zaurus/dev/scoopvar.h>
83 #include <zaurus/dev/ioexpvar.h>
84 
85 #define WM8750_ADDRESS  0x1B
86 
87 /* GPIO pins */
88 #define GPIO_HP_IN_C3000	116
89 
90 #define ZAUDIO_OP_SPKR	0
91 #define ZAUDIO_OP_HP	1
92 #define ZAUDIO_OP_MIC	2
93 #define ZAUDIO_OP_NUM	3
94 
95 #define ZAUDIO_JACK_STATE_OUT	0
96 #define ZAUDIO_JACK_STATE_IN	1
97 #define ZAUDIO_JACK_STATE_INS	2
98 #define ZAUDIO_JACK_STATE_REM	3
99 
100 struct zaudio_volume {
101 	uint8_t	left;
102 	uint8_t	right;
103 };
104 
105 struct zaudio_softc {
106 	device_t		sc_dev;
107 
108 	/* i2s device softc */
109 	/* NB: pxa2x0_i2s requires this to be the second struct member */
110 	struct pxa2x0_i2s_softc	sc_i2s;
111 
112 	i2c_tag_t		sc_i2c;
113 
114 	int			sc_playing;
115 	int			sc_recording;
116 
117 	struct zaudio_volume	sc_volume[ZAUDIO_OP_NUM];
118 	uint8_t			sc_unmute[ZAUDIO_OP_NUM];
119 	uint8_t			sc_unmute_toggle[ZAUDIO_OP_NUM];
120 
121 	int			sc_state;
122 	int			sc_icount;
123 	struct callout		sc_to;
124 };
125 
126 #define	UNMUTE(sc,op,val) sc->sc_unmute[op] = sc->sc_unmute_toggle[op] = val
127 
128 static int	zaudio_match(device_t, cfdata_t, void *);
129 static void	zaudio_attach(device_t, device_t, void *);
130 
131 CFATTACH_DECL_NEW(zaudio, sizeof(struct zaudio_softc),
132     zaudio_match, zaudio_attach, NULL, NULL);
133 
134 static bool	zaudio_suspend(device_t, const pmf_qual_t *);
135 static bool	zaudio_resume(device_t, const pmf_qual_t *);
136 static void	zaudio_volume_up(device_t);
137 static void	zaudio_volume_down(device_t);
138 static void	zaudio_volume_toggle(device_t);
139 
140 static struct audio_device wm8750_device = {
141 	"WM8750",
142 	"1.0",
143 	"wm"
144 };
145 
146 static const struct audio_format zaudio_formats[] = {
147 	{
148 		.driver_data	= NULL,
149 		.mode		= AUMODE_PLAY | AUMODE_RECORD,
150 		.encoding	= AUDIO_ENCODING_SLINEAR_LE,
151 		.validbits	= 16,
152 		.precision	= 16,
153 		.channels	= 2,
154 		.channel_mask	= AUFMT_STEREO,
155 		.frequency_type	= 0,
156 		.frequency	= { 4000, 48000 }
157 	},
158 	{
159 		.driver_data	= NULL,
160 		.mode		= AUMODE_PLAY | AUMODE_RECORD,
161 		.encoding	= AUDIO_ENCODING_SLINEAR_LE,
162 		.validbits	= 16,
163 		.precision	= 16,
164 		.channels	= 1,
165 		.channel_mask	= AUFMT_MONAURAL,
166 		.frequency_type	= 0,
167 		.frequency	= { 4000, 48000 }
168 	},
169 	{
170 		.driver_data	= NULL,
171 		.mode		= AUMODE_PLAY | AUMODE_RECORD,
172 		.encoding	= AUDIO_ENCODING_ULINEAR_LE,
173 		.validbits	= 8,
174 		.precision	= 8,
175 		.channels	= 2,
176 		.channel_mask	= AUFMT_STEREO,
177 		.frequency_type	= 0,
178 		.frequency	= { 4000, 48000 }
179 	},
180 	{
181 		.driver_data	= NULL,
182 		.mode		= AUMODE_PLAY | AUMODE_RECORD,
183 		.encoding	= AUDIO_ENCODING_ULINEAR_LE,
184 		.validbits	= 8,
185 		.precision	= 8,
186 		.channels	= 1,
187 		.channel_mask	= AUFMT_MONAURAL,
188 		.frequency_type	= 0,
189 		.frequency	= { 4000, 48000 }
190 	},
191 };
192 static const int zaudio_nformats = (int)__arraycount(zaudio_formats);
193 
194 static void zaudio_init(struct zaudio_softc *);
195 static int zaudio_jack_intr(void *);
196 static void zaudio_jack(void *);
197 static void zaudio_standby(struct zaudio_softc *);
198 static void zaudio_update_volume(struct zaudio_softc *, int);
199 static void zaudio_update_mutes(struct zaudio_softc *, int);
200 static void zaudio_play_setup(struct zaudio_softc *);
201 /*static*/ void zaudio_record_setup(struct zaudio_softc *);
202 static int zaudio_open(void *, int);
203 static void zaudio_close(void *);
204 static int zaudio_query_encoding(void *, struct audio_encoding *);
205 static int zaudio_set_params(void *, int, int, audio_params_t *,
206     audio_params_t *, stream_filter_list_t *, stream_filter_list_t *);
207 static int zaudio_round_blocksize(void *, int, int, const audio_params_t *);
208 static int zaudio_start_output(void *, void *, int, void (*)(void *), void *);
209 static int zaudio_start_input(void *, void *, int, void (*)(void *), void *);
210 static int zaudio_halt_output(void *);
211 static int zaudio_halt_input(void *);
212 static int zaudio_getdev(void *, struct audio_device *);
213 static int zaudio_set_port(void *, struct mixer_ctrl *);
214 static int zaudio_get_port(void *, struct mixer_ctrl *);
215 static int zaudio_query_devinfo(void *, struct mixer_devinfo *);
216 static void *zaudio_allocm(void *, int, size_t, struct malloc_type *, int);
217 static void zaudio_freem(void  *, void *, struct malloc_type *);
218 static size_t zaudio_round_buffersize(void *, int, size_t);
219 static paddr_t zaudio_mappage(void *, void *, off_t, int);
220 static int zaudio_get_props(void *);
221 
222 struct audio_hw_if wm8750_hw_if = {
223 	.open			= zaudio_open,
224 	.close			= zaudio_close,
225 	.drain			= NULL,
226 	.query_encoding		= zaudio_query_encoding,
227 	.set_params		= zaudio_set_params,
228 	.round_blocksize	= zaudio_round_blocksize,
229 	.commit_settings	= NULL,
230 	.init_output		= NULL,
231 	.init_input		= NULL,
232 	.start_output		= zaudio_start_output,
233 	.start_input		= zaudio_start_input,
234 	.halt_output		= zaudio_halt_output,
235 	.halt_input		= zaudio_halt_input,
236 	.speaker_ctl		= NULL,
237 	.getdev			= zaudio_getdev,
238 	.setfd			= NULL,
239 	.set_port		= zaudio_set_port,
240 	.get_port		= zaudio_get_port,
241 	.query_devinfo		= zaudio_query_devinfo,
242 	.allocm			= zaudio_allocm,
243 	.freem			= zaudio_freem,
244 	.round_buffersize	= zaudio_round_buffersize,
245 	.mappage		= zaudio_mappage,
246 	.get_props		= zaudio_get_props,
247 	.trigger_output		= NULL,
248 	.trigger_input		= NULL,
249 	.dev_ioctl		= NULL,
250 	.powerstate		= NULL,
251 };
252 
253 static const uint16_t playback_regs[][2] = {
254 	/* Unmute DAC */
255 	{ ADCDACCTL_REG, 0x000 },
256 
257 	/* 16 bit audio words */
258 	{ AUDINT_REG, AUDINT_SET_FORMAT(2) },
259 
260 	/* Enable thermal protection, power */
261 	{ ADCTL1_REG, ADCTL1_TSDEN | ADCTL1_SET_VSEL(3) },
262 
263 	/* Enable speaker driver, DAC oversampling */
264 	{ ADCTL2_REG, ADCTL2_ROUT2INV | ADCTL2_DACOSR },
265 
266 	/* Set DAC voltage references */
267 	{ PWRMGMT1_REG, PWRMGMT1_SET_VMIDSEL(1) | PWRMGMT1_VREF },
268 
269 	/* Direct DACs to output mixers */
270 	{ LOUTMIX1_REG, LOUTMIX1_LD2LO },
271 	{ LOUTMIX2_REG, 0x000 },
272 	{ ROUTMIX1_REG, 0x000 },
273 	{ ROUTMIX2_REG, ROUTMIX2_RD2RO },
274 
275 	/* End of list */
276 	{ 0xffff, 0xffff }
277 };
278 
279 static const uint16_t record_regs[][2] = {
280 	/* Unmute DAC */
281 	{ ADCDACCTL_REG, 0x000 },
282 
283 	/* 16 bit audio words */
284 	{ AUDINT_REG, AUDINT_SET_FORMAT(2) },
285 
286 	/* Enable thermal protection, power, left DAC for both channel */
287 	{ ADCTL1_REG, ADCTL1_TSDEN | ADCTL1_SET_VSEL(3)
288 	              | ADCTL1_SET_DATSEL(1) },
289 
290 	/* Diffrential input select: LINPUT1-RINPUT1, stereo */
291 	{ ADCINPMODE_REG, 0x000 },
292 
293 	/* L-R differential, micboost 20dB */
294 	{ ADCLSPATH_REG, ADCLSPATH_SET_LINSEL(3) | ADCLSPATH_SET_LMICBOOST(2) },
295 	{ ADCRSPATH_REG, ADCRSPATH_SET_RINSEL(3) | ADCRSPATH_SET_RMICBOOST(2) },
296 
297 	/* End of list */
298 	{ 0xffff, 0xffff }
299 };
300 
301 static __inline int
302 wm8750_write(struct zaudio_softc *sc, int reg, int val)
303 {
304 	uint16_t tmp;
305 	uint8_t cmd;
306 	uint8_t data;
307 
308 	tmp = (reg << 9) | (val & 0x1ff);
309 	cmd = tmp >> 8;
310 	data = tmp;
311 	return iic_exec(sc->sc_i2c, I2C_OP_WRITE_WITH_STOP, WM8750_ADDRESS,
312 	    &cmd, 1, &data, 1, 0);
313 }
314 
315 static int
316 zaudio_match(device_t parent, cfdata_t cf, void *aux)
317 {
318 	struct i2c_attach_args *ia = aux;
319 
320 	if (ia->ia_name) {
321 		/* direct config - check name */
322 		if (strcmp(ia->ia_name, "zaudio") == 0)
323 			return 1;
324 	} else {
325 		/* indirect config - check typical address */
326 		if (ia->ia_addr == WM8750_ADDRESS)
327 			return 1;
328 	}
329 	return 0;
330 }
331 
332 static void
333 zaudio_attach(device_t parent, device_t self, void *aux)
334 {
335 	struct zaudio_softc *sc = device_private(self);
336 	struct i2c_attach_args *ia = aux;
337 	int error;
338 
339 	sc->sc_dev = self;
340 	sc->sc_i2c = ia->ia_tag;
341 
342 	aprint_normal(": I2S, WM8750 Audio\n");
343 	aprint_naive("\n");
344 
345 	sc->sc_i2s.sc_iot = &pxa2x0_bs_tag;
346 	sc->sc_i2s.sc_dmat = &pxa2x0_bus_dma_tag;
347 	sc->sc_i2s.sc_size = PXA2X0_I2S_SIZE;
348 	if (pxa2x0_i2s_attach_sub(&sc->sc_i2s)) {
349 		aprint_error_dev(self, "unable to attach I2S\n");
350 		goto fail_i2s;
351 	}
352 
353 	/* Check for an I2C response from the wm8750 */
354 	iic_acquire_bus(sc->sc_i2c, 0);
355 	error = wm8750_write(sc, RESET_REG, 0);
356 	iic_release_bus(sc->sc_i2c, 0);
357 	if (error) {
358 		aprint_error_dev(self, "codec failed to respond\n");
359 		goto fail_i2c;
360 	}
361 	delay(100);
362 
363 	/* Speaker on, headphones off by default. */
364 	sc->sc_volume[ZAUDIO_OP_SPKR].left = 180;
365 	UNMUTE(sc, ZAUDIO_OP_SPKR, 1);
366 	sc->sc_volume[ZAUDIO_OP_HP].left = 180;
367 	sc->sc_volume[ZAUDIO_OP_HP].right = 180;
368 	UNMUTE(sc, ZAUDIO_OP_HP, 0);
369 	sc->sc_volume[ZAUDIO_OP_MIC].left = 180;
370 	UNMUTE(sc, ZAUDIO_OP_MIC, 0);
371 
372 	/* Configure headphone jack state change handling. */
373 	callout_init(&sc->sc_to, 0);
374 	callout_setfunc(&sc->sc_to, zaudio_jack, sc);
375 	pxa2x0_gpio_set_function(GPIO_HP_IN_C3000, GPIO_IN);
376 	(void) pxa2x0_gpio_intr_establish(GPIO_HP_IN_C3000, IST_EDGE_BOTH,
377 	    IPL_BIO, zaudio_jack_intr, sc);
378 
379 	zaudio_init(sc);
380 
381 	audio_attach_mi(&wm8750_hw_if, sc, self);
382 
383 	if (!pmf_device_register(self, zaudio_suspend, zaudio_resume))
384 		aprint_error_dev(self, "couldn't establish power handler\n");
385 	if (!pmf_event_register(self, PMFE_AUDIO_VOLUME_UP,
386 	    zaudio_volume_up, true))
387 		aprint_error_dev(self, "couldn't register event handler\n");
388 	if (!pmf_event_register(self, PMFE_AUDIO_VOLUME_DOWN,
389 	    zaudio_volume_down, true))
390 		aprint_error_dev(self, "couldn't register event handler\n");
391 	if (!pmf_event_register(self, PMFE_AUDIO_VOLUME_TOGGLE,
392 	    zaudio_volume_toggle, true))
393 		aprint_error_dev(self, "couldn't register event handler\n");
394 
395 	return;
396 
397 fail_i2c:
398 	pxa2x0_i2s_detach_sub(&sc->sc_i2s);
399 fail_i2s:
400 	pmf_device_deregister(self);
401 }
402 
403 static bool
404 zaudio_suspend(device_t dv, const pmf_qual_t *qual)
405 {
406 	struct zaudio_softc *sc = device_private(dv);
407 
408 	callout_stop(&sc->sc_to);
409 	zaudio_standby(sc);
410 
411 	return true;
412 }
413 
414 static bool
415 zaudio_resume(device_t dv, const pmf_qual_t *qual)
416 {
417 	struct zaudio_softc *sc = device_private(dv);
418 
419 	pxa2x0_i2s_init(&sc->sc_i2s);
420 	zaudio_init(sc);
421 
422 	return true;
423 }
424 
425 static __inline uint8_t
426 vol_sadd(int vol, int stride)
427 {
428 
429 	vol += stride;
430 	if (vol > 255)
431 		return 255;
432 	return (uint8_t)vol;
433 }
434 
435 #ifndef	ZAUDIO_VOLUME_STRIDE
436 #define	ZAUDIO_VOLUME_STRIDE	8
437 #endif
438 
439 static void
440 zaudio_volume_up(device_t dv)
441 {
442 	struct zaudio_softc *sc = device_private(dv);
443 	int s;
444 
445 	s = splbio();
446 	iic_acquire_bus(sc->sc_i2c, 0);
447 
448 	sc->sc_volume[ZAUDIO_OP_SPKR].left =
449 	    vol_sadd(sc->sc_volume[ZAUDIO_OP_SPKR].left, ZAUDIO_VOLUME_STRIDE);
450 	sc->sc_volume[ZAUDIO_OP_HP].left =
451 	    vol_sadd(sc->sc_volume[ZAUDIO_OP_HP].left, ZAUDIO_VOLUME_STRIDE);
452 	sc->sc_volume[ZAUDIO_OP_HP].right =
453 	    vol_sadd(sc->sc_volume[ZAUDIO_OP_HP].right, ZAUDIO_VOLUME_STRIDE);
454 
455 	zaudio_update_volume(sc, ZAUDIO_OP_SPKR);
456 	zaudio_update_volume(sc, ZAUDIO_OP_HP);
457 
458 	iic_release_bus(sc->sc_i2c, 0);
459 	splx(s);
460 }
461 
462 static __inline uint8_t
463 vol_ssub(int vol, int stride)
464 {
465 
466 	vol -= stride;
467 	if (vol < 0)
468 		return 0;
469 	return (uint8_t)vol;
470 }
471 
472 static void
473 zaudio_volume_down(device_t dv)
474 {
475 	struct zaudio_softc *sc = device_private(dv);
476 	int s;
477 
478 	s = splbio();
479 	iic_acquire_bus(sc->sc_i2c, 0);
480 
481 	sc->sc_volume[ZAUDIO_OP_SPKR].left =
482 	    vol_ssub(sc->sc_volume[ZAUDIO_OP_SPKR].left, ZAUDIO_VOLUME_STRIDE);
483 	sc->sc_volume[ZAUDIO_OP_HP].left =
484 	    vol_ssub(sc->sc_volume[ZAUDIO_OP_HP].left, ZAUDIO_VOLUME_STRIDE);
485 	sc->sc_volume[ZAUDIO_OP_HP].right =
486 	    vol_ssub(sc->sc_volume[ZAUDIO_OP_HP].right, ZAUDIO_VOLUME_STRIDE);
487 
488 	zaudio_update_volume(sc, ZAUDIO_OP_SPKR);
489 	zaudio_update_volume(sc, ZAUDIO_OP_HP);
490 
491 	iic_release_bus(sc->sc_i2c, 0);
492 	splx(s);
493 }
494 
495 static void
496 zaudio_volume_toggle(device_t dv)
497 {
498 	struct zaudio_softc *sc = device_private(dv);
499 	int s;
500 
501 	s = splbio();
502 	iic_acquire_bus(sc->sc_i2c, 0);
503 
504 	if (!sc->sc_unmute[ZAUDIO_OP_SPKR] && !sc->sc_unmute[ZAUDIO_OP_HP]) {
505 		sc->sc_unmute[ZAUDIO_OP_SPKR] =
506 		    sc->sc_unmute_toggle[ZAUDIO_OP_SPKR];
507 		sc->sc_unmute[ZAUDIO_OP_HP] =
508 		    sc->sc_unmute_toggle[ZAUDIO_OP_HP];
509 	} else {
510 		sc->sc_unmute[ZAUDIO_OP_SPKR] = 0;
511 		sc->sc_unmute[ZAUDIO_OP_HP] = 0;
512 	}
513 	zaudio_update_mutes(sc, 1);
514 
515 	iic_release_bus(sc->sc_i2c, 0);
516 	splx(s);
517 }
518 
519 static void
520 zaudio_init(struct zaudio_softc *sc)
521 {
522 
523 	iic_acquire_bus(sc->sc_i2c, 0);
524 
525 	/* Reset the codec */
526 	wm8750_write(sc, RESET_REG, 0);
527 	delay(100);
528 
529 	/* Switch to standby power only */
530 	wm8750_write(sc, PWRMGMT1_REG, PWRMGMT1_SET_VMIDSEL(2));
531 	wm8750_write(sc, PWRMGMT2_REG, 0);
532 
533 	/* Configure digital interface for I2S */
534 	wm8750_write(sc, AUDINT_REG, AUDINT_SET_FORMAT(2));
535 
536 	/* Initialise volume levels */
537 	zaudio_update_volume(sc, ZAUDIO_OP_SPKR);
538 	zaudio_update_volume(sc, ZAUDIO_OP_HP);
539 	zaudio_update_volume(sc, ZAUDIO_OP_MIC);
540 
541 	scoop_set_headphone(0);
542 	if (ZAURUS_ISC1000)
543 		ioexp_set_mic_bias(0);
544 	else
545 		scoop_set_mic_bias(0);
546 
547 	iic_release_bus(sc->sc_i2c, 0);
548 
549 	/* Assume that the jack state has changed. */
550 	zaudio_jack(sc);
551 }
552 
553 static int
554 zaudio_jack_intr(void *v)
555 {
556 	struct zaudio_softc *sc = v;
557 
558 	if (!callout_active(&sc->sc_to))
559 		zaudio_jack(sc);
560 
561 	return 1;
562 }
563 
564 static void
565 zaudio_jack(void *v)
566 {
567 	struct zaudio_softc *sc = v;
568 
569 	switch (sc->sc_state) {
570 	case ZAUDIO_JACK_STATE_OUT:
571 		if (pxa2x0_gpio_get_bit(GPIO_HP_IN_C3000)) {
572 			sc->sc_state = ZAUDIO_JACK_STATE_INS;
573 			sc->sc_icount = 0;
574 		}
575 		break;
576 
577 	case ZAUDIO_JACK_STATE_INS:
578 		if (sc->sc_icount++ > 2) {
579 			if (pxa2x0_gpio_get_bit(GPIO_HP_IN_C3000)) {
580 				sc->sc_state = ZAUDIO_JACK_STATE_IN;
581 				UNMUTE(sc, ZAUDIO_OP_SPKR, 0);
582 				UNMUTE(sc, ZAUDIO_OP_HP, 1);
583 				UNMUTE(sc, ZAUDIO_OP_MIC, 1);
584 				goto update_mutes;
585 			} else
586 				sc->sc_state = ZAUDIO_JACK_STATE_OUT;
587 		}
588 		break;
589 
590 	case ZAUDIO_JACK_STATE_IN:
591 		if (!pxa2x0_gpio_get_bit(GPIO_HP_IN_C3000)) {
592 			sc->sc_state = ZAUDIO_JACK_STATE_REM;
593 			sc->sc_icount = 0;
594 		}
595 		break;
596 
597 	case ZAUDIO_JACK_STATE_REM:
598 		if (sc->sc_icount++ > 2) {
599 			if (!pxa2x0_gpio_get_bit(GPIO_HP_IN_C3000)) {
600 				sc->sc_state = ZAUDIO_JACK_STATE_OUT;
601 				UNMUTE(sc, ZAUDIO_OP_SPKR, 1);
602 				UNMUTE(sc, ZAUDIO_OP_HP, 0);
603 				UNMUTE(sc, ZAUDIO_OP_MIC, 0);
604 				goto update_mutes;
605 			} else
606 				sc->sc_state = ZAUDIO_JACK_STATE_IN;
607 		}
608 		break;
609 	}
610 
611 	callout_schedule(&sc->sc_to, hz/4);
612 
613 	return;
614 
615 update_mutes:
616 	callout_stop(&sc->sc_to);
617 
618 	if (sc->sc_playing || sc->sc_recording) {
619 		iic_acquire_bus(sc->sc_i2c, 0);
620 		if (sc->sc_playing)
621 			zaudio_update_mutes(sc, 1);
622 		if (sc->sc_recording)
623 			zaudio_update_mutes(sc, 2);
624 		iic_release_bus(sc->sc_i2c, 0);
625 	}
626 }
627 
628 static void
629 zaudio_standby(struct zaudio_softc *sc)
630 {
631 
632 	iic_acquire_bus(sc->sc_i2c, 0);
633 
634 	/* Switch codec to standby power only */
635 	wm8750_write(sc, PWRMGMT1_REG, PWRMGMT1_SET_VMIDSEL(2));
636 	wm8750_write(sc, PWRMGMT2_REG, 0);
637 
638 	scoop_set_headphone(0);
639 	if (ZAURUS_ISC1000)
640 		ioexp_set_mic_bias(0);
641 	else
642 		scoop_set_mic_bias(0);
643 
644 	iic_release_bus(sc->sc_i2c, 0);
645 }
646 
647 static void
648 zaudio_update_volume(struct zaudio_softc *sc, int output)
649 {
650 
651 	switch (output) {
652 	case ZAUDIO_OP_SPKR:
653 		wm8750_write(sc, LOUT2VOL_REG, LOUT2VOL_LO2VU | LOUT2VOL_LO2ZC |
654 		    LOUT2VOL_SET_LOUT2VOL(sc->sc_volume[ZAUDIO_OP_SPKR].left >> 1));
655 		wm8750_write(sc, ROUT2VOL_REG, ROUT2VOL_RO2VU | ROUT2VOL_RO2ZC |
656 		    ROUT2VOL_SET_ROUT2VOL(sc->sc_volume[ZAUDIO_OP_SPKR].left >> 1));
657 		break;
658 
659 	case ZAUDIO_OP_HP:
660 		wm8750_write(sc, LOUT1VOL_REG, LOUT1VOL_LO1VU | LOUT1VOL_LO1ZC |
661 		    LOUT1VOL_SET_LOUT1VOL(sc->sc_volume[ZAUDIO_OP_HP].left >> 1));
662 		wm8750_write(sc, ROUT1VOL_REG, ROUT1VOL_RO1VU | ROUT1VOL_RO1ZC |
663 		    ROUT1VOL_SET_ROUT1VOL(sc->sc_volume[ZAUDIO_OP_HP].right >> 1));
664 		break;
665 
666 	case ZAUDIO_OP_MIC:
667 		wm8750_write(sc, LINVOL_REG, LINVOL_LIVU |
668 		    LINVOL_SET_LINVOL(sc->sc_volume[ZAUDIO_OP_MIC].left >> 2));
669 		wm8750_write(sc, RINVOL_REG, RINVOL_RIVU |
670 		    RINVOL_SET_RINVOL(sc->sc_volume[ZAUDIO_OP_MIC].left >> 2));
671 		break;
672 	}
673 }
674 
675 static void
676 zaudio_update_mutes(struct zaudio_softc *sc, int mask)
677 {
678 	uint16_t val;
679 
680 	/* playback */
681 	if (mask & 1) {
682 		val = PWRMGMT2_DACL | PWRMGMT2_DACR;
683 		if (sc->sc_unmute[ZAUDIO_OP_SPKR])
684 			val |= PWRMGMT2_LOUT2 | PWRMGMT2_ROUT2;
685 		if (sc->sc_unmute[ZAUDIO_OP_HP])
686 			val |= PWRMGMT2_LOUT1 | PWRMGMT2_ROUT1;
687 		wm8750_write(sc, PWRMGMT2_REG, val);
688 		scoop_set_headphone(sc->sc_unmute[ZAUDIO_OP_HP]);
689 	}
690 
691 	/* record */
692 	if (mask & 2) {
693 		val = PWRMGMT1_SET_VMIDSEL(1) | PWRMGMT1_VREF;
694 		if (sc->sc_unmute[ZAUDIO_OP_MIC]) {
695 			val |= PWRMGMT1_AINL | PWRMGMT1_AINR
696 			       | PWRMGMT1_ADCL | PWRMGMT1_ADCR | PWRMGMT1_MICB;
697 		}
698 		wm8750_write(sc, PWRMGMT1_REG, val);
699 		if (ZAURUS_ISC1000)
700 			ioexp_set_mic_bias(sc->sc_unmute[ZAUDIO_OP_MIC]);
701 		else
702 			scoop_set_mic_bias(sc->sc_unmute[ZAUDIO_OP_MIC]);
703 	}
704 }
705 
706 static void
707 zaudio_play_setup(struct zaudio_softc *sc)
708 {
709 	int i;
710 
711 	iic_acquire_bus(sc->sc_i2c, 0);
712 
713 	/* Program the codec with playback settings */
714 	for (i = 0; playback_regs[i][0] != 0xffff; i++) {
715 		wm8750_write(sc, playback_regs[i][0], playback_regs[i][1]);
716 	}
717 	zaudio_update_mutes(sc, 1);
718 
719 	iic_release_bus(sc->sc_i2c, 0);
720 }
721 
722 /*static*/ void
723 zaudio_record_setup(struct zaudio_softc *sc)
724 {
725 	int i;
726 
727 	iic_acquire_bus(sc->sc_i2c, 0);
728 
729 	/* Program the codec with playback settings */
730 	for (i = 0; record_regs[i][0] != 0xffff; i++) {
731 		wm8750_write(sc, record_regs[i][0], record_regs[i][1]);
732 	}
733 	zaudio_update_mutes(sc, 2);
734 
735 	iic_release_bus(sc->sc_i2c, 0);
736 }
737 
738 /*
739  * audio operation functions.
740  */
741 static int
742 zaudio_open(void *hdl, int flags)
743 {
744 	struct zaudio_softc *sc = hdl;
745 
746 	/* Power on the I2S bus and codec */
747 	pxa2x0_i2s_open(&sc->sc_i2s);
748 
749 	return 0;
750 }
751 
752 static void
753 zaudio_close(void *hdl)
754 {
755 	struct zaudio_softc *sc = hdl;
756 
757 	/* Power off the I2S bus and codec */
758 	pxa2x0_i2s_close(&sc->sc_i2s);
759 }
760 
761 static int
762 zaudio_query_encoding(void *hdl, struct audio_encoding *aep)
763 {
764 
765 	switch (aep->index) {
766 	case 0:
767 		strlcpy(aep->name, AudioEulinear, sizeof(aep->name));
768 		aep->encoding = AUDIO_ENCODING_ULINEAR;
769 		aep->precision = 8;
770 		aep->flags = 0;
771 		break;
772 
773 	case 1:
774 		strlcpy(aep->name, AudioEmulaw, sizeof(aep->name));
775 		aep->encoding = AUDIO_ENCODING_ULAW;
776 		aep->precision = 8;
777 		aep->flags = AUDIO_ENCODINGFLAG_EMULATED;
778 		break;
779 
780 	case 2:
781 		strlcpy(aep->name, AudioEalaw, sizeof(aep->name));
782 		aep->encoding = AUDIO_ENCODING_ALAW;
783 		aep->precision = 8;
784 		aep->flags = AUDIO_ENCODINGFLAG_EMULATED;
785 		break;
786 
787 	case 3:
788 		strlcpy(aep->name, AudioEslinear, sizeof(aep->name));
789 		aep->encoding = AUDIO_ENCODING_SLINEAR;
790 		aep->precision = 8;
791 		aep->flags = AUDIO_ENCODINGFLAG_EMULATED;
792 		break;
793 
794 	case 4:
795 		strlcpy(aep->name, AudioEslinear_le, sizeof(aep->name));
796 		aep->encoding = AUDIO_ENCODING_SLINEAR_LE;
797 		aep->precision = 16;
798 		aep->flags = 0;
799 		break;
800 
801 	case 5:
802 		strlcpy(aep->name, AudioEulinear_le, sizeof(aep->name));
803 		aep->encoding = AUDIO_ENCODING_ULINEAR_LE;
804 		aep->precision = 16;
805 		aep->flags = AUDIO_ENCODINGFLAG_EMULATED;
806 		break;
807 
808 	case 6:
809 		strlcpy(aep->name, AudioEslinear_be, sizeof(aep->name));
810 		aep->encoding = AUDIO_ENCODING_SLINEAR_BE;
811 		aep->precision = 16;
812 		aep->flags = AUDIO_ENCODINGFLAG_EMULATED;
813 		break;
814 
815 	case 7:
816 		strlcpy(aep->name, AudioEulinear_be, sizeof(aep->name));
817 		aep->encoding = AUDIO_ENCODING_ULINEAR_BE;
818 		aep->precision = 16;
819 		aep->flags = AUDIO_ENCODINGFLAG_EMULATED;
820 		break;
821 
822 	default:
823 		return EINVAL;
824 	}
825 
826 	return 0;
827 }
828 
829 static int
830 zaudio_set_params(void *hdl, int setmode, int usemode, audio_params_t *play,
831     audio_params_t *rec, stream_filter_list_t *pfil, stream_filter_list_t *rfil)
832 {
833 	struct zaudio_softc *sc = hdl;
834 	struct audio_params *p;
835 	stream_filter_list_t *fil;
836 	int mode, i;
837 
838 	if (play->sample_rate != rec->sample_rate &&
839 	    usemode == (AUMODE_PLAY | AUMODE_RECORD)) {
840 		if (setmode == AUMODE_PLAY) {
841 			rec->sample_rate = play->sample_rate;
842 			setmode |= AUMODE_RECORD;
843 		} else if (setmode == AUMODE_RECORD) {
844 			play->sample_rate = rec->sample_rate;
845 			setmode |= AUMODE_PLAY;
846 		} else
847 			return EINVAL;
848 	}
849 
850 	for (mode = AUMODE_RECORD; mode != -1;
851 	     mode = (mode == AUMODE_RECORD) ? AUMODE_PLAY : -1) {
852 		if ((setmode & mode) == 0)
853 			continue;
854 
855 		p = (mode == AUMODE_PLAY) ? play : rec;
856 
857 		if (p->sample_rate < 4000 || p->sample_rate > 48000 ||
858 		    (p->precision != 8 && p->precision != 16) ||
859 		    (p->channels != 1 && p->channels != 2))
860 			return EINVAL;
861 
862 		fil = (mode == AUMODE_PLAY) ? pfil : rfil;
863 		i = auconv_set_converter(zaudio_formats, zaudio_nformats,
864 					 mode, p, false, fil);
865 		if (i < 0)
866 			return EINVAL;
867 	}
868 
869 	if (setmode == AUMODE_RECORD)
870 		pxa2x0_i2s_setspeed(&sc->sc_i2s, &rec->sample_rate);
871 	else
872 		pxa2x0_i2s_setspeed(&sc->sc_i2s, &play->sample_rate);
873 
874 	return 0;
875 }
876 
877 static int
878 zaudio_round_blocksize(void *hdl, int bs, int mode, const audio_params_t *param)
879 {
880 	struct zaudio_softc *sc = hdl;
881 
882 	return pxa2x0_i2s_round_blocksize(&sc->sc_i2s, bs, mode, param);
883 }
884 
885 static int
886 zaudio_halt_output(void *hdl)
887 {
888 	struct zaudio_softc *sc = hdl;
889 	int rv;
890 
891 	rv = pxa2x0_i2s_halt_output(&sc->sc_i2s);
892 	if (!sc->sc_recording)
893 		zaudio_standby(sc);
894 	sc->sc_playing = 0;
895 
896 	return rv;
897 }
898 
899 static int
900 zaudio_halt_input(void *hdl)
901 {
902 	struct zaudio_softc *sc = hdl;
903 	int rv;
904 
905 	rv = pxa2x0_i2s_halt_input(&sc->sc_i2s);
906 	if (!sc->sc_playing)
907 		zaudio_standby(sc);
908 	sc->sc_recording = 0;
909 
910 	return rv;
911 }
912 
913 static int
914 zaudio_getdev(void *hdl, struct audio_device *ret)
915 {
916 
917 	*ret = wm8750_device;
918 	return 0;
919 }
920 
921 #define ZAUDIO_SPKR_LVL		0
922 #define ZAUDIO_SPKR_MUTE	1
923 #define ZAUDIO_HP_LVL		2
924 #define ZAUDIO_HP_MUTE		3
925 #define ZAUDIO_MIC_LVL		4
926 #define ZAUDIO_MIC_MUTE		5
927 #define ZAUDIO_RECORD_SOURCE	6
928 #define ZAUDIO_OUTPUT_CLASS	7
929 #define ZAUDIO_INPUT_CLASS	8
930 #define ZAUDIO_RECORD_CLASS	9
931 
932 static int
933 zaudio_set_port(void *hdl, struct mixer_ctrl *mc)
934 {
935 	struct zaudio_softc *sc = hdl;
936 	int error = EINVAL;
937 	int s;
938 
939 	s = splbio();
940 	iic_acquire_bus(sc->sc_i2c, 0);
941 
942 	switch (mc->dev) {
943 	case ZAUDIO_SPKR_LVL:
944 		if (mc->type != AUDIO_MIXER_VALUE)
945 			break;
946 		if (mc->un.value.num_channels == 1)
947 			sc->sc_volume[ZAUDIO_OP_SPKR].left =
948 			    mc->un.value.level[AUDIO_MIXER_LEVEL_MONO];
949 		else
950 			break;
951 		zaudio_update_volume(sc, ZAUDIO_OP_SPKR);
952 		error = 0;
953 		break;
954 
955 	case ZAUDIO_SPKR_MUTE:
956 		if (mc->type != AUDIO_MIXER_ENUM)
957 			break;
958 		UNMUTE(sc, ZAUDIO_OP_SPKR, mc->un.ord ? 1 : 0);
959 		zaudio_update_mutes(sc, 1);
960 		error = 0;
961 		break;
962 
963 	case ZAUDIO_HP_LVL:
964 		if (mc->type != AUDIO_MIXER_VALUE)
965 			break;
966 		if (mc->un.value.num_channels == 1) {
967 			sc->sc_volume[ZAUDIO_OP_HP].left =
968 			    mc->un.value.level[AUDIO_MIXER_LEVEL_MONO];
969 			sc->sc_volume[ZAUDIO_OP_HP].right =
970 			    mc->un.value.level[AUDIO_MIXER_LEVEL_MONO];
971 		} else if (mc->un.value.num_channels == 2) {
972 			sc->sc_volume[ZAUDIO_OP_HP].left =
973 			    mc->un.value.level[AUDIO_MIXER_LEVEL_LEFT];
974 			sc->sc_volume[ZAUDIO_OP_HP].right =
975 			    mc->un.value.level[AUDIO_MIXER_LEVEL_RIGHT];
976 		}
977 		else
978 			break;
979 		zaudio_update_volume(sc, ZAUDIO_OP_HP);
980 		error = 0;
981 		break;
982 
983 	case ZAUDIO_HP_MUTE:
984 		if (mc->type != AUDIO_MIXER_ENUM)
985 			break;
986 		UNMUTE(sc, ZAUDIO_OP_HP, mc->un.ord ? 1 : 0);
987 		zaudio_update_mutes(sc, 1);
988 		error = 0;
989 		break;
990 
991 	case ZAUDIO_MIC_LVL:
992 		if (mc->type != AUDIO_MIXER_VALUE)
993 			break;
994 		if (mc->un.value.num_channels == 1)
995 			sc->sc_volume[ZAUDIO_OP_MIC].left =
996 			    mc->un.value.level[AUDIO_MIXER_LEVEL_MONO];
997 		else
998 			break;
999 		zaudio_update_volume(sc, ZAUDIO_OP_MIC);
1000 		error = 0;
1001 		break;
1002 
1003 	case ZAUDIO_MIC_MUTE:
1004 		if (mc->type != AUDIO_MIXER_ENUM)
1005 			break;
1006 		UNMUTE(sc, ZAUDIO_OP_MIC, mc->un.ord ? 1 : 0);
1007 		zaudio_update_mutes(sc, 2);
1008 		error = 0;
1009 		break;
1010 
1011 	case ZAUDIO_RECORD_SOURCE:
1012 		if (mc->type != AUDIO_MIXER_ENUM)
1013 			break;
1014 		if (mc->un.ord != 0)
1015 			break;
1016 		/* MIC only */
1017 		error = 0;
1018 		break;
1019 	}
1020 
1021 	iic_release_bus(sc->sc_i2c, 0);
1022 	splx(s);
1023 
1024 	return error;
1025 }
1026 
1027 static int
1028 zaudio_get_port(void *hdl, struct mixer_ctrl *mc)
1029 {
1030 	struct zaudio_softc *sc = hdl;
1031 	int error = EINVAL;
1032 
1033 	switch (mc->dev) {
1034 	case ZAUDIO_SPKR_LVL:
1035 		if (mc->type != AUDIO_MIXER_VALUE)
1036 			break;
1037 		if (mc->un.value.num_channels == 1)
1038 			mc->un.value.level[AUDIO_MIXER_LEVEL_MONO] =
1039 			    sc->sc_volume[ZAUDIO_OP_SPKR].left;
1040 		else
1041 			break;
1042 		error = 0;
1043 		break;
1044 
1045 	case ZAUDIO_SPKR_MUTE:
1046 		if (mc->type != AUDIO_MIXER_ENUM)
1047 			break;
1048 		mc->un.ord = sc->sc_unmute[ZAUDIO_OP_SPKR] ? 1 : 0;
1049 		error = 0;
1050 		break;
1051 
1052 	case ZAUDIO_HP_LVL:
1053 		if (mc->type != AUDIO_MIXER_VALUE)
1054 			break;
1055 		if (mc->un.value.num_channels == 1)
1056 			mc->un.value.level[AUDIO_MIXER_LEVEL_MONO] =
1057 			    sc->sc_volume[ZAUDIO_OP_HP].left;
1058 		else if (mc->un.value.num_channels == 2) {
1059 			mc->un.value.level[AUDIO_MIXER_LEVEL_LEFT] =
1060 			    sc->sc_volume[ZAUDIO_OP_HP].left;
1061 			mc->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] =
1062 			    sc->sc_volume[ZAUDIO_OP_HP].right;
1063 		}
1064 		else
1065 			break;
1066 		error = 0;
1067 		break;
1068 
1069 	case ZAUDIO_HP_MUTE:
1070 		if (mc->type != AUDIO_MIXER_ENUM)
1071 			break;
1072 		mc->un.ord = sc->sc_unmute[ZAUDIO_OP_HP] ? 1 : 0;
1073 		error = 0;
1074 		break;
1075 
1076 	case ZAUDIO_MIC_LVL:
1077 		if (mc->type != AUDIO_MIXER_VALUE)
1078 			break;
1079 		if (mc->un.value.num_channels == 1)
1080 			mc->un.value.level[AUDIO_MIXER_LEVEL_MONO] =
1081 			    sc->sc_volume[ZAUDIO_OP_MIC].left;
1082 		else
1083 			break;
1084 		error = 0;
1085 		break;
1086 
1087 	case ZAUDIO_MIC_MUTE:
1088 		if (mc->type != AUDIO_MIXER_ENUM)
1089 			break;
1090 		mc->un.ord = sc->sc_unmute[ZAUDIO_OP_MIC] ? 1 : 0;
1091 		error = 0;
1092 		break;
1093 
1094 	case ZAUDIO_RECORD_SOURCE:
1095 		if (mc->type != AUDIO_MIXER_ENUM)
1096 			break;
1097 		mc->un.ord = 0; /* MIC only */
1098 		error = 0;
1099 		break;
1100 	}
1101 
1102 	return error;
1103 }
1104 
1105 /*ARGSUSED*/
1106 static int
1107 zaudio_query_devinfo(void *hdl, struct mixer_devinfo *di)
1108 {
1109 
1110 	switch (di->index) {
1111 	case ZAUDIO_SPKR_LVL:
1112 		di->type = AUDIO_MIXER_VALUE;
1113 		di->mixer_class = ZAUDIO_OUTPUT_CLASS;
1114 		di->prev = AUDIO_MIXER_LAST;
1115 		di->next = ZAUDIO_SPKR_MUTE;
1116 		strlcpy(di->label.name, AudioNspeaker, sizeof(di->label.name));
1117 		strlcpy(di->un.v.units.name, AudioNvolume,
1118 		    sizeof(di->un.v.units.name));
1119 		di->un.v.num_channels = 1;
1120 		break;
1121 
1122 	case ZAUDIO_SPKR_MUTE:
1123 		di->type = AUDIO_MIXER_ENUM;
1124 		di->mixer_class = ZAUDIO_OUTPUT_CLASS;
1125 		di->prev = ZAUDIO_SPKR_LVL;
1126 		di->next = AUDIO_MIXER_LAST;
1127 		goto mute;
1128 
1129 	case ZAUDIO_HP_LVL:
1130 		di->type = AUDIO_MIXER_VALUE;
1131 		di->mixer_class = ZAUDIO_OUTPUT_CLASS;
1132 		di->prev = AUDIO_MIXER_LAST;
1133 		di->next = ZAUDIO_HP_MUTE;
1134 		strlcpy(di->label.name, AudioNheadphone,
1135 		    sizeof(di->label.name));
1136 		di->un.v.num_channels = 1;
1137 		strlcpy(di->un.v.units.name, AudioNvolume,
1138 		    sizeof(di->un.v.units.name));
1139 		break;
1140 
1141 	case ZAUDIO_HP_MUTE:
1142 		di->type = AUDIO_MIXER_ENUM;
1143 		di->mixer_class = ZAUDIO_OUTPUT_CLASS;
1144 		di->prev = ZAUDIO_HP_LVL;
1145 		di->next = AUDIO_MIXER_LAST;
1146 mute:
1147 		strlcpy(di->label.name, AudioNmute, sizeof(di->label.name));
1148 		di->un.e.num_mem = 2;
1149 		strlcpy(di->un.e.member[0].label.name, AudioNon,
1150 		    sizeof(di->un.e.member[0].label.name));
1151 		di->un.e.member[0].ord = 0;
1152 		strlcpy(di->un.e.member[1].label.name, AudioNoff,
1153 		    sizeof(di->un.e.member[1].label.name));
1154 		di->un.e.member[1].ord = 1;
1155 		break;
1156 
1157 	case ZAUDIO_MIC_LVL:
1158 		di->type = AUDIO_MIXER_VALUE;
1159 		di->mixer_class = ZAUDIO_INPUT_CLASS;
1160 		di->prev = AUDIO_MIXER_LAST;
1161 		di->next = ZAUDIO_MIC_MUTE;
1162 		strlcpy(di->label.name, AudioNmicrophone,
1163 		    sizeof(di->label.name));
1164 		strlcpy(di->un.v.units.name, AudioNvolume,
1165 		    sizeof(di->un.v.units.name));
1166 		di->un.v.num_channels = 1;
1167 		break;
1168 
1169 	case ZAUDIO_MIC_MUTE:
1170 		di->type = AUDIO_MIXER_ENUM;
1171 		di->mixer_class = ZAUDIO_INPUT_CLASS;
1172 		di->prev = ZAUDIO_MIC_LVL;
1173 		di->next = AUDIO_MIXER_LAST;
1174 		goto mute;
1175 
1176 	case ZAUDIO_RECORD_SOURCE:
1177 		di->type = AUDIO_MIXER_ENUM;
1178 		di->mixer_class = ZAUDIO_RECORD_CLASS;
1179 		di->prev = AUDIO_MIXER_LAST;
1180 		di->next = AUDIO_MIXER_LAST;
1181 		strlcpy(di->label.name, AudioNsource, sizeof(di->label.name));
1182 		di->un.e.num_mem = 1;
1183 		strlcpy(di->un.e.member[0].label.name, AudioNmicrophone,
1184 		    sizeof(di->un.e.member[0].label.name));
1185 		di->un.e.member[0].ord = 0;
1186 		break;
1187 
1188 	case ZAUDIO_OUTPUT_CLASS:
1189 		di->type = AUDIO_MIXER_CLASS;
1190 		di->mixer_class = ZAUDIO_OUTPUT_CLASS;
1191 		di->prev = AUDIO_MIXER_LAST;
1192 		di->next = AUDIO_MIXER_LAST;
1193 		strlcpy(di->label.name, AudioCoutputs, sizeof(di->label.name));
1194 		break;
1195 
1196 	case ZAUDIO_INPUT_CLASS:
1197 		di->type = AUDIO_MIXER_CLASS;
1198 		di->mixer_class = ZAUDIO_INPUT_CLASS;
1199 		di->prev = AUDIO_MIXER_LAST;
1200 		di->next = AUDIO_MIXER_LAST;
1201 		strlcpy(di->label.name, AudioCinputs, sizeof(di->label.name));
1202 		break;
1203 
1204 	case ZAUDIO_RECORD_CLASS:
1205 		di->type = AUDIO_MIXER_CLASS;
1206 		di->mixer_class = ZAUDIO_RECORD_CLASS;
1207 		di->prev = AUDIO_MIXER_LAST;
1208 		di->next = AUDIO_MIXER_LAST;
1209 		strlcpy(di->label.name, AudioCinputs, sizeof(di->label.name));
1210 		break;
1211 
1212 	default:
1213 		return ENXIO;
1214 	}
1215 
1216 	return 0;
1217 }
1218 
1219 static void *
1220 zaudio_allocm(void *hdl, int direction, size_t size, struct malloc_type *type,
1221     int flags)
1222 {
1223 	struct zaudio_softc *sc = hdl;
1224 
1225 	return pxa2x0_i2s_allocm(&sc->sc_i2s, direction, size, type, flags);
1226 }
1227 
1228 static void
1229 zaudio_freem(void *hdl, void *ptr, struct malloc_type *type)
1230 {
1231 	struct zaudio_softc *sc = hdl;
1232 
1233 	return pxa2x0_i2s_freem(&sc->sc_i2s, ptr, type);
1234 }
1235 
1236 static size_t
1237 zaudio_round_buffersize(void *hdl, int direction, size_t bufsize)
1238 {
1239 	struct zaudio_softc *sc = hdl;
1240 
1241 	return pxa2x0_i2s_round_buffersize(&sc->sc_i2s, direction, bufsize);
1242 }
1243 
1244 static paddr_t
1245 zaudio_mappage(void *hdl, void *mem, off_t off, int prot)
1246 {
1247 	struct zaudio_softc *sc = hdl;
1248 
1249 	return pxa2x0_i2s_mappage(&sc->sc_i2s, mem, off, prot);
1250 }
1251 
1252 static int
1253 zaudio_get_props(void *hdl)
1254 {
1255 
1256 	return AUDIO_PROP_MMAP|AUDIO_PROP_INDEPENDENT;
1257 }
1258 
1259 static int
1260 zaudio_start_output(void *hdl, void *block, int bsize, void (*intr)(void *),
1261     void *intrarg)
1262 {
1263 	struct zaudio_softc *sc = hdl;
1264 	int rv;
1265 
1266 	/* Power up codec if we are not already playing. */
1267 	if (!sc->sc_playing) {
1268 		sc->sc_playing = 1;
1269 		zaudio_play_setup(sc);
1270 	}
1271 
1272 	/* Start DMA via I2S */
1273 	rv = pxa2x0_i2s_start_output(&sc->sc_i2s, block, bsize, intr, intrarg);
1274 	if (rv) {
1275 		if (!sc->sc_recording)
1276 			zaudio_standby(sc);
1277 		sc->sc_playing = 0;
1278 	}
1279 	return rv;
1280 }
1281 
1282 static int
1283 zaudio_start_input(void *hdl, void *block, int bsize, void (*intr)(void *),
1284     void *intrarg)
1285 {
1286 	struct zaudio_softc *sc = hdl;
1287 	int rv;
1288 
1289 	/* Power up codec if we are not already recording. */
1290 	if (!sc->sc_recording) {
1291 		sc->sc_recording = 1;
1292 		zaudio_record_setup(sc);
1293 	}
1294 
1295 	/* Start DMA via I2S */
1296 	rv = pxa2x0_i2s_start_input(&sc->sc_i2s, block, bsize, intr, intrarg);
1297 	if (rv) {
1298 		if (!sc->sc_playing)
1299 			zaudio_standby(sc);
1300 		sc->sc_recording = 0;
1301 	}
1302 	return rv;
1303 }
1304