Home | History | Annotate | Line # | Download | only in dev
zaudio.c revision 1.3.6.1
      1  1.3.6.1      mjf /*	$NetBSD: zaudio.c,v 1.3.6.1 2007/07/11 20:03:40 mjf Exp $	*/
      2      1.1     ober /*	$OpenBSD: zaurus_audio.c,v 1.8 2005/08/18 13:23:02 robert Exp $	*/
      3      1.1     ober 
      4      1.1     ober /*
      5      1.1     ober  * Copyright (c) 2005 Christopher Pascoe <pascoe (at) openbsd.org>
      6      1.1     ober  *
      7      1.1     ober  * Permission to use, copy, modify, and distribute this software for any
      8      1.1     ober  * purpose with or without fee is hereby granted, provided that the above
      9      1.1     ober  * copyright notice and this permission notice appear in all copies.
     10      1.1     ober  *
     11      1.1     ober  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     12      1.1     ober  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     13      1.1     ober  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     14      1.1     ober  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     15      1.1     ober  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     16      1.1     ober  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     17      1.1     ober  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     18      1.1     ober  */
     19      1.1     ober 
     20      1.1     ober /*
     21      1.1     ober  * TODO:
     22      1.1     ober  *	- powerhooks (currently only works until first suspend)
     23      1.1     ober  *	- record support
     24      1.1     ober  */
     25      1.1     ober 
     26      1.1     ober #include <sys/cdefs.h>
     27      1.1     ober __KERNEL_RCSID(0, "$NetBSD");
     28      1.1     ober 
     29      1.1     ober #include <sys/param.h>
     30      1.1     ober #include <sys/systm.h>
     31      1.1     ober #include <sys/callout.h>
     32      1.1     ober #include <sys/device.h>
     33      1.1     ober #include <sys/malloc.h>
     34      1.1     ober #include <sys/kernel.h>
     35      1.1     ober #include <sys/audioio.h>
     36      1.1     ober 
     37      1.1     ober #include <machine/intr.h>
     38      1.1     ober #include <machine/bus.h>
     39      1.1     ober 
     40      1.1     ober #include <arm/xscale/pxa2x0reg.h>
     41      1.1     ober #include <arm/xscale/pxa2x0var.h>
     42      1.1     ober #include <arm/xscale/pxa2x0_i2c.h>
     43      1.1     ober #include <arm/xscale/pxa2x0_i2s.h>
     44      1.1     ober #include <arm/xscale/pxa2x0_dmac.h>
     45      1.1     ober #include <arm/xscale/pxa2x0_gpio.h>
     46      1.1     ober 
     47      1.1     ober #include <dev/audio_if.h>
     48      1.1     ober #include <dev/mulaw.h>
     49      1.1     ober #include <dev/auconv.h>
     50      1.1     ober 
     51      1.1     ober #include <zaurus/dev/wm8750reg.h>
     52      1.1     ober #include <zaurus/dev/scoopvar.h>
     53      1.1     ober 
     54      1.1     ober #define WM8750_ADDRESS  0x1B
     55      1.1     ober #define SPKR_VOLUME	112
     56      1.1     ober 
     57      1.1     ober #define wm8750_write(sc, reg, val) \
     58      1.1     ober 	pxa2x0_i2c_write_2(&sc->sc_i2c, WM8750_ADDRESS, \
     59      1.1     ober 	    (((reg) << 9) | ((val) & 0x1ff)))
     60      1.1     ober 
     61      1.1     ober static int	zaudio_match(struct device *, struct cfdata *, void *);
     62      1.1     ober static void	zaudio_attach(struct device *, struct device *, void *);
     63      1.1     ober static int	zaudio_detach(struct device *, int);
     64      1.1     ober static void	zaudio_power(int, void *);
     65      1.1     ober 
     66      1.1     ober #define ZAUDIO_OP_SPKR	0
     67      1.1     ober #define ZAUDIO_OP_HP	1
     68      1.1     ober 
     69      1.1     ober #define ZAUDIO_JACK_STATE_OUT	0
     70      1.1     ober #define ZAUDIO_JACK_STATE_IN	1
     71      1.1     ober #define ZAUDIO_JACK_STATE_INS	2
     72      1.1     ober #define ZAUDIO_JACK_STATE_REM	3
     73      1.1     ober 
     74      1.1     ober /* GPIO pins */
     75      1.1     ober #define GPIO_HP_IN_C3000	116
     76      1.1     ober 
     77      1.1     ober struct zaudio_volume {
     78      1.1     ober 	u_int8_t		left;
     79      1.1     ober 	u_int8_t		right;
     80      1.1     ober };
     81      1.1     ober 
     82      1.1     ober struct zaudio_softc {
     83      1.1     ober 	struct device		sc_dev;
     84      1.1     ober 
     85      1.1     ober 	/* i2s device softc */
     86      1.1     ober 	/* NB: pxa2x0_i2s requires this to be the second struct member */
     87      1.1     ober 	struct pxa2x0_i2s_softc	sc_i2s;
     88      1.1     ober 
     89      1.1     ober 	/* i2c device softc */
     90      1.1     ober 	struct pxa2x0_i2c_softc	sc_i2c;
     91      1.1     ober 
     92      1.1     ober 	void			*sc_powerhook;
     93      1.1     ober 	int			sc_playing;
     94      1.1     ober 
     95      1.1     ober 	struct zaudio_volume	sc_volume[2];
     96      1.1     ober 	char			sc_unmute[2];
     97      1.1     ober 
     98      1.1     ober 	int			sc_state;
     99      1.1     ober 	int			sc_icount;
    100      1.1     ober 	struct callout		sc_to;
    101      1.1     ober };
    102      1.1     ober 
    103      1.1     ober CFATTACH_DECL(zaudio, sizeof(struct zaudio_softc),
    104      1.1     ober     zaudio_match, zaudio_attach, zaudio_detach, NULL);
    105      1.1     ober 
    106      1.2    peter static struct audio_device wm8750_device = {
    107      1.1     ober 	"WM8750",
    108      1.1     ober 	"1.0",
    109      1.1     ober 	"wm"
    110      1.1     ober };
    111      1.1     ober 
    112      1.2    peter #define ZAUDIO_NFORMATS	4
    113      1.2    peter static const struct audio_format zaudio_formats[ZAUDIO_NFORMATS] = {
    114      1.2    peter 	{NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16,
    115      1.2    peter 	 2, AUFMT_STEREO, 0, {4000, 48000}},
    116      1.2    peter 	{NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16,
    117      1.2    peter 	 1, AUFMT_MONAURAL, 0, {4000, 48000}},
    118      1.2    peter 	{NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_ULINEAR_LE, 8, 8,
    119      1.2    peter 	 2, AUFMT_STEREO, 0, {4000, 48000}},
    120      1.2    peter 	{NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_ULINEAR_LE, 8, 8,
    121      1.2    peter 	 1, AUFMT_MONAURAL, 0, {4000, 48000}},
    122      1.2    peter };
    123      1.2    peter 
    124      1.1     ober void zaudio_init(struct zaudio_softc *);
    125      1.2    peter static int zaudio_jack_intr(void *);
    126      1.1     ober void zaudio_jack(void *);
    127      1.1     ober void zaudio_standby(struct zaudio_softc *);
    128      1.1     ober void zaudio_update_volume(struct zaudio_softc *, int);
    129      1.1     ober void zaudio_update_mutes(struct zaudio_softc *);
    130      1.1     ober void zaudio_play_setup(struct zaudio_softc *);
    131      1.2    peter static int zaudio_open(void *, int);
    132      1.2    peter static void zaudio_close(void *);
    133      1.2    peter static int zaudio_query_encoding(void *, struct audio_encoding *);
    134      1.2    peter static int zaudio_set_params(void *, int, int, audio_params_t *,
    135      1.2    peter     audio_params_t *, stream_filter_list_t *, stream_filter_list_t *);
    136      1.2    peter static int zaudio_round_blocksize(void *, int, int, const audio_params_t *);
    137      1.2    peter static int zaudio_start_output(void *, void *, int, void (*)(void *), void *);
    138      1.2    peter static int zaudio_start_input(void *, void *, int, void (*)(void *), void *);
    139      1.2    peter static int zaudio_halt_output(void *);
    140      1.2    peter static int zaudio_halt_input(void *);
    141      1.2    peter static int zaudio_getdev(void *, struct audio_device *);
    142      1.2    peter static int zaudio_set_port(void *, struct mixer_ctrl *);
    143      1.2    peter static int zaudio_get_port(void *, struct mixer_ctrl *);
    144      1.2    peter static int zaudio_query_devinfo(void *, struct mixer_devinfo *);
    145      1.2    peter static void *zaudio_allocm(void *, int, size_t, struct malloc_type *, int);
    146      1.2    peter static void zaudio_freem(void  *, void *, struct malloc_type *);
    147      1.2    peter static size_t zaudio_round_buffersize(void *, int, size_t);
    148      1.2    peter static paddr_t zaudio_mappage(void *, void *, off_t, int);
    149      1.2    peter static int zaudio_get_props(void *);
    150      1.1     ober 
    151      1.1     ober struct audio_hw_if wm8750_hw_if = {
    152      1.1     ober 	zaudio_open,
    153      1.1     ober 	zaudio_close,
    154      1.2    peter 	NULL,
    155      1.1     ober 	zaudio_query_encoding,
    156      1.1     ober 	zaudio_set_params,
    157      1.2    peter 	zaudio_round_blocksize,
    158      1.2    peter 	NULL,
    159      1.2    peter 	NULL,
    160      1.2    peter 	NULL,
    161      1.1     ober 	zaudio_start_output,
    162      1.1     ober 	zaudio_start_input,
    163      1.1     ober 	zaudio_halt_output,
    164      1.1     ober 	zaudio_halt_input,
    165      1.2    peter 	NULL,
    166      1.1     ober 	zaudio_getdev,
    167      1.2    peter 	NULL,
    168      1.1     ober 	zaudio_set_port,
    169      1.1     ober 	zaudio_get_port,
    170      1.1     ober 	zaudio_query_devinfo,
    171      1.2    peter 	zaudio_allocm,
    172      1.2    peter 	zaudio_freem,
    173      1.2    peter 	zaudio_round_buffersize,
    174      1.2    peter 	zaudio_mappage,
    175      1.1     ober 	zaudio_get_props,
    176      1.2    peter 	NULL,
    177      1.2    peter 	NULL,
    178      1.2    peter 	NULL,
    179      1.1     ober };
    180      1.1     ober 
    181      1.2    peter static const uint16_t playback_registers[][2] = {
    182      1.1     ober 	/* Unmute DAC */
    183      1.1     ober 	{ ADCDACCTL_REG, 0x000 },
    184      1.1     ober 
    185      1.1     ober 	/* 16 bit audio words */
    186      1.1     ober 	{ AUDINT_REG, AUDINT_SET_FORMAT(2) },
    187      1.1     ober 
    188      1.1     ober 	/* Enable thermal protection, power */
    189      1.1     ober 	{ ADCTL1_REG, ADCTL1_TSDEN | ADCTL1_SET_VSEL(3) },
    190      1.1     ober 
    191      1.1     ober 	/* Enable speaker driver, DAC oversampling */
    192      1.1     ober 	{ ADCTL2_REG, ADCTL2_ROUT2INV | ADCTL2_DACOSR },
    193      1.1     ober 
    194      1.1     ober 	/* Set DAC voltage references */
    195      1.1     ober 	{ PWRMGMT1_REG, PWRMGMT1_SET_VMIDSEL(1) | PWRMGMT1_VREF },
    196      1.1     ober 
    197      1.1     ober 	/* Direct DACs to output mixers */
    198      1.1     ober 	{ LOUTMIX1_REG, LOUTMIX1_LD2LO },
    199      1.1     ober 	{ ROUTMIX2_REG, ROUTMIX2_RD2RO },
    200      1.1     ober 
    201      1.1     ober 	/* End of list */
    202      1.1     ober 	{ 0xffff, 0xffff }
    203      1.1     ober };
    204      1.1     ober 
    205      1.1     ober static int
    206      1.1     ober zaudio_match(struct device *parent, struct cfdata *cf, void *aux)
    207      1.1     ober {
    208      1.1     ober 
    209      1.1     ober 	return 1;
    210      1.1     ober }
    211      1.1     ober 
    212      1.1     ober static void
    213      1.1     ober zaudio_attach(struct device *parent, struct device *self, void *aux)
    214      1.1     ober {
    215      1.2    peter 	struct zaudio_softc *sc = (struct zaudio_softc *)self;
    216      1.2    peter 	struct pxaip_attach_args *pxa = aux;
    217      1.2    peter 	int rv;
    218      1.1     ober 
    219      1.2    peter 	sc->sc_powerhook = powerhook_establish(sc->sc_dev.dv_xname,
    220      1.2    peter 	    zaudio_power, sc);
    221      1.1     ober 	if (sc->sc_powerhook == NULL) {
    222      1.1     ober 		printf(": unable to establish powerhook\n");
    223      1.1     ober 		return;
    224      1.1     ober 	}
    225      1.1     ober 
    226      1.1     ober 	sc->sc_i2s.sc_iot = pxa->pxa_iot;
    227      1.1     ober 	sc->sc_i2s.sc_dmat = pxa->pxa_dmat;
    228      1.1     ober 	sc->sc_i2s.sc_size = PXA2X0_I2S_SIZE;
    229      1.1     ober 	if (pxa2x0_i2s_attach_sub(&sc->sc_i2s)) {
    230      1.1     ober 		printf(": unable to attach I2S\n");
    231      1.1     ober 		goto fail_i2s;
    232      1.1     ober 	}
    233      1.1     ober 
    234      1.1     ober 	sc->sc_i2c.sc_iot = pxa->pxa_iot;
    235      1.1     ober 	sc->sc_i2c.sc_size = PXA2X0_I2C_SIZE;
    236      1.1     ober 	if (pxa2x0_i2c_attach_sub(&sc->sc_i2c)) {
    237      1.1     ober 		printf(": unable to attach I2C\n");
    238      1.1     ober 		goto fail_i2c;
    239      1.1     ober 	}
    240      1.1     ober 
    241      1.1     ober 	/* Check for an I2C response from the wm8750 */
    242      1.1     ober 	pxa2x0_i2c_open(&sc->sc_i2c);
    243      1.2    peter 	rv = wm8750_write(sc, RESET_REG, 0);
    244      1.1     ober 	pxa2x0_i2c_close(&sc->sc_i2c);
    245      1.1     ober 
    246      1.2    peter 	if (rv) {
    247      1.1     ober 		printf(": codec failed to respond\n");
    248      1.1     ober 		goto fail_probe;
    249      1.1     ober 	}
    250      1.1     ober 	delay(100);
    251      1.1     ober 
    252      1.1     ober 	/* Speaker on, headphones off by default. */
    253      1.1     ober 	sc->sc_volume[ZAUDIO_OP_SPKR].left = 240;
    254      1.1     ober 	sc->sc_unmute[ZAUDIO_OP_SPKR] = 1;
    255      1.1     ober 	sc->sc_volume[ZAUDIO_OP_HP].left = 180;
    256      1.1     ober 	sc->sc_volume[ZAUDIO_OP_HP].right = 180;
    257      1.1     ober 	sc->sc_unmute[ZAUDIO_OP_HP] = 0;
    258      1.1     ober 
    259      1.1     ober 	/* Configure headphone jack state change handling. */
    260  1.3.6.1      mjf 	callout_init(&sc->sc_to, 0);
    261      1.1     ober 	callout_setfunc(&sc->sc_to, zaudio_jack, sc);
    262      1.1     ober 	pxa2x0_gpio_set_function(GPIO_HP_IN_C3000, GPIO_IN);
    263      1.1     ober 	(void)pxa2x0_gpio_intr_establish(GPIO_HP_IN_C3000,
    264      1.2    peter 	    IST_EDGE_BOTH, IPL_BIO, zaudio_jack_intr, sc);
    265      1.1     ober 
    266      1.1     ober 	zaudio_init(sc);
    267      1.1     ober 
    268      1.1     ober 	printf(": I2C, I2S, WM8750 Audio\n");
    269      1.1     ober 
    270      1.1     ober 	audio_attach_mi(&wm8750_hw_if, sc, &sc->sc_dev);
    271      1.1     ober 
    272      1.1     ober 	return;
    273      1.1     ober 
    274      1.1     ober fail_probe:
    275      1.1     ober 	pxa2x0_i2c_detach_sub(&sc->sc_i2c);
    276      1.1     ober fail_i2c:
    277      1.1     ober 	pxa2x0_i2s_detach_sub(&sc->sc_i2s);
    278      1.1     ober fail_i2s:
    279      1.1     ober 	powerhook_disestablish(sc->sc_powerhook);
    280      1.1     ober }
    281      1.1     ober 
    282      1.2    peter static int
    283      1.1     ober zaudio_detach(struct device *self, int flags)
    284      1.1     ober {
    285      1.1     ober 	struct zaudio_softc *sc = (struct zaudio_softc *)self;
    286      1.1     ober 
    287      1.1     ober 	if (sc->sc_powerhook != NULL) {
    288      1.1     ober 		powerhook_disestablish(sc->sc_powerhook);
    289      1.1     ober 		sc->sc_powerhook = NULL;
    290      1.1     ober 	}
    291      1.1     ober 
    292      1.1     ober 	pxa2x0_i2c_detach_sub(&sc->sc_i2c);
    293      1.1     ober 	pxa2x0_i2s_detach_sub(&sc->sc_i2s);
    294      1.1     ober 
    295      1.1     ober 	return 0;
    296      1.1     ober }
    297      1.1     ober 
    298      1.1     ober static void
    299      1.1     ober zaudio_power(int why, void *arg)
    300      1.1     ober {
    301      1.1     ober 	struct zaudio_softc *sc = arg;
    302      1.1     ober 
    303      1.1     ober 	switch (why) {
    304      1.1     ober 	case PWR_STANDBY:
    305      1.1     ober 	case PWR_SUSPEND:
    306      1.1     ober 		callout_stop(&sc->sc_to);
    307      1.1     ober 		zaudio_standby(sc);
    308      1.1     ober 		break;
    309      1.1     ober 
    310      1.1     ober 	case PWR_RESUME:
    311      1.1     ober 		pxa2x0_i2s_init(&sc->sc_i2s);
    312      1.1     ober 		pxa2x0_i2c_init(&sc->sc_i2c);
    313      1.1     ober 		zaudio_init(sc);
    314      1.1     ober 		break;
    315      1.1     ober 	}
    316      1.1     ober }
    317      1.1     ober 
    318      1.1     ober void
    319      1.1     ober zaudio_init(struct zaudio_softc *sc)
    320      1.1     ober {
    321      1.2    peter 
    322      1.1     ober 	pxa2x0_i2c_open(&sc->sc_i2c);
    323      1.1     ober 
    324      1.1     ober 	/* Reset the codec */
    325      1.1     ober 	wm8750_write(sc, RESET_REG, 0);
    326      1.1     ober 	delay(100);
    327      1.1     ober 
    328      1.1     ober 	/* Switch to standby power only */
    329      1.1     ober 	wm8750_write(sc, PWRMGMT1_REG, PWRMGMT1_SET_VMIDSEL(2));
    330      1.1     ober 	wm8750_write(sc, PWRMGMT2_REG, 0);
    331      1.1     ober 
    332      1.1     ober 	/* Configure digital interface for I2S */
    333      1.1     ober 	wm8750_write(sc, AUDINT_REG, AUDINT_SET_FORMAT(2));
    334      1.1     ober 
    335      1.1     ober 	/* Initialise volume levels */
    336      1.1     ober 	zaudio_update_volume(sc, ZAUDIO_OP_SPKR);
    337      1.1     ober 	zaudio_update_volume(sc, ZAUDIO_OP_HP);
    338      1.1     ober 
    339      1.1     ober 	pxa2x0_i2c_close(&sc->sc_i2c);
    340      1.1     ober 
    341      1.2    peter 	scoop_set_headphone(0);
    342      1.2    peter 
    343      1.1     ober 	/* Assume that the jack state has changed. */
    344      1.1     ober 	zaudio_jack(sc);
    345      1.1     ober 
    346      1.1     ober }
    347      1.1     ober 
    348      1.2    peter static int
    349      1.1     ober zaudio_jack_intr(void *v)
    350      1.1     ober {
    351      1.1     ober 	struct zaudio_softc *sc = v;
    352      1.1     ober 
    353      1.1     ober 	if (!callout_active(&sc->sc_to))
    354      1.1     ober 		zaudio_jack(sc);
    355      1.1     ober 
    356      1.2    peter 	return 1;
    357      1.1     ober }
    358      1.1     ober 
    359      1.1     ober void
    360      1.1     ober zaudio_jack(void *v)
    361      1.1     ober {
    362      1.1     ober 	struct zaudio_softc *sc = v;
    363      1.1     ober 
    364      1.1     ober 	switch (sc->sc_state) {
    365      1.1     ober 	case ZAUDIO_JACK_STATE_OUT:
    366      1.1     ober 		if (pxa2x0_gpio_get_bit(GPIO_HP_IN_C3000)) {
    367      1.1     ober 			sc->sc_state = ZAUDIO_JACK_STATE_INS;
    368      1.1     ober 			sc->sc_icount = 0;
    369      1.1     ober 		}
    370      1.1     ober 		break;
    371      1.2    peter 
    372      1.1     ober 	case ZAUDIO_JACK_STATE_INS:
    373      1.1     ober 		if (sc->sc_icount++ > 2) {
    374      1.1     ober 			if (pxa2x0_gpio_get_bit(GPIO_HP_IN_C3000)) {
    375      1.1     ober 				sc->sc_state = ZAUDIO_JACK_STATE_IN;
    376      1.1     ober 				sc->sc_unmute[ZAUDIO_OP_SPKR] = 0;
    377      1.1     ober 				sc->sc_unmute[ZAUDIO_OP_HP] = 1;
    378      1.1     ober 				goto update_mutes;
    379      1.1     ober 			} else
    380      1.1     ober 				sc->sc_state = ZAUDIO_JACK_STATE_OUT;
    381      1.1     ober 		}
    382      1.1     ober 		break;
    383      1.2    peter 
    384      1.1     ober 	case ZAUDIO_JACK_STATE_IN:
    385      1.1     ober 		if (!pxa2x0_gpio_get_bit(GPIO_HP_IN_C3000)) {
    386      1.1     ober 			sc->sc_state = ZAUDIO_JACK_STATE_REM;
    387      1.1     ober 			sc->sc_icount = 0;
    388      1.1     ober 		}
    389      1.1     ober 		break;
    390      1.2    peter 
    391      1.1     ober 	case ZAUDIO_JACK_STATE_REM:
    392      1.1     ober 		if (sc->sc_icount++ > 2) {
    393      1.1     ober 			if (!pxa2x0_gpio_get_bit(GPIO_HP_IN_C3000)) {
    394      1.1     ober 				sc->sc_state = ZAUDIO_JACK_STATE_OUT;
    395      1.1     ober 				sc->sc_unmute[ZAUDIO_OP_SPKR] = 1;
    396      1.1     ober 				sc->sc_unmute[ZAUDIO_OP_HP] = 0;
    397      1.1     ober 				goto update_mutes;
    398      1.1     ober 			} else
    399      1.1     ober 				sc->sc_state = ZAUDIO_JACK_STATE_IN;
    400      1.1     ober 		}
    401      1.1     ober 		break;
    402      1.1     ober 	}
    403      1.1     ober 
    404      1.1     ober 	callout_schedule(&sc->sc_to, hz/4);
    405      1.2    peter 
    406      1.1     ober 	return;
    407      1.1     ober 
    408      1.1     ober update_mutes:
    409      1.1     ober 	callout_stop(&sc->sc_to);
    410      1.1     ober 
    411      1.1     ober 	if (sc->sc_playing) {
    412      1.1     ober 		pxa2x0_i2c_open(&sc->sc_i2c);
    413      1.1     ober 		zaudio_update_mutes(sc);
    414      1.1     ober 		pxa2x0_i2c_close(&sc->sc_i2c);
    415      1.1     ober 	}
    416      1.1     ober }
    417      1.1     ober 
    418      1.1     ober void
    419      1.1     ober zaudio_standby(struct zaudio_softc *sc)
    420      1.1     ober {
    421      1.2    peter 
    422      1.1     ober 	pxa2x0_i2c_open(&sc->sc_i2c);
    423      1.1     ober 
    424      1.1     ober 	/* Switch codec to standby power only */
    425      1.1     ober 	wm8750_write(sc, PWRMGMT1_REG, PWRMGMT1_SET_VMIDSEL(2));
    426      1.1     ober 	wm8750_write(sc, PWRMGMT2_REG, 0);
    427      1.1     ober 
    428      1.2    peter 	pxa2x0_i2c_close(&sc->sc_i2c);
    429      1.2    peter 
    430      1.1     ober 	scoop_set_headphone(0);
    431      1.1     ober }
    432      1.1     ober 
    433      1.1     ober void
    434      1.1     ober zaudio_update_volume(struct zaudio_softc *sc, int output)
    435      1.1     ober {
    436      1.2    peter 
    437      1.2    peter 	switch (output) {
    438      1.1     ober 	case ZAUDIO_OP_SPKR:
    439      1.1     ober 		wm8750_write(sc, LOUT2VOL_REG, LOUT2VOL_LO2VU | LOUT2VOL_LO2ZC |
    440      1.1     ober 		    LOUT2VOL_SET_LOUT2VOL(sc->sc_volume[ZAUDIO_OP_SPKR
    441      1.1     ober 		    ].left >> 1));
    442      1.1     ober 		wm8750_write(sc, ROUT2VOL_REG, ROUT2VOL_RO2VU | ROUT2VOL_RO2ZC |
    443      1.1     ober 		    ROUT2VOL_SET_ROUT2VOL(sc->sc_volume[ZAUDIO_OP_SPKR
    444      1.1     ober 		    ].left >> 1));
    445      1.1     ober 		break;
    446      1.2    peter 
    447      1.1     ober 	case ZAUDIO_OP_HP:
    448      1.1     ober 		wm8750_write(sc, LOUT1VOL_REG, LOUT1VOL_LO1VU | LOUT1VOL_LO1ZC |
    449      1.1     ober 		    LOUT1VOL_SET_LOUT1VOL(sc->sc_volume[ZAUDIO_OP_HP
    450      1.1     ober 		    ].left >> 1));
    451      1.1     ober 		wm8750_write(sc, ROUT1VOL_REG, ROUT1VOL_RO1VU | ROUT1VOL_RO1ZC |
    452      1.1     ober 		    ROUT1VOL_SET_ROUT1VOL(sc->sc_volume[ZAUDIO_OP_HP
    453      1.1     ober 		    ].right >> 1));
    454      1.1     ober 		break;
    455      1.1     ober 	}
    456      1.1     ober }
    457      1.1     ober 
    458      1.1     ober void
    459      1.1     ober zaudio_update_mutes(struct zaudio_softc *sc)
    460      1.1     ober {
    461      1.2    peter 	uint16_t val;
    462      1.1     ober 
    463      1.1     ober 	val = PWRMGMT2_DACL | PWRMGMT2_DACR;
    464      1.1     ober 
    465      1.1     ober 	if (sc->sc_unmute[ZAUDIO_OP_SPKR])
    466      1.1     ober 		val |= PWRMGMT2_LOUT2 | PWRMGMT2_ROUT2;
    467      1.1     ober 
    468      1.1     ober 	if (sc->sc_unmute[ZAUDIO_OP_HP])
    469      1.1     ober 		val |= PWRMGMT2_LOUT1 | PWRMGMT2_ROUT1;
    470      1.1     ober 
    471      1.1     ober 	wm8750_write(sc, PWRMGMT2_REG, val);
    472      1.1     ober 
    473      1.1     ober 	scoop_set_headphone(sc->sc_unmute[ZAUDIO_OP_HP]);
    474      1.1     ober }
    475      1.1     ober 
    476      1.1     ober void
    477      1.1     ober zaudio_play_setup(struct zaudio_softc *sc)
    478      1.1     ober {
    479      1.2    peter 	int i;
    480      1.1     ober 
    481      1.1     ober 	pxa2x0_i2c_open(&sc->sc_i2c);
    482      1.1     ober 
    483      1.1     ober 	/* Program the codec with playback settings */
    484      1.2    peter 	for (i = 0; playback_registers[i][0] != 0xffff; i++) {
    485      1.1     ober 		wm8750_write(sc, playback_registers[i][0],
    486      1.1     ober 		    playback_registers[i][1]);
    487      1.1     ober 	}
    488      1.1     ober 	zaudio_update_mutes(sc);
    489      1.1     ober 
    490      1.1     ober 	pxa2x0_i2c_close(&sc->sc_i2c);
    491      1.1     ober }
    492      1.1     ober 
    493      1.2    peter /*
    494      1.2    peter  * audio operation functions.
    495      1.2    peter  */
    496      1.2    peter static int
    497      1.1     ober zaudio_open(void *hdl, int flags)
    498      1.1     ober {
    499      1.1     ober 	struct zaudio_softc *sc = hdl;
    500      1.1     ober 
    501      1.1     ober 	/* Power on the I2S bus and codec */
    502      1.1     ober 	pxa2x0_i2s_open(&sc->sc_i2s);
    503      1.1     ober 
    504      1.1     ober 	return 0;
    505      1.1     ober }
    506      1.1     ober 
    507      1.2    peter static void
    508      1.1     ober zaudio_close(void *hdl)
    509      1.1     ober {
    510      1.1     ober 	struct zaudio_softc *sc = hdl;
    511      1.1     ober 
    512      1.1     ober 	/* Power off the I2S bus and codec */
    513      1.1     ober 	pxa2x0_i2s_close(&sc->sc_i2s);
    514      1.1     ober }
    515      1.1     ober 
    516      1.2    peter static int
    517      1.1     ober zaudio_query_encoding(void *hdl, struct audio_encoding *aep)
    518      1.1     ober {
    519      1.2    peter 
    520      1.1     ober 	switch (aep->index) {
    521      1.1     ober 	case 0:
    522      1.1     ober 		strlcpy(aep->name, AudioEulinear, sizeof(aep->name));
    523      1.1     ober 		aep->encoding = AUDIO_ENCODING_ULINEAR;
    524      1.1     ober 		aep->precision = 8;
    525      1.1     ober 		aep->flags = 0;
    526      1.2    peter 		break;
    527      1.2    peter 
    528      1.1     ober 	case 1:
    529      1.1     ober 		strlcpy(aep->name, AudioEmulaw, sizeof(aep->name));
    530      1.1     ober 		aep->encoding = AUDIO_ENCODING_ULAW;
    531      1.1     ober 		aep->precision = 8;
    532      1.1     ober 		aep->flags = AUDIO_ENCODINGFLAG_EMULATED;
    533      1.2    peter 		break;
    534      1.2    peter 
    535      1.1     ober 	case 2:
    536      1.1     ober 		strlcpy(aep->name, AudioEalaw, sizeof(aep->name));
    537      1.1     ober 		aep->encoding = AUDIO_ENCODING_ALAW;
    538      1.1     ober 		aep->precision = 8;
    539      1.1     ober 		aep->flags = AUDIO_ENCODINGFLAG_EMULATED;
    540      1.2    peter 		break;
    541      1.2    peter 
    542      1.1     ober 	case 3:
    543      1.1     ober 		strlcpy(aep->name, AudioEslinear, sizeof(aep->name));
    544      1.1     ober 		aep->encoding = AUDIO_ENCODING_SLINEAR;
    545      1.1     ober 		aep->precision = 8;
    546      1.1     ober 		aep->flags = AUDIO_ENCODINGFLAG_EMULATED;
    547      1.2    peter 		break;
    548      1.2    peter 
    549      1.1     ober 	case 4:
    550      1.1     ober 		strlcpy(aep->name, AudioEslinear_le, sizeof(aep->name));
    551      1.1     ober 		aep->encoding = AUDIO_ENCODING_SLINEAR_LE;
    552      1.1     ober 		aep->precision = 16;
    553      1.1     ober 		aep->flags = 0;
    554      1.2    peter 		break;
    555      1.2    peter 
    556      1.1     ober 	case 5:
    557      1.1     ober 		strlcpy(aep->name, AudioEulinear_le, sizeof(aep->name));
    558      1.1     ober 		aep->encoding = AUDIO_ENCODING_ULINEAR_LE;
    559      1.1     ober 		aep->precision = 16;
    560      1.1     ober 		aep->flags = AUDIO_ENCODINGFLAG_EMULATED;
    561      1.2    peter 		break;
    562      1.2    peter 
    563      1.1     ober 	case 6:
    564      1.1     ober 		strlcpy(aep->name, AudioEslinear_be, sizeof(aep->name));
    565      1.1     ober 		aep->encoding = AUDIO_ENCODING_SLINEAR_BE;
    566      1.1     ober 		aep->precision = 16;
    567      1.1     ober 		aep->flags = AUDIO_ENCODINGFLAG_EMULATED;
    568      1.2    peter 		break;
    569      1.2    peter 
    570      1.1     ober 	case 7:
    571      1.1     ober 		strlcpy(aep->name, AudioEulinear_be, sizeof(aep->name));
    572      1.1     ober 		aep->encoding = AUDIO_ENCODING_ULINEAR_BE;
    573      1.1     ober 		aep->precision = 16;
    574      1.1     ober 		aep->flags = AUDIO_ENCODINGFLAG_EMULATED;
    575      1.2    peter 		break;
    576      1.2    peter 
    577      1.1     ober 	default:
    578      1.2    peter 		return EINVAL;
    579      1.1     ober 	}
    580      1.2    peter 
    581      1.2    peter 	return 0;
    582      1.1     ober }
    583      1.1     ober 
    584      1.2    peter static int
    585      1.1     ober zaudio_set_params(void *hdl, int setmode, int usemode,
    586      1.2    peter     audio_params_t *play, audio_params_t *rec,
    587      1.2    peter     stream_filter_list_t *pfil, stream_filter_list_t *rfil)
    588      1.1     ober {
    589      1.1     ober 	struct zaudio_softc *sc = hdl;
    590      1.2    peter 	struct audio_params *p;
    591      1.2    peter 	stream_filter_list_t *fil;
    592      1.2    peter 	int mode, i;
    593      1.2    peter 
    594      1.2    peter 	if (play->sample_rate != rec->sample_rate &&
    595      1.2    peter 	    usemode == (AUMODE_PLAY | AUMODE_RECORD)) {
    596      1.2    peter 		if (setmode == AUMODE_PLAY) {
    597      1.2    peter 			rec->sample_rate = play->sample_rate;
    598      1.2    peter 			setmode |= AUMODE_RECORD;
    599      1.2    peter 		} else if (setmode == AUMODE_RECORD) {
    600      1.2    peter 			play->sample_rate = rec->sample_rate;
    601      1.2    peter 			setmode |= AUMODE_PLAY;
    602      1.2    peter 		} else
    603      1.2    peter 			return EINVAL;
    604      1.2    peter 	}
    605      1.2    peter 
    606      1.2    peter 	for (mode = AUMODE_RECORD; mode != -1;
    607      1.2    peter 	     mode = (mode == AUMODE_RECORD) ? AUMODE_PLAY : -1) {
    608      1.2    peter 		if ((setmode & mode) == 0)
    609      1.2    peter 			continue;
    610      1.2    peter 
    611      1.2    peter 		p = (mode == AUMODE_PLAY) ? play : rec;
    612      1.2    peter 
    613      1.2    peter 		if (p->sample_rate < 4000 || p->sample_rate > 48000 ||
    614      1.2    peter 		    (p->precision != 8 && p->precision != 16) ||
    615      1.2    peter 		    (p->channels != 1 && p->channels != 2))
    616      1.2    peter 			return EINVAL;
    617      1.2    peter 
    618      1.2    peter 		fil = (mode == AUMODE_PLAY) ? pfil : rfil;
    619      1.2    peter 		i = auconv_set_converter(zaudio_formats, ZAUDIO_NFORMATS,
    620      1.3  thorpej 					 mode, p, false, fil);
    621      1.2    peter 		if (i < 0)
    622      1.2    peter 			return EINVAL;
    623      1.2    peter 	}
    624      1.2    peter 
    625      1.2    peter 	if (setmode == AUMODE_RECORD)
    626      1.2    peter 		pxa2x0_i2s_setspeed(&sc->sc_i2s, &rec->sample_rate);
    627      1.2    peter 	else
    628      1.1     ober 		pxa2x0_i2s_setspeed(&sc->sc_i2s, &play->sample_rate);
    629      1.1     ober 
    630      1.2    peter 	return 0;
    631      1.2    peter }
    632      1.1     ober 
    633      1.2    peter static int
    634      1.2    peter zaudio_round_blocksize(void *hdl, int bs, int mode, const audio_params_t *param)
    635      1.2    peter {
    636      1.2    peter 	struct zaudio_softc *sc = hdl;
    637      1.1     ober 
    638      1.2    peter 	return pxa2x0_i2s_round_blocksize(&sc->sc_i2s, bs, mode, param);
    639      1.1     ober }
    640      1.1     ober 
    641      1.2    peter 
    642      1.2    peter static int
    643      1.1     ober zaudio_halt_output(void *hdl)
    644      1.1     ober {
    645      1.1     ober 	struct zaudio_softc *sc = hdl;
    646      1.2    peter 	int rv;
    647      1.1     ober 
    648      1.2    peter 	rv = pxa2x0_i2s_halt_output(&sc->sc_i2s);
    649      1.1     ober 	zaudio_standby(sc);
    650      1.1     ober 	sc->sc_playing = 0;
    651      1.1     ober 
    652      1.2    peter 	return rv;
    653      1.1     ober }
    654      1.1     ober 
    655      1.2    peter static int
    656      1.1     ober zaudio_halt_input(void *hdl)
    657      1.1     ober {
    658      1.2    peter 	struct zaudio_softc *sc = hdl;
    659      1.2    peter 	int rv;
    660      1.2    peter 
    661      1.2    peter 	rv = pxa2x0_i2s_halt_input(&sc->sc_i2s);
    662      1.1     ober 
    663      1.2    peter 	return rv;
    664      1.1     ober }
    665      1.1     ober 
    666      1.2    peter static int
    667      1.1     ober zaudio_getdev(void *hdl, struct audio_device *ret)
    668      1.1     ober {
    669      1.1     ober 	/* struct zaudio_softc *sc = hdl; */
    670      1.1     ober 
    671      1.1     ober 	*ret = wm8750_device;
    672      1.1     ober 	return 0;
    673      1.1     ober }
    674      1.1     ober 
    675      1.1     ober #define ZAUDIO_SPKR_LVL		0
    676      1.1     ober #define ZAUDIO_SPKR_MUTE	1
    677      1.1     ober #define ZAUDIO_HP_LVL		2
    678      1.1     ober #define ZAUDIO_HP_MUTE		3
    679      1.1     ober #define ZAUDIO_OUTPUT_CLASS	4
    680      1.1     ober 
    681      1.2    peter static int
    682      1.1     ober zaudio_set_port(void *hdl, struct mixer_ctrl *mc)
    683      1.1     ober {
    684      1.1     ober 	struct zaudio_softc *sc = hdl;
    685      1.2    peter 	int error = EINVAL;
    686      1.2    peter 	int s;
    687      1.1     ober 
    688      1.1     ober 	s = splbio();
    689      1.1     ober 	pxa2x0_i2c_open(&sc->sc_i2c);
    690      1.1     ober 
    691      1.1     ober 	switch (mc->dev) {
    692      1.1     ober 	case ZAUDIO_SPKR_LVL:
    693      1.1     ober 		if (mc->type != AUDIO_MIXER_VALUE)
    694      1.1     ober 			break;
    695      1.1     ober 		if (mc->un.value.num_channels == 1)
    696      1.1     ober 			sc->sc_volume[ZAUDIO_OP_SPKR].left =
    697      1.1     ober 			    mc->un.value.level[AUDIO_MIXER_LEVEL_MONO];
    698      1.1     ober 		else
    699      1.1     ober 			break;
    700      1.1     ober 		zaudio_update_volume(sc, ZAUDIO_OP_SPKR);
    701      1.1     ober 		error = 0;
    702      1.1     ober 		break;
    703      1.2    peter 
    704      1.1     ober 	case ZAUDIO_SPKR_MUTE:
    705      1.1     ober 		if (mc->type != AUDIO_MIXER_ENUM)
    706      1.1     ober 			break;
    707      1.1     ober 		sc->sc_unmute[ZAUDIO_OP_SPKR] = mc->un.ord ? 1 : 0;
    708      1.1     ober 		zaudio_update_mutes(sc);
    709      1.1     ober 		error = 0;
    710      1.1     ober 		break;
    711      1.2    peter 
    712      1.1     ober 	case ZAUDIO_HP_LVL:
    713      1.1     ober 		if (mc->type != AUDIO_MIXER_VALUE)
    714      1.1     ober 			break;
    715      1.1     ober 		if (mc->un.value.num_channels == 1) {
    716      1.1     ober 			sc->sc_volume[ZAUDIO_OP_HP].left =
    717      1.1     ober 			    mc->un.value.level[AUDIO_MIXER_LEVEL_MONO];
    718      1.1     ober 			sc->sc_volume[ZAUDIO_OP_HP].right =
    719      1.1     ober 			    mc->un.value.level[AUDIO_MIXER_LEVEL_MONO];
    720      1.1     ober 		} else if (mc->un.value.num_channels == 2) {
    721      1.1     ober 			sc->sc_volume[ZAUDIO_OP_HP].left =
    722      1.1     ober 			    mc->un.value.level[AUDIO_MIXER_LEVEL_LEFT];
    723      1.1     ober 			sc->sc_volume[ZAUDIO_OP_HP].right =
    724      1.1     ober 			    mc->un.value.level[AUDIO_MIXER_LEVEL_RIGHT];
    725      1.1     ober 		}
    726      1.1     ober 		else
    727      1.1     ober 			break;
    728      1.1     ober 		zaudio_update_volume(sc, ZAUDIO_OP_HP);
    729      1.1     ober 		error = 0;
    730      1.1     ober 		break;
    731      1.2    peter 
    732      1.1     ober 	case ZAUDIO_HP_MUTE:
    733      1.1     ober 		if (mc->type != AUDIO_MIXER_ENUM)
    734      1.1     ober 			break;
    735      1.1     ober 		sc->sc_unmute[ZAUDIO_OP_HP] = mc->un.ord ? 1 : 0;
    736      1.1     ober 		zaudio_update_mutes(sc);
    737      1.1     ober 		error = 0;
    738      1.1     ober 		break;
    739      1.1     ober 	}
    740      1.1     ober 
    741      1.1     ober 	pxa2x0_i2c_close(&sc->sc_i2c);
    742      1.1     ober 	splx(s);
    743      1.1     ober 
    744      1.1     ober 	return error;
    745      1.1     ober }
    746      1.1     ober 
    747      1.2    peter static int
    748      1.1     ober zaudio_get_port(void *hdl, struct mixer_ctrl *mc)
    749      1.1     ober {
    750      1.1     ober 	struct zaudio_softc *sc = hdl;
    751      1.1     ober 	int error = EINVAL;
    752      1.1     ober 
    753      1.1     ober 	switch (mc->dev) {
    754      1.1     ober 	case ZAUDIO_SPKR_LVL:
    755      1.1     ober 		if (mc->type != AUDIO_MIXER_VALUE)
    756      1.1     ober 			break;
    757      1.1     ober 		if (mc->un.value.num_channels == 1)
    758      1.1     ober 			mc->un.value.level[AUDIO_MIXER_LEVEL_MONO] =
    759      1.1     ober 			    sc->sc_volume[ZAUDIO_OP_SPKR].left;
    760      1.1     ober 		else
    761      1.1     ober 			break;
    762      1.1     ober 		error = 0;
    763      1.1     ober 		break;
    764      1.2    peter 
    765      1.1     ober 	case ZAUDIO_SPKR_MUTE:
    766      1.1     ober 		if (mc->type != AUDIO_MIXER_ENUM)
    767      1.1     ober 			break;
    768      1.1     ober 		mc->un.ord = sc->sc_unmute[ZAUDIO_OP_SPKR] ? 1 : 0;
    769      1.1     ober 		error = 0;
    770      1.1     ober 		break;
    771      1.2    peter 
    772      1.1     ober 	case ZAUDIO_HP_LVL:
    773      1.1     ober 		if (mc->type != AUDIO_MIXER_VALUE)
    774      1.1     ober 			break;
    775      1.1     ober 		if (mc->un.value.num_channels == 1)
    776      1.1     ober 			mc->un.value.level[AUDIO_MIXER_LEVEL_MONO] =
    777      1.1     ober 			    sc->sc_volume[ZAUDIO_OP_HP].left;
    778      1.1     ober 		else if (mc->un.value.num_channels == 2) {
    779      1.1     ober 			mc->un.value.level[AUDIO_MIXER_LEVEL_LEFT] =
    780      1.1     ober 			    sc->sc_volume[ZAUDIO_OP_HP].left;
    781      1.1     ober 			mc->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] =
    782      1.1     ober 			    sc->sc_volume[ZAUDIO_OP_HP].right;
    783      1.1     ober 		}
    784      1.1     ober 		else
    785      1.1     ober 			break;
    786      1.1     ober 		error = 0;
    787      1.1     ober 		break;
    788      1.2    peter 
    789      1.1     ober 	case ZAUDIO_HP_MUTE:
    790      1.1     ober 		if (mc->type != AUDIO_MIXER_ENUM)
    791      1.1     ober 			break;
    792      1.1     ober 		mc->un.ord = sc->sc_unmute[ZAUDIO_OP_HP] ? 1 : 0;
    793      1.1     ober 		error = 0;
    794      1.1     ober 		break;
    795      1.1     ober 	}
    796      1.1     ober 
    797      1.1     ober 	return error;
    798      1.1     ober }
    799      1.1     ober 
    800      1.2    peter static int
    801      1.1     ober zaudio_query_devinfo(void *hdl, struct mixer_devinfo *di)
    802      1.1     ober {
    803      1.1     ober 	/* struct zaudio_softc *sc = hdl; */
    804      1.1     ober 
    805      1.1     ober 	switch (di->index) {
    806      1.1     ober 	case ZAUDIO_SPKR_LVL:
    807      1.1     ober 		di->type = AUDIO_MIXER_VALUE;
    808      1.1     ober 		di->mixer_class = ZAUDIO_OUTPUT_CLASS;
    809      1.1     ober 		di->prev = AUDIO_MIXER_LAST;
    810      1.1     ober 		di->next = ZAUDIO_SPKR_MUTE;
    811      1.1     ober 		strlcpy(di->label.name, AudioNspeaker,
    812      1.1     ober 		    sizeof(di->label.name));
    813      1.1     ober 		strlcpy(di->un.v.units.name, AudioNvolume,
    814      1.1     ober 		    sizeof(di->un.v.units.name));
    815      1.1     ober 		di->un.v.num_channels = 1;
    816      1.1     ober 		break;
    817      1.2    peter 
    818      1.1     ober 	case ZAUDIO_SPKR_MUTE:
    819      1.1     ober 		di->type = AUDIO_MIXER_ENUM;
    820      1.1     ober 		di->mixer_class = ZAUDIO_OUTPUT_CLASS;
    821      1.1     ober 		di->prev = ZAUDIO_SPKR_LVL;
    822      1.1     ober 		di->next = AUDIO_MIXER_LAST;
    823      1.1     ober 		goto mute;
    824      1.2    peter 
    825      1.1     ober 	case ZAUDIO_HP_LVL:
    826      1.1     ober 		di->type = AUDIO_MIXER_VALUE;
    827      1.1     ober 		di->mixer_class = ZAUDIO_OUTPUT_CLASS;
    828      1.1     ober 		di->prev = AUDIO_MIXER_LAST;
    829      1.1     ober 		di->next = ZAUDIO_HP_MUTE;
    830      1.1     ober 		strlcpy(di->label.name, AudioNheadphone,
    831      1.1     ober 		    sizeof(di->label.name));
    832      1.1     ober 		di->un.v.num_channels = 1;
    833      1.1     ober 		strlcpy(di->un.v.units.name, AudioNvolume,
    834      1.1     ober 		    sizeof(di->un.v.units.name));
    835      1.1     ober 		break;
    836      1.2    peter 
    837      1.1     ober 	case ZAUDIO_HP_MUTE:
    838      1.1     ober 		di->type = AUDIO_MIXER_ENUM;
    839      1.1     ober 		di->mixer_class = ZAUDIO_OUTPUT_CLASS;
    840      1.1     ober 		di->prev = ZAUDIO_HP_LVL;
    841      1.1     ober 		di->next = AUDIO_MIXER_LAST;
    842      1.1     ober mute:
    843      1.1     ober 		strlcpy(di->label.name, AudioNmute, sizeof(di->label.name));
    844      1.1     ober 		di->un.e.num_mem = 2;
    845      1.1     ober 		strlcpy(di->un.e.member[0].label.name, AudioNon,
    846      1.1     ober 		    sizeof(di->un.e.member[0].label.name));
    847      1.1     ober 		di->un.e.member[0].ord = 0;
    848      1.1     ober 		strlcpy(di->un.e.member[1].label.name, AudioNoff,
    849      1.1     ober 		    sizeof(di->un.e.member[1].label.name));
    850      1.1     ober 		di->un.e.member[1].ord = 1;
    851      1.1     ober 		break;
    852      1.2    peter 
    853      1.1     ober 	case ZAUDIO_OUTPUT_CLASS:
    854      1.1     ober 		di->type = AUDIO_MIXER_CLASS;
    855      1.1     ober 		di->mixer_class = ZAUDIO_OUTPUT_CLASS;
    856      1.1     ober 		di->prev = AUDIO_MIXER_LAST;
    857      1.1     ober 		di->next = AUDIO_MIXER_LAST;
    858      1.1     ober 		strlcpy(di->label.name, AudioCoutputs,
    859      1.1     ober 		    sizeof(di->label.name));
    860      1.1     ober 		break;
    861      1.2    peter 
    862      1.1     ober 	default:
    863      1.1     ober 		return ENXIO;
    864      1.1     ober 	}
    865      1.1     ober 
    866      1.1     ober 	return 0;
    867      1.1     ober }
    868      1.1     ober 
    869      1.2    peter static void *
    870      1.2    peter zaudio_allocm(void *hdl, int direction, size_t size,
    871      1.2    peter     struct malloc_type *type, int flags)
    872      1.2    peter {
    873      1.2    peter 	struct zaudio_softc *sc = hdl;
    874      1.2    peter 
    875      1.2    peter 	return pxa2x0_i2s_allocm(&sc->sc_i2s, direction, size, type, flags);
    876      1.2    peter }
    877      1.2    peter 
    878      1.2    peter static void
    879      1.2    peter zaudio_freem(void *hdl, void *ptr, struct malloc_type *type)
    880      1.2    peter {
    881      1.2    peter 	struct zaudio_softc *sc = hdl;
    882      1.2    peter 
    883      1.2    peter 	return pxa2x0_i2s_freem(&sc->sc_i2s, ptr, type);
    884      1.2    peter }
    885      1.2    peter 
    886      1.2    peter static size_t
    887      1.2    peter zaudio_round_buffersize(void *hdl, int direction, size_t bufsize)
    888      1.2    peter {
    889      1.2    peter 	struct zaudio_softc *sc = hdl;
    890      1.2    peter 
    891      1.2    peter 	return pxa2x0_i2s_round_buffersize(&sc->sc_i2s, direction, bufsize);
    892      1.2    peter }
    893      1.2    peter 
    894      1.2    peter static paddr_t
    895      1.2    peter zaudio_mappage(void *hdl, void *mem, off_t off, int prot)
    896      1.2    peter {
    897      1.2    peter 	struct zaudio_softc *sc = hdl;
    898      1.2    peter 
    899      1.2    peter 	return pxa2x0_i2s_mappage(&sc->sc_i2s, mem, off, prot);
    900      1.2    peter }
    901      1.2    peter 
    902      1.2    peter static int
    903      1.1     ober zaudio_get_props(void *hdl)
    904      1.1     ober {
    905      1.2    peter 
    906      1.2    peter 	return AUDIO_PROP_MMAP|AUDIO_PROP_INDEPENDENT|AUDIO_PROP_FULLDUPLEX;
    907      1.1     ober }
    908      1.1     ober 
    909      1.2    peter static int
    910      1.1     ober zaudio_start_output(void *hdl, void *block, int bsize, void (*intr)(void *),
    911      1.1     ober     void *intrarg)
    912      1.1     ober {
    913      1.1     ober 	struct zaudio_softc *sc = hdl;
    914      1.2    peter 	int rv;
    915      1.1     ober 
    916      1.1     ober 	/* Power up codec if we are not already playing. */
    917      1.1     ober 	if (!sc->sc_playing) {
    918      1.1     ober 		sc->sc_playing = 1;
    919      1.1     ober 		zaudio_play_setup(sc);
    920      1.1     ober 	}
    921      1.1     ober 
    922      1.1     ober 	/* Start DMA via I2S */
    923      1.2    peter 	rv = pxa2x0_i2s_start_output(&sc->sc_i2s, block, bsize, intr, intrarg);
    924      1.2    peter 	if (rv) {
    925      1.1     ober 		zaudio_standby(sc);
    926      1.1     ober 		sc->sc_playing = 0;
    927      1.1     ober 	}
    928      1.2    peter 	return rv;
    929      1.1     ober }
    930      1.1     ober 
    931      1.2    peter static int
    932      1.1     ober zaudio_start_input(void *hdl, void *block, int bsize, void (*intr)(void *),
    933      1.1     ober     void *intrarg)
    934      1.1     ober {
    935      1.2    peter 
    936      1.1     ober 	return ENXIO;
    937      1.1     ober }
    938