1 1.2 rkujawa /* $NetBSD: vac.c,v 1.2 2026/06/22 15:12:59 rkujawa Exp $ */ 2 1.1 rkujawa 3 1.1 rkujawa /*- 4 1.1 rkujawa * Copyright (c) 2026 The NetBSD Foundation, Inc. 5 1.1 rkujawa * All rights reserved. 6 1.1 rkujawa * 7 1.1 rkujawa * Redistribution and use in source and binary forms, with or without 8 1.1 rkujawa * modification, are permitted provided that the following conditions 9 1.1 rkujawa * are met: 10 1.1 rkujawa * 1. Redistributions of source code must retain the above copyright 11 1.1 rkujawa * notice, this list of conditions and the following disclaimer. 12 1.1 rkujawa * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 rkujawa * notice, this list of conditions and the following disclaimer in the 14 1.1 rkujawa * documentation and/or other materials provided with the distribution. 15 1.1 rkujawa * 16 1.1 rkujawa * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 1.1 rkujawa * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.1 rkujawa * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.1 rkujawa * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.1 rkujawa * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.1 rkujawa * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.1 rkujawa * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.1 rkujawa * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.1 rkujawa * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.1 rkujawa * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.1 rkujawa * POSSIBILITY OF SUCH DAMAGE. 27 1.1 rkujawa */ 28 1.1 rkujawa 29 1.1 rkujawa /* 30 1.1 rkujawa * Driver for the SM502 AC'97 audio interface 31 1.1 rkujawa */ 32 1.1 rkujawa 33 1.1 rkujawa #include <sys/cdefs.h> 34 1.2 rkujawa __KERNEL_RCSID(0, "$NetBSD: vac.c,v 1.2 2026/06/22 15:12:59 rkujawa Exp $"); 35 1.1 rkujawa 36 1.1 rkujawa #include <sys/param.h> 37 1.1 rkujawa #include <sys/systm.h> 38 1.1 rkujawa #include <sys/device.h> 39 1.1 rkujawa #include <sys/kmem.h> 40 1.1 rkujawa #include <sys/bus.h> 41 1.1 rkujawa #include <sys/callout.h> 42 1.1 rkujawa #include <sys/sysctl.h> 43 1.1 rkujawa #include <sys/audioio.h> 44 1.1 rkujawa 45 1.1 rkujawa #include <dev/audio/audio_if.h> 46 1.1 rkujawa 47 1.1 rkujawa #include <dev/ic/ac97var.h> 48 1.1 rkujawa #include <dev/ic/ac97reg.h> 49 1.1 rkujawa 50 1.1 rkujawa #include <dev/ic/sm502reg.h> 51 1.1 rkujawa #include <dev/pci/voyagervar.h> 52 1.1 rkujawa 53 1.1 rkujawa /* PCM playback format: AC'97 fixed 48 kHz, 16-bit, stereo. */ 54 1.1 rkujawa #define VAC_RATE 48000 55 1.1 rkujawa #define VAC_CHANNELS 2 56 1.1 rkujawa #define VAC_PRECISION 16 57 1.1 rkujawa #define VAC_FRAMESIZE (VAC_CHANNELS * (VAC_PRECISION / 8)) /* 4 bytes */ 58 1.1 rkujawa 59 1.1 rkujawa /* poll when waiting on the codec */ 60 1.1 rkujawa #define VAC_CODEC_TIMEOUT 1000 61 1.1 rkujawa 62 1.1 rkujawa /* 63 1.1 rkujawa * 8051 polled protocol, via 4KB dual-port SRAM 64 1.1 rkujawa * 65 1.1 rkujawa * Two PCM buffers selected by command parity 66 1.1 rkujawa */ 67 1.1 rkujawa #define VAC_DP_BASE SM502_uC_SRAM_DUALPORT 68 1.1 rkujawa #define VAC_DP_H_CMD 0x00 /* u8 host: command sequence */ 69 1.1 rkujawa #define VAC_DP_H_DONE 0x01 /* u8 8051: last finished command */ 70 1.1 rkujawa #define VAC_DP_H_ALIVE 0x03 /* u8 8051: VAC_DP_ALIVE_MAGIC when up */ 71 1.1 rkujawa #define VAC_DP_H_FC0L 0x04 /* u16 host: buf0 frame count, LE */ 72 1.1 rkujawa #define VAC_DP_H_FC0H 0x05 73 1.1 rkujawa #define VAC_DP_H_FC1L 0x06 /* u16 host: buf1 frame count, LE */ 74 1.1 rkujawa #define VAC_DP_H_FC1H 0x07 75 1.1 rkujawa #define VAC_DP_BUF0 0x10 76 1.1 rkujawa #define VAC_DP_MAXFRAMES 504 /* per buffer; 504*4=0x7e0, both fit 4KB */ 77 1.1 rkujawa #define VAC_DP_BUFBYTES (VAC_DP_MAXFRAMES * VAC_FRAMESIZE) 78 1.1 rkujawa #define VAC_DP_BUF1 (VAC_DP_BUF0 + VAC_DP_BUFBYTES) /* 0x7f0 */ 79 1.1 rkujawa #define VAC_DP_ALIVE_MAGIC 0x51 80 1.1 rkujawa 81 1.1 rkujawa struct vac_softc { 82 1.1 rkujawa device_t sc_dev; 83 1.1 rkujawa bus_space_tag_t sc_memt; 84 1.1 rkujawa bus_space_handle_t sc_regh; /* BAR 0x14: MMIO registers */ 85 1.1 rkujawa void *sc_parent; /* voyager softc, for gpio/power */ 86 1.1 rkujawa 87 1.1 rkujawa kmutex_t sc_lock; /* thread context */ 88 1.1 rkujawa kmutex_t sc_intr_lock; /* "interrupt" context */ 89 1.1 rkujawa 90 1.1 rkujawa struct ac97_host_if sc_ac97_host; 91 1.1 rkujawa struct ac97_codec_if *sc_ac97_codec; 92 1.1 rkujawa device_t sc_audiodev; 93 1.1 rkujawa 94 1.1 rkujawa /* MI playback ring (filled by the audio layer, consumed by the feeder) */ 95 1.1 rkujawa bool sc_active; /* playback in progress */ 96 1.1 rkujawa uint8_t *sc_pstart; 97 1.1 rkujawa uint8_t *sc_pend; 98 1.1 rkujawa uint8_t *sc_pcur; 99 1.1 rkujawa int sc_pblksize; 100 1.1 rkujawa void (*sc_pint)(void *); 101 1.1 rkujawa void *sc_pintarg; 102 1.1 rkujawa 103 1.1 rkujawa /* 8051 interface */ 104 1.1 rkujawa callout_t sc_feed_ch; /* polls H_DONE, refills buffers */ 105 1.1 rkujawa int sc_feed_ticks; /* callout period */ 106 1.1 rkujawa uint8_t *sc_dpstage; /* staging for one dual-port buf */ 107 1.1 rkujawa uint8_t sc_cmd_seq; /* last command we queued */ 108 1.1 rkujawa uint8_t sc_done_seen; /* last H_DONE we acted on */ 109 1.1 rkujawa bool sc_8051_ok; /* feeder firmware responded */ 110 1.1 rkujawa int sc_underruns; /* 8051 ran dry while playing */ 111 1.1 rkujawa 112 1.1 rkujawa struct sysctllog *sc_sysctllog; 113 1.1 rkujawa }; 114 1.1 rkujawa 115 1.1 rkujawa #define VAC_READ(sc, reg) \ 116 1.1 rkujawa bus_space_read_4((sc)->sc_memt, (sc)->sc_regh, (reg)) 117 1.1 rkujawa #define VAC_WRITE(sc, reg, val) \ 118 1.1 rkujawa bus_space_write_4((sc)->sc_memt, (sc)->sc_regh, (reg), (val)) 119 1.1 rkujawa #define VAC_DP_R8(sc, off) \ 120 1.1 rkujawa bus_space_read_1((sc)->sc_memt, (sc)->sc_regh, VAC_DP_BASE + (off)) 121 1.1 rkujawa #define VAC_DP_W8(sc, off, v) \ 122 1.1 rkujawa bus_space_write_1((sc)->sc_memt, (sc)->sc_regh, VAC_DP_BASE + (off), (v)) 123 1.1 rkujawa 124 1.1 rkujawa /* 125 1.1 rkujawa * Embedded 8051 firmware 126 1.1 rkujawa * assemble from vac8051.asm with naken_asm (-type bin) 127 1.1 rkujawa */ 128 1.1 rkujawa static const uint8_t vac8051_fw[] = { 129 1.1 rkujawa 0x90, 0x30, 0x03, 0x74, 0x51, 0xf0, 0x90, 0x30, 0x01, 0xe4, 0xf0, 0x7f, 130 1.1 rkujawa 0x00, 0x90, 0x30, 0x00, 0xe0, 0xfe, 0x6f, 0x60, 0xf8, 0xee, 0x54, 0x01, 131 1.1 rkujawa 0x60, 0x10, 0x90, 0x30, 0x06, 0xe0, 0xfc, 0x90, 0x30, 0x07, 0xe0, 0xfd, 132 1.1 rkujawa 0x7a, 0xf0, 0x7b, 0x37, 0x80, 0x0e, 0x90, 0x30, 0x04, 0xe0, 0xfc, 0x90, 133 1.1 rkujawa 0x30, 0x05, 0xe0, 0xfd, 0x7a, 0x10, 0x7b, 0x30, 0x78, 0x00, 0x79, 0x00, 134 1.1 rkujawa 0x90, 0x91, 0x45, 0xe0, 0x54, 0x08, 0x60, 0x04, 0xd9, 0xf6, 0xd8, 0xf4, 135 1.1 rkujawa 0x8a, 0x82, 0x8b, 0x83, 0xe0, 0xf5, 0x20, 0xa3, 0xe0, 0xf5, 0x21, 0xa3, 136 1.1 rkujawa 0xe0, 0xf5, 0x24, 0xa3, 0xe0, 0xf5, 0x25, 0xa3, 0xaa, 0x82, 0xab, 0x83, 137 1.1 rkujawa 0x90, 0x91, 0x00, 0xe4, 0xf0, 0xa3, 0x74, 0x98, 0xf0, 0xe5, 0x20, 0xc4, 138 1.1 rkujawa 0xf5, 0x22, 0xe5, 0x21, 0xc4, 0xf5, 0x23, 0x90, 0x91, 0x0c, 0xe5, 0x22, 139 1.1 rkujawa 0x54, 0xf0, 0xf0, 0xa3, 0xe5, 0x22, 0x54, 0x0f, 0xf5, 0x26, 0xe5, 0x23, 140 1.1 rkujawa 0x54, 0xf0, 0x45, 0x26, 0xf0, 0xa3, 0xe5, 0x23, 0x54, 0x0f, 0xf0, 0xa3, 141 1.1 rkujawa 0xe4, 0xf0, 0xe5, 0x24, 0xc4, 0xf5, 0x22, 0xe5, 0x25, 0xc4, 0xf5, 0x23, 142 1.1 rkujawa 0x90, 0x91, 0x10, 0xe5, 0x22, 0x54, 0xf0, 0xf0, 0xa3, 0xe5, 0x22, 0x54, 143 1.1 rkujawa 0x0f, 0xf5, 0x26, 0xe5, 0x23, 0x54, 0xf0, 0x45, 0x26, 0xf0, 0xa3, 0xe5, 144 1.1 rkujawa 0x23, 0x54, 0x0f, 0xf0, 0xa3, 0xe4, 0xf0, 0xec, 0x70, 0x01, 0x1d, 0x1c, 145 1.1 rkujawa 0xec, 0x4d, 0x60, 0x03, 0x02, 0x00, 0x38, 0x90, 0x30, 0x01, 0xee, 0xf0, 146 1.1 rkujawa 0xff, 0x02, 0x00, 0x0d 147 1.1 rkujawa }; 148 1.1 rkujawa 149 1.1 rkujawa static int vac_match(device_t, cfdata_t, void *); 150 1.1 rkujawa static void vac_attach(device_t, device_t, void *); 151 1.1 rkujawa 152 1.1 rkujawa CFATTACH_DECL_NEW(vac, sizeof(struct vac_softc), 153 1.1 rkujawa vac_match, vac_attach, NULL, NULL); 154 1.1 rkujawa 155 1.1 rkujawa static const struct audio_format vac_format = { 156 1.1 rkujawa .mode = AUMODE_PLAY, 157 1.1 rkujawa .encoding = AUDIO_ENCODING_SLINEAR_LE, 158 1.1 rkujawa .validbits = VAC_PRECISION, 159 1.1 rkujawa .precision = VAC_PRECISION, 160 1.1 rkujawa .channels = VAC_CHANNELS, 161 1.1 rkujawa .channel_mask = AUFMT_STEREO, 162 1.1 rkujawa .frequency_type = 1, 163 1.1 rkujawa .frequency = { VAC_RATE } 164 1.1 rkujawa }; 165 1.1 rkujawa 166 1.1 rkujawa /* 167 1.1 rkujawa * AC'97 codec register access. 168 1.1 rkujawa */ 169 1.1 rkujawa static int 170 1.1 rkujawa vac_ac97_read(void *priv, uint8_t reg, uint16_t *val) 171 1.1 rkujawa { 172 1.1 rkujawa struct vac_softc * const sc = priv; 173 1.1 rkujawa uint32_t addr, rx; 174 1.1 rkujawa int i; 175 1.1 rkujawa 176 1.1 rkujawa addr = ((uint32_t)reg << SM502_AC97_ADDR_SHIFT) & SM502_AC97_ADDR_MASK; 177 1.1 rkujawa 178 1.1 rkujawa /* Mark frame + slot 1 valid and issue a read of the register. */ 179 1.1 rkujawa VAC_WRITE(sc, SM502_AC97_TX_TAG, 180 1.1 rkujawa SM502_AC97_FRAME_VALID | SM502_AC97_S1_VALID); 181 1.1 rkujawa VAC_WRITE(sc, SM502_AC97_TX_ADDR, addr | SM502_AC97_READ); 182 1.1 rkujawa 183 1.1 rkujawa /* Wait for the codec to echo the register index back in RX slot 1. */ 184 1.1 rkujawa for (i = 0; i < VAC_CODEC_TIMEOUT; i++) { 185 1.1 rkujawa rx = VAC_READ(sc, SM502_AC97_RX_ADDR); 186 1.1 rkujawa if ((rx & SM502_AC97_ADDR_MASK) == addr) 187 1.1 rkujawa break; 188 1.1 rkujawa DELAY(1); 189 1.1 rkujawa } 190 1.1 rkujawa if (i == VAC_CODEC_TIMEOUT) 191 1.1 rkujawa return 1; 192 1.1 rkujawa 193 1.1 rkujawa *val = (VAC_READ(sc, SM502_AC97_RX_DATA) & SM502_AC97_DATA_MASK) >> 4; 194 1.1 rkujawa return 0; 195 1.1 rkujawa } 196 1.1 rkujawa 197 1.1 rkujawa static int 198 1.1 rkujawa vac_ac97_write(void *priv, uint8_t reg, uint16_t val) 199 1.1 rkujawa { 200 1.1 rkujawa struct vac_softc * const sc = priv; 201 1.1 rkujawa uint32_t addr; 202 1.1 rkujawa 203 1.1 rkujawa addr = ((uint32_t)reg << SM502_AC97_ADDR_SHIFT) & SM502_AC97_ADDR_MASK; 204 1.1 rkujawa 205 1.1 rkujawa /* Mark frame + slots 1 (address) and 2 (data) valid. */ 206 1.1 rkujawa VAC_WRITE(sc, SM502_AC97_TX_TAG, 207 1.1 rkujawa SM502_AC97_FRAME_VALID | SM502_AC97_S1_VALID | SM502_AC97_S2_VALID); 208 1.1 rkujawa VAC_WRITE(sc, SM502_AC97_TX_DATA, 209 1.1 rkujawa ((uint32_t)val << 4) & SM502_AC97_DATA_MASK); 210 1.1 rkujawa VAC_WRITE(sc, SM502_AC97_TX_ADDR, addr); 211 1.1 rkujawa 212 1.1 rkujawa DELAY(100); 213 1.1 rkujawa return 0; 214 1.1 rkujawa } 215 1.1 rkujawa 216 1.1 rkujawa static int 217 1.1 rkujawa vac_ac97_reset(void *priv) 218 1.1 rkujawa { 219 1.1 rkujawa struct vac_softc * const sc = priv; 220 1.1 rkujawa uint32_t reg; 221 1.1 rkujawa int i; 222 1.1 rkujawa 223 1.1 rkujawa aprint_debug_dev(sc->sc_dev, "ac97 control at reset entry 0x%08x\n", 224 1.1 rkujawa VAC_READ(sc, SM502_AC97_CONTROL)); 225 1.1 rkujawa 226 1.1 rkujawa /* 227 1.1 rkujawa * Cold reset the codec with the controller enabled: assert RESET# 228 1.1 rkujawa * (COLD_RESET) for well over the 1us minimum, then release it. 229 1.1 rkujawa */ 230 1.1 rkujawa VAC_WRITE(sc, SM502_AC97_CONTROL, 231 1.1 rkujawa SM502_AC97_ENABLE | SM502_AC97_COLD_RESET); 232 1.1 rkujawa DELAY(20); 233 1.1 rkujawa VAC_WRITE(sc, SM502_AC97_CONTROL, SM502_AC97_ENABLE); 234 1.1 rkujawa 235 1.1 rkujawa /* 236 1.1 rkujawa * Wait (up to ~250ms) for the codec to start the bit clock and the 237 1.1 rkujawa * link to reach the active state. 238 1.1 rkujawa */ 239 1.1 rkujawa for (i = 0; i < 2500; i++) { 240 1.1 rkujawa reg = VAC_READ(sc, SM502_AC97_CONTROL); 241 1.1 rkujawa if ((reg & SM502_AC97_BCLK_RUNNING) != 0 && 242 1.1 rkujawa (reg & SM502_AC97_STATUS_MASK) == SM502_AC97_STATUS_ON) { 243 1.1 rkujawa aprint_debug_dev(sc->sc_dev, 244 1.1 rkujawa "AC-link up (control 0x%08x)\n", reg); 245 1.1 rkujawa return 0; 246 1.1 rkujawa } 247 1.1 rkujawa DELAY(100); 248 1.1 rkujawa } 249 1.1 rkujawa 250 1.1 rkujawa aprint_error_dev(sc->sc_dev, 251 1.1 rkujawa "AC-link did not come ready (control 0x%08x)\n", reg); 252 1.1 rkujawa return 1; 253 1.1 rkujawa } 254 1.1 rkujawa 255 1.1 rkujawa static int 256 1.1 rkujawa vac_ac97_attach(void *priv, struct ac97_codec_if *codec) 257 1.1 rkujawa { 258 1.1 rkujawa struct vac_softc * const sc = priv; 259 1.1 rkujawa 260 1.1 rkujawa sc->sc_ac97_codec = codec; 261 1.1 rkujawa return 0; 262 1.1 rkujawa } 263 1.1 rkujawa 264 1.1 rkujawa static void 265 1.1 rkujawa vac_unmute(struct vac_softc *sc) 266 1.1 rkujawa { 267 1.1 rkujawa struct ac97_codec_if * const codec = sc->sc_ac97_codec; 268 1.1 rkujawa static const struct { 269 1.1 rkujawa const char *class; 270 1.1 rkujawa const char *device; 271 1.1 rkujawa } ports[] = { 272 1.1 rkujawa { AudioCoutputs, AudioNmaster }, 273 1.1 rkujawa { AudioCinputs, AudioNdac }, 274 1.1 rkujawa }; 275 1.1 rkujawa mixer_ctrl_t mc; 276 1.1 rkujawa int i, idx; 277 1.1 rkujawa 278 1.1 rkujawa mutex_enter(&sc->sc_lock); 279 1.1 rkujawa for (i = 0; i < (int)__arraycount(ports); i++) { 280 1.1 rkujawa idx = codec->vtbl->get_portnum_by_name(codec, 281 1.1 rkujawa ports[i].class, ports[i].device, NULL); 282 1.1 rkujawa if (idx >= 0) { 283 1.1 rkujawa memset(&mc, 0, sizeof(mc)); 284 1.1 rkujawa mc.dev = idx; 285 1.1 rkujawa mc.type = AUDIO_MIXER_VALUE; 286 1.1 rkujawa mc.un.value.num_channels = 2; 287 1.1 rkujawa mc.un.value.level[AUDIO_MIXER_LEVEL_LEFT] = 200; 288 1.1 rkujawa mc.un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = 200; 289 1.1 rkujawa (void)codec->vtbl->mixer_set_port(codec, &mc); 290 1.1 rkujawa } 291 1.1 rkujawa idx = codec->vtbl->get_portnum_by_name(codec, 292 1.1 rkujawa ports[i].class, ports[i].device, AudioNmute); 293 1.1 rkujawa if (idx >= 0) { 294 1.1 rkujawa memset(&mc, 0, sizeof(mc)); 295 1.1 rkujawa mc.dev = idx; 296 1.1 rkujawa mc.type = AUDIO_MIXER_ENUM; 297 1.1 rkujawa mc.un.ord = 0; /* off = not muted */ 298 1.1 rkujawa (void)codec->vtbl->mixer_set_port(codec, &mc); 299 1.1 rkujawa } 300 1.1 rkujawa } 301 1.1 rkujawa mutex_exit(&sc->sc_lock); 302 1.1 rkujawa } 303 1.1 rkujawa 304 1.1 rkujawa /* 305 1.1 rkujawa * MI audio interface. 306 1.1 rkujawa */ 307 1.1 rkujawa 308 1.1 rkujawa static int 309 1.1 rkujawa vac_query_format(void *priv, audio_format_query_t *afp) 310 1.1 rkujawa { 311 1.1 rkujawa 312 1.1 rkujawa return audio_query_format(&vac_format, 1, afp); 313 1.1 rkujawa } 314 1.1 rkujawa 315 1.1 rkujawa static int 316 1.1 rkujawa vac_set_format(void *priv, int setmode, 317 1.1 rkujawa const audio_params_t *play, const audio_params_t *rec, 318 1.1 rkujawa audio_filter_reg_t *pfil, audio_filter_reg_t *rfil) 319 1.1 rkujawa { 320 1.1 rkujawa 321 1.1 rkujawa /* Only one format; nothing to do. */ 322 1.1 rkujawa return 0; 323 1.1 rkujawa } 324 1.1 rkujawa 325 1.1 rkujawa static int 326 1.1 rkujawa vac_getdev(void *priv, struct audio_device *ad) 327 1.1 rkujawa { 328 1.1 rkujawa 329 1.1 rkujawa snprintf(ad->name, sizeof(ad->name), "SM502"); 330 1.1 rkujawa snprintf(ad->version, sizeof(ad->version), "AC97"); 331 1.1 rkujawa snprintf(ad->config, sizeof(ad->config), "vac"); 332 1.1 rkujawa return 0; 333 1.1 rkujawa } 334 1.1 rkujawa 335 1.1 rkujawa static int 336 1.1 rkujawa vac_set_port(void *priv, mixer_ctrl_t *mc) 337 1.1 rkujawa { 338 1.1 rkujawa struct vac_softc * const sc = priv; 339 1.1 rkujawa 340 1.1 rkujawa return sc->sc_ac97_codec->vtbl->mixer_set_port(sc->sc_ac97_codec, mc); 341 1.1 rkujawa } 342 1.1 rkujawa 343 1.1 rkujawa static int 344 1.1 rkujawa vac_get_port(void *priv, mixer_ctrl_t *mc) 345 1.1 rkujawa { 346 1.1 rkujawa struct vac_softc * const sc = priv; 347 1.1 rkujawa 348 1.1 rkujawa return sc->sc_ac97_codec->vtbl->mixer_get_port(sc->sc_ac97_codec, mc); 349 1.1 rkujawa } 350 1.1 rkujawa 351 1.1 rkujawa static int 352 1.1 rkujawa vac_query_devinfo(void *priv, mixer_devinfo_t *di) 353 1.1 rkujawa { 354 1.1 rkujawa struct vac_softc * const sc = priv; 355 1.1 rkujawa 356 1.1 rkujawa return sc->sc_ac97_codec->vtbl->query_devinfo(sc->sc_ac97_codec, di); 357 1.1 rkujawa } 358 1.1 rkujawa 359 1.1 rkujawa static int 360 1.1 rkujawa vac_get_props(void *priv) 361 1.1 rkujawa { 362 1.1 rkujawa 363 1.1 rkujawa return AUDIO_PROP_PLAYBACK; 364 1.1 rkujawa } 365 1.1 rkujawa 366 1.1 rkujawa static int 367 1.1 rkujawa vac_round_blocksize(void *priv, int blk, int mode, 368 1.1 rkujawa const audio_params_t *param) 369 1.1 rkujawa { 370 1.1 rkujawa 371 1.1 rkujawa /* 372 1.1 rkujawa * Play one MI block per dual-port buffer 373 1.1 rkujawa */ 374 1.1 rkujawa if (blk > VAC_DP_BUFBYTES) 375 1.1 rkujawa blk = VAC_DP_BUFBYTES; 376 1.1 rkujawa blk &= ~(VAC_FRAMESIZE - 1); 377 1.1 rkujawa if (blk < VAC_FRAMESIZE) 378 1.1 rkujawa blk = VAC_FRAMESIZE; 379 1.1 rkujawa return blk; 380 1.1 rkujawa } 381 1.1 rkujawa 382 1.1 rkujawa /* 383 1.1 rkujawa * Queue one block from the MI ring 384 1.1 rkujawa */ 385 1.1 rkujawa static void 386 1.1 rkujawa vac_dp_queue(struct vac_softc *sc) 387 1.1 rkujawa { 388 1.1 rkujawa const uint8_t cmd = sc->sc_cmd_seq + 1; 389 1.1 rkujawa uint8_t *p = sc->sc_pcur; 390 1.1 rkujawa bus_size_t base; 391 1.1 rkujawa int n, i; 392 1.1 rkujawa 393 1.1 rkujawa n = sc->sc_pblksize / VAC_FRAMESIZE; 394 1.1 rkujawa if (n > VAC_DP_MAXFRAMES) 395 1.1 rkujawa n = VAC_DP_MAXFRAMES; 396 1.1 rkujawa 397 1.1 rkujawa /* Copy PCM into the staging buffer (raw 16-bit LE), handling wrap. */ 398 1.1 rkujawa for (i = 0; i < n; i++) { 399 1.1 rkujawa uint8_t * const d = sc->sc_dpstage + i * VAC_FRAMESIZE; 400 1.1 rkujawa 401 1.1 rkujawa d[0] = p[0]; /* left low */ 402 1.1 rkujawa d[1] = p[1]; /* left high */ 403 1.1 rkujawa d[2] = p[2]; /* right low */ 404 1.1 rkujawa d[3] = p[3]; /* right high */ 405 1.1 rkujawa p += VAC_FRAMESIZE; 406 1.1 rkujawa if (p >= sc->sc_pend) 407 1.1 rkujawa p = sc->sc_pstart; 408 1.1 rkujawa } 409 1.1 rkujawa sc->sc_pcur = p; 410 1.1 rkujawa 411 1.1 rkujawa base = VAC_DP_BASE + ((cmd & 1) ? VAC_DP_BUF1 : VAC_DP_BUF0); 412 1.1 rkujawa bus_space_write_region_1(sc->sc_memt, sc->sc_regh, base, 413 1.1 rkujawa sc->sc_dpstage, n * VAC_FRAMESIZE); 414 1.1 rkujawa 415 1.1 rkujawa if (cmd & 1) { 416 1.1 rkujawa VAC_DP_W8(sc, VAC_DP_H_FC1L, n & 0xff); 417 1.1 rkujawa VAC_DP_W8(sc, VAC_DP_H_FC1H, (n >> 8) & 0xff); 418 1.1 rkujawa } else { 419 1.1 rkujawa VAC_DP_W8(sc, VAC_DP_H_FC0L, n & 0xff); 420 1.1 rkujawa VAC_DP_W8(sc, VAC_DP_H_FC0H, (n >> 8) & 0xff); 421 1.1 rkujawa } 422 1.1 rkujawa 423 1.1 rkujawa /* The data and count must be visible before the command bump. */ 424 1.1 rkujawa bus_space_barrier(sc->sc_memt, sc->sc_regh, VAC_DP_BASE, 0x1000, 425 1.1 rkujawa BUS_SPACE_BARRIER_WRITE); 426 1.1 rkujawa VAC_DP_W8(sc, VAC_DP_H_CMD, cmd); 427 1.1 rkujawa sc->sc_cmd_seq = cmd; 428 1.1 rkujawa } 429 1.1 rkujawa 430 1.1 rkujawa /* 431 1.1 rkujawa * Poll the 8051's done counter 432 1.1 rkujawa */ 433 1.1 rkujawa static void 434 1.1 rkujawa vac_feed_callout(void *arg) 435 1.1 rkujawa { 436 1.1 rkujawa struct vac_softc * const sc = arg; 437 1.1 rkujawa uint8_t done; 438 1.1 rkujawa int n; 439 1.1 rkujawa 440 1.1 rkujawa mutex_enter(&sc->sc_intr_lock); 441 1.1 rkujawa if (!sc->sc_active) { 442 1.1 rkujawa mutex_exit(&sc->sc_intr_lock); 443 1.1 rkujawa return; 444 1.1 rkujawa } 445 1.1 rkujawa 446 1.1 rkujawa done = VAC_DP_R8(sc, VAC_DP_H_DONE); 447 1.1 rkujawa if (sc->sc_cmd_seq == done) 448 1.1 rkujawa sc->sc_underruns++; /* 8051 caught up: nothing queued */ 449 1.1 rkujawa 450 1.1 rkujawa n = (uint8_t)(done - sc->sc_done_seen); 451 1.1 rkujawa sc->sc_done_seen = done; 452 1.1 rkujawa while (n-- > 0 && sc->sc_active && sc->sc_pint != NULL) 453 1.1 rkujawa sc->sc_pint(sc->sc_pintarg); 454 1.1 rkujawa 455 1.1 rkujawa while ((uint8_t)(sc->sc_cmd_seq - done) <= 1 && sc->sc_active) 456 1.1 rkujawa vac_dp_queue(sc); 457 1.1 rkujawa 458 1.1 rkujawa callout_schedule(&sc->sc_feed_ch, sc->sc_feed_ticks); 459 1.1 rkujawa mutex_exit(&sc->sc_intr_lock); 460 1.1 rkujawa } 461 1.1 rkujawa 462 1.1 rkujawa static int 463 1.1 rkujawa vac_trigger_output(void *priv, void *start, void *end, int blksize, 464 1.1 rkujawa void (*intr)(void *), void *intrarg, const audio_params_t *params) 465 1.1 rkujawa { 466 1.1 rkujawa struct vac_softc * const sc = priv; 467 1.1 rkujawa int i; 468 1.1 rkujawa 469 1.2 rkujawa /* 470 1.2 rkujawa * audio calls trigger_output with both sc_lock and sc_intr_lock held 471 1.2 rkujawa */ 472 1.2 rkujawa KASSERT(mutex_owned(&sc->sc_intr_lock)); 473 1.2 rkujawa KASSERT(mutex_owned(&sc->sc_lock)); 474 1.2 rkujawa 475 1.1 rkujawa if (!sc->sc_8051_ok) 476 1.1 rkujawa return ENXIO; 477 1.1 rkujawa 478 1.1 rkujawa /* 479 1.1 rkujawa * Restart the 8051 cleanly for this playback 480 1.1 rkujawa */ 481 1.1 rkujawa VAC_WRITE(sc, SM502_uC_RESET, 0); 482 1.1 rkujawa for (i = 0; i < 16; i++) 483 1.1 rkujawa VAC_DP_W8(sc, i, 0); 484 1.1 rkujawa VAC_WRITE(sc, SM502_uC_RESET, SM502_uC_ENABLE); 485 1.1 rkujawa for (i = 0; i < 5000 && 486 1.1 rkujawa VAC_DP_R8(sc, VAC_DP_H_ALIVE) != VAC_DP_ALIVE_MAGIC; i++) 487 1.1 rkujawa DELAY(10); 488 1.1 rkujawa 489 1.1 rkujawa sc->sc_pstart = start; 490 1.1 rkujawa sc->sc_pend = end; 491 1.1 rkujawa sc->sc_pcur = start; 492 1.1 rkujawa sc->sc_pblksize = blksize; 493 1.1 rkujawa sc->sc_pint = intr; 494 1.1 rkujawa sc->sc_pintarg = intrarg; 495 1.1 rkujawa 496 1.1 rkujawa sc->sc_cmd_seq = 0; 497 1.1 rkujawa sc->sc_done_seen = 0; 498 1.1 rkujawa sc->sc_underruns = 0; 499 1.1 rkujawa sc->sc_active = true; 500 1.1 rkujawa 501 1.1 rkujawa /* Prime both buffers, then poll for completion from the callout. */ 502 1.1 rkujawa vac_dp_queue(sc); 503 1.1 rkujawa vac_dp_queue(sc); 504 1.1 rkujawa callout_schedule(&sc->sc_feed_ch, sc->sc_feed_ticks); 505 1.1 rkujawa 506 1.1 rkujawa return 0; 507 1.1 rkujawa } 508 1.1 rkujawa 509 1.1 rkujawa static int 510 1.1 rkujawa vac_halt_output(void *priv) 511 1.1 rkujawa { 512 1.1 rkujawa struct vac_softc * const sc = priv; 513 1.1 rkujawa 514 1.2 rkujawa /* 515 1.2 rkujawa * called with both sc_lock and sc_intr_lock held 516 1.2 rkujawa */ 517 1.2 rkujawa KASSERT(mutex_owned(&sc->sc_intr_lock)); 518 1.2 rkujawa 519 1.1 rkujawa sc->sc_active = false; 520 1.1 rkujawa sc->sc_pint = NULL; 521 1.2 rkujawa callout_stop(&sc->sc_feed_ch); 522 1.1 rkujawa 523 1.1 rkujawa /* Park the 8051 so the host codec/mixer path is live while idle. */ 524 1.1 rkujawa VAC_WRITE(sc, SM502_uC_RESET, 0); 525 1.1 rkujawa return 0; 526 1.1 rkujawa } 527 1.1 rkujawa 528 1.1 rkujawa static void 529 1.1 rkujawa vac_get_locks(void *priv, kmutex_t **intr, kmutex_t **thread) 530 1.1 rkujawa { 531 1.1 rkujawa struct vac_softc * const sc = priv; 532 1.1 rkujawa 533 1.1 rkujawa *intr = &sc->sc_intr_lock; 534 1.1 rkujawa *thread = &sc->sc_lock; 535 1.1 rkujawa } 536 1.1 rkujawa 537 1.1 rkujawa static const struct audio_hw_if vac_hw_if = { 538 1.1 rkujawa .query_format = vac_query_format, 539 1.1 rkujawa .set_format = vac_set_format, 540 1.1 rkujawa .getdev = vac_getdev, 541 1.1 rkujawa .set_port = vac_set_port, 542 1.1 rkujawa .get_port = vac_get_port, 543 1.1 rkujawa .query_devinfo = vac_query_devinfo, 544 1.1 rkujawa .get_props = vac_get_props, 545 1.1 rkujawa .round_blocksize = vac_round_blocksize, 546 1.1 rkujawa .trigger_output = vac_trigger_output, 547 1.1 rkujawa .halt_output = vac_halt_output, 548 1.1 rkujawa .get_locks = vac_get_locks, 549 1.1 rkujawa }; 550 1.1 rkujawa 551 1.1 rkujawa /* Load the firmware blob as 32-bit LE words at (h, base). */ 552 1.1 rkujawa static void 553 1.1 rkujawa vac_load_fw(struct vac_softc *sc, bus_space_handle_t h, bus_size_t base) 554 1.1 rkujawa { 555 1.1 rkujawa size_t i; 556 1.1 rkujawa 557 1.1 rkujawa for (i = 0; i < sizeof(vac8051_fw); i += 4) { 558 1.1 rkujawa uint8_t b0 = vac8051_fw[i]; 559 1.1 rkujawa uint8_t b1 = (i + 1 < sizeof(vac8051_fw)) ? vac8051_fw[i + 1] : 0; 560 1.1 rkujawa uint8_t b2 = (i + 2 < sizeof(vac8051_fw)) ? vac8051_fw[i + 2] : 0; 561 1.1 rkujawa uint8_t b3 = (i + 3 < sizeof(vac8051_fw)) ? vac8051_fw[i + 3] : 0; 562 1.1 rkujawa 563 1.1 rkujawa bus_space_write_4(sc->sc_memt, h, base + i, 564 1.1 rkujawa b0 | (b1 << 8) | (b2 << 16) | (b3 << 24)); 565 1.1 rkujawa } 566 1.1 rkujawa } 567 1.1 rkujawa 568 1.1 rkujawa static void 569 1.1 rkujawa vac_8051_bringup(struct vac_softc *sc) 570 1.1 rkujawa { 571 1.1 rkujawa uint32_t v; 572 1.1 rkujawa uint8_t alive; 573 1.1 rkujawa int i; 574 1.1 rkujawa 575 1.1 rkujawa /* Hold the 8051 in reset... mode = SRAM on, AC97, fastest clock (div2). */ 576 1.1 rkujawa VAC_WRITE(sc, SM502_uC_RESET, 0); 577 1.1 rkujawa v = VAC_READ(sc, SM502_uC_MODE_SELECT); 578 1.1 rkujawa v &= ~(SM502_uC_SRAM_DISABLE | SM502_uC_CODEC_I2S | SM502_uC_CLOCK_MASK); 579 1.1 rkujawa VAC_WRITE(sc, SM502_uC_MODE_SELECT, v); 580 1.1 rkujawa 581 1.1 rkujawa /* Load the feeder into the program SRAM (host R/W only while in reset). */ 582 1.1 rkujawa vac_load_fw(sc, sc->sc_regh, SM502_uC_SRAM_PROG); 583 1.1 rkujawa 584 1.1 rkujawa /* Clear the dual-port protocol header before the 8051 starts. */ 585 1.1 rkujawa for (i = 0; i < 16; i++) 586 1.1 rkujawa VAC_DP_W8(sc, i, 0); 587 1.1 rkujawa 588 1.1 rkujawa /* Release the 8051 and give it time to post its alive marker. */ 589 1.1 rkujawa VAC_WRITE(sc, SM502_uC_RESET, SM502_uC_ENABLE); 590 1.1 rkujawa DELAY(2000); 591 1.1 rkujawa 592 1.1 rkujawa alive = VAC_DP_R8(sc, VAC_DP_H_ALIVE); 593 1.1 rkujawa sc->sc_8051_ok = (alive == VAC_DP_ALIVE_MAGIC); 594 1.1 rkujawa aprint_verbose_dev(sc->sc_dev, "8051 feeder %s (alive=0x%02x)\n", 595 1.1 rkujawa sc->sc_8051_ok ? "loaded" : "not responding", alive); 596 1.1 rkujawa if (!sc->sc_8051_ok) 597 1.1 rkujawa aprint_error_dev(sc->sc_dev, 598 1.1 rkujawa "8051 feeder did not start; playback unavailable\n"); 599 1.1 rkujawa 600 1.1 rkujawa /* Park the 8051 while idle (keeps the host codec/mixer path live). */ 601 1.1 rkujawa VAC_WRITE(sc, SM502_uC_RESET, 0); 602 1.1 rkujawa } 603 1.1 rkujawa 604 1.1 rkujawa #ifdef VAC_DEBUG 605 1.1 rkujawa /* 606 1.1 rkujawa * Diagnostics: dump the AC97 link control + key codec registers (read while the 607 1.1 rkujawa * 8051 is idle; codec access is dead while it runs). 608 1.1 rkujawa */ 609 1.1 rkujawa static int 610 1.1 rkujawa vac_sysctl_diag(SYSCTLFN_ARGS) 611 1.1 rkujawa { 612 1.1 rkujawa struct sysctlnode node = *rnode; 613 1.1 rkujawa struct vac_softc * const sc = node.sysctl_data; 614 1.1 rkujawa uint16_t r02 = 0, r04 = 0, r18 = 0, r26 = 0, r2a = 0, r2c = 0, r7a = 0; 615 1.1 rkujawa char buf[200]; 616 1.1 rkujawa 617 1.1 rkujawa vac_ac97_read(sc, 0x02, &r02); /* master volume */ 618 1.1 rkujawa vac_ac97_read(sc, 0x04, &r04); /* aux/headphone volume */ 619 1.1 rkujawa vac_ac97_read(sc, 0x18, &r18); /* PCM out volume */ 620 1.1 rkujawa vac_ac97_read(sc, 0x26, &r26); /* powerdown ctrl/status */ 621 1.1 rkujawa vac_ac97_read(sc, 0x2a, &r2a); /* extended audio ctrl (VRA) */ 622 1.1 rkujawa vac_ac97_read(sc, 0x2c, &r2c); /* PCM front DAC rate */ 623 1.1 rkujawa vac_ac97_read(sc, 0x7a, &r7a); /* ALC655 vendor (EAPD etc.) */ 624 1.1 rkujawa 625 1.1 rkujawa snprintf(buf, sizeof(buf), 626 1.1 rkujawa "acctl=%08x mode=%08x reset=%08x | " 627 1.1 rkujawa "m02=%04x hp04=%04x pcm18=%04x pwr26=%04x ext2a=%04x rate2c=%04x ven7a=%04x", 628 1.1 rkujawa VAC_READ(sc, SM502_AC97_CONTROL), 629 1.1 rkujawa VAC_READ(sc, SM502_uC_MODE_SELECT), 630 1.1 rkujawa VAC_READ(sc, SM502_uC_RESET), 631 1.1 rkujawa r02, r04, r18, r26, r2a, r2c, r7a); 632 1.1 rkujawa node.sysctl_data = buf; 633 1.1 rkujawa node.sysctl_size = strlen(buf) + 1; 634 1.1 rkujawa return sysctl_lookup(SYSCTLFN_CALL(&node)); 635 1.1 rkujawa } 636 1.1 rkujawa #endif /* VAC_DEBUG */ 637 1.1 rkujawa 638 1.1 rkujawa static void 639 1.1 rkujawa vac_sysctl_setup(struct vac_softc *sc) 640 1.1 rkujawa { 641 1.1 rkujawa const struct sysctlnode *node = NULL; 642 1.1 rkujawa 643 1.1 rkujawa if (sysctl_createv(&sc->sc_sysctllog, 0, NULL, &node, 644 1.1 rkujawa 0, CTLTYPE_NODE, "vac", SYSCTL_DESCR("SM502 AC97-link audio"), 645 1.1 rkujawa NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL) != 0 || node == NULL) 646 1.1 rkujawa return; 647 1.1 rkujawa 648 1.1 rkujawa sysctl_createv(&sc->sc_sysctllog, 0, NULL, NULL, 649 1.1 rkujawa CTLFLAG_READONLY, CTLTYPE_INT, "underruns", 650 1.1 rkujawa SYSCTL_DESCR("times the 8051 ran dry during the last playback"), 651 1.1 rkujawa NULL, 0, &sc->sc_underruns, 0, CTL_HW, node->sysctl_num, 652 1.1 rkujawa CTL_CREATE, CTL_EOL); 653 1.1 rkujawa #ifdef VAC_DEBUG 654 1.1 rkujawa sysctl_createv(&sc->sc_sysctllog, 0, NULL, NULL, 655 1.1 rkujawa CTLFLAG_READONLY, CTLTYPE_STRING, "diag", 656 1.1 rkujawa SYSCTL_DESCR("AC97 link + codec register dump (read while idle)"), 657 1.1 rkujawa vac_sysctl_diag, 0, (void *)sc, 0, CTL_HW, node->sysctl_num, 658 1.1 rkujawa CTL_CREATE, CTL_EOL); 659 1.1 rkujawa #endif 660 1.1 rkujawa } 661 1.1 rkujawa 662 1.1 rkujawa static int 663 1.1 rkujawa vac_match(device_t parent, cfdata_t match, void *aux) 664 1.1 rkujawa { 665 1.1 rkujawa struct voyager_attach_args *vaa = aux; 666 1.1 rkujawa 667 1.1 rkujawa if (strcmp(vaa->vaa_name, "vac") == 0) 668 1.1 rkujawa return 100; 669 1.1 rkujawa return 0; 670 1.1 rkujawa } 671 1.1 rkujawa 672 1.1 rkujawa static void 673 1.1 rkujawa vac_attach(device_t parent, device_t self, void *aux) 674 1.1 rkujawa { 675 1.1 rkujawa struct vac_softc * const sc = device_private(self); 676 1.1 rkujawa struct voyager_attach_args *vaa = aux; 677 1.1 rkujawa int error; 678 1.1 rkujawa 679 1.1 rkujawa sc->sc_dev = self; 680 1.1 rkujawa sc->sc_memt = vaa->vaa_tag; 681 1.1 rkujawa sc->sc_regh = vaa->vaa_regh; 682 1.1 rkujawa sc->sc_parent = device_private(parent); 683 1.1 rkujawa 684 1.1 rkujawa aprint_naive("\n"); 685 1.1 rkujawa aprint_normal(": SM502 AC97-link\n"); 686 1.1 rkujawa 687 1.1 rkujawa mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE); 688 1.1 rkujawa mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_AUDIO); 689 1.1 rkujawa 690 1.1 rkujawa callout_init(&sc->sc_feed_ch, CALLOUT_MPSAFE); 691 1.1 rkujawa callout_setfunc(&sc->sc_feed_ch, vac_feed_callout, sc); 692 1.1 rkujawa sc->sc_feed_ticks = mstohz(5); 693 1.1 rkujawa if (sc->sc_feed_ticks < 1) 694 1.1 rkujawa sc->sc_feed_ticks = 1; 695 1.1 rkujawa sc->sc_dpstage = kmem_alloc(VAC_DP_BUFBYTES, KM_SLEEP); 696 1.1 rkujawa 697 1.1 rkujawa aprint_debug_dev(self, 698 1.1 rkujawa "power: ctrl 0x%08x cur-gate 0x%08x gate0 0x%08x gate1 0x%08x\n", 699 1.1 rkujawa VAC_READ(sc, SM502_POWER_MODE_CONTROL), 700 1.1 rkujawa VAC_READ(sc, SM502_CURRENT_GATE), 701 1.1 rkujawa VAC_READ(sc, SM502_POWER_MODE0_GATE), 702 1.1 rkujawa VAC_READ(sc, SM502_POWER_MODE1_GATE)); 703 1.1 rkujawa 704 1.1 rkujawa VAC_WRITE(sc, SM502_POWER_MODE0_GATE, 705 1.1 rkujawa VAC_READ(sc, SM502_POWER_MODE0_GATE) | 706 1.1 rkujawa SM502_GATE_AUDIO_ENABLE | SM502_GATE_8051_ENABLE); 707 1.1 rkujawa VAC_WRITE(sc, SM502_POWER_MODE1_GATE, 708 1.1 rkujawa VAC_READ(sc, SM502_POWER_MODE1_GATE) | 709 1.1 rkujawa SM502_GATE_AUDIO_ENABLE | SM502_GATE_8051_ENABLE); 710 1.1 rkujawa DELAY(1000); 711 1.1 rkujawa 712 1.1 rkujawa /* Route the shared audio pins to the AC97-link (not GPIO). */ 713 1.1 rkujawa voyager_control_gpio(sc->sc_parent, 0xffffffff, SM502_AUDIO_GPIO_MASK); 714 1.1 rkujawa 715 1.1 rkujawa /* Select AC97 mode for the link (CODEC_I2S clear). */ 716 1.1 rkujawa VAC_WRITE(sc, SM502_uC_MODE_SELECT, 717 1.1 rkujawa VAC_READ(sc, SM502_uC_MODE_SELECT) & ~SM502_uC_CODEC_I2S); 718 1.1 rkujawa 719 1.1 rkujawa sc->sc_ac97_host.arg = sc; 720 1.1 rkujawa sc->sc_ac97_host.attach = vac_ac97_attach; 721 1.1 rkujawa sc->sc_ac97_host.read = vac_ac97_read; 722 1.1 rkujawa sc->sc_ac97_host.write = vac_ac97_write; 723 1.1 rkujawa sc->sc_ac97_host.reset = vac_ac97_reset; 724 1.1 rkujawa 725 1.1 rkujawa error = ac97_attach(&sc->sc_ac97_host, self, &sc->sc_lock); 726 1.1 rkujawa if (error) { 727 1.1 rkujawa aprint_error_dev(self, "couldn't attach codec (%d)\n", error); 728 1.1 rkujawa return; 729 1.1 rkujawa } 730 1.1 rkujawa 731 1.1 rkujawa vac_sysctl_setup(sc); 732 1.1 rkujawa 733 1.1 rkujawa /* Load the 8051 binary. */ 734 1.1 rkujawa vac_8051_bringup(sc); 735 1.1 rkujawa 736 1.1 rkujawa sc->sc_audiodev = audio_attach_mi(&vac_hw_if, sc, self); 737 1.1 rkujawa 738 1.1 rkujawa /* Unmute master + DAC now that the codec/mixer stack is up (8051 idle). */ 739 1.1 rkujawa vac_unmute(sc); 740 1.1 rkujawa } 741