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