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