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