1 1.3 isaki /* $NetBSD: wm8731_zaudio.c,v 1.3 2019/05/08 13:40:17 isaki Exp $ */ 2 1.1 nonaka 3 1.1 nonaka /*- 4 1.1 nonaka * Copyright (c) 2013 The NetBSD Foundation, Inc. 5 1.1 nonaka * All rights reserved. 6 1.1 nonaka * 7 1.1 nonaka * This code is derived from software contributed to The NetBSD Foundation 8 1.1 nonaka * by TOYOKURA Atsushi. 9 1.1 nonaka * 10 1.1 nonaka * Redistribution and use in source and binary forms, with or without 11 1.1 nonaka * modification, are permitted provided that the following conditions 12 1.1 nonaka * are met: 13 1.1 nonaka * 1. Redistributions of source code must retain the above copyright 14 1.1 nonaka * notice, this list of conditions and the following disclaimer. 15 1.1 nonaka * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 nonaka * notice, this list of conditions and the following disclaimer in the 17 1.1 nonaka * documentation and/or other materials provided with the distribution. 18 1.1 nonaka * 19 1.1 nonaka * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 nonaka * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 nonaka * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 nonaka * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 nonaka * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 nonaka * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 nonaka * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 nonaka * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 nonaka * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 nonaka * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 nonaka * POSSIBILITY OF SUCH DAMAGE. 30 1.1 nonaka */ 31 1.1 nonaka 32 1.1 nonaka /* 33 1.1 nonaka * TODO: 34 1.1 nonaka * - powerhooks (currently only works until first suspend) 35 1.1 nonaka */ 36 1.1 nonaka 37 1.1 nonaka #include "opt_cputypes.h" 38 1.1 nonaka #include "opt_zaudio.h" 39 1.1 nonaka 40 1.1 nonaka #include <sys/cdefs.h> 41 1.3 isaki __KERNEL_RCSID(0, "$NetBSD: wm8731_zaudio.c,v 1.3 2019/05/08 13:40:17 isaki Exp $"); 42 1.1 nonaka 43 1.1 nonaka #include <sys/param.h> 44 1.1 nonaka #include <sys/systm.h> 45 1.1 nonaka #include <sys/callout.h> 46 1.1 nonaka #include <sys/device.h> 47 1.1 nonaka #include <sys/kmem.h> 48 1.1 nonaka #include <sys/kernel.h> 49 1.1 nonaka #include <sys/audioio.h> 50 1.1 nonaka #include <sys/mutex.h> 51 1.1 nonaka #include <sys/intr.h> 52 1.1 nonaka #include <sys/bus.h> 53 1.1 nonaka 54 1.3 isaki #include <dev/audio/audio_if.h> 55 1.1 nonaka 56 1.1 nonaka #include <dev/i2c/i2cvar.h> 57 1.1 nonaka 58 1.1 nonaka #include <arm/xscale/pxa2x0reg.h> 59 1.1 nonaka #include <arm/xscale/pxa2x0var.h> 60 1.1 nonaka #include <arm/xscale/pxa2x0_i2c.h> 61 1.1 nonaka #include <arm/xscale/pxa2x0_i2s.h> 62 1.1 nonaka #include <arm/xscale/pxa2x0_dmac.h> 63 1.1 nonaka #include <arm/xscale/pxa2x0_gpio.h> 64 1.1 nonaka 65 1.1 nonaka #include <zaurus/zaurus/zaurus_var.h> 66 1.1 nonaka #include <zaurus/dev/zaudiovar.h> 67 1.1 nonaka #include <zaurus/dev/wm8731reg.h> 68 1.1 nonaka #include <zaurus/dev/wm8731var.h> 69 1.1 nonaka #include <zaurus/dev/scoopvar.h> 70 1.1 nonaka 71 1.1 nonaka #define WM8731_ADDRESS 0x1B 72 1.1 nonaka 73 1.1 nonaka /* GPIO pins */ 74 1.1 nonaka #define GPIO_HP_IN_C860 4 75 1.1 nonaka 76 1.1 nonaka #define WM8731_OP_SPKR 0 77 1.1 nonaka #define WM8731_OP_MIC 1 78 1.1 nonaka #define WM8731_OP_NUM 2 79 1.1 nonaka 80 1.1 nonaka static int wm8731_finalize(device_t); 81 1.1 nonaka static bool wm8731_suspend(device_t, const pmf_qual_t *); 82 1.1 nonaka static bool wm8731_resume(device_t, const pmf_qual_t *); 83 1.1 nonaka static void wm8731_volume_up(device_t); 84 1.1 nonaka static void wm8731_volume_down(device_t); 85 1.1 nonaka static void wm8731_volume_toggle(device_t); 86 1.1 nonaka 87 1.1 nonaka static struct audio_device wm8731_device = { 88 1.1 nonaka "WM8731", 89 1.1 nonaka "1.0", 90 1.1 nonaka "wm" 91 1.1 nonaka }; 92 1.1 nonaka 93 1.1 nonaka static void wm8731_init(struct zaudio_softc *); 94 1.1 nonaka static int wm8731_jack_intr(void *); 95 1.1 nonaka static void wm8731_jack(void *); 96 1.1 nonaka static void wm8731_standby(struct zaudio_softc *); 97 1.1 nonaka static void wm8731_update_volume(struct zaudio_softc *, int); 98 1.1 nonaka static void wm8731_update_mutes(struct zaudio_softc *, int); 99 1.1 nonaka static void wm8731_play_setup(struct zaudio_softc *); 100 1.1 nonaka /*static*/ void wm8731_record_setup(struct zaudio_softc *); 101 1.1 nonaka static int wm8731_start_output(void *, void *, int, void (*)(void *), void *); 102 1.1 nonaka static int wm8731_start_input(void *, void *, int, void (*)(void *), void *); 103 1.1 nonaka static int wm8731_halt_output(void *); 104 1.1 nonaka static int wm8731_halt_input(void *); 105 1.1 nonaka static int wm8731_getdev(void *, struct audio_device *); 106 1.1 nonaka static int wm8731_set_port(void *, struct mixer_ctrl *); 107 1.1 nonaka static int wm8731_get_port(void *, struct mixer_ctrl *); 108 1.1 nonaka static int wm8731_query_devinfo(void *, struct mixer_devinfo *); 109 1.1 nonaka 110 1.1 nonaka static struct audio_hw_if wm8731_hw_if = { 111 1.1 nonaka .open = zaudio_open, 112 1.1 nonaka .close = zaudio_close, 113 1.3 isaki .query_format = zaudio_query_format, 114 1.3 isaki .set_format = zaudio_set_format, 115 1.1 nonaka .round_blocksize = zaudio_round_blocksize, 116 1.1 nonaka .commit_settings = NULL, 117 1.1 nonaka .init_output = NULL, 118 1.1 nonaka .init_input = NULL, 119 1.1 nonaka .start_output = wm8731_start_output, 120 1.1 nonaka .start_input = wm8731_start_input, 121 1.1 nonaka .halt_output = wm8731_halt_output, 122 1.1 nonaka .halt_input = wm8731_halt_input, 123 1.1 nonaka .speaker_ctl = NULL, 124 1.1 nonaka .getdev = wm8731_getdev, 125 1.1 nonaka .set_port = wm8731_set_port, 126 1.1 nonaka .get_port = wm8731_get_port, 127 1.1 nonaka .query_devinfo = wm8731_query_devinfo, 128 1.1 nonaka .allocm = zaudio_allocm, 129 1.1 nonaka .freem = zaudio_freem, 130 1.1 nonaka .round_buffersize = zaudio_round_buffersize, 131 1.1 nonaka .get_props = zaudio_get_props, 132 1.1 nonaka .trigger_output = NULL, 133 1.1 nonaka .trigger_input = NULL, 134 1.1 nonaka .dev_ioctl = NULL, 135 1.1 nonaka .get_locks = zaudio_get_locks, 136 1.1 nonaka }; 137 1.1 nonaka 138 1.1 nonaka static const uint16_t playback_regs[][2] = { 139 1.1 nonaka /* Power Down Control */ 140 1.1 nonaka { WM8731_PD_REG, WM8731_CLKOUTPD | WM8731_OSCPD | WM8731_OUTPD 141 1.1 nonaka | WM8731_ADCPD | WM8731_MICPD | WM8731_LINEINPD }, 142 1.1 nonaka 143 1.1 nonaka /* Digital Audio Path Control */ 144 1.1 nonaka { WM8731_DAP_REG, 0 }, 145 1.1 nonaka 146 1.1 nonaka /* Analogue Audio Path Control */ 147 1.1 nonaka { WM8731_AAP_REG, WM8731_DACSEL | WM8731_MUTEMIC }, 148 1.1 nonaka 149 1.1 nonaka /* Activating DSP and DAI */ 150 1.1 nonaka { WM8731_AC_REG, WM8731_ACTIVE }, 151 1.1 nonaka 152 1.1 nonaka /* End of list */ 153 1.1 nonaka { 0xffff, 0xffff } 154 1.1 nonaka }; 155 1.1 nonaka 156 1.1 nonaka static const uint16_t record_regs[][2] = { 157 1.1 nonaka /* Power Down Control */ 158 1.1 nonaka { WM8731_PD_REG, WM8731_CLKOUTPD | WM8731_OSCPD | WM8731_DACPD 159 1.1 nonaka | WM8731_LINEINPD }, 160 1.1 nonaka 161 1.1 nonaka /* Digital Audio Path Control */ 162 1.1 nonaka { WM8731_DAP_REG, 0 }, 163 1.1 nonaka 164 1.1 nonaka /* Analogue Audio Path Control */ 165 1.1 nonaka { WM8731_AAP_REG, WM8731_INSEL | WM8731_MICBOOST }, 166 1.1 nonaka 167 1.1 nonaka /* Activating DSP and DAI */ 168 1.1 nonaka { WM8731_AC_REG, WM8731_ACTIVE }, 169 1.1 nonaka 170 1.1 nonaka /* End of list */ 171 1.1 nonaka { 0xffff, 0xffff } 172 1.1 nonaka }; 173 1.1 nonaka 174 1.1 nonaka static __inline int 175 1.1 nonaka wm8731_write(struct zaudio_softc *sc, int reg, int val) 176 1.1 nonaka { 177 1.1 nonaka uint16_t tmp; 178 1.1 nonaka uint8_t cmd; 179 1.1 nonaka uint8_t data; 180 1.1 nonaka 181 1.1 nonaka tmp = (reg << 9) | (val & 0x1ff); 182 1.1 nonaka cmd = tmp >> 8; 183 1.1 nonaka data = tmp; 184 1.1 nonaka return iic_exec(sc->sc_i2c, I2C_OP_WRITE_WITH_STOP, WM8731_ADDRESS, 185 1.1 nonaka &cmd, 1, &data, 1, 0); 186 1.1 nonaka } 187 1.1 nonaka 188 1.1 nonaka int 189 1.1 nonaka wm8731_match(device_t parent, cfdata_t cf, struct i2c_attach_args *ia) 190 1.1 nonaka { 191 1.2 thorpej int match_result; 192 1.1 nonaka 193 1.1 nonaka if (ZAURUS_ISC1000 || ZAURUS_ISC3000) 194 1.1 nonaka return 0; 195 1.1 nonaka 196 1.2 thorpej if (iic_use_direct_match(ia, cf, NULL, &match_result)) 197 1.2 thorpej return match_result; 198 1.2 thorpej 199 1.2 thorpej /* indirect config - check typical address */ 200 1.2 thorpej if (ia->ia_addr == WM8731_ADDRESS) 201 1.2 thorpej return I2C_MATCH_ADDRESS_ONLY; 202 1.2 thorpej 203 1.1 nonaka return 0; 204 1.1 nonaka } 205 1.1 nonaka 206 1.1 nonaka void 207 1.1 nonaka wm8731_attach(device_t parent, device_t self, struct i2c_attach_args *ia) 208 1.1 nonaka { 209 1.1 nonaka struct zaudio_softc *sc = device_private(self); 210 1.1 nonaka int error; 211 1.1 nonaka 212 1.1 nonaka aprint_normal(": I2S, WM8731 Audio\n"); 213 1.1 nonaka aprint_naive("\n"); 214 1.1 nonaka 215 1.1 nonaka /* Check for an I2C response from the wm8731 */ 216 1.1 nonaka iic_acquire_bus(sc->sc_i2c, 0); 217 1.1 nonaka error = wm8731_write(sc, WM8731_RESET_REG, 0); 218 1.1 nonaka iic_release_bus(sc->sc_i2c, 0); 219 1.1 nonaka if (error) { 220 1.1 nonaka aprint_error_dev(self, "codec failed to respond\n"); 221 1.1 nonaka goto fail_i2c; 222 1.1 nonaka } 223 1.1 nonaka delay(100); 224 1.1 nonaka 225 1.1 nonaka /* Allocate memory for volume & mute operations */ 226 1.1 nonaka sc->sc_volume = kmem_zalloc(sizeof(*sc->sc_volume) * WM8731_OP_NUM, 227 1.1 nonaka KM_SLEEP); 228 1.1 nonaka sc->sc_unmute = kmem_zalloc(sizeof(*sc->sc_unmute) * WM8731_OP_NUM, 229 1.1 nonaka KM_SLEEP); 230 1.1 nonaka sc->sc_unmute_toggle = kmem_zalloc( 231 1.1 nonaka sizeof(*sc->sc_unmute_toggle) * WM8731_OP_NUM, KM_SLEEP); 232 1.1 nonaka 233 1.1 nonaka /* Speaker On by default. */ 234 1.1 nonaka sc->sc_volume[WM8731_OP_SPKR].left = 180; 235 1.1 nonaka sc->sc_volume[WM8731_OP_SPKR].right = 180; 236 1.1 nonaka sc->sc_jack = FALSE; 237 1.1 nonaka UNMUTE(sc, WM8731_OP_SPKR, 1); 238 1.1 nonaka sc->sc_volume[WM8731_OP_MIC].left = 180; 239 1.1 nonaka UNMUTE(sc, WM8731_OP_MIC, 0); 240 1.1 nonaka 241 1.1 nonaka /* Configure headphone jack state change handling. */ 242 1.1 nonaka callout_setfunc(&sc->sc_to, wm8731_jack, sc); 243 1.1 nonaka pxa2x0_gpio_set_function(GPIO_HP_IN_C860, GPIO_IN); 244 1.1 nonaka (void) pxa2x0_gpio_intr_establish(GPIO_HP_IN_C860, IST_EDGE_BOTH, 245 1.1 nonaka IPL_BIO, wm8731_jack_intr, sc); 246 1.1 nonaka 247 1.1 nonaka /* wm8731_init() implicitly depends on ioexp or scoop */ 248 1.1 nonaka config_finalize_register(self, wm8731_finalize); 249 1.1 nonaka 250 1.1 nonaka audio_attach_mi(&wm8731_hw_if, sc, self); 251 1.1 nonaka 252 1.1 nonaka if (!pmf_device_register(self, wm8731_suspend, wm8731_resume)) 253 1.1 nonaka aprint_error_dev(self, "couldn't establish power handler\n"); 254 1.1 nonaka if (!pmf_event_register(self, PMFE_AUDIO_VOLUME_UP, 255 1.1 nonaka wm8731_volume_up, true)) 256 1.1 nonaka aprint_error_dev(self, "couldn't register event handler\n"); 257 1.1 nonaka if (!pmf_event_register(self, PMFE_AUDIO_VOLUME_DOWN, 258 1.1 nonaka wm8731_volume_down, true)) 259 1.1 nonaka aprint_error_dev(self, "couldn't register event handler\n"); 260 1.1 nonaka if (!pmf_event_register(self, PMFE_AUDIO_VOLUME_TOGGLE, 261 1.1 nonaka wm8731_volume_toggle, true)) 262 1.1 nonaka aprint_error_dev(self, "couldn't register event handler\n"); 263 1.1 nonaka 264 1.1 nonaka return; 265 1.1 nonaka 266 1.1 nonaka fail_i2c: 267 1.1 nonaka pxa2x0_i2s_detach_sub(&sc->sc_i2s); 268 1.1 nonaka } 269 1.1 nonaka 270 1.1 nonaka static int 271 1.1 nonaka wm8731_finalize(device_t dv) 272 1.1 nonaka { 273 1.1 nonaka struct zaudio_softc *sc = device_private(dv); 274 1.1 nonaka 275 1.1 nonaka wm8731_init(sc); 276 1.1 nonaka return 0; 277 1.1 nonaka } 278 1.1 nonaka 279 1.1 nonaka static bool 280 1.1 nonaka wm8731_suspend(device_t dv, const pmf_qual_t *qual) 281 1.1 nonaka { 282 1.1 nonaka struct zaudio_softc *sc = device_private(dv); 283 1.1 nonaka 284 1.1 nonaka callout_stop(&sc->sc_to); 285 1.1 nonaka wm8731_standby(sc); 286 1.1 nonaka 287 1.1 nonaka return true; 288 1.1 nonaka } 289 1.1 nonaka 290 1.1 nonaka static bool 291 1.1 nonaka wm8731_resume(device_t dv, const pmf_qual_t *qual) 292 1.1 nonaka { 293 1.1 nonaka struct zaudio_softc *sc = device_private(dv); 294 1.1 nonaka 295 1.1 nonaka pxa2x0_i2s_init(&sc->sc_i2s); 296 1.1 nonaka wm8731_init(sc); 297 1.1 nonaka 298 1.1 nonaka return true; 299 1.1 nonaka } 300 1.1 nonaka 301 1.1 nonaka static __inline uint8_t 302 1.1 nonaka vol_sadd(int vol, int stride) 303 1.1 nonaka { 304 1.1 nonaka 305 1.1 nonaka vol += stride; 306 1.1 nonaka if (vol > 255) 307 1.1 nonaka return 255; 308 1.1 nonaka return (uint8_t)vol; 309 1.1 nonaka } 310 1.1 nonaka 311 1.1 nonaka #ifndef ZAUDIO_VOLUME_STRIDE 312 1.1 nonaka #define ZAUDIO_VOLUME_STRIDE 8 313 1.1 nonaka #endif 314 1.1 nonaka 315 1.1 nonaka static void 316 1.1 nonaka wm8731_volume_up(device_t dv) 317 1.1 nonaka { 318 1.1 nonaka struct zaudio_softc *sc = device_private(dv); 319 1.1 nonaka int s; 320 1.1 nonaka 321 1.1 nonaka s = splbio(); 322 1.1 nonaka iic_acquire_bus(sc->sc_i2c, 0); 323 1.1 nonaka 324 1.1 nonaka sc->sc_volume[WM8731_OP_SPKR].left = 325 1.1 nonaka vol_sadd(sc->sc_volume[WM8731_OP_SPKR].left, ZAUDIO_VOLUME_STRIDE); 326 1.1 nonaka sc->sc_volume[WM8731_OP_SPKR].right = 327 1.1 nonaka vol_sadd(sc->sc_volume[WM8731_OP_SPKR].right, ZAUDIO_VOLUME_STRIDE); 328 1.1 nonaka 329 1.1 nonaka wm8731_update_volume(sc, WM8731_OP_SPKR); 330 1.1 nonaka 331 1.1 nonaka iic_release_bus(sc->sc_i2c, 0); 332 1.1 nonaka splx(s); 333 1.1 nonaka } 334 1.1 nonaka 335 1.1 nonaka static __inline uint8_t 336 1.1 nonaka vol_ssub(int vol, int stride) 337 1.1 nonaka { 338 1.1 nonaka 339 1.1 nonaka vol -= stride; 340 1.1 nonaka if (vol < 0) 341 1.1 nonaka return 0; 342 1.1 nonaka return (uint8_t)vol; 343 1.1 nonaka } 344 1.1 nonaka 345 1.1 nonaka static void 346 1.1 nonaka wm8731_volume_down(device_t dv) 347 1.1 nonaka { 348 1.1 nonaka struct zaudio_softc *sc = device_private(dv); 349 1.1 nonaka int s; 350 1.1 nonaka 351 1.1 nonaka s = splbio(); 352 1.1 nonaka iic_acquire_bus(sc->sc_i2c, 0); 353 1.1 nonaka 354 1.1 nonaka sc->sc_volume[WM8731_OP_SPKR].left = 355 1.1 nonaka vol_ssub(sc->sc_volume[WM8731_OP_SPKR].left, ZAUDIO_VOLUME_STRIDE); 356 1.1 nonaka sc->sc_volume[WM8731_OP_SPKR].right = 357 1.1 nonaka vol_ssub(sc->sc_volume[WM8731_OP_SPKR].right, ZAUDIO_VOLUME_STRIDE); 358 1.1 nonaka 359 1.1 nonaka wm8731_update_volume(sc, WM8731_OP_SPKR); 360 1.1 nonaka 361 1.1 nonaka iic_release_bus(sc->sc_i2c, 0); 362 1.1 nonaka splx(s); 363 1.1 nonaka } 364 1.1 nonaka 365 1.1 nonaka static void 366 1.1 nonaka wm8731_volume_toggle(device_t dv) 367 1.1 nonaka { 368 1.1 nonaka struct zaudio_softc *sc = device_private(dv); 369 1.1 nonaka int s; 370 1.1 nonaka 371 1.1 nonaka s = splbio(); 372 1.1 nonaka iic_acquire_bus(sc->sc_i2c, 0); 373 1.1 nonaka 374 1.1 nonaka if (!sc->sc_unmute[WM8731_OP_SPKR]) { 375 1.1 nonaka sc->sc_unmute[WM8731_OP_SPKR] = 376 1.1 nonaka sc->sc_unmute_toggle[WM8731_OP_SPKR]; 377 1.1 nonaka } else { 378 1.1 nonaka sc->sc_unmute[WM8731_OP_SPKR] = 0; 379 1.1 nonaka } 380 1.1 nonaka wm8731_update_mutes(sc, 1); 381 1.1 nonaka 382 1.1 nonaka iic_release_bus(sc->sc_i2c, 0); 383 1.1 nonaka splx(s); 384 1.1 nonaka } 385 1.1 nonaka 386 1.1 nonaka static void 387 1.1 nonaka wm8731_init(struct zaudio_softc *sc) 388 1.1 nonaka { 389 1.1 nonaka 390 1.1 nonaka iic_acquire_bus(sc->sc_i2c, 0); 391 1.1 nonaka 392 1.1 nonaka /* Reset the codec */ 393 1.1 nonaka wm8731_write(sc, WM8731_RESET_REG, 0); 394 1.1 nonaka delay(100); 395 1.1 nonaka 396 1.1 nonaka /* Switch to standby power only */ 397 1.1 nonaka wm8731_write(sc, WM8731_PD_REG, WM8731_CLKOUTPD | WM8731_OSCPD | 398 1.1 nonaka WM8731_OUTPD | WM8731_DACPD | WM8731_ADCPD | WM8731_MICPD | 399 1.1 nonaka WM8731_LINEINPD); 400 1.1 nonaka 401 1.1 nonaka /* Configure digital interface for I2S */ 402 1.1 nonaka wm8731_write(sc, WM8731_DAI_REG, WM8731_SET_IWL(2) | WM8731_SET_FORMAT(2)); 403 1.1 nonaka 404 1.1 nonaka /* Initialise volume levels */ 405 1.1 nonaka wm8731_update_volume(sc, WM8731_OP_SPKR); 406 1.1 nonaka wm8731_update_volume(sc, WM8731_OP_MIC); 407 1.1 nonaka 408 1.1 nonaka scoop_set_headphone(0); 409 1.1 nonaka scoop_set_speaker(0); 410 1.1 nonaka scoop_set_mic_bias(0); 411 1.1 nonaka 412 1.1 nonaka iic_release_bus(sc->sc_i2c, 0); 413 1.1 nonaka 414 1.1 nonaka /* Assume that the jack state has changed. */ 415 1.1 nonaka wm8731_jack(sc); 416 1.1 nonaka } 417 1.1 nonaka 418 1.1 nonaka static int 419 1.1 nonaka wm8731_jack_intr(void *v) 420 1.1 nonaka { 421 1.1 nonaka struct zaudio_softc *sc = v; 422 1.1 nonaka 423 1.1 nonaka if (!callout_active(&sc->sc_to)) 424 1.1 nonaka wm8731_jack(sc); 425 1.1 nonaka 426 1.1 nonaka return 1; 427 1.1 nonaka } 428 1.1 nonaka 429 1.1 nonaka static void 430 1.1 nonaka wm8731_jack(void *v) 431 1.1 nonaka { 432 1.1 nonaka struct zaudio_softc *sc = v; 433 1.1 nonaka 434 1.1 nonaka switch (sc->sc_state) { 435 1.1 nonaka case ZAUDIO_JACK_STATE_OUT: 436 1.1 nonaka if (pxa2x0_gpio_get_bit(GPIO_HP_IN_C860)) { 437 1.1 nonaka sc->sc_state = ZAUDIO_JACK_STATE_INS; 438 1.1 nonaka sc->sc_icount = 0; 439 1.1 nonaka } 440 1.1 nonaka break; 441 1.1 nonaka 442 1.1 nonaka case ZAUDIO_JACK_STATE_INS: 443 1.1 nonaka if (sc->sc_icount++ > 2) { 444 1.1 nonaka if (pxa2x0_gpio_get_bit(GPIO_HP_IN_C860)) { 445 1.1 nonaka sc->sc_state = ZAUDIO_JACK_STATE_IN; 446 1.1 nonaka sc->sc_jack = TRUE; 447 1.1 nonaka UNMUTE(sc, WM8731_OP_MIC, 1); 448 1.1 nonaka goto update_mutes; 449 1.1 nonaka } else 450 1.1 nonaka sc->sc_state = ZAUDIO_JACK_STATE_OUT; 451 1.1 nonaka } 452 1.1 nonaka break; 453 1.1 nonaka 454 1.1 nonaka case ZAUDIO_JACK_STATE_IN: 455 1.1 nonaka if (!pxa2x0_gpio_get_bit(GPIO_HP_IN_C860)) { 456 1.1 nonaka sc->sc_state = ZAUDIO_JACK_STATE_REM; 457 1.1 nonaka sc->sc_icount = 0; 458 1.1 nonaka } 459 1.1 nonaka break; 460 1.1 nonaka 461 1.1 nonaka case ZAUDIO_JACK_STATE_REM: 462 1.1 nonaka if (sc->sc_icount++ > 2) { 463 1.1 nonaka if (!pxa2x0_gpio_get_bit(GPIO_HP_IN_C860)) { 464 1.1 nonaka sc->sc_state = ZAUDIO_JACK_STATE_OUT; 465 1.1 nonaka sc->sc_jack = FALSE; 466 1.1 nonaka UNMUTE(sc, WM8731_OP_MIC, 0); 467 1.1 nonaka goto update_mutes; 468 1.1 nonaka } else 469 1.1 nonaka sc->sc_state = ZAUDIO_JACK_STATE_IN; 470 1.1 nonaka } 471 1.1 nonaka break; 472 1.1 nonaka } 473 1.1 nonaka 474 1.1 nonaka callout_schedule(&sc->sc_to, hz/4); 475 1.1 nonaka 476 1.1 nonaka return; 477 1.1 nonaka 478 1.1 nonaka update_mutes: 479 1.1 nonaka callout_stop(&sc->sc_to); 480 1.1 nonaka 481 1.1 nonaka if (sc->sc_playing || sc->sc_recording) { 482 1.1 nonaka iic_acquire_bus(sc->sc_i2c, 0); 483 1.1 nonaka if (sc->sc_playing) 484 1.1 nonaka wm8731_update_mutes(sc, 1); 485 1.1 nonaka if (sc->sc_recording) 486 1.1 nonaka wm8731_update_mutes(sc, 2); 487 1.1 nonaka iic_release_bus(sc->sc_i2c, 0); 488 1.1 nonaka } 489 1.1 nonaka } 490 1.1 nonaka 491 1.1 nonaka static void 492 1.1 nonaka wm8731_standby(struct zaudio_softc *sc) 493 1.1 nonaka { 494 1.1 nonaka 495 1.1 nonaka iic_acquire_bus(sc->sc_i2c, 0); 496 1.1 nonaka 497 1.1 nonaka /* Switch to standby power only */ 498 1.1 nonaka wm8731_write(sc, WM8731_PD_REG, WM8731_CLKOUTPD | WM8731_OSCPD | 499 1.1 nonaka WM8731_OUTPD | WM8731_DACPD | WM8731_ADCPD | WM8731_MICPD | 500 1.1 nonaka WM8731_LINEINPD); 501 1.1 nonaka 502 1.1 nonaka scoop_set_headphone(0); 503 1.1 nonaka scoop_set_speaker(0); 504 1.1 nonaka scoop_set_mic_bias(0); 505 1.1 nonaka 506 1.1 nonaka /* Activating DSP and DAI */ 507 1.1 nonaka wm8731_write(sc, WM8731_AC_REG, 0); 508 1.1 nonaka 509 1.1 nonaka iic_release_bus(sc->sc_i2c, 0); 510 1.1 nonaka } 511 1.1 nonaka 512 1.1 nonaka static void 513 1.1 nonaka wm8731_update_volume(struct zaudio_softc *sc, int output) 514 1.1 nonaka { 515 1.1 nonaka struct zaudio_volume *volume; 516 1.1 nonaka 517 1.1 nonaka switch (output) { 518 1.1 nonaka case WM8731_OP_SPKR: 519 1.1 nonaka volume = &sc->sc_volume[WM8731_OP_SPKR]; 520 1.1 nonaka wm8731_write(sc, WM8731_LHP_REG, 521 1.1 nonaka WM8731_SET_LHPVOL(volume->left >> 1)); 522 1.1 nonaka wm8731_write(sc, WM8731_RHP_REG, 523 1.1 nonaka WM8731_SET_RHPVOL(volume->right >> 1)); 524 1.1 nonaka break; 525 1.1 nonaka 526 1.1 nonaka case WM8731_OP_MIC: 527 1.1 nonaka volume = &sc->sc_volume[WM8731_OP_MIC]; 528 1.1 nonaka wm8731_write(sc, WM8731_LIN_REG, WM8731_LRINBOTH | 529 1.1 nonaka WM8731_SET_LINVOL(volume->left >> 3)); 530 1.1 nonaka break; 531 1.1 nonaka } 532 1.1 nonaka } 533 1.1 nonaka 534 1.1 nonaka static void 535 1.1 nonaka wm8731_update_mutes(struct zaudio_softc *sc, int mask) 536 1.1 nonaka { 537 1.1 nonaka uint16_t val = WM8731_CLKOUTPD | WM8731_OSCPD | WM8731_LINEINPD; 538 1.1 nonaka 539 1.1 nonaka /* playback */ 540 1.1 nonaka if (mask & 1) { 541 1.1 nonaka val |= WM8731_ADCPD | WM8731_MICPD; 542 1.1 nonaka if (!sc->sc_unmute[WM8731_OP_SPKR]) { 543 1.1 nonaka val |= WM8731_OUTPD | WM8731_DACPD; 544 1.1 nonaka } 545 1.1 nonaka wm8731_write(sc, WM8731_PD_REG, val); 546 1.1 nonaka scoop_set_headphone(sc->sc_unmute[WM8731_OP_SPKR] & sc->sc_jack); 547 1.1 nonaka scoop_set_speaker(sc->sc_unmute[WM8731_OP_SPKR] & !sc->sc_jack); 548 1.1 nonaka } 549 1.1 nonaka 550 1.1 nonaka /* record */ 551 1.1 nonaka if (mask & 2) { 552 1.1 nonaka val = WM8731_OUTPD | WM8731_DACPD; 553 1.1 nonaka if (!sc->sc_unmute[WM8731_OP_MIC]) { 554 1.1 nonaka val |= WM8731_ADCPD | WM8731_MICPD; 555 1.1 nonaka } 556 1.1 nonaka wm8731_write(sc, WM8731_PD_REG, val); 557 1.1 nonaka scoop_set_mic_bias(sc->sc_unmute[WM8731_OP_MIC]); 558 1.1 nonaka } 559 1.1 nonaka } 560 1.1 nonaka 561 1.1 nonaka static void 562 1.1 nonaka wm8731_play_setup(struct zaudio_softc *sc) 563 1.1 nonaka { 564 1.1 nonaka int i; 565 1.1 nonaka 566 1.1 nonaka iic_acquire_bus(sc->sc_i2c, 0); 567 1.1 nonaka 568 1.1 nonaka /* Program the codec with playback settings */ 569 1.1 nonaka for (i = 0; playback_regs[i][0] != 0xffff; i++) { 570 1.1 nonaka wm8731_write(sc, playback_regs[i][0], playback_regs[i][1]); 571 1.1 nonaka } 572 1.1 nonaka wm8731_update_mutes(sc, 1); 573 1.1 nonaka 574 1.1 nonaka iic_release_bus(sc->sc_i2c, 0); 575 1.1 nonaka } 576 1.1 nonaka 577 1.1 nonaka /*static*/ void 578 1.1 nonaka wm8731_record_setup(struct zaudio_softc *sc) 579 1.1 nonaka { 580 1.1 nonaka int i; 581 1.1 nonaka 582 1.1 nonaka iic_acquire_bus(sc->sc_i2c, 0); 583 1.1 nonaka 584 1.1 nonaka /* Program the codec with playback settings */ 585 1.1 nonaka for (i = 0; record_regs[i][0] != 0xffff; i++) { 586 1.1 nonaka wm8731_write(sc, record_regs[i][0], record_regs[i][1]); 587 1.1 nonaka } 588 1.1 nonaka wm8731_update_mutes(sc, 2); 589 1.1 nonaka 590 1.1 nonaka iic_release_bus(sc->sc_i2c, 0); 591 1.1 nonaka } 592 1.1 nonaka 593 1.1 nonaka static int 594 1.1 nonaka wm8731_halt_output(void *hdl) 595 1.1 nonaka { 596 1.1 nonaka struct zaudio_softc *sc = hdl; 597 1.1 nonaka int rv; 598 1.1 nonaka 599 1.1 nonaka rv = pxa2x0_i2s_halt_output(&sc->sc_i2s); 600 1.1 nonaka if (!sc->sc_recording) 601 1.1 nonaka wm8731_standby(sc); 602 1.1 nonaka sc->sc_playing = 0; 603 1.1 nonaka 604 1.1 nonaka return rv; 605 1.1 nonaka } 606 1.1 nonaka 607 1.1 nonaka static int 608 1.1 nonaka wm8731_halt_input(void *hdl) 609 1.1 nonaka { 610 1.1 nonaka struct zaudio_softc *sc = hdl; 611 1.1 nonaka int rv; 612 1.1 nonaka 613 1.1 nonaka rv = pxa2x0_i2s_halt_input(&sc->sc_i2s); 614 1.1 nonaka if (!sc->sc_playing) 615 1.1 nonaka wm8731_standby(sc); 616 1.1 nonaka sc->sc_recording = 0; 617 1.1 nonaka 618 1.1 nonaka return rv; 619 1.1 nonaka } 620 1.1 nonaka 621 1.1 nonaka static int 622 1.1 nonaka wm8731_getdev(void *hdl, struct audio_device *ret) 623 1.1 nonaka { 624 1.1 nonaka 625 1.1 nonaka *ret = wm8731_device; 626 1.1 nonaka return 0; 627 1.1 nonaka } 628 1.1 nonaka 629 1.1 nonaka #define WM8731_SPKR_LVL 0 630 1.1 nonaka #define WM8731_SPKR_MUTE 1 631 1.1 nonaka #define WM8731_MIC_LVL 2 632 1.1 nonaka #define WM8731_MIC_MUTE 3 633 1.1 nonaka #define WM8731_RECORD_SOURCE 4 634 1.1 nonaka #define WM8731_OUTPUT_CLASS 5 635 1.1 nonaka #define WM8731_INPUT_CLASS 6 636 1.1 nonaka #define WM8731_RECORD_CLASS 7 637 1.1 nonaka 638 1.1 nonaka static int 639 1.1 nonaka wm8731_set_port(void *hdl, struct mixer_ctrl *mc) 640 1.1 nonaka { 641 1.1 nonaka struct zaudio_softc *sc = hdl; 642 1.1 nonaka int error = EINVAL; 643 1.1 nonaka int s; 644 1.1 nonaka 645 1.1 nonaka s = splbio(); 646 1.1 nonaka iic_acquire_bus(sc->sc_i2c, 0); 647 1.1 nonaka 648 1.1 nonaka switch (mc->dev) { 649 1.1 nonaka case WM8731_SPKR_LVL: 650 1.1 nonaka if (mc->type != AUDIO_MIXER_VALUE) 651 1.1 nonaka break; 652 1.1 nonaka if (mc->un.value.num_channels == 1) { 653 1.1 nonaka sc->sc_volume[WM8731_OP_SPKR].left = 654 1.1 nonaka mc->un.value.level[AUDIO_MIXER_LEVEL_MONO]; 655 1.1 nonaka sc->sc_volume[WM8731_OP_SPKR].right = 656 1.1 nonaka mc->un.value.level[AUDIO_MIXER_LEVEL_MONO]; 657 1.1 nonaka } else if (mc->un.value.num_channels == 2) { 658 1.1 nonaka sc->sc_volume[WM8731_OP_SPKR].left = 659 1.1 nonaka mc->un.value.level[AUDIO_MIXER_LEVEL_LEFT]; 660 1.1 nonaka sc->sc_volume[WM8731_OP_SPKR].right = 661 1.1 nonaka mc->un.value.level[AUDIO_MIXER_LEVEL_RIGHT]; 662 1.1 nonaka } 663 1.1 nonaka else 664 1.1 nonaka break; 665 1.1 nonaka wm8731_update_volume(sc, WM8731_OP_SPKR); 666 1.1 nonaka error = 0; 667 1.1 nonaka break; 668 1.1 nonaka 669 1.1 nonaka case WM8731_SPKR_MUTE: 670 1.1 nonaka if (mc->type != AUDIO_MIXER_ENUM) 671 1.1 nonaka break; 672 1.1 nonaka UNMUTE(sc, WM8731_OP_SPKR, mc->un.ord ? 1 : 0); 673 1.1 nonaka wm8731_update_mutes(sc, 1); 674 1.1 nonaka error = 0; 675 1.1 nonaka break; 676 1.1 nonaka 677 1.1 nonaka case WM8731_MIC_LVL: 678 1.1 nonaka if (mc->type != AUDIO_MIXER_VALUE) 679 1.1 nonaka break; 680 1.1 nonaka if (mc->un.value.num_channels == 1) 681 1.1 nonaka sc->sc_volume[WM8731_OP_MIC].left = 682 1.1 nonaka mc->un.value.level[AUDIO_MIXER_LEVEL_MONO]; 683 1.1 nonaka else 684 1.1 nonaka break; 685 1.1 nonaka wm8731_update_volume(sc, WM8731_OP_MIC); 686 1.1 nonaka error = 0; 687 1.1 nonaka break; 688 1.1 nonaka 689 1.1 nonaka case WM8731_MIC_MUTE: 690 1.1 nonaka if (mc->type != AUDIO_MIXER_ENUM) 691 1.1 nonaka break; 692 1.1 nonaka UNMUTE(sc, WM8731_OP_MIC, mc->un.ord ? 1 : 0); 693 1.1 nonaka wm8731_update_mutes(sc, 2); 694 1.1 nonaka error = 0; 695 1.1 nonaka break; 696 1.1 nonaka 697 1.1 nonaka case WM8731_RECORD_SOURCE: 698 1.1 nonaka if (mc->type != AUDIO_MIXER_ENUM) 699 1.1 nonaka break; 700 1.1 nonaka if (mc->un.ord != 0) 701 1.1 nonaka break; 702 1.1 nonaka /* MIC only */ 703 1.1 nonaka error = 0; 704 1.1 nonaka break; 705 1.1 nonaka } 706 1.1 nonaka 707 1.1 nonaka iic_release_bus(sc->sc_i2c, 0); 708 1.1 nonaka splx(s); 709 1.1 nonaka 710 1.1 nonaka return error; 711 1.1 nonaka } 712 1.1 nonaka 713 1.1 nonaka static int 714 1.1 nonaka wm8731_get_port(void *hdl, struct mixer_ctrl *mc) 715 1.1 nonaka { 716 1.1 nonaka struct zaudio_softc *sc = hdl; 717 1.1 nonaka int error = EINVAL; 718 1.1 nonaka 719 1.1 nonaka switch (mc->dev) { 720 1.1 nonaka case WM8731_SPKR_LVL: 721 1.1 nonaka if (mc->type != AUDIO_MIXER_VALUE) 722 1.1 nonaka break; 723 1.1 nonaka if (mc->un.value.num_channels == 1) 724 1.1 nonaka mc->un.value.level[AUDIO_MIXER_LEVEL_MONO] = 725 1.1 nonaka sc->sc_volume[WM8731_OP_SPKR].left; 726 1.1 nonaka else if (mc->un.value.num_channels == 2) { 727 1.1 nonaka mc->un.value.level[AUDIO_MIXER_LEVEL_LEFT] = 728 1.1 nonaka sc->sc_volume[WM8731_OP_SPKR].left; 729 1.1 nonaka mc->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = 730 1.1 nonaka sc->sc_volume[WM8731_OP_SPKR].right; 731 1.1 nonaka } 732 1.1 nonaka else 733 1.1 nonaka break; 734 1.1 nonaka error = 0; 735 1.1 nonaka break; 736 1.1 nonaka 737 1.1 nonaka case WM8731_SPKR_MUTE: 738 1.1 nonaka if (mc->type != AUDIO_MIXER_ENUM) 739 1.1 nonaka break; 740 1.1 nonaka mc->un.ord = sc->sc_unmute[WM8731_OP_SPKR] ? 1 : 0; 741 1.1 nonaka error = 0; 742 1.1 nonaka break; 743 1.1 nonaka 744 1.1 nonaka case WM8731_MIC_LVL: 745 1.1 nonaka if (mc->type != AUDIO_MIXER_VALUE) 746 1.1 nonaka break; 747 1.1 nonaka if (mc->un.value.num_channels == 1) 748 1.1 nonaka mc->un.value.level[AUDIO_MIXER_LEVEL_MONO] = 749 1.1 nonaka sc->sc_volume[WM8731_OP_MIC].left; 750 1.1 nonaka else 751 1.1 nonaka break; 752 1.1 nonaka error = 0; 753 1.1 nonaka break; 754 1.1 nonaka 755 1.1 nonaka case WM8731_MIC_MUTE: 756 1.1 nonaka if (mc->type != AUDIO_MIXER_ENUM) 757 1.1 nonaka break; 758 1.1 nonaka mc->un.ord = sc->sc_unmute[WM8731_OP_MIC] ? 1 : 0; 759 1.1 nonaka error = 0; 760 1.1 nonaka break; 761 1.1 nonaka 762 1.1 nonaka case WM8731_RECORD_SOURCE: 763 1.1 nonaka if (mc->type != AUDIO_MIXER_ENUM) 764 1.1 nonaka break; 765 1.1 nonaka mc->un.ord = 0; /* MIC only */ 766 1.1 nonaka error = 0; 767 1.1 nonaka break; 768 1.1 nonaka } 769 1.1 nonaka 770 1.1 nonaka return error; 771 1.1 nonaka } 772 1.1 nonaka 773 1.1 nonaka /*ARGSUSED*/ 774 1.1 nonaka static int 775 1.1 nonaka wm8731_query_devinfo(void *hdl, struct mixer_devinfo *di) 776 1.1 nonaka { 777 1.1 nonaka 778 1.1 nonaka switch (di->index) { 779 1.1 nonaka case WM8731_SPKR_LVL: 780 1.1 nonaka di->type = AUDIO_MIXER_VALUE; 781 1.1 nonaka di->mixer_class = WM8731_OUTPUT_CLASS; 782 1.1 nonaka di->prev = AUDIO_MIXER_LAST; 783 1.1 nonaka di->next = WM8731_SPKR_MUTE; 784 1.1 nonaka strlcpy(di->label.name, AudioNspeaker, 785 1.1 nonaka sizeof(di->label.name)); 786 1.1 nonaka di->un.v.num_channels = 1; 787 1.1 nonaka strlcpy(di->un.v.units.name, AudioNvolume, 788 1.1 nonaka sizeof(di->un.v.units.name)); 789 1.1 nonaka break; 790 1.1 nonaka 791 1.1 nonaka case WM8731_SPKR_MUTE: 792 1.1 nonaka di->type = AUDIO_MIXER_ENUM; 793 1.1 nonaka di->mixer_class = WM8731_OUTPUT_CLASS; 794 1.1 nonaka di->prev = WM8731_SPKR_LVL; 795 1.1 nonaka di->next = AUDIO_MIXER_LAST; 796 1.1 nonaka mute: 797 1.1 nonaka strlcpy(di->label.name, AudioNmute, sizeof(di->label.name)); 798 1.1 nonaka di->un.e.num_mem = 2; 799 1.1 nonaka strlcpy(di->un.e.member[0].label.name, AudioNon, 800 1.1 nonaka sizeof(di->un.e.member[0].label.name)); 801 1.1 nonaka di->un.e.member[0].ord = 0; 802 1.1 nonaka strlcpy(di->un.e.member[1].label.name, AudioNoff, 803 1.1 nonaka sizeof(di->un.e.member[1].label.name)); 804 1.1 nonaka di->un.e.member[1].ord = 1; 805 1.1 nonaka break; 806 1.1 nonaka 807 1.1 nonaka case WM8731_MIC_LVL: 808 1.1 nonaka di->type = AUDIO_MIXER_VALUE; 809 1.1 nonaka di->mixer_class = WM8731_INPUT_CLASS; 810 1.1 nonaka di->prev = AUDIO_MIXER_LAST; 811 1.1 nonaka di->next = WM8731_MIC_MUTE; 812 1.1 nonaka strlcpy(di->label.name, AudioNmicrophone, 813 1.1 nonaka sizeof(di->label.name)); 814 1.1 nonaka strlcpy(di->un.v.units.name, AudioNvolume, 815 1.1 nonaka sizeof(di->un.v.units.name)); 816 1.1 nonaka di->un.v.num_channels = 1; 817 1.1 nonaka break; 818 1.1 nonaka 819 1.1 nonaka case WM8731_MIC_MUTE: 820 1.1 nonaka di->type = AUDIO_MIXER_ENUM; 821 1.1 nonaka di->mixer_class = WM8731_INPUT_CLASS; 822 1.1 nonaka di->prev = WM8731_MIC_LVL; 823 1.1 nonaka di->next = AUDIO_MIXER_LAST; 824 1.1 nonaka goto mute; 825 1.1 nonaka 826 1.1 nonaka case WM8731_RECORD_SOURCE: 827 1.1 nonaka di->type = AUDIO_MIXER_ENUM; 828 1.1 nonaka di->mixer_class = WM8731_RECORD_CLASS; 829 1.1 nonaka di->prev = AUDIO_MIXER_LAST; 830 1.1 nonaka di->next = AUDIO_MIXER_LAST; 831 1.1 nonaka strlcpy(di->label.name, AudioNsource, sizeof(di->label.name)); 832 1.1 nonaka di->un.e.num_mem = 1; 833 1.1 nonaka strlcpy(di->un.e.member[0].label.name, AudioNmicrophone, 834 1.1 nonaka sizeof(di->un.e.member[0].label.name)); 835 1.1 nonaka di->un.e.member[0].ord = 0; 836 1.1 nonaka break; 837 1.1 nonaka 838 1.1 nonaka case WM8731_OUTPUT_CLASS: 839 1.1 nonaka di->type = AUDIO_MIXER_CLASS; 840 1.1 nonaka di->mixer_class = WM8731_OUTPUT_CLASS; 841 1.1 nonaka di->prev = AUDIO_MIXER_LAST; 842 1.1 nonaka di->next = AUDIO_MIXER_LAST; 843 1.1 nonaka strlcpy(di->label.name, AudioCoutputs, sizeof(di->label.name)); 844 1.1 nonaka break; 845 1.1 nonaka 846 1.1 nonaka case WM8731_INPUT_CLASS: 847 1.1 nonaka di->type = AUDIO_MIXER_CLASS; 848 1.1 nonaka di->mixer_class = WM8731_INPUT_CLASS; 849 1.1 nonaka di->prev = AUDIO_MIXER_LAST; 850 1.1 nonaka di->next = AUDIO_MIXER_LAST; 851 1.1 nonaka strlcpy(di->label.name, AudioCinputs, sizeof(di->label.name)); 852 1.1 nonaka break; 853 1.1 nonaka 854 1.1 nonaka case WM8731_RECORD_CLASS: 855 1.1 nonaka di->type = AUDIO_MIXER_CLASS; 856 1.1 nonaka di->mixer_class = WM8731_RECORD_CLASS; 857 1.1 nonaka di->prev = AUDIO_MIXER_LAST; 858 1.1 nonaka di->next = AUDIO_MIXER_LAST; 859 1.1 nonaka strlcpy(di->label.name, AudioCinputs, sizeof(di->label.name)); 860 1.1 nonaka break; 861 1.1 nonaka 862 1.1 nonaka default: 863 1.1 nonaka return ENXIO; 864 1.1 nonaka } 865 1.1 nonaka 866 1.1 nonaka return 0; 867 1.1 nonaka } 868 1.1 nonaka 869 1.1 nonaka static int 870 1.1 nonaka wm8731_start_output(void *hdl, void *block, int bsize, void (*intr)(void *), 871 1.1 nonaka void *intrarg) 872 1.1 nonaka { 873 1.1 nonaka struct zaudio_softc *sc = hdl; 874 1.1 nonaka int rv; 875 1.1 nonaka 876 1.1 nonaka /* Power up codec if we are not already playing. */ 877 1.1 nonaka if (!sc->sc_playing) { 878 1.1 nonaka sc->sc_playing = 1; 879 1.1 nonaka wm8731_play_setup(sc); 880 1.1 nonaka } 881 1.1 nonaka 882 1.1 nonaka /* Start DMA via I2S */ 883 1.1 nonaka rv = pxa2x0_i2s_start_output(&sc->sc_i2s, block, bsize, intr, intrarg); 884 1.1 nonaka if (rv) { 885 1.1 nonaka if (!sc->sc_recording) 886 1.1 nonaka wm8731_standby(sc); 887 1.1 nonaka sc->sc_playing = 0; 888 1.1 nonaka } 889 1.1 nonaka 890 1.1 nonaka return rv; 891 1.1 nonaka } 892 1.1 nonaka 893 1.1 nonaka static int 894 1.1 nonaka wm8731_start_input(void *hdl, void *block, int bsize, void (*intr)(void *), 895 1.1 nonaka void *intrarg) 896 1.1 nonaka { 897 1.1 nonaka struct zaudio_softc *sc = hdl; 898 1.1 nonaka int rv; 899 1.1 nonaka 900 1.1 nonaka /* Power up codec if we are not already recording. */ 901 1.1 nonaka if (!sc->sc_recording) { 902 1.1 nonaka sc->sc_recording = 1; 903 1.1 nonaka wm8731_record_setup(sc); 904 1.1 nonaka } 905 1.1 nonaka 906 1.1 nonaka /* Start DMA via I2S */ 907 1.1 nonaka rv = pxa2x0_i2s_start_input(&sc->sc_i2s, block, bsize, intr, intrarg); 908 1.1 nonaka if (rv) { 909 1.1 nonaka if (!sc->sc_playing) 910 1.1 nonaka wm8731_standby(sc); 911 1.1 nonaka sc->sc_recording = 0; 912 1.1 nonaka } 913 1.1 nonaka return rv; 914 1.1 nonaka } 915