1 /*- 2 * Copyright (c) 2006 Stephane E. Potvin <sepotvin@videotron.ca> 3 * Copyright (c) 2006 Ariff Abdullah <ariff@FreeBSD.org> 4 * Copyright (c) 2008 Alexander Motin <mav@FreeBSD.org> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 /* 30 * Intel High Definition Audio (Controller) driver for FreeBSD. Be advised 31 * that this driver still in its early stage, and possible of rewrite are 32 * pretty much guaranteed. There are supposedly several distinct parent/child 33 * busses to make this "perfect", but as for now and for the sake of 34 * simplicity, everything is gobble up within single source. 35 * 36 * List of subsys: 37 * 1) HDA Controller support 38 * 2) HDA Codecs support, which may include 39 * - HDA 40 * - Modem 41 * 3) Widget parser - the real magic of why this driver works on so 42 * many hardwares with minimal vendor specific quirk. The original 43 * parser was written using Ruby and can be found at 44 * http://people.freebsd.org/~ariff/HDA/parser.rb . This crude 45 * ruby parser take the verbose dmesg dump as its input. Refer to 46 * http://www.microsoft.com/whdc/device/audio/default.mspx for various 47 * interesting documents, especially UAA (Universal Audio Architecture). 48 * 4) Possible vendor specific support. 49 * (snd_hda_intel, snd_hda_ati, etc..) 50 * 51 * Thanks to Ahmad Ubaidah Omar @ Defenxis Sdn. Bhd. for the 52 * Compaq V3000 with Conexant HDA. 53 * 54 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 55 * * * 56 * * This driver is a collaborative effort made by: * 57 * * * 58 * * Stephane E. Potvin <sepotvin@videotron.ca> * 59 * * Andrea Bittau <a.bittau@cs.ucl.ac.uk> * 60 * * Wesley Morgan <morganw@chemikals.org> * 61 * * Daniel Eischen <deischen@FreeBSD.org> * 62 * * Maxime Guillaud <bsd-ports@mguillaud.net> * 63 * * Ariff Abdullah <ariff@FreeBSD.org> * 64 * * Alexander Motin <mav@FreeBSD.org> * 65 * * * 66 * * ....and various people from freebsd-multimedia@FreeBSD.org * 67 * * * 68 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 69 */ 70 71 #ifdef HAVE_KERNEL_OPTION_HEADERS 72 #include "opt_snd.h" 73 #endif 74 75 #include <dev/sound/pcm/sound.h> 76 #include <dev/pci/pcireg.h> 77 #include <dev/pci/pcivar.h> 78 79 #include <sys/ctype.h> 80 #include <sys/taskqueue.h> 81 82 #include <dev/sound/pci/hda/hdac_private.h> 83 #include <dev/sound/pci/hda/hdac_reg.h> 84 #include <dev/sound/pci/hda/hda_reg.h> 85 #include <dev/sound/pci/hda/hdac.h> 86 87 #include "mixer_if.h" 88 89 #define HDA_DRV_TEST_REV "20100226_0142" 90 91 SND_DECLARE_FILE("$FreeBSD$"); 92 93 #define HDA_BOOTVERBOSE(stmt) do { \ 94 if (bootverbose != 0 || snd_verbose > 3) { \ 95 stmt \ 96 } \ 97 } while (0) 98 99 #define HDA_BOOTHVERBOSE(stmt) do { \ 100 if (snd_verbose > 3) { \ 101 stmt \ 102 } \ 103 } while (0) 104 105 #if 1 106 #undef HDAC_INTR_EXTRA 107 #define HDAC_INTR_EXTRA 1 108 #endif 109 110 #define hdac_lock(sc) snd_mtxlock((sc)->lock) 111 #define hdac_unlock(sc) snd_mtxunlock((sc)->lock) 112 #define hdac_lockassert(sc) snd_mtxassert((sc)->lock) 113 #define hdac_lockowned(sc) mtx_owned((sc)->lock) 114 115 #define HDA_FLAG_MATCH(fl, v) (((fl) & (v)) == (v)) 116 #define HDA_DEV_MATCH(fl, v) ((fl) == (v) || \ 117 (fl) == 0xffffffff || \ 118 (((fl) & 0xffff0000) == 0xffff0000 && \ 119 ((fl) & 0x0000ffff) == ((v) & 0x0000ffff)) || \ 120 (((fl) & 0x0000ffff) == 0x0000ffff && \ 121 ((fl) & 0xffff0000) == ((v) & 0xffff0000))) 122 #define HDA_MATCH_ALL 0xffffffff 123 #define HDAC_INVALID 0xffffffff 124 125 /* Default controller / jack sense poll: 250ms */ 126 #define HDAC_POLL_INTERVAL max(hz >> 2, 1) 127 128 /* 129 * Make room for possible 4096 playback/record channels, in 100 years to come. 130 */ 131 #define HDAC_TRIGGER_NONE 0x00000000 132 #define HDAC_TRIGGER_PLAY 0x00000fff 133 #define HDAC_TRIGGER_REC 0x00fff000 134 #define HDAC_TRIGGER_UNSOL 0x80000000 135 136 #define HDA_MODEL_CONSTRUCT(vendor, model) \ 137 (((uint32_t)(model) << 16) | ((vendor##_VENDORID) & 0xffff)) 138 139 /* Controller models */ 140 141 /* Intel */ 142 #define INTEL_VENDORID 0x8086 143 #define HDA_INTEL_CPT HDA_MODEL_CONSTRUCT(INTEL, 0x1c20) 144 #define HDA_INTEL_82801F HDA_MODEL_CONSTRUCT(INTEL, 0x2668) 145 #define HDA_INTEL_63XXESB HDA_MODEL_CONSTRUCT(INTEL, 0x269a) 146 #define HDA_INTEL_82801G HDA_MODEL_CONSTRUCT(INTEL, 0x27d8) 147 #define HDA_INTEL_82801H HDA_MODEL_CONSTRUCT(INTEL, 0x284b) 148 #define HDA_INTEL_82801I HDA_MODEL_CONSTRUCT(INTEL, 0x293e) 149 #define HDA_INTEL_82801JI HDA_MODEL_CONSTRUCT(INTEL, 0x3a3e) 150 #define HDA_INTEL_82801JD HDA_MODEL_CONSTRUCT(INTEL, 0x3a6e) 151 #define HDA_INTEL_PCH HDA_MODEL_CONSTRUCT(INTEL, 0x3b56) 152 #define HDA_INTEL_SCH HDA_MODEL_CONSTRUCT(INTEL, 0x811b) 153 #define HDA_INTEL_ALL HDA_MODEL_CONSTRUCT(INTEL, 0xffff) 154 155 /* Nvidia */ 156 #define NVIDIA_VENDORID 0x10de 157 #define HDA_NVIDIA_MCP51 HDA_MODEL_CONSTRUCT(NVIDIA, 0x026c) 158 #define HDA_NVIDIA_MCP55 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0371) 159 #define HDA_NVIDIA_MCP61_1 HDA_MODEL_CONSTRUCT(NVIDIA, 0x03e4) 160 #define HDA_NVIDIA_MCP61_2 HDA_MODEL_CONSTRUCT(NVIDIA, 0x03f0) 161 #define HDA_NVIDIA_MCP65_1 HDA_MODEL_CONSTRUCT(NVIDIA, 0x044a) 162 #define HDA_NVIDIA_MCP65_2 HDA_MODEL_CONSTRUCT(NVIDIA, 0x044b) 163 #define HDA_NVIDIA_MCP67_1 HDA_MODEL_CONSTRUCT(NVIDIA, 0x055c) 164 #define HDA_NVIDIA_MCP67_2 HDA_MODEL_CONSTRUCT(NVIDIA, 0x055d) 165 #define HDA_NVIDIA_MCP78_1 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0774) 166 #define HDA_NVIDIA_MCP78_2 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0775) 167 #define HDA_NVIDIA_MCP78_3 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0776) 168 #define HDA_NVIDIA_MCP78_4 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0777) 169 #define HDA_NVIDIA_MCP73_1 HDA_MODEL_CONSTRUCT(NVIDIA, 0x07fc) 170 #define HDA_NVIDIA_MCP73_2 HDA_MODEL_CONSTRUCT(NVIDIA, 0x07fd) 171 #define HDA_NVIDIA_MCP79_1 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac0) 172 #define HDA_NVIDIA_MCP79_2 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac1) 173 #define HDA_NVIDIA_MCP79_3 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac2) 174 #define HDA_NVIDIA_MCP79_4 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0ac3) 175 #define HDA_NVIDIA_MCP89_1 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0d94) 176 #define HDA_NVIDIA_MCP89_2 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0d95) 177 #define HDA_NVIDIA_MCP89_3 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0d96) 178 #define HDA_NVIDIA_MCP89_4 HDA_MODEL_CONSTRUCT(NVIDIA, 0x0d97) 179 #define HDA_NVIDIA_ALL HDA_MODEL_CONSTRUCT(NVIDIA, 0xffff) 180 181 /* ATI */ 182 #define ATI_VENDORID 0x1002 183 #define HDA_ATI_SB450 HDA_MODEL_CONSTRUCT(ATI, 0x437b) 184 #define HDA_ATI_SB600 HDA_MODEL_CONSTRUCT(ATI, 0x4383) 185 #define HDA_ATI_RS600 HDA_MODEL_CONSTRUCT(ATI, 0x793b) 186 #define HDA_ATI_RS690 HDA_MODEL_CONSTRUCT(ATI, 0x7919) 187 #define HDA_ATI_RS780 HDA_MODEL_CONSTRUCT(ATI, 0x960f) 188 #define HDA_ATI_R600 HDA_MODEL_CONSTRUCT(ATI, 0xaa00) 189 #define HDA_ATI_RV630 HDA_MODEL_CONSTRUCT(ATI, 0xaa08) 190 #define HDA_ATI_RV610 HDA_MODEL_CONSTRUCT(ATI, 0xaa10) 191 #define HDA_ATI_RV670 HDA_MODEL_CONSTRUCT(ATI, 0xaa18) 192 #define HDA_ATI_RV635 HDA_MODEL_CONSTRUCT(ATI, 0xaa20) 193 #define HDA_ATI_RV620 HDA_MODEL_CONSTRUCT(ATI, 0xaa28) 194 #define HDA_ATI_RV770 HDA_MODEL_CONSTRUCT(ATI, 0xaa30) 195 #define HDA_ATI_RV730 HDA_MODEL_CONSTRUCT(ATI, 0xaa38) 196 #define HDA_ATI_RV710 HDA_MODEL_CONSTRUCT(ATI, 0xaa40) 197 #define HDA_ATI_RV740 HDA_MODEL_CONSTRUCT(ATI, 0xaa48) 198 #define HDA_ATI_ALL HDA_MODEL_CONSTRUCT(ATI, 0xffff) 199 200 /* VIA */ 201 #define VIA_VENDORID 0x1106 202 #define HDA_VIA_VT82XX HDA_MODEL_CONSTRUCT(VIA, 0x3288) 203 #define HDA_VIA_ALL HDA_MODEL_CONSTRUCT(VIA, 0xffff) 204 205 /* SiS */ 206 #define SIS_VENDORID 0x1039 207 #define HDA_SIS_966 HDA_MODEL_CONSTRUCT(SIS, 0x7502) 208 #define HDA_SIS_ALL HDA_MODEL_CONSTRUCT(SIS, 0xffff) 209 210 /* ULI */ 211 #define ULI_VENDORID 0x10b9 212 #define HDA_ULI_M5461 HDA_MODEL_CONSTRUCT(ULI, 0x5461) 213 #define HDA_ULI_ALL HDA_MODEL_CONSTRUCT(ULI, 0xffff) 214 215 /* OEM/subvendors */ 216 217 /* Intel */ 218 #define INTEL_D101GGC_SUBVENDOR HDA_MODEL_CONSTRUCT(INTEL, 0xd600) 219 220 /* HP/Compaq */ 221 #define HP_VENDORID 0x103c 222 #define HP_V3000_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x30b5) 223 #define HP_NX7400_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x30a2) 224 #define HP_NX6310_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x30aa) 225 #define HP_NX6325_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x30b0) 226 #define HP_XW4300_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x3013) 227 #define HP_3010_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x3010) 228 #define HP_DV5000_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x30a5) 229 #define HP_DC7700S_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x2801) 230 #define HP_DC7700_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0x2802) 231 #define HP_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(HP, 0xffff) 232 /* What is wrong with XN 2563 anyway? (Got the picture ?) */ 233 #define HP_NX6325_SUBVENDORX 0x103c30b0 234 235 /* Dell */ 236 #define DELL_VENDORID 0x1028 237 #define DELL_D630_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x01f9) 238 #define DELL_D820_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x01cc) 239 #define DELL_V1400_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x0227) 240 #define DELL_V1500_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x0228) 241 #define DELL_I1300_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x01c9) 242 #define DELL_XPSM1210_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x01d7) 243 #define DELL_OPLX745_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0x01da) 244 #define DELL_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(DELL, 0xffff) 245 246 /* Clevo */ 247 #define CLEVO_VENDORID 0x1558 248 #define CLEVO_D900T_SUBVENDOR HDA_MODEL_CONSTRUCT(CLEVO, 0x0900) 249 #define CLEVO_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(CLEVO, 0xffff) 250 251 /* Acer */ 252 #define ACER_VENDORID 0x1025 253 #define ACER_A5050_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0x010f) 254 #define ACER_A4520_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0x0127) 255 #define ACER_A4710_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0x012f) 256 #define ACER_A4715_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0x0133) 257 #define ACER_3681WXM_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0x0110) 258 #define ACER_T6292_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0x011b) 259 #define ACER_T5320_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0x011f) 260 #define ACER_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(ACER, 0xffff) 261 262 /* Asus */ 263 #define ASUS_VENDORID 0x1043 264 #define ASUS_A8X_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1153) 265 #define ASUS_U5F_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1263) 266 #define ASUS_W6F_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1263) 267 #define ASUS_A7M_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1323) 268 #define ASUS_F3JC_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1338) 269 #define ASUS_G2K_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1339) 270 #define ASUS_A7T_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x13c2) 271 #define ASUS_W2J_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1971) 272 #define ASUS_M5200_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x1993) 273 #define ASUS_P5PL2_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x817f) 274 #define ASUS_P1AH2_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x81cb) 275 #define ASUS_M2NPVMX_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x81cb) 276 #define ASUS_M2V_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x81e7) 277 #define ASUS_P5BWD_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x81ec) 278 #define ASUS_M2N_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0x8234) 279 #define ASUS_A8NVMCSM_SUBVENDOR HDA_MODEL_CONSTRUCT(NVIDIA, 0xcb84) 280 #define ASUS_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(ASUS, 0xffff) 281 282 /* IBM / Lenovo */ 283 #define IBM_VENDORID 0x1014 284 #define IBM_M52_SUBVENDOR HDA_MODEL_CONSTRUCT(IBM, 0x02f6) 285 #define IBM_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(IBM, 0xffff) 286 287 /* Lenovo */ 288 #define LENOVO_VENDORID 0x17aa 289 #define LENOVO_3KN100_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x2066) 290 #define LENOVO_3KN200_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x384e) 291 #define LENOVO_TCA55_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x1015) 292 #define LENOVO_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0xffff) 293 294 /* Samsung */ 295 #define SAMSUNG_VENDORID 0x144d 296 #define SAMSUNG_Q1_SUBVENDOR HDA_MODEL_CONSTRUCT(SAMSUNG, 0xc027) 297 #define SAMSUNG_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(SAMSUNG, 0xffff) 298 299 /* Medion ? */ 300 #define MEDION_VENDORID 0x161f 301 #define MEDION_MD95257_SUBVENDOR HDA_MODEL_CONSTRUCT(MEDION, 0x203d) 302 #define MEDION_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(MEDION, 0xffff) 303 304 /* Apple Computer Inc. */ 305 #define APPLE_VENDORID 0x106b 306 #define APPLE_MB3_SUBVENDOR HDA_MODEL_CONSTRUCT(APPLE, 0x00a1) 307 308 /* Sony */ 309 #define SONY_VENDORID 0x104d 310 #define SONY_S5_SUBVENDOR HDA_MODEL_CONSTRUCT(SONY, 0x81cc) 311 #define SONY_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(SONY, 0xffff) 312 313 /* 314 * Apple Intel MacXXXX seems using Sigmatel codec/vendor id 315 * instead of their own, which is beyond my comprehension 316 * (see HDA_CODEC_STAC9221 below). 317 */ 318 #define APPLE_INTEL_MAC 0x76808384 319 #define APPLE_MACBOOKPRO55 0xcb7910de 320 321 /* LG Electronics */ 322 #define LG_VENDORID 0x1854 323 #define LG_LW20_SUBVENDOR HDA_MODEL_CONSTRUCT(LG, 0x0018) 324 #define LG_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(LG, 0xffff) 325 326 /* Fujitsu Siemens */ 327 #define FS_VENDORID 0x1734 328 #define FS_PA1510_SUBVENDOR HDA_MODEL_CONSTRUCT(FS, 0x10b8) 329 #define FS_SI1848_SUBVENDOR HDA_MODEL_CONSTRUCT(FS, 0x10cd) 330 #define FS_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(FS, 0xffff) 331 332 /* Fujitsu Limited */ 333 #define FL_VENDORID 0x10cf 334 #define FL_S7020D_SUBVENDOR HDA_MODEL_CONSTRUCT(FL, 0x1326) 335 #define FL_U1010_SUBVENDOR HDA_MODEL_CONSTRUCT(FL, 0x142d) 336 #define FL_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(FL, 0xffff) 337 338 /* Toshiba */ 339 #define TOSHIBA_VENDORID 0x1179 340 #define TOSHIBA_U200_SUBVENDOR HDA_MODEL_CONSTRUCT(TOSHIBA, 0x0001) 341 #define TOSHIBA_A135_SUBVENDOR HDA_MODEL_CONSTRUCT(TOSHIBA, 0xff01) 342 #define TOSHIBA_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(TOSHIBA, 0xffff) 343 344 /* Micro-Star International (MSI) */ 345 #define MSI_VENDORID 0x1462 346 #define MSI_MS1034_SUBVENDOR HDA_MODEL_CONSTRUCT(MSI, 0x0349) 347 #define MSI_MS034A_SUBVENDOR HDA_MODEL_CONSTRUCT(MSI, 0x034a) 348 #define MSI_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(MSI, 0xffff) 349 350 /* Giga-Byte Technology */ 351 #define GB_VENDORID 0x1458 352 #define GB_G33S2H_SUBVENDOR HDA_MODEL_CONSTRUCT(GB, 0xa022) 353 #define GP_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(GB, 0xffff) 354 355 /* Uniwill ? */ 356 #define UNIWILL_VENDORID 0x1584 357 #define UNIWILL_9075_SUBVENDOR HDA_MODEL_CONSTRUCT(UNIWILL, 0x9075) 358 #define UNIWILL_9080_SUBVENDOR HDA_MODEL_CONSTRUCT(UNIWILL, 0x9080) 359 360 361 /* Misc constants.. */ 362 #define HDA_AMP_VOL_DEFAULT (-1) 363 #define HDA_AMP_MUTE_DEFAULT (0xffffffff) 364 #define HDA_AMP_MUTE_NONE (0) 365 #define HDA_AMP_MUTE_LEFT (1 << 0) 366 #define HDA_AMP_MUTE_RIGHT (1 << 1) 367 #define HDA_AMP_MUTE_ALL (HDA_AMP_MUTE_LEFT | HDA_AMP_MUTE_RIGHT) 368 369 #define HDA_AMP_LEFT_MUTED(v) ((v) & (HDA_AMP_MUTE_LEFT)) 370 #define HDA_AMP_RIGHT_MUTED(v) (((v) & HDA_AMP_MUTE_RIGHT) >> 1) 371 372 #define HDA_ADC_MONITOR (1 << 0) 373 374 #define HDA_CTL_OUT 1 375 #define HDA_CTL_IN 2 376 377 #define HDA_GPIO_MAX 8 378 /* 0 - 7 = GPIO , 8 = Flush */ 379 #define HDA_QUIRK_GPIO0 (1 << 0) 380 #define HDA_QUIRK_GPIO1 (1 << 1) 381 #define HDA_QUIRK_GPIO2 (1 << 2) 382 #define HDA_QUIRK_GPIO3 (1 << 3) 383 #define HDA_QUIRK_GPIO4 (1 << 4) 384 #define HDA_QUIRK_GPIO5 (1 << 5) 385 #define HDA_QUIRK_GPIO6 (1 << 6) 386 #define HDA_QUIRK_GPIO7 (1 << 7) 387 #define HDA_QUIRK_GPIOFLUSH (1 << 8) 388 389 /* 9 - 25 = anything else */ 390 #define HDA_QUIRK_SOFTPCMVOL (1 << 9) 391 #define HDA_QUIRK_FIXEDRATE (1 << 10) 392 #define HDA_QUIRK_FORCESTEREO (1 << 11) 393 #define HDA_QUIRK_EAPDINV (1 << 12) 394 #define HDA_QUIRK_DMAPOS (1 << 13) 395 #define HDA_QUIRK_SENSEINV (1 << 14) 396 397 /* 26 - 31 = vrefs */ 398 #define HDA_QUIRK_IVREF50 (1 << 26) 399 #define HDA_QUIRK_IVREF80 (1 << 27) 400 #define HDA_QUIRK_IVREF100 (1 << 28) 401 #define HDA_QUIRK_OVREF50 (1 << 29) 402 #define HDA_QUIRK_OVREF80 (1 << 30) 403 #define HDA_QUIRK_OVREF100 (1 << 31) 404 405 #define HDA_QUIRK_IVREF (HDA_QUIRK_IVREF50 | HDA_QUIRK_IVREF80 | \ 406 HDA_QUIRK_IVREF100) 407 #define HDA_QUIRK_OVREF (HDA_QUIRK_OVREF50 | HDA_QUIRK_OVREF80 | \ 408 HDA_QUIRK_OVREF100) 409 #define HDA_QUIRK_VREF (HDA_QUIRK_IVREF | HDA_QUIRK_OVREF) 410 411 #if __FreeBSD_version < 600000 412 #define taskqueue_drain(...) 413 #endif 414 415 static const struct { 416 char *key; 417 uint32_t value; 418 } hdac_quirks_tab[] = { 419 { "gpio0", HDA_QUIRK_GPIO0 }, 420 { "gpio1", HDA_QUIRK_GPIO1 }, 421 { "gpio2", HDA_QUIRK_GPIO2 }, 422 { "gpio3", HDA_QUIRK_GPIO3 }, 423 { "gpio4", HDA_QUIRK_GPIO4 }, 424 { "gpio5", HDA_QUIRK_GPIO5 }, 425 { "gpio6", HDA_QUIRK_GPIO6 }, 426 { "gpio7", HDA_QUIRK_GPIO7 }, 427 { "gpioflush", HDA_QUIRK_GPIOFLUSH }, 428 { "softpcmvol", HDA_QUIRK_SOFTPCMVOL }, 429 { "fixedrate", HDA_QUIRK_FIXEDRATE }, 430 { "forcestereo", HDA_QUIRK_FORCESTEREO }, 431 { "eapdinv", HDA_QUIRK_EAPDINV }, 432 { "dmapos", HDA_QUIRK_DMAPOS }, 433 { "senseinv", HDA_QUIRK_SENSEINV }, 434 { "ivref50", HDA_QUIRK_IVREF50 }, 435 { "ivref80", HDA_QUIRK_IVREF80 }, 436 { "ivref100", HDA_QUIRK_IVREF100 }, 437 { "ovref50", HDA_QUIRK_OVREF50 }, 438 { "ovref80", HDA_QUIRK_OVREF80 }, 439 { "ovref100", HDA_QUIRK_OVREF100 }, 440 { "ivref", HDA_QUIRK_IVREF }, 441 { "ovref", HDA_QUIRK_OVREF }, 442 { "vref", HDA_QUIRK_VREF }, 443 }; 444 #define HDAC_QUIRKS_TAB_LEN \ 445 (sizeof(hdac_quirks_tab) / sizeof(hdac_quirks_tab[0])) 446 447 #define HDA_BDL_MIN 2 448 #define HDA_BDL_MAX 256 449 #define HDA_BDL_DEFAULT HDA_BDL_MIN 450 451 #define HDA_BLK_MIN HDAC_DMA_ALIGNMENT 452 #define HDA_BLK_ALIGN (~(HDA_BLK_MIN - 1)) 453 454 #define HDA_BUFSZ_MIN 4096 455 #define HDA_BUFSZ_MAX 65536 456 #define HDA_BUFSZ_DEFAULT 16384 457 458 #define HDA_PARSE_MAXDEPTH 10 459 460 #define HDAC_UNSOLTAG_EVENT_HP 0x00 461 462 MALLOC_DEFINE(M_HDAC, "hdac", "High Definition Audio Controller"); 463 464 const char *HDA_COLORS[16] = {"Unknown", "Black", "Grey", "Blue", "Green", "Red", 465 "Orange", "Yellow", "Purple", "Pink", "Res.A", "Res.B", "Res.C", "Res.D", 466 "White", "Other"}; 467 468 const char *HDA_DEVS[16] = {"Line-out", "Speaker", "Headphones", "CD", 469 "SPDIF-out", "Digital-out", "Modem-line", "Modem-handset", "Line-in", 470 "AUX", "Mic", "Telephony", "SPDIF-in", "Digital-in", "Res.E", "Other"}; 471 472 const char *HDA_CONNS[4] = {"Jack", "None", "Fixed", "Both"}; 473 474 /* Default */ 475 static uint32_t hdac_fmt[] = { 476 SND_FORMAT(AFMT_S16_LE, 2, 0), 477 0 478 }; 479 480 static struct pcmchan_caps hdac_caps = {48000, 48000, hdac_fmt, 0}; 481 482 #define HDAC_NO_MSI 1 483 #define HDAC_NO_64BIT 2 484 485 static const struct { 486 uint32_t model; 487 char *desc; 488 char flags; 489 } hdac_devices[] = { 490 { HDA_INTEL_CPT, "Intel Cougar Point", 0 }, 491 { HDA_INTEL_82801F, "Intel 82801F", 0 }, 492 { HDA_INTEL_63XXESB, "Intel 631x/632xESB", 0 }, 493 { HDA_INTEL_82801G, "Intel 82801G", 0 }, 494 { HDA_INTEL_82801H, "Intel 82801H", 0 }, 495 { HDA_INTEL_82801I, "Intel 82801I", 0 }, 496 { HDA_INTEL_82801JI, "Intel 82801JI", 0 }, 497 { HDA_INTEL_82801JD, "Intel 82801JD", 0 }, 498 { HDA_INTEL_PCH, "Intel PCH", 0 }, 499 { HDA_INTEL_SCH, "Intel SCH", 0 }, 500 { HDA_NVIDIA_MCP51, "NVidia MCP51", HDAC_NO_MSI }, 501 { HDA_NVIDIA_MCP55, "NVidia MCP55", HDAC_NO_MSI }, 502 { HDA_NVIDIA_MCP61_1, "NVidia MCP61", 0 }, 503 { HDA_NVIDIA_MCP61_2, "NVidia MCP61", 0 }, 504 { HDA_NVIDIA_MCP65_1, "NVidia MCP65", 0 }, 505 { HDA_NVIDIA_MCP65_2, "NVidia MCP65", 0 }, 506 { HDA_NVIDIA_MCP67_1, "NVidia MCP67", 0 }, 507 { HDA_NVIDIA_MCP67_2, "NVidia MCP67", 0 }, 508 { HDA_NVIDIA_MCP73_1, "NVidia MCP73", 0 }, 509 { HDA_NVIDIA_MCP73_2, "NVidia MCP73", 0 }, 510 { HDA_NVIDIA_MCP78_1, "NVidia MCP78", HDAC_NO_64BIT }, 511 { HDA_NVIDIA_MCP78_2, "NVidia MCP78", HDAC_NO_64BIT }, 512 { HDA_NVIDIA_MCP78_3, "NVidia MCP78", HDAC_NO_64BIT }, 513 { HDA_NVIDIA_MCP78_4, "NVidia MCP78", HDAC_NO_64BIT }, 514 { HDA_NVIDIA_MCP79_1, "NVidia MCP79", 0 }, 515 { HDA_NVIDIA_MCP79_2, "NVidia MCP79", 0 }, 516 { HDA_NVIDIA_MCP79_3, "NVidia MCP79", 0 }, 517 { HDA_NVIDIA_MCP79_4, "NVidia MCP79", 0 }, 518 { HDA_NVIDIA_MCP89_1, "NVidia MCP89", 0 }, 519 { HDA_NVIDIA_MCP89_2, "NVidia MCP89", 0 }, 520 { HDA_NVIDIA_MCP89_3, "NVidia MCP89", 0 }, 521 { HDA_NVIDIA_MCP89_4, "NVidia MCP89", 0 }, 522 { HDA_ATI_SB450, "ATI SB450", 0 }, 523 { HDA_ATI_SB600, "ATI SB600", 0 }, 524 { HDA_ATI_RS600, "ATI RS600", 0 }, 525 { HDA_ATI_RS690, "ATI RS690", 0 }, 526 { HDA_ATI_RS780, "ATI RS780", 0 }, 527 { HDA_ATI_R600, "ATI R600", 0 }, 528 { HDA_ATI_RV610, "ATI RV610", 0 }, 529 { HDA_ATI_RV620, "ATI RV620", 0 }, 530 { HDA_ATI_RV630, "ATI RV630", 0 }, 531 { HDA_ATI_RV635, "ATI RV635", 0 }, 532 { HDA_ATI_RV710, "ATI RV710", 0 }, 533 { HDA_ATI_RV730, "ATI RV730", 0 }, 534 { HDA_ATI_RV740, "ATI RV740", 0 }, 535 { HDA_ATI_RV770, "ATI RV770", 0 }, 536 { HDA_VIA_VT82XX, "VIA VT8251/8237A",0 }, 537 { HDA_SIS_966, "SiS 966", 0 }, 538 { HDA_ULI_M5461, "ULI M5461", 0 }, 539 /* Unknown */ 540 { HDA_INTEL_ALL, "Intel (Unknown)" }, 541 { HDA_NVIDIA_ALL, "NVidia (Unknown)" }, 542 { HDA_ATI_ALL, "ATI (Unknown)" }, 543 { HDA_VIA_ALL, "VIA (Unknown)" }, 544 { HDA_SIS_ALL, "SiS (Unknown)" }, 545 { HDA_ULI_ALL, "ULI (Unknown)" }, 546 }; 547 #define HDAC_DEVICES_LEN (sizeof(hdac_devices) / sizeof(hdac_devices[0])) 548 549 static const struct { 550 uint16_t vendor; 551 uint8_t reg; 552 uint8_t mask; 553 uint8_t enable; 554 } hdac_pcie_snoop[] = { 555 { INTEL_VENDORID, 0x00, 0x00, 0x00 }, 556 { ATI_VENDORID, 0x42, 0xf8, 0x02 }, 557 { NVIDIA_VENDORID, 0x4e, 0xf0, 0x0f }, 558 }; 559 #define HDAC_PCIESNOOP_LEN \ 560 (sizeof(hdac_pcie_snoop) / sizeof(hdac_pcie_snoop[0])) 561 562 static const struct { 563 uint32_t rate; 564 int valid; 565 uint16_t base; 566 uint16_t mul; 567 uint16_t div; 568 } hda_rate_tab[] = { 569 { 8000, 1, 0x0000, 0x0000, 0x0500 }, /* (48000 * 1) / 6 */ 570 { 9600, 0, 0x0000, 0x0000, 0x0400 }, /* (48000 * 1) / 5 */ 571 { 12000, 0, 0x0000, 0x0000, 0x0300 }, /* (48000 * 1) / 4 */ 572 { 16000, 1, 0x0000, 0x0000, 0x0200 }, /* (48000 * 1) / 3 */ 573 { 18000, 0, 0x0000, 0x1000, 0x0700 }, /* (48000 * 3) / 8 */ 574 { 19200, 0, 0x0000, 0x0800, 0x0400 }, /* (48000 * 2) / 5 */ 575 { 24000, 0, 0x0000, 0x0000, 0x0100 }, /* (48000 * 1) / 2 */ 576 { 28800, 0, 0x0000, 0x1000, 0x0400 }, /* (48000 * 3) / 5 */ 577 { 32000, 1, 0x0000, 0x0800, 0x0200 }, /* (48000 * 2) / 3 */ 578 { 36000, 0, 0x0000, 0x1000, 0x0300 }, /* (48000 * 3) / 4 */ 579 { 38400, 0, 0x0000, 0x1800, 0x0400 }, /* (48000 * 4) / 5 */ 580 { 48000, 1, 0x0000, 0x0000, 0x0000 }, /* (48000 * 1) / 1 */ 581 { 64000, 0, 0x0000, 0x1800, 0x0200 }, /* (48000 * 4) / 3 */ 582 { 72000, 0, 0x0000, 0x1000, 0x0100 }, /* (48000 * 3) / 2 */ 583 { 96000, 1, 0x0000, 0x0800, 0x0000 }, /* (48000 * 2) / 1 */ 584 { 144000, 0, 0x0000, 0x1000, 0x0000 }, /* (48000 * 3) / 1 */ 585 { 192000, 1, 0x0000, 0x1800, 0x0000 }, /* (48000 * 4) / 1 */ 586 { 8820, 0, 0x4000, 0x0000, 0x0400 }, /* (44100 * 1) / 5 */ 587 { 11025, 1, 0x4000, 0x0000, 0x0300 }, /* (44100 * 1) / 4 */ 588 { 12600, 0, 0x4000, 0x0800, 0x0600 }, /* (44100 * 2) / 7 */ 589 { 14700, 0, 0x4000, 0x0000, 0x0200 }, /* (44100 * 1) / 3 */ 590 { 17640, 0, 0x4000, 0x0800, 0x0400 }, /* (44100 * 2) / 5 */ 591 { 18900, 0, 0x4000, 0x1000, 0x0600 }, /* (44100 * 3) / 7 */ 592 { 22050, 1, 0x4000, 0x0000, 0x0100 }, /* (44100 * 1) / 2 */ 593 { 25200, 0, 0x4000, 0x1800, 0x0600 }, /* (44100 * 4) / 7 */ 594 { 26460, 0, 0x4000, 0x1000, 0x0400 }, /* (44100 * 3) / 5 */ 595 { 29400, 0, 0x4000, 0x0800, 0x0200 }, /* (44100 * 2) / 3 */ 596 { 33075, 0, 0x4000, 0x1000, 0x0300 }, /* (44100 * 3) / 4 */ 597 { 35280, 0, 0x4000, 0x1800, 0x0400 }, /* (44100 * 4) / 5 */ 598 { 44100, 1, 0x4000, 0x0000, 0x0000 }, /* (44100 * 1) / 1 */ 599 { 58800, 0, 0x4000, 0x1800, 0x0200 }, /* (44100 * 4) / 3 */ 600 { 66150, 0, 0x4000, 0x1000, 0x0100 }, /* (44100 * 3) / 2 */ 601 { 88200, 1, 0x4000, 0x0800, 0x0000 }, /* (44100 * 2) / 1 */ 602 { 132300, 0, 0x4000, 0x1000, 0x0000 }, /* (44100 * 3) / 1 */ 603 { 176400, 1, 0x4000, 0x1800, 0x0000 }, /* (44100 * 4) / 1 */ 604 }; 605 #define HDA_RATE_TAB_LEN (sizeof(hda_rate_tab) / sizeof(hda_rate_tab[0])) 606 607 /* All codecs you can eat... */ 608 #define HDA_CODEC_CONSTRUCT(vendor, id) \ 609 (((uint32_t)(vendor##_VENDORID) << 16) | ((id) & 0xffff)) 610 611 /* Cirrus Logic */ 612 #define CIRRUSLOGIC_VENDORID 0x1013 613 #define HDA_CODEC_CS4206 HDA_CODEC_CONSTRUCT(CIRRUSLOGIC, 0x4206) 614 #define HDA_CODEC_CS4207 HDA_CODEC_CONSTRUCT(CIRRUSLOGIC, 0x4207) 615 #define HDA_CODEC_CSXXXX HDA_CODEC_CONSTRUCT(CIRRUSLOGIC, 0xffff) 616 617 /* Realtek */ 618 #define REALTEK_VENDORID 0x10ec 619 #define HDA_CODEC_ALC260 HDA_CODEC_CONSTRUCT(REALTEK, 0x0260) 620 #define HDA_CODEC_ALC262 HDA_CODEC_CONSTRUCT(REALTEK, 0x0262) 621 #define HDA_CODEC_ALC267 HDA_CODEC_CONSTRUCT(REALTEK, 0x0267) 622 #define HDA_CODEC_ALC268 HDA_CODEC_CONSTRUCT(REALTEK, 0x0268) 623 #define HDA_CODEC_ALC269 HDA_CODEC_CONSTRUCT(REALTEK, 0x0269) 624 #define HDA_CODEC_ALC270 HDA_CODEC_CONSTRUCT(REALTEK, 0x0270) 625 #define HDA_CODEC_ALC272 HDA_CODEC_CONSTRUCT(REALTEK, 0x0272) 626 #define HDA_CODEC_ALC273 HDA_CODEC_CONSTRUCT(REALTEK, 0x0273) 627 #define HDA_CODEC_ALC275 HDA_CODEC_CONSTRUCT(REALTEK, 0x0275) 628 #define HDA_CODEC_ALC660 HDA_CODEC_CONSTRUCT(REALTEK, 0x0660) 629 #define HDA_CODEC_ALC662 HDA_CODEC_CONSTRUCT(REALTEK, 0x0662) 630 #define HDA_CODEC_ALC663 HDA_CODEC_CONSTRUCT(REALTEK, 0x0663) 631 #define HDA_CODEC_ALC665 HDA_CODEC_CONSTRUCT(REALTEK, 0x0665) 632 #define HDA_CODEC_ALC861 HDA_CODEC_CONSTRUCT(REALTEK, 0x0861) 633 #define HDA_CODEC_ALC861VD HDA_CODEC_CONSTRUCT(REALTEK, 0x0862) 634 #define HDA_CODEC_ALC880 HDA_CODEC_CONSTRUCT(REALTEK, 0x0880) 635 #define HDA_CODEC_ALC882 HDA_CODEC_CONSTRUCT(REALTEK, 0x0882) 636 #define HDA_CODEC_ALC883 HDA_CODEC_CONSTRUCT(REALTEK, 0x0883) 637 #define HDA_CODEC_ALC885 HDA_CODEC_CONSTRUCT(REALTEK, 0x0885) 638 #define HDA_CODEC_ALC887 HDA_CODEC_CONSTRUCT(REALTEK, 0x0887) 639 #define HDA_CODEC_ALC888 HDA_CODEC_CONSTRUCT(REALTEK, 0x0888) 640 #define HDA_CODEC_ALC889 HDA_CODEC_CONSTRUCT(REALTEK, 0x0889) 641 #define HDA_CODEC_ALC892 HDA_CODEC_CONSTRUCT(REALTEK, 0x0892) 642 #define HDA_CODEC_ALCXXXX HDA_CODEC_CONSTRUCT(REALTEK, 0xffff) 643 644 /* Analog Devices */ 645 #define ANALOGDEVICES_VENDORID 0x11d4 646 #define HDA_CODEC_AD1884A HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x184a) 647 #define HDA_CODEC_AD1882 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1882) 648 #define HDA_CODEC_AD1883 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1883) 649 #define HDA_CODEC_AD1884 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1884) 650 #define HDA_CODEC_AD1984A HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x194a) 651 #define HDA_CODEC_AD1984B HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x194b) 652 #define HDA_CODEC_AD1981HD HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1981) 653 #define HDA_CODEC_AD1983 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1983) 654 #define HDA_CODEC_AD1984 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1984) 655 #define HDA_CODEC_AD1986A HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1986) 656 #define HDA_CODEC_AD1987 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1987) 657 #define HDA_CODEC_AD1988 HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x1988) 658 #define HDA_CODEC_AD1988B HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x198b) 659 #define HDA_CODEC_AD1882A HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x882a) 660 #define HDA_CODEC_AD1989B HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0x989b) 661 #define HDA_CODEC_ADXXXX HDA_CODEC_CONSTRUCT(ANALOGDEVICES, 0xffff) 662 663 /* CMedia */ 664 #define CMEDIA_VENDORID 0x434d 665 #define HDA_CODEC_CMI9880 HDA_CODEC_CONSTRUCT(CMEDIA, 0x4980) 666 #define HDA_CODEC_CMIXXXX HDA_CODEC_CONSTRUCT(CMEDIA, 0xffff) 667 668 /* Sigmatel */ 669 #define SIGMATEL_VENDORID 0x8384 670 #define HDA_CODEC_STAC9230X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7612) 671 #define HDA_CODEC_STAC9230D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7613) 672 #define HDA_CODEC_STAC9229X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7614) 673 #define HDA_CODEC_STAC9229D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7615) 674 #define HDA_CODEC_STAC9228X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7616) 675 #define HDA_CODEC_STAC9228D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7617) 676 #define HDA_CODEC_STAC9227X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7618) 677 #define HDA_CODEC_STAC9227D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7619) 678 #define HDA_CODEC_STAC9274 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7620) 679 #define HDA_CODEC_STAC9274D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7621) 680 #define HDA_CODEC_STAC9273X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7622) 681 #define HDA_CODEC_STAC9273D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7623) 682 #define HDA_CODEC_STAC9272X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7624) 683 #define HDA_CODEC_STAC9272D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7625) 684 #define HDA_CODEC_STAC9271X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7626) 685 #define HDA_CODEC_STAC9271D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7627) 686 #define HDA_CODEC_STAC9274X5NH HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7628) 687 #define HDA_CODEC_STAC9274D5NH HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7629) 688 #define HDA_CODEC_STAC9250 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7634) 689 #define HDA_CODEC_STAC9251 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7636) 690 #define HDA_CODEC_IDT92HD700X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7638) 691 #define HDA_CODEC_IDT92HD700D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7639) 692 #define HDA_CODEC_IDT92HD206X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7645) 693 #define HDA_CODEC_IDT92HD206D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7646) 694 #define HDA_CODEC_CXD9872RDK HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7661) 695 #define HDA_CODEC_STAC9872AK HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7662) 696 #define HDA_CODEC_CXD9872AKD HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7664) 697 #define HDA_CODEC_STAC9221 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7680) 698 #define HDA_CODEC_STAC922XD HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7681) 699 #define HDA_CODEC_STAC9221_A2 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7682) 700 #define HDA_CODEC_STAC9221D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7683) 701 #define HDA_CODEC_STAC9220 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7690) 702 #define HDA_CODEC_STAC9200D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7691) 703 #define HDA_CODEC_IDT92HD005 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7698) 704 #define HDA_CODEC_IDT92HD005D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7699) 705 #define HDA_CODEC_STAC9205X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a0) 706 #define HDA_CODEC_STAC9205D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a1) 707 #define HDA_CODEC_STAC9204X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a2) 708 #define HDA_CODEC_STAC9204D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x76a3) 709 #define HDA_CODEC_STAC9220_A2 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7880) 710 #define HDA_CODEC_STAC9220_A1 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7882) 711 #define HDA_CODEC_STACXXXX HDA_CODEC_CONSTRUCT(SIGMATEL, 0xffff) 712 713 /* IDT */ 714 #define IDT_VENDORID 0x111d 715 #define HDA_CODEC_IDT92HD75BX HDA_CODEC_CONSTRUCT(IDT, 0x7603) 716 #define HDA_CODEC_IDT92HD83C1X HDA_CODEC_CONSTRUCT(IDT, 0x7604) 717 #define HDA_CODEC_IDT92HD81B1X HDA_CODEC_CONSTRUCT(IDT, 0x7605) 718 #define HDA_CODEC_IDT92HD75B3 HDA_CODEC_CONSTRUCT(IDT, 0x7608) 719 #define HDA_CODEC_IDT92HD73D1 HDA_CODEC_CONSTRUCT(IDT, 0x7674) 720 #define HDA_CODEC_IDT92HD73C1 HDA_CODEC_CONSTRUCT(IDT, 0x7675) 721 #define HDA_CODEC_IDT92HD73E1 HDA_CODEC_CONSTRUCT(IDT, 0x7676) 722 #define HDA_CODEC_IDT92HD71B8 HDA_CODEC_CONSTRUCT(IDT, 0x76b0) 723 #define HDA_CODEC_IDT92HD71B7 HDA_CODEC_CONSTRUCT(IDT, 0x76b2) 724 #define HDA_CODEC_IDT92HD71B5 HDA_CODEC_CONSTRUCT(IDT, 0x76b6) 725 #define HDA_CODEC_IDT92HD83C1C HDA_CODEC_CONSTRUCT(IDT, 0x76d4) 726 #define HDA_CODEC_IDT92HD81B1C HDA_CODEC_CONSTRUCT(IDT, 0x76d5) 727 #define HDA_CODEC_IDTXXXX HDA_CODEC_CONSTRUCT(IDT, 0xffff) 728 729 /* Silicon Image */ 730 #define SII_VENDORID 0x1095 731 #define HDA_CODEC_SII1390 HDA_CODEC_CONSTRUCT(SII, 0x1390) 732 #define HDA_CODEC_SII1392 HDA_CODEC_CONSTRUCT(SII, 0x1392) 733 #define HDA_CODEC_SIIXXXX HDA_CODEC_CONSTRUCT(SII, 0xffff) 734 735 /* Lucent/Agere */ 736 #define AGERE_VENDORID 0x11c1 737 #define HDA_CODEC_AGEREXXXX HDA_CODEC_CONSTRUCT(AGERE, 0xffff) 738 739 /* Conexant */ 740 #define CONEXANT_VENDORID 0x14f1 741 #define HDA_CODEC_CX20549 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5045) 742 #define HDA_CODEC_CX20551 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5047) 743 #define HDA_CODEC_CX20561 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5051) 744 #define HDA_CODEC_CX20582 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5066) 745 #define HDA_CODEC_CX20583 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5067) 746 #define HDA_CODEC_CX20585 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5069) 747 #define HDA_CODEC_CXXXXX HDA_CODEC_CONSTRUCT(CONEXANT, 0xffff) 748 749 /* VIA */ 750 #define HDA_CODEC_VT1708_8 HDA_CODEC_CONSTRUCT(VIA, 0x1708) 751 #define HDA_CODEC_VT1708_9 HDA_CODEC_CONSTRUCT(VIA, 0x1709) 752 #define HDA_CODEC_VT1708_A HDA_CODEC_CONSTRUCT(VIA, 0x170a) 753 #define HDA_CODEC_VT1708_B HDA_CODEC_CONSTRUCT(VIA, 0x170b) 754 #define HDA_CODEC_VT1709_0 HDA_CODEC_CONSTRUCT(VIA, 0xe710) 755 #define HDA_CODEC_VT1709_1 HDA_CODEC_CONSTRUCT(VIA, 0xe711) 756 #define HDA_CODEC_VT1709_2 HDA_CODEC_CONSTRUCT(VIA, 0xe712) 757 #define HDA_CODEC_VT1709_3 HDA_CODEC_CONSTRUCT(VIA, 0xe713) 758 #define HDA_CODEC_VT1709_4 HDA_CODEC_CONSTRUCT(VIA, 0xe714) 759 #define HDA_CODEC_VT1709_5 HDA_CODEC_CONSTRUCT(VIA, 0xe715) 760 #define HDA_CODEC_VT1709_6 HDA_CODEC_CONSTRUCT(VIA, 0xe716) 761 #define HDA_CODEC_VT1709_7 HDA_CODEC_CONSTRUCT(VIA, 0xe717) 762 #define HDA_CODEC_VT1708B_0 HDA_CODEC_CONSTRUCT(VIA, 0xe720) 763 #define HDA_CODEC_VT1708B_1 HDA_CODEC_CONSTRUCT(VIA, 0xe721) 764 #define HDA_CODEC_VT1708B_2 HDA_CODEC_CONSTRUCT(VIA, 0xe722) 765 #define HDA_CODEC_VT1708B_3 HDA_CODEC_CONSTRUCT(VIA, 0xe723) 766 #define HDA_CODEC_VT1708B_4 HDA_CODEC_CONSTRUCT(VIA, 0xe724) 767 #define HDA_CODEC_VT1708B_5 HDA_CODEC_CONSTRUCT(VIA, 0xe725) 768 #define HDA_CODEC_VT1708B_6 HDA_CODEC_CONSTRUCT(VIA, 0xe726) 769 #define HDA_CODEC_VT1708B_7 HDA_CODEC_CONSTRUCT(VIA, 0xe727) 770 #define HDA_CODEC_VT1708S_0 HDA_CODEC_CONSTRUCT(VIA, 0x0397) 771 #define HDA_CODEC_VT1708S_1 HDA_CODEC_CONSTRUCT(VIA, 0x1397) 772 #define HDA_CODEC_VT1708S_2 HDA_CODEC_CONSTRUCT(VIA, 0x2397) 773 #define HDA_CODEC_VT1708S_3 HDA_CODEC_CONSTRUCT(VIA, 0x3397) 774 #define HDA_CODEC_VT1708S_4 HDA_CODEC_CONSTRUCT(VIA, 0x4397) 775 #define HDA_CODEC_VT1708S_5 HDA_CODEC_CONSTRUCT(VIA, 0x5397) 776 #define HDA_CODEC_VT1708S_6 HDA_CODEC_CONSTRUCT(VIA, 0x6397) 777 #define HDA_CODEC_VT1708S_7 HDA_CODEC_CONSTRUCT(VIA, 0x7397) 778 #define HDA_CODEC_VT1702_0 HDA_CODEC_CONSTRUCT(VIA, 0x0398) 779 #define HDA_CODEC_VT1702_1 HDA_CODEC_CONSTRUCT(VIA, 0x1398) 780 #define HDA_CODEC_VT1702_2 HDA_CODEC_CONSTRUCT(VIA, 0x2398) 781 #define HDA_CODEC_VT1702_3 HDA_CODEC_CONSTRUCT(VIA, 0x3398) 782 #define HDA_CODEC_VT1702_4 HDA_CODEC_CONSTRUCT(VIA, 0x4398) 783 #define HDA_CODEC_VT1702_5 HDA_CODEC_CONSTRUCT(VIA, 0x5398) 784 #define HDA_CODEC_VT1702_6 HDA_CODEC_CONSTRUCT(VIA, 0x6398) 785 #define HDA_CODEC_VT1702_7 HDA_CODEC_CONSTRUCT(VIA, 0x7398) 786 #define HDA_CODEC_VT1716S_0 HDA_CODEC_CONSTRUCT(VIA, 0x0433) 787 #define HDA_CODEC_VT1716S_1 HDA_CODEC_CONSTRUCT(VIA, 0xa721) 788 #define HDA_CODEC_VT1718S_0 HDA_CODEC_CONSTRUCT(VIA, 0x0428) 789 #define HDA_CODEC_VT1718S_1 HDA_CODEC_CONSTRUCT(VIA, 0x4428) 790 #define HDA_CODEC_VT1812 HDA_CODEC_CONSTRUCT(VIA, 0x0448) 791 #define HDA_CODEC_VT1818S HDA_CODEC_CONSTRUCT(VIA, 0x0440) 792 #define HDA_CODEC_VT1828S HDA_CODEC_CONSTRUCT(VIA, 0x4441) 793 #define HDA_CODEC_VT2002P_0 HDA_CODEC_CONSTRUCT(VIA, 0x0438) 794 #define HDA_CODEC_VT2002P_1 HDA_CODEC_CONSTRUCT(VIA, 0x4438) 795 #define HDA_CODEC_VT2020 HDA_CODEC_CONSTRUCT(VIA, 0x0441) 796 #define HDA_CODEC_VTXXXX HDA_CODEC_CONSTRUCT(VIA, 0xffff) 797 798 /* ATI */ 799 #define HDA_CODEC_ATIRS600_1 HDA_CODEC_CONSTRUCT(ATI, 0x793c) 800 #define HDA_CODEC_ATIRS600_2 HDA_CODEC_CONSTRUCT(ATI, 0x7919) 801 #define HDA_CODEC_ATIRS690 HDA_CODEC_CONSTRUCT(ATI, 0x791a) 802 #define HDA_CODEC_ATIR6XX HDA_CODEC_CONSTRUCT(ATI, 0xaa01) 803 #define HDA_CODEC_ATIXXXX HDA_CODEC_CONSTRUCT(ATI, 0xffff) 804 805 /* NVIDIA */ 806 #define HDA_CODEC_NVIDIAMCP78 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0002) 807 #define HDA_CODEC_NVIDIAMCP78_2 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0006) 808 #define HDA_CODEC_NVIDIAMCP7A HDA_CODEC_CONSTRUCT(NVIDIA, 0x0007) 809 #define HDA_CODEC_NVIDIAGT220 HDA_CODEC_CONSTRUCT(NVIDIA, 0x000a) 810 #define HDA_CODEC_NVIDIAGT21X HDA_CODEC_CONSTRUCT(NVIDIA, 0x000b) 811 #define HDA_CODEC_NVIDIAMCP89 HDA_CODEC_CONSTRUCT(NVIDIA, 0x000c) 812 #define HDA_CODEC_NVIDIAGT240 HDA_CODEC_CONSTRUCT(NVIDIA, 0x000d) 813 #define HDA_CODEC_NVIDIAMCP67 HDA_CODEC_CONSTRUCT(NVIDIA, 0x0067) 814 #define HDA_CODEC_NVIDIAMCP73 HDA_CODEC_CONSTRUCT(NVIDIA, 0x8001) 815 #define HDA_CODEC_NVIDIAXXXX HDA_CODEC_CONSTRUCT(NVIDIA, 0xffff) 816 817 /* INTEL */ 818 #define HDA_CODEC_INTELG45_1 HDA_CODEC_CONSTRUCT(INTEL, 0x2801) 819 #define HDA_CODEC_INTELG45_2 HDA_CODEC_CONSTRUCT(INTEL, 0x2802) 820 #define HDA_CODEC_INTELG45_3 HDA_CODEC_CONSTRUCT(INTEL, 0x2803) 821 #define HDA_CODEC_INTELG45_4 HDA_CODEC_CONSTRUCT(INTEL, 0x2804) 822 #define HDA_CODEC_INTELG45_5 HDA_CODEC_CONSTRUCT(INTEL, 0x29fb) 823 #define HDA_CODEC_INTELQ57 HDA_CODEC_CONSTRUCT(INTEL, 0x0054) 824 #define HDA_CODEC_INTELXXXX HDA_CODEC_CONSTRUCT(INTEL, 0xffff) 825 826 /* Codecs */ 827 static const struct { 828 uint32_t id; 829 char *name; 830 } hdac_codecs[] = { 831 { HDA_CODEC_CS4206, "Cirrus Logic CS4206" }, 832 { HDA_CODEC_CS4207, "Cirrus Logic CS4207" }, 833 { HDA_CODEC_ALC260, "Realtek ALC260" }, 834 { HDA_CODEC_ALC262, "Realtek ALC262" }, 835 { HDA_CODEC_ALC267, "Realtek ALC267" }, 836 { HDA_CODEC_ALC268, "Realtek ALC268" }, 837 { HDA_CODEC_ALC269, "Realtek ALC269" }, 838 { HDA_CODEC_ALC270, "Realtek ALC270" }, 839 { HDA_CODEC_ALC272, "Realtek ALC272" }, 840 { HDA_CODEC_ALC273, "Realtek ALC273" }, 841 { HDA_CODEC_ALC275, "Realtek ALC275" }, 842 { HDA_CODEC_ALC660, "Realtek ALC660" }, 843 { HDA_CODEC_ALC662, "Realtek ALC662" }, 844 { HDA_CODEC_ALC663, "Realtek ALC663" }, 845 { HDA_CODEC_ALC665, "Realtek ALC665" }, 846 { HDA_CODEC_ALC861, "Realtek ALC861" }, 847 { HDA_CODEC_ALC861VD, "Realtek ALC861-VD" }, 848 { HDA_CODEC_ALC880, "Realtek ALC880" }, 849 { HDA_CODEC_ALC882, "Realtek ALC882" }, 850 { HDA_CODEC_ALC883, "Realtek ALC883" }, 851 { HDA_CODEC_ALC885, "Realtek ALC885" }, 852 { HDA_CODEC_ALC887, "Realtek ALC887" }, 853 { HDA_CODEC_ALC888, "Realtek ALC888" }, 854 { HDA_CODEC_ALC889, "Realtek ALC889" }, 855 { HDA_CODEC_ALC892, "Realtek ALC892" }, 856 { HDA_CODEC_AD1882, "Analog Devices AD1882" }, 857 { HDA_CODEC_AD1882A, "Analog Devices AD1882A" }, 858 { HDA_CODEC_AD1883, "Analog Devices AD1883" }, 859 { HDA_CODEC_AD1884, "Analog Devices AD1884" }, 860 { HDA_CODEC_AD1884A, "Analog Devices AD1884A" }, 861 { HDA_CODEC_AD1981HD, "Analog Devices AD1981HD" }, 862 { HDA_CODEC_AD1983, "Analog Devices AD1983" }, 863 { HDA_CODEC_AD1984, "Analog Devices AD1984" }, 864 { HDA_CODEC_AD1984A, "Analog Devices AD1984A" }, 865 { HDA_CODEC_AD1984B, "Analog Devices AD1984B" }, 866 { HDA_CODEC_AD1986A, "Analog Devices AD1986A" }, 867 { HDA_CODEC_AD1987, "Analog Devices AD1987" }, 868 { HDA_CODEC_AD1988, "Analog Devices AD1988A" }, 869 { HDA_CODEC_AD1988B, "Analog Devices AD1988B" }, 870 { HDA_CODEC_AD1989B, "Analog Devices AD1989B" }, 871 { HDA_CODEC_CMI9880, "CMedia CMI9880" }, 872 { HDA_CODEC_CXD9872RDK, "Sigmatel CXD9872RD/K" }, 873 { HDA_CODEC_CXD9872AKD, "Sigmatel CXD9872AKD" }, 874 { HDA_CODEC_STAC9200D, "Sigmatel STAC9200D" }, 875 { HDA_CODEC_STAC9204X, "Sigmatel STAC9204X" }, 876 { HDA_CODEC_STAC9204D, "Sigmatel STAC9204D" }, 877 { HDA_CODEC_STAC9205X, "Sigmatel STAC9205X" }, 878 { HDA_CODEC_STAC9205D, "Sigmatel STAC9205D" }, 879 { HDA_CODEC_STAC9220, "Sigmatel STAC9220" }, 880 { HDA_CODEC_STAC9220_A1, "Sigmatel STAC9220_A1" }, 881 { HDA_CODEC_STAC9220_A2, "Sigmatel STAC9220_A2" }, 882 { HDA_CODEC_STAC9221, "Sigmatel STAC9221" }, 883 { HDA_CODEC_STAC9221_A2, "Sigmatel STAC9221_A2" }, 884 { HDA_CODEC_STAC9221D, "Sigmatel STAC9221D" }, 885 { HDA_CODEC_STAC922XD, "Sigmatel STAC9220D/9223D" }, 886 { HDA_CODEC_STAC9227X, "Sigmatel STAC9227X" }, 887 { HDA_CODEC_STAC9227D, "Sigmatel STAC9227D" }, 888 { HDA_CODEC_STAC9228X, "Sigmatel STAC9228X" }, 889 { HDA_CODEC_STAC9228D, "Sigmatel STAC9228D" }, 890 { HDA_CODEC_STAC9229X, "Sigmatel STAC9229X" }, 891 { HDA_CODEC_STAC9229D, "Sigmatel STAC9229D" }, 892 { HDA_CODEC_STAC9230X, "Sigmatel STAC9230X" }, 893 { HDA_CODEC_STAC9230D, "Sigmatel STAC9230D" }, 894 { HDA_CODEC_STAC9250, "Sigmatel STAC9250" }, 895 { HDA_CODEC_STAC9251, "Sigmatel STAC9251" }, 896 { HDA_CODEC_STAC9271X, "Sigmatel STAC9271X" }, 897 { HDA_CODEC_STAC9271D, "Sigmatel STAC9271D" }, 898 { HDA_CODEC_STAC9272X, "Sigmatel STAC9272X" }, 899 { HDA_CODEC_STAC9272D, "Sigmatel STAC9272D" }, 900 { HDA_CODEC_STAC9273X, "Sigmatel STAC9273X" }, 901 { HDA_CODEC_STAC9273D, "Sigmatel STAC9273D" }, 902 { HDA_CODEC_STAC9274, "Sigmatel STAC9274" }, 903 { HDA_CODEC_STAC9274D, "Sigmatel STAC9274D" }, 904 { HDA_CODEC_STAC9274X5NH, "Sigmatel STAC9274X5NH" }, 905 { HDA_CODEC_STAC9274D5NH, "Sigmatel STAC9274D5NH" }, 906 { HDA_CODEC_STAC9872AK, "Sigmatel STAC9872AK" }, 907 { HDA_CODEC_IDT92HD005, "IDT 92HD005" }, 908 { HDA_CODEC_IDT92HD005D, "IDT 92HD005D" }, 909 { HDA_CODEC_IDT92HD206X, "IDT 92HD206X" }, 910 { HDA_CODEC_IDT92HD206D, "IDT 92HD206D" }, 911 { HDA_CODEC_IDT92HD700X, "IDT 92HD700X" }, 912 { HDA_CODEC_IDT92HD700D, "IDT 92HD700D" }, 913 { HDA_CODEC_IDT92HD71B5, "IDT 92HD71B5" }, 914 { HDA_CODEC_IDT92HD71B7, "IDT 92HD71B7" }, 915 { HDA_CODEC_IDT92HD71B8, "IDT 92HD71B8" }, 916 { HDA_CODEC_IDT92HD73C1, "IDT 92HD73C1" }, 917 { HDA_CODEC_IDT92HD73D1, "IDT 92HD73D1" }, 918 { HDA_CODEC_IDT92HD73E1, "IDT 92HD73E1" }, 919 { HDA_CODEC_IDT92HD75B3, "IDT 92HD75B3" }, 920 { HDA_CODEC_IDT92HD75BX, "IDT 92HD75BX" }, 921 { HDA_CODEC_IDT92HD81B1C, "IDT 92HD81B1C" }, 922 { HDA_CODEC_IDT92HD81B1X, "IDT 92HD81B1X" }, 923 { HDA_CODEC_IDT92HD83C1C, "IDT 92HD83C1C" }, 924 { HDA_CODEC_IDT92HD83C1X, "IDT 92HD83C1X" }, 925 { HDA_CODEC_CX20549, "Conexant CX20549 (Venice)" }, 926 { HDA_CODEC_CX20551, "Conexant CX20551 (Waikiki)" }, 927 { HDA_CODEC_CX20561, "Conexant CX20561 (Hermosa)" }, 928 { HDA_CODEC_CX20582, "Conexant CX20582 (Pebble)" }, 929 { HDA_CODEC_CX20583, "Conexant CX20583 (Pebble HSF)" }, 930 { HDA_CODEC_CX20585, "Conexant CX20585" }, 931 { HDA_CODEC_VT1708_8, "VIA VT1708_8" }, 932 { HDA_CODEC_VT1708_9, "VIA VT1708_9" }, 933 { HDA_CODEC_VT1708_A, "VIA VT1708_A" }, 934 { HDA_CODEC_VT1708_B, "VIA VT1708_B" }, 935 { HDA_CODEC_VT1709_0, "VIA VT1709_0" }, 936 { HDA_CODEC_VT1709_1, "VIA VT1709_1" }, 937 { HDA_CODEC_VT1709_2, "VIA VT1709_2" }, 938 { HDA_CODEC_VT1709_3, "VIA VT1709_3" }, 939 { HDA_CODEC_VT1709_4, "VIA VT1709_4" }, 940 { HDA_CODEC_VT1709_5, "VIA VT1709_5" }, 941 { HDA_CODEC_VT1709_6, "VIA VT1709_6" }, 942 { HDA_CODEC_VT1709_7, "VIA VT1709_7" }, 943 { HDA_CODEC_VT1708B_0, "VIA VT1708B_0" }, 944 { HDA_CODEC_VT1708B_1, "VIA VT1708B_1" }, 945 { HDA_CODEC_VT1708B_2, "VIA VT1708B_2" }, 946 { HDA_CODEC_VT1708B_3, "VIA VT1708B_3" }, 947 { HDA_CODEC_VT1708B_4, "VIA VT1708B_4" }, 948 { HDA_CODEC_VT1708B_5, "VIA VT1708B_5" }, 949 { HDA_CODEC_VT1708B_6, "VIA VT1708B_6" }, 950 { HDA_CODEC_VT1708B_7, "VIA VT1708B_7" }, 951 { HDA_CODEC_VT1708S_0, "VIA VT1708S_0" }, 952 { HDA_CODEC_VT1708S_1, "VIA VT1708S_1" }, 953 { HDA_CODEC_VT1708S_2, "VIA VT1708S_2" }, 954 { HDA_CODEC_VT1708S_3, "VIA VT1708S_3" }, 955 { HDA_CODEC_VT1708S_4, "VIA VT1708S_4" }, 956 { HDA_CODEC_VT1708S_5, "VIA VT1708S_5" }, 957 { HDA_CODEC_VT1708S_6, "VIA VT1708S_6" }, 958 { HDA_CODEC_VT1708S_7, "VIA VT1708S_7" }, 959 { HDA_CODEC_VT1702_0, "VIA VT1702_0" }, 960 { HDA_CODEC_VT1702_1, "VIA VT1702_1" }, 961 { HDA_CODEC_VT1702_2, "VIA VT1702_2" }, 962 { HDA_CODEC_VT1702_3, "VIA VT1702_3" }, 963 { HDA_CODEC_VT1702_4, "VIA VT1702_4" }, 964 { HDA_CODEC_VT1702_5, "VIA VT1702_5" }, 965 { HDA_CODEC_VT1702_6, "VIA VT1702_6" }, 966 { HDA_CODEC_VT1702_7, "VIA VT1702_7" }, 967 { HDA_CODEC_VT1716S_0, "VIA VT1716S_0" }, 968 { HDA_CODEC_VT1716S_1, "VIA VT1716S_1" }, 969 { HDA_CODEC_VT1718S_0, "VIA VT1718S_0" }, 970 { HDA_CODEC_VT1718S_1, "VIA VT1718S_1" }, 971 { HDA_CODEC_VT1812, "VIA VT1812" }, 972 { HDA_CODEC_VT1818S, "VIA VT1818S" }, 973 { HDA_CODEC_VT1828S, "VIA VT1828S" }, 974 { HDA_CODEC_VT2002P_0, "VIA VT2002P_0" }, 975 { HDA_CODEC_VT2002P_1, "VIA VT2002P_1" }, 976 { HDA_CODEC_VT2020, "VIA VT2020" }, 977 { HDA_CODEC_ATIRS600_1,"ATI RS600 HDMI" }, 978 { HDA_CODEC_ATIRS600_2,"ATI RS600 HDMI" }, 979 { HDA_CODEC_ATIRS690, "ATI RS690/780 HDMI" }, 980 { HDA_CODEC_ATIR6XX, "ATI R6xx HDMI" }, 981 { HDA_CODEC_NVIDIAMCP67, "NVidia MCP67 HDMI" }, 982 { HDA_CODEC_NVIDIAMCP73, "NVidia MCP73 HDMI" }, 983 { HDA_CODEC_NVIDIAMCP78, "NVidia MCP78 HDMI" }, 984 { HDA_CODEC_NVIDIAMCP78_2, "NVidia MCP78 HDMI" }, 985 { HDA_CODEC_NVIDIAMCP7A, "NVidia MCP7A HDMI" }, 986 { HDA_CODEC_NVIDIAGT220, "NVidia GT220 HDMI" }, 987 { HDA_CODEC_NVIDIAGT21X, "NVidia GT21x HDMI" }, 988 { HDA_CODEC_NVIDIAMCP89, "NVidia MCP89 HDMI" }, 989 { HDA_CODEC_NVIDIAGT240, "NVidia GT240 HDMI" }, 990 { HDA_CODEC_INTELG45_1, "Intel G45 HDMI" }, 991 { HDA_CODEC_INTELG45_2, "Intel G45 HDMI" }, 992 { HDA_CODEC_INTELG45_3, "Intel G45 HDMI" }, 993 { HDA_CODEC_INTELG45_4, "Intel G45 HDMI" }, 994 { HDA_CODEC_INTELG45_5, "Intel G45 HDMI" }, 995 { HDA_CODEC_INTELQ57, "Intel Q57 HDMI" }, 996 { HDA_CODEC_SII1390, "Silicon Image SiI1390 HDMI" }, 997 { HDA_CODEC_SII1392, "Silicon Image SiI1392 HDMI" }, 998 /* Unknown codec */ 999 { HDA_CODEC_ALCXXXX, "Realtek (Unknown)" }, 1000 { HDA_CODEC_ADXXXX, "Analog Devices (Unknown)" }, 1001 { HDA_CODEC_CSXXXX, "Cirrus Logic (Unknown)" }, 1002 { HDA_CODEC_CMIXXXX, "CMedia (Unknown)" }, 1003 { HDA_CODEC_STACXXXX, "Sigmatel (Unknown)" }, 1004 { HDA_CODEC_SIIXXXX, "Silicon Image (Unknown)" }, 1005 { HDA_CODEC_AGEREXXXX, "Lucent/Agere Systems (Unknown)" }, 1006 { HDA_CODEC_CXXXXX, "Conexant (Unknown)" }, 1007 { HDA_CODEC_VTXXXX, "VIA (Unknown)" }, 1008 { HDA_CODEC_ATIXXXX, "ATI (Unknown)" }, 1009 { HDA_CODEC_NVIDIAXXXX,"NVidia (Unknown)" }, 1010 { HDA_CODEC_INTELXXXX, "Intel (Unknown)" }, 1011 { HDA_CODEC_IDTXXXX, "IDT (Unknown)" }, 1012 }; 1013 #define HDAC_CODECS_LEN (sizeof(hdac_codecs) / sizeof(hdac_codecs[0])) 1014 1015 1016 /**************************************************************************** 1017 * Function prototypes 1018 ****************************************************************************/ 1019 static void hdac_intr_handler(void *); 1020 static int hdac_reset(struct hdac_softc *, int); 1021 static int hdac_get_capabilities(struct hdac_softc *); 1022 static void hdac_dma_cb(void *, bus_dma_segment_t *, int, int); 1023 static int hdac_dma_alloc(struct hdac_softc *, 1024 struct hdac_dma *, bus_size_t); 1025 static void hdac_dma_free(struct hdac_softc *, struct hdac_dma *); 1026 static int hdac_mem_alloc(struct hdac_softc *); 1027 static void hdac_mem_free(struct hdac_softc *); 1028 static int hdac_irq_alloc(struct hdac_softc *); 1029 static void hdac_irq_free(struct hdac_softc *); 1030 static void hdac_corb_init(struct hdac_softc *); 1031 static void hdac_rirb_init(struct hdac_softc *); 1032 static void hdac_corb_start(struct hdac_softc *); 1033 static void hdac_rirb_start(struct hdac_softc *); 1034 static void hdac_scan_codecs(struct hdac_softc *); 1035 static void hdac_probe_codec(struct hdac_codec *); 1036 static void hdac_probe_function(struct hdac_codec *, nid_t); 1037 static int hdac_pcmchannel_setup(struct hdac_chan *); 1038 1039 static void hdac_attach2(void *); 1040 1041 static uint32_t hdac_command_sendone_internal(struct hdac_softc *, 1042 uint32_t, int); 1043 static void hdac_command_send_internal(struct hdac_softc *, 1044 struct hdac_command_list *, int); 1045 1046 static int hdac_probe(device_t); 1047 static int hdac_attach(device_t); 1048 static int hdac_detach(device_t); 1049 static int hdac_suspend(device_t); 1050 static int hdac_resume(device_t); 1051 static void hdac_widget_connection_select(struct hdac_widget *, uint8_t); 1052 static void hdac_audio_ctl_amp_set(struct hdac_audio_ctl *, 1053 uint32_t, int, int); 1054 static struct hdac_audio_ctl *hdac_audio_ctl_amp_get(struct hdac_devinfo *, 1055 nid_t, int, int, int); 1056 static void hdac_audio_ctl_amp_set_internal(struct hdac_softc *, 1057 nid_t, nid_t, int, int, int, int, int, int); 1058 static struct hdac_widget *hdac_widget_get(struct hdac_devinfo *, nid_t); 1059 1060 static int hdac_rirb_flush(struct hdac_softc *sc); 1061 static int hdac_unsolq_flush(struct hdac_softc *sc); 1062 1063 static void hdac_dump_pin_config(struct hdac_widget *w, uint32_t conf); 1064 1065 #define hdac_command(a1, a2, a3) \ 1066 hdac_command_sendone_internal(a1, a2, a3) 1067 1068 #define hdac_codec_id(c) \ 1069 ((uint32_t)((c == NULL) ? 0x00000000 : \ 1070 ((((uint32_t)(c)->vendor_id & 0x0000ffff) << 16) | \ 1071 ((uint32_t)(c)->device_id & 0x0000ffff)))) 1072 1073 static char * 1074 hdac_codec_name(struct hdac_codec *codec) 1075 { 1076 uint32_t id; 1077 int i; 1078 1079 id = hdac_codec_id(codec); 1080 1081 for (i = 0; i < HDAC_CODECS_LEN; i++) { 1082 if (HDA_DEV_MATCH(hdac_codecs[i].id, id)) 1083 return (hdac_codecs[i].name); 1084 } 1085 1086 return ((id == 0x00000000) ? "NULL Codec" : "Unknown Codec"); 1087 } 1088 1089 static char * 1090 hdac_audio_ctl_ossmixer_mask2allname(uint32_t mask, char *buf, size_t len) 1091 { 1092 static char *ossname[] = SOUND_DEVICE_NAMES; 1093 int i, first = 1; 1094 1095 bzero(buf, len); 1096 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { 1097 if (mask & (1 << i)) { 1098 if (first == 0) 1099 strlcat(buf, ", ", len); 1100 strlcat(buf, ossname[i], len); 1101 first = 0; 1102 } 1103 } 1104 return (buf); 1105 } 1106 1107 static struct hdac_audio_ctl * 1108 hdac_audio_ctl_each(struct hdac_devinfo *devinfo, int *index) 1109 { 1110 if (devinfo == NULL || 1111 devinfo->node_type != HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO || 1112 index == NULL || devinfo->function.audio.ctl == NULL || 1113 devinfo->function.audio.ctlcnt < 1 || 1114 *index < 0 || *index >= devinfo->function.audio.ctlcnt) 1115 return (NULL); 1116 return (&devinfo->function.audio.ctl[(*index)++]); 1117 } 1118 1119 static struct hdac_audio_ctl * 1120 hdac_audio_ctl_amp_get(struct hdac_devinfo *devinfo, nid_t nid, int dir, 1121 int index, int cnt) 1122 { 1123 struct hdac_audio_ctl *ctl; 1124 int i, found = 0; 1125 1126 if (devinfo == NULL || devinfo->function.audio.ctl == NULL) 1127 return (NULL); 1128 1129 i = 0; 1130 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 1131 if (ctl->enable == 0) 1132 continue; 1133 if (ctl->widget->nid != nid) 1134 continue; 1135 if (dir && ctl->ndir != dir) 1136 continue; 1137 if (index >= 0 && ctl->ndir == HDA_CTL_IN && 1138 ctl->dir == ctl->ndir && ctl->index != index) 1139 continue; 1140 found++; 1141 if (found == cnt || cnt <= 0) 1142 return (ctl); 1143 } 1144 1145 return (NULL); 1146 } 1147 1148 /* 1149 * Jack detection (Speaker/HP redirection) event handler. 1150 */ 1151 static void 1152 hdac_hp_switch_handler(struct hdac_devinfo *devinfo) 1153 { 1154 struct hdac_audio_as *as; 1155 struct hdac_softc *sc; 1156 struct hdac_widget *w; 1157 struct hdac_audio_ctl *ctl; 1158 uint32_t val, res; 1159 int i, j; 1160 nid_t cad; 1161 1162 if (devinfo == NULL || devinfo->codec == NULL || 1163 devinfo->codec->sc == NULL) 1164 return; 1165 1166 sc = devinfo->codec->sc; 1167 cad = devinfo->codec->cad; 1168 as = devinfo->function.audio.as; 1169 for (i = 0; i < devinfo->function.audio.ascnt; i++) { 1170 if (as[i].hpredir < 0) 1171 continue; 1172 1173 w = hdac_widget_get(devinfo, as[i].pins[15]); 1174 if (w == NULL || w->enable == 0 || w->type != 1175 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 1176 continue; 1177 1178 res = hdac_command(sc, 1179 HDA_CMD_GET_PIN_SENSE(cad, as[i].pins[15]), cad); 1180 1181 HDA_BOOTVERBOSE( 1182 device_printf(sc->dev, 1183 "Pin sense: nid=%d res=0x%08x\n", 1184 as[i].pins[15], res); 1185 ); 1186 1187 res = HDA_CMD_GET_PIN_SENSE_PRESENCE_DETECT(res); 1188 if (devinfo->function.audio.quirks & HDA_QUIRK_SENSEINV) 1189 res ^= 1; 1190 1191 /* (Un)Mute headphone pin. */ 1192 ctl = hdac_audio_ctl_amp_get(devinfo, 1193 as[i].pins[15], HDA_CTL_IN, -1, 1); 1194 if (ctl != NULL && ctl->mute) { 1195 /* If pin has muter - use it. */ 1196 val = (res != 0) ? 0 : 1; 1197 if (val != ctl->forcemute) { 1198 ctl->forcemute = val; 1199 hdac_audio_ctl_amp_set(ctl, 1200 HDA_AMP_MUTE_DEFAULT, 1201 HDA_AMP_VOL_DEFAULT, HDA_AMP_VOL_DEFAULT); 1202 } 1203 } else { 1204 /* If there is no muter - disable pin output. */ 1205 w = hdac_widget_get(devinfo, as[i].pins[15]); 1206 if (w != NULL && w->type == 1207 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) { 1208 if (res != 0) 1209 val = w->wclass.pin.ctrl | 1210 HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE; 1211 else 1212 val = w->wclass.pin.ctrl & 1213 ~HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE; 1214 if (val != w->wclass.pin.ctrl) { 1215 w->wclass.pin.ctrl = val; 1216 hdac_command(sc, 1217 HDA_CMD_SET_PIN_WIDGET_CTRL(cad, 1218 w->nid, w->wclass.pin.ctrl), cad); 1219 } 1220 } 1221 } 1222 /* (Un)Mute other pins. */ 1223 for (j = 0; j < 15; j++) { 1224 if (as[i].pins[j] <= 0) 1225 continue; 1226 ctl = hdac_audio_ctl_amp_get(devinfo, 1227 as[i].pins[j], HDA_CTL_IN, -1, 1); 1228 if (ctl != NULL && ctl->mute) { 1229 /* If pin has muter - use it. */ 1230 val = (res != 0) ? 1 : 0; 1231 if (val == ctl->forcemute) 1232 continue; 1233 ctl->forcemute = val; 1234 hdac_audio_ctl_amp_set(ctl, 1235 HDA_AMP_MUTE_DEFAULT, 1236 HDA_AMP_VOL_DEFAULT, HDA_AMP_VOL_DEFAULT); 1237 continue; 1238 } 1239 /* If there is no muter - disable pin output. */ 1240 w = hdac_widget_get(devinfo, as[i].pins[j]); 1241 if (w != NULL && w->type == 1242 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) { 1243 if (res != 0) 1244 val = w->wclass.pin.ctrl & 1245 ~HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE; 1246 else 1247 val = w->wclass.pin.ctrl | 1248 HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE; 1249 if (val != w->wclass.pin.ctrl) { 1250 w->wclass.pin.ctrl = val; 1251 hdac_command(sc, 1252 HDA_CMD_SET_PIN_WIDGET_CTRL(cad, 1253 w->nid, w->wclass.pin.ctrl), cad); 1254 } 1255 } 1256 } 1257 } 1258 } 1259 1260 /* 1261 * Callback for poll based jack detection. 1262 */ 1263 static void 1264 hdac_jack_poll_callback(void *arg) 1265 { 1266 struct hdac_devinfo *devinfo = arg; 1267 struct hdac_softc *sc; 1268 1269 if (devinfo == NULL || devinfo->codec == NULL || 1270 devinfo->codec->sc == NULL) 1271 return; 1272 sc = devinfo->codec->sc; 1273 hdac_lock(sc); 1274 if (sc->poll_ival == 0) { 1275 hdac_unlock(sc); 1276 return; 1277 } 1278 hdac_hp_switch_handler(devinfo); 1279 callout_reset(&sc->poll_jack, sc->poll_ival, 1280 hdac_jack_poll_callback, devinfo); 1281 hdac_unlock(sc); 1282 } 1283 1284 /* 1285 * Jack detection initializer. 1286 */ 1287 static void 1288 hdac_hp_switch_init(struct hdac_devinfo *devinfo) 1289 { 1290 struct hdac_softc *sc = devinfo->codec->sc; 1291 struct hdac_audio_as *as = devinfo->function.audio.as; 1292 struct hdac_widget *w; 1293 uint32_t id; 1294 int i, enable = 0, poll = 0; 1295 nid_t cad; 1296 1297 id = hdac_codec_id(devinfo->codec); 1298 cad = devinfo->codec->cad; 1299 for (i = 0; i < devinfo->function.audio.ascnt; i++) { 1300 if (as[i].hpredir < 0) 1301 continue; 1302 1303 w = hdac_widget_get(devinfo, as[i].pins[15]); 1304 if (w == NULL || w->enable == 0 || w->type != 1305 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 1306 continue; 1307 if (HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP(w->wclass.pin.cap) == 0 || 1308 (HDA_CONFIG_DEFAULTCONF_MISC(w->wclass.pin.config) & 1) != 0) { 1309 device_printf(sc->dev, 1310 "No jack detection support at pin %d\n", 1311 as[i].pins[15]); 1312 continue; 1313 } 1314 enable = 1; 1315 if (HDA_PARAM_AUDIO_WIDGET_CAP_UNSOL_CAP(w->param.widget_cap)) { 1316 hdac_command(sc, 1317 HDA_CMD_SET_UNSOLICITED_RESPONSE(cad, w->nid, 1318 HDA_CMD_SET_UNSOLICITED_RESPONSE_ENABLE | 1319 HDAC_UNSOLTAG_EVENT_HP), cad); 1320 } else 1321 poll = 1; 1322 HDA_BOOTVERBOSE( 1323 device_printf(sc->dev, 1324 "Enabling headphone/speaker " 1325 "audio routing switching:\n"); 1326 device_printf(sc->dev, "\tas=%d sense nid=%d [%s]\n", 1327 i, w->nid, (poll != 0) ? "POLL" : "UNSOL"); 1328 ); 1329 } 1330 if (enable) { 1331 hdac_hp_switch_handler(devinfo); 1332 if (poll) { 1333 callout_reset(&sc->poll_jack, 1, 1334 hdac_jack_poll_callback, devinfo); 1335 } 1336 } 1337 } 1338 1339 /* 1340 * Unsolicited messages handler. 1341 */ 1342 static void 1343 hdac_unsolicited_handler(struct hdac_codec *codec, uint32_t tag) 1344 { 1345 struct hdac_softc *sc; 1346 struct hdac_devinfo *devinfo = NULL; 1347 int i; 1348 1349 if (codec == NULL || codec->sc == NULL) 1350 return; 1351 1352 sc = codec->sc; 1353 1354 HDA_BOOTVERBOSE( 1355 device_printf(sc->dev, "Unsol Tag: 0x%08x\n", tag); 1356 ); 1357 1358 for (i = 0; i < codec->num_fgs; i++) { 1359 if (codec->fgs[i].node_type == 1360 HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) { 1361 devinfo = &codec->fgs[i]; 1362 break; 1363 } 1364 } 1365 1366 if (devinfo == NULL) 1367 return; 1368 1369 switch (tag) { 1370 case HDAC_UNSOLTAG_EVENT_HP: 1371 hdac_hp_switch_handler(devinfo); 1372 break; 1373 default: 1374 device_printf(sc->dev, "Unknown unsol tag: 0x%08x!\n", tag); 1375 break; 1376 } 1377 } 1378 1379 static int 1380 hdac_stream_intr(struct hdac_softc *sc, struct hdac_chan *ch) 1381 { 1382 /* XXX to be removed */ 1383 #ifdef HDAC_INTR_EXTRA 1384 uint32_t res; 1385 #endif 1386 1387 if (!(ch->flags & HDAC_CHN_RUNNING)) 1388 return (0); 1389 1390 /* XXX to be removed */ 1391 #ifdef HDAC_INTR_EXTRA 1392 res = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDSTS); 1393 #endif 1394 1395 /* XXX to be removed */ 1396 #ifdef HDAC_INTR_EXTRA 1397 HDA_BOOTVERBOSE( 1398 if (res & (HDAC_SDSTS_DESE | HDAC_SDSTS_FIFOE)) 1399 device_printf(ch->pdevinfo->dev, 1400 "PCMDIR_%s intr triggered beyond stream boundary:" 1401 "%08x\n", 1402 (ch->dir == PCMDIR_PLAY) ? "PLAY" : "REC", res); 1403 ); 1404 #endif 1405 1406 HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDSTS, 1407 HDAC_SDSTS_DESE | HDAC_SDSTS_FIFOE | HDAC_SDSTS_BCIS ); 1408 1409 /* XXX to be removed */ 1410 #ifdef HDAC_INTR_EXTRA 1411 if (res & HDAC_SDSTS_BCIS) { 1412 #endif 1413 return (1); 1414 /* XXX to be removed */ 1415 #ifdef HDAC_INTR_EXTRA 1416 } 1417 #endif 1418 1419 return (0); 1420 } 1421 1422 /**************************************************************************** 1423 * void hdac_intr_handler(void *) 1424 * 1425 * Interrupt handler. Processes interrupts received from the hdac. 1426 ****************************************************************************/ 1427 static void 1428 hdac_intr_handler(void *context) 1429 { 1430 struct hdac_softc *sc; 1431 uint32_t intsts; 1432 uint8_t rirbsts; 1433 struct hdac_rirb *rirb_base; 1434 uint32_t trigger; 1435 int i; 1436 1437 sc = (struct hdac_softc *)context; 1438 1439 hdac_lock(sc); 1440 if (sc->polling != 0) { 1441 hdac_unlock(sc); 1442 return; 1443 } 1444 1445 /* Do we have anything to do? */ 1446 intsts = HDAC_READ_4(&sc->mem, HDAC_INTSTS); 1447 if (!HDA_FLAG_MATCH(intsts, HDAC_INTSTS_GIS)) { 1448 hdac_unlock(sc); 1449 return; 1450 } 1451 1452 trigger = 0; 1453 1454 /* Was this a controller interrupt? */ 1455 if (HDA_FLAG_MATCH(intsts, HDAC_INTSTS_CIS)) { 1456 rirb_base = (struct hdac_rirb *)sc->rirb_dma.dma_vaddr; 1457 rirbsts = HDAC_READ_1(&sc->mem, HDAC_RIRBSTS); 1458 /* Get as many responses that we can */ 1459 while (HDA_FLAG_MATCH(rirbsts, HDAC_RIRBSTS_RINTFL)) { 1460 HDAC_WRITE_1(&sc->mem, 1461 HDAC_RIRBSTS, HDAC_RIRBSTS_RINTFL); 1462 if (hdac_rirb_flush(sc) != 0) 1463 trigger |= HDAC_TRIGGER_UNSOL; 1464 rirbsts = HDAC_READ_1(&sc->mem, HDAC_RIRBSTS); 1465 } 1466 /* XXX to be removed */ 1467 /* Clear interrupt and exit */ 1468 #ifdef HDAC_INTR_EXTRA 1469 HDAC_WRITE_4(&sc->mem, HDAC_INTSTS, HDAC_INTSTS_CIS); 1470 #endif 1471 } 1472 1473 if (intsts & HDAC_INTSTS_SIS_MASK) { 1474 for (i = 0; i < sc->num_chans; i++) { 1475 if ((intsts & (1 << (sc->chans[i].off >> 5))) && 1476 hdac_stream_intr(sc, &sc->chans[i]) != 0) 1477 trigger |= (1 << i); 1478 } 1479 /* XXX to be removed */ 1480 #ifdef HDAC_INTR_EXTRA 1481 HDAC_WRITE_4(&sc->mem, HDAC_INTSTS, intsts & 1482 HDAC_INTSTS_SIS_MASK); 1483 #endif 1484 } 1485 1486 hdac_unlock(sc); 1487 1488 for (i = 0; i < sc->num_chans; i++) { 1489 if (trigger & (1 << i)) 1490 chn_intr(sc->chans[i].c); 1491 } 1492 if (trigger & HDAC_TRIGGER_UNSOL) 1493 taskqueue_enqueue(taskqueue_thread, &sc->unsolq_task); 1494 } 1495 1496 /**************************************************************************** 1497 * int hdac_reset(hdac_softc *, int) 1498 * 1499 * Reset the hdac to a quiescent and known state. 1500 ****************************************************************************/ 1501 static int 1502 hdac_reset(struct hdac_softc *sc, int wakeup) 1503 { 1504 uint32_t gctl; 1505 int count, i; 1506 1507 /* 1508 * Stop all Streams DMA engine 1509 */ 1510 for (i = 0; i < sc->num_iss; i++) 1511 HDAC_WRITE_4(&sc->mem, HDAC_ISDCTL(sc, i), 0x0); 1512 for (i = 0; i < sc->num_oss; i++) 1513 HDAC_WRITE_4(&sc->mem, HDAC_OSDCTL(sc, i), 0x0); 1514 for (i = 0; i < sc->num_bss; i++) 1515 HDAC_WRITE_4(&sc->mem, HDAC_BSDCTL(sc, i), 0x0); 1516 1517 /* 1518 * Stop Control DMA engines. 1519 */ 1520 HDAC_WRITE_1(&sc->mem, HDAC_CORBCTL, 0x0); 1521 HDAC_WRITE_1(&sc->mem, HDAC_RIRBCTL, 0x0); 1522 1523 /* 1524 * Reset DMA position buffer. 1525 */ 1526 HDAC_WRITE_4(&sc->mem, HDAC_DPIBLBASE, 0x0); 1527 HDAC_WRITE_4(&sc->mem, HDAC_DPIBUBASE, 0x0); 1528 1529 /* 1530 * Reset the controller. The reset must remain asserted for 1531 * a minimum of 100us. 1532 */ 1533 gctl = HDAC_READ_4(&sc->mem, HDAC_GCTL); 1534 HDAC_WRITE_4(&sc->mem, HDAC_GCTL, gctl & ~HDAC_GCTL_CRST); 1535 count = 10000; 1536 do { 1537 gctl = HDAC_READ_4(&sc->mem, HDAC_GCTL); 1538 if (!(gctl & HDAC_GCTL_CRST)) 1539 break; 1540 DELAY(10); 1541 } while (--count); 1542 if (gctl & HDAC_GCTL_CRST) { 1543 device_printf(sc->dev, "Unable to put hdac in reset\n"); 1544 return (ENXIO); 1545 } 1546 1547 /* If wakeup is not requested - leave the controller in reset state. */ 1548 if (!wakeup) 1549 return (0); 1550 1551 DELAY(100); 1552 gctl = HDAC_READ_4(&sc->mem, HDAC_GCTL); 1553 HDAC_WRITE_4(&sc->mem, HDAC_GCTL, gctl | HDAC_GCTL_CRST); 1554 count = 10000; 1555 do { 1556 gctl = HDAC_READ_4(&sc->mem, HDAC_GCTL); 1557 if (gctl & HDAC_GCTL_CRST) 1558 break; 1559 DELAY(10); 1560 } while (--count); 1561 if (!(gctl & HDAC_GCTL_CRST)) { 1562 device_printf(sc->dev, "Device stuck in reset\n"); 1563 return (ENXIO); 1564 } 1565 1566 /* 1567 * Wait for codecs to finish their own reset sequence. The delay here 1568 * should be of 250us but for some reasons, on it's not enough on my 1569 * computer. Let's use twice as much as necessary to make sure that 1570 * it's reset properly. 1571 */ 1572 DELAY(1000); 1573 1574 return (0); 1575 } 1576 1577 1578 /**************************************************************************** 1579 * int hdac_get_capabilities(struct hdac_softc *); 1580 * 1581 * Retreive the general capabilities of the hdac; 1582 * Number of Input Streams 1583 * Number of Output Streams 1584 * Number of bidirectional Streams 1585 * 64bit ready 1586 * CORB and RIRB sizes 1587 ****************************************************************************/ 1588 static int 1589 hdac_get_capabilities(struct hdac_softc *sc) 1590 { 1591 uint16_t gcap; 1592 uint8_t corbsize, rirbsize; 1593 1594 gcap = HDAC_READ_2(&sc->mem, HDAC_GCAP); 1595 sc->num_iss = HDAC_GCAP_ISS(gcap); 1596 sc->num_oss = HDAC_GCAP_OSS(gcap); 1597 sc->num_bss = HDAC_GCAP_BSS(gcap); 1598 sc->num_sdo = HDAC_GCAP_NSDO(gcap); 1599 sc->support_64bit = HDA_FLAG_MATCH(gcap, HDAC_GCAP_64OK); 1600 1601 corbsize = HDAC_READ_1(&sc->mem, HDAC_CORBSIZE); 1602 if ((corbsize & HDAC_CORBSIZE_CORBSZCAP_256) == 1603 HDAC_CORBSIZE_CORBSZCAP_256) 1604 sc->corb_size = 256; 1605 else if ((corbsize & HDAC_CORBSIZE_CORBSZCAP_16) == 1606 HDAC_CORBSIZE_CORBSZCAP_16) 1607 sc->corb_size = 16; 1608 else if ((corbsize & HDAC_CORBSIZE_CORBSZCAP_2) == 1609 HDAC_CORBSIZE_CORBSZCAP_2) 1610 sc->corb_size = 2; 1611 else { 1612 device_printf(sc->dev, "%s: Invalid corb size (%x)\n", 1613 __func__, corbsize); 1614 return (ENXIO); 1615 } 1616 1617 rirbsize = HDAC_READ_1(&sc->mem, HDAC_RIRBSIZE); 1618 if ((rirbsize & HDAC_RIRBSIZE_RIRBSZCAP_256) == 1619 HDAC_RIRBSIZE_RIRBSZCAP_256) 1620 sc->rirb_size = 256; 1621 else if ((rirbsize & HDAC_RIRBSIZE_RIRBSZCAP_16) == 1622 HDAC_RIRBSIZE_RIRBSZCAP_16) 1623 sc->rirb_size = 16; 1624 else if ((rirbsize & HDAC_RIRBSIZE_RIRBSZCAP_2) == 1625 HDAC_RIRBSIZE_RIRBSZCAP_2) 1626 sc->rirb_size = 2; 1627 else { 1628 device_printf(sc->dev, "%s: Invalid rirb size (%x)\n", 1629 __func__, rirbsize); 1630 return (ENXIO); 1631 } 1632 1633 HDA_BOOTVERBOSE( 1634 device_printf(sc->dev, "Caps: OSS %d, ISS %d, BSS %d, " 1635 "NSDO %d%s, CORB %d, RIRB %d\n", 1636 sc->num_oss, sc->num_iss, sc->num_bss, 1 << sc->num_sdo, 1637 sc->support_64bit ? ", 64bit" : "", 1638 sc->corb_size, sc->rirb_size); 1639 ); 1640 1641 return (0); 1642 } 1643 1644 1645 /**************************************************************************** 1646 * void hdac_dma_cb 1647 * 1648 * This function is called by bus_dmamap_load when the mapping has been 1649 * established. We just record the physical address of the mapping into 1650 * the struct hdac_dma passed in. 1651 ****************************************************************************/ 1652 static void 1653 hdac_dma_cb(void *callback_arg, bus_dma_segment_t *segs, int nseg, int error) 1654 { 1655 struct hdac_dma *dma; 1656 1657 if (error == 0) { 1658 dma = (struct hdac_dma *)callback_arg; 1659 dma->dma_paddr = segs[0].ds_addr; 1660 } 1661 } 1662 1663 1664 /**************************************************************************** 1665 * int hdac_dma_alloc 1666 * 1667 * This function allocate and setup a dma region (struct hdac_dma). 1668 * It must be freed by a corresponding hdac_dma_free. 1669 ****************************************************************************/ 1670 static int 1671 hdac_dma_alloc(struct hdac_softc *sc, struct hdac_dma *dma, bus_size_t size) 1672 { 1673 bus_size_t roundsz; 1674 int result; 1675 1676 roundsz = roundup2(size, HDAC_DMA_ALIGNMENT); 1677 bzero(dma, sizeof(*dma)); 1678 1679 /* 1680 * Create a DMA tag 1681 */ 1682 result = bus_dma_tag_create( 1683 bus_get_dma_tag(sc->dev), /* parent */ 1684 HDAC_DMA_ALIGNMENT, /* alignment */ 1685 0, /* boundary */ 1686 (sc->support_64bit) ? BUS_SPACE_MAXADDR : 1687 BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ 1688 BUS_SPACE_MAXADDR, /* highaddr */ 1689 NULL, /* filtfunc */ 1690 NULL, /* fistfuncarg */ 1691 roundsz, /* maxsize */ 1692 1, /* nsegments */ 1693 roundsz, /* maxsegsz */ 1694 0, /* flags */ 1695 NULL, /* lockfunc */ 1696 NULL, /* lockfuncarg */ 1697 &dma->dma_tag); /* dmat */ 1698 if (result != 0) { 1699 device_printf(sc->dev, "%s: bus_dma_tag_create failed (%x)\n", 1700 __func__, result); 1701 goto hdac_dma_alloc_fail; 1702 } 1703 1704 /* 1705 * Allocate DMA memory 1706 */ 1707 result = bus_dmamem_alloc(dma->dma_tag, (void **)&dma->dma_vaddr, 1708 BUS_DMA_NOWAIT | BUS_DMA_ZERO | 1709 ((sc->flags & HDAC_F_DMA_NOCACHE) ? BUS_DMA_NOCACHE : 0), 1710 &dma->dma_map); 1711 if (result != 0) { 1712 device_printf(sc->dev, "%s: bus_dmamem_alloc failed (%x)\n", 1713 __func__, result); 1714 goto hdac_dma_alloc_fail; 1715 } 1716 1717 dma->dma_size = roundsz; 1718 1719 /* 1720 * Map the memory 1721 */ 1722 result = bus_dmamap_load(dma->dma_tag, dma->dma_map, 1723 (void *)dma->dma_vaddr, roundsz, hdac_dma_cb, (void *)dma, 0); 1724 if (result != 0 || dma->dma_paddr == 0) { 1725 if (result == 0) 1726 result = ENOMEM; 1727 device_printf(sc->dev, "%s: bus_dmamem_load failed (%x)\n", 1728 __func__, result); 1729 goto hdac_dma_alloc_fail; 1730 } 1731 1732 HDA_BOOTHVERBOSE( 1733 device_printf(sc->dev, "%s: size=%ju -> roundsz=%ju\n", 1734 __func__, (uintmax_t)size, (uintmax_t)roundsz); 1735 ); 1736 1737 return (0); 1738 1739 hdac_dma_alloc_fail: 1740 hdac_dma_free(sc, dma); 1741 1742 return (result); 1743 } 1744 1745 1746 /**************************************************************************** 1747 * void hdac_dma_free(struct hdac_softc *, struct hdac_dma *) 1748 * 1749 * Free a struct dhac_dma that has been previously allocated via the 1750 * hdac_dma_alloc function. 1751 ****************************************************************************/ 1752 static void 1753 hdac_dma_free(struct hdac_softc *sc, struct hdac_dma *dma) 1754 { 1755 if (dma->dma_map != NULL) { 1756 #if 0 1757 /* Flush caches */ 1758 bus_dmamap_sync(dma->dma_tag, dma->dma_map, 1759 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 1760 #endif 1761 bus_dmamap_unload(dma->dma_tag, dma->dma_map); 1762 } 1763 if (dma->dma_vaddr != NULL) { 1764 bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map); 1765 dma->dma_vaddr = NULL; 1766 } 1767 dma->dma_map = NULL; 1768 if (dma->dma_tag != NULL) { 1769 bus_dma_tag_destroy(dma->dma_tag); 1770 dma->dma_tag = NULL; 1771 } 1772 dma->dma_size = 0; 1773 } 1774 1775 /**************************************************************************** 1776 * int hdac_mem_alloc(struct hdac_softc *) 1777 * 1778 * Allocate all the bus resources necessary to speak with the physical 1779 * controller. 1780 ****************************************************************************/ 1781 static int 1782 hdac_mem_alloc(struct hdac_softc *sc) 1783 { 1784 struct hdac_mem *mem; 1785 1786 mem = &sc->mem; 1787 mem->mem_rid = PCIR_BAR(0); 1788 mem->mem_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY, 1789 &mem->mem_rid, RF_ACTIVE); 1790 if (mem->mem_res == NULL) { 1791 device_printf(sc->dev, 1792 "%s: Unable to allocate memory resource\n", __func__); 1793 return (ENOMEM); 1794 } 1795 mem->mem_tag = rman_get_bustag(mem->mem_res); 1796 mem->mem_handle = rman_get_bushandle(mem->mem_res); 1797 1798 return (0); 1799 } 1800 1801 /**************************************************************************** 1802 * void hdac_mem_free(struct hdac_softc *) 1803 * 1804 * Free up resources previously allocated by hdac_mem_alloc. 1805 ****************************************************************************/ 1806 static void 1807 hdac_mem_free(struct hdac_softc *sc) 1808 { 1809 struct hdac_mem *mem; 1810 1811 mem = &sc->mem; 1812 if (mem->mem_res != NULL) 1813 bus_release_resource(sc->dev, SYS_RES_MEMORY, mem->mem_rid, 1814 mem->mem_res); 1815 mem->mem_res = NULL; 1816 } 1817 1818 /**************************************************************************** 1819 * int hdac_irq_alloc(struct hdac_softc *) 1820 * 1821 * Allocate and setup the resources necessary for interrupt handling. 1822 ****************************************************************************/ 1823 static int 1824 hdac_irq_alloc(struct hdac_softc *sc) 1825 { 1826 struct hdac_irq *irq; 1827 int result; 1828 1829 irq = &sc->irq; 1830 irq->irq_rid = 0x0; 1831 1832 if ((sc->flags & HDAC_F_MSI) && 1833 (result = pci_msi_count(sc->dev)) == 1 && 1834 pci_alloc_msi(sc->dev, &result) == 0) 1835 irq->irq_rid = 0x1; 1836 else 1837 sc->flags &= ~HDAC_F_MSI; 1838 1839 irq->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, 1840 &irq->irq_rid, RF_SHAREABLE | RF_ACTIVE); 1841 if (irq->irq_res == NULL) { 1842 device_printf(sc->dev, "%s: Unable to allocate irq\n", 1843 __func__); 1844 goto hdac_irq_alloc_fail; 1845 } 1846 result = bus_setup_intr(sc->dev, irq->irq_res, INTR_MPSAFE | INTR_TYPE_AV, 1847 NULL, hdac_intr_handler, sc, &irq->irq_handle); 1848 if (result != 0) { 1849 device_printf(sc->dev, 1850 "%s: Unable to setup interrupt handler (%x)\n", 1851 __func__, result); 1852 goto hdac_irq_alloc_fail; 1853 } 1854 1855 return (0); 1856 1857 hdac_irq_alloc_fail: 1858 hdac_irq_free(sc); 1859 1860 return (ENXIO); 1861 } 1862 1863 /**************************************************************************** 1864 * void hdac_irq_free(struct hdac_softc *) 1865 * 1866 * Free up resources previously allocated by hdac_irq_alloc. 1867 ****************************************************************************/ 1868 static void 1869 hdac_irq_free(struct hdac_softc *sc) 1870 { 1871 struct hdac_irq *irq; 1872 1873 irq = &sc->irq; 1874 if (irq->irq_res != NULL && irq->irq_handle != NULL) 1875 bus_teardown_intr(sc->dev, irq->irq_res, irq->irq_handle); 1876 if (irq->irq_res != NULL) 1877 bus_release_resource(sc->dev, SYS_RES_IRQ, irq->irq_rid, 1878 irq->irq_res); 1879 if (irq->irq_rid == 0x1) 1880 pci_release_msi(sc->dev); 1881 irq->irq_handle = NULL; 1882 irq->irq_res = NULL; 1883 irq->irq_rid = 0x0; 1884 } 1885 1886 /**************************************************************************** 1887 * void hdac_corb_init(struct hdac_softc *) 1888 * 1889 * Initialize the corb registers for operations but do not start it up yet. 1890 * The CORB engine must not be running when this function is called. 1891 ****************************************************************************/ 1892 static void 1893 hdac_corb_init(struct hdac_softc *sc) 1894 { 1895 uint8_t corbsize; 1896 uint64_t corbpaddr; 1897 1898 /* Setup the CORB size. */ 1899 switch (sc->corb_size) { 1900 case 256: 1901 corbsize = HDAC_CORBSIZE_CORBSIZE(HDAC_CORBSIZE_CORBSIZE_256); 1902 break; 1903 case 16: 1904 corbsize = HDAC_CORBSIZE_CORBSIZE(HDAC_CORBSIZE_CORBSIZE_16); 1905 break; 1906 case 2: 1907 corbsize = HDAC_CORBSIZE_CORBSIZE(HDAC_CORBSIZE_CORBSIZE_2); 1908 break; 1909 default: 1910 panic("%s: Invalid CORB size (%x)\n", __func__, sc->corb_size); 1911 } 1912 HDAC_WRITE_1(&sc->mem, HDAC_CORBSIZE, corbsize); 1913 1914 /* Setup the CORB Address in the hdac */ 1915 corbpaddr = (uint64_t)sc->corb_dma.dma_paddr; 1916 HDAC_WRITE_4(&sc->mem, HDAC_CORBLBASE, (uint32_t)corbpaddr); 1917 HDAC_WRITE_4(&sc->mem, HDAC_CORBUBASE, (uint32_t)(corbpaddr >> 32)); 1918 1919 /* Set the WP and RP */ 1920 sc->corb_wp = 0; 1921 HDAC_WRITE_2(&sc->mem, HDAC_CORBWP, sc->corb_wp); 1922 HDAC_WRITE_2(&sc->mem, HDAC_CORBRP, HDAC_CORBRP_CORBRPRST); 1923 /* 1924 * The HDA specification indicates that the CORBRPRST bit will always 1925 * read as zero. Unfortunately, it seems that at least the 82801G 1926 * doesn't reset the bit to zero, which stalls the corb engine. 1927 * manually reset the bit to zero before continuing. 1928 */ 1929 HDAC_WRITE_2(&sc->mem, HDAC_CORBRP, 0x0); 1930 1931 /* Enable CORB error reporting */ 1932 #if 0 1933 HDAC_WRITE_1(&sc->mem, HDAC_CORBCTL, HDAC_CORBCTL_CMEIE); 1934 #endif 1935 } 1936 1937 /**************************************************************************** 1938 * void hdac_rirb_init(struct hdac_softc *) 1939 * 1940 * Initialize the rirb registers for operations but do not start it up yet. 1941 * The RIRB engine must not be running when this function is called. 1942 ****************************************************************************/ 1943 static void 1944 hdac_rirb_init(struct hdac_softc *sc) 1945 { 1946 uint8_t rirbsize; 1947 uint64_t rirbpaddr; 1948 1949 /* Setup the RIRB size. */ 1950 switch (sc->rirb_size) { 1951 case 256: 1952 rirbsize = HDAC_RIRBSIZE_RIRBSIZE(HDAC_RIRBSIZE_RIRBSIZE_256); 1953 break; 1954 case 16: 1955 rirbsize = HDAC_RIRBSIZE_RIRBSIZE(HDAC_RIRBSIZE_RIRBSIZE_16); 1956 break; 1957 case 2: 1958 rirbsize = HDAC_RIRBSIZE_RIRBSIZE(HDAC_RIRBSIZE_RIRBSIZE_2); 1959 break; 1960 default: 1961 panic("%s: Invalid RIRB size (%x)\n", __func__, sc->rirb_size); 1962 } 1963 HDAC_WRITE_1(&sc->mem, HDAC_RIRBSIZE, rirbsize); 1964 1965 /* Setup the RIRB Address in the hdac */ 1966 rirbpaddr = (uint64_t)sc->rirb_dma.dma_paddr; 1967 HDAC_WRITE_4(&sc->mem, HDAC_RIRBLBASE, (uint32_t)rirbpaddr); 1968 HDAC_WRITE_4(&sc->mem, HDAC_RIRBUBASE, (uint32_t)(rirbpaddr >> 32)); 1969 1970 /* Setup the WP and RP */ 1971 sc->rirb_rp = 0; 1972 HDAC_WRITE_2(&sc->mem, HDAC_RIRBWP, HDAC_RIRBWP_RIRBWPRST); 1973 1974 /* Setup the interrupt threshold */ 1975 HDAC_WRITE_2(&sc->mem, HDAC_RINTCNT, sc->rirb_size / 2); 1976 1977 /* Enable Overrun and response received reporting */ 1978 #if 0 1979 HDAC_WRITE_1(&sc->mem, HDAC_RIRBCTL, 1980 HDAC_RIRBCTL_RIRBOIC | HDAC_RIRBCTL_RINTCTL); 1981 #else 1982 HDAC_WRITE_1(&sc->mem, HDAC_RIRBCTL, HDAC_RIRBCTL_RINTCTL); 1983 #endif 1984 1985 #if 0 1986 /* 1987 * Make sure that the Host CPU cache doesn't contain any dirty 1988 * cache lines that falls in the rirb. If I understood correctly, it 1989 * should be sufficient to do this only once as the rirb is purely 1990 * read-only from now on. 1991 */ 1992 bus_dmamap_sync(sc->rirb_dma.dma_tag, sc->rirb_dma.dma_map, 1993 BUS_DMASYNC_PREREAD); 1994 #endif 1995 } 1996 1997 /**************************************************************************** 1998 * void hdac_corb_start(hdac_softc *) 1999 * 2000 * Startup the corb DMA engine 2001 ****************************************************************************/ 2002 static void 2003 hdac_corb_start(struct hdac_softc *sc) 2004 { 2005 uint32_t corbctl; 2006 2007 corbctl = HDAC_READ_1(&sc->mem, HDAC_CORBCTL); 2008 corbctl |= HDAC_CORBCTL_CORBRUN; 2009 HDAC_WRITE_1(&sc->mem, HDAC_CORBCTL, corbctl); 2010 } 2011 2012 /**************************************************************************** 2013 * void hdac_rirb_start(hdac_softc *) 2014 * 2015 * Startup the rirb DMA engine 2016 ****************************************************************************/ 2017 static void 2018 hdac_rirb_start(struct hdac_softc *sc) 2019 { 2020 uint32_t rirbctl; 2021 2022 rirbctl = HDAC_READ_1(&sc->mem, HDAC_RIRBCTL); 2023 rirbctl |= HDAC_RIRBCTL_RIRBDMAEN; 2024 HDAC_WRITE_1(&sc->mem, HDAC_RIRBCTL, rirbctl); 2025 } 2026 2027 2028 /**************************************************************************** 2029 * void hdac_scan_codecs(struct hdac_softc *, int) 2030 * 2031 * Scan the bus for available codecs, starting with num. 2032 ****************************************************************************/ 2033 static void 2034 hdac_scan_codecs(struct hdac_softc *sc) 2035 { 2036 struct hdac_codec *codec; 2037 int i; 2038 uint16_t statests; 2039 2040 statests = HDAC_READ_2(&sc->mem, HDAC_STATESTS); 2041 for (i = 0; i < HDAC_CODEC_MAX; i++) { 2042 if (HDAC_STATESTS_SDIWAKE(statests, i)) { 2043 /* We have found a codec. */ 2044 codec = (struct hdac_codec *)malloc(sizeof(*codec), 2045 M_HDAC, M_ZERO | M_NOWAIT); 2046 if (codec == NULL) { 2047 device_printf(sc->dev, 2048 "Unable to allocate memory for codec\n"); 2049 continue; 2050 } 2051 codec->commands = NULL; 2052 codec->responses_received = 0; 2053 codec->verbs_sent = 0; 2054 codec->sc = sc; 2055 codec->cad = i; 2056 sc->codecs[i] = codec; 2057 hdac_probe_codec(codec); 2058 } 2059 } 2060 /* All codecs have been probed, now try to attach drivers to them */ 2061 /* bus_generic_attach(sc->dev); */ 2062 } 2063 2064 /**************************************************************************** 2065 * void hdac_probe_codec(struct hdac_softc *, int) 2066 * 2067 * Probe a the given codec_id for available function groups. 2068 ****************************************************************************/ 2069 static void 2070 hdac_probe_codec(struct hdac_codec *codec) 2071 { 2072 struct hdac_softc *sc = codec->sc; 2073 uint32_t vendorid, revisionid, subnode; 2074 int startnode; 2075 int endnode; 2076 int i; 2077 nid_t cad = codec->cad; 2078 2079 HDA_BOOTVERBOSE( 2080 device_printf(sc->dev, "Probing codec #%d...\n", cad); 2081 ); 2082 vendorid = hdac_command(sc, 2083 HDA_CMD_GET_PARAMETER(cad, 0x0, HDA_PARAM_VENDOR_ID), 2084 cad); 2085 revisionid = hdac_command(sc, 2086 HDA_CMD_GET_PARAMETER(cad, 0x0, HDA_PARAM_REVISION_ID), 2087 cad); 2088 codec->vendor_id = HDA_PARAM_VENDOR_ID_VENDOR_ID(vendorid); 2089 codec->device_id = HDA_PARAM_VENDOR_ID_DEVICE_ID(vendorid); 2090 codec->revision_id = HDA_PARAM_REVISION_ID_REVISION_ID(revisionid); 2091 codec->stepping_id = HDA_PARAM_REVISION_ID_STEPPING_ID(revisionid); 2092 2093 if (vendorid == HDAC_INVALID && revisionid == HDAC_INVALID) { 2094 device_printf(sc->dev, "Codec #%d is not responding!" 2095 " Probing aborted.\n", cad); 2096 return; 2097 } 2098 2099 device_printf(sc->dev, "HDA Codec #%d: %s\n", 2100 cad, hdac_codec_name(codec)); 2101 HDA_BOOTVERBOSE( 2102 device_printf(sc->dev, " HDA Codec ID: 0x%08x\n", 2103 hdac_codec_id(codec)); 2104 device_printf(sc->dev, " Vendor: 0x%04x\n", 2105 codec->vendor_id); 2106 device_printf(sc->dev, " Device: 0x%04x\n", 2107 codec->device_id); 2108 device_printf(sc->dev, " Revision: 0x%02x\n", 2109 codec->revision_id); 2110 device_printf(sc->dev, " Stepping: 0x%02x\n", 2111 codec->stepping_id); 2112 device_printf(sc->dev, "PCI Subvendor: 0x%08x\n", 2113 sc->pci_subvendor); 2114 ); 2115 subnode = hdac_command(sc, 2116 HDA_CMD_GET_PARAMETER(cad, 0x0, HDA_PARAM_SUB_NODE_COUNT), 2117 cad); 2118 startnode = HDA_PARAM_SUB_NODE_COUNT_START(subnode); 2119 endnode = startnode + HDA_PARAM_SUB_NODE_COUNT_TOTAL(subnode); 2120 2121 HDA_BOOTHVERBOSE( 2122 device_printf(sc->dev, "\tstartnode=%d endnode=%d\n", 2123 startnode, endnode); 2124 ); 2125 2126 codec->fgs = (struct hdac_devinfo *)malloc(sizeof(struct hdac_devinfo) * 2127 (endnode - startnode), M_HDAC, M_NOWAIT | M_ZERO); 2128 if (codec->fgs == NULL) { 2129 device_printf(sc->dev, "%s: Unable to allocate function groups\n", 2130 __func__); 2131 return; 2132 } 2133 2134 for (i = startnode; i < endnode; i++) 2135 hdac_probe_function(codec, i); 2136 return; 2137 } 2138 2139 /* 2140 * Probe codec function and add it to the list. 2141 */ 2142 static void 2143 hdac_probe_function(struct hdac_codec *codec, nid_t nid) 2144 { 2145 struct hdac_softc *sc = codec->sc; 2146 struct hdac_devinfo *devinfo = &codec->fgs[codec->num_fgs]; 2147 uint32_t fctgrptype; 2148 uint32_t res; 2149 nid_t cad = codec->cad; 2150 2151 fctgrptype = HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE(hdac_command(sc, 2152 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_FCT_GRP_TYPE), cad)); 2153 2154 devinfo->nid = nid; 2155 devinfo->node_type = fctgrptype; 2156 devinfo->codec = codec; 2157 2158 res = hdac_command(sc, 2159 HDA_CMD_GET_PARAMETER(cad , nid, HDA_PARAM_SUB_NODE_COUNT), cad); 2160 2161 devinfo->nodecnt = HDA_PARAM_SUB_NODE_COUNT_TOTAL(res); 2162 devinfo->startnode = HDA_PARAM_SUB_NODE_COUNT_START(res); 2163 devinfo->endnode = devinfo->startnode + devinfo->nodecnt; 2164 2165 HDA_BOOTVERBOSE( 2166 device_printf(sc->dev, 2167 "\tFound %s FG nid=%d startnode=%d endnode=%d total=%d\n", 2168 (fctgrptype == HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) ? "audio": 2169 (fctgrptype == HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_MODEM) ? "modem": 2170 "unknown", nid, devinfo->startnode, devinfo->endnode, 2171 devinfo->nodecnt); 2172 ); 2173 2174 if (devinfo->nodecnt > 0) 2175 devinfo->widget = (struct hdac_widget *)malloc( 2176 sizeof(*(devinfo->widget)) * devinfo->nodecnt, M_HDAC, 2177 M_NOWAIT | M_ZERO); 2178 else 2179 devinfo->widget = NULL; 2180 2181 if (devinfo->widget == NULL) { 2182 device_printf(sc->dev, "unable to allocate widgets!\n"); 2183 devinfo->endnode = devinfo->startnode; 2184 devinfo->nodecnt = 0; 2185 return; 2186 } 2187 2188 codec->num_fgs++; 2189 } 2190 2191 static void 2192 hdac_widget_connection_parse(struct hdac_widget *w) 2193 { 2194 struct hdac_softc *sc = w->devinfo->codec->sc; 2195 uint32_t res; 2196 int i, j, max, ents, entnum; 2197 nid_t cad = w->devinfo->codec->cad; 2198 nid_t nid = w->nid; 2199 nid_t cnid, addcnid, prevcnid; 2200 2201 w->nconns = 0; 2202 2203 res = hdac_command(sc, 2204 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_CONN_LIST_LENGTH), cad); 2205 2206 ents = HDA_PARAM_CONN_LIST_LENGTH_LIST_LENGTH(res); 2207 2208 if (ents < 1) 2209 return; 2210 2211 entnum = HDA_PARAM_CONN_LIST_LENGTH_LONG_FORM(res) ? 2 : 4; 2212 max = (sizeof(w->conns) / sizeof(w->conns[0])) - 1; 2213 prevcnid = 0; 2214 2215 #define CONN_RMASK(e) (1 << ((32 / (e)) - 1)) 2216 #define CONN_NMASK(e) (CONN_RMASK(e) - 1) 2217 #define CONN_RESVAL(r, e, n) ((r) >> ((32 / (e)) * (n))) 2218 #define CONN_RANGE(r, e, n) (CONN_RESVAL(r, e, n) & CONN_RMASK(e)) 2219 #define CONN_CNID(r, e, n) (CONN_RESVAL(r, e, n) & CONN_NMASK(e)) 2220 2221 for (i = 0; i < ents; i += entnum) { 2222 res = hdac_command(sc, 2223 HDA_CMD_GET_CONN_LIST_ENTRY(cad, nid, i), cad); 2224 for (j = 0; j < entnum; j++) { 2225 cnid = CONN_CNID(res, entnum, j); 2226 if (cnid == 0) { 2227 if (w->nconns < ents) 2228 device_printf(sc->dev, 2229 "%s: nid=%d WARNING: zero cnid " 2230 "entnum=%d j=%d index=%d " 2231 "entries=%d found=%d res=0x%08x\n", 2232 __func__, nid, entnum, j, i, 2233 ents, w->nconns, res); 2234 else 2235 goto getconns_out; 2236 } 2237 if (cnid < w->devinfo->startnode || 2238 cnid >= w->devinfo->endnode) { 2239 HDA_BOOTVERBOSE( 2240 device_printf(sc->dev, 2241 "GHOST: nid=%d j=%d " 2242 "entnum=%d index=%d res=0x%08x\n", 2243 nid, j, entnum, i, res); 2244 ); 2245 } 2246 if (CONN_RANGE(res, entnum, j) == 0) 2247 addcnid = cnid; 2248 else if (prevcnid == 0 || prevcnid >= cnid) { 2249 device_printf(sc->dev, 2250 "%s: WARNING: Invalid child range " 2251 "nid=%d index=%d j=%d entnum=%d " 2252 "prevcnid=%d cnid=%d res=0x%08x\n", 2253 __func__, nid, i, j, entnum, prevcnid, 2254 cnid, res); 2255 addcnid = cnid; 2256 } else 2257 addcnid = prevcnid + 1; 2258 while (addcnid <= cnid) { 2259 if (w->nconns > max) { 2260 device_printf(sc->dev, 2261 "Adding %d (nid=%d): " 2262 "Max connection reached! max=%d\n", 2263 addcnid, nid, max + 1); 2264 goto getconns_out; 2265 } 2266 w->connsenable[w->nconns] = 1; 2267 w->conns[w->nconns++] = addcnid++; 2268 } 2269 prevcnid = cnid; 2270 } 2271 } 2272 2273 getconns_out: 2274 return; 2275 } 2276 2277 static uint32_t 2278 hdac_widget_pin_patch(uint32_t config, const char *str) 2279 { 2280 char buf[256]; 2281 char *key, *value, *rest, *bad; 2282 int ival, i; 2283 2284 strlcpy(buf, str, sizeof(buf)); 2285 rest = buf; 2286 while ((key = strsep(&rest, "=")) != NULL) { 2287 value = strsep(&rest, " \t"); 2288 if (value == NULL) 2289 break; 2290 ival = strtol(value, &bad, 10); 2291 if (strcmp(key, "seq") == 0) { 2292 config &= ~HDA_CONFIG_DEFAULTCONF_SEQUENCE_MASK; 2293 config |= ((ival << HDA_CONFIG_DEFAULTCONF_SEQUENCE_SHIFT) & 2294 HDA_CONFIG_DEFAULTCONF_SEQUENCE_MASK); 2295 } else if (strcmp(key, "as") == 0) { 2296 config &= ~HDA_CONFIG_DEFAULTCONF_ASSOCIATION_MASK; 2297 config |= ((ival << HDA_CONFIG_DEFAULTCONF_ASSOCIATION_SHIFT) & 2298 HDA_CONFIG_DEFAULTCONF_ASSOCIATION_MASK); 2299 } else if (strcmp(key, "misc") == 0) { 2300 config &= ~HDA_CONFIG_DEFAULTCONF_MISC_MASK; 2301 config |= ((ival << HDA_CONFIG_DEFAULTCONF_MISC_SHIFT) & 2302 HDA_CONFIG_DEFAULTCONF_MISC_MASK); 2303 } else if (strcmp(key, "color") == 0) { 2304 config &= ~HDA_CONFIG_DEFAULTCONF_COLOR_MASK; 2305 if (bad[0] == 0) { 2306 config |= ((ival << HDA_CONFIG_DEFAULTCONF_COLOR_SHIFT) & 2307 HDA_CONFIG_DEFAULTCONF_COLOR_MASK); 2308 }; 2309 for (i = 0; i < 16; i++) { 2310 if (strcasecmp(HDA_COLORS[i], value) == 0) { 2311 config |= (i << HDA_CONFIG_DEFAULTCONF_COLOR_SHIFT); 2312 break; 2313 } 2314 } 2315 } else if (strcmp(key, "ctype") == 0) { 2316 config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_MASK; 2317 config |= ((ival << HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_SHIFT) & 2318 HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE_MASK); 2319 } else if (strcmp(key, "device") == 0) { 2320 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2321 if (bad[0] == 0) { 2322 config |= ((ival << HDA_CONFIG_DEFAULTCONF_DEVICE_SHIFT) & 2323 HDA_CONFIG_DEFAULTCONF_DEVICE_MASK); 2324 continue; 2325 }; 2326 for (i = 0; i < 16; i++) { 2327 if (strcasecmp(HDA_DEVS[i], value) == 0) { 2328 config |= (i << HDA_CONFIG_DEFAULTCONF_DEVICE_SHIFT); 2329 break; 2330 } 2331 } 2332 } else if (strcmp(key, "loc") == 0) { 2333 config &= ~HDA_CONFIG_DEFAULTCONF_LOCATION_MASK; 2334 config |= ((ival << HDA_CONFIG_DEFAULTCONF_LOCATION_SHIFT) & 2335 HDA_CONFIG_DEFAULTCONF_LOCATION_MASK); 2336 } else if (strcmp(key, "conn") == 0) { 2337 config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK; 2338 if (bad[0] == 0) { 2339 config |= ((ival << HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_SHIFT) & 2340 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2341 continue; 2342 }; 2343 for (i = 0; i < 4; i++) { 2344 if (strcasecmp(HDA_CONNS[i], value) == 0) { 2345 config |= (i << HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_SHIFT); 2346 break; 2347 } 2348 } 2349 } 2350 } 2351 return (config); 2352 } 2353 2354 static uint32_t 2355 hdac_widget_pin_getconfig(struct hdac_widget *w) 2356 { 2357 struct hdac_softc *sc; 2358 uint32_t config, orig, id; 2359 nid_t cad, nid; 2360 char buf[32]; 2361 const char *res = NULL, *patch = NULL; 2362 2363 sc = w->devinfo->codec->sc; 2364 cad = w->devinfo->codec->cad; 2365 nid = w->nid; 2366 id = hdac_codec_id(w->devinfo->codec); 2367 2368 config = hdac_command(sc, 2369 HDA_CMD_GET_CONFIGURATION_DEFAULT(cad, nid), 2370 cad); 2371 orig = config; 2372 2373 HDA_BOOTVERBOSE( 2374 hdac_dump_pin_config(w, orig); 2375 ); 2376 2377 /* XXX: Old patches require complete review. 2378 * Now they may create more problem then solve due to 2379 * incorrect associations. 2380 */ 2381 if (id == HDA_CODEC_ALC880 && sc->pci_subvendor == LG_LW20_SUBVENDOR) { 2382 switch (nid) { 2383 case 26: 2384 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2385 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN; 2386 break; 2387 case 27: 2388 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2389 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT; 2390 break; 2391 default: 2392 break; 2393 } 2394 } else if (id == HDA_CODEC_ALC880 && 2395 (sc->pci_subvendor == CLEVO_D900T_SUBVENDOR || 2396 sc->pci_subvendor == ASUS_M5200_SUBVENDOR)) { 2397 /* 2398 * Super broken BIOS 2399 */ 2400 switch (nid) { 2401 case 24: /* MIC1 */ 2402 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2403 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN; 2404 break; 2405 case 25: /* XXX MIC2 */ 2406 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2407 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN; 2408 break; 2409 case 26: /* LINE1 */ 2410 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2411 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN; 2412 break; 2413 case 27: /* XXX LINE2 */ 2414 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2415 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN; 2416 break; 2417 case 28: /* CD */ 2418 config &= ~HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 2419 config |= HDA_CONFIG_DEFAULTCONF_DEVICE_CD; 2420 break; 2421 } 2422 } else if (id == HDA_CODEC_ALC883 && 2423 (sc->pci_subvendor == MSI_MS034A_SUBVENDOR || 2424 HDA_DEV_MATCH(ACER_ALL_SUBVENDOR, sc->pci_subvendor))) { 2425 switch (nid) { 2426 case 25: 2427 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2428 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2429 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN | 2430 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED); 2431 break; 2432 case 28: 2433 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2434 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2435 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_CD | 2436 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED); 2437 break; 2438 } 2439 } else if (id == HDA_CODEC_CX20549 && sc->pci_subvendor == 2440 HP_V3000_SUBVENDOR) { 2441 switch (nid) { 2442 case 18: 2443 config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK; 2444 config |= HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE; 2445 break; 2446 case 20: 2447 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2448 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2449 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN | 2450 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED); 2451 break; 2452 case 21: 2453 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2454 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2455 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_CD | 2456 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED); 2457 break; 2458 } 2459 } else if (id == HDA_CODEC_CX20551 && sc->pci_subvendor == 2460 HP_DV5000_SUBVENDOR) { 2461 switch (nid) { 2462 case 20: 2463 case 21: 2464 config &= ~HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK; 2465 config |= HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE; 2466 break; 2467 } 2468 } else if (id == HDA_CODEC_ALC861 && sc->pci_subvendor == 2469 ASUS_W6F_SUBVENDOR) { 2470 switch (nid) { 2471 case 11: 2472 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2473 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2474 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_OUT | 2475 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED); 2476 break; 2477 case 12: 2478 case 14: 2479 case 16: 2480 case 31: 2481 case 32: 2482 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2483 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2484 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN | 2485 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_FIXED); 2486 break; 2487 case 15: 2488 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2489 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2490 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT | 2491 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK); 2492 break; 2493 } 2494 } else if (id == HDA_CODEC_ALC861 && sc->pci_subvendor == 2495 UNIWILL_9075_SUBVENDOR) { 2496 switch (nid) { 2497 case 15: 2498 config &= ~(HDA_CONFIG_DEFAULTCONF_DEVICE_MASK | 2499 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK); 2500 config |= (HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT | 2501 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK); 2502 break; 2503 } 2504 } 2505 2506 /* New patches */ 2507 if (id == HDA_CODEC_AD1986A && 2508 (sc->pci_subvendor == ASUS_M2NPVMX_SUBVENDOR || 2509 sc->pci_subvendor == ASUS_A8NVMCSM_SUBVENDOR || 2510 sc->pci_subvendor == ASUS_P5PL2_SUBVENDOR)) { 2511 switch (nid) { 2512 case 26: /* Headphones with redirection */ 2513 patch = "as=1 seq=15"; 2514 break; 2515 case 28: /* 5.1 out => 2.0 out + 1 input */ 2516 patch = "device=Line-in as=8 seq=1"; 2517 break; 2518 case 29: /* Can't use this as input, as the only available mic 2519 * preamplifier is busy by front panel mic (nid 31). 2520 * If you want to use this rear connector as mic input, 2521 * you have to disable the front panel one. */ 2522 patch = "as=0"; 2523 break; 2524 case 31: /* Lot of inputs configured with as=15 and unusable */ 2525 patch = "as=8 seq=3"; 2526 break; 2527 case 32: 2528 patch = "as=8 seq=4"; 2529 break; 2530 case 34: 2531 patch = "as=8 seq=5"; 2532 break; 2533 case 36: 2534 patch = "as=8 seq=6"; 2535 break; 2536 } 2537 } else if (id == HDA_CODEC_ALC260 && 2538 HDA_DEV_MATCH(SONY_S5_SUBVENDOR, sc->pci_subvendor)) { 2539 switch (nid) { 2540 case 16: 2541 patch = "seq=15 device=Headphones"; 2542 break; 2543 } 2544 } else if (id == HDA_CODEC_ALC268) { 2545 if (sc->pci_subvendor == ACER_T5320_SUBVENDOR) { 2546 switch (nid) { 2547 case 20: /* Headphones Jack */ 2548 patch = "as=1 seq=15"; 2549 break; 2550 } 2551 } 2552 } 2553 2554 if (patch != NULL) 2555 config = hdac_widget_pin_patch(config, patch); 2556 2557 snprintf(buf, sizeof(buf), "cad%u.nid%u.config", cad, nid); 2558 if (resource_string_value(device_get_name(sc->dev), 2559 device_get_unit(sc->dev), buf, &res) == 0) { 2560 if (strncmp(res, "0x", 2) == 0) { 2561 config = strtol(res + 2, NULL, 16); 2562 } else { 2563 config = hdac_widget_pin_patch(config, res); 2564 } 2565 } 2566 2567 HDA_BOOTVERBOSE( 2568 if (config != orig) 2569 device_printf(sc->dev, 2570 "Patching pin config nid=%u 0x%08x -> 0x%08x\n", 2571 nid, orig, config); 2572 ); 2573 2574 return (config); 2575 } 2576 2577 static uint32_t 2578 hdac_widget_pin_getcaps(struct hdac_widget *w) 2579 { 2580 struct hdac_softc *sc; 2581 uint32_t caps, orig, id; 2582 nid_t cad, nid; 2583 2584 sc = w->devinfo->codec->sc; 2585 cad = w->devinfo->codec->cad; 2586 nid = w->nid; 2587 id = hdac_codec_id(w->devinfo->codec); 2588 2589 caps = hdac_command(sc, 2590 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_PIN_CAP), cad); 2591 orig = caps; 2592 2593 HDA_BOOTVERBOSE( 2594 if (caps != orig) 2595 device_printf(sc->dev, 2596 "Patching pin caps nid=%u 0x%08x -> 0x%08x\n", 2597 nid, orig, caps); 2598 ); 2599 2600 return (caps); 2601 } 2602 2603 static void 2604 hdac_widget_pin_parse(struct hdac_widget *w) 2605 { 2606 struct hdac_softc *sc = w->devinfo->codec->sc; 2607 uint32_t config, pincap; 2608 const char *devstr; 2609 nid_t cad = w->devinfo->codec->cad; 2610 nid_t nid = w->nid; 2611 int conn, color; 2612 2613 config = hdac_widget_pin_getconfig(w); 2614 w->wclass.pin.config = config; 2615 2616 pincap = hdac_widget_pin_getcaps(w); 2617 w->wclass.pin.cap = pincap; 2618 2619 w->wclass.pin.ctrl = hdac_command(sc, 2620 HDA_CMD_GET_PIN_WIDGET_CTRL(cad, nid), cad); 2621 2622 if (HDA_PARAM_PIN_CAP_EAPD_CAP(pincap)) { 2623 w->param.eapdbtl = hdac_command(sc, 2624 HDA_CMD_GET_EAPD_BTL_ENABLE(cad, nid), cad); 2625 w->param.eapdbtl &= 0x7; 2626 w->param.eapdbtl |= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD; 2627 } else 2628 w->param.eapdbtl = HDAC_INVALID; 2629 2630 devstr = HDA_DEVS[(config & HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) >> 2631 HDA_CONFIG_DEFAULTCONF_DEVICE_SHIFT]; 2632 2633 conn = (config & HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) >> 2634 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_SHIFT; 2635 color = (config & HDA_CONFIG_DEFAULTCONF_COLOR_MASK) >> 2636 HDA_CONFIG_DEFAULTCONF_COLOR_SHIFT; 2637 2638 strlcat(w->name, ": ", sizeof(w->name)); 2639 strlcat(w->name, devstr, sizeof(w->name)); 2640 strlcat(w->name, " (", sizeof(w->name)); 2641 if (conn == 0 && color != 0 && color != 15) { 2642 strlcat(w->name, HDA_COLORS[color], sizeof(w->name)); 2643 strlcat(w->name, " ", sizeof(w->name)); 2644 } 2645 strlcat(w->name, HDA_CONNS[conn], sizeof(w->name)); 2646 strlcat(w->name, ")", sizeof(w->name)); 2647 } 2648 2649 static uint32_t 2650 hdac_widget_getcaps(struct hdac_widget *w, int *waspin) 2651 { 2652 struct hdac_softc *sc; 2653 uint32_t caps, orig, id; 2654 nid_t cad, nid, beeper = -1; 2655 2656 sc = w->devinfo->codec->sc; 2657 cad = w->devinfo->codec->cad; 2658 nid = w->nid; 2659 id = hdac_codec_id(w->devinfo->codec); 2660 2661 caps = hdac_command(sc, 2662 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_AUDIO_WIDGET_CAP), 2663 cad); 2664 orig = caps; 2665 2666 /* On some codecs beeper is an input pin, but it is not recordable 2667 alone. Also most of BIOSes does not declare beeper pin. 2668 Change beeper pin node type to beeper to help parser. */ 2669 *waspin = 0; 2670 switch (id) { 2671 case HDA_CODEC_AD1882: 2672 case HDA_CODEC_AD1883: 2673 case HDA_CODEC_AD1984: 2674 case HDA_CODEC_AD1984A: 2675 case HDA_CODEC_AD1984B: 2676 case HDA_CODEC_AD1987: 2677 case HDA_CODEC_AD1988: 2678 case HDA_CODEC_AD1988B: 2679 case HDA_CODEC_AD1989B: 2680 beeper = 26; 2681 break; 2682 case HDA_CODEC_ALC260: 2683 beeper = 23; 2684 break; 2685 case HDA_CODEC_ALC262: 2686 case HDA_CODEC_ALC268: 2687 case HDA_CODEC_ALC880: 2688 case HDA_CODEC_ALC882: 2689 case HDA_CODEC_ALC883: 2690 case HDA_CODEC_ALC885: 2691 case HDA_CODEC_ALC888: 2692 case HDA_CODEC_ALC889: 2693 beeper = 29; 2694 break; 2695 } 2696 if (nid == beeper) { 2697 caps &= ~HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_MASK; 2698 caps |= HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET << 2699 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_SHIFT; 2700 *waspin = 1; 2701 } 2702 2703 HDA_BOOTVERBOSE( 2704 if (caps != orig) { 2705 device_printf(sc->dev, 2706 "Patching widget caps nid=%u 0x%08x -> 0x%08x\n", 2707 nid, orig, caps); 2708 } 2709 ); 2710 2711 return (caps); 2712 } 2713 2714 static void 2715 hdac_widget_parse(struct hdac_widget *w) 2716 { 2717 struct hdac_softc *sc = w->devinfo->codec->sc; 2718 uint32_t wcap, cap; 2719 char *typestr; 2720 nid_t cad = w->devinfo->codec->cad; 2721 nid_t nid = w->nid; 2722 2723 wcap = hdac_widget_getcaps(w, &w->waspin); 2724 2725 w->param.widget_cap = wcap; 2726 w->type = HDA_PARAM_AUDIO_WIDGET_CAP_TYPE(wcap); 2727 2728 switch (w->type) { 2729 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT: 2730 typestr = "audio output"; 2731 break; 2732 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT: 2733 typestr = "audio input"; 2734 break; 2735 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER: 2736 typestr = "audio mixer"; 2737 break; 2738 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR: 2739 typestr = "audio selector"; 2740 break; 2741 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX: 2742 typestr = "pin"; 2743 break; 2744 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_POWER_WIDGET: 2745 typestr = "power widget"; 2746 break; 2747 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_VOLUME_WIDGET: 2748 typestr = "volume widget"; 2749 break; 2750 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET: 2751 typestr = "beep widget"; 2752 break; 2753 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_VENDOR_WIDGET: 2754 typestr = "vendor widget"; 2755 break; 2756 default: 2757 typestr = "unknown type"; 2758 break; 2759 } 2760 2761 strlcpy(w->name, typestr, sizeof(w->name)); 2762 2763 hdac_widget_connection_parse(w); 2764 2765 if (HDA_PARAM_AUDIO_WIDGET_CAP_OUT_AMP(wcap)) { 2766 if (HDA_PARAM_AUDIO_WIDGET_CAP_AMP_OVR(wcap)) 2767 w->param.outamp_cap = 2768 hdac_command(sc, 2769 HDA_CMD_GET_PARAMETER(cad, nid, 2770 HDA_PARAM_OUTPUT_AMP_CAP), cad); 2771 else 2772 w->param.outamp_cap = 2773 w->devinfo->function.audio.outamp_cap; 2774 } else 2775 w->param.outamp_cap = 0; 2776 2777 if (HDA_PARAM_AUDIO_WIDGET_CAP_IN_AMP(wcap)) { 2778 if (HDA_PARAM_AUDIO_WIDGET_CAP_AMP_OVR(wcap)) 2779 w->param.inamp_cap = 2780 hdac_command(sc, 2781 HDA_CMD_GET_PARAMETER(cad, nid, 2782 HDA_PARAM_INPUT_AMP_CAP), cad); 2783 else 2784 w->param.inamp_cap = 2785 w->devinfo->function.audio.inamp_cap; 2786 } else 2787 w->param.inamp_cap = 0; 2788 2789 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT || 2790 w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) { 2791 if (HDA_PARAM_AUDIO_WIDGET_CAP_FORMAT_OVR(wcap)) { 2792 cap = hdac_command(sc, 2793 HDA_CMD_GET_PARAMETER(cad, nid, 2794 HDA_PARAM_SUPP_STREAM_FORMATS), cad); 2795 w->param.supp_stream_formats = (cap != 0) ? cap : 2796 w->devinfo->function.audio.supp_stream_formats; 2797 cap = hdac_command(sc, 2798 HDA_CMD_GET_PARAMETER(cad, nid, 2799 HDA_PARAM_SUPP_PCM_SIZE_RATE), cad); 2800 w->param.supp_pcm_size_rate = (cap != 0) ? cap : 2801 w->devinfo->function.audio.supp_pcm_size_rate; 2802 } else { 2803 w->param.supp_stream_formats = 2804 w->devinfo->function.audio.supp_stream_formats; 2805 w->param.supp_pcm_size_rate = 2806 w->devinfo->function.audio.supp_pcm_size_rate; 2807 } 2808 } else { 2809 w->param.supp_stream_formats = 0; 2810 w->param.supp_pcm_size_rate = 0; 2811 } 2812 2813 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 2814 hdac_widget_pin_parse(w); 2815 } 2816 2817 static struct hdac_widget * 2818 hdac_widget_get(struct hdac_devinfo *devinfo, nid_t nid) 2819 { 2820 if (devinfo == NULL || devinfo->widget == NULL || 2821 nid < devinfo->startnode || nid >= devinfo->endnode) 2822 return (NULL); 2823 return (&devinfo->widget[nid - devinfo->startnode]); 2824 } 2825 2826 static __inline int 2827 hda_poll_channel(struct hdac_chan *ch) 2828 { 2829 uint32_t sz, delta; 2830 volatile uint32_t ptr; 2831 2832 if (!(ch->flags & HDAC_CHN_RUNNING)) 2833 return (0); 2834 2835 sz = ch->blksz * ch->blkcnt; 2836 if (ch->dmapos != NULL) 2837 ptr = *(ch->dmapos); 2838 else 2839 ptr = HDAC_READ_4(&ch->devinfo->codec->sc->mem, 2840 ch->off + HDAC_SDLPIB); 2841 ch->ptr = ptr; 2842 ptr %= sz; 2843 ptr &= ~(ch->blksz - 1); 2844 delta = (sz + ptr - ch->prevptr) % sz; 2845 2846 if (delta < ch->blksz) 2847 return (0); 2848 2849 ch->prevptr = ptr; 2850 2851 return (1); 2852 } 2853 2854 static void 2855 hda_poll_callback(void *arg) 2856 { 2857 struct hdac_softc *sc = arg; 2858 uint32_t trigger; 2859 int i, active = 0; 2860 2861 if (sc == NULL) 2862 return; 2863 2864 hdac_lock(sc); 2865 if (sc->polling == 0) { 2866 hdac_unlock(sc); 2867 return; 2868 } 2869 2870 trigger = 0; 2871 for (i = 0; i < sc->num_chans; i++) { 2872 if ((sc->chans[i].flags & HDAC_CHN_RUNNING) == 0) 2873 continue; 2874 active = 1; 2875 if (hda_poll_channel(&sc->chans[i])) 2876 trigger |= (1 << i); 2877 } 2878 2879 /* XXX */ 2880 if (active) 2881 callout_reset(&sc->poll_hda, sc->poll_ticks, 2882 hda_poll_callback, sc); 2883 2884 hdac_unlock(sc); 2885 2886 for (i = 0; i < sc->num_chans; i++) { 2887 if (trigger & (1 << i)) 2888 chn_intr(sc->chans[i].c); 2889 } 2890 } 2891 2892 static int 2893 hdac_rirb_flush(struct hdac_softc *sc) 2894 { 2895 struct hdac_rirb *rirb_base, *rirb; 2896 struct hdac_codec *codec; 2897 struct hdac_command_list *commands; 2898 nid_t cad; 2899 uint32_t resp; 2900 uint8_t rirbwp; 2901 int ret; 2902 2903 rirb_base = (struct hdac_rirb *)sc->rirb_dma.dma_vaddr; 2904 rirbwp = HDAC_READ_1(&sc->mem, HDAC_RIRBWP); 2905 #if 0 2906 bus_dmamap_sync(sc->rirb_dma.dma_tag, sc->rirb_dma.dma_map, 2907 BUS_DMASYNC_POSTREAD); 2908 #endif 2909 2910 ret = 0; 2911 2912 while (sc->rirb_rp != rirbwp) { 2913 sc->rirb_rp++; 2914 sc->rirb_rp %= sc->rirb_size; 2915 rirb = &rirb_base[sc->rirb_rp]; 2916 cad = HDAC_RIRB_RESPONSE_EX_SDATA_IN(rirb->response_ex); 2917 if (cad < 0 || cad >= HDAC_CODEC_MAX || 2918 sc->codecs[cad] == NULL) 2919 continue; 2920 resp = rirb->response; 2921 codec = sc->codecs[cad]; 2922 commands = codec->commands; 2923 if (rirb->response_ex & HDAC_RIRB_RESPONSE_EX_UNSOLICITED) { 2924 sc->unsolq[sc->unsolq_wp++] = (cad << 16) | 2925 ((resp >> 26) & 0xffff); 2926 sc->unsolq_wp %= HDAC_UNSOLQ_MAX; 2927 } else if (commands != NULL && commands->num_commands > 0 && 2928 codec->responses_received < commands->num_commands) 2929 commands->responses[codec->responses_received++] = 2930 resp; 2931 ret++; 2932 } 2933 2934 return (ret); 2935 } 2936 2937 static int 2938 hdac_unsolq_flush(struct hdac_softc *sc) 2939 { 2940 nid_t cad; 2941 uint32_t tag; 2942 int ret = 0; 2943 2944 if (sc->unsolq_st == HDAC_UNSOLQ_READY) { 2945 sc->unsolq_st = HDAC_UNSOLQ_BUSY; 2946 while (sc->unsolq_rp != sc->unsolq_wp) { 2947 cad = sc->unsolq[sc->unsolq_rp] >> 16; 2948 tag = sc->unsolq[sc->unsolq_rp++] & 0xffff; 2949 sc->unsolq_rp %= HDAC_UNSOLQ_MAX; 2950 hdac_unsolicited_handler(sc->codecs[cad], tag); 2951 ret++; 2952 } 2953 sc->unsolq_st = HDAC_UNSOLQ_READY; 2954 } 2955 2956 return (ret); 2957 } 2958 2959 static void 2960 hdac_poll_callback(void *arg) 2961 { 2962 struct hdac_softc *sc = arg; 2963 if (sc == NULL) 2964 return; 2965 2966 hdac_lock(sc); 2967 if (sc->polling == 0 || sc->poll_ival == 0) { 2968 hdac_unlock(sc); 2969 return; 2970 } 2971 if (hdac_rirb_flush(sc) != 0) 2972 hdac_unsolq_flush(sc); 2973 callout_reset(&sc->poll_hdac, sc->poll_ival, hdac_poll_callback, sc); 2974 hdac_unlock(sc); 2975 } 2976 2977 static void 2978 hdac_poll_reinit(struct hdac_softc *sc) 2979 { 2980 int i, pollticks, min = 1000000; 2981 struct hdac_chan *ch; 2982 2983 for (i = 0; i < sc->num_chans; i++) { 2984 if ((sc->chans[i].flags & HDAC_CHN_RUNNING) == 0) 2985 continue; 2986 ch = &sc->chans[i]; 2987 pollticks = ((uint64_t)hz * ch->blksz) / 2988 ((uint64_t)sndbuf_getalign(ch->b) * sndbuf_getspd(ch->b)); 2989 pollticks >>= 1; 2990 if (pollticks > hz) 2991 pollticks = hz; 2992 if (pollticks < 1) { 2993 HDA_BOOTVERBOSE( 2994 device_printf(sc->dev, 2995 "%s: pollticks=%d < 1 !\n", 2996 __func__, pollticks); 2997 ); 2998 pollticks = 1; 2999 } 3000 if (min > pollticks) 3001 min = pollticks; 3002 } 3003 HDA_BOOTVERBOSE( 3004 device_printf(sc->dev, 3005 "%s: pollticks %d -> %d\n", 3006 __func__, sc->poll_ticks, min); 3007 ); 3008 sc->poll_ticks = min; 3009 if (min == 1000000) 3010 callout_stop(&sc->poll_hda); 3011 else 3012 callout_reset(&sc->poll_hda, 1, hda_poll_callback, sc); 3013 } 3014 3015 static void 3016 hdac_stream_stop(struct hdac_chan *ch) 3017 { 3018 struct hdac_softc *sc = ch->devinfo->codec->sc; 3019 uint32_t ctl; 3020 3021 ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0); 3022 ctl &= ~(HDAC_SDCTL_IOCE | HDAC_SDCTL_FEIE | HDAC_SDCTL_DEIE | 3023 HDAC_SDCTL_RUN); 3024 HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL0, ctl); 3025 3026 ch->flags &= ~HDAC_CHN_RUNNING; 3027 3028 if (sc->polling != 0) 3029 hdac_poll_reinit(sc); 3030 3031 ctl = HDAC_READ_4(&sc->mem, HDAC_INTCTL); 3032 ctl &= ~(1 << (ch->off >> 5)); 3033 HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, ctl); 3034 } 3035 3036 static void 3037 hdac_stream_start(struct hdac_chan *ch) 3038 { 3039 struct hdac_softc *sc = ch->devinfo->codec->sc; 3040 uint32_t ctl; 3041 3042 ch->flags |= HDAC_CHN_RUNNING; 3043 3044 if (sc->polling != 0) 3045 hdac_poll_reinit(sc); 3046 3047 ctl = HDAC_READ_4(&sc->mem, HDAC_INTCTL); 3048 ctl |= 1 << (ch->off >> 5); 3049 HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, ctl); 3050 3051 ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0); 3052 ctl |= HDAC_SDCTL_IOCE | HDAC_SDCTL_FEIE | HDAC_SDCTL_DEIE | 3053 HDAC_SDCTL_RUN; 3054 HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL0, ctl); 3055 } 3056 3057 static void 3058 hdac_stream_reset(struct hdac_chan *ch) 3059 { 3060 struct hdac_softc *sc = ch->devinfo->codec->sc; 3061 int timeout = 1000; 3062 int to = timeout; 3063 uint32_t ctl; 3064 3065 ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0); 3066 ctl |= HDAC_SDCTL_SRST; 3067 HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL0, ctl); 3068 do { 3069 ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0); 3070 if (ctl & HDAC_SDCTL_SRST) 3071 break; 3072 DELAY(10); 3073 } while (--to); 3074 if (!(ctl & HDAC_SDCTL_SRST)) { 3075 device_printf(sc->dev, "timeout in reset\n"); 3076 } 3077 ctl &= ~HDAC_SDCTL_SRST; 3078 HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL0, ctl); 3079 to = timeout; 3080 do { 3081 ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL0); 3082 if (!(ctl & HDAC_SDCTL_SRST)) 3083 break; 3084 DELAY(10); 3085 } while (--to); 3086 if (ctl & HDAC_SDCTL_SRST) 3087 device_printf(sc->dev, "can't reset!\n"); 3088 } 3089 3090 static void 3091 hdac_stream_setid(struct hdac_chan *ch) 3092 { 3093 struct hdac_softc *sc = ch->devinfo->codec->sc; 3094 uint32_t ctl; 3095 3096 ctl = HDAC_READ_1(&sc->mem, ch->off + HDAC_SDCTL2); 3097 ctl &= ~HDAC_SDCTL2_STRM_MASK; 3098 ctl |= ch->sid << HDAC_SDCTL2_STRM_SHIFT; 3099 HDAC_WRITE_1(&sc->mem, ch->off + HDAC_SDCTL2, ctl); 3100 } 3101 3102 static void 3103 hdac_bdl_setup(struct hdac_chan *ch) 3104 { 3105 struct hdac_softc *sc = ch->devinfo->codec->sc; 3106 struct hdac_bdle *bdle; 3107 uint64_t addr; 3108 uint32_t blksz, blkcnt; 3109 int i; 3110 3111 addr = (uint64_t)sndbuf_getbufaddr(ch->b); 3112 bdle = (struct hdac_bdle *)ch->bdl_dma.dma_vaddr; 3113 3114 blksz = ch->blksz; 3115 blkcnt = ch->blkcnt; 3116 3117 for (i = 0; i < blkcnt; i++, bdle++) { 3118 bdle->addrl = (uint32_t)addr; 3119 bdle->addrh = (uint32_t)(addr >> 32); 3120 bdle->len = blksz; 3121 bdle->ioc = 1; 3122 addr += blksz; 3123 } 3124 3125 HDAC_WRITE_4(&sc->mem, ch->off + HDAC_SDCBL, blksz * blkcnt); 3126 HDAC_WRITE_2(&sc->mem, ch->off + HDAC_SDLVI, blkcnt - 1); 3127 addr = ch->bdl_dma.dma_paddr; 3128 HDAC_WRITE_4(&sc->mem, ch->off + HDAC_SDBDPL, (uint32_t)addr); 3129 HDAC_WRITE_4(&sc->mem, ch->off + HDAC_SDBDPU, (uint32_t)(addr >> 32)); 3130 if (ch->dmapos != NULL && 3131 !(HDAC_READ_4(&sc->mem, HDAC_DPIBLBASE) & 0x00000001)) { 3132 addr = sc->pos_dma.dma_paddr; 3133 HDAC_WRITE_4(&sc->mem, HDAC_DPIBLBASE, 3134 ((uint32_t)addr & HDAC_DPLBASE_DPLBASE_MASK) | 0x00000001); 3135 HDAC_WRITE_4(&sc->mem, HDAC_DPIBUBASE, (uint32_t)(addr >> 32)); 3136 } 3137 } 3138 3139 static int 3140 hdac_bdl_alloc(struct hdac_chan *ch) 3141 { 3142 struct hdac_softc *sc = ch->devinfo->codec->sc; 3143 int rc; 3144 3145 rc = hdac_dma_alloc(sc, &ch->bdl_dma, 3146 sizeof(struct hdac_bdle) * HDA_BDL_MAX); 3147 if (rc) { 3148 device_printf(sc->dev, "can't alloc bdl\n"); 3149 return (rc); 3150 } 3151 3152 return (0); 3153 } 3154 3155 static void 3156 hdac_audio_ctl_amp_set_internal(struct hdac_softc *sc, nid_t cad, nid_t nid, 3157 int index, int lmute, int rmute, 3158 int left, int right, int dir) 3159 { 3160 uint16_t v = 0; 3161 3162 if (sc == NULL) 3163 return; 3164 3165 if (left != right || lmute != rmute) { 3166 v = (1 << (15 - dir)) | (1 << 13) | (index << 8) | 3167 (lmute << 7) | left; 3168 hdac_command(sc, 3169 HDA_CMD_SET_AMP_GAIN_MUTE(cad, nid, v), cad); 3170 v = (1 << (15 - dir)) | (1 << 12) | (index << 8) | 3171 (rmute << 7) | right; 3172 } else 3173 v = (1 << (15 - dir)) | (3 << 12) | (index << 8) | 3174 (lmute << 7) | left; 3175 3176 hdac_command(sc, 3177 HDA_CMD_SET_AMP_GAIN_MUTE(cad, nid, v), cad); 3178 } 3179 3180 static void 3181 hdac_audio_ctl_amp_set(struct hdac_audio_ctl *ctl, uint32_t mute, 3182 int left, int right) 3183 { 3184 struct hdac_softc *sc; 3185 nid_t nid, cad; 3186 int lmute, rmute; 3187 3188 sc = ctl->widget->devinfo->codec->sc; 3189 cad = ctl->widget->devinfo->codec->cad; 3190 nid = ctl->widget->nid; 3191 3192 /* Save new values if valid. */ 3193 if (mute != HDA_AMP_MUTE_DEFAULT) 3194 ctl->muted = mute; 3195 if (left != HDA_AMP_VOL_DEFAULT) 3196 ctl->left = left; 3197 if (right != HDA_AMP_VOL_DEFAULT) 3198 ctl->right = right; 3199 /* Prepare effective values */ 3200 if (ctl->forcemute) { 3201 lmute = 1; 3202 rmute = 1; 3203 left = 0; 3204 right = 0; 3205 } else { 3206 lmute = HDA_AMP_LEFT_MUTED(ctl->muted); 3207 rmute = HDA_AMP_RIGHT_MUTED(ctl->muted); 3208 left = ctl->left; 3209 right = ctl->right; 3210 } 3211 /* Apply effective values */ 3212 if (ctl->dir & HDA_CTL_OUT) 3213 hdac_audio_ctl_amp_set_internal(sc, cad, nid, ctl->index, 3214 lmute, rmute, left, right, 0); 3215 if (ctl->dir & HDA_CTL_IN) 3216 hdac_audio_ctl_amp_set_internal(sc, cad, nid, ctl->index, 3217 lmute, rmute, left, right, 1); 3218 } 3219 3220 static void 3221 hdac_widget_connection_select(struct hdac_widget *w, uint8_t index) 3222 { 3223 if (w == NULL || w->nconns < 1 || index > (w->nconns - 1)) 3224 return; 3225 hdac_command(w->devinfo->codec->sc, 3226 HDA_CMD_SET_CONNECTION_SELECT_CONTROL(w->devinfo->codec->cad, 3227 w->nid, index), w->devinfo->codec->cad); 3228 w->selconn = index; 3229 } 3230 3231 3232 /**************************************************************************** 3233 * uint32_t hdac_command_sendone_internal 3234 * 3235 * Wrapper function that sends only one command to a given codec 3236 ****************************************************************************/ 3237 static uint32_t 3238 hdac_command_sendone_internal(struct hdac_softc *sc, uint32_t verb, nid_t cad) 3239 { 3240 struct hdac_command_list cl; 3241 uint32_t response = HDAC_INVALID; 3242 3243 if (!hdac_lockowned(sc)) 3244 device_printf(sc->dev, "WARNING!!!! mtx not owned!!!!\n"); 3245 cl.num_commands = 1; 3246 cl.verbs = &verb; 3247 cl.responses = &response; 3248 3249 hdac_command_send_internal(sc, &cl, cad); 3250 3251 return (response); 3252 } 3253 3254 /**************************************************************************** 3255 * hdac_command_send_internal 3256 * 3257 * Send a command list to the codec via the corb. We queue as much verbs as 3258 * we can and msleep on the codec. When the interrupt get the responses 3259 * back from the rirb, it will wake us up so we can queue the remaining verbs 3260 * if any. 3261 ****************************************************************************/ 3262 static void 3263 hdac_command_send_internal(struct hdac_softc *sc, 3264 struct hdac_command_list *commands, nid_t cad) 3265 { 3266 struct hdac_codec *codec; 3267 int corbrp; 3268 uint32_t *corb; 3269 int timeout; 3270 int retry = 10; 3271 struct hdac_rirb *rirb_base; 3272 3273 if (sc == NULL || sc->codecs[cad] == NULL || commands == NULL || 3274 commands->num_commands < 1) 3275 return; 3276 3277 codec = sc->codecs[cad]; 3278 codec->commands = commands; 3279 codec->responses_received = 0; 3280 codec->verbs_sent = 0; 3281 corb = (uint32_t *)sc->corb_dma.dma_vaddr; 3282 rirb_base = (struct hdac_rirb *)sc->rirb_dma.dma_vaddr; 3283 3284 do { 3285 if (codec->verbs_sent != commands->num_commands) { 3286 /* Queue as many verbs as possible */ 3287 corbrp = HDAC_READ_2(&sc->mem, HDAC_CORBRP); 3288 #if 0 3289 bus_dmamap_sync(sc->corb_dma.dma_tag, 3290 sc->corb_dma.dma_map, BUS_DMASYNC_PREWRITE); 3291 #endif 3292 while (codec->verbs_sent != commands->num_commands && 3293 ((sc->corb_wp + 1) % sc->corb_size) != corbrp) { 3294 sc->corb_wp++; 3295 sc->corb_wp %= sc->corb_size; 3296 corb[sc->corb_wp] = 3297 commands->verbs[codec->verbs_sent++]; 3298 } 3299 3300 /* Send the verbs to the codecs */ 3301 #if 0 3302 bus_dmamap_sync(sc->corb_dma.dma_tag, 3303 sc->corb_dma.dma_map, BUS_DMASYNC_POSTWRITE); 3304 #endif 3305 HDAC_WRITE_2(&sc->mem, HDAC_CORBWP, sc->corb_wp); 3306 } 3307 3308 timeout = 1000; 3309 while (hdac_rirb_flush(sc) == 0 && --timeout) 3310 DELAY(10); 3311 } while ((codec->verbs_sent != commands->num_commands || 3312 codec->responses_received != commands->num_commands) && --retry); 3313 3314 if (retry == 0) 3315 device_printf(sc->dev, 3316 "%s: TIMEOUT numcmd=%d, sent=%d, received=%d\n", 3317 __func__, commands->num_commands, codec->verbs_sent, 3318 codec->responses_received); 3319 3320 codec->commands = NULL; 3321 codec->responses_received = 0; 3322 codec->verbs_sent = 0; 3323 3324 hdac_unsolq_flush(sc); 3325 } 3326 3327 3328 /**************************************************************************** 3329 * Device Methods 3330 ****************************************************************************/ 3331 3332 /**************************************************************************** 3333 * int hdac_probe(device_t) 3334 * 3335 * Probe for the presence of an hdac. If none is found, check for a generic 3336 * match using the subclass of the device. 3337 ****************************************************************************/ 3338 static int 3339 hdac_probe(device_t dev) 3340 { 3341 int i, result; 3342 uint32_t model; 3343 uint16_t class, subclass; 3344 char desc[64]; 3345 3346 model = (uint32_t)pci_get_device(dev) << 16; 3347 model |= (uint32_t)pci_get_vendor(dev) & 0x0000ffff; 3348 class = pci_get_class(dev); 3349 subclass = pci_get_subclass(dev); 3350 3351 bzero(desc, sizeof(desc)); 3352 result = ENXIO; 3353 for (i = 0; i < HDAC_DEVICES_LEN; i++) { 3354 if (hdac_devices[i].model == model) { 3355 strlcpy(desc, hdac_devices[i].desc, sizeof(desc)); 3356 result = BUS_PROBE_DEFAULT; 3357 break; 3358 } 3359 if (HDA_DEV_MATCH(hdac_devices[i].model, model) && 3360 class == PCIC_MULTIMEDIA && 3361 subclass == PCIS_MULTIMEDIA_HDA) { 3362 strlcpy(desc, hdac_devices[i].desc, sizeof(desc)); 3363 result = BUS_PROBE_GENERIC; 3364 break; 3365 } 3366 } 3367 if (result == ENXIO && class == PCIC_MULTIMEDIA && 3368 subclass == PCIS_MULTIMEDIA_HDA) { 3369 strlcpy(desc, "Generic", sizeof(desc)); 3370 result = BUS_PROBE_GENERIC; 3371 } 3372 if (result != ENXIO) { 3373 strlcat(desc, " High Definition Audio Controller", 3374 sizeof(desc)); 3375 device_set_desc_copy(dev, desc); 3376 } 3377 3378 return (result); 3379 } 3380 3381 static void * 3382 hdac_channel_init(kobj_t obj, void *data, struct snd_dbuf *b, 3383 struct pcm_channel *c, int dir) 3384 { 3385 struct hdac_pcm_devinfo *pdevinfo = data; 3386 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 3387 struct hdac_softc *sc = devinfo->codec->sc; 3388 struct hdac_chan *ch; 3389 int i, ord = 0, chid; 3390 3391 hdac_lock(sc); 3392 3393 chid = (dir == PCMDIR_PLAY)?pdevinfo->play:pdevinfo->rec; 3394 ch = &sc->chans[chid]; 3395 for (i = 0; i < sc->num_chans && i < chid; i++) { 3396 if (ch->dir == sc->chans[i].dir) 3397 ord++; 3398 } 3399 if (dir == PCMDIR_PLAY) { 3400 ch->off = (sc->num_iss + ord) << 5; 3401 } else { 3402 ch->off = ord << 5; 3403 } 3404 3405 if (devinfo->function.audio.quirks & HDA_QUIRK_FIXEDRATE) { 3406 ch->caps.minspeed = ch->caps.maxspeed = 48000; 3407 ch->pcmrates[0] = 48000; 3408 ch->pcmrates[1] = 0; 3409 } 3410 if (sc->pos_dma.dma_vaddr != NULL) 3411 ch->dmapos = (uint32_t *)(sc->pos_dma.dma_vaddr + 3412 (sc->streamcnt * 8)); 3413 else 3414 ch->dmapos = NULL; 3415 ch->sid = ++sc->streamcnt; 3416 ch->dir = dir; 3417 ch->b = b; 3418 ch->c = c; 3419 ch->blksz = pdevinfo->chan_size / pdevinfo->chan_blkcnt; 3420 ch->blkcnt = pdevinfo->chan_blkcnt; 3421 hdac_unlock(sc); 3422 3423 if (hdac_bdl_alloc(ch) != 0) { 3424 ch->blkcnt = 0; 3425 return (NULL); 3426 } 3427 3428 if (sndbuf_alloc(ch->b, sc->chan_dmat, 3429 (sc->flags & HDAC_F_DMA_NOCACHE) ? BUS_DMA_NOCACHE : 0, 3430 pdevinfo->chan_size) != 0) 3431 return (NULL); 3432 3433 return (ch); 3434 } 3435 3436 static int 3437 hdac_channel_setformat(kobj_t obj, void *data, uint32_t format) 3438 { 3439 struct hdac_chan *ch = data; 3440 int i; 3441 3442 for (i = 0; ch->caps.fmtlist[i] != 0; i++) { 3443 if (format == ch->caps.fmtlist[i]) { 3444 ch->fmt = format; 3445 return (0); 3446 } 3447 } 3448 3449 return (EINVAL); 3450 } 3451 3452 static uint32_t 3453 hdac_channel_setspeed(kobj_t obj, void *data, uint32_t speed) 3454 { 3455 struct hdac_chan *ch = data; 3456 uint32_t spd = 0, threshold; 3457 int i; 3458 3459 for (i = 0; ch->pcmrates[i] != 0; i++) { 3460 spd = ch->pcmrates[i]; 3461 threshold = spd + ((ch->pcmrates[i + 1] != 0) ? 3462 ((ch->pcmrates[i + 1] - spd) >> 1) : 0); 3463 if (speed < threshold) 3464 break; 3465 } 3466 3467 if (spd == 0) /* impossible */ 3468 ch->spd = 48000; 3469 else 3470 ch->spd = spd; 3471 3472 return (ch->spd); 3473 } 3474 3475 static void 3476 hdac_stream_setup(struct hdac_chan *ch) 3477 { 3478 struct hdac_softc *sc = ch->devinfo->codec->sc; 3479 struct hdac_audio_as *as = &ch->devinfo->function.audio.as[ch->as]; 3480 struct hdac_widget *w; 3481 int i, chn, totalchn, c; 3482 nid_t cad = ch->devinfo->codec->cad; 3483 uint16_t fmt, dfmt; 3484 uint16_t chmap[2][5] = {{ 0x0010, 0x0001, 0x0201, 0x0231, 0x0231 }, /* 5.1 */ 3485 { 0x0010, 0x0001, 0x2001, 0x2031, 0x2431 }};/* 7.1 */ 3486 int map = -1; 3487 3488 totalchn = AFMT_CHANNEL(ch->fmt); 3489 HDA_BOOTHVERBOSE( 3490 device_printf(ch->pdevinfo->dev, 3491 "PCMDIR_%s: Stream setup fmt=%08x speed=%d\n", 3492 (ch->dir == PCMDIR_PLAY) ? "PLAY" : "REC", 3493 ch->fmt, ch->spd); 3494 ); 3495 fmt = 0; 3496 if (ch->fmt & AFMT_S16_LE) 3497 fmt |= ch->bit16 << 4; 3498 else if (ch->fmt & AFMT_S32_LE) 3499 fmt |= ch->bit32 << 4; 3500 else 3501 fmt |= 1 << 4; 3502 for (i = 0; i < HDA_RATE_TAB_LEN; i++) { 3503 if (hda_rate_tab[i].valid && ch->spd == hda_rate_tab[i].rate) { 3504 fmt |= hda_rate_tab[i].base; 3505 fmt |= hda_rate_tab[i].mul; 3506 fmt |= hda_rate_tab[i].div; 3507 break; 3508 } 3509 } 3510 fmt |= (totalchn - 1); 3511 3512 /* Set channel mapping for known speaker setups. */ 3513 if (as->pinset == 0x0007 || as->pinset == 0x0013) /* Standard 5.1 */ 3514 map = 0; 3515 else if (as->pinset == 0x0017) /* Standard 7.1 */ 3516 map = 1; 3517 3518 HDAC_WRITE_2(&sc->mem, ch->off + HDAC_SDFMT, fmt); 3519 3520 dfmt = HDA_CMD_SET_DIGITAL_CONV_FMT1_DIGEN; 3521 if (ch->fmt & AFMT_AC3) 3522 dfmt |= HDA_CMD_SET_DIGITAL_CONV_FMT1_NAUDIO; 3523 3524 chn = 0; 3525 for (i = 0; ch->io[i] != -1; i++) { 3526 w = hdac_widget_get(ch->devinfo, ch->io[i]); 3527 if (w == NULL) 3528 continue; 3529 3530 /* If HP redirection is enabled, but failed to use same 3531 DAC, make last DAC to duplicate first one. */ 3532 if (as->fakeredir && i == (as->pincnt - 1)) { 3533 c = (ch->sid << 4); 3534 } else { 3535 if (map >= 0) /* Map known speaker setups. */ 3536 chn = (((chmap[map][totalchn / 2] >> i * 4) & 3537 0xf) - 1) * 2; 3538 if (chn < 0 || chn >= totalchn) { 3539 c = 0; 3540 } else { 3541 c = (ch->sid << 4) | chn; 3542 } 3543 } 3544 HDA_BOOTHVERBOSE( 3545 device_printf(ch->pdevinfo->dev, 3546 "PCMDIR_%s: Stream setup nid=%d: " 3547 "fmt=0x%04x, dfmt=0x%04x, chan=0x%04x\n", 3548 (ch->dir == PCMDIR_PLAY) ? "PLAY" : "REC", 3549 ch->io[i], fmt, dfmt, c); 3550 ); 3551 hdac_command(sc, 3552 HDA_CMD_SET_CONV_FMT(cad, ch->io[i], fmt), cad); 3553 if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) { 3554 hdac_command(sc, 3555 HDA_CMD_SET_DIGITAL_CONV_FMT1(cad, ch->io[i], dfmt), 3556 cad); 3557 } 3558 hdac_command(sc, 3559 HDA_CMD_SET_CONV_STREAM_CHAN(cad, ch->io[i], c), cad); 3560 #if 0 3561 hdac_command(sc, 3562 HDA_CMD_SET_CONV_CHAN_COUNT(cad, ch->io[i], 1), cad); 3563 hdac_command(sc, 3564 HDA_CMD_SET_HDMI_CHAN_SLOT(cad, ch->io[i], 0x00), cad); 3565 hdac_command(sc, 3566 HDA_CMD_SET_HDMI_CHAN_SLOT(cad, ch->io[i], 0x11), cad); 3567 #endif 3568 chn += HDA_PARAM_AUDIO_WIDGET_CAP_CC(w->param.widget_cap) + 1; 3569 } 3570 } 3571 3572 /* 3573 * Greatest Common Divisor. 3574 */ 3575 static unsigned 3576 gcd(unsigned a, unsigned b) 3577 { 3578 u_int c; 3579 3580 while (b != 0) { 3581 c = a; 3582 a = b; 3583 b = (c % b); 3584 } 3585 return (a); 3586 } 3587 3588 /* 3589 * Least Common Multiple. 3590 */ 3591 static unsigned 3592 lcm(unsigned a, unsigned b) 3593 { 3594 3595 return ((a * b) / gcd(a, b)); 3596 } 3597 3598 static int 3599 hdac_channel_setfragments(kobj_t obj, void *data, 3600 uint32_t blksz, uint32_t blkcnt) 3601 { 3602 struct hdac_chan *ch = data; 3603 struct hdac_softc *sc = ch->devinfo->codec->sc; 3604 3605 blksz -= blksz % lcm(HDAC_DMA_ALIGNMENT, sndbuf_getalign(ch->b)); 3606 3607 if (blksz > (sndbuf_getmaxsize(ch->b) / HDA_BDL_MIN)) 3608 blksz = sndbuf_getmaxsize(ch->b) / HDA_BDL_MIN; 3609 if (blksz < HDA_BLK_MIN) 3610 blksz = HDA_BLK_MIN; 3611 if (blkcnt > HDA_BDL_MAX) 3612 blkcnt = HDA_BDL_MAX; 3613 if (blkcnt < HDA_BDL_MIN) 3614 blkcnt = HDA_BDL_MIN; 3615 3616 while ((blksz * blkcnt) > sndbuf_getmaxsize(ch->b)) { 3617 if ((blkcnt >> 1) >= HDA_BDL_MIN) 3618 blkcnt >>= 1; 3619 else if ((blksz >> 1) >= HDA_BLK_MIN) 3620 blksz >>= 1; 3621 else 3622 break; 3623 } 3624 3625 if ((sndbuf_getblksz(ch->b) != blksz || 3626 sndbuf_getblkcnt(ch->b) != blkcnt) && 3627 sndbuf_resize(ch->b, blkcnt, blksz) != 0) 3628 device_printf(sc->dev, "%s: failed blksz=%u blkcnt=%u\n", 3629 __func__, blksz, blkcnt); 3630 3631 ch->blksz = sndbuf_getblksz(ch->b); 3632 ch->blkcnt = sndbuf_getblkcnt(ch->b); 3633 3634 return (0); 3635 } 3636 3637 static uint32_t 3638 hdac_channel_setblocksize(kobj_t obj, void *data, uint32_t blksz) 3639 { 3640 struct hdac_chan *ch = data; 3641 3642 hdac_channel_setfragments(obj, data, blksz, ch->pdevinfo->chan_blkcnt); 3643 3644 return (ch->blksz); 3645 } 3646 3647 static void 3648 hdac_channel_stop(struct hdac_softc *sc, struct hdac_chan *ch) 3649 { 3650 struct hdac_devinfo *devinfo = ch->devinfo; 3651 struct hdac_widget *w; 3652 nid_t cad = devinfo->codec->cad; 3653 int i; 3654 3655 hdac_stream_stop(ch); 3656 3657 for (i = 0; ch->io[i] != -1; i++) { 3658 w = hdac_widget_get(ch->devinfo, ch->io[i]); 3659 if (w == NULL) 3660 continue; 3661 if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) { 3662 hdac_command(sc, 3663 HDA_CMD_SET_DIGITAL_CONV_FMT1(cad, ch->io[i], 0), 3664 cad); 3665 } 3666 hdac_command(sc, 3667 HDA_CMD_SET_CONV_STREAM_CHAN(cad, ch->io[i], 3668 0), cad); 3669 } 3670 } 3671 3672 static void 3673 hdac_channel_start(struct hdac_softc *sc, struct hdac_chan *ch) 3674 { 3675 ch->ptr = 0; 3676 ch->prevptr = 0; 3677 hdac_stream_stop(ch); 3678 hdac_stream_reset(ch); 3679 hdac_bdl_setup(ch); 3680 hdac_stream_setid(ch); 3681 hdac_stream_setup(ch); 3682 hdac_stream_start(ch); 3683 } 3684 3685 static int 3686 hdac_channel_trigger(kobj_t obj, void *data, int go) 3687 { 3688 struct hdac_chan *ch = data; 3689 struct hdac_softc *sc = ch->devinfo->codec->sc; 3690 3691 if (!PCMTRIG_COMMON(go)) 3692 return (0); 3693 3694 hdac_lock(sc); 3695 switch (go) { 3696 case PCMTRIG_START: 3697 hdac_channel_start(sc, ch); 3698 break; 3699 case PCMTRIG_STOP: 3700 case PCMTRIG_ABORT: 3701 hdac_channel_stop(sc, ch); 3702 break; 3703 default: 3704 break; 3705 } 3706 hdac_unlock(sc); 3707 3708 return (0); 3709 } 3710 3711 static uint32_t 3712 hdac_channel_getptr(kobj_t obj, void *data) 3713 { 3714 struct hdac_chan *ch = data; 3715 struct hdac_softc *sc = ch->devinfo->codec->sc; 3716 uint32_t ptr; 3717 3718 hdac_lock(sc); 3719 if (sc->polling != 0) 3720 ptr = ch->ptr; 3721 else if (ch->dmapos != NULL) 3722 ptr = *(ch->dmapos); 3723 else 3724 ptr = HDAC_READ_4(&sc->mem, ch->off + HDAC_SDLPIB); 3725 hdac_unlock(sc); 3726 3727 /* 3728 * Round to available space and force 128 bytes aligment. 3729 */ 3730 ptr %= ch->blksz * ch->blkcnt; 3731 ptr &= HDA_BLK_ALIGN; 3732 3733 return (ptr); 3734 } 3735 3736 static struct pcmchan_caps * 3737 hdac_channel_getcaps(kobj_t obj, void *data) 3738 { 3739 return (&((struct hdac_chan *)data)->caps); 3740 } 3741 3742 static kobj_method_t hdac_channel_methods[] = { 3743 KOBJMETHOD(channel_init, hdac_channel_init), 3744 KOBJMETHOD(channel_setformat, hdac_channel_setformat), 3745 KOBJMETHOD(channel_setspeed, hdac_channel_setspeed), 3746 KOBJMETHOD(channel_setblocksize, hdac_channel_setblocksize), 3747 KOBJMETHOD(channel_setfragments, hdac_channel_setfragments), 3748 KOBJMETHOD(channel_trigger, hdac_channel_trigger), 3749 KOBJMETHOD(channel_getptr, hdac_channel_getptr), 3750 KOBJMETHOD(channel_getcaps, hdac_channel_getcaps), 3751 KOBJMETHOD_END 3752 }; 3753 CHANNEL_DECLARE(hdac_channel); 3754 3755 static int 3756 hdac_audio_ctl_ossmixer_init(struct snd_mixer *m) 3757 { 3758 struct hdac_pcm_devinfo *pdevinfo = mix_getdevinfo(m); 3759 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 3760 struct hdac_softc *sc = devinfo->codec->sc; 3761 struct hdac_widget *w, *cw; 3762 struct hdac_audio_ctl *ctl; 3763 uint32_t mask, recmask, id; 3764 int i, j, softpcmvol; 3765 3766 hdac_lock(sc); 3767 3768 /* Make sure that in case of soft volume it won't stay muted. */ 3769 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { 3770 pdevinfo->left[i] = 100; 3771 pdevinfo->right[i] = 100; 3772 } 3773 3774 mask = 0; 3775 recmask = 0; 3776 id = hdac_codec_id(devinfo->codec); 3777 3778 /* Declate EAPD as ogain control. */ 3779 if (pdevinfo->play >= 0) { 3780 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 3781 w = hdac_widget_get(devinfo, i); 3782 if (w == NULL || w->enable == 0) 3783 continue; 3784 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX || 3785 w->param.eapdbtl == HDAC_INVALID || 3786 w->bindas != sc->chans[pdevinfo->play].as) 3787 continue; 3788 mask |= SOUND_MASK_OGAIN; 3789 break; 3790 } 3791 } 3792 3793 /* Declare volume controls assigned to this association. */ 3794 i = 0; 3795 ctl = NULL; 3796 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 3797 if (ctl->enable == 0) 3798 continue; 3799 if ((pdevinfo->play >= 0 && 3800 ctl->widget->bindas == sc->chans[pdevinfo->play].as) || 3801 (pdevinfo->rec >= 0 && 3802 ctl->widget->bindas == sc->chans[pdevinfo->rec].as) || 3803 (ctl->widget->bindas == -2 && pdevinfo->index == 0)) 3804 mask |= ctl->ossmask; 3805 } 3806 3807 /* Declare record sources available to this association. */ 3808 if (pdevinfo->rec >= 0) { 3809 struct hdac_chan *ch = &sc->chans[pdevinfo->rec]; 3810 for (i = 0; ch->io[i] != -1; i++) { 3811 w = hdac_widget_get(devinfo, ch->io[i]); 3812 if (w == NULL || w->enable == 0) 3813 continue; 3814 for (j = 0; j < w->nconns; j++) { 3815 if (w->connsenable[j] == 0) 3816 continue; 3817 cw = hdac_widget_get(devinfo, w->conns[j]); 3818 if (cw == NULL || cw->enable == 0) 3819 continue; 3820 if (cw->bindas != sc->chans[pdevinfo->rec].as && 3821 cw->bindas != -2) 3822 continue; 3823 recmask |= cw->ossmask; 3824 } 3825 } 3826 } 3827 3828 /* Declare soft PCM volume if needed. */ 3829 if (pdevinfo->play >= 0) { 3830 ctl = NULL; 3831 if ((mask & SOUND_MASK_PCM) == 0 || 3832 (devinfo->function.audio.quirks & HDA_QUIRK_SOFTPCMVOL)) { 3833 softpcmvol = 1; 3834 mask |= SOUND_MASK_PCM; 3835 } else { 3836 softpcmvol = 0; 3837 i = 0; 3838 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 3839 if (ctl->enable == 0) 3840 continue; 3841 if (ctl->widget->bindas != sc->chans[pdevinfo->play].as && 3842 (ctl->widget->bindas != -2 || pdevinfo->index != 0)) 3843 continue; 3844 if (!(ctl->ossmask & SOUND_MASK_PCM)) 3845 continue; 3846 if (ctl->step > 0) 3847 break; 3848 } 3849 } 3850 3851 if (softpcmvol == 1 || ctl == NULL) { 3852 pcm_setflags(pdevinfo->dev, pcm_getflags(pdevinfo->dev) | SD_F_SOFTPCMVOL); 3853 HDA_BOOTVERBOSE( 3854 device_printf(pdevinfo->dev, 3855 "%s Soft PCM volume\n", 3856 (softpcmvol == 1) ? "Forcing" : "Enabling"); 3857 ); 3858 } 3859 } 3860 3861 /* Declare master volume if needed. */ 3862 if (pdevinfo->play >= 0) { 3863 if ((mask & (SOUND_MASK_VOLUME | SOUND_MASK_PCM)) == 3864 SOUND_MASK_PCM) { 3865 mask |= SOUND_MASK_VOLUME; 3866 mix_setparentchild(m, SOUND_MIXER_VOLUME, 3867 SOUND_MASK_PCM); 3868 mix_setrealdev(m, SOUND_MIXER_VOLUME, 3869 SOUND_MIXER_NONE); 3870 HDA_BOOTVERBOSE( 3871 device_printf(pdevinfo->dev, 3872 "Forcing master volume with PCM\n"); 3873 ); 3874 } 3875 } 3876 3877 recmask &= (1 << SOUND_MIXER_NRDEVICES) - 1; 3878 mask &= (1 << SOUND_MIXER_NRDEVICES) - 1; 3879 3880 mix_setrecdevs(m, recmask); 3881 mix_setdevs(m, mask); 3882 3883 hdac_unlock(sc); 3884 3885 return (0); 3886 } 3887 3888 static int 3889 hdac_audio_ctl_ossmixer_set(struct snd_mixer *m, unsigned dev, 3890 unsigned left, unsigned right) 3891 { 3892 struct hdac_pcm_devinfo *pdevinfo = mix_getdevinfo(m); 3893 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 3894 struct hdac_softc *sc = devinfo->codec->sc; 3895 struct hdac_widget *w; 3896 struct hdac_audio_ctl *ctl; 3897 uint32_t mute; 3898 int lvol, rvol; 3899 int i, j; 3900 3901 hdac_lock(sc); 3902 /* Save new values. */ 3903 pdevinfo->left[dev] = left; 3904 pdevinfo->right[dev] = right; 3905 3906 /* 'ogain' is the special case implemented with EAPD. */ 3907 if (dev == SOUND_MIXER_OGAIN) { 3908 uint32_t orig; 3909 w = NULL; 3910 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 3911 w = hdac_widget_get(devinfo, i); 3912 if (w == NULL || w->enable == 0) 3913 continue; 3914 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX || 3915 w->param.eapdbtl == HDAC_INVALID) 3916 continue; 3917 break; 3918 } 3919 if (i >= devinfo->endnode) { 3920 hdac_unlock(sc); 3921 return (-1); 3922 } 3923 orig = w->param.eapdbtl; 3924 if (left == 0) 3925 w->param.eapdbtl &= ~HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD; 3926 else 3927 w->param.eapdbtl |= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD; 3928 if (orig != w->param.eapdbtl) { 3929 uint32_t val; 3930 3931 val = w->param.eapdbtl; 3932 if (devinfo->function.audio.quirks & HDA_QUIRK_EAPDINV) 3933 val ^= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD; 3934 hdac_command(sc, 3935 HDA_CMD_SET_EAPD_BTL_ENABLE(devinfo->codec->cad, 3936 w->nid, val), devinfo->codec->cad); 3937 } 3938 hdac_unlock(sc); 3939 return (left | (left << 8)); 3940 } 3941 3942 /* Recalculate all controls related to this OSS device. */ 3943 i = 0; 3944 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 3945 if (ctl->enable == 0 || 3946 !(ctl->ossmask & (1 << dev))) 3947 continue; 3948 if (!((pdevinfo->play >= 0 && 3949 ctl->widget->bindas == sc->chans[pdevinfo->play].as) || 3950 (pdevinfo->rec >= 0 && 3951 ctl->widget->bindas == sc->chans[pdevinfo->rec].as) || 3952 ctl->widget->bindas == -2)) 3953 continue; 3954 3955 lvol = 100; 3956 rvol = 100; 3957 for (j = 0; j < SOUND_MIXER_NRDEVICES; j++) { 3958 if (ctl->ossmask & (1 << j)) { 3959 lvol = lvol * pdevinfo->left[j] / 100; 3960 rvol = rvol * pdevinfo->right[j] / 100; 3961 } 3962 } 3963 mute = (lvol == 0) ? HDA_AMP_MUTE_LEFT : 0; 3964 mute |= (rvol == 0) ? HDA_AMP_MUTE_RIGHT : 0; 3965 lvol = (lvol * ctl->step + 50) / 100; 3966 rvol = (rvol * ctl->step + 50) / 100; 3967 hdac_audio_ctl_amp_set(ctl, mute, lvol, rvol); 3968 } 3969 hdac_unlock(sc); 3970 3971 return (left | (right << 8)); 3972 } 3973 3974 /* 3975 * Commutate specified record source. 3976 */ 3977 static uint32_t 3978 hdac_audio_ctl_recsel_comm(struct hdac_pcm_devinfo *pdevinfo, uint32_t src, nid_t nid, int depth) 3979 { 3980 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 3981 struct hdac_widget *w, *cw; 3982 struct hdac_audio_ctl *ctl; 3983 char buf[64]; 3984 int i, muted; 3985 uint32_t res = 0; 3986 3987 if (depth > HDA_PARSE_MAXDEPTH) 3988 return (0); 3989 3990 w = hdac_widget_get(devinfo, nid); 3991 if (w == NULL || w->enable == 0) 3992 return (0); 3993 3994 for (i = 0; i < w->nconns; i++) { 3995 if (w->connsenable[i] == 0) 3996 continue; 3997 cw = hdac_widget_get(devinfo, w->conns[i]); 3998 if (cw == NULL || cw->enable == 0 || cw->bindas == -1) 3999 continue; 4000 /* Call recursively to trace signal to it's source if needed. */ 4001 if ((src & cw->ossmask) != 0) { 4002 if (cw->ossdev < 0) { 4003 res |= hdac_audio_ctl_recsel_comm(pdevinfo, src, 4004 w->conns[i], depth + 1); 4005 } else { 4006 res |= cw->ossmask; 4007 } 4008 } 4009 /* We have two special cases: mixers and others (selectors). */ 4010 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) { 4011 ctl = hdac_audio_ctl_amp_get(devinfo, 4012 w->nid, HDA_CTL_IN, i, 1); 4013 if (ctl == NULL) 4014 continue; 4015 /* If we have input control on this node mute them 4016 * according to requested sources. */ 4017 muted = (src & cw->ossmask) ? 0 : 1; 4018 if (muted != ctl->forcemute) { 4019 ctl->forcemute = muted; 4020 hdac_audio_ctl_amp_set(ctl, 4021 HDA_AMP_MUTE_DEFAULT, 4022 HDA_AMP_VOL_DEFAULT, HDA_AMP_VOL_DEFAULT); 4023 } 4024 HDA_BOOTHVERBOSE( 4025 device_printf(pdevinfo->dev, 4026 "Recsel (%s): nid %d source %d %s\n", 4027 hdac_audio_ctl_ossmixer_mask2allname( 4028 src, buf, sizeof(buf)), 4029 nid, i, muted?"mute":"unmute"); 4030 ); 4031 } else { 4032 if (w->nconns == 1) 4033 break; 4034 if ((src & cw->ossmask) == 0) 4035 continue; 4036 /* If we found requested source - select it and exit. */ 4037 hdac_widget_connection_select(w, i); 4038 HDA_BOOTHVERBOSE( 4039 device_printf(pdevinfo->dev, 4040 "Recsel (%s): nid %d source %d select\n", 4041 hdac_audio_ctl_ossmixer_mask2allname( 4042 src, buf, sizeof(buf)), 4043 nid, i); 4044 ); 4045 break; 4046 } 4047 } 4048 return (res); 4049 } 4050 4051 static uint32_t 4052 hdac_audio_ctl_ossmixer_setrecsrc(struct snd_mixer *m, uint32_t src) 4053 { 4054 struct hdac_pcm_devinfo *pdevinfo = mix_getdevinfo(m); 4055 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 4056 struct hdac_widget *w; 4057 struct hdac_softc *sc = devinfo->codec->sc; 4058 struct hdac_chan *ch; 4059 int i; 4060 uint32_t ret = 0xffffffff; 4061 4062 hdac_lock(sc); 4063 4064 /* Commutate requested recsrc for each ADC. */ 4065 ch = &sc->chans[pdevinfo->rec]; 4066 for (i = 0; ch->io[i] != -1; i++) { 4067 w = hdac_widget_get(devinfo, ch->io[i]); 4068 if (w == NULL || w->enable == 0) 4069 continue; 4070 ret &= hdac_audio_ctl_recsel_comm(pdevinfo, src, ch->io[i], 0); 4071 } 4072 4073 hdac_unlock(sc); 4074 4075 return ((ret == 0xffffffff)? 0 : ret); 4076 } 4077 4078 static kobj_method_t hdac_audio_ctl_ossmixer_methods[] = { 4079 KOBJMETHOD(mixer_init, hdac_audio_ctl_ossmixer_init), 4080 KOBJMETHOD(mixer_set, hdac_audio_ctl_ossmixer_set), 4081 KOBJMETHOD(mixer_setrecsrc, hdac_audio_ctl_ossmixer_setrecsrc), 4082 KOBJMETHOD_END 4083 }; 4084 MIXER_DECLARE(hdac_audio_ctl_ossmixer); 4085 4086 static void 4087 hdac_unsolq_task(void *context, int pending) 4088 { 4089 struct hdac_softc *sc; 4090 4091 sc = (struct hdac_softc *)context; 4092 4093 hdac_lock(sc); 4094 hdac_unsolq_flush(sc); 4095 hdac_unlock(sc); 4096 } 4097 4098 /**************************************************************************** 4099 * int hdac_attach(device_t) 4100 * 4101 * Attach the device into the kernel. Interrupts usually won't be enabled 4102 * when this function is called. Setup everything that doesn't require 4103 * interrupts and defer probing of codecs until interrupts are enabled. 4104 ****************************************************************************/ 4105 static int 4106 hdac_attach(device_t dev) 4107 { 4108 struct hdac_softc *sc; 4109 int result; 4110 int i, devid = -1; 4111 uint32_t model; 4112 uint16_t class, subclass; 4113 uint16_t vendor; 4114 uint8_t v; 4115 4116 device_printf(dev, "HDA Driver Revision: %s\n", HDA_DRV_TEST_REV); 4117 4118 model = (uint32_t)pci_get_device(dev) << 16; 4119 model |= (uint32_t)pci_get_vendor(dev) & 0x0000ffff; 4120 class = pci_get_class(dev); 4121 subclass = pci_get_subclass(dev); 4122 4123 for (i = 0; i < HDAC_DEVICES_LEN; i++) { 4124 if (hdac_devices[i].model == model) { 4125 devid = i; 4126 break; 4127 } 4128 if (HDA_DEV_MATCH(hdac_devices[i].model, model) && 4129 class == PCIC_MULTIMEDIA && 4130 subclass == PCIS_MULTIMEDIA_HDA) { 4131 devid = i; 4132 break; 4133 } 4134 } 4135 4136 sc = device_get_softc(dev); 4137 sc->lock = snd_mtxcreate(device_get_nameunit(dev), HDAC_MTX_NAME); 4138 sc->dev = dev; 4139 sc->pci_subvendor = (uint32_t)pci_get_subdevice(sc->dev) << 16; 4140 sc->pci_subvendor |= (uint32_t)pci_get_subvendor(sc->dev) & 0x0000ffff; 4141 vendor = pci_get_vendor(dev); 4142 4143 if (sc->pci_subvendor == HP_NX6325_SUBVENDORX) { 4144 /* Screw nx6325 - subdevice/subvendor swapped */ 4145 sc->pci_subvendor = HP_NX6325_SUBVENDOR; 4146 } 4147 4148 callout_init(&sc->poll_hda, CALLOUT_MPSAFE); 4149 callout_init(&sc->poll_hdac, CALLOUT_MPSAFE); 4150 callout_init(&sc->poll_jack, CALLOUT_MPSAFE); 4151 4152 TASK_INIT(&sc->unsolq_task, 0, hdac_unsolq_task, sc); 4153 4154 sc->poll_ticks = 1000000; 4155 sc->poll_ival = HDAC_POLL_INTERVAL; 4156 if (resource_int_value(device_get_name(dev), 4157 device_get_unit(dev), "polling", &i) == 0 && i != 0) 4158 sc->polling = 1; 4159 else 4160 sc->polling = 0; 4161 4162 sc->hdabus = NULL; 4163 for (i = 0; i < HDAC_CODEC_MAX; i++) 4164 sc->codecs[i] = NULL; 4165 4166 pci_enable_busmaster(dev); 4167 4168 if (vendor == INTEL_VENDORID) { 4169 /* TCSEL -> TC0 */ 4170 v = pci_read_config(dev, 0x44, 1); 4171 pci_write_config(dev, 0x44, v & 0xf8, 1); 4172 HDA_BOOTHVERBOSE( 4173 device_printf(dev, "TCSEL: 0x%02d -> 0x%02d\n", v, 4174 pci_read_config(dev, 0x44, 1)); 4175 ); 4176 } 4177 4178 if (devid >= 0 && (hdac_devices[devid].flags & HDAC_NO_MSI)) 4179 sc->flags &= ~HDAC_F_MSI; 4180 else 4181 sc->flags |= HDAC_F_MSI; 4182 if (resource_int_value(device_get_name(dev), 4183 device_get_unit(dev), "msi", &i) == 0) { 4184 if (i == 0) 4185 sc->flags &= ~HDAC_F_MSI; 4186 else 4187 sc->flags |= HDAC_F_MSI; 4188 } 4189 4190 #if defined(__i386__) || defined(__amd64__) 4191 sc->flags |= HDAC_F_DMA_NOCACHE; 4192 4193 if (resource_int_value(device_get_name(dev), 4194 device_get_unit(dev), "snoop", &i) == 0 && i != 0) { 4195 #else 4196 sc->flags &= ~HDAC_F_DMA_NOCACHE; 4197 #endif 4198 /* 4199 * Try to enable PCIe snoop to avoid messing around with 4200 * uncacheable DMA attribute. Since PCIe snoop register 4201 * config is pretty much vendor specific, there are no 4202 * general solutions on how to enable it, forcing us (even 4203 * Microsoft) to enable uncacheable or write combined DMA 4204 * by default. 4205 * 4206 * http://msdn2.microsoft.com/en-us/library/ms790324.aspx 4207 */ 4208 for (i = 0; i < HDAC_PCIESNOOP_LEN; i++) { 4209 if (hdac_pcie_snoop[i].vendor != vendor) 4210 continue; 4211 sc->flags &= ~HDAC_F_DMA_NOCACHE; 4212 if (hdac_pcie_snoop[i].reg == 0x00) 4213 break; 4214 v = pci_read_config(dev, hdac_pcie_snoop[i].reg, 1); 4215 if ((v & hdac_pcie_snoop[i].enable) == 4216 hdac_pcie_snoop[i].enable) 4217 break; 4218 v &= hdac_pcie_snoop[i].mask; 4219 v |= hdac_pcie_snoop[i].enable; 4220 pci_write_config(dev, hdac_pcie_snoop[i].reg, v, 1); 4221 v = pci_read_config(dev, hdac_pcie_snoop[i].reg, 1); 4222 if ((v & hdac_pcie_snoop[i].enable) != 4223 hdac_pcie_snoop[i].enable) { 4224 HDA_BOOTVERBOSE( 4225 device_printf(dev, 4226 "WARNING: Failed to enable PCIe " 4227 "snoop!\n"); 4228 ); 4229 #if defined(__i386__) || defined(__amd64__) 4230 sc->flags |= HDAC_F_DMA_NOCACHE; 4231 #endif 4232 } 4233 break; 4234 } 4235 #if defined(__i386__) || defined(__amd64__) 4236 } 4237 #endif 4238 4239 HDA_BOOTHVERBOSE( 4240 device_printf(dev, "DMA Coherency: %s / vendor=0x%04x\n", 4241 (sc->flags & HDAC_F_DMA_NOCACHE) ? 4242 "Uncacheable" : "PCIe snoop", vendor); 4243 ); 4244 4245 /* Allocate resources */ 4246 result = hdac_mem_alloc(sc); 4247 if (result != 0) 4248 goto hdac_attach_fail; 4249 result = hdac_irq_alloc(sc); 4250 if (result != 0) 4251 goto hdac_attach_fail; 4252 4253 /* Get Capabilities */ 4254 result = hdac_get_capabilities(sc); 4255 if (result != 0) 4256 goto hdac_attach_fail; 4257 4258 if (devid >= 0 && (hdac_devices[devid].flags & HDAC_NO_64BIT)) 4259 sc->support_64bit = 0; 4260 4261 /* Allocate CORB and RIRB dma memory */ 4262 result = hdac_dma_alloc(sc, &sc->corb_dma, 4263 sc->corb_size * sizeof(uint32_t)); 4264 if (result != 0) 4265 goto hdac_attach_fail; 4266 result = hdac_dma_alloc(sc, &sc->rirb_dma, 4267 sc->rirb_size * sizeof(struct hdac_rirb)); 4268 if (result != 0) 4269 goto hdac_attach_fail; 4270 4271 result = bus_dma_tag_create( 4272 bus_get_dma_tag(sc->dev), /* parent */ 4273 HDAC_DMA_ALIGNMENT, /* alignment */ 4274 0, /* boundary */ 4275 (sc->support_64bit) ? BUS_SPACE_MAXADDR : 4276 BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ 4277 BUS_SPACE_MAXADDR, /* highaddr */ 4278 NULL, /* filtfunc */ 4279 NULL, /* fistfuncarg */ 4280 HDA_BUFSZ_MAX, /* maxsize */ 4281 1, /* nsegments */ 4282 HDA_BUFSZ_MAX, /* maxsegsz */ 4283 0, /* flags */ 4284 NULL, /* lockfunc */ 4285 NULL, /* lockfuncarg */ 4286 &sc->chan_dmat); /* dmat */ 4287 if (result != 0) { 4288 device_printf(dev, "%s: bus_dma_tag_create failed (%x)\n", 4289 __func__, result); 4290 goto hdac_attach_fail; 4291 } 4292 4293 /* Quiesce everything */ 4294 HDA_BOOTHVERBOSE( 4295 device_printf(dev, "Reset controller...\n"); 4296 ); 4297 hdac_reset(sc, 1); 4298 4299 /* Initialize the CORB and RIRB */ 4300 hdac_corb_init(sc); 4301 hdac_rirb_init(sc); 4302 4303 /* Defer remaining of initialization until interrupts are enabled */ 4304 sc->intrhook.ich_func = hdac_attach2; 4305 sc->intrhook.ich_arg = (void *)sc; 4306 if (cold == 0 || config_intrhook_establish(&sc->intrhook) != 0) { 4307 sc->intrhook.ich_func = NULL; 4308 hdac_attach2((void *)sc); 4309 } 4310 4311 return (0); 4312 4313 hdac_attach_fail: 4314 hdac_irq_free(sc); 4315 hdac_dma_free(sc, &sc->rirb_dma); 4316 hdac_dma_free(sc, &sc->corb_dma); 4317 hdac_mem_free(sc); 4318 snd_mtxfree(sc->lock); 4319 4320 return (ENXIO); 4321 } 4322 4323 static void 4324 hdac_audio_parse(struct hdac_devinfo *devinfo) 4325 { 4326 struct hdac_codec *codec = devinfo->codec; 4327 struct hdac_softc *sc = codec->sc; 4328 struct hdac_widget *w; 4329 uint32_t res; 4330 int i; 4331 nid_t cad, nid; 4332 4333 cad = devinfo->codec->cad; 4334 nid = devinfo->nid; 4335 4336 res = hdac_command(sc, 4337 HDA_CMD_GET_PARAMETER(cad , nid, HDA_PARAM_GPIO_COUNT), cad); 4338 devinfo->function.audio.gpio = res; 4339 4340 HDA_BOOTVERBOSE( 4341 device_printf(sc->dev, "GPIO: 0x%08x " 4342 "NumGPIO=%d NumGPO=%d " 4343 "NumGPI=%d GPIWake=%d GPIUnsol=%d\n", 4344 devinfo->function.audio.gpio, 4345 HDA_PARAM_GPIO_COUNT_NUM_GPIO(devinfo->function.audio.gpio), 4346 HDA_PARAM_GPIO_COUNT_NUM_GPO(devinfo->function.audio.gpio), 4347 HDA_PARAM_GPIO_COUNT_NUM_GPI(devinfo->function.audio.gpio), 4348 HDA_PARAM_GPIO_COUNT_GPI_WAKE(devinfo->function.audio.gpio), 4349 HDA_PARAM_GPIO_COUNT_GPI_UNSOL(devinfo->function.audio.gpio)); 4350 ); 4351 4352 res = hdac_command(sc, 4353 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_SUPP_STREAM_FORMATS), 4354 cad); 4355 devinfo->function.audio.supp_stream_formats = res; 4356 4357 res = hdac_command(sc, 4358 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_SUPP_PCM_SIZE_RATE), 4359 cad); 4360 devinfo->function.audio.supp_pcm_size_rate = res; 4361 4362 res = hdac_command(sc, 4363 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_OUTPUT_AMP_CAP), 4364 cad); 4365 devinfo->function.audio.outamp_cap = res; 4366 4367 res = hdac_command(sc, 4368 HDA_CMD_GET_PARAMETER(cad, nid, HDA_PARAM_INPUT_AMP_CAP), 4369 cad); 4370 devinfo->function.audio.inamp_cap = res; 4371 4372 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 4373 w = hdac_widget_get(devinfo, i); 4374 if (w == NULL) 4375 device_printf(sc->dev, "Ghost widget! nid=%d!\n", i); 4376 else { 4377 w->devinfo = devinfo; 4378 w->nid = i; 4379 w->enable = 1; 4380 w->selconn = -1; 4381 w->pflags = 0; 4382 w->ossdev = -1; 4383 w->bindas = -1; 4384 w->param.eapdbtl = HDAC_INVALID; 4385 hdac_widget_parse(w); 4386 } 4387 } 4388 } 4389 4390 static void 4391 hdac_audio_ctl_parse(struct hdac_devinfo *devinfo) 4392 { 4393 struct hdac_softc *sc = devinfo->codec->sc; 4394 struct hdac_audio_ctl *ctls; 4395 struct hdac_widget *w, *cw; 4396 int i, j, cnt, max, ocap, icap; 4397 int mute, offset, step, size; 4398 4399 /* XXX This is redundant */ 4400 max = 0; 4401 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 4402 w = hdac_widget_get(devinfo, i); 4403 if (w == NULL || w->enable == 0) 4404 continue; 4405 if (w->param.outamp_cap != 0) 4406 max++; 4407 if (w->param.inamp_cap != 0) { 4408 switch (w->type) { 4409 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR: 4410 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER: 4411 for (j = 0; j < w->nconns; j++) { 4412 cw = hdac_widget_get(devinfo, 4413 w->conns[j]); 4414 if (cw == NULL || cw->enable == 0) 4415 continue; 4416 max++; 4417 } 4418 break; 4419 default: 4420 max++; 4421 break; 4422 } 4423 } 4424 } 4425 4426 devinfo->function.audio.ctlcnt = max; 4427 4428 if (max < 1) 4429 return; 4430 4431 ctls = (struct hdac_audio_ctl *)malloc( 4432 sizeof(*ctls) * max, M_HDAC, M_ZERO | M_NOWAIT); 4433 4434 if (ctls == NULL) { 4435 /* Blekh! */ 4436 device_printf(sc->dev, "unable to allocate ctls!\n"); 4437 devinfo->function.audio.ctlcnt = 0; 4438 return; 4439 } 4440 4441 cnt = 0; 4442 for (i = devinfo->startnode; cnt < max && i < devinfo->endnode; i++) { 4443 if (cnt >= max) { 4444 device_printf(sc->dev, "%s: Ctl overflow!\n", 4445 __func__); 4446 break; 4447 } 4448 w = hdac_widget_get(devinfo, i); 4449 if (w == NULL || w->enable == 0) 4450 continue; 4451 ocap = w->param.outamp_cap; 4452 icap = w->param.inamp_cap; 4453 if (ocap != 0) { 4454 mute = HDA_PARAM_OUTPUT_AMP_CAP_MUTE_CAP(ocap); 4455 step = HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS(ocap); 4456 size = HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE(ocap); 4457 offset = HDA_PARAM_OUTPUT_AMP_CAP_OFFSET(ocap); 4458 /*if (offset > step) { 4459 HDA_BOOTVERBOSE( 4460 device_printf(sc->dev, 4461 "BUGGY outamp: nid=%d " 4462 "[offset=%d > step=%d]\n", 4463 w->nid, offset, step); 4464 ); 4465 offset = step; 4466 }*/ 4467 ctls[cnt].enable = 1; 4468 ctls[cnt].widget = w; 4469 ctls[cnt].mute = mute; 4470 ctls[cnt].step = step; 4471 ctls[cnt].size = size; 4472 ctls[cnt].offset = offset; 4473 ctls[cnt].left = offset; 4474 ctls[cnt].right = offset; 4475 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX || 4476 w->waspin) 4477 ctls[cnt].ndir = HDA_CTL_IN; 4478 else 4479 ctls[cnt].ndir = HDA_CTL_OUT; 4480 ctls[cnt++].dir = HDA_CTL_OUT; 4481 } 4482 4483 if (icap != 0) { 4484 mute = HDA_PARAM_OUTPUT_AMP_CAP_MUTE_CAP(icap); 4485 step = HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS(icap); 4486 size = HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE(icap); 4487 offset = HDA_PARAM_OUTPUT_AMP_CAP_OFFSET(icap); 4488 /*if (offset > step) { 4489 HDA_BOOTVERBOSE( 4490 device_printf(sc->dev, 4491 "BUGGY inamp: nid=%d " 4492 "[offset=%d > step=%d]\n", 4493 w->nid, offset, step); 4494 ); 4495 offset = step; 4496 }*/ 4497 switch (w->type) { 4498 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR: 4499 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER: 4500 for (j = 0; j < w->nconns; j++) { 4501 if (cnt >= max) { 4502 device_printf(sc->dev, 4503 "%s: Ctl overflow!\n", 4504 __func__); 4505 break; 4506 } 4507 cw = hdac_widget_get(devinfo, 4508 w->conns[j]); 4509 if (cw == NULL || cw->enable == 0) 4510 continue; 4511 ctls[cnt].enable = 1; 4512 ctls[cnt].widget = w; 4513 ctls[cnt].childwidget = cw; 4514 ctls[cnt].index = j; 4515 ctls[cnt].mute = mute; 4516 ctls[cnt].step = step; 4517 ctls[cnt].size = size; 4518 ctls[cnt].offset = offset; 4519 ctls[cnt].left = offset; 4520 ctls[cnt].right = offset; 4521 ctls[cnt].ndir = HDA_CTL_IN; 4522 ctls[cnt++].dir = HDA_CTL_IN; 4523 } 4524 break; 4525 default: 4526 if (cnt >= max) { 4527 device_printf(sc->dev, 4528 "%s: Ctl overflow!\n", 4529 __func__); 4530 break; 4531 } 4532 ctls[cnt].enable = 1; 4533 ctls[cnt].widget = w; 4534 ctls[cnt].mute = mute; 4535 ctls[cnt].step = step; 4536 ctls[cnt].size = size; 4537 ctls[cnt].offset = offset; 4538 ctls[cnt].left = offset; 4539 ctls[cnt].right = offset; 4540 if (w->type == 4541 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 4542 ctls[cnt].ndir = HDA_CTL_OUT; 4543 else 4544 ctls[cnt].ndir = HDA_CTL_IN; 4545 ctls[cnt++].dir = HDA_CTL_IN; 4546 break; 4547 } 4548 } 4549 } 4550 4551 devinfo->function.audio.ctl = ctls; 4552 } 4553 4554 static void 4555 hdac_audio_as_parse(struct hdac_devinfo *devinfo) 4556 { 4557 struct hdac_softc *sc = devinfo->codec->sc; 4558 struct hdac_audio_as *as; 4559 struct hdac_widget *w; 4560 int i, j, cnt, max, type, dir, assoc, seq, first, hpredir; 4561 4562 /* Count present associations */ 4563 max = 0; 4564 for (j = 1; j < 16; j++) { 4565 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 4566 w = hdac_widget_get(devinfo, i); 4567 if (w == NULL || w->enable == 0) 4568 continue; 4569 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 4570 continue; 4571 if (HDA_CONFIG_DEFAULTCONF_ASSOCIATION(w->wclass.pin.config) 4572 != j) 4573 continue; 4574 max++; 4575 if (j != 15) /* There could be many 1-pin assocs #15 */ 4576 break; 4577 } 4578 } 4579 4580 devinfo->function.audio.ascnt = max; 4581 4582 if (max < 1) 4583 return; 4584 4585 as = (struct hdac_audio_as *)malloc( 4586 sizeof(*as) * max, M_HDAC, M_ZERO | M_NOWAIT); 4587 4588 if (as == NULL) { 4589 /* Blekh! */ 4590 device_printf(sc->dev, "unable to allocate assocs!\n"); 4591 devinfo->function.audio.ascnt = 0; 4592 return; 4593 } 4594 4595 for (i = 0; i < max; i++) { 4596 as[i].hpredir = -1; 4597 as[i].chan = -1; 4598 as[i].digital = 0; 4599 } 4600 4601 /* Scan associations skipping as=0. */ 4602 cnt = 0; 4603 for (j = 1; j < 16; j++) { 4604 first = 16; 4605 hpredir = 0; 4606 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 4607 w = hdac_widget_get(devinfo, i); 4608 if (w == NULL || w->enable == 0) 4609 continue; 4610 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 4611 continue; 4612 assoc = HDA_CONFIG_DEFAULTCONF_ASSOCIATION(w->wclass.pin.config); 4613 seq = HDA_CONFIG_DEFAULTCONF_SEQUENCE(w->wclass.pin.config); 4614 if (assoc != j) { 4615 continue; 4616 } 4617 KASSERT(cnt < max, 4618 ("%s: Associations owerflow (%d of %d)", 4619 __func__, cnt, max)); 4620 type = w->wclass.pin.config & 4621 HDA_CONFIG_DEFAULTCONF_DEVICE_MASK; 4622 /* Get pin direction. */ 4623 if (type == HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_OUT || 4624 type == HDA_CONFIG_DEFAULTCONF_DEVICE_SPEAKER || 4625 type == HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT || 4626 type == HDA_CONFIG_DEFAULTCONF_DEVICE_SPDIF_OUT || 4627 type == HDA_CONFIG_DEFAULTCONF_DEVICE_DIGITAL_OTHER_OUT) 4628 dir = HDA_CTL_OUT; 4629 else 4630 dir = HDA_CTL_IN; 4631 /* If this is a first pin - create new association. */ 4632 if (as[cnt].pincnt == 0) { 4633 as[cnt].enable = 1; 4634 as[cnt].index = j; 4635 as[cnt].dir = dir; 4636 } 4637 if (seq < first) 4638 first = seq; 4639 /* Check association correctness. */ 4640 if (as[cnt].pins[seq] != 0) { 4641 device_printf(sc->dev, "%s: Duplicate pin %d (%d) " 4642 "in association %d! Disabling association.\n", 4643 __func__, seq, w->nid, j); 4644 as[cnt].enable = 0; 4645 } 4646 if (dir != as[cnt].dir) { 4647 device_printf(sc->dev, "%s: Pin %d has wrong " 4648 "direction for association %d! Disabling " 4649 "association.\n", 4650 __func__, w->nid, j); 4651 as[cnt].enable = 0; 4652 } 4653 if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) { 4654 if (HDA_PARAM_PIN_CAP_DP(w->wclass.pin.cap)) 4655 as[cnt].digital = 3; 4656 else if (HDA_PARAM_PIN_CAP_HDMI(w->wclass.pin.cap)) 4657 as[cnt].digital = 2; 4658 else 4659 as[cnt].digital = 1; 4660 } 4661 /* Headphones with seq=15 may mean redirection. */ 4662 if (type == HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT && 4663 seq == 15) 4664 hpredir = 1; 4665 as[cnt].pins[seq] = w->nid; 4666 as[cnt].pincnt++; 4667 /* Association 15 is a multiple unassociated pins. */ 4668 if (j == 15) 4669 cnt++; 4670 } 4671 if (j != 15 && as[cnt].pincnt > 0) { 4672 if (hpredir && as[cnt].pincnt > 1) 4673 as[cnt].hpredir = first; 4674 cnt++; 4675 } 4676 } 4677 HDA_BOOTVERBOSE( 4678 device_printf(sc->dev, 4679 "%d associations found:\n", max); 4680 for (i = 0; i < max; i++) { 4681 device_printf(sc->dev, 4682 "Association %d (%d) %s%s:\n", 4683 i, as[i].index, (as[i].dir == HDA_CTL_IN)?"in":"out", 4684 as[i].enable?"":" (disabled)"); 4685 for (j = 0; j < 16; j++) { 4686 if (as[i].pins[j] == 0) 4687 continue; 4688 device_printf(sc->dev, 4689 " Pin nid=%d seq=%d\n", 4690 as[i].pins[j], j); 4691 } 4692 } 4693 ); 4694 4695 devinfo->function.audio.as = as; 4696 } 4697 4698 static const struct { 4699 uint32_t model; 4700 uint32_t id; 4701 uint32_t set, unset; 4702 } hdac_quirks[] = { 4703 /* 4704 * XXX Force stereo quirk. Monoural recording / playback 4705 * on few codecs (especially ALC880) seems broken or 4706 * perhaps unsupported. 4707 */ 4708 { HDA_MATCH_ALL, HDA_MATCH_ALL, 4709 HDA_QUIRK_FORCESTEREO | HDA_QUIRK_IVREF, 0 }, 4710 { ACER_ALL_SUBVENDOR, HDA_MATCH_ALL, 4711 HDA_QUIRK_GPIO0, 0 }, 4712 { ASUS_G2K_SUBVENDOR, HDA_CODEC_ALC660, 4713 HDA_QUIRK_GPIO0, 0 }, 4714 { ASUS_M5200_SUBVENDOR, HDA_CODEC_ALC880, 4715 HDA_QUIRK_GPIO0, 0 }, 4716 { ASUS_A7M_SUBVENDOR, HDA_CODEC_ALC880, 4717 HDA_QUIRK_GPIO0, 0 }, 4718 { ASUS_A7T_SUBVENDOR, HDA_CODEC_ALC882, 4719 HDA_QUIRK_GPIO0, 0 }, 4720 { ASUS_W2J_SUBVENDOR, HDA_CODEC_ALC882, 4721 HDA_QUIRK_GPIO0, 0 }, 4722 { ASUS_U5F_SUBVENDOR, HDA_CODEC_AD1986A, 4723 HDA_QUIRK_EAPDINV, 0 }, 4724 { ASUS_A8X_SUBVENDOR, HDA_CODEC_AD1986A, 4725 HDA_QUIRK_EAPDINV, 0 }, 4726 { ASUS_F3JC_SUBVENDOR, HDA_CODEC_ALC861, 4727 HDA_QUIRK_OVREF, 0 }, 4728 { UNIWILL_9075_SUBVENDOR, HDA_CODEC_ALC861, 4729 HDA_QUIRK_OVREF, 0 }, 4730 /*{ ASUS_M2N_SUBVENDOR, HDA_CODEC_AD1988, 4731 HDA_QUIRK_IVREF80, HDA_QUIRK_IVREF50 | HDA_QUIRK_IVREF100 },*/ 4732 { MEDION_MD95257_SUBVENDOR, HDA_CODEC_ALC880, 4733 HDA_QUIRK_GPIO1, 0 }, 4734 { LENOVO_3KN100_SUBVENDOR, HDA_CODEC_AD1986A, 4735 HDA_QUIRK_EAPDINV | HDA_QUIRK_SENSEINV, 0 }, 4736 { SAMSUNG_Q1_SUBVENDOR, HDA_CODEC_AD1986A, 4737 HDA_QUIRK_EAPDINV, 0 }, 4738 { APPLE_MB3_SUBVENDOR, HDA_CODEC_ALC885, 4739 HDA_QUIRK_GPIO0 | HDA_QUIRK_OVREF50, 0}, 4740 { APPLE_INTEL_MAC, HDA_CODEC_STAC9221, 4741 HDA_QUIRK_GPIO0 | HDA_QUIRK_GPIO1, 0 }, 4742 { APPLE_MACBOOKPRO55, HDA_CODEC_CS4206, 4743 HDA_QUIRK_GPIO1 | HDA_QUIRK_GPIO3, 0 }, 4744 { DELL_D630_SUBVENDOR, HDA_CODEC_STAC9205X, 4745 HDA_QUIRK_GPIO0, 0 }, 4746 { DELL_V1400_SUBVENDOR, HDA_CODEC_STAC9228X, 4747 HDA_QUIRK_GPIO2, 0 }, 4748 { DELL_V1500_SUBVENDOR, HDA_CODEC_STAC9205X, 4749 HDA_QUIRK_GPIO0, 0 }, 4750 { HDA_MATCH_ALL, HDA_CODEC_AD1988, 4751 HDA_QUIRK_IVREF80, HDA_QUIRK_IVREF50 | HDA_QUIRK_IVREF100 }, 4752 { HDA_MATCH_ALL, HDA_CODEC_AD1988B, 4753 HDA_QUIRK_IVREF80, HDA_QUIRK_IVREF50 | HDA_QUIRK_IVREF100 }, 4754 { HDA_MATCH_ALL, HDA_CODEC_CX20549, 4755 0, HDA_QUIRK_FORCESTEREO } 4756 }; 4757 #define HDAC_QUIRKS_LEN (sizeof(hdac_quirks) / sizeof(hdac_quirks[0])) 4758 4759 static void 4760 hdac_vendor_patch_parse(struct hdac_devinfo *devinfo) 4761 { 4762 struct hdac_widget *w; 4763 uint32_t id, subvendor; 4764 int i; 4765 4766 id = hdac_codec_id(devinfo->codec); 4767 subvendor = devinfo->codec->sc->pci_subvendor; 4768 4769 /* 4770 * Quirks 4771 */ 4772 for (i = 0; i < HDAC_QUIRKS_LEN; i++) { 4773 if (!(HDA_DEV_MATCH(hdac_quirks[i].model, subvendor) && 4774 HDA_DEV_MATCH(hdac_quirks[i].id, id))) 4775 continue; 4776 if (hdac_quirks[i].set != 0) 4777 devinfo->function.audio.quirks |= 4778 hdac_quirks[i].set; 4779 if (hdac_quirks[i].unset != 0) 4780 devinfo->function.audio.quirks &= 4781 ~(hdac_quirks[i].unset); 4782 } 4783 4784 switch (id) { 4785 case HDA_CODEC_AD1983: 4786 /* 4787 * This codec has several possible usages, but none 4788 * fit the parser best. Help parser to choose better. 4789 */ 4790 /* Disable direct unmixed playback to get pcm volume. */ 4791 w = hdac_widget_get(devinfo, 5); 4792 if (w != NULL) 4793 w->connsenable[0] = 0; 4794 w = hdac_widget_get(devinfo, 6); 4795 if (w != NULL) 4796 w->connsenable[0] = 0; 4797 w = hdac_widget_get(devinfo, 11); 4798 if (w != NULL) 4799 w->connsenable[0] = 0; 4800 /* Disable mic and line selectors. */ 4801 w = hdac_widget_get(devinfo, 12); 4802 if (w != NULL) 4803 w->connsenable[1] = 0; 4804 w = hdac_widget_get(devinfo, 13); 4805 if (w != NULL) 4806 w->connsenable[1] = 0; 4807 /* Disable recording from mono playback mix. */ 4808 w = hdac_widget_get(devinfo, 20); 4809 if (w != NULL) 4810 w->connsenable[3] = 0; 4811 break; 4812 case HDA_CODEC_AD1986A: 4813 /* 4814 * This codec has overcomplicated input mixing. 4815 * Make some cleaning there. 4816 */ 4817 /* Disable input mono mixer. Not needed and not supported. */ 4818 w = hdac_widget_get(devinfo, 43); 4819 if (w != NULL) 4820 w->enable = 0; 4821 /* Disable any with any input mixing mesh. Use separately. */ 4822 w = hdac_widget_get(devinfo, 39); 4823 if (w != NULL) 4824 w->enable = 0; 4825 w = hdac_widget_get(devinfo, 40); 4826 if (w != NULL) 4827 w->enable = 0; 4828 w = hdac_widget_get(devinfo, 41); 4829 if (w != NULL) 4830 w->enable = 0; 4831 w = hdac_widget_get(devinfo, 42); 4832 if (w != NULL) 4833 w->enable = 0; 4834 /* Disable duplicate mixer node connector. */ 4835 w = hdac_widget_get(devinfo, 15); 4836 if (w != NULL) 4837 w->connsenable[3] = 0; 4838 /* There is only one mic preamplifier, use it effectively. */ 4839 w = hdac_widget_get(devinfo, 31); 4840 if (w != NULL) { 4841 if ((w->wclass.pin.config & 4842 HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) == 4843 HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN) { 4844 w = hdac_widget_get(devinfo, 16); 4845 if (w != NULL) 4846 w->connsenable[2] = 0; 4847 } else { 4848 w = hdac_widget_get(devinfo, 15); 4849 if (w != NULL) 4850 w->connsenable[0] = 0; 4851 } 4852 } 4853 w = hdac_widget_get(devinfo, 32); 4854 if (w != NULL) { 4855 if ((w->wclass.pin.config & 4856 HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) == 4857 HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN) { 4858 w = hdac_widget_get(devinfo, 16); 4859 if (w != NULL) 4860 w->connsenable[0] = 0; 4861 } else { 4862 w = hdac_widget_get(devinfo, 15); 4863 if (w != NULL) 4864 w->connsenable[1] = 0; 4865 } 4866 } 4867 4868 if (subvendor == ASUS_A8X_SUBVENDOR) { 4869 /* 4870 * This is just plain ridiculous.. There 4871 * are several A8 series that share the same 4872 * pci id but works differently (EAPD). 4873 */ 4874 w = hdac_widget_get(devinfo, 26); 4875 if (w != NULL && w->type == 4876 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && 4877 (w->wclass.pin.config & 4878 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) != 4879 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE) 4880 devinfo->function.audio.quirks &= 4881 ~HDA_QUIRK_EAPDINV; 4882 } 4883 break; 4884 case HDA_CODEC_AD1981HD: 4885 /* 4886 * This codec has very unusual design with several 4887 * points inappropriate for the present parser. 4888 */ 4889 /* Disable recording from mono playback mix. */ 4890 w = hdac_widget_get(devinfo, 21); 4891 if (w != NULL) 4892 w->connsenable[3] = 0; 4893 /* Disable rear to front mic mixer, use separately. */ 4894 w = hdac_widget_get(devinfo, 31); 4895 if (w != NULL) 4896 w->enable = 0; 4897 /* Disable direct playback, use mixer. */ 4898 w = hdac_widget_get(devinfo, 5); 4899 if (w != NULL) 4900 w->connsenable[0] = 0; 4901 w = hdac_widget_get(devinfo, 6); 4902 if (w != NULL) 4903 w->connsenable[0] = 0; 4904 w = hdac_widget_get(devinfo, 9); 4905 if (w != NULL) 4906 w->connsenable[0] = 0; 4907 w = hdac_widget_get(devinfo, 24); 4908 if (w != NULL) 4909 w->connsenable[0] = 0; 4910 break; 4911 } 4912 } 4913 4914 /* 4915 * Trace path from DAC to pin. 4916 */ 4917 static nid_t 4918 hdac_audio_trace_dac(struct hdac_devinfo *devinfo, int as, int seq, nid_t nid, 4919 int dupseq, int min, int only, int depth) 4920 { 4921 struct hdac_widget *w; 4922 int i, im = -1; 4923 nid_t m = 0, ret; 4924 4925 if (depth > HDA_PARSE_MAXDEPTH) 4926 return (0); 4927 w = hdac_widget_get(devinfo, nid); 4928 if (w == NULL || w->enable == 0) 4929 return (0); 4930 HDA_BOOTHVERBOSE( 4931 if (!only) { 4932 device_printf(devinfo->codec->sc->dev, 4933 " %*stracing via nid %d\n", 4934 depth + 1, "", w->nid); 4935 } 4936 ); 4937 /* Use only unused widgets */ 4938 if (w->bindas >= 0 && w->bindas != as) { 4939 HDA_BOOTHVERBOSE( 4940 if (!only) { 4941 device_printf(devinfo->codec->sc->dev, 4942 " %*snid %d busy by association %d\n", 4943 depth + 1, "", w->nid, w->bindas); 4944 } 4945 ); 4946 return (0); 4947 } 4948 if (dupseq < 0) { 4949 if (w->bindseqmask != 0) { 4950 HDA_BOOTHVERBOSE( 4951 if (!only) { 4952 device_printf(devinfo->codec->sc->dev, 4953 " %*snid %d busy by seqmask %x\n", 4954 depth + 1, "", w->nid, w->bindseqmask); 4955 } 4956 ); 4957 return (0); 4958 } 4959 } else { 4960 /* If this is headphones - allow duplicate first pin. */ 4961 if (w->bindseqmask != 0 && 4962 (w->bindseqmask & (1 << dupseq)) == 0) { 4963 HDA_BOOTHVERBOSE( 4964 device_printf(devinfo->codec->sc->dev, 4965 " %*snid %d busy by seqmask %x\n", 4966 depth + 1, "", w->nid, w->bindseqmask); 4967 ); 4968 return (0); 4969 } 4970 } 4971 4972 switch (w->type) { 4973 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT: 4974 /* Do not traverse input. AD1988 has digital monitor 4975 for which we are not ready. */ 4976 break; 4977 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT: 4978 /* If we are tracing HP take only dac of first pin. */ 4979 if ((only == 0 || only == w->nid) && 4980 (w->nid >= min) && (dupseq < 0 || w->nid == 4981 devinfo->function.audio.as[as].dacs[dupseq])) 4982 m = w->nid; 4983 break; 4984 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX: 4985 if (depth > 0) 4986 break; 4987 /* Fall */ 4988 default: 4989 /* Find reachable DACs with smallest nid respecting constraints. */ 4990 for (i = 0; i < w->nconns; i++) { 4991 if (w->connsenable[i] == 0) 4992 continue; 4993 if (w->selconn != -1 && w->selconn != i) 4994 continue; 4995 if ((ret = hdac_audio_trace_dac(devinfo, as, seq, 4996 w->conns[i], dupseq, min, only, depth + 1)) != 0) { 4997 if (m == 0 || ret < m) { 4998 m = ret; 4999 im = i; 5000 } 5001 if (only || dupseq >= 0) 5002 break; 5003 } 5004 } 5005 if (m && only && ((w->nconns > 1 && 5006 w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) || 5007 w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR)) 5008 w->selconn = im; 5009 break; 5010 } 5011 if (m && only) { 5012 w->bindas = as; 5013 w->bindseqmask |= (1 << seq); 5014 } 5015 HDA_BOOTHVERBOSE( 5016 if (!only) { 5017 device_printf(devinfo->codec->sc->dev, 5018 " %*snid %d returned %d\n", 5019 depth + 1, "", w->nid, m); 5020 } 5021 ); 5022 return (m); 5023 } 5024 5025 /* 5026 * Trace path from widget to ADC. 5027 */ 5028 static nid_t 5029 hdac_audio_trace_adc(struct hdac_devinfo *devinfo, int as, int seq, nid_t nid, 5030 int only, int depth) 5031 { 5032 struct hdac_widget *w, *wc; 5033 int i, j; 5034 nid_t res = 0; 5035 5036 if (depth > HDA_PARSE_MAXDEPTH) 5037 return (0); 5038 w = hdac_widget_get(devinfo, nid); 5039 if (w == NULL || w->enable == 0) 5040 return (0); 5041 HDA_BOOTHVERBOSE( 5042 device_printf(devinfo->codec->sc->dev, 5043 " %*stracing via nid %d\n", 5044 depth + 1, "", w->nid); 5045 ); 5046 /* Use only unused widgets */ 5047 if (w->bindas >= 0 && w->bindas != as) { 5048 HDA_BOOTHVERBOSE( 5049 device_printf(devinfo->codec->sc->dev, 5050 " %*snid %d busy by association %d\n", 5051 depth + 1, "", w->nid, w->bindas); 5052 ); 5053 return (0); 5054 } 5055 5056 switch (w->type) { 5057 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT: 5058 /* If we are tracing HP take only dac of first pin. */ 5059 if (only == w->nid) 5060 res = 1; 5061 break; 5062 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX: 5063 if (depth > 0) 5064 break; 5065 /* Fall */ 5066 default: 5067 /* Try to find reachable ADCs with specified nid. */ 5068 for (j = devinfo->startnode; j < devinfo->endnode; j++) { 5069 wc = hdac_widget_get(devinfo, j); 5070 if (wc == NULL || wc->enable == 0) 5071 continue; 5072 for (i = 0; i < wc->nconns; i++) { 5073 if (wc->connsenable[i] == 0) 5074 continue; 5075 if (wc->conns[i] != nid) 5076 continue; 5077 if (hdac_audio_trace_adc(devinfo, as, seq, 5078 j, only, depth + 1) != 0) { 5079 res = 1; 5080 if (((wc->nconns > 1 && 5081 wc->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) || 5082 wc->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR) && 5083 wc->selconn == -1) 5084 wc->selconn = i; 5085 } 5086 } 5087 } 5088 break; 5089 } 5090 if (res) { 5091 w->bindas = as; 5092 w->bindseqmask |= (1 << seq); 5093 } 5094 HDA_BOOTHVERBOSE( 5095 device_printf(devinfo->codec->sc->dev, 5096 " %*snid %d returned %d\n", 5097 depth + 1, "", w->nid, res); 5098 ); 5099 return (res); 5100 } 5101 5102 /* 5103 * Erase trace path of the specified association. 5104 */ 5105 static void 5106 hdac_audio_undo_trace(struct hdac_devinfo *devinfo, int as, int seq) 5107 { 5108 struct hdac_widget *w; 5109 int i; 5110 5111 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5112 w = hdac_widget_get(devinfo, i); 5113 if (w == NULL || w->enable == 0) 5114 continue; 5115 if (w->bindas == as) { 5116 if (seq >= 0) { 5117 w->bindseqmask &= ~(1 << seq); 5118 if (w->bindseqmask == 0) { 5119 w->bindas = -1; 5120 w->selconn = -1; 5121 } 5122 } else { 5123 w->bindas = -1; 5124 w->bindseqmask = 0; 5125 w->selconn = -1; 5126 } 5127 } 5128 } 5129 } 5130 5131 /* 5132 * Trace association path from DAC to output 5133 */ 5134 static int 5135 hdac_audio_trace_as_out(struct hdac_devinfo *devinfo, int as, int seq) 5136 { 5137 struct hdac_audio_as *ases = devinfo->function.audio.as; 5138 int i, hpredir; 5139 nid_t min, res; 5140 5141 /* Find next pin */ 5142 for (i = seq; i < 16 && ases[as].pins[i] == 0; i++) 5143 ; 5144 /* Check if there is no any left. If so - we succeeded. */ 5145 if (i == 16) 5146 return (1); 5147 5148 hpredir = (i == 15 && ases[as].fakeredir == 0)?ases[as].hpredir:-1; 5149 min = 0; 5150 res = 0; 5151 do { 5152 HDA_BOOTHVERBOSE( 5153 device_printf(devinfo->codec->sc->dev, 5154 " Tracing pin %d with min nid %d", 5155 ases[as].pins[i], min); 5156 if (hpredir >= 0) 5157 printf(" and hpredir %d", hpredir); 5158 printf("\n"); 5159 ); 5160 /* Trace this pin taking min nid into account. */ 5161 res = hdac_audio_trace_dac(devinfo, as, i, 5162 ases[as].pins[i], hpredir, min, 0, 0); 5163 if (res == 0) { 5164 /* If we failed - return to previous and redo it. */ 5165 HDA_BOOTVERBOSE( 5166 device_printf(devinfo->codec->sc->dev, 5167 " Unable to trace pin %d seq %d with min " 5168 "nid %d", 5169 ases[as].pins[i], i, min); 5170 if (hpredir >= 0) 5171 printf(" and hpredir %d", hpredir); 5172 printf("\n"); 5173 ); 5174 return (0); 5175 } 5176 HDA_BOOTVERBOSE( 5177 device_printf(devinfo->codec->sc->dev, 5178 " Pin %d traced to DAC %d", 5179 ases[as].pins[i], res); 5180 if (hpredir >= 0) 5181 printf(" and hpredir %d", hpredir); 5182 if (ases[as].fakeredir) 5183 printf(" with fake redirection"); 5184 printf("\n"); 5185 ); 5186 /* Trace again to mark the path */ 5187 hdac_audio_trace_dac(devinfo, as, i, 5188 ases[as].pins[i], hpredir, min, res, 0); 5189 ases[as].dacs[i] = res; 5190 /* We succeeded, so call next. */ 5191 if (hdac_audio_trace_as_out(devinfo, as, i + 1)) 5192 return (1); 5193 /* If next failed, we should retry with next min */ 5194 hdac_audio_undo_trace(devinfo, as, i); 5195 ases[as].dacs[i] = 0; 5196 min = res + 1; 5197 } while (1); 5198 } 5199 5200 /* 5201 * Trace association path from input to ADC 5202 */ 5203 static int 5204 hdac_audio_trace_as_in(struct hdac_devinfo *devinfo, int as) 5205 { 5206 struct hdac_audio_as *ases = devinfo->function.audio.as; 5207 struct hdac_widget *w; 5208 int i, j, k; 5209 5210 for (j = devinfo->startnode; j < devinfo->endnode; j++) { 5211 w = hdac_widget_get(devinfo, j); 5212 if (w == NULL || w->enable == 0) 5213 continue; 5214 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) 5215 continue; 5216 if (w->bindas >= 0 && w->bindas != as) 5217 continue; 5218 5219 /* Find next pin */ 5220 for (i = 0; i < 16; i++) { 5221 if (ases[as].pins[i] == 0) 5222 continue; 5223 5224 HDA_BOOTHVERBOSE( 5225 device_printf(devinfo->codec->sc->dev, 5226 " Tracing pin %d to ADC %d\n", 5227 ases[as].pins[i], j); 5228 ); 5229 /* Trace this pin taking goal into account. */ 5230 if (hdac_audio_trace_adc(devinfo, as, i, 5231 ases[as].pins[i], j, 0) == 0) { 5232 /* If we failed - return to previous and redo it. */ 5233 HDA_BOOTVERBOSE( 5234 device_printf(devinfo->codec->sc->dev, 5235 " Unable to trace pin %d to ADC %d, undo traces\n", 5236 ases[as].pins[i], j); 5237 ); 5238 hdac_audio_undo_trace(devinfo, as, -1); 5239 for (k = 0; k < 16; k++) 5240 ases[as].dacs[k] = 0; 5241 break; 5242 } 5243 HDA_BOOTVERBOSE( 5244 device_printf(devinfo->codec->sc->dev, 5245 " Pin %d traced to ADC %d\n", 5246 ases[as].pins[i], j); 5247 ); 5248 ases[as].dacs[i] = j; 5249 } 5250 if (i == 16) 5251 return (1); 5252 } 5253 return (0); 5254 } 5255 5256 /* 5257 * Trace input monitor path from mixer to output association. 5258 */ 5259 static int 5260 hdac_audio_trace_to_out(struct hdac_devinfo *devinfo, nid_t nid, int depth) 5261 { 5262 struct hdac_audio_as *ases = devinfo->function.audio.as; 5263 struct hdac_widget *w, *wc; 5264 int i, j; 5265 nid_t res = 0; 5266 5267 if (depth > HDA_PARSE_MAXDEPTH) 5268 return (0); 5269 w = hdac_widget_get(devinfo, nid); 5270 if (w == NULL || w->enable == 0) 5271 return (0); 5272 HDA_BOOTHVERBOSE( 5273 device_printf(devinfo->codec->sc->dev, 5274 " %*stracing via nid %d\n", 5275 depth + 1, "", w->nid); 5276 ); 5277 /* Use only unused widgets */ 5278 if (depth > 0 && w->bindas != -1) { 5279 if (w->bindas < 0 || ases[w->bindas].dir == HDA_CTL_OUT) { 5280 HDA_BOOTHVERBOSE( 5281 device_printf(devinfo->codec->sc->dev, 5282 " %*snid %d found output association %d\n", 5283 depth + 1, "", w->nid, w->bindas); 5284 ); 5285 if (w->bindas >= 0) 5286 w->pflags |= HDA_ADC_MONITOR; 5287 return (1); 5288 } else { 5289 HDA_BOOTHVERBOSE( 5290 device_printf(devinfo->codec->sc->dev, 5291 " %*snid %d busy by input association %d\n", 5292 depth + 1, "", w->nid, w->bindas); 5293 ); 5294 return (0); 5295 } 5296 } 5297 5298 switch (w->type) { 5299 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT: 5300 /* Do not traverse input. AD1988 has digital monitor 5301 for which we are not ready. */ 5302 break; 5303 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX: 5304 if (depth > 0) 5305 break; 5306 /* Fall */ 5307 default: 5308 /* Try to find reachable ADCs with specified nid. */ 5309 for (j = devinfo->startnode; j < devinfo->endnode; j++) { 5310 wc = hdac_widget_get(devinfo, j); 5311 if (wc == NULL || wc->enable == 0) 5312 continue; 5313 for (i = 0; i < wc->nconns; i++) { 5314 if (wc->connsenable[i] == 0) 5315 continue; 5316 if (wc->conns[i] != nid) 5317 continue; 5318 if (hdac_audio_trace_to_out(devinfo, 5319 j, depth + 1) != 0) { 5320 res = 1; 5321 if (wc->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR && 5322 wc->selconn == -1) 5323 wc->selconn = i; 5324 } 5325 } 5326 } 5327 break; 5328 } 5329 if (res && w->bindas == -1) 5330 w->bindas = -2; 5331 5332 HDA_BOOTHVERBOSE( 5333 device_printf(devinfo->codec->sc->dev, 5334 " %*snid %d returned %d\n", 5335 depth + 1, "", w->nid, res); 5336 ); 5337 return (res); 5338 } 5339 5340 /* 5341 * Trace extra associations (beeper, monitor) 5342 */ 5343 static void 5344 hdac_audio_trace_as_extra(struct hdac_devinfo *devinfo) 5345 { 5346 struct hdac_audio_as *as = devinfo->function.audio.as; 5347 struct hdac_widget *w; 5348 int j; 5349 5350 /* Input monitor */ 5351 /* Find mixer associated with input, but supplying signal 5352 for output associations. Hope it will be input monitor. */ 5353 HDA_BOOTVERBOSE( 5354 device_printf(devinfo->codec->sc->dev, 5355 "Tracing input monitor\n"); 5356 ); 5357 for (j = devinfo->startnode; j < devinfo->endnode; j++) { 5358 w = hdac_widget_get(devinfo, j); 5359 if (w == NULL || w->enable == 0) 5360 continue; 5361 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) 5362 continue; 5363 if (w->bindas < 0 || as[w->bindas].dir != HDA_CTL_IN) 5364 continue; 5365 HDA_BOOTVERBOSE( 5366 device_printf(devinfo->codec->sc->dev, 5367 " Tracing nid %d to out\n", 5368 j); 5369 ); 5370 if (hdac_audio_trace_to_out(devinfo, w->nid, 0)) { 5371 HDA_BOOTVERBOSE( 5372 device_printf(devinfo->codec->sc->dev, 5373 " nid %d is input monitor\n", 5374 w->nid); 5375 ); 5376 w->ossdev = SOUND_MIXER_IMIX; 5377 } 5378 } 5379 5380 /* Other inputs monitor */ 5381 /* Find input pins supplying signal for output associations. 5382 Hope it will be input monitoring. */ 5383 HDA_BOOTVERBOSE( 5384 device_printf(devinfo->codec->sc->dev, 5385 "Tracing other input monitors\n"); 5386 ); 5387 for (j = devinfo->startnode; j < devinfo->endnode; j++) { 5388 w = hdac_widget_get(devinfo, j); 5389 if (w == NULL || w->enable == 0) 5390 continue; 5391 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 5392 continue; 5393 if (w->bindas < 0 || as[w->bindas].dir != HDA_CTL_IN) 5394 continue; 5395 HDA_BOOTVERBOSE( 5396 device_printf(devinfo->codec->sc->dev, 5397 " Tracing nid %d to out\n", 5398 j); 5399 ); 5400 if (hdac_audio_trace_to_out(devinfo, w->nid, 0)) { 5401 HDA_BOOTVERBOSE( 5402 device_printf(devinfo->codec->sc->dev, 5403 " nid %d is input monitor\n", 5404 w->nid); 5405 ); 5406 } 5407 } 5408 5409 /* Beeper */ 5410 HDA_BOOTVERBOSE( 5411 device_printf(devinfo->codec->sc->dev, 5412 "Tracing beeper\n"); 5413 ); 5414 for (j = devinfo->startnode; j < devinfo->endnode; j++) { 5415 w = hdac_widget_get(devinfo, j); 5416 if (w == NULL || w->enable == 0) 5417 continue; 5418 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET) 5419 continue; 5420 HDA_BOOTHVERBOSE( 5421 device_printf(devinfo->codec->sc->dev, 5422 " Tracing nid %d to out\n", 5423 j); 5424 ); 5425 if (hdac_audio_trace_to_out(devinfo, w->nid, 0)) { 5426 HDA_BOOTVERBOSE( 5427 device_printf(devinfo->codec->sc->dev, 5428 " nid %d traced to out\n", 5429 j); 5430 ); 5431 } 5432 w->bindas = -2; 5433 } 5434 } 5435 5436 /* 5437 * Bind assotiations to PCM channels 5438 */ 5439 static void 5440 hdac_audio_bind_as(struct hdac_devinfo *devinfo) 5441 { 5442 struct hdac_softc *sc = devinfo->codec->sc; 5443 struct hdac_audio_as *as = devinfo->function.audio.as; 5444 int j, cnt = 0, free; 5445 5446 for (j = 0; j < devinfo->function.audio.ascnt; j++) { 5447 if (as[j].enable) 5448 cnt++; 5449 } 5450 if (sc->num_chans == 0) { 5451 sc->chans = (struct hdac_chan *)malloc( 5452 sizeof(struct hdac_chan) * cnt, 5453 M_HDAC, M_ZERO | M_NOWAIT); 5454 if (sc->chans == NULL) { 5455 device_printf(sc->dev, 5456 "Channels memory allocation failed!\n"); 5457 return; 5458 } 5459 } else { 5460 sc->chans = (struct hdac_chan *)realloc(sc->chans, 5461 sizeof(struct hdac_chan) * (sc->num_chans + cnt), 5462 M_HDAC, M_ZERO | M_NOWAIT); 5463 if (sc->chans == NULL) { 5464 sc->num_chans = 0; 5465 device_printf(sc->dev, 5466 "Channels memory allocation failed!\n"); 5467 return; 5468 } 5469 /* Fixup relative pointers after realloc */ 5470 for (j = 0; j < sc->num_chans; j++) 5471 sc->chans[j].caps.fmtlist = sc->chans[j].fmtlist; 5472 } 5473 free = sc->num_chans; 5474 sc->num_chans += cnt; 5475 5476 for (j = free; j < free + cnt; j++) { 5477 sc->chans[j].devinfo = devinfo; 5478 sc->chans[j].as = -1; 5479 } 5480 5481 /* Assign associations in order of their numbers, */ 5482 for (j = 0; j < devinfo->function.audio.ascnt; j++) { 5483 if (as[j].enable == 0) 5484 continue; 5485 5486 as[j].chan = free; 5487 sc->chans[free].as = j; 5488 sc->chans[free].dir = 5489 (as[j].dir == HDA_CTL_IN) ? PCMDIR_REC : PCMDIR_PLAY; 5490 hdac_pcmchannel_setup(&sc->chans[free]); 5491 free++; 5492 } 5493 } 5494 5495 static void 5496 hdac_audio_disable_nonaudio(struct hdac_devinfo *devinfo) 5497 { 5498 struct hdac_widget *w; 5499 int i; 5500 5501 /* Disable power and volume widgets. */ 5502 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5503 w = hdac_widget_get(devinfo, i); 5504 if (w == NULL || w->enable == 0) 5505 continue; 5506 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_POWER_WIDGET || 5507 w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_VOLUME_WIDGET) { 5508 w->enable = 0; 5509 HDA_BOOTHVERBOSE( 5510 device_printf(devinfo->codec->sc->dev, 5511 " Disabling nid %d due to it's" 5512 " non-audio type.\n", 5513 w->nid); 5514 ); 5515 } 5516 } 5517 } 5518 5519 static void 5520 hdac_audio_disable_useless(struct hdac_devinfo *devinfo) 5521 { 5522 struct hdac_widget *w, *cw; 5523 struct hdac_audio_ctl *ctl; 5524 int done, found, i, j, k; 5525 5526 /* Disable useless pins. */ 5527 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5528 w = hdac_widget_get(devinfo, i); 5529 if (w == NULL || w->enable == 0) 5530 continue; 5531 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) { 5532 if ((w->wclass.pin.config & 5533 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) == 5534 HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_NONE) { 5535 w->enable = 0; 5536 HDA_BOOTHVERBOSE( 5537 device_printf(devinfo->codec->sc->dev, 5538 " Disabling pin nid %d due" 5539 " to None connectivity.\n", 5540 w->nid); 5541 ); 5542 } else if ((w->wclass.pin.config & 5543 HDA_CONFIG_DEFAULTCONF_ASSOCIATION_MASK) == 0) { 5544 w->enable = 0; 5545 HDA_BOOTHVERBOSE( 5546 device_printf(devinfo->codec->sc->dev, 5547 " Disabling unassociated" 5548 " pin nid %d.\n", 5549 w->nid); 5550 ); 5551 } 5552 } 5553 } 5554 do { 5555 done = 1; 5556 /* Disable and mute controls for disabled widgets. */ 5557 i = 0; 5558 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 5559 if (ctl->enable == 0) 5560 continue; 5561 if (ctl->widget->enable == 0 || 5562 (ctl->childwidget != NULL && 5563 ctl->childwidget->enable == 0)) { 5564 ctl->forcemute = 1; 5565 ctl->muted = HDA_AMP_MUTE_ALL; 5566 ctl->left = 0; 5567 ctl->right = 0; 5568 ctl->enable = 0; 5569 if (ctl->ndir == HDA_CTL_IN) 5570 ctl->widget->connsenable[ctl->index] = 0; 5571 done = 0; 5572 HDA_BOOTHVERBOSE( 5573 device_printf(devinfo->codec->sc->dev, 5574 " Disabling ctl %d nid %d cnid %d due" 5575 " to disabled widget.\n", i, 5576 ctl->widget->nid, 5577 (ctl->childwidget != NULL)? 5578 ctl->childwidget->nid:-1); 5579 ); 5580 } 5581 } 5582 /* Disable useless widgets. */ 5583 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5584 w = hdac_widget_get(devinfo, i); 5585 if (w == NULL || w->enable == 0) 5586 continue; 5587 /* Disable inputs with disabled child widgets. */ 5588 for (j = 0; j < w->nconns; j++) { 5589 if (w->connsenable[j]) { 5590 cw = hdac_widget_get(devinfo, w->conns[j]); 5591 if (cw == NULL || cw->enable == 0) { 5592 w->connsenable[j] = 0; 5593 HDA_BOOTHVERBOSE( 5594 device_printf(devinfo->codec->sc->dev, 5595 " Disabling nid %d connection %d due" 5596 " to disabled child widget.\n", 5597 i, j); 5598 ); 5599 } 5600 } 5601 } 5602 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR && 5603 w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) 5604 continue; 5605 /* Disable mixers and selectors without inputs. */ 5606 found = 0; 5607 for (j = 0; j < w->nconns; j++) { 5608 if (w->connsenable[j]) { 5609 found = 1; 5610 break; 5611 } 5612 } 5613 if (found == 0) { 5614 w->enable = 0; 5615 done = 0; 5616 HDA_BOOTHVERBOSE( 5617 device_printf(devinfo->codec->sc->dev, 5618 " Disabling nid %d due to all it's" 5619 " inputs disabled.\n", w->nid); 5620 ); 5621 } 5622 /* Disable nodes without consumers. */ 5623 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_SELECTOR && 5624 w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) 5625 continue; 5626 found = 0; 5627 for (k = devinfo->startnode; k < devinfo->endnode; k++) { 5628 cw = hdac_widget_get(devinfo, k); 5629 if (cw == NULL || cw->enable == 0) 5630 continue; 5631 for (j = 0; j < cw->nconns; j++) { 5632 if (cw->connsenable[j] && cw->conns[j] == i) { 5633 found = 1; 5634 break; 5635 } 5636 } 5637 } 5638 if (found == 0) { 5639 w->enable = 0; 5640 done = 0; 5641 HDA_BOOTHVERBOSE( 5642 device_printf(devinfo->codec->sc->dev, 5643 " Disabling nid %d due to all it's" 5644 " consumers disabled.\n", w->nid); 5645 ); 5646 } 5647 } 5648 } while (done == 0); 5649 5650 } 5651 5652 static void 5653 hdac_audio_disable_unas(struct hdac_devinfo *devinfo) 5654 { 5655 struct hdac_audio_as *as = devinfo->function.audio.as; 5656 struct hdac_widget *w, *cw; 5657 struct hdac_audio_ctl *ctl; 5658 int i, j, k; 5659 5660 /* Disable unassosiated widgets. */ 5661 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5662 w = hdac_widget_get(devinfo, i); 5663 if (w == NULL || w->enable == 0) 5664 continue; 5665 if (w->bindas == -1) { 5666 w->enable = 0; 5667 HDA_BOOTHVERBOSE( 5668 device_printf(devinfo->codec->sc->dev, 5669 " Disabling unassociated nid %d.\n", 5670 w->nid); 5671 ); 5672 } 5673 } 5674 /* Disable input connections on input pin and 5675 * output on output. */ 5676 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5677 w = hdac_widget_get(devinfo, i); 5678 if (w == NULL || w->enable == 0) 5679 continue; 5680 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 5681 continue; 5682 if (w->bindas < 0) 5683 continue; 5684 if (as[w->bindas].dir == HDA_CTL_IN) { 5685 for (j = 0; j < w->nconns; j++) { 5686 if (w->connsenable[j] == 0) 5687 continue; 5688 w->connsenable[j] = 0; 5689 HDA_BOOTHVERBOSE( 5690 device_printf(devinfo->codec->sc->dev, 5691 " Disabling connection to input pin " 5692 "nid %d conn %d.\n", 5693 i, j); 5694 ); 5695 } 5696 ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, 5697 HDA_CTL_IN, -1, 1); 5698 if (ctl && ctl->enable) { 5699 ctl->forcemute = 1; 5700 ctl->muted = HDA_AMP_MUTE_ALL; 5701 ctl->left = 0; 5702 ctl->right = 0; 5703 ctl->enable = 0; 5704 } 5705 } else { 5706 ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, 5707 HDA_CTL_OUT, -1, 1); 5708 if (ctl && ctl->enable) { 5709 ctl->forcemute = 1; 5710 ctl->muted = HDA_AMP_MUTE_ALL; 5711 ctl->left = 0; 5712 ctl->right = 0; 5713 ctl->enable = 0; 5714 } 5715 for (k = devinfo->startnode; k < devinfo->endnode; k++) { 5716 cw = hdac_widget_get(devinfo, k); 5717 if (cw == NULL || cw->enable == 0) 5718 continue; 5719 for (j = 0; j < cw->nconns; j++) { 5720 if (cw->connsenable[j] && cw->conns[j] == i) { 5721 cw->connsenable[j] = 0; 5722 HDA_BOOTHVERBOSE( 5723 device_printf(devinfo->codec->sc->dev, 5724 " Disabling connection from output pin " 5725 "nid %d conn %d cnid %d.\n", 5726 k, j, i); 5727 ); 5728 if (cw->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && 5729 cw->nconns > 1) 5730 continue; 5731 ctl = hdac_audio_ctl_amp_get(devinfo, k, 5732 HDA_CTL_IN, j, 1); 5733 if (ctl && ctl->enable) { 5734 ctl->forcemute = 1; 5735 ctl->muted = HDA_AMP_MUTE_ALL; 5736 ctl->left = 0; 5737 ctl->right = 0; 5738 ctl->enable = 0; 5739 } 5740 } 5741 } 5742 } 5743 } 5744 } 5745 } 5746 5747 static void 5748 hdac_audio_disable_notselected(struct hdac_devinfo *devinfo) 5749 { 5750 struct hdac_audio_as *as = devinfo->function.audio.as; 5751 struct hdac_widget *w; 5752 int i, j; 5753 5754 /* On playback path we can safely disable all unseleted inputs. */ 5755 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5756 w = hdac_widget_get(devinfo, i); 5757 if (w == NULL || w->enable == 0) 5758 continue; 5759 if (w->nconns <= 1) 5760 continue; 5761 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) 5762 continue; 5763 if (w->bindas < 0 || as[w->bindas].dir == HDA_CTL_IN) 5764 continue; 5765 for (j = 0; j < w->nconns; j++) { 5766 if (w->connsenable[j] == 0) 5767 continue; 5768 if (w->selconn < 0 || w->selconn == j) 5769 continue; 5770 w->connsenable[j] = 0; 5771 HDA_BOOTHVERBOSE( 5772 device_printf(devinfo->codec->sc->dev, 5773 " Disabling unselected connection " 5774 "nid %d conn %d.\n", 5775 i, j); 5776 ); 5777 } 5778 } 5779 } 5780 5781 static void 5782 hdac_audio_disable_crossas(struct hdac_devinfo *devinfo) 5783 { 5784 struct hdac_audio_as *ases = devinfo->function.audio.as; 5785 struct hdac_widget *w, *cw; 5786 struct hdac_audio_ctl *ctl; 5787 int i, j; 5788 5789 /* Disable crossassociatement and unwanted crosschannel connections. */ 5790 /* ... using selectors */ 5791 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5792 w = hdac_widget_get(devinfo, i); 5793 if (w == NULL || w->enable == 0) 5794 continue; 5795 if (w->nconns <= 1) 5796 continue; 5797 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) 5798 continue; 5799 if (w->bindas == -2) 5800 continue; 5801 for (j = 0; j < w->nconns; j++) { 5802 if (w->connsenable[j] == 0) 5803 continue; 5804 cw = hdac_widget_get(devinfo, w->conns[j]); 5805 if (cw == NULL || w->enable == 0) 5806 continue; 5807 if (cw->bindas == -2 || 5808 ((w->pflags & HDA_ADC_MONITOR) && 5809 cw->bindas >= 0 && 5810 ases[cw->bindas].dir == HDA_CTL_IN)) 5811 continue; 5812 if (w->bindas == cw->bindas && 5813 (w->bindseqmask & cw->bindseqmask) != 0) 5814 continue; 5815 w->connsenable[j] = 0; 5816 HDA_BOOTHVERBOSE( 5817 device_printf(devinfo->codec->sc->dev, 5818 " Disabling crossassociatement connection " 5819 "nid %d conn %d cnid %d.\n", 5820 i, j, cw->nid); 5821 ); 5822 } 5823 } 5824 /* ... using controls */ 5825 i = 0; 5826 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 5827 if (ctl->enable == 0 || ctl->childwidget == NULL) 5828 continue; 5829 if (ctl->widget->bindas == -2) 5830 continue; 5831 if (ctl->childwidget->bindas == -2 || 5832 ((ctl->widget->pflags & HDA_ADC_MONITOR) && 5833 ctl->childwidget->bindas >= 0 && 5834 ases[ctl->childwidget->bindas].dir == HDA_CTL_IN)) 5835 continue; 5836 if (ctl->widget->bindas != ctl->childwidget->bindas || 5837 (ctl->widget->bindseqmask & ctl->childwidget->bindseqmask) == 0) { 5838 ctl->forcemute = 1; 5839 ctl->muted = HDA_AMP_MUTE_ALL; 5840 ctl->left = 0; 5841 ctl->right = 0; 5842 ctl->enable = 0; 5843 if (ctl->ndir == HDA_CTL_IN) 5844 ctl->widget->connsenable[ctl->index] = 0; 5845 HDA_BOOTHVERBOSE( 5846 device_printf(devinfo->codec->sc->dev, 5847 " Disabling crossassociatement connection " 5848 "ctl %d nid %d cnid %d.\n", i, 5849 ctl->widget->nid, 5850 ctl->childwidget->nid); 5851 ); 5852 } 5853 } 5854 5855 } 5856 5857 #define HDA_CTL_GIVE(ctl) ((ctl)->step?1:0) 5858 5859 /* 5860 * Find controls to control amplification for source. 5861 */ 5862 static int 5863 hdac_audio_ctl_source_amp(struct hdac_devinfo *devinfo, nid_t nid, int index, 5864 int ossdev, int ctlable, int depth, int need) 5865 { 5866 struct hdac_widget *w, *wc; 5867 struct hdac_audio_ctl *ctl; 5868 int i, j, conns = 0, rneed; 5869 5870 if (depth > HDA_PARSE_MAXDEPTH) 5871 return (need); 5872 5873 w = hdac_widget_get(devinfo, nid); 5874 if (w == NULL || w->enable == 0) 5875 return (need); 5876 5877 /* Count number of active inputs. */ 5878 if (depth > 0) { 5879 for (j = 0; j < w->nconns; j++) { 5880 if (w->connsenable[j]) 5881 conns++; 5882 } 5883 } 5884 5885 /* If this is not a first step - use input mixer. 5886 Pins have common input ctl so care must be taken. */ 5887 if (depth > 0 && ctlable && (conns == 1 || 5888 w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX)) { 5889 ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, HDA_CTL_IN, 5890 index, 1); 5891 if (ctl) { 5892 if (HDA_CTL_GIVE(ctl) & need) 5893 ctl->ossmask |= (1 << ossdev); 5894 else 5895 ctl->possmask |= (1 << ossdev); 5896 need &= ~HDA_CTL_GIVE(ctl); 5897 } 5898 } 5899 5900 /* If widget has own ossdev - not traverse it. 5901 It will be traversed on it's own. */ 5902 if (w->ossdev >= 0 && depth > 0) 5903 return (need); 5904 5905 /* We must not traverse pin */ 5906 if ((w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT || 5907 w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) && 5908 depth > 0) 5909 return (need); 5910 5911 /* record that this widget exports such signal, */ 5912 w->ossmask |= (1 << ossdev); 5913 5914 /* If signals mixed, we can't assign controls farther. 5915 * Ignore this on depth zero. Caller must knows why. 5916 * Ignore this for static selectors if this input selected. 5917 */ 5918 if (conns > 1) 5919 ctlable = 0; 5920 5921 if (ctlable) { 5922 ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, HDA_CTL_OUT, -1, 1); 5923 if (ctl) { 5924 if (HDA_CTL_GIVE(ctl) & need) 5925 ctl->ossmask |= (1 << ossdev); 5926 else 5927 ctl->possmask |= (1 << ossdev); 5928 need &= ~HDA_CTL_GIVE(ctl); 5929 } 5930 } 5931 5932 rneed = 0; 5933 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5934 wc = hdac_widget_get(devinfo, i); 5935 if (wc == NULL || wc->enable == 0) 5936 continue; 5937 for (j = 0; j < wc->nconns; j++) { 5938 if (wc->connsenable[j] && wc->conns[j] == nid) { 5939 rneed |= hdac_audio_ctl_source_amp(devinfo, 5940 wc->nid, j, ossdev, ctlable, depth + 1, need); 5941 } 5942 } 5943 } 5944 rneed &= need; 5945 5946 return (rneed); 5947 } 5948 5949 /* 5950 * Find controls to control amplification for destination. 5951 */ 5952 static void 5953 hdac_audio_ctl_dest_amp(struct hdac_devinfo *devinfo, nid_t nid, int index, 5954 int ossdev, int depth, int need) 5955 { 5956 struct hdac_audio_as *as = devinfo->function.audio.as; 5957 struct hdac_widget *w, *wc; 5958 struct hdac_audio_ctl *ctl; 5959 int i, j, consumers; 5960 5961 if (depth > HDA_PARSE_MAXDEPTH) 5962 return; 5963 5964 w = hdac_widget_get(devinfo, nid); 5965 if (w == NULL || w->enable == 0) 5966 return; 5967 5968 if (depth > 0) { 5969 /* If this node produce output for several consumers, 5970 we can't touch it. */ 5971 consumers = 0; 5972 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 5973 wc = hdac_widget_get(devinfo, i); 5974 if (wc == NULL || wc->enable == 0) 5975 continue; 5976 for (j = 0; j < wc->nconns; j++) { 5977 if (wc->connsenable[j] && wc->conns[j] == nid) 5978 consumers++; 5979 } 5980 } 5981 /* The only exception is if real HP redirection is configured 5982 and this is a duplication point. 5983 XXX: Actually exception is not completely correct. 5984 XXX: Duplication point check is not perfect. */ 5985 if ((consumers == 2 && (w->bindas < 0 || 5986 as[w->bindas].hpredir < 0 || as[w->bindas].fakeredir || 5987 (w->bindseqmask & (1 << 15)) == 0)) || 5988 consumers > 2) 5989 return; 5990 5991 /* Else use it's output mixer. */ 5992 ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, 5993 HDA_CTL_OUT, -1, 1); 5994 if (ctl) { 5995 if (HDA_CTL_GIVE(ctl) & need) 5996 ctl->ossmask |= (1 << ossdev); 5997 else 5998 ctl->possmask |= (1 << ossdev); 5999 need &= ~HDA_CTL_GIVE(ctl); 6000 } 6001 } 6002 6003 /* We must not traverse pin */ 6004 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && 6005 depth > 0) 6006 return; 6007 6008 for (i = 0; i < w->nconns; i++) { 6009 int tneed = need; 6010 if (w->connsenable[i] == 0) 6011 continue; 6012 if (index >= 0 && i != index) 6013 continue; 6014 ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, 6015 HDA_CTL_IN, i, 1); 6016 if (ctl) { 6017 if (HDA_CTL_GIVE(ctl) & tneed) 6018 ctl->ossmask |= (1 << ossdev); 6019 else 6020 ctl->possmask |= (1 << ossdev); 6021 tneed &= ~HDA_CTL_GIVE(ctl); 6022 } 6023 hdac_audio_ctl_dest_amp(devinfo, w->conns[i], -1, ossdev, 6024 depth + 1, tneed); 6025 } 6026 } 6027 6028 /* 6029 * Assign OSS names to sound sources 6030 */ 6031 static void 6032 hdac_audio_assign_names(struct hdac_devinfo *devinfo) 6033 { 6034 struct hdac_audio_as *as = devinfo->function.audio.as; 6035 struct hdac_widget *w; 6036 int i, j; 6037 int type = -1, use, used = 0; 6038 static const int types[7][13] = { 6039 { SOUND_MIXER_LINE, SOUND_MIXER_LINE1, SOUND_MIXER_LINE2, 6040 SOUND_MIXER_LINE3, -1 }, /* line */ 6041 { SOUND_MIXER_MONITOR, SOUND_MIXER_MIC, -1 }, /* int mic */ 6042 { SOUND_MIXER_MIC, SOUND_MIXER_MONITOR, -1 }, /* ext mic */ 6043 { SOUND_MIXER_CD, -1 }, /* cd */ 6044 { SOUND_MIXER_SPEAKER, -1 }, /* speaker */ 6045 { SOUND_MIXER_DIGITAL1, SOUND_MIXER_DIGITAL2, SOUND_MIXER_DIGITAL3, 6046 -1 }, /* digital */ 6047 { SOUND_MIXER_LINE, SOUND_MIXER_LINE1, SOUND_MIXER_LINE2, 6048 SOUND_MIXER_LINE3, SOUND_MIXER_PHONEIN, SOUND_MIXER_PHONEOUT, 6049 SOUND_MIXER_VIDEO, SOUND_MIXER_RADIO, SOUND_MIXER_DIGITAL1, 6050 SOUND_MIXER_DIGITAL2, SOUND_MIXER_DIGITAL3, SOUND_MIXER_MONITOR, 6051 -1 } /* others */ 6052 }; 6053 6054 /* Surely known names */ 6055 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 6056 w = hdac_widget_get(devinfo, i); 6057 if (w == NULL || w->enable == 0) 6058 continue; 6059 if (w->bindas == -1) 6060 continue; 6061 use = -1; 6062 switch (w->type) { 6063 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX: 6064 if (as[w->bindas].dir == HDA_CTL_OUT) 6065 break; 6066 type = -1; 6067 switch (w->wclass.pin.config & HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) { 6068 case HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_IN: 6069 type = 0; 6070 break; 6071 case HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN: 6072 if ((w->wclass.pin.config & HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) 6073 == HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK) 6074 break; 6075 type = 1; 6076 break; 6077 case HDA_CONFIG_DEFAULTCONF_DEVICE_CD: 6078 type = 3; 6079 break; 6080 case HDA_CONFIG_DEFAULTCONF_DEVICE_SPEAKER: 6081 type = 4; 6082 break; 6083 case HDA_CONFIG_DEFAULTCONF_DEVICE_SPDIF_IN: 6084 case HDA_CONFIG_DEFAULTCONF_DEVICE_DIGITAL_OTHER_IN: 6085 type = 5; 6086 break; 6087 } 6088 if (type == -1) 6089 break; 6090 j = 0; 6091 while (types[type][j] >= 0 && 6092 (used & (1 << types[type][j])) != 0) { 6093 j++; 6094 } 6095 if (types[type][j] >= 0) 6096 use = types[type][j]; 6097 break; 6098 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT: 6099 use = SOUND_MIXER_PCM; 6100 break; 6101 case HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET: 6102 use = SOUND_MIXER_SPEAKER; 6103 break; 6104 default: 6105 break; 6106 } 6107 if (use >= 0) { 6108 w->ossdev = use; 6109 used |= (1 << use); 6110 } 6111 } 6112 /* Semi-known names */ 6113 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 6114 w = hdac_widget_get(devinfo, i); 6115 if (w == NULL || w->enable == 0) 6116 continue; 6117 if (w->ossdev >= 0) 6118 continue; 6119 if (w->bindas == -1) 6120 continue; 6121 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 6122 continue; 6123 if (as[w->bindas].dir == HDA_CTL_OUT) 6124 continue; 6125 type = -1; 6126 switch (w->wclass.pin.config & HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) { 6127 case HDA_CONFIG_DEFAULTCONF_DEVICE_LINE_OUT: 6128 case HDA_CONFIG_DEFAULTCONF_DEVICE_SPEAKER: 6129 case HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT: 6130 case HDA_CONFIG_DEFAULTCONF_DEVICE_AUX: 6131 type = 0; 6132 break; 6133 case HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN: 6134 type = 2; 6135 break; 6136 case HDA_CONFIG_DEFAULTCONF_DEVICE_SPDIF_OUT: 6137 case HDA_CONFIG_DEFAULTCONF_DEVICE_DIGITAL_OTHER_OUT: 6138 type = 5; 6139 break; 6140 } 6141 if (type == -1) 6142 break; 6143 j = 0; 6144 while (types[type][j] >= 0 && 6145 (used & (1 << types[type][j])) != 0) { 6146 j++; 6147 } 6148 if (types[type][j] >= 0) { 6149 w->ossdev = types[type][j]; 6150 used |= (1 << types[type][j]); 6151 } 6152 } 6153 /* Others */ 6154 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 6155 w = hdac_widget_get(devinfo, i); 6156 if (w == NULL || w->enable == 0) 6157 continue; 6158 if (w->ossdev >= 0) 6159 continue; 6160 if (w->bindas == -1) 6161 continue; 6162 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 6163 continue; 6164 if (as[w->bindas].dir == HDA_CTL_OUT) 6165 continue; 6166 j = 0; 6167 while (types[6][j] >= 0 && 6168 (used & (1 << types[6][j])) != 0) { 6169 j++; 6170 } 6171 if (types[6][j] >= 0) { 6172 w->ossdev = types[6][j]; 6173 used |= (1 << types[6][j]); 6174 } 6175 } 6176 } 6177 6178 static void 6179 hdac_audio_build_tree(struct hdac_devinfo *devinfo) 6180 { 6181 struct hdac_audio_as *as = devinfo->function.audio.as; 6182 int j, res; 6183 6184 /* Trace all associations in order of their numbers, */ 6185 for (j = 0; j < devinfo->function.audio.ascnt; j++) { 6186 if (as[j].enable == 0) 6187 continue; 6188 HDA_BOOTVERBOSE( 6189 device_printf(devinfo->codec->sc->dev, 6190 "Tracing association %d (%d)\n", j, as[j].index); 6191 ); 6192 if (as[j].dir == HDA_CTL_OUT) { 6193 retry: 6194 res = hdac_audio_trace_as_out(devinfo, j, 0); 6195 if (res == 0 && as[j].hpredir >= 0 && 6196 as[j].fakeredir == 0) { 6197 /* If codec can't do analog HP redirection 6198 try to make it using one more DAC. */ 6199 as[j].fakeredir = 1; 6200 goto retry; 6201 } 6202 } else { 6203 res = hdac_audio_trace_as_in(devinfo, j); 6204 } 6205 if (res) { 6206 HDA_BOOTVERBOSE( 6207 device_printf(devinfo->codec->sc->dev, 6208 "Association %d (%d) trace succeeded\n", 6209 j, as[j].index); 6210 ); 6211 } else { 6212 HDA_BOOTVERBOSE( 6213 device_printf(devinfo->codec->sc->dev, 6214 "Association %d (%d) trace failed\n", 6215 j, as[j].index); 6216 ); 6217 as[j].enable = 0; 6218 } 6219 } 6220 6221 /* Trace mixer and beeper pseudo associations. */ 6222 hdac_audio_trace_as_extra(devinfo); 6223 } 6224 6225 static void 6226 hdac_audio_assign_mixers(struct hdac_devinfo *devinfo) 6227 { 6228 struct hdac_audio_as *as = devinfo->function.audio.as; 6229 struct hdac_audio_ctl *ctl; 6230 struct hdac_widget *w, *cw; 6231 int i, j; 6232 6233 /* Assign mixers to the tree. */ 6234 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 6235 w = hdac_widget_get(devinfo, i); 6236 if (w == NULL || w->enable == 0) 6237 continue; 6238 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT || 6239 w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_BEEP_WIDGET || 6240 (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && 6241 as[w->bindas].dir == HDA_CTL_IN)) { 6242 if (w->ossdev < 0) 6243 continue; 6244 hdac_audio_ctl_source_amp(devinfo, w->nid, -1, 6245 w->ossdev, 1, 0, 1); 6246 } else if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) { 6247 hdac_audio_ctl_dest_amp(devinfo, w->nid, -1, 6248 SOUND_MIXER_RECLEV, 0, 1); 6249 } else if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && 6250 as[w->bindas].dir == HDA_CTL_OUT) { 6251 hdac_audio_ctl_dest_amp(devinfo, w->nid, -1, 6252 SOUND_MIXER_VOLUME, 0, 1); 6253 } 6254 if (w->ossdev == SOUND_MIXER_IMIX) { 6255 if (hdac_audio_ctl_source_amp(devinfo, w->nid, -1, 6256 w->ossdev, 1, 0, 1)) { 6257 /* If we are unable to control input monitor 6258 as source - try to control it as destination. */ 6259 hdac_audio_ctl_dest_amp(devinfo, w->nid, -1, 6260 w->ossdev, 0, 1); 6261 } 6262 } 6263 if (w->pflags & HDA_ADC_MONITOR) { 6264 for (j = 0; j < w->nconns; j++) { 6265 if (!w->connsenable[j]) 6266 continue; 6267 cw = hdac_widget_get(devinfo, w->conns[j]); 6268 if (cw == NULL || cw->enable == 0) 6269 continue; 6270 if (cw->bindas == -1) 6271 continue; 6272 if (cw->bindas >= 0 && 6273 as[cw->bindas].dir != HDA_CTL_IN) 6274 continue; 6275 hdac_audio_ctl_dest_amp(devinfo, 6276 w->nid, j, SOUND_MIXER_IGAIN, 0, 1); 6277 } 6278 } 6279 } 6280 /* Treat unrequired as possible. */ 6281 i = 0; 6282 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 6283 if (ctl->ossmask == 0) 6284 ctl->ossmask = ctl->possmask; 6285 } 6286 } 6287 6288 static void 6289 hdac_audio_prepare_pin_ctrl(struct hdac_devinfo *devinfo) 6290 { 6291 struct hdac_audio_as *as = devinfo->function.audio.as; 6292 struct hdac_widget *w; 6293 uint32_t pincap; 6294 int i; 6295 6296 for (i = 0; i < devinfo->nodecnt; i++) { 6297 w = &devinfo->widget[i]; 6298 if (w == NULL) 6299 continue; 6300 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 6301 continue; 6302 6303 pincap = w->wclass.pin.cap; 6304 6305 /* Disable everything. */ 6306 w->wclass.pin.ctrl &= ~( 6307 HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE | 6308 HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE | 6309 HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE | 6310 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE_MASK); 6311 6312 if (w->enable == 0 || 6313 w->bindas < 0 || as[w->bindas].enable == 0) { 6314 /* Pin is unused so left it disabled. */ 6315 continue; 6316 } else if (as[w->bindas].dir == HDA_CTL_IN) { 6317 /* Input pin, configure for input. */ 6318 if (HDA_PARAM_PIN_CAP_INPUT_CAP(pincap)) 6319 w->wclass.pin.ctrl |= 6320 HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE; 6321 6322 if ((devinfo->function.audio.quirks & HDA_QUIRK_IVREF100) && 6323 HDA_PARAM_PIN_CAP_VREF_CTRL_100(pincap)) 6324 w->wclass.pin.ctrl |= 6325 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE( 6326 HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_100); 6327 else if ((devinfo->function.audio.quirks & HDA_QUIRK_IVREF80) && 6328 HDA_PARAM_PIN_CAP_VREF_CTRL_80(pincap)) 6329 w->wclass.pin.ctrl |= 6330 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE( 6331 HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_80); 6332 else if ((devinfo->function.audio.quirks & HDA_QUIRK_IVREF50) && 6333 HDA_PARAM_PIN_CAP_VREF_CTRL_50(pincap)) 6334 w->wclass.pin.ctrl |= 6335 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE( 6336 HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_50); 6337 } else { 6338 /* Output pin, configure for output. */ 6339 if (HDA_PARAM_PIN_CAP_OUTPUT_CAP(pincap)) 6340 w->wclass.pin.ctrl |= 6341 HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE; 6342 6343 if (HDA_PARAM_PIN_CAP_HEADPHONE_CAP(pincap) && 6344 (w->wclass.pin.config & 6345 HDA_CONFIG_DEFAULTCONF_DEVICE_MASK) == 6346 HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT) 6347 w->wclass.pin.ctrl |= 6348 HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE; 6349 6350 if ((devinfo->function.audio.quirks & HDA_QUIRK_OVREF100) && 6351 HDA_PARAM_PIN_CAP_VREF_CTRL_100(pincap)) 6352 w->wclass.pin.ctrl |= 6353 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE( 6354 HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_100); 6355 else if ((devinfo->function.audio.quirks & HDA_QUIRK_OVREF80) && 6356 HDA_PARAM_PIN_CAP_VREF_CTRL_80(pincap)) 6357 w->wclass.pin.ctrl |= 6358 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE( 6359 HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_80); 6360 else if ((devinfo->function.audio.quirks & HDA_QUIRK_OVREF50) && 6361 HDA_PARAM_PIN_CAP_VREF_CTRL_50(pincap)) 6362 w->wclass.pin.ctrl |= 6363 HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE( 6364 HDA_CMD_PIN_WIDGET_CTRL_VREF_ENABLE_50); 6365 } 6366 } 6367 } 6368 6369 static void 6370 hdac_audio_ctl_commit(struct hdac_devinfo *devinfo) 6371 { 6372 struct hdac_audio_ctl *ctl; 6373 int i, z; 6374 6375 i = 0; 6376 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 6377 if (ctl->enable == 0 || ctl->ossmask != 0) { 6378 /* Mute disabled and mixer controllable controls. 6379 * Last will be initialized by mixer_init(). 6380 * This expected to reduce click on startup. */ 6381 hdac_audio_ctl_amp_set(ctl, HDA_AMP_MUTE_ALL, 0, 0); 6382 continue; 6383 } 6384 /* Init fixed controls to 0dB amplification. */ 6385 z = ctl->offset; 6386 if (z > ctl->step) 6387 z = ctl->step; 6388 hdac_audio_ctl_amp_set(ctl, HDA_AMP_MUTE_NONE, z, z); 6389 } 6390 } 6391 6392 static void 6393 hdac_audio_commit(struct hdac_devinfo *devinfo) 6394 { 6395 struct hdac_softc *sc = devinfo->codec->sc; 6396 struct hdac_widget *w; 6397 nid_t cad; 6398 uint32_t gdata, gmask, gdir; 6399 int commitgpio, numgpio; 6400 int i; 6401 6402 cad = devinfo->codec->cad; 6403 6404 if (sc->pci_subvendor == APPLE_INTEL_MAC) 6405 hdac_command(sc, HDA_CMD_12BIT(cad, devinfo->nid, 6406 0x7e7, 0), cad); 6407 6408 /* Commit controls. */ 6409 hdac_audio_ctl_commit(devinfo); 6410 6411 /* Commit selectors, pins and EAPD. */ 6412 for (i = 0; i < devinfo->nodecnt; i++) { 6413 w = &devinfo->widget[i]; 6414 if (w == NULL) 6415 continue; 6416 if (w->selconn == -1) 6417 w->selconn = 0; 6418 if (w->nconns > 0) 6419 hdac_widget_connection_select(w, w->selconn); 6420 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) { 6421 hdac_command(sc, 6422 HDA_CMD_SET_PIN_WIDGET_CTRL(cad, w->nid, 6423 w->wclass.pin.ctrl), cad); 6424 } 6425 if (w->param.eapdbtl != HDAC_INVALID) { 6426 uint32_t val; 6427 6428 val = w->param.eapdbtl; 6429 if (devinfo->function.audio.quirks & 6430 HDA_QUIRK_EAPDINV) 6431 val ^= HDA_CMD_SET_EAPD_BTL_ENABLE_EAPD; 6432 hdac_command(sc, 6433 HDA_CMD_SET_EAPD_BTL_ENABLE(cad, w->nid, 6434 val), cad); 6435 } 6436 } 6437 6438 /* Commit GPIOs. */ 6439 gdata = 0; 6440 gmask = 0; 6441 gdir = 0; 6442 commitgpio = 0; 6443 numgpio = HDA_PARAM_GPIO_COUNT_NUM_GPIO( 6444 devinfo->function.audio.gpio); 6445 6446 if (devinfo->function.audio.quirks & HDA_QUIRK_GPIOFLUSH) 6447 commitgpio = (numgpio > 0) ? 1 : 0; 6448 else { 6449 for (i = 0; i < numgpio && i < HDA_GPIO_MAX; i++) { 6450 if (!(devinfo->function.audio.quirks & 6451 (1 << i))) 6452 continue; 6453 if (commitgpio == 0) { 6454 commitgpio = 1; 6455 HDA_BOOTVERBOSE( 6456 gdata = hdac_command(sc, 6457 HDA_CMD_GET_GPIO_DATA(cad, 6458 devinfo->nid), cad); 6459 gmask = hdac_command(sc, 6460 HDA_CMD_GET_GPIO_ENABLE_MASK(cad, 6461 devinfo->nid), cad); 6462 gdir = hdac_command(sc, 6463 HDA_CMD_GET_GPIO_DIRECTION(cad, 6464 devinfo->nid), cad); 6465 device_printf(sc->dev, 6466 "GPIO init: data=0x%08x " 6467 "mask=0x%08x dir=0x%08x\n", 6468 gdata, gmask, gdir); 6469 gdata = 0; 6470 gmask = 0; 6471 gdir = 0; 6472 ); 6473 } 6474 gdata |= 1 << i; 6475 gmask |= 1 << i; 6476 gdir |= 1 << i; 6477 } 6478 } 6479 6480 if (commitgpio != 0) { 6481 HDA_BOOTVERBOSE( 6482 device_printf(sc->dev, 6483 "GPIO commit: data=0x%08x mask=0x%08x " 6484 "dir=0x%08x\n", 6485 gdata, gmask, gdir); 6486 ); 6487 hdac_command(sc, 6488 HDA_CMD_SET_GPIO_ENABLE_MASK(cad, devinfo->nid, 6489 gmask), cad); 6490 hdac_command(sc, 6491 HDA_CMD_SET_GPIO_DIRECTION(cad, devinfo->nid, 6492 gdir), cad); 6493 hdac_command(sc, 6494 HDA_CMD_SET_GPIO_DATA(cad, devinfo->nid, 6495 gdata), cad); 6496 } 6497 } 6498 6499 static void 6500 hdac_powerup(struct hdac_devinfo *devinfo) 6501 { 6502 struct hdac_softc *sc = devinfo->codec->sc; 6503 nid_t cad = devinfo->codec->cad; 6504 int i; 6505 6506 hdac_command(sc, 6507 HDA_CMD_SET_POWER_STATE(cad, 6508 devinfo->nid, HDA_CMD_POWER_STATE_D0), 6509 cad); 6510 DELAY(100); 6511 6512 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 6513 hdac_command(sc, 6514 HDA_CMD_SET_POWER_STATE(cad, 6515 i, HDA_CMD_POWER_STATE_D0), 6516 cad); 6517 } 6518 DELAY(1000); 6519 } 6520 6521 static int 6522 hdac_pcmchannel_setup(struct hdac_chan *ch) 6523 { 6524 struct hdac_devinfo *devinfo = ch->devinfo; 6525 struct hdac_audio_as *as = devinfo->function.audio.as; 6526 struct hdac_widget *w; 6527 uint32_t cap, fmtcap, pcmcap; 6528 int i, j, ret, channels, onlystereo; 6529 uint16_t pinset; 6530 6531 ch->caps = hdac_caps; 6532 ch->caps.fmtlist = ch->fmtlist; 6533 ch->bit16 = 1; 6534 ch->bit32 = 0; 6535 ch->pcmrates[0] = 48000; 6536 ch->pcmrates[1] = 0; 6537 6538 ret = 0; 6539 channels = 0; 6540 onlystereo = 1; 6541 pinset = 0; 6542 fmtcap = devinfo->function.audio.supp_stream_formats; 6543 pcmcap = devinfo->function.audio.supp_pcm_size_rate; 6544 6545 for (i = 0; i < 16; i++) { 6546 /* Check as is correct */ 6547 if (ch->as < 0) 6548 break; 6549 /* Cound only present DACs */ 6550 if (as[ch->as].dacs[i] <= 0) 6551 continue; 6552 /* Ignore duplicates */ 6553 for (j = 0; j < ret; j++) { 6554 if (ch->io[j] == as[ch->as].dacs[i]) 6555 break; 6556 } 6557 if (j < ret) 6558 continue; 6559 6560 w = hdac_widget_get(devinfo, as[ch->as].dacs[i]); 6561 if (w == NULL || w->enable == 0) 6562 continue; 6563 cap = w->param.supp_stream_formats; 6564 if (!HDA_PARAM_SUPP_STREAM_FORMATS_PCM(cap) && 6565 !HDA_PARAM_SUPP_STREAM_FORMATS_AC3(cap)) 6566 continue; 6567 /* Many CODECs does not declare AC3 support on SPDIF. 6568 I don't beleave that they doesn't support it! */ 6569 if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) 6570 cap |= HDA_PARAM_SUPP_STREAM_FORMATS_AC3_MASK; 6571 if (ret == 0) { 6572 fmtcap = cap; 6573 pcmcap = w->param.supp_pcm_size_rate; 6574 } else { 6575 fmtcap &= cap; 6576 pcmcap &= w->param.supp_pcm_size_rate; 6577 } 6578 ch->io[ret++] = as[ch->as].dacs[i]; 6579 /* Do not count redirection pin/dac channels. */ 6580 if (i == 15 && as[ch->as].hpredir >= 0) 6581 continue; 6582 channels += HDA_PARAM_AUDIO_WIDGET_CAP_CC(w->param.widget_cap) + 1; 6583 if (HDA_PARAM_AUDIO_WIDGET_CAP_CC(w->param.widget_cap) != 1) 6584 onlystereo = 0; 6585 pinset |= (1 << i); 6586 } 6587 ch->io[ret] = -1; 6588 6589 if (as[ch->as].fakeredir) 6590 ret--; 6591 /* Standard speaks only about stereo pins and playback, ... */ 6592 if ((!onlystereo) || as[ch->as].dir != HDA_CTL_OUT) 6593 pinset = 0; 6594 /* ..., but there it gives us info about speakers layout. */ 6595 as[ch->as].pinset = pinset; 6596 6597 ch->supp_stream_formats = fmtcap; 6598 ch->supp_pcm_size_rate = pcmcap; 6599 6600 /* 6601 * 8bit = 0 6602 * 16bit = 1 6603 * 20bit = 2 6604 * 24bit = 3 6605 * 32bit = 4 6606 */ 6607 if (ret > 0) { 6608 i = 0; 6609 if (HDA_PARAM_SUPP_STREAM_FORMATS_PCM(fmtcap)) { 6610 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_16BIT(pcmcap)) 6611 ch->bit16 = 1; 6612 else if (HDA_PARAM_SUPP_PCM_SIZE_RATE_8BIT(pcmcap)) 6613 ch->bit16 = 0; 6614 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_32BIT(pcmcap)) 6615 ch->bit32 = 4; 6616 else if (HDA_PARAM_SUPP_PCM_SIZE_RATE_24BIT(pcmcap)) 6617 ch->bit32 = 3; 6618 else if (HDA_PARAM_SUPP_PCM_SIZE_RATE_20BIT(pcmcap)) 6619 ch->bit32 = 2; 6620 if (!(devinfo->function.audio.quirks & HDA_QUIRK_FORCESTEREO)) { 6621 ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 1, 0); 6622 if (ch->bit32) 6623 ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 1, 0); 6624 } 6625 if (channels >= 2) { 6626 ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 2, 0); 6627 if (ch->bit32) 6628 ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 2, 0); 6629 } 6630 if (channels == 4 || /* Any 4-channel */ 6631 pinset == 0x0007 || /* 5.1 */ 6632 pinset == 0x0013 || /* 5.1 */ 6633 pinset == 0x0017) { /* 7.1 */ 6634 ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 4, 0); 6635 if (ch->bit32) 6636 ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 4, 0); 6637 } 6638 if (channels == 6 || /* Any 6-channel */ 6639 pinset == 0x0017) { /* 7.1 */ 6640 ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 6, 1); 6641 if (ch->bit32) 6642 ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 6, 1); 6643 } 6644 if (channels == 8) { /* Any 8-channel */ 6645 ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 8, 1); 6646 if (ch->bit32) 6647 ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 8, 1); 6648 } 6649 } 6650 if (HDA_PARAM_SUPP_STREAM_FORMATS_AC3(fmtcap)) { 6651 ch->fmtlist[i++] = SND_FORMAT(AFMT_AC3, 2, 0); 6652 } 6653 ch->fmtlist[i] = 0; 6654 i = 0; 6655 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_8KHZ(pcmcap)) 6656 ch->pcmrates[i++] = 8000; 6657 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_11KHZ(pcmcap)) 6658 ch->pcmrates[i++] = 11025; 6659 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_16KHZ(pcmcap)) 6660 ch->pcmrates[i++] = 16000; 6661 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_22KHZ(pcmcap)) 6662 ch->pcmrates[i++] = 22050; 6663 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_32KHZ(pcmcap)) 6664 ch->pcmrates[i++] = 32000; 6665 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_44KHZ(pcmcap)) 6666 ch->pcmrates[i++] = 44100; 6667 /* if (HDA_PARAM_SUPP_PCM_SIZE_RATE_48KHZ(pcmcap)) */ 6668 ch->pcmrates[i++] = 48000; 6669 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_88KHZ(pcmcap)) 6670 ch->pcmrates[i++] = 88200; 6671 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_96KHZ(pcmcap)) 6672 ch->pcmrates[i++] = 96000; 6673 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_176KHZ(pcmcap)) 6674 ch->pcmrates[i++] = 176400; 6675 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_192KHZ(pcmcap)) 6676 ch->pcmrates[i++] = 192000; 6677 /* if (HDA_PARAM_SUPP_PCM_SIZE_RATE_384KHZ(pcmcap)) */ 6678 ch->pcmrates[i] = 0; 6679 if (i > 0) { 6680 ch->caps.minspeed = ch->pcmrates[0]; 6681 ch->caps.maxspeed = ch->pcmrates[i - 1]; 6682 } 6683 } 6684 6685 return (ret); 6686 } 6687 6688 static void 6689 hdac_create_pcms(struct hdac_devinfo *devinfo) 6690 { 6691 struct hdac_softc *sc = devinfo->codec->sc; 6692 struct hdac_audio_as *as = devinfo->function.audio.as; 6693 int i, j, apdev = 0, ardev = 0, dpdev = 0, drdev = 0; 6694 6695 for (i = 0; i < devinfo->function.audio.ascnt; i++) { 6696 if (as[i].enable == 0) 6697 continue; 6698 if (as[i].dir == HDA_CTL_IN) { 6699 if (as[i].digital) 6700 drdev++; 6701 else 6702 ardev++; 6703 } else { 6704 if (as[i].digital) 6705 dpdev++; 6706 else 6707 apdev++; 6708 } 6709 } 6710 devinfo->function.audio.num_devs = 6711 max(ardev, apdev) + max(drdev, dpdev); 6712 devinfo->function.audio.devs = 6713 (struct hdac_pcm_devinfo *)malloc( 6714 devinfo->function.audio.num_devs * sizeof(struct hdac_pcm_devinfo), 6715 M_HDAC, M_ZERO | M_NOWAIT); 6716 if (devinfo->function.audio.devs == NULL) { 6717 device_printf(sc->dev, 6718 "Unable to allocate memory for devices\n"); 6719 return; 6720 } 6721 for (i = 0; i < devinfo->function.audio.num_devs; i++) { 6722 devinfo->function.audio.devs[i].index = i; 6723 devinfo->function.audio.devs[i].devinfo = devinfo; 6724 devinfo->function.audio.devs[i].play = -1; 6725 devinfo->function.audio.devs[i].rec = -1; 6726 devinfo->function.audio.devs[i].digital = 255; 6727 } 6728 for (i = 0; i < devinfo->function.audio.ascnt; i++) { 6729 if (as[i].enable == 0) 6730 continue; 6731 for (j = 0; j < devinfo->function.audio.num_devs; j++) { 6732 if (devinfo->function.audio.devs[j].digital != 255 && 6733 (!devinfo->function.audio.devs[j].digital) != 6734 (!as[i].digital)) 6735 continue; 6736 if (as[i].dir == HDA_CTL_IN) { 6737 if (devinfo->function.audio.devs[j].rec >= 0) 6738 continue; 6739 devinfo->function.audio.devs[j].rec 6740 = as[i].chan; 6741 } else { 6742 if (devinfo->function.audio.devs[j].play >= 0) 6743 continue; 6744 devinfo->function.audio.devs[j].play 6745 = as[i].chan; 6746 } 6747 sc->chans[as[i].chan].pdevinfo = 6748 &devinfo->function.audio.devs[j]; 6749 devinfo->function.audio.devs[j].digital = 6750 as[i].digital; 6751 break; 6752 } 6753 } 6754 for (i = 0; i < devinfo->function.audio.num_devs; i++) { 6755 struct hdac_pcm_devinfo *pdevinfo = 6756 &devinfo->function.audio.devs[i]; 6757 pdevinfo->dev = 6758 device_add_child(sc->dev, "pcm", -1); 6759 device_set_ivars(pdevinfo->dev, 6760 (void *)pdevinfo); 6761 } 6762 } 6763 6764 static void 6765 hdac_dump_ctls(struct hdac_pcm_devinfo *pdevinfo, const char *banner, uint32_t flag) 6766 { 6767 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 6768 struct hdac_audio_ctl *ctl; 6769 struct hdac_softc *sc = devinfo->codec->sc; 6770 char buf[64]; 6771 int i, j, printed; 6772 6773 if (flag == 0) { 6774 flag = ~(SOUND_MASK_VOLUME | SOUND_MASK_PCM | 6775 SOUND_MASK_CD | SOUND_MASK_LINE | SOUND_MASK_RECLEV | 6776 SOUND_MASK_MIC | SOUND_MASK_SPEAKER | SOUND_MASK_IGAIN | 6777 SOUND_MASK_OGAIN | SOUND_MASK_IMIX | SOUND_MASK_MONITOR); 6778 } 6779 6780 for (j = 0; j < SOUND_MIXER_NRDEVICES; j++) { 6781 if ((flag & (1 << j)) == 0) 6782 continue; 6783 i = 0; 6784 printed = 0; 6785 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 6786 if (ctl->enable == 0 || 6787 ctl->widget->enable == 0) 6788 continue; 6789 if (!((pdevinfo->play >= 0 && 6790 ctl->widget->bindas == sc->chans[pdevinfo->play].as) || 6791 (pdevinfo->rec >= 0 && 6792 ctl->widget->bindas == sc->chans[pdevinfo->rec].as) || 6793 (ctl->widget->bindas == -2 && pdevinfo->index == 0))) 6794 continue; 6795 if ((ctl->ossmask & (1 << j)) == 0) 6796 continue; 6797 6798 if (printed == 0) { 6799 device_printf(pdevinfo->dev, "\n"); 6800 if (banner != NULL) { 6801 device_printf(pdevinfo->dev, "%s", banner); 6802 } else { 6803 device_printf(pdevinfo->dev, "Unknown Ctl"); 6804 } 6805 printf(" (OSS: %s)\n", 6806 hdac_audio_ctl_ossmixer_mask2allname(1 << j, 6807 buf, sizeof(buf))); 6808 device_printf(pdevinfo->dev, " |\n"); 6809 printed = 1; 6810 } 6811 device_printf(pdevinfo->dev, " +- ctl %2d (nid %3d %s", i, 6812 ctl->widget->nid, 6813 (ctl->ndir == HDA_CTL_IN)?"in ":"out"); 6814 if (ctl->ndir == HDA_CTL_IN && ctl->ndir == ctl->dir) 6815 printf(" %2d): ", ctl->index); 6816 else 6817 printf("): "); 6818 if (ctl->step > 0) { 6819 printf("%+d/%+ddB (%d steps)%s\n", 6820 (0 - ctl->offset) * (ctl->size + 1) / 4, 6821 (ctl->step - ctl->offset) * (ctl->size + 1) / 4, 6822 ctl->step + 1, 6823 ctl->mute?" + mute":""); 6824 } else 6825 printf("%s\n", ctl->mute?"mute":""); 6826 } 6827 } 6828 } 6829 6830 static void 6831 hdac_dump_audio_formats(device_t dev, uint32_t fcap, uint32_t pcmcap) 6832 { 6833 uint32_t cap; 6834 6835 cap = fcap; 6836 if (cap != 0) { 6837 device_printf(dev, " Stream cap: 0x%08x\n", cap); 6838 device_printf(dev, " "); 6839 if (HDA_PARAM_SUPP_STREAM_FORMATS_AC3(cap)) 6840 printf(" AC3"); 6841 if (HDA_PARAM_SUPP_STREAM_FORMATS_FLOAT32(cap)) 6842 printf(" FLOAT32"); 6843 if (HDA_PARAM_SUPP_STREAM_FORMATS_PCM(cap)) 6844 printf(" PCM"); 6845 printf("\n"); 6846 } 6847 cap = pcmcap; 6848 if (cap != 0) { 6849 device_printf(dev, " PCM cap: 0x%08x\n", cap); 6850 device_printf(dev, " "); 6851 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_8BIT(cap)) 6852 printf(" 8"); 6853 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_16BIT(cap)) 6854 printf(" 16"); 6855 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_20BIT(cap)) 6856 printf(" 20"); 6857 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_24BIT(cap)) 6858 printf(" 24"); 6859 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_32BIT(cap)) 6860 printf(" 32"); 6861 printf(" bits,"); 6862 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_8KHZ(cap)) 6863 printf(" 8"); 6864 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_11KHZ(cap)) 6865 printf(" 11"); 6866 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_16KHZ(cap)) 6867 printf(" 16"); 6868 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_22KHZ(cap)) 6869 printf(" 22"); 6870 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_32KHZ(cap)) 6871 printf(" 32"); 6872 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_44KHZ(cap)) 6873 printf(" 44"); 6874 printf(" 48"); 6875 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_88KHZ(cap)) 6876 printf(" 88"); 6877 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_96KHZ(cap)) 6878 printf(" 96"); 6879 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_176KHZ(cap)) 6880 printf(" 176"); 6881 if (HDA_PARAM_SUPP_PCM_SIZE_RATE_192KHZ(cap)) 6882 printf(" 192"); 6883 printf(" KHz\n"); 6884 } 6885 } 6886 6887 static void 6888 hdac_dump_pin(struct hdac_softc *sc, struct hdac_widget *w) 6889 { 6890 uint32_t pincap; 6891 6892 pincap = w->wclass.pin.cap; 6893 6894 device_printf(sc->dev, " Pin cap: 0x%08x\n", pincap); 6895 device_printf(sc->dev, " "); 6896 if (HDA_PARAM_PIN_CAP_IMP_SENSE_CAP(pincap)) 6897 printf(" ISC"); 6898 if (HDA_PARAM_PIN_CAP_TRIGGER_REQD(pincap)) 6899 printf(" TRQD"); 6900 if (HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP(pincap)) 6901 printf(" PDC"); 6902 if (HDA_PARAM_PIN_CAP_HEADPHONE_CAP(pincap)) 6903 printf(" HP"); 6904 if (HDA_PARAM_PIN_CAP_OUTPUT_CAP(pincap)) 6905 printf(" OUT"); 6906 if (HDA_PARAM_PIN_CAP_INPUT_CAP(pincap)) 6907 printf(" IN"); 6908 if (HDA_PARAM_PIN_CAP_BALANCED_IO_PINS(pincap)) 6909 printf(" BAL"); 6910 if (HDA_PARAM_PIN_CAP_HDMI(pincap)) 6911 printf(" HDMI"); 6912 if (HDA_PARAM_PIN_CAP_VREF_CTRL(pincap)) { 6913 printf(" VREF["); 6914 if (HDA_PARAM_PIN_CAP_VREF_CTRL_50(pincap)) 6915 printf(" 50"); 6916 if (HDA_PARAM_PIN_CAP_VREF_CTRL_80(pincap)) 6917 printf(" 80"); 6918 if (HDA_PARAM_PIN_CAP_VREF_CTRL_100(pincap)) 6919 printf(" 100"); 6920 if (HDA_PARAM_PIN_CAP_VREF_CTRL_GROUND(pincap)) 6921 printf(" GROUND"); 6922 if (HDA_PARAM_PIN_CAP_VREF_CTRL_HIZ(pincap)) 6923 printf(" HIZ"); 6924 printf(" ]"); 6925 } 6926 if (HDA_PARAM_PIN_CAP_EAPD_CAP(pincap)) 6927 printf(" EAPD"); 6928 if (HDA_PARAM_PIN_CAP_DP(pincap)) 6929 printf(" DP"); 6930 if (HDA_PARAM_PIN_CAP_HBR(pincap)) 6931 printf(" HBR"); 6932 printf("\n"); 6933 device_printf(sc->dev, " Pin config: 0x%08x\n", 6934 w->wclass.pin.config); 6935 device_printf(sc->dev, " Pin control: 0x%08x", w->wclass.pin.ctrl); 6936 if (w->wclass.pin.ctrl & HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE) 6937 printf(" HP"); 6938 if (w->wclass.pin.ctrl & HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE) 6939 printf(" IN"); 6940 if (w->wclass.pin.ctrl & HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE) 6941 printf(" OUT"); 6942 if (w->wclass.pin.ctrl & HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE_MASK) 6943 printf(" VREFs"); 6944 printf("\n"); 6945 } 6946 6947 static void 6948 hdac_dump_pin_config(struct hdac_widget *w, uint32_t conf) 6949 { 6950 struct hdac_softc *sc = w->devinfo->codec->sc; 6951 6952 device_printf(sc->dev, " nid %d 0x%08x as %2d seq %2d %13s %5s " 6953 "jack %2d loc %2d color %7s misc %d%s\n", 6954 w->nid, conf, 6955 HDA_CONFIG_DEFAULTCONF_ASSOCIATION(conf), 6956 HDA_CONFIG_DEFAULTCONF_SEQUENCE(conf), 6957 HDA_DEVS[HDA_CONFIG_DEFAULTCONF_DEVICE(conf)], 6958 HDA_CONNS[HDA_CONFIG_DEFAULTCONF_CONNECTIVITY(conf)], 6959 HDA_CONFIG_DEFAULTCONF_CONNECTION_TYPE(conf), 6960 HDA_CONFIG_DEFAULTCONF_LOCATION(conf), 6961 HDA_COLORS[HDA_CONFIG_DEFAULTCONF_COLOR(conf)], 6962 HDA_CONFIG_DEFAULTCONF_MISC(conf), 6963 (w->enable == 0)?" [DISABLED]":""); 6964 } 6965 6966 static void 6967 hdac_dump_pin_configs(struct hdac_devinfo *devinfo) 6968 { 6969 struct hdac_widget *w; 6970 int i; 6971 6972 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 6973 w = hdac_widget_get(devinfo, i); 6974 if (w == NULL) 6975 continue; 6976 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 6977 continue; 6978 hdac_dump_pin_config(w, w->wclass.pin.config); 6979 } 6980 } 6981 6982 static void 6983 hdac_dump_amp(struct hdac_softc *sc, uint32_t cap, char *banner) 6984 { 6985 device_printf(sc->dev, " %s amp: 0x%08x\n", banner, cap); 6986 device_printf(sc->dev, " " 6987 "mute=%d step=%d size=%d offset=%d\n", 6988 HDA_PARAM_OUTPUT_AMP_CAP_MUTE_CAP(cap), 6989 HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS(cap), 6990 HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE(cap), 6991 HDA_PARAM_OUTPUT_AMP_CAP_OFFSET(cap)); 6992 } 6993 6994 static void 6995 hdac_dump_nodes(struct hdac_devinfo *devinfo) 6996 { 6997 struct hdac_softc *sc = devinfo->codec->sc; 6998 static char *ossname[] = SOUND_DEVICE_NAMES; 6999 struct hdac_widget *w, *cw; 7000 char buf[64]; 7001 int i, j; 7002 7003 device_printf(sc->dev, "\n"); 7004 device_printf(sc->dev, "Default Parameter\n"); 7005 device_printf(sc->dev, "-----------------\n"); 7006 hdac_dump_audio_formats(sc->dev, 7007 devinfo->function.audio.supp_stream_formats, 7008 devinfo->function.audio.supp_pcm_size_rate); 7009 device_printf(sc->dev, " IN amp: 0x%08x\n", 7010 devinfo->function.audio.inamp_cap); 7011 device_printf(sc->dev, " OUT amp: 0x%08x\n", 7012 devinfo->function.audio.outamp_cap); 7013 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 7014 w = hdac_widget_get(devinfo, i); 7015 if (w == NULL) { 7016 device_printf(sc->dev, "Ghost widget nid=%d\n", i); 7017 continue; 7018 } 7019 device_printf(sc->dev, "\n"); 7020 device_printf(sc->dev, " nid: %d%s\n", w->nid, 7021 (w->enable == 0) ? " [DISABLED]" : ""); 7022 device_printf(sc->dev, " Name: %s\n", w->name); 7023 device_printf(sc->dev, " Widget cap: 0x%08x\n", 7024 w->param.widget_cap); 7025 if (w->param.widget_cap & 0x0ee1) { 7026 device_printf(sc->dev, " "); 7027 if (HDA_PARAM_AUDIO_WIDGET_CAP_LR_SWAP(w->param.widget_cap)) 7028 printf(" LRSWAP"); 7029 if (HDA_PARAM_AUDIO_WIDGET_CAP_POWER_CTRL(w->param.widget_cap)) 7030 printf(" PWR"); 7031 if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) 7032 printf(" DIGITAL"); 7033 if (HDA_PARAM_AUDIO_WIDGET_CAP_UNSOL_CAP(w->param.widget_cap)) 7034 printf(" UNSOL"); 7035 if (HDA_PARAM_AUDIO_WIDGET_CAP_PROC_WIDGET(w->param.widget_cap)) 7036 printf(" PROC"); 7037 if (HDA_PARAM_AUDIO_WIDGET_CAP_STRIPE(w->param.widget_cap)) 7038 printf(" STRIPE"); 7039 j = HDA_PARAM_AUDIO_WIDGET_CAP_CC(w->param.widget_cap); 7040 if (j == 1) 7041 printf(" STEREO"); 7042 else if (j > 1) 7043 printf(" %dCH", j + 1); 7044 printf("\n"); 7045 } 7046 if (w->bindas != -1) { 7047 device_printf(sc->dev, " Association: %d (0x%08x)\n", 7048 w->bindas, w->bindseqmask); 7049 } 7050 if (w->ossmask != 0 || w->ossdev >= 0) { 7051 device_printf(sc->dev, " OSS: %s", 7052 hdac_audio_ctl_ossmixer_mask2allname(w->ossmask, buf, sizeof(buf))); 7053 if (w->ossdev >= 0) 7054 printf(" (%s)", ossname[w->ossdev]); 7055 printf("\n"); 7056 } 7057 if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_OUTPUT || 7058 w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) { 7059 hdac_dump_audio_formats(sc->dev, 7060 w->param.supp_stream_formats, 7061 w->param.supp_pcm_size_rate); 7062 } else if (w->type == 7063 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 7064 hdac_dump_pin(sc, w); 7065 if (w->param.eapdbtl != HDAC_INVALID) 7066 device_printf(sc->dev, " EAPD: 0x%08x\n", 7067 w->param.eapdbtl); 7068 if (HDA_PARAM_AUDIO_WIDGET_CAP_OUT_AMP(w->param.widget_cap) && 7069 w->param.outamp_cap != 0) 7070 hdac_dump_amp(sc, w->param.outamp_cap, "Output"); 7071 if (HDA_PARAM_AUDIO_WIDGET_CAP_IN_AMP(w->param.widget_cap) && 7072 w->param.inamp_cap != 0) 7073 hdac_dump_amp(sc, w->param.inamp_cap, " Input"); 7074 if (w->nconns > 0) { 7075 device_printf(sc->dev, " connections: %d\n", w->nconns); 7076 device_printf(sc->dev, " |\n"); 7077 } 7078 for (j = 0; j < w->nconns; j++) { 7079 cw = hdac_widget_get(devinfo, w->conns[j]); 7080 device_printf(sc->dev, " + %s<- nid=%d [%s]", 7081 (w->connsenable[j] == 0)?"[DISABLED] ":"", 7082 w->conns[j], (cw == NULL) ? "GHOST!" : cw->name); 7083 if (cw == NULL) 7084 printf(" [UNKNOWN]"); 7085 else if (cw->enable == 0) 7086 printf(" [DISABLED]"); 7087 if (w->nconns > 1 && w->selconn == j && w->type != 7088 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_MIXER) 7089 printf(" (selected)"); 7090 printf("\n"); 7091 } 7092 } 7093 7094 } 7095 7096 static void 7097 hdac_dump_dst_nid(struct hdac_pcm_devinfo *pdevinfo, nid_t nid, int depth) 7098 { 7099 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 7100 struct hdac_widget *w, *cw; 7101 char buf[64]; 7102 int i, printed = 0; 7103 7104 if (depth > HDA_PARSE_MAXDEPTH) 7105 return; 7106 7107 w = hdac_widget_get(devinfo, nid); 7108 if (w == NULL || w->enable == 0) 7109 return; 7110 7111 if (depth == 0) 7112 device_printf(pdevinfo->dev, "%*s", 4, ""); 7113 else 7114 device_printf(pdevinfo->dev, "%*s + <- ", 4 + (depth - 1) * 7, ""); 7115 printf("nid=%d [%s]", w->nid, w->name); 7116 7117 if (depth > 0) { 7118 if (w->ossmask == 0) { 7119 printf("\n"); 7120 return; 7121 } 7122 printf(" [src: %s]", 7123 hdac_audio_ctl_ossmixer_mask2allname( 7124 w->ossmask, buf, sizeof(buf))); 7125 if (w->ossdev >= 0) { 7126 printf("\n"); 7127 return; 7128 } 7129 } 7130 printf("\n"); 7131 7132 for (i = 0; i < w->nconns; i++) { 7133 if (w->connsenable[i] == 0) 7134 continue; 7135 cw = hdac_widget_get(devinfo, w->conns[i]); 7136 if (cw == NULL || cw->enable == 0 || cw->bindas == -1) 7137 continue; 7138 if (printed == 0) { 7139 device_printf(pdevinfo->dev, "%*s |\n", 4 + (depth) * 7, ""); 7140 printed = 1; 7141 } 7142 hdac_dump_dst_nid(pdevinfo, w->conns[i], depth + 1); 7143 } 7144 7145 } 7146 7147 static void 7148 hdac_dump_dac(struct hdac_pcm_devinfo *pdevinfo) 7149 { 7150 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 7151 struct hdac_softc *sc = devinfo->codec->sc; 7152 struct hdac_audio_as *as; 7153 struct hdac_widget *w; 7154 int i, printed = 0; 7155 7156 if (pdevinfo->play < 0) 7157 return; 7158 7159 as = &devinfo->function.audio.as[sc->chans[pdevinfo->play].as]; 7160 for (i = 0; i < 16; i++) { 7161 if (as->pins[i] <= 0) 7162 continue; 7163 w = hdac_widget_get(devinfo, as->pins[i]); 7164 if (w == NULL || w->enable == 0) 7165 continue; 7166 if (printed == 0) { 7167 printed = 1; 7168 device_printf(pdevinfo->dev, "\n"); 7169 device_printf(pdevinfo->dev, "Playback:\n"); 7170 } 7171 device_printf(pdevinfo->dev, "\n"); 7172 hdac_dump_dst_nid(pdevinfo, as->pins[i], 0); 7173 } 7174 } 7175 7176 static void 7177 hdac_dump_adc(struct hdac_pcm_devinfo *pdevinfo) 7178 { 7179 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 7180 struct hdac_softc *sc = devinfo->codec->sc; 7181 struct hdac_widget *w; 7182 int i; 7183 int printed = 0; 7184 7185 if (pdevinfo->rec < 0) 7186 return; 7187 7188 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 7189 w = hdac_widget_get(devinfo, i); 7190 if (w == NULL || w->enable == 0) 7191 continue; 7192 if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) 7193 continue; 7194 if (w->bindas != sc->chans[pdevinfo->rec].as) 7195 continue; 7196 if (printed == 0) { 7197 printed = 1; 7198 device_printf(pdevinfo->dev, "\n"); 7199 device_printf(pdevinfo->dev, "Record:\n"); 7200 } 7201 device_printf(pdevinfo->dev, "\n"); 7202 hdac_dump_dst_nid(pdevinfo, i, 0); 7203 } 7204 } 7205 7206 static void 7207 hdac_dump_mix(struct hdac_pcm_devinfo *pdevinfo) 7208 { 7209 struct hdac_devinfo *devinfo = pdevinfo->devinfo; 7210 struct hdac_widget *w; 7211 int i; 7212 int printed = 0; 7213 7214 if (pdevinfo->index != 0) 7215 return; 7216 7217 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 7218 w = hdac_widget_get(devinfo, i); 7219 if (w == NULL || w->enable == 0) 7220 continue; 7221 if (w->ossdev != SOUND_MIXER_IMIX) 7222 continue; 7223 if (printed == 0) { 7224 printed = 1; 7225 device_printf(pdevinfo->dev, "\n"); 7226 device_printf(pdevinfo->dev, "Input Mix:\n"); 7227 } 7228 device_printf(pdevinfo->dev, "\n"); 7229 hdac_dump_dst_nid(pdevinfo, i, 0); 7230 } 7231 } 7232 7233 static void 7234 hdac_dump_pcmchannels(struct hdac_pcm_devinfo *pdevinfo) 7235 { 7236 struct hdac_softc *sc = pdevinfo->devinfo->codec->sc; 7237 nid_t *nids; 7238 int i; 7239 7240 if (pdevinfo->play >= 0) { 7241 i = pdevinfo->play; 7242 device_printf(pdevinfo->dev, "\n"); 7243 device_printf(pdevinfo->dev, "Playback:\n"); 7244 device_printf(pdevinfo->dev, "\n"); 7245 hdac_dump_audio_formats(pdevinfo->dev, sc->chans[i].supp_stream_formats, 7246 sc->chans[i].supp_pcm_size_rate); 7247 device_printf(pdevinfo->dev, " DAC:"); 7248 for (nids = sc->chans[i].io; *nids != -1; nids++) 7249 printf(" %d", *nids); 7250 printf("\n"); 7251 } 7252 if (pdevinfo->rec >= 0) { 7253 i = pdevinfo->rec; 7254 device_printf(pdevinfo->dev, "\n"); 7255 device_printf(pdevinfo->dev, "Record:\n"); 7256 device_printf(pdevinfo->dev, "\n"); 7257 hdac_dump_audio_formats(pdevinfo->dev, sc->chans[i].supp_stream_formats, 7258 sc->chans[i].supp_pcm_size_rate); 7259 device_printf(pdevinfo->dev, " ADC:"); 7260 for (nids = sc->chans[i].io; *nids != -1; nids++) 7261 printf(" %d", *nids); 7262 printf("\n"); 7263 } 7264 } 7265 7266 static void 7267 hdac_release_resources(struct hdac_softc *sc) 7268 { 7269 int i, j; 7270 7271 if (sc == NULL) 7272 return; 7273 7274 hdac_lock(sc); 7275 sc->polling = 0; 7276 sc->poll_ival = 0; 7277 callout_stop(&sc->poll_hda); 7278 callout_stop(&sc->poll_hdac); 7279 callout_stop(&sc->poll_jack); 7280 hdac_reset(sc, 0); 7281 hdac_unlock(sc); 7282 taskqueue_drain(taskqueue_thread, &sc->unsolq_task); 7283 callout_drain(&sc->poll_hda); 7284 callout_drain(&sc->poll_hdac); 7285 callout_drain(&sc->poll_jack); 7286 7287 hdac_irq_free(sc); 7288 7289 for (i = 0; i < HDAC_CODEC_MAX; i++) { 7290 if (sc->codecs[i] == NULL) 7291 continue; 7292 for (j = 0; j < sc->codecs[i]->num_fgs; j++) { 7293 free(sc->codecs[i]->fgs[j].widget, M_HDAC); 7294 if (sc->codecs[i]->fgs[j].node_type == 7295 HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) { 7296 free(sc->codecs[i]->fgs[j].function.audio.ctl, 7297 M_HDAC); 7298 free(sc->codecs[i]->fgs[j].function.audio.as, 7299 M_HDAC); 7300 free(sc->codecs[i]->fgs[j].function.audio.devs, 7301 M_HDAC); 7302 } 7303 } 7304 free(sc->codecs[i]->fgs, M_HDAC); 7305 free(sc->codecs[i], M_HDAC); 7306 sc->codecs[i] = NULL; 7307 } 7308 7309 hdac_dma_free(sc, &sc->pos_dma); 7310 hdac_dma_free(sc, &sc->rirb_dma); 7311 hdac_dma_free(sc, &sc->corb_dma); 7312 for (i = 0; i < sc->num_chans; i++) { 7313 if (sc->chans[i].blkcnt > 0) 7314 hdac_dma_free(sc, &sc->chans[i].bdl_dma); 7315 } 7316 free(sc->chans, M_HDAC); 7317 if (sc->chan_dmat != NULL) { 7318 bus_dma_tag_destroy(sc->chan_dmat); 7319 sc->chan_dmat = NULL; 7320 } 7321 hdac_mem_free(sc); 7322 snd_mtxfree(sc->lock); 7323 } 7324 7325 /* This function surely going to make its way into upper level someday. */ 7326 static void 7327 hdac_config_fetch(struct hdac_softc *sc, uint32_t *on, uint32_t *off) 7328 { 7329 const char *res = NULL; 7330 int i = 0, j, k, len, inv; 7331 7332 if (on != NULL) 7333 *on = 0; 7334 if (off != NULL) 7335 *off = 0; 7336 if (sc == NULL) 7337 return; 7338 if (resource_string_value(device_get_name(sc->dev), 7339 device_get_unit(sc->dev), "config", &res) != 0) 7340 return; 7341 if (!(res != NULL && strlen(res) > 0)) 7342 return; 7343 HDA_BOOTVERBOSE( 7344 device_printf(sc->dev, "HDA Config:"); 7345 ); 7346 for (;;) { 7347 while (res[i] != '\0' && 7348 (res[i] == ',' || isspace(res[i]) != 0)) 7349 i++; 7350 if (res[i] == '\0') { 7351 HDA_BOOTVERBOSE( 7352 printf("\n"); 7353 ); 7354 return; 7355 } 7356 j = i; 7357 while (res[j] != '\0' && 7358 !(res[j] == ',' || isspace(res[j]) != 0)) 7359 j++; 7360 len = j - i; 7361 if (len > 2 && strncmp(res + i, "no", 2) == 0) 7362 inv = 2; 7363 else 7364 inv = 0; 7365 for (k = 0; len > inv && k < HDAC_QUIRKS_TAB_LEN; k++) { 7366 if (strncmp(res + i + inv, 7367 hdac_quirks_tab[k].key, len - inv) != 0) 7368 continue; 7369 if (len - inv != strlen(hdac_quirks_tab[k].key)) 7370 continue; 7371 HDA_BOOTVERBOSE( 7372 printf(" %s%s", (inv != 0) ? "no" : "", 7373 hdac_quirks_tab[k].key); 7374 ); 7375 if (inv == 0 && on != NULL) 7376 *on |= hdac_quirks_tab[k].value; 7377 else if (inv != 0 && off != NULL) 7378 *off |= hdac_quirks_tab[k].value; 7379 break; 7380 } 7381 i = j; 7382 } 7383 } 7384 7385 static int 7386 sysctl_hdac_polling(SYSCTL_HANDLER_ARGS) 7387 { 7388 struct hdac_softc *sc; 7389 device_t dev; 7390 uint32_t ctl; 7391 int err, val; 7392 7393 dev = oidp->oid_arg1; 7394 sc = device_get_softc(dev); 7395 if (sc == NULL) 7396 return (EINVAL); 7397 hdac_lock(sc); 7398 val = sc->polling; 7399 hdac_unlock(sc); 7400 err = sysctl_handle_int(oidp, &val, 0, req); 7401 7402 if (err != 0 || req->newptr == NULL) 7403 return (err); 7404 if (val < 0 || val > 1) 7405 return (EINVAL); 7406 7407 hdac_lock(sc); 7408 if (val != sc->polling) { 7409 if (val == 0) { 7410 callout_stop(&sc->poll_hda); 7411 callout_stop(&sc->poll_hdac); 7412 hdac_unlock(sc); 7413 callout_drain(&sc->poll_hda); 7414 callout_drain(&sc->poll_hdac); 7415 hdac_lock(sc); 7416 sc->polling = 0; 7417 ctl = HDAC_READ_4(&sc->mem, HDAC_INTCTL); 7418 ctl |= HDAC_INTCTL_GIE; 7419 HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, ctl); 7420 } else { 7421 ctl = HDAC_READ_4(&sc->mem, HDAC_INTCTL); 7422 ctl &= ~HDAC_INTCTL_GIE; 7423 HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, ctl); 7424 hdac_unlock(sc); 7425 taskqueue_drain(taskqueue_thread, &sc->unsolq_task); 7426 hdac_lock(sc); 7427 sc->polling = 1; 7428 hdac_poll_reinit(sc); 7429 callout_reset(&sc->poll_hdac, 1, hdac_poll_callback, sc); 7430 } 7431 } 7432 hdac_unlock(sc); 7433 7434 return (err); 7435 } 7436 7437 static int 7438 sysctl_hdac_polling_interval(SYSCTL_HANDLER_ARGS) 7439 { 7440 struct hdac_softc *sc; 7441 device_t dev; 7442 int err, val; 7443 7444 dev = oidp->oid_arg1; 7445 sc = device_get_softc(dev); 7446 if (sc == NULL) 7447 return (EINVAL); 7448 hdac_lock(sc); 7449 val = ((uint64_t)sc->poll_ival * 1000) / hz; 7450 hdac_unlock(sc); 7451 err = sysctl_handle_int(oidp, &val, 0, req); 7452 7453 if (err != 0 || req->newptr == NULL) 7454 return (err); 7455 7456 if (val < 1) 7457 val = 1; 7458 if (val > 5000) 7459 val = 5000; 7460 val = ((uint64_t)val * hz) / 1000; 7461 if (val < 1) 7462 val = 1; 7463 if (val > (hz * 5)) 7464 val = hz * 5; 7465 7466 hdac_lock(sc); 7467 sc->poll_ival = val; 7468 hdac_unlock(sc); 7469 7470 return (err); 7471 } 7472 7473 static int 7474 sysctl_hdac_pindump(SYSCTL_HANDLER_ARGS) 7475 { 7476 struct hdac_softc *sc; 7477 struct hdac_codec *codec; 7478 struct hdac_devinfo *devinfo; 7479 struct hdac_widget *w; 7480 device_t dev; 7481 uint32_t res, pincap, delay; 7482 int codec_index, fg_index; 7483 int i, err, val; 7484 nid_t cad; 7485 7486 dev = oidp->oid_arg1; 7487 sc = device_get_softc(dev); 7488 if (sc == NULL) 7489 return (EINVAL); 7490 val = 0; 7491 err = sysctl_handle_int(oidp, &val, 0, req); 7492 if (err != 0 || req->newptr == NULL || val == 0) 7493 return (err); 7494 7495 /* XXX: Temporary. For debugging. */ 7496 if (val == 100) { 7497 hdac_suspend(dev); 7498 return (0); 7499 } else if (val == 101) { 7500 hdac_resume(dev); 7501 return (0); 7502 } 7503 7504 hdac_lock(sc); 7505 for (codec_index = 0; codec_index < HDAC_CODEC_MAX; codec_index++) { 7506 codec = sc->codecs[codec_index]; 7507 if (codec == NULL) 7508 continue; 7509 cad = codec->cad; 7510 for (fg_index = 0; fg_index < codec->num_fgs; fg_index++) { 7511 devinfo = &codec->fgs[fg_index]; 7512 if (devinfo->node_type != 7513 HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) 7514 continue; 7515 7516 device_printf(dev, "Dumping AFG cad=%d nid=%d pins:\n", 7517 codec_index, devinfo->nid); 7518 for (i = devinfo->startnode; i < devinfo->endnode; i++) { 7519 w = hdac_widget_get(devinfo, i); 7520 if (w == NULL || w->type != 7521 HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) 7522 continue; 7523 hdac_dump_pin_config(w, w->wclass.pin.config); 7524 pincap = w->wclass.pin.cap; 7525 device_printf(dev, " Caps: %2s %3s %2s %4s %4s", 7526 HDA_PARAM_PIN_CAP_INPUT_CAP(pincap)?"IN":"", 7527 HDA_PARAM_PIN_CAP_OUTPUT_CAP(pincap)?"OUT":"", 7528 HDA_PARAM_PIN_CAP_HEADPHONE_CAP(pincap)?"HP":"", 7529 HDA_PARAM_PIN_CAP_EAPD_CAP(pincap)?"EAPD":"", 7530 HDA_PARAM_PIN_CAP_VREF_CTRL(pincap)?"VREF":""); 7531 if (HDA_PARAM_PIN_CAP_IMP_SENSE_CAP(pincap) || 7532 HDA_PARAM_PIN_CAP_PRESENCE_DETECT_CAP(pincap)) { 7533 if (HDA_PARAM_PIN_CAP_TRIGGER_REQD(pincap)) { 7534 delay = 0; 7535 hdac_command(sc, 7536 HDA_CMD_SET_PIN_SENSE(cad, w->nid, 0), cad); 7537 do { 7538 res = hdac_command(sc, 7539 HDA_CMD_GET_PIN_SENSE(cad, w->nid), cad); 7540 if (res != 0x7fffffff && res != 0xffffffff) 7541 break; 7542 DELAY(10); 7543 } while (++delay < 10000); 7544 } else { 7545 delay = 0; 7546 res = hdac_command(sc, HDA_CMD_GET_PIN_SENSE(cad, 7547 w->nid), cad); 7548 } 7549 printf(" Sense: 0x%08x", res); 7550 if (delay > 0) 7551 printf(" delay %dus", delay * 10); 7552 } 7553 printf("\n"); 7554 } 7555 device_printf(dev, 7556 "NumGPIO=%d NumGPO=%d NumGPI=%d GPIWake=%d GPIUnsol=%d\n", 7557 HDA_PARAM_GPIO_COUNT_NUM_GPIO(devinfo->function.audio.gpio), 7558 HDA_PARAM_GPIO_COUNT_NUM_GPO(devinfo->function.audio.gpio), 7559 HDA_PARAM_GPIO_COUNT_NUM_GPI(devinfo->function.audio.gpio), 7560 HDA_PARAM_GPIO_COUNT_GPI_WAKE(devinfo->function.audio.gpio), 7561 HDA_PARAM_GPIO_COUNT_GPI_UNSOL(devinfo->function.audio.gpio)); 7562 if (HDA_PARAM_GPIO_COUNT_NUM_GPI(devinfo->function.audio.gpio) > 0) { 7563 device_printf(dev, " GPI:"); 7564 res = hdac_command(sc, 7565 HDA_CMD_GET_GPI_DATA(cad, devinfo->nid), cad); 7566 printf(" data=0x%08x", res); 7567 res = hdac_command(sc, 7568 HDA_CMD_GET_GPI_WAKE_ENABLE_MASK(cad, devinfo->nid), 7569 cad); 7570 printf(" wake=0x%08x", res); 7571 res = hdac_command(sc, 7572 HDA_CMD_GET_GPI_UNSOLICITED_ENABLE_MASK(cad, devinfo->nid), 7573 cad); 7574 printf(" unsol=0x%08x", res); 7575 res = hdac_command(sc, 7576 HDA_CMD_GET_GPI_STICKY_MASK(cad, devinfo->nid), cad); 7577 printf(" sticky=0x%08x\n", res); 7578 } 7579 if (HDA_PARAM_GPIO_COUNT_NUM_GPO(devinfo->function.audio.gpio) > 0) { 7580 device_printf(dev, " GPO:"); 7581 res = hdac_command(sc, 7582 HDA_CMD_GET_GPO_DATA(cad, devinfo->nid), cad); 7583 printf(" data=0x%08x\n", res); 7584 } 7585 if (HDA_PARAM_GPIO_COUNT_NUM_GPIO(devinfo->function.audio.gpio) > 0) { 7586 device_printf(dev, "GPIO:"); 7587 res = hdac_command(sc, 7588 HDA_CMD_GET_GPIO_DATA(cad, devinfo->nid), cad); 7589 printf(" data=0x%08x", res); 7590 res = hdac_command(sc, 7591 HDA_CMD_GET_GPIO_ENABLE_MASK(cad, devinfo->nid), cad); 7592 printf(" enable=0x%08x", res); 7593 res = hdac_command(sc, 7594 HDA_CMD_GET_GPIO_DIRECTION(cad, devinfo->nid), cad); 7595 printf(" direction=0x%08x\n", res); 7596 res = hdac_command(sc, 7597 HDA_CMD_GET_GPIO_WAKE_ENABLE_MASK(cad, devinfo->nid), cad); 7598 device_printf(dev, " wake=0x%08x", res); 7599 res = hdac_command(sc, 7600 HDA_CMD_GET_GPIO_UNSOLICITED_ENABLE_MASK(cad, devinfo->nid), 7601 cad); 7602 printf(" unsol=0x%08x", res); 7603 res = hdac_command(sc, 7604 HDA_CMD_GET_GPIO_STICKY_MASK(cad, devinfo->nid), cad); 7605 printf(" sticky=0x%08x\n", res); 7606 } 7607 } 7608 } 7609 hdac_unlock(sc); 7610 return (0); 7611 } 7612 7613 static void 7614 hdac_attach2(void *arg) 7615 { 7616 struct hdac_codec *codec; 7617 struct hdac_softc *sc; 7618 struct hdac_audio_ctl *ctl; 7619 uint32_t quirks_on, quirks_off; 7620 int codec_index, fg_index; 7621 int i, dmaalloc = 0; 7622 struct hdac_devinfo *devinfo; 7623 7624 sc = (struct hdac_softc *)arg; 7625 7626 hdac_config_fetch(sc, &quirks_on, &quirks_off); 7627 7628 HDA_BOOTHVERBOSE( 7629 device_printf(sc->dev, "HDA Config: on=0x%08x off=0x%08x\n", 7630 quirks_on, quirks_off); 7631 ); 7632 7633 hdac_lock(sc); 7634 7635 /* Remove ourselves from the config hooks */ 7636 if (sc->intrhook.ich_func != NULL) { 7637 config_intrhook_disestablish(&sc->intrhook); 7638 sc->intrhook.ich_func = NULL; 7639 } 7640 7641 /* Start the corb and rirb engines */ 7642 HDA_BOOTHVERBOSE( 7643 device_printf(sc->dev, "Starting CORB Engine...\n"); 7644 ); 7645 hdac_corb_start(sc); 7646 HDA_BOOTHVERBOSE( 7647 device_printf(sc->dev, "Starting RIRB Engine...\n"); 7648 ); 7649 hdac_rirb_start(sc); 7650 7651 HDA_BOOTHVERBOSE( 7652 device_printf(sc->dev, 7653 "Enabling controller interrupt...\n"); 7654 ); 7655 HDAC_WRITE_4(&sc->mem, HDAC_GCTL, HDAC_READ_4(&sc->mem, HDAC_GCTL) | 7656 HDAC_GCTL_UNSOL); 7657 if (sc->polling == 0) { 7658 HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, 7659 HDAC_INTCTL_CIE | HDAC_INTCTL_GIE); 7660 } else { 7661 callout_reset(&sc->poll_hdac, 1, hdac_poll_callback, sc); 7662 } 7663 DELAY(1000); 7664 7665 HDA_BOOTHVERBOSE( 7666 device_printf(sc->dev, 7667 "Scanning HDA codecs ...\n"); 7668 ); 7669 hdac_scan_codecs(sc); 7670 7671 for (codec_index = 0; codec_index < HDAC_CODEC_MAX; codec_index++) { 7672 codec = sc->codecs[codec_index]; 7673 if (codec == NULL) 7674 continue; 7675 for (fg_index = 0; fg_index < codec->num_fgs; fg_index++) { 7676 devinfo = &codec->fgs[fg_index]; 7677 HDA_BOOTVERBOSE( 7678 device_printf(sc->dev, "\n"); 7679 device_printf(sc->dev, 7680 "Processing %s FG cad=%d nid=%d...\n", 7681 (devinfo->node_type == HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) ? "audio": 7682 (devinfo->node_type == HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_MODEM) ? "modem": 7683 "unknown", 7684 devinfo->codec->cad, devinfo->nid); 7685 ); 7686 if (devinfo->node_type != 7687 HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) { 7688 HDA_BOOTHVERBOSE( 7689 device_printf(sc->dev, 7690 "Powering down...\n"); 7691 ); 7692 hdac_command(sc, 7693 HDA_CMD_SET_POWER_STATE(codec->cad, 7694 devinfo->nid, HDA_CMD_POWER_STATE_D3), 7695 codec->cad); 7696 continue; 7697 } 7698 7699 HDA_BOOTHVERBOSE( 7700 device_printf(sc->dev, "Powering up...\n"); 7701 ); 7702 hdac_powerup(devinfo); 7703 HDA_BOOTHVERBOSE( 7704 device_printf(sc->dev, "Parsing audio FG...\n"); 7705 ); 7706 hdac_audio_parse(devinfo); 7707 HDA_BOOTHVERBOSE( 7708 device_printf(sc->dev, "Parsing Ctls...\n"); 7709 ); 7710 hdac_audio_ctl_parse(devinfo); 7711 HDA_BOOTHVERBOSE( 7712 device_printf(sc->dev, "Parsing vendor patch...\n"); 7713 ); 7714 hdac_vendor_patch_parse(devinfo); 7715 devinfo->function.audio.quirks |= quirks_on; 7716 devinfo->function.audio.quirks &= ~quirks_off; 7717 7718 HDA_BOOTHVERBOSE( 7719 device_printf(sc->dev, "Disabling nonaudio...\n"); 7720 ); 7721 hdac_audio_disable_nonaudio(devinfo); 7722 HDA_BOOTHVERBOSE( 7723 device_printf(sc->dev, "Disabling useless...\n"); 7724 ); 7725 hdac_audio_disable_useless(devinfo); 7726 HDA_BOOTVERBOSE( 7727 device_printf(sc->dev, "Patched pins configuration:\n"); 7728 hdac_dump_pin_configs(devinfo); 7729 ); 7730 HDA_BOOTHVERBOSE( 7731 device_printf(sc->dev, "Parsing pin associations...\n"); 7732 ); 7733 hdac_audio_as_parse(devinfo); 7734 HDA_BOOTHVERBOSE( 7735 device_printf(sc->dev, "Building AFG tree...\n"); 7736 ); 7737 hdac_audio_build_tree(devinfo); 7738 HDA_BOOTHVERBOSE( 7739 device_printf(sc->dev, "Disabling unassociated " 7740 "widgets...\n"); 7741 ); 7742 hdac_audio_disable_unas(devinfo); 7743 HDA_BOOTHVERBOSE( 7744 device_printf(sc->dev, "Disabling nonselected " 7745 "inputs...\n"); 7746 ); 7747 hdac_audio_disable_notselected(devinfo); 7748 HDA_BOOTHVERBOSE( 7749 device_printf(sc->dev, "Disabling useless...\n"); 7750 ); 7751 hdac_audio_disable_useless(devinfo); 7752 HDA_BOOTHVERBOSE( 7753 device_printf(sc->dev, "Disabling " 7754 "crossassociatement connections...\n"); 7755 ); 7756 hdac_audio_disable_crossas(devinfo); 7757 HDA_BOOTHVERBOSE( 7758 device_printf(sc->dev, "Disabling useless...\n"); 7759 ); 7760 hdac_audio_disable_useless(devinfo); 7761 HDA_BOOTHVERBOSE( 7762 device_printf(sc->dev, "Binding associations to channels...\n"); 7763 ); 7764 hdac_audio_bind_as(devinfo); 7765 HDA_BOOTHVERBOSE( 7766 device_printf(sc->dev, "Assigning names to signal sources...\n"); 7767 ); 7768 hdac_audio_assign_names(devinfo); 7769 HDA_BOOTHVERBOSE( 7770 device_printf(sc->dev, "Assigning mixers to the tree...\n"); 7771 ); 7772 hdac_audio_assign_mixers(devinfo); 7773 HDA_BOOTHVERBOSE( 7774 device_printf(sc->dev, "Preparing pin controls...\n"); 7775 ); 7776 hdac_audio_prepare_pin_ctrl(devinfo); 7777 HDA_BOOTHVERBOSE( 7778 device_printf(sc->dev, "AFG commit...\n"); 7779 ); 7780 hdac_audio_commit(devinfo); 7781 HDA_BOOTHVERBOSE( 7782 device_printf(sc->dev, "HP switch init...\n"); 7783 ); 7784 hdac_hp_switch_init(devinfo); 7785 7786 if ((devinfo->function.audio.quirks & HDA_QUIRK_DMAPOS) && 7787 dmaalloc == 0) { 7788 if (hdac_dma_alloc(sc, &sc->pos_dma, 7789 (sc->num_iss + sc->num_oss + sc->num_bss) * 8) != 0) { 7790 HDA_BOOTVERBOSE( 7791 device_printf(sc->dev, "Failed to " 7792 "allocate DMA pos buffer " 7793 "(non-fatal)\n"); 7794 ); 7795 } else 7796 dmaalloc = 1; 7797 } 7798 7799 HDA_BOOTHVERBOSE( 7800 device_printf(sc->dev, "Creating PCM devices...\n"); 7801 ); 7802 hdac_create_pcms(devinfo); 7803 7804 HDA_BOOTVERBOSE( 7805 if (devinfo->function.audio.quirks != 0) { 7806 device_printf(sc->dev, "FG config/quirks:"); 7807 for (i = 0; i < HDAC_QUIRKS_TAB_LEN; i++) { 7808 if ((devinfo->function.audio.quirks & 7809 hdac_quirks_tab[i].value) == 7810 hdac_quirks_tab[i].value) 7811 printf(" %s", hdac_quirks_tab[i].key); 7812 } 7813 printf("\n"); 7814 } 7815 7816 device_printf(sc->dev, "\n"); 7817 device_printf(sc->dev, "+-------------------+\n"); 7818 device_printf(sc->dev, "| DUMPING HDA NODES |\n"); 7819 device_printf(sc->dev, "+-------------------+\n"); 7820 hdac_dump_nodes(devinfo); 7821 ); 7822 7823 HDA_BOOTHVERBOSE( 7824 device_printf(sc->dev, "\n"); 7825 device_printf(sc->dev, "+------------------------+\n"); 7826 device_printf(sc->dev, "| DUMPING HDA AMPLIFIERS |\n"); 7827 device_printf(sc->dev, "+------------------------+\n"); 7828 device_printf(sc->dev, "\n"); 7829 i = 0; 7830 while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { 7831 device_printf(sc->dev, "%3d: nid %3d %s (%s) index %d", i, 7832 (ctl->widget != NULL) ? ctl->widget->nid : -1, 7833 (ctl->ndir == HDA_CTL_IN)?"in ":"out", 7834 (ctl->dir == HDA_CTL_IN)?"in ":"out", 7835 ctl->index); 7836 if (ctl->childwidget != NULL) 7837 printf(" cnid %3d", ctl->childwidget->nid); 7838 else 7839 printf(" "); 7840 printf(" ossmask=0x%08x\n", 7841 ctl->ossmask); 7842 device_printf(sc->dev, 7843 " mute: %d step: %3d size: %3d off: %3d%s\n", 7844 ctl->mute, ctl->step, ctl->size, ctl->offset, 7845 (ctl->enable == 0) ? " [DISABLED]" : 7846 ((ctl->ossmask == 0) ? " [UNUSED]" : "")); 7847 } 7848 ); 7849 } 7850 } 7851 hdac_unlock(sc); 7852 7853 HDA_BOOTVERBOSE( 7854 device_printf(sc->dev, "\n"); 7855 ); 7856 7857 bus_generic_attach(sc->dev); 7858 7859 SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->dev), 7860 SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO, 7861 "polling", CTLTYPE_INT | CTLFLAG_RW, sc->dev, sizeof(sc->dev), 7862 sysctl_hdac_polling, "I", "Enable polling mode"); 7863 SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->dev), 7864 SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO, 7865 "polling_interval", CTLTYPE_INT | CTLFLAG_RW, sc->dev, 7866 sizeof(sc->dev), sysctl_hdac_polling_interval, "I", 7867 "Controller/Jack Sense polling interval (1-1000 ms)"); 7868 SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->dev), 7869 SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO, 7870 "pindump", CTLTYPE_INT | CTLFLAG_RW, sc->dev, sizeof(sc->dev), 7871 sysctl_hdac_pindump, "I", "Dump pin states/data"); 7872 } 7873 7874 /**************************************************************************** 7875 * int hdac_suspend(device_t) 7876 * 7877 * Suspend and power down HDA bus and codecs. 7878 ****************************************************************************/ 7879 static int 7880 hdac_suspend(device_t dev) 7881 { 7882 struct hdac_softc *sc; 7883 struct hdac_codec *codec; 7884 struct hdac_devinfo *devinfo; 7885 int codec_index, fg_index, i; 7886 7887 HDA_BOOTHVERBOSE( 7888 device_printf(dev, "Suspend...\n"); 7889 ); 7890 7891 sc = device_get_softc(dev); 7892 hdac_lock(sc); 7893 7894 HDA_BOOTHVERBOSE( 7895 device_printf(dev, "Stop streams...\n"); 7896 ); 7897 for (i = 0; i < sc->num_chans; i++) { 7898 if (sc->chans[i].flags & HDAC_CHN_RUNNING) { 7899 sc->chans[i].flags |= HDAC_CHN_SUSPEND; 7900 hdac_channel_stop(sc, &sc->chans[i]); 7901 } 7902 } 7903 7904 for (codec_index = 0; codec_index < HDAC_CODEC_MAX; codec_index++) { 7905 codec = sc->codecs[codec_index]; 7906 if (codec == NULL) 7907 continue; 7908 for (fg_index = 0; fg_index < codec->num_fgs; fg_index++) { 7909 devinfo = &codec->fgs[fg_index]; 7910 HDA_BOOTHVERBOSE( 7911 device_printf(dev, 7912 "Power down FG" 7913 " cad=%d nid=%d to the D3 state...\n", 7914 codec->cad, devinfo->nid); 7915 ); 7916 hdac_command(sc, 7917 HDA_CMD_SET_POWER_STATE(codec->cad, 7918 devinfo->nid, HDA_CMD_POWER_STATE_D3), 7919 codec->cad); 7920 } 7921 } 7922 7923 HDA_BOOTHVERBOSE( 7924 device_printf(dev, "Reset controller...\n"); 7925 ); 7926 callout_stop(&sc->poll_hda); 7927 callout_stop(&sc->poll_hdac); 7928 callout_stop(&sc->poll_jack); 7929 hdac_reset(sc, 0); 7930 hdac_unlock(sc); 7931 taskqueue_drain(taskqueue_thread, &sc->unsolq_task); 7932 callout_drain(&sc->poll_hda); 7933 callout_drain(&sc->poll_hdac); 7934 callout_drain(&sc->poll_jack); 7935 7936 HDA_BOOTHVERBOSE( 7937 device_printf(dev, "Suspend done\n"); 7938 ); 7939 7940 return (0); 7941 } 7942 7943 /**************************************************************************** 7944 * int hdac_resume(device_t) 7945 * 7946 * Powerup and restore HDA bus and codecs state. 7947 ****************************************************************************/ 7948 static int 7949 hdac_resume(device_t dev) 7950 { 7951 struct hdac_softc *sc; 7952 struct hdac_codec *codec; 7953 struct hdac_devinfo *devinfo; 7954 int codec_index, fg_index, i; 7955 7956 HDA_BOOTHVERBOSE( 7957 device_printf(dev, "Resume...\n"); 7958 ); 7959 7960 sc = device_get_softc(dev); 7961 hdac_lock(sc); 7962 7963 /* Quiesce everything */ 7964 HDA_BOOTHVERBOSE( 7965 device_printf(dev, "Reset controller...\n"); 7966 ); 7967 hdac_reset(sc, 1); 7968 7969 /* Initialize the CORB and RIRB */ 7970 hdac_corb_init(sc); 7971 hdac_rirb_init(sc); 7972 7973 /* Start the corb and rirb engines */ 7974 HDA_BOOTHVERBOSE( 7975 device_printf(dev, "Starting CORB Engine...\n"); 7976 ); 7977 hdac_corb_start(sc); 7978 HDA_BOOTHVERBOSE( 7979 device_printf(dev, "Starting RIRB Engine...\n"); 7980 ); 7981 hdac_rirb_start(sc); 7982 7983 HDA_BOOTHVERBOSE( 7984 device_printf(dev, 7985 "Enabling controller interrupt...\n"); 7986 ); 7987 HDAC_WRITE_4(&sc->mem, HDAC_GCTL, HDAC_READ_4(&sc->mem, HDAC_GCTL) | 7988 HDAC_GCTL_UNSOL); 7989 if (sc->polling == 0) { 7990 HDAC_WRITE_4(&sc->mem, HDAC_INTCTL, 7991 HDAC_INTCTL_CIE | HDAC_INTCTL_GIE); 7992 } else { 7993 callout_reset(&sc->poll_hdac, 1, hdac_poll_callback, sc); 7994 } 7995 DELAY(1000); 7996 7997 for (codec_index = 0; codec_index < HDAC_CODEC_MAX; codec_index++) { 7998 codec = sc->codecs[codec_index]; 7999 if (codec == NULL) 8000 continue; 8001 for (fg_index = 0; fg_index < codec->num_fgs; fg_index++) { 8002 devinfo = &codec->fgs[fg_index]; 8003 if (devinfo->node_type != 8004 HDA_PARAM_FCT_GRP_TYPE_NODE_TYPE_AUDIO) { 8005 HDA_BOOTHVERBOSE( 8006 device_printf(dev, 8007 "Power down unsupported non-audio FG" 8008 " cad=%d nid=%d to the D3 state...\n", 8009 codec->cad, devinfo->nid); 8010 ); 8011 hdac_command(sc, 8012 HDA_CMD_SET_POWER_STATE(codec->cad, 8013 devinfo->nid, HDA_CMD_POWER_STATE_D3), 8014 codec->cad); 8015 continue; 8016 } 8017 8018 HDA_BOOTHVERBOSE( 8019 device_printf(dev, 8020 "Power up audio FG cad=%d nid=%d...\n", 8021 devinfo->codec->cad, devinfo->nid); 8022 ); 8023 hdac_powerup(devinfo); 8024 HDA_BOOTHVERBOSE( 8025 device_printf(dev, "AFG commit...\n"); 8026 ); 8027 hdac_audio_commit(devinfo); 8028 HDA_BOOTHVERBOSE( 8029 device_printf(dev, "HP switch init...\n"); 8030 ); 8031 hdac_hp_switch_init(devinfo); 8032 8033 hdac_unlock(sc); 8034 for (i = 0; i < devinfo->function.audio.num_devs; i++) { 8035 struct hdac_pcm_devinfo *pdevinfo = 8036 &devinfo->function.audio.devs[i]; 8037 HDA_BOOTHVERBOSE( 8038 device_printf(pdevinfo->dev, 8039 "OSS mixer reinitialization...\n"); 8040 ); 8041 if (mixer_reinit(pdevinfo->dev) == -1) 8042 device_printf(pdevinfo->dev, 8043 "unable to reinitialize the mixer\n"); 8044 } 8045 hdac_lock(sc); 8046 } 8047 } 8048 8049 HDA_BOOTHVERBOSE( 8050 device_printf(dev, "Start streams...\n"); 8051 ); 8052 for (i = 0; i < sc->num_chans; i++) { 8053 if (sc->chans[i].flags & HDAC_CHN_SUSPEND) { 8054 sc->chans[i].flags &= ~HDAC_CHN_SUSPEND; 8055 hdac_channel_start(sc, &sc->chans[i]); 8056 } 8057 } 8058 8059 hdac_unlock(sc); 8060 8061 HDA_BOOTHVERBOSE( 8062 device_printf(dev, "Resume done\n"); 8063 ); 8064 8065 return (0); 8066 } 8067 /**************************************************************************** 8068 * int hdac_detach(device_t) 8069 * 8070 * Detach and free up resources utilized by the hdac device. 8071 ****************************************************************************/ 8072 static int 8073 hdac_detach(device_t dev) 8074 { 8075 struct hdac_softc *sc; 8076 device_t *devlist; 8077 int i, devcount, error; 8078 8079 if ((error = device_get_children(dev, &devlist, &devcount)) != 0) 8080 return (error); 8081 for (i = 0; i < devcount; i++) { 8082 if ((error = device_delete_child(dev, devlist[i])) != 0) { 8083 free(devlist, M_TEMP); 8084 return (error); 8085 } 8086 } 8087 free(devlist, M_TEMP); 8088 8089 sc = device_get_softc(dev); 8090 hdac_release_resources(sc); 8091 8092 return (0); 8093 } 8094 8095 static int 8096 hdac_print_child(device_t dev, device_t child) 8097 { 8098 struct hdac_pcm_devinfo *pdevinfo = 8099 (struct hdac_pcm_devinfo *)device_get_ivars(child); 8100 int retval; 8101 8102 retval = bus_print_child_header(dev, child); 8103 retval += printf(" at cad %d nid %d", 8104 pdevinfo->devinfo->codec->cad, pdevinfo->devinfo->nid); 8105 retval += bus_print_child_footer(dev, child); 8106 8107 return (retval); 8108 } 8109 8110 static device_method_t hdac_methods[] = { 8111 /* device interface */ 8112 DEVMETHOD(device_probe, hdac_probe), 8113 DEVMETHOD(device_attach, hdac_attach), 8114 DEVMETHOD(device_detach, hdac_detach), 8115 DEVMETHOD(device_suspend, hdac_suspend), 8116 DEVMETHOD(device_resume, hdac_resume), 8117 /* Bus interface */ 8118 DEVMETHOD(bus_print_child, hdac_print_child), 8119 { 0, 0 } 8120 }; 8121 8122 static driver_t hdac_driver = { 8123 "hdac", 8124 hdac_methods, 8125 sizeof(struct hdac_softc), 8126 }; 8127 8128 static devclass_t hdac_devclass; 8129 8130 DRIVER_MODULE(snd_hda, pci, hdac_driver, hdac_devclass, 0, 0); 8131 MODULE_DEPEND(snd_hda, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER); 8132 MODULE_VERSION(snd_hda, 1); 8133 8134 static int 8135 hdac_pcm_probe(device_t dev) 8136 { 8137 struct hdac_pcm_devinfo *pdevinfo = 8138 (struct hdac_pcm_devinfo *)device_get_ivars(dev); 8139 char buf[128]; 8140 8141 snprintf(buf, sizeof(buf), "HDA %s PCM #%d %s", 8142 hdac_codec_name(pdevinfo->devinfo->codec), 8143 pdevinfo->index, 8144 (pdevinfo->digital == 3)?"DisplayPort": 8145 ((pdevinfo->digital == 2)?"HDMI": 8146 ((pdevinfo->digital)?"Digital":"Analog"))); 8147 device_set_desc_copy(dev, buf); 8148 return (0); 8149 } 8150 8151 static int 8152 hdac_pcm_attach(device_t dev) 8153 { 8154 struct hdac_pcm_devinfo *pdevinfo = 8155 (struct hdac_pcm_devinfo *)device_get_ivars(dev); 8156 struct hdac_softc *sc = pdevinfo->devinfo->codec->sc; 8157 char status[SND_STATUSLEN]; 8158 int i; 8159 8160 pdevinfo->chan_size = pcm_getbuffersize(dev, 8161 HDA_BUFSZ_MIN, HDA_BUFSZ_DEFAULT, HDA_BUFSZ_MAX); 8162 8163 HDA_BOOTVERBOSE( 8164 device_printf(dev, "+--------------------------------------+\n"); 8165 device_printf(dev, "| DUMPING PCM Playback/Record Channels |\n"); 8166 device_printf(dev, "+--------------------------------------+\n"); 8167 hdac_dump_pcmchannels(pdevinfo); 8168 device_printf(dev, "\n"); 8169 device_printf(dev, "+-------------------------------+\n"); 8170 device_printf(dev, "| DUMPING Playback/Record Paths |\n"); 8171 device_printf(dev, "+-------------------------------+\n"); 8172 hdac_dump_dac(pdevinfo); 8173 hdac_dump_adc(pdevinfo); 8174 hdac_dump_mix(pdevinfo); 8175 device_printf(dev, "\n"); 8176 device_printf(dev, "+-------------------------+\n"); 8177 device_printf(dev, "| DUMPING Volume Controls |\n"); 8178 device_printf(dev, "+-------------------------+\n"); 8179 hdac_dump_ctls(pdevinfo, "Master Volume", SOUND_MASK_VOLUME); 8180 hdac_dump_ctls(pdevinfo, "PCM Volume", SOUND_MASK_PCM); 8181 hdac_dump_ctls(pdevinfo, "CD Volume", SOUND_MASK_CD); 8182 hdac_dump_ctls(pdevinfo, "Microphone Volume", SOUND_MASK_MIC); 8183 hdac_dump_ctls(pdevinfo, "Microphone2 Volume", SOUND_MASK_MONITOR); 8184 hdac_dump_ctls(pdevinfo, "Line-in Volume", SOUND_MASK_LINE); 8185 hdac_dump_ctls(pdevinfo, "Speaker/Beep Volume", SOUND_MASK_SPEAKER); 8186 hdac_dump_ctls(pdevinfo, "Recording Level", SOUND_MASK_RECLEV); 8187 hdac_dump_ctls(pdevinfo, "Input Mix Level", SOUND_MASK_IMIX); 8188 hdac_dump_ctls(pdevinfo, "Input Monitoring Level", SOUND_MASK_IGAIN); 8189 hdac_dump_ctls(pdevinfo, NULL, 0); 8190 device_printf(dev, "\n"); 8191 ); 8192 8193 if (resource_int_value(device_get_name(dev), 8194 device_get_unit(dev), "blocksize", &i) == 0 && i > 0) { 8195 i &= HDA_BLK_ALIGN; 8196 if (i < HDA_BLK_MIN) 8197 i = HDA_BLK_MIN; 8198 pdevinfo->chan_blkcnt = pdevinfo->chan_size / i; 8199 i = 0; 8200 while (pdevinfo->chan_blkcnt >> i) 8201 i++; 8202 pdevinfo->chan_blkcnt = 1 << (i - 1); 8203 if (pdevinfo->chan_blkcnt < HDA_BDL_MIN) 8204 pdevinfo->chan_blkcnt = HDA_BDL_MIN; 8205 else if (pdevinfo->chan_blkcnt > HDA_BDL_MAX) 8206 pdevinfo->chan_blkcnt = HDA_BDL_MAX; 8207 } else 8208 pdevinfo->chan_blkcnt = HDA_BDL_DEFAULT; 8209 8210 /* 8211 * We don't register interrupt handler with snd_setup_intr 8212 * in pcm device. Mark pcm device as MPSAFE manually. 8213 */ 8214 pcm_setflags(dev, pcm_getflags(dev) | SD_F_MPSAFE); 8215 8216 HDA_BOOTHVERBOSE( 8217 device_printf(dev, "OSS mixer initialization...\n"); 8218 ); 8219 if (mixer_init(dev, &hdac_audio_ctl_ossmixer_class, pdevinfo) != 0) 8220 device_printf(dev, "Can't register mixer\n"); 8221 8222 HDA_BOOTHVERBOSE( 8223 device_printf(dev, "Registering PCM channels...\n"); 8224 ); 8225 if (pcm_register(dev, pdevinfo, (pdevinfo->play >= 0)?1:0, 8226 (pdevinfo->rec >= 0)?1:0) != 0) 8227 device_printf(dev, "Can't register PCM\n"); 8228 8229 pdevinfo->registered++; 8230 8231 if (pdevinfo->play >= 0) 8232 pcm_addchan(dev, PCMDIR_PLAY, &hdac_channel_class, pdevinfo); 8233 if (pdevinfo->rec >= 0) 8234 pcm_addchan(dev, PCMDIR_REC, &hdac_channel_class, pdevinfo); 8235 8236 snprintf(status, SND_STATUSLEN, "at cad %d nid %d on %s %s", 8237 pdevinfo->devinfo->codec->cad, pdevinfo->devinfo->nid, 8238 device_get_nameunit(sc->dev), PCM_KLDSTRING(snd_hda)); 8239 pcm_setstatus(dev, status); 8240 8241 return (0); 8242 } 8243 8244 static int 8245 hdac_pcm_detach(device_t dev) 8246 { 8247 struct hdac_pcm_devinfo *pdevinfo = 8248 (struct hdac_pcm_devinfo *)device_get_ivars(dev); 8249 int err; 8250 8251 if (pdevinfo->registered > 0) { 8252 err = pcm_unregister(dev); 8253 if (err != 0) 8254 return (err); 8255 } 8256 8257 return (0); 8258 } 8259 8260 static device_method_t hdac_pcm_methods[] = { 8261 /* device interface */ 8262 DEVMETHOD(device_probe, hdac_pcm_probe), 8263 DEVMETHOD(device_attach, hdac_pcm_attach), 8264 DEVMETHOD(device_detach, hdac_pcm_detach), 8265 { 0, 0 } 8266 }; 8267 8268 static driver_t hdac_pcm_driver = { 8269 "pcm", 8270 hdac_pcm_methods, 8271 PCM_SOFTC_SIZE, 8272 }; 8273 8274 DRIVER_MODULE(snd_hda_pcm, hdac, hdac_pcm_driver, pcm_devclass, 0, 0); 8275 8276