1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. 24 */ 25 26#ifndef _SYS_AC97_H 27#define _SYS_AC97_H 28 29#include <sys/types.h> 30#include <sys/audio/audio_common.h> 31 32#ifdef __cplusplus 33extern "C" { 34#endif 35 36#ifdef _KERNEL 37 38/* 39 * This header file describes the AC-97 Codec register set. See the 40 * spec for a detailed description of each register. 41 */ 42 43/* 44 * Defines for the registers. 45 */ 46 47/* Reset Register Index 00h */ 48#define AC97_RESET_REGISTER 0x00 49#define RR_DEDICATED_MIC 0x0001 50#define RR_RESERVED 0x0002 51#define RR_BASS_TREBLE 0x0004 52#define RR_PSEUDO_STEREO 0x0008 53#define RR_HEADPHONE_SUPPORT 0x0010 54#define RR_LOUDNESS_SUPPORT 0x0020 55#define RR_18_BIT_DAC 0x0040 56#define RR_20_BIT_DAC 0x0080 57#define RR_18_BIT_ADC 0x0100 58#define RR_20_BIT_ADC 0x0200 59#define RR_3D_STEREO_ENHANCE_MASK 0x7c00 60 61/* Master Volume Register Index 02h */ 62#define AC97_MASTER_VOLUME_REGISTER 0x02 63#define MVR_RIGHT_MASK 0x001f 64#define MVR_RIGHT_0dB_ATTEN 0x0000 65#define MVR_RIGHT_OPTIONAL_MASK 0x003f 66#define MVR_LEFT_MASK 0x1f00 67#define MVR_LEFT_0dB_ATTEN 0x0000 68#define MVR_LEFT_OPTIONAL_MASK 0x3f00 69#define MVR_MUTE 0x8000 70 71/* Headphone Volume Register Index 04h - Optional */ 72#define AC97_HEADPHONE_VOLUME_REGISTER 0x04 73#define HPVR_RIGHT_MASK 0x001f 74#define HPVR_RIGHT_0dB_ATTEN 0x0000 75#define HPVR_RIGHT_OPTIONAL_MASK 0x003f 76#define HPVR_LEFT_MASK 0x1f00 77#define HPVR_LEFT_0dB_ATTEN 0x0000 78#define HPVR_LEFT_OPTIONAL_MASK 0x3f00 79#define HPVR_MUTE 0x8000 80 81/* Mono Master Volume Register Index 06h - Optional */ 82#define AC97_MONO_MASTER_VOLUME_REGISTER 0x06 83#define MMVR_MASK 0x001f 84#define MMVR_0dB_ATTEN 0x0000 85#define MMVR_OPTIONAL_MASK 0x003f 86#define MMVR_MUTE 0x8000 87 88/* Master Tone Control Register Index 08h - Optional */ 89#define AC97_MASTER_TONE_CONTROL_REGISTER 0x08 90#define MTCR_TREBLE_MASK 0x000e 91#define MTCR_TREBLE_OPTIONAL_MASK 0x000f 92#define MTCR_TREBLE_BYPASS 0x000f 93#define MTCR_BASS_MASK 0x0e00 94#define MTCR_BASS_OPTIONAL_MASK 0x0f00 95#define MTCR_BASS_BYPASS 0x0f00 96 97/* PC Beep Register Index 0ah - Optional */ 98#define AC97_PC_BEEP_REGISTER 0x0a 99#define PCBR_VOLUME_MASK 0x001e 100#define PCBR_0dB_ATTEN 0x0000 101#define PCBR_MUTE 0x8000 102 103/* Phone Volume Register Index 0ch - Optional */ 104#define AC97_PHONE_VOLUME_REGISTER 0x0c 105#define PVR_GAIN_MASK 0x001f 106#define PVR_0dB_GAIN 0x0010 107#define PVR_MAX_ATTEN 0x001f 108#define PVR_MUTE 0x8000 109 110/* Mic Volume Register Index 0eh */ 111#define AC97_MIC_VOLUME_REGISTER 0x0e 112#define MICVR_GAIN_MASK 0x001f 113#define MICVR_0dB_GAIN 0x0008 114#define MICVR_MAX_ATTEN 0x001f 115#define MICVR_20dB_BOOST 0x0040 116#define MICVR_20dB_NOBOOST 0x0000 117#define MICVR_MUTE 0x8000 118 119/* Line In Volume Register Index 10h */ 120#define AC97_LINE_IN_VOLUME_REGISTER 0x10 121#define LIVR_RIGHT_GAIN_MASK 0x001f 122#define LIVR_RIGHT_0dB_GAIN 0x0010 123#define LIVR_RIGHT_MAX_ATTEN 0x001f 124#define LIVR_LEFT_GAIN_MASK 0x1f00 125#define LIVR_LEFT_0dB_GAIN 0x1000 126#define LIVR_LEFT_MAX_ATTEN 0x1f00 127#define LIVR_MUTE 0x8000 128 129/* CD Volume Register Index 12h */ 130#define AC97_CD_VOLUME_REGISTER 0x12 131#define CDVR_RIGHT_GAIN_MASK 0x001f 132#define CDVR_RIGHT_0dB_GAIN 0x0010 133#define CDVR_RIGHT_MAX_ATTEN 0x001f 134#define CDVR_LEFT_GAIN_MASK 0x1f00 135#define CDVR_LEFT_0dB_GAIN 0x1000 136#define CDVR_LEFT_MAX_ATTEN 0x1f00 137#define CDVR_MUTE 0x8000 138 139/* Video Volume Register Index 14h - Optional */ 140#define AC97_VIDEO_VOLUME_REGISTER 0x14 141#define VIDVR_RIGHT_GAIN_MASK 0x001f 142#define VIDVR_RIGHT_0dB_GAIN 0x0010 143#define VIDVR_RIGHT_MAX_ATTEN 0x001f 144#define VIDVR_LEFT_GAIN_MASK 0x1f00 145#define VIDVR_LEFT_0dB_GAIN 0x1000 146#define VIDVR_LEFT_MAX_ATTEN 0x1f00 147#define VIDVR_MUTE 0x8000 148 149/* Aux Volume Register Index 16h - Optional */ 150#define AC97_AUX_VOLUME_REGISTER 0x16 151#define AUXVR_RIGHT_GAIN_MASK 0x001f 152#define AUXVR_RIGHT_0dB_GAIN 0x0010 153#define AUXVR_RIGHT_MAX_ATTEN 0x001f 154#define AUXVR_LEFT_GAIN_MASK 0x1f00 155#define AUXVR_LEFT_0dB_GAIN 0x1000 156#define AUXVR_LEFT_MAX_ATTEN 0x1f00 157#define AUXVR_MUTE 0x8000 158 159/* PCM Out Volume Register Index 18h */ 160#define AC97_PCM_OUT_VOLUME_REGISTER 0x18 161#define PCMOVR_RIGHT_GAIN_MASK 0x001f 162#define PCMOVR_RIGHT_0dB_GAIN 0x0010 163#define PCMOVR_RIGHT_MAX_ATTEN 0x001f 164#define PCMOVR_LEFT_GAIN_MASK 0x1f00 165#define PCMOVR_LEFT_0dB_GAIN 0x1000 166#define PCMOVR_LEFT_MAX_ATTEN 0x1f00 167#define PCMOVR_MUTE 0x8000 168#define PCMOVR_GAIN_BITS 5 169 170/* Record Select Control Register Index 1ah */ 171#define AC97_RECORD_SELECT_CTRL_REGISTER 0x1a 172#define RSCR_R_MIC 0x0000 173#define RSCR_R_CD 0x0001 174#define RSCR_R_VIDEO 0x0002 175#define RSCR_R_AUX 0x0003 176#define RSCR_R_LINE_IN 0x0004 177#define RSCR_R_STEREO_MIX 0x0005 178#define RSCR_R_MONO_MIX 0x0006 179#define RSCR_R_PHONE 0x0007 180#define RSCR_L_MIC 0x0000 181#define RSCR_L_CD 0x0100 182#define RSCR_L_VIDEO 0x0200 183#define RSCR_L_AUX 0x0300 184#define RSCR_L_LINE_IN 0x0400 185#define RSCR_L_STEREO_MIX 0x0500 186#define RSCR_L_MONO_MIX 0x0600 187#define RSCR_L_PHONE 0x0700 188 189/* Record Gain Register Index 1ch */ 190#define AC97_RECORD_GAIN_REGISTER 0x1c 191#define RGR_RIGHT_MASK 0x000f 192#define RGR_RIGHT_0db_GAIN 0x0000 193#define RGR_RIGHT_MAX_GAIN 0x000f 194#define RGR_LEFT_MASK 0x0f00 195#define RGR_LEFT_0db_GAIN 0x0000 196#define RGR_LEFT_MAX_GAIN 0x0f00 197#define RGR_MUTE 0x8000 198 199/* Record Gain Mic Register Index 1eh - Optional */ 200#define AC97_RECORD_GAIN_MIC_REGISTER 0x1e 201#define RGMR_MASK 0x000f 202#define RGMR_MUTE 0x8000 203#define RGMR_MASK 0x000f 204#define RGMR_0db_GAIN 0x0000 205#define RGMR_MAX_GAIN 0x000f 206 207/* General Purpose Register Index 20h - Optional */ 208#define AC97_GENERAL_PURPOSE_REGISTER 0x20 209#define GPR_LPBK 0x0080 210#define GPR_MS_MIC1 0x0000 211#define GPR_MS_MIC2 0x0100 212#define GPR_MONO_MIX_IN 0x0000 213#define GPR_MONO_MIC_IN 0x0200 214#define GPR_BASS_BOOST 0x1000 215#define GPR_3D_STEREO_ENHANCE 0x2000 216#define GPR_ST 0x4000 217#define GPR_POP_PRE_3D 0x0000 218#define GPR_POP_POST_3D 0x8000 219 220/* 3D Control Regsiter Index 22h - Optional */ 221#define AC97_THREE_D_CONTROL_REGISTER 0x22 222#define TDCR_DEPTH_MASK 0x000f 223#define TDCR_CENTER_MASK 0x0f00 224#define TDCR_NULL 0x0000 225 226/* Audio Interrupt and Paging Mechanism Index 24h - r2.3 */ 227#define AC97_INTERRUPT_PAGING_REGISTER 0x24 228#define IPR_IS 0x8000 229#define IPR_CAUSE_MASK 0x6000 230#define IPR_SC 0x1000 231#define IPR_IE 0x0800 232#define IPR_PG_MASK 0x000f 233 234/* Powerdown Control Status Register Index 26h */ 235#define AC97_POWERDOWN_CTRL_STAT_REGISTER 0x26 236#define PCSR_ADC 0x0001 237#define PCSR_DAC 0x0002 238#define PCSR_ANL 0x0004 239#define PCSR_REF 0x0008 240#define PCSR_POWERD_UP (PCSR_ADC|PCSR_DAC|\ 241 PCSR_ANL|PCSR_REF) 242#define PCSR_PR0 0x0100 243#define PCSR_PR1 0x0200 244#define PCSR_PR2 0x0400 245#define PCSR_PR3 0x0800 246#define PCSR_PR4 0x1000 247#define PCSR_PR5 0x2000 248#define PCSR_PR6 0x4000 249#define PCSR_EAPD 0x8000 250 251/* Extended Audio Register Index 28h - Optional */ 252#define AC97_EXTENDED_AUDIO_REGISTER 0x28 253#define EAR_VRA 0x0001 254#define EAR_DRA 0x0002 255#define EAR_SPDIF 0x0004 256#define EAR_VRM 0x0008 257#define EAR_DSA_MASK 0x0030 258#define EAR_CDAC 0x0040 259#define EAR_SDAC 0x0080 260#define EAR_LDAC 0x0100 261#define EAR_AMAP 0x0200 262#define EAR_REV_MASK 0x0c00 263#define EAR_REV_21 0x0000 264#define EAR_REV_22 0x0400 265#define EAR_REV_23 0x0800 266#define EAR_PRIMARY_CODEC 0x0000 267#define EAR_SECONDARY_01_CODEC 0x4000 268#define EAR_SECONDARY_10_CODEC 0x8000 269#define EAR_SECONDARY_11_CODEC 0xc000 270 271/* Extended Audio Status and Control Register Index 2ah - Optional */ 272#define AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER 0x2a 273#define EASCR_VRA 0x0001 274#define EASCR_DRA 0x0002 275#define EASCR_SPDIF 0x0004 276#define EASCR_VRM 0x0008 277#define EASCR_SPSA_MASK 0x0030 278#define EASCR_SPSA_3_4 0x0000 279#define EASCR_SPSA_7_8 0x0010 280#define EASCR_SPSA_6_9 0x0020 281#define EASCR_SPSA_10_11 0x0030 282#define EASCR_CDAC 0x0040 283#define EASCR_SDAC 0x0080 284#define EASCR_LDAC 0x0100 285#define EASCR_MADC 0x0200 286#define EASCR_SPCV 0x0400 287#define EASCR_PRI 0x0800 288#define EASCR_PRJ 0x1000 289#define EASCR_PRK 0x2000 290#define EASCR_PRL 0x4000 291#define EASCR_VCFG 0x8000 292 293/* Extended Front DAC Rate Register 2ch - Optional */ 294#define AC97_EXTENDED_FRONT_DAC_RATE_REGISTER 0x2c 295#define AC97_SAMPLE_RATE_48000 0xbb80 296 297/* Extended Surround DAC Rate Register 2eh - Optional */ 298#define AC97_EXTENDED_SURROUND_DAC_RATE_REGISTER 0x2e 299 300/* Extended LFE DAC Rate Register 30h - Optional */ 301#define AC97_EXTENDED_LFE_DAC_RATE_REGISTER 0x30 302 303/* Extended LR DAC Rate Register 32h - Optional */ 304#define AC97_EXTENDED_LR_DAC_RATE_REGISTER 0x32 305 306/* Extended Mic ADC Rate Register 34h - Optional */ 307#define AC97_EXTENDED_MIC_ADC_RATE_REGISTER 0x34 308 309/* Extended Center and LFE Volume Register 36h - Optional */ 310#define AC97_EXTENDED_C_LFE_VOLUME_REGISTER 0x36 311#define EXLFEVR_CENTER_MASK 0x001f 312#define EXLFEVR_CENTER_OPTIONAL_MASK 0x003f 313#define EXLFEVR_CENTER_MUTE 0x0080 314#define EXLFEVR_LFE_MASK 0x1f00 315#define EXLFEVR_LFE_OPTIONAL_MASK 0x3f00 316#define EXLFEVR_LFE_MUTE 0x8000 317 318/* Extended Left and Right Surround Volume Register 38h - Optional */ 319#define AC97_EXTENDED_LRS_VOLUME_REGISTER 0x38 320#define EXLFEVR_RIGHT_MASK 0x001f 321#define EXLFEVR_RIGHT_OPTIONAL_MASK 0x003f 322#define EXLFEVR_RIGHT_MTUE 0x0080 323#define EXLFEVR_LEFT_MASK 0x1f00 324#define EXLFEVR_LEFT_OPTIONAL_MASK 0x3f00 325#define EXLFEVR_LEFT_MUTE 0x8000 326 327/* S/PDIF Control Register 3ah - Optional */ 328#define AC97_SPDIF_CONTROL_REGISTER 0x3a 329#define SPCR_PRO 0x0001 330#define SPCR_AUDIO 0x0002 331#define SPCR_COPY 0x0004 332#define SPCR_PRE 0x0008 333#define SPCR_CC_MASK 0x07f0 334#define SPCR_L 0x0800 335#define SPCR_SPSR_MASK 0x3000 336#define SPCR_SPSR_44100 0x0000 337#define SPCR_SPSR_48000 0x2000 338#define SPCR_SPSR_32000 0x3000 339#define SPCR_DRS 0x4000 340#define SPCR_V 0x8000 341 342/* 343 * Modem only registers from 3ch - 58h. 344 */ 345 346/* Extended Modem ID Register 3ch - Optional */ 347#define AC97_EXTENDED_MODEM_ID_REGISTER 0x3c 348#define EMIDR_LINE1 0x0001 349#define EMIDR_LINE2 0x0002 350#define EMIDR_HSET 0x0004 351#define EMIDR_CID1 0x0008 352#define EMIDR_CID2 0x0010 353#define EMIDR_PRIMARY_CODEC 0x0000 354#define EMIDR_SECONDARY_01_CODEC 0x4000 355#define EMIDR_SECONDARY_10_CODEC 0x8000 356#define EMIDR_SECONDARY_11_CODEC 0xc000 357 358/* Extended Modem Status and Control Register 3eh - Optional */ 359#define AC97_EXTENDED_MODE_STAT_CTRL_REGISTER 0x3e 360#define EMSCR_BPIO 0x0001 361#define EMSCR_MREF 0x0002 362#define EMSCR_ADC1 0x0004 363#define EMSCR_DAC1 0x0008 364#define EMSCR_ADC2 0x0010 365#define EMSCR_DAC2 0x0020 366#define EMSCR_HADC 0x0040 367#define EMSCR_HDAC 0x0080 368#define EMSCR_PRA 0x0100 369#define EMSCR_PRB 0x0200 370#define EMSCR_PRC 0x0400 371#define EMSCR_PRD 0x0800 372#define EMSCR_PRE 0x1000 373#define EMSCR_PRF 0x2000 374#define EMSCR_PRG 0x4000 375#define EMSCR_PRH 0x8000 376 377/* Extended Modem Line 1 DAC/ADC Sample Rate Register 40h - Optional */ 378#define AC97_EXTENDED_MODEM_LINE1_RATE_REGISTER 0x40 379 380/* Extended Modem Line 2 DAC/ADC Sample Rate Register 42h - Optional */ 381#define AC97_EXTENDED_MODEM_LINE2_RATE_REGISTER 0x42 382 383/* Extended Modem Handset Sample Rate Register 44h - Optional */ 384#define AC97_EXTENDED_MODEM_HANDSET_RATE_REGISTER 0x44 385 386/* Extended Modem Line 1 DAC/ADC Level Register 46h - Optional */ 387#define AC97_EXTENDED_MODEM_LINE1_LEVEL_REGISTER 0x46 388#define EML1LR_ADC_LEVEL_MASK 0x000f 389#define EML1LR_ADC_LEVEL_MUTE 0x0080 390#define EML1LR_DAC_LEVEL_MASK 0x0f00 391#define EML1LR_DAC_LEVEL_MUTE 0x8000 392 393/* Extended Modem Line 2 DAC/ADC Level Register 48h - Optional */ 394#define AC97_EXTENDED_MODEM_LINE2_LEVEL_REGISTER 0x48 395#define EML2LR_ADC_LEVEL_MASK 0x000f 396#define EML2LR_ADC_LEVEL_MUTE 0x0080 397#define EML2LR_DAC_LEVEL_MASK 0x0f00 398#define EML2LR_DAC_LEVEL_MUTE 0x8000 399 400/* Extended Modem Handset DAC/ADC Level Register 4ah - Optional */ 401#define AC97_EXTENDED_MODEM_HANDSET_LEVEL_REGISTER 0x4a 402#define EMHLR_ADC_LEVEL_MASK 0x000f 403#define EMHLR_ADC_LEVEL_MUTE 0x0080 404#define EMHLR_DAC_LEVEL_MASK 0x0f00 405#define EMHLR_DAC_LEVEL_MUTE 0x8000 406 407/* Extended Modem GPIO Pin Configuration Register 4ch - Optional */ 408#define AC97_EXTENDED_MODEM_GPIO_PIN_REGISTER 0x4c 409 410/* Extended Modem GPIO Pin Polarity Register 4eh - Optional */ 411#define AC97_EXTENDED_MODEM_GPIO_POLARITY_REGISTER 0x4e 412 413/* Extended Modem GPIO Pin Sticky Register 50h - Optional */ 414#define AC97_EXTENDED_MODEM_GPIO_STICKY_REGISTER 0x50 415 416/* Extended Modem GPIO Pin Wake-up Mask Register 52h - Optional */ 417#define AC97_EXTENDED_MODEM_GPIO_WAKEUP_REGISTER 0x52 418 419/* Extended Modem GPIO Pin Status Mask Register 54h - Optional */ 420#define AC97_EXTENDED_MODEM_GPIO_STATUS_REGISTER 0x54 421 422/* Extended Modem AFE Status and Control Register 56h - Optional */ 423#define AC97_EXTENDED_MODEM_AFE_STAT_CTRL_REGISTER 0x56 424#define EMAFESCR_L1B0 0x0001 425#define EMAFESCR_L1B1 0x0002 426#define EMAFESCR_L1B2 0x0004 427#define EMAFESCR_L2B0 0x0010 428#define EMAFESCR_L2B1 0x0020 429#define EMAFESCR_L2B2 0x0040 430#define EMAFESCR_HSB0 0x0100 431#define EMAFESCR_HSB1 0x0200 432#define EMAFESCR_HSB2 0x0400 433#define EMAFESCR_MLINK_ON 0x0000 434#define EMAFESCR_MLINK_OFF 0x1000 435#define EMAFESCR_CIDR 0x2000 436#define EMAFESCR_CID1 0x4000 437#define EMAFESCR_CID2 0x8000 438 439/* Vendor Reserved Registers 5ah - 7ah - Optional */ 440/* 441 * Note that 60h - 6eh is also defined as the extended codec page area in 442 * AC'97 r2.3. 443 */ 444#define AC97_VENDOR_REGISTER_01 0x5a 445#define AC97_VENDOR_REGISTER_02 0x5c 446#define AC97_VENDOR_REGISTER_03 0x5e 447#define AC97_VENDOR_REGISTER_04 0x60 448#define AC97_VENDOR_REGISTER_05 0x62 449#define AC97_VENDOR_REGISTER_06 0x64 450#define AC97_VENDOR_REGISTER_07 0x66 451#define AC97_VENDOR_REGISTER_08 0x68 452#define AC97_VENDOR_REGISTER_09 0x6a 453#define AC97_VENDOR_REGISTER_10 0x6c 454#define AC97_VENDOR_REGISTER_11 0x6e 455#define AC97_VENDOR_REGISTER_12 0x70 456#define AC97_VENDOR_REGISTER_13 0x72 457#define AC97_VENDOR_REGISTER_14 0x74 458#define AC97_VENDOR_REGISTER_15 0x76 459#define AC97_VENDOR_REGISTER_16 0x78 460#define AC97_VENDOR_REGISTER_17 0x7a 461 462/* 463 * Page 01 Extended Codec Registers 464 */ 465#define AC97_PAGE01_CODEC_CLASS_REV_REGISTER 0x60 466#define AC97_PAGE01_PCI_SVID_REGISTER 0x62 467#define AC97_PAGE01_PCI_SID_REGISTER 0x64 468#define AC97_PAGE01_FUNCTION_SELECT_REGISTER 0x66 469#define AC97_PAGE01_FUNCTION_INFORMATION_REGISTER 0x68 470#define AC97_PAGE01_SENSE_DETAILS_REGISTER 0x6a 471#define AC97_PAGE01_DAC_SLOT_MAPPING_REGISTER 0x6c 472#define AC97_PAGE01_ADC_SLOT_MAPPING_REGISTER 0x6e 473 474/* Vendor ID1 Register 7ch */ 475#define AC97_VENDOR_ID1_REGISTER 0x7c 476#define VID1R_CHAR2_MASK 0x00ff 477#define VID1R_CHAR1_MASK 0xff00 478 479/* Vendor ID2 Register 7eh */ 480#define AC97_VENDOR_ID2_REGISTER 0x7e 481#define VID2R_REVISION_MASK 0x00ff 482#define VID2R_CHAR3_MASK 0xff00 483 484/* 485 * Property names used by AC97. We should probably have a better way 486 * of dealing with some of these. (LINEIN_FUNC and MIC_FUNC should really 487 * be saved/restored with other global settings.) 488 */ 489#define AC97_PROP_AMPLIFIER "ac97-amplifier" 490#define AC97_PROP_SPEAKER "ac97-speaker" 491#define AC97_PROP_MICBOOST "ac97-micboost" 492#define AC97_PROP_NO_HEADPHONE "ac97-no-headphone" 493#define AC97_PROP_NO_AUXOUT "ac97-no-auxout" 494#define AC97_PROP_NO_CDROM "ac97-no-cdrom" 495#define AC97_PROP_NO_VIDEO "ac97-no-video" 496#define AC97_PROP_NO_AUXIN "ac97-no-auxin" 497#define AC97_PROP_NO_MIC "ac97-no-mic" 498#define AC97_PROP_NO_LINEIN "ac97-no-linein" 499#define AC97_PROP_LINEIN_FUNC "ac97-linein-function" /* 1=linein, 2=surr */ 500#define AC97_PROP_MIC_FUNC "ac97-mic-function" /* 1=mic, 2=cen/lfe */ 501#define AC97_PROP_DOWNMIX "ac97-downmix" 502#define AC97_PROP_SPREAD "ac97-spread" 503 504/* 505 * Known Codec vendors. 506 */ 507#define AC97_VENDOR_ADS 0x41445300 /* Analog Devices */ 508#define AC97_VENDOR_AKM 0x414b4d00 /* Asahi Kasei */ 509#define AC97_VENDOR_ALC 0x414c4300 /* Realtek */ 510#define AC97_VENDOR_ALG 0x414c4700 /* Realtek */ 511#define AC97_VENDOR_CMI 0x434d4900 /* Cmedia */ 512#define AC97_VENDOR_CRY 0x43525900 /* Cirrus Logic */ 513#define AC97_VENDOR_CXT 0x43585400 /* Conexant */ 514#define AC97_VENDOR_EMC 0x454d4300 /* eMicro */ 515#define AC97_VENDOR_EV 0x000f8300 /* Ectiva */ 516#define AC97_VENDOR_ESS 0x45838300 /* ESS */ 517#define AC97_VENDOR_HRS 0x48525300 /* Intersil */ 518#define AC97_VENDOR_ICE 0x49434500 /* ICEnsemble */ 519#define AC97_VENDOR_ITE 0x49544500 /* ITE */ 520#define AC97_VENDOR_NSC 0x4e534300 /* National */ 521#define AC97_VENDOR_PSC 0x50534300 /* Philips */ 522#define AC97_VENDOR_SIL 0x53494c00 /* Silicon Labs */ 523#define AC97_VENDOR_ST 0x83847600 /* SigmaTel */ 524#define AC97_VENDOR_TRA 0x54524100 /* TriTech */ 525#define AC97_VENDOR_TXN 0x54584e00 /* TI */ 526#define AC97_VENDOR_VIA 0x56494100 /* VIA */ 527#define AC97_VENDOR_WML 0x574d4c00 /* Wolfson */ 528#define AC97_VENDOR_YMH 0x594d4800 /* Yamaha */ 529 530/* 531 * Known Codec IDs. 532 */ 533#define AC97_CODEC_AD1819B 0x41445303 534#define AC97_CODEC_AD1881 0x41445340 535#define AC97_CODEC_AD1881A 0x41445348 536#define AC97_CODEC_AD1885 0x41445360 537#define AC97_CODEC_AD1886 0x41445361 538#define AC97_CODEC_AD1887 0x41445362 539#define AC97_CODEC_AD1888 0x41445368 540#define AC97_CODEC_AD1980 0x41445370 541#define AC97_CODEC_AD1981A 0x41445371 542#define AC97_CODEC_AD1981 0x41445372 543#define AC97_CODEC_AD1981B 0x41445374 544#define AC97_CODEC_AD1985 0x41445375 545#define AC97_CODEC_AK4540 0x414b4d00 546#define AC97_CODEC_ALC100 0x414c4326 547#define AC97_CODEC_ALC200P 0x414c4710 548#define AC97_CODEC_ALC202 0x414c4740 549#define AC97_CODEC_ALC203 0x414c4770 550#define AC97_CODEC_ALC250 0x414c4750 551#define AC97_CODEC_ALC250_2 0x414c4752 552#define AC97_CODEC_ALC650 0x414c4720 553#define AC97_CODEC_ALC655 0x414c4760 554#define AC97_CODEC_ALC658 0x414c4780 555#define AC97_CODEC_ALC850 0x414c4790 556#define AC97_CODEC_CMI9738 0x434d4941 557#define AC97_CODEC_CMI9739 0x434d4961 558#define AC97_CODEC_CMI9780 0x434d4969 559#define AC97_CODEC_CMI9761 0x434d4978 560#define AC97_CODEC_CMI9761_2 0x434d4982 561#define AC97_CODEC_CMI9761_3 0x434d4983 562#define AC97_CODEC_CS4202 0x43525970 563#define AC97_CODEC_CS4205 0x43525950 564#define AC97_CODEC_CS4294 0x43525920 565#define AC97_CODEC_CS4297 0x43525900 566#define AC97_CODEC_CS4297A 0x43525910 567#define AC97_CODEC_CS4299 0x43525930 568#define AC97_CODEC_CX20468 0x43585428 569#define AC97_CODEC_CX20468_2 0x43585429 570#define AC97_CODEC_CX20468_21 0x43585430 571#define AC97_CODEC_EM28028 0x454d4328 572#define AC97_CODEC_ES1921 0x45838308 573#define AC97_CODEC_EV1938 0x000f8384 574#define AC97_CODEC_ICE1232 0x49434511 575#define AC97_CODEC_LM4550 0x4e534350 576#define AC97_CODEC_STAC9700 0x83847600 577#define AC97_CODEC_STAC9701 0x83847601 578#define AC97_CODEC_STAC9701_2 0xc250c250 579#define AC97_CODEC_STAC9704 0x83847604 580#define AC97_CODEC_STAC9705 0x83847605 581#define AC97_CODEC_STAC9708 0x83847608 582#define AC97_CODEC_STAC9721 0x83847609 583#define AC97_CODEC_STAC9744 0x83847644 584#define AC97_CODEC_STAC9750 0x83847650 585#define AC97_CODEC_STAC9752 0x83847652 586#define AC97_CODEC_STAC9756 0x83847656 587#define AC97_CODEC_STAC9758 0x83847658 588#define AC97_CODEC_STAC9766 0x83847666 589#define AC97_CODEC_TR28023 0x54524103 590#define AC97_CODEC_TR28023_2 0x54524123 591#define AC97_CODEC_TR28028 0x54524108 592#define AC97_CODEC_TR28028_2 0x54524128 593#define AC97_CODEC_VT1612A 0x56494161 594#define AC97_CODEC_VT1617A 0x56494170 595#define AC97_CODEC_VT1616 0x49434551 596#define AC97_CODEC_VT1616A 0x49434552 597#define AC97_CODEC_VT1618 0x56494182 598#define AC97_CODEC_WM9701A 0x574d4c00 599#define AC97_CODEC_WM9703 0x574d4c03 600#define AC97_CODEC_WM9704 0x574d4c04 601#define AC97_CODEC_YMF743 0x594d4800 602#define AC97_CODEC_YMF753 0x594d4803 603 604/* 605 * Functions for drivers to interact with the common ac97 module. 606 */ 607typedef struct ac97 ac97_t; 608typedef void (*ac97_wr_t)(void *, uint8_t, uint16_t); 609typedef uint16_t (*ac97_rd_t)(void *, uint8_t); 610typedef struct ac97_ctrl ac97_ctrl_t; 611typedef boolean_t (*ac97_ctrl_walk_t)(ac97_ctrl_t *, void *); 612 613/* 614 * Old style initialization. The driver simply calls ac97_alloc() 615 * followed by ac97_init(). These interfaces should not be used in 616 * new drivers. 617 */ 618ac97_t *ac97_alloc(dev_info_t *, ac97_rd_t, ac97_wr_t, void *); 619int ac97_init(ac97_t *, audio_dev_t *); 620 621/* 622 * New style initialization. The driver will call ac97_allocate(), 623 * then it can call ac97_register_controls() to register controls. 624 * Or, if it doesn't want all controls registered, it can find 625 * controls with ac97_find_control(), and register them individually 626 * with ac97_register_control(). ac97_alloc() 627 * 628 * Note that adjusting the set of controls should only be performed 629 * while the driver is single threaded, during attach or detach 630 * processing. The AC'97 framework does not provide any locks 631 * surrounding its internal list of controls. Note however that 632 * changes to the controls made from within the framework (e.g. by 633 * someone accessing the control via the audio framework) are safe. 634 */ 635ac97_t *ac97_allocate(audio_dev_t *, dev_info_t *, ac97_rd_t, ac97_wr_t, 636 void *); 637void ac97_probe_controls(ac97_t *); 638void ac97_register_controls(ac97_t *); 639void ac97_unregister_controls(ac97_t *); 640 641void ac97_walk_controls(ac97_t *, ac97_ctrl_walk_t, void *); 642ac97_ctrl_t *ac97_control_find(ac97_t *, const char *); 643void ac97_control_register(ac97_ctrl_t *); 644void ac97_control_unregister(ac97_ctrl_t *); 645void ac97_control_remove(ac97_ctrl_t *); 646const char *ac97_control_name(ac97_ctrl_t *); 647const audio_ctrl_desc_t *ac97_control_desc(ac97_ctrl_t *); 648int ac97_control_get(ac97_ctrl_t *, uint64_t *); 649int ac97_control_set(ac97_ctrl_t *, uint64_t); 650 651/* 652 * Bits common to both new style and old style initialization. 653 */ 654void ac97_free(ac97_t *); 655void ac97_reset(ac97_t *); 656int ac97_num_channels(ac97_t *); 657 658#endif /* _KERNEL */ 659 660#ifdef __cplusplus 661} 662#endif 663 664#endif /* _SYS_AC97_H */ 665