1 /* $NetBSD: zaudio.c,v 1.20 2012/10/27 17:18:14 chs Exp $ */ 2 /* $OpenBSD: zaurus_audio.c,v 1.8 2005/08/18 13:23:02 robert Exp $ */ 3 4 /* 5 * Copyright (c) 2005 Christopher Pascoe <pascoe@openbsd.org> 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 /*- 21 * Copyright (C) 2009 NONAKA Kimihiro <nonaka@netbsd.org> 22 * All rights reserved. 23 * 24 * Redistribution and use in source and binary forms, with or without 25 * modification, are permitted provided that the following conditions 26 * are met: 27 * 1. Redistributions of source code must retain the above copyright 28 * notice, this list of conditions and the following disclaimer. 29 * 2. Redistributions in binary form must reproduce the above copyright 30 * notice, this list of conditions and the following disclaimer in the 31 * documentation and/or other materials provided with the distribution. 32 * 33 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 34 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 35 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 36 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 37 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 38 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 39 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 40 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 41 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 42 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 43 */ 44 45 /* 46 * TODO: 47 * - powerhooks (currently only works until first suspend) 48 */ 49 50 #include "opt_zaudio.h" 51 52 #include <sys/cdefs.h> 53 __KERNEL_RCSID(0, "$NetBSD: zaudio.c,v 1.20 2012/10/27 17:18:14 chs 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