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