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