/* * Purpose: Definitions for HDaudio codec chips known by OSS. */ /* * * This file is part of Open Sound System. * * Copyright (C) 4Front Technologies 1996-2008. * * This this source file is released under GPL v2 license (no other versions). * See the COPYING file included in the main directory of this source * distribution for the license terms and conditions. * */ /* * NULL mixer init function. Used to disable mixer creation for given codec. */ static int NULL_mixer_init (int dev, hdaudio_mixer_t * mixer, int cad, int top_group) { return 0;} struct codec_desc { unsigned int id; /* Codec id (however subdevice ID in the subdevices[] table) */ char *name; unsigned long flags; #define VF_NONE 0x00000000 #define VF_ALC88X_HACK 0x00000001 /* ALC88x requires special handling for S/PDIF */ #define VF_VAIO_HACK 0x00000002 /* VAIO STAC9872 requires special handling for headphone DAC */ #define VF_SI3055_HACK 0x00000004 /* Si3055 modem requires manual endpoint setuping and rate and ioctl hacks. */ char **remap; /* * Order of the output converter (DAC) widgets in multi channel mode. * If left to 0 then 0x76543210 (sequential order) is assumed. Some * motherboards are known to use their own channel ordering which can be * fixed using this approach. */ unsigned int multich_map; hda_mixer_init_func mixer_init; unsigned int main_id; /* In the subdevices[] table this is used for the codec ID */ unsigned int pci_subdevice; /* PCI subdevice ID of the controller (subdevices[]) */ }; /* * Meaningful widget naming schemes for some known codecs. * The list is terminated by a NULL string. An empty string * (EMPTY_STR) means that the automatically selected name will be used. * * Define EMPTY_STR as a pointer to a common "" variable to conserve space. */ static const char hda_empty_string[] = ""; #define EMPTY_STR hda_empty_string static const char *alc880remap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 1 */ "front", /* 2 */ "rear", /* 3 */ "center/LFE", /* 4 */ "side", /* 5 */ "spdif-out", /* 6 */ "rec1", /* 7 */ "rec2", /* 8 */ "rec3", /* 9 */ "spdif-in", /* 10 */ "inputmix", /* 11 */ "front", /* 12 */ "rear", /* 13 */ "center/LFE", /* 14 */ "side", /* 15 */ "source-a", /* 16 */ "source-b", /* 17 */ "source-c", /* 18 */ "source-d", /* 19 */ EMPTY_STR, /* 20 */ EMPTY_STR, /* 21 */ EMPTY_STR, /* 22 */ EMPTY_STR, /* 23 */ EMPTY_STR, /* 24 */ EMPTY_STR, /* 25 */ EMPTY_STR, /* 26 */ EMPTY_STR, /* 27 */ EMPTY_STR, /* 28 */ EMPTY_STR, /* 29 */ EMPTY_STR, /* 30 */ EMPTY_STR, /* 31 */ EMPTY_STR, /* 32 */ EMPTY_STR, /* 33 */ EMPTY_STR, /* 34 */ EMPTY_STR, /* 35 */ EMPTY_STR, /* 36 */ "fp-front", /* 37 */ NULL }; static const char *alc883remap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 1 */ "front", /* 2 */ "rear", /* 3 */ "center/LFE", /* 4 */ "side", /* 5 */ "spdif-out", /* 6 */ EMPTY_STR, /* 7 */ "rec1", /* 8 */ "rec2", /* 9 */ "spdif-in", /* a */ "input-mix", /* b */ "front", /* c */ "rear", /* d */ "center/LFE", /* e */ "side", /* f */ EMPTY_STR, /* 10 */ EMPTY_STR, /* 11 */ EMPTY_STR, /* 12 */ EMPTY_STR, /* 13 */ EMPTY_STR, /* 14 */ EMPTY_STR, /* 15 */ EMPTY_STR, /* 16 */ EMPTY_STR, /* 17 */ EMPTY_STR, /* 18 */ EMPTY_STR, /* 19 */ EMPTY_STR, /* 1a */ EMPTY_STR, /* 1b */ EMPTY_STR, /* 1c */ EMPTY_STR, /* 1d */ EMPTY_STR, /* 1e */ EMPTY_STR, /* 1f */ EMPTY_STR, /* 20 */ EMPTY_STR, /* 21 */ EMPTY_STR, /* 22 */ EMPTY_STR, /* 23 */ EMPTY_STR, /* 24 */ "pcm4", /* 25 */ "pcm4", /* 26 */ NULL }; static const char *alc260remap[] = { EMPTY_STR, /* 0x00 */ EMPTY_STR, /* 0x01 */ "front", /* 0x02 */ "spdif-out", /* 0x03 */ "rec1", /* 0x04 */ "rec2", /* 0x05 */ "spdif-in", /* 0x06 */ "inputmix", /* 0x07 */ "speaker-mix", /* 0x08 */ "headphone-mix", /* 0x09 */ "mono-mix", /* 0x0a */ EMPTY_STR, /* 0x0b */ EMPTY_STR, /* 0x0c */ EMPTY_STR, /* 0x0d */ EMPTY_STR, /* 0x0e */ "speaker", /* 0x0f */ "headphone", /* 0x10 */ "mono", /* 0x11 */ EMPTY_STR, /* 0x12 */ EMPTY_STR, /* 0x13 */ EMPTY_STR, /* 0x14 */ EMPTY_STR, /* 0x15 */ EMPTY_STR, /* 0x16 */ "beep", /* 0x17 */ "spdif-out", /* 0x18 */ "spdif-in", /* 0x19 */ NULL }; static const char *alc262remap[] = { EMPTY_STR, /* 0x00 */ EMPTY_STR, /* 0x01 */ "speaker", /* 0x02 */ "headphone", /* 0x03 */ EMPTY_STR, /* 0x04 */ EMPTY_STR, /* 0x05 */ "spdif-out", /* 0x06 */ "rec1", /* 0x07 */ "rec2", /* 0x08 */ "rec3", /* 0x09 */ "spdif-in", /* 0x0a */ "mix", /* 0x0b */ EMPTY_STR, /* 0x0c */ EMPTY_STR, /* 0x0d */ EMPTY_STR, /* 0x0e */ EMPTY_STR, /* 0x0f */ EMPTY_STR, /* 0x10 */ "mono", /* 0x11 */ "dmic", /* 0x12 */ EMPTY_STR, /* 0x13 */ "line-out", /* 0x14 */ "headphone", /* 0x15 */ "mono", /* 0x16 */ "beep", /* 0x17 */ EMPTY_STR, /* 0x18 */ EMPTY_STR, /* 0x19 */ EMPTY_STR, /* 0x1a */ EMPTY_STR, /* 0x1b */ EMPTY_STR, /* 0x1c */ "beep", /* 0x1d */ "spdif-out", /* 0x1e */ "spdif-in", /* 0x1f */ NULL }; static const char *alc662remap[] = { EMPTY_STR, /* 0x00 */ EMPTY_STR, /* 0x01 */ "front", /* 0x02 */ "rear", /* 0x03 */ "center/LFE", /* 0x04 */ EMPTY_STR, /* 0x05 */ "spdif-out", /* 0x06 */ "spdout", /* 0x07 */ "rec1", /* 0x08 */ "rec2", /* 0x09 */ EMPTY_STR, /* 0x0a */ "mix", /* 0x0b */ "front", /* 0x0c */ "rear", /* 0x0d */ "c/lfe", /* 0x0e */ EMPTY_STR, /* 0x0f */ EMPTY_STR, /* 0x10 */ EMPTY_STR, /* 0x11 */ EMPTY_STR, /* 0x12 */ EMPTY_STR, /* 0x13 */ EMPTY_STR, /* 0x14 */ EMPTY_STR, /* 0x15 */ EMPTY_STR, /* 0x16 */ EMPTY_STR, /* 0x17 */ EMPTY_STR, /* 0x18 */ EMPTY_STR, /* 0x19 */ EMPTY_STR, /* 0x1a */ EMPTY_STR, /* 0x1b */ EMPTY_STR, /* 0x1c */ EMPTY_STR, /* 0x1d */ EMPTY_STR, /* 0x1e */ EMPTY_STR, /* 0x1f */ EMPTY_STR, /* 0x20 */ EMPTY_STR, /* 0x21 */ EMPTY_STR, /* 0x22 */ EMPTY_STR, /* 0x23 */ NULL }; static const char *alc861remap[] = { EMPTY_STR, /* 0x00 */ EMPTY_STR, /* 0x01 */ EMPTY_STR, /* 0x02 */ "front", /* 0x03 */ "side", /* 0x04 */ "center/LFE", /* 0x05 */ "rear", /* 0x06 */ "spdout", /* 0x07 */ "rec", /* 0x08 */ EMPTY_STR, /* 0x09 */ EMPTY_STR, /* 0x0a */ EMPTY_STR, /* 0x0b */ EMPTY_STR, /* 0x0c */ EMPTY_STR, /* 0x0d */ EMPTY_STR, /* 0x0e */ EMPTY_STR, /* 0x0f */ EMPTY_STR, /* 0x10 */ EMPTY_STR, /* 0x11 */ EMPTY_STR, /* 0x12 */ EMPTY_STR, /* 0x13 */ "recmix", /* 0x14 */ "outmix", /* 0x15 */ "frontmix", /* 0x16 */ "sidemix", /* 0x17 */ "c/l-mix", /* 0x18 */ "rearmix", /* 0x19 */ "line2-mix", /* 0x1a */ "mic2mix", /* 0x1b */ "line1mix", /* 0x1c */ EMPTY_STR, /* 0x1d */ "vendor", /* 0x1e */ "center/LFE", /* 0x1f */ "side", /* 0x20 */ EMPTY_STR, /* 0x21 */ EMPTY_STR, /* 0x22 */ "beep", /* 0x23 */ NULL }; static const char *cmi9880remap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 1 */ EMPTY_STR, /* 2 */ "front", /* 3 */ "rear", /* 4 */ "side", /* 5 */ "center/LFE", /* 6 */ "spdif-out", /* 7 */ EMPTY_STR, /* 8 */ EMPTY_STR, /* 9 */ EMPTY_STR, /* 10 */ EMPTY_STR, /* 11 */ EMPTY_STR, /* 12 */ EMPTY_STR, /* 13 */ EMPTY_STR, /* 14 */ EMPTY_STR, /* 15 */ EMPTY_STR, /* 16 */ EMPTY_STR, /* 17 */ EMPTY_STR, /* 18 */ EMPTY_STR, /* 19 */ EMPTY_STR, /* 20 */ EMPTY_STR, /* 21 */ EMPTY_STR, /* 22 */ "pcbeep", /* 23 */ EMPTY_STR, /* 24 */ EMPTY_STR, /* 25 */ EMPTY_STR, /* 26 */ EMPTY_STR, /* 27 */ EMPTY_STR, /* 28 */ EMPTY_STR, /* 29 */ EMPTY_STR, /* 30 */ EMPTY_STR, /* 31 */ NULL }; static const char *ad1981remap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 1 */ "spdif", /* 2 */ "play", /* 3 */ "rec", /* 4 */ EMPTY_STR, /* 5 */ EMPTY_STR, /* 6 */ EMPTY_STR, /* 7 */ EMPTY_STR, /* 8 */ EMPTY_STR, /* 9 */ "spdif-out", /* a */ "mono-sel", /* b */ "mic-mix", /* c */ "pcbeep-sel", /* d */ "rec-mix", /* e */ "mono-mix", /* f */ "digital-beep", /* 10 */ "frontmix-amp", /* 11 */ "mic-mixamp", /* 12 */ "linein-mixamp", /* 13 */ "powerdown", /* 14 */ "rec-sel", /* 15 */ EMPTY_STR, /* 16 */ EMPTY_STR, /* 17 */ EMPTY_STR, /* 18 */ EMPTY_STR, /* 19 */ "lineout-mixamp", /* 1a */ "aux-mixamp", /* 1b */ "mic-mixamp", /* 1c */ "CD-mixamp", /* 1d */ "fp-mic-mute", /* 1e */ "mic-mute", /* 1f */ NULL }; static const char *ad1983remap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 1 */ "spdif", /* 2 */ "play", /* 3 */ "rec", /* 4 */ EMPTY_STR, /* 5 */ EMPTY_STR, /* 6 */ EMPTY_STR, /* 7 */ EMPTY_STR, /* 8 */ EMPTY_STR, /* 9 */ "spdif-out", /* a */ "mono-sel", /* b */ "mic-boost", /* c */ "linein-sel", /* d */ "rec-mix", /* e */ "mono-mix", /* f */ "digital-beep", /* 10 */ "frontmix-amp", /* 11 */ "mic-mixamp", /* 12 */ "linein-mixamp", /* 13 */ "rec-sel", /* 14 */ "powerdown", /* 15 */ NULL }; static const char *ad1984remap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 1 */ "spdif", /* 2 */ "headphone", /* 3 */ "front", /* 4 */ "dig-mic1", /* 5 */ "dig-mic2", /* 6 */ "headphone-mix", /* 7 */ "rec1", /* 8 */ "rec2", /* 9 */ "lineout-mix", /* a */ "aux-mix", /* b */ "rec1-sel", /* c */ "rec2-sel", /* d */ "mono-sel", /* e */ "aux-sel", /* f */ "beep", /* 10 */ EMPTY_STR, /* 11 */ EMPTY_STR, /* 12 */ EMPTY_STR, /* 13 */ EMPTY_STR, /* 14 */ EMPTY_STR, /* 15 */ EMPTY_STR, /* 16 */ EMPTY_STR, /* 17 */ EMPTY_STR, /* 18 */ "mixer-powerdown", /* 19 */ "beep", /* 1a */ "spdif-out", /* 1b */ EMPTY_STR, /* 1c */ EMPTY_STR, /* 1d */ "mono-mix", /* 1e */ "mono-downmix", /* 1f */ "input-mix", /* 20 */ "input-mixamp", /* 21 */ "headphone-sel", /* 22 */ "dock-sel", /* 23 */ "dock-mix", /* 24 */ "dock-micboost", /* 25 */ EMPTY_STR, /* 26 */ NULL }; static const char *ad1986remap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 1 */ "spdif-out", /* 2 */ "front", /* 3 */ "rear", /* 4 */ "center/LFE", /* 5 */ "rec", /* 6 */ "recmon", /* 7 */ "mono-mix", /* 8 */ "stereo-downmix", /* 9 */ "headphone-sel", /* a */ "lineout-sel", /* b */ "rear-sel", /* c */ "center/LFE-sel", /* d */ "mono-sel", /* e */ "mic-sel", /* f */ "linein-sel", /* 10 */ "mic-src", /* 11 */ "rec-src" /* 12 */ "mic-mix", /* 13 */ "phone-mix", /* 14 */ "cd-mix", /* 15 */ "aux-mix", /* 16 */ "linein-mix", /* 17 */ "beep", /* 18 */ "digital-beep", /* 19 */ EMPTY_STR, /* 1a */ EMPTY_STR, /* 1b */ EMPTY_STR, /* 1c */ EMPTY_STR, /* 1d */ EMPTY_STR, /* 1e */ EMPTY_STR, /* 1f */ EMPTY_STR, /* 20 */ EMPTY_STR, /* 21 */ EMPTY_STR, /* 22 */ EMPTY_STR, /* 23 */ EMPTY_STR, /* 24 */ "spdif-out", /* 25 */ "analog-powerdown", /* 26 */ "mic-c/LFE-mix", /* 27 */ "mic-linein-mix", /* 28 */ "c/LFE-linein-mix", /* 29 */ "mic-linein-c/LFE-mix", /* 2a */ "mic-sel", /* 2b */ NULL }; static const char *ad1988remap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 1 */ /* This is both audio-fgr and DAC???? */ "spdout", /* 2 */ /* Not used? */ "headphone", /* 3 */ "front", /* 4 */ "center/LFE", /* 5 */ "rear", /* 6 */ "spdin", /* 7 */ "rec1", /* 8 */ "rec2", /* 9 */ "side", /* a */ "spdin-src", /* b */ "rec1-src", /* c */ "rec2-src", /* d */ "rec3-src", /* e */ "rec3", /* f */ "pcbeep", /* 10 */ EMPTY_STR, /* 11 */ EMPTY_STR, /* 12 */ EMPTY_STR, /* 13 */ EMPTY_STR, /* 14 */ EMPTY_STR, /* 15 */ EMPTY_STR, /* 16 */ EMPTY_STR, /* 17 */ EMPTY_STR, /* 18 */ "power-down", /* 19 */ "beep", /* 1a */ "spdif-out", /* 1b */ "spdif-in", /* 1c */ "spdifout-mix", /* 1d */ "mono-mix", /* 1e */ "main-volume", /* 1f */ "analog-mix", /* 20 */ "outamp", /* 21 */ "headphon-mix", /* 22 */ "hp-powerdown", /* 23 */ EMPTY_STR, /* 24 */ EMPTY_STR, /* 25 */ "mic-mix", /* 26 */ "center/LFE-mix", /* 27 */ "side-mix", /* 28 */ "front-mix", /* 29 */ "rear-mix", /* 2a */ "fp-mic-mix", /* 2b */ "linein-mix", /* 2c */ "mono-mixdown", /* 2d */ EMPTY_STR, /* 2e */ "bias-pdown", /* 2f */ "fppink-outsel", /* 30 */ "blue-outsel", /* 31 */ "pink-outsel", /* 32 */ "blue-insel", /* 33 */ "pink-insel", /* 34 */ EMPTY_STR, /* 35 */ "mono-sel", /* 36 */ "fpgreen-outsel", /* 37 */ "fpgreen-micboost", /* 38 */ "fppink-micboost", /* 39 */ "blue-micboost", /* 3a */ "black-micboost", /* 3b */ "pink-micboost", /* 3c */ "green-micboost", /* 3d */ NULL }; #if 0 static const char *stac9200remap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 0x01 */ "play", /* 0x02 */ "rec", /* 0x03 */ "spdif-in", /* 0x04 */ "spdif-out", /* 0x05 */ EMPTY_STR, /* 0x06 */ "playmux", /* 0x07 */ EMPTY_STR, /* 0x08 */ EMPTY_STR, /* 0x09 */ "recmux", /* 0x0a */ "mainvol", /* 0x0b */ "inputmux", /* 0x0c */ EMPTY_STR, /* 0x0d */ EMPTY_STR, /* 0x0e */ EMPTY_STR, /* 0x0f */ EMPTY_STR, /* 0x10 */ EMPTY_STR, /* 0x11 */ EMPTY_STR, /* 0x12 */ "mono-mix", /* 0x13 */ "beep", /* 0x14 */ NULL }; #endif static const char *stac920xremap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 0x01 */ EMPTY_STR, /* 0x02 */ EMPTY_STR, /* 0x03 */ EMPTY_STR, /* 0x04 */ EMPTY_STR, /* 0x05 */ EMPTY_STR, /* 0x06 */ EMPTY_STR, /* 0x07 */ EMPTY_STR, /* 0x08 */ EMPTY_STR, /* 0x09 */ EMPTY_STR, /* 0x0a */ EMPTY_STR, /* 0x0b */ EMPTY_STR, /* 0x0c */ EMPTY_STR, /* 0x0d */ EMPTY_STR, /* 0x0e */ EMPTY_STR, /* 0x0f */ "front", /* 0x10 */ "rear", /* 0x11 */ "rec1", /* 0x12 */ "rec2", /* 0x13 */ "mono-out", /* 0x14 */ "mono-mix", /* 0x15 */ "cd", /* 0x16 */ "dig-mic1", /* 0x17 */ "dig-mic2", /* 0x18 */ "input1-mux", /* 0x19 */ "input2-mux", /* 0x1a */ "rec1-vol", /* 0x1b */ "rec2-vol", /* 0x1c */ "rec1-mux", /* 0x1d */ "rec2-mux", /* 0x1e */ "spdif-out", /* 0x1f */ "spdif-in", /* 0x20 */ "digital-out", /* 0x21 */ "digital-in", /* 0x22 */ "beep", /* 0x23 */ "mastervol", /* 0x24 */ EMPTY_STR, /* 0x25 */ NULL }; static const char *stac925xremap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 0x01 */ "play", /* 0x02 */ "rec", /* 0x03 */ "spdif-in", /* 0x04 */ "spdif-out", /* 0x05 */ "output-mux", /* 0x06 */ EMPTY_STR, /* 0x07 */ EMPTY_STR, /* 0x08 */ "rec-vol", /* 0x09 */ EMPTY_STR, /* 0x0a */ EMPTY_STR, /* 0x0b */ EMPTY_STR, /* 0x0c */ EMPTY_STR, /* 0x0d */ "vol", /* 0x0e */ "input-mux", /* 0x0f */ EMPTY_STR, /* 0x10 */ EMPTY_STR, /* 0x11 */ "mono-mix", /* 0x12 */ "beep", /* 0x13 */ "rec-mux", /* 0x14 */ EMPTY_STR, /* 0x15 */ NULL }; static const char *stac922xremap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 0x01 */ "front", /* 0x02 */ "center/LFE", /* 0x03 */ "rear", /* 0x04 */ "side", /* 0x05 */ "rec1", /* 0x06 */ "rec2", /* 0x07 */ "spdif-out", /* 0x08 */ "spdif-in", /* 0x09 */ EMPTY_STR, /* 0x0a */ EMPTY_STR, /* 0x0b */ EMPTY_STR, /* 0x0c */ EMPTY_STR, /* 0x0d */ EMPTY_STR, /* 0x0e */ EMPTY_STR, /* 0x0f */ EMPTY_STR, /* 0x10 */ EMPTY_STR, /* 0x11 */ "rec1mux", /* 0x12 */ "rec2mux", /* 0x13 */ "pcbeep", /* 0x14 */ "cd", /* 0x15 */ "mainvol", /* 0x16 */ "rec1vol", /* 0x17 */ "rec2vol", /* 0x18 */ "adat", /* 0x19 */ "i2s-out", /* 0x1a */ "i2s-in", /* 0x1b */ NULL }; static const char *stac923xremap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 0x01 */ "front", /* 0x02 */ "center/LFE", /* 0x03 */ "rear", /* 0x04 */ "side", /* 0x05 */ "headphone", /* 0x06 */ "rec1", /* 0x07 */ "rec2", /* 0x08 */ "rec3", /* 0x09 */ EMPTY_STR, /* 0x0a */ EMPTY_STR, /* 0x0b */ EMPTY_STR, /* 0x0c */ EMPTY_STR, /* 0x0d */ EMPTY_STR, /* 0x0e */ EMPTY_STR, /* 0x0f */ EMPTY_STR, /* 0x10 */ EMPTY_STR, /* 0x11 */ "cd", /* 0x12 */ "dig-mic1", /* 0x13 */ "dig-mic2", /* 0x14 */ "input1-mux", /* 0x15 */ "input2-mux", /* 0x16 */ "input3-mux", /* 0x17 */ "rec1vol", /* 0x18 */ "rec2vol", /* 0x19 */ "rec3vol", /* 0x1a */ "rec1-mux", /* 0x1b */ "rec2-mux", /* 0x1c */ "rec3-mux", /* 0x1d */ "spdif-out", /* 0x1e */ "adat", /* 0x1f */ NULL }; static const char *conexant_modem_remap[] = { EMPTY_STR, /* 0x00 */ EMPTY_STR, /* 0x01 */ EMPTY_STR, /* 0x02 */ EMPTY_STR, /* 0x03 */ EMPTY_STR, /* 0x04 */ EMPTY_STR, /* 0x05 */ EMPTY_STR, /* 0x06 */ EMPTY_STR, /* 0x07 */ EMPTY_STR, /* 0x08 */ EMPTY_STR, /* 0x09 */ EMPTY_STR, /* 0x0a */ EMPTY_STR, /* 0x0b */ EMPTY_STR, /* 0x0c */ EMPTY_STR, /* 0x0d */ EMPTY_STR, /* 0x0e */ EMPTY_STR, /* 0x0f */ EMPTY_STR, /* 0x10 */ EMPTY_STR, /* 0x11 */ EMPTY_STR, /* 0x12 */ EMPTY_STR, /* 0x13 */ EMPTY_STR, /* 0x14 */ EMPTY_STR, /* 0x15 */ EMPTY_STR, /* 0x16 */ EMPTY_STR, /* 0x17 */ EMPTY_STR, /* 0x18 */ EMPTY_STR, /* 0x19 */ EMPTY_STR, /* 0x1a */ EMPTY_STR, /* 0x1b */ EMPTY_STR, /* 0x1c */ EMPTY_STR, /* 0x1d */ EMPTY_STR, /* 0x1e */ EMPTY_STR, /* 0x1f */ EMPTY_STR, /* 0x20 */ EMPTY_STR, /* 0x21 */ EMPTY_STR, /* 0x22 */ EMPTY_STR, /* 0x23 */ EMPTY_STR, /* 0x24 */ EMPTY_STR, /* 0x25 */ EMPTY_STR, /* 0x26 */ EMPTY_STR, /* 0x27 */ EMPTY_STR, /* 0x28 */ EMPTY_STR, /* 0x29 */ EMPTY_STR, /* 0x2a */ EMPTY_STR, /* 0x2b */ EMPTY_STR, /* 0x2c */ EMPTY_STR, /* 0x2d */ EMPTY_STR, /* 0x2e */ EMPTY_STR, /* 0x2f */ EMPTY_STR, /* 0x30 */ EMPTY_STR, /* 0x31 */ EMPTY_STR, /* 0x32 */ EMPTY_STR, /* 0x33 */ EMPTY_STR, /* 0x34 */ EMPTY_STR, /* 0x35 */ EMPTY_STR, /* 0x36 */ EMPTY_STR, /* 0x37 */ EMPTY_STR, /* 0x38 */ EMPTY_STR, /* 0x39 */ EMPTY_STR, /* 0x3a */ EMPTY_STR, /* 0x3b */ EMPTY_STR, /* 0x3c */ EMPTY_STR, /* 0x3d */ EMPTY_STR, /* 0x3e */ EMPTY_STR, /* 0x3f */ EMPTY_STR, /* 0x40 */ EMPTY_STR, /* 0x41 */ EMPTY_STR, /* 0x42 */ EMPTY_STR, /* 0x43 */ EMPTY_STR, /* 0x44 */ EMPTY_STR, /* 0x45 */ EMPTY_STR, /* 0x46 */ EMPTY_STR, /* 0x47 */ EMPTY_STR, /* 0x48 */ EMPTY_STR, /* 0x49 */ EMPTY_STR, /* 0x4a */ EMPTY_STR, /* 0x4b */ EMPTY_STR, /* 0x4c */ EMPTY_STR, /* 0x4d */ EMPTY_STR, /* 0x4e */ EMPTY_STR, /* 0x4f */ EMPTY_STR, /* 0x50 */ EMPTY_STR, /* 0x51 */ EMPTY_STR, /* 0x52 */ EMPTY_STR, /* 0x53 */ EMPTY_STR, /* 0x54 */ EMPTY_STR, /* 0x55 */ EMPTY_STR, /* 0x56 */ EMPTY_STR, /* 0x57 */ EMPTY_STR, /* 0x58 */ EMPTY_STR, /* 0x59 */ EMPTY_STR, /* 0x5a */ EMPTY_STR, /* 0x5b */ EMPTY_STR, /* 0x5c */ EMPTY_STR, /* 0x5d */ EMPTY_STR, /* 0x5e */ EMPTY_STR, /* 0x5f */ EMPTY_STR, /* 0x60 */ EMPTY_STR, /* 0x61 */ EMPTY_STR, /* 0x62 */ EMPTY_STR, /* 0x63 */ EMPTY_STR, /* 0x64 */ EMPTY_STR, /* 0x65 */ EMPTY_STR, /* 0x66 */ EMPTY_STR, /* 0x67 */ EMPTY_STR, /* 0x68 */ EMPTY_STR, /* 0x69 */ EMPTY_STR, /* 0x6a */ EMPTY_STR, /* 0x6b */ EMPTY_STR, /* 0x6c */ EMPTY_STR, /* 0x6d */ EMPTY_STR, /* 0x6e */ EMPTY_STR, /* 0x6f */ "modem-control",/* 0x70 */ // Vendor defined widget "modem-in", /* 0x71 */ "modem-out", /* 0x72 */ "modem-jack", /* 0x73 */ NULL }; extern int hdaudio_GPIO_init_1 (int dev, hdaudio_mixer_t * mixer, int cad, int top_group); static const codec_desc_t codecs[] = { /* Realtek HDA codecs */ {0x10ec0260, "ALC260", VF_NONE, (char **) &alc260remap}, {0x10ec0262, "ALC262", VF_NONE, (char **) &alc262remap}, {0x10ec0268, "ALC268", VF_NONE, (char **) &alc262remap}, {0x10ec0662, "ALC662", VF_NONE, (char **) &alc662remap}, {0x10ec0663, "ALC663", VF_NONE, (char **) &alc662remap}, {0x10ec0861, "ALC861", VF_NONE, (char **) &alc861remap}, {0x10ec0862, "ALC862", VF_NONE, (char **) &alc861remap}, {0x10ec0880, "ALC880", VF_ALC88X_HACK, (char **) &alc880remap}, {0x10ec0882, "ALC882", VF_ALC88X_HACK, (char **) &alc880remap}, {0x10ec0883, "ALC883", VF_ALC88X_HACK, (char **) &alc883remap}, {0x10ec0885, "ALC885", VF_ALC88X_HACK, (char **) &alc883remap}, {0x10ec0887, "ALC887", VF_ALC88X_HACK, (char **) &alc883remap}, {0x10ec0888, "ALC888", VF_ALC88X_HACK, (char **) &alc883remap}, {0x10ec0889, "ALC889", VF_ALC88X_HACK, (char **) &alc883remap}, {0x10ec0892, "ALC892", VF_ALC88X_HACK, (char **) &alc883remap}, /* CMedia HDA codecs */ {0x13f69880, "CMI9880", VF_NONE, (char **) &cmi9880remap}, {0x434d4980, "CMI9880", VF_NONE, (char **) &cmi9880remap}, {0x111d7603, "92HD75B3X5", VF_NONE, NULL, 0, hdaudio_GPIO_init_1}, {0x111d7608, "92HD75B2X5", VF_NONE, NULL, 0, hdaudio_GPIO_init_1}, {0x111d76b0, "92HD71B8X", VF_NONE, NULL, 0, hdaudio_GPIO_init_1}, {0x111d76b1, "92HD71B8X", VF_NONE, NULL, 0, hdaudio_GPIO_init_1}, {0x111d76b2, "92HD71B7X", VF_NONE, NULL, 0, hdaudio_GPIO_init_1}, {0x111d76b3, "92HD71B7X", VF_NONE, NULL, 0, hdaudio_GPIO_init_1}, {0x111d76b4, "92HD71B6X", VF_NONE, NULL, 0, hdaudio_GPIO_init_1}, {0x111d76b5, "92HD71B6X", VF_NONE, NULL, 0, hdaudio_GPIO_init_1}, {0x111d76b6, "92HD71B5X", VF_NONE, NULL, 0, hdaudio_GPIO_init_1}, {0x111d76b7, "92HD71B5X", VF_NONE, NULL, 0, hdaudio_GPIO_init_1}, /* Analog Devices HDA codecs */ {0x11d41981, "AD1981", VF_NONE, (char **) &ad1981remap, 0x76543021}, {0x11d41983, "AD1983", VF_NONE, (char **) &ad1983remap, 0x76543021}, {0x11d41984, "AD1984", VF_NONE, (char **) &ad1984remap, 0x76543012}, {0x11d41986, "AD1986A", VF_NONE, (char **) &ad1986remap, 0x76540321}, {0x11d41988, "AD1988A", VF_NONE, (char **) &ad1988remap, 0x76015432}, {0x11d4198b, "AD1988B", VF_NONE, (char **) &ad1988remap, 0x76015432}, /* Sigmatel HDA codecs (some of them) */ {0x83847690, "STAC9200", VF_NONE, (char **) &stac920xremap }, {0x838476a0, "STAC9205", VF_NONE, (char **) &stac920xremap }, {0x838476a1, "STAC9205D", VF_NONE, (char **) &stac920xremap }, {0x838476a2, "STAC9204", VF_NONE, (char **) &stac920xremap }, {0x838476a3, "STAC9204D", VF_NONE, (char **) &stac920xremap }, /* Apple Macbook ids */ {0x83847880, "STAC9220 A1", VF_NONE, (char **) &stac922xremap }, {0x83847882, "STAC9220 A2", VF_NONE, (char **) &stac922xremap }, {0x83847680, "STAC9221 A1", VF_NONE, (char **) &stac922xremap }, {0x83847681, "STAC9220D", VF_NONE, (char **) &stac922xremap }, {0x83847682, "STAC9221", VF_NONE, (char **) &stac922xremap }, {0x83847683, "STAC9221D", VF_NONE, (char **) &stac922xremap }, {0x83847610, "STAC9230XN", VF_NONE, (char **) &stac923xremap }, {0x83847611, "STAC9230DN", VF_NONE, (char **) &stac923xremap }, {0x83847612, "STAC9230XT", VF_NONE, (char **) &stac923xremap }, {0x83847613, "STAC9230DT", VF_NONE, (char **) &stac923xremap }, {0x83847614, "STAC9229X", VF_NONE, (char **) &stac923xremap }, {0x83847615, "STAC9229D", VF_NONE, (char **) &stac923xremap }, {0x83847616, "STAC9228X", VF_NONE, (char **) &stac923xremap }, {0x83847617, "STAC9228D", VF_NONE, (char **) &stac923xremap }, {0x83847618, "STAC9227X", VF_NONE, (char **) &stac923xremap }, /* Intel D975XBX2 (at least) */ {0x83847619, "STAC9227D", VF_NONE, (char **) &stac923xremap }, {0x838476a4, "STAC9255", VF_NONE, (char **) &stac925xremap }, {0x838476a5, "STAC9255D", VF_NONE, (char **) &stac925xremap }, {0x838476a6, "STAC9254", VF_NONE, (char **) &stac925xremap }, {0x838476a7, "STAC9254D", VF_NONE, (char **) &stac925xremap }, {0x83847620, "STAC9274", VF_NONE, (char **) &stac923xremap }, {0x83847621, "STAC9274D", VF_NONE, (char **) &stac923xremap }, {0x83847622, "STAC9273X", VF_NONE, (char **) &stac923xremap }, {0x83847623, "STAC9273D", VF_NONE, (char **) &stac923xremap }, {0x83847624, "STAC9272X", VF_NONE, (char **) &stac923xremap }, {0x83847625, "STAC9272D", VF_NONE, (char **) &stac923xremap }, {0x83847626, "STAC9271X", VF_NONE, (char **) &stac923xremap }, {0x83847627, "STAC9271D", VF_NONE, (char **) &stac923xremap }, {0x83847628, "STAC9274X5NH", VF_NONE, (char **) &stac923xremap }, {0x83847629, "STAC9274D5NH", VF_NONE, (char **) &stac923xremap }, {0x83847661, "CXD9872RD", VF_NONE, NULL, 0x76543012}, {0x83847662, "STAC9872AK", VF_NONE, NULL, 0x76543012}, {0x83847664, "STAC9872K", VF_NONE, NULL, 0x76543210}, /* Vaio VGN-AR51J */ /* Conexant */ {0x14f15045, "CX20548", VF_NONE, NULL, 0x76543201}, {0x14f15047, "CX20551", VF_NONE, NULL, 0x76543201}, {0x14f15051, "CX20561", VF_NONE, NULL, 0x76543210}, {0x14f12c06, "Conexant2c06", VF_NONE, (char **) &conexant_modem_remap, 0, NULL_mixer_init}, /* Modem codec (Vaio) */ {0x14f12bfa, "Conexant2bfa", VF_NONE, (char **) &conexant_modem_remap, 0, NULL_mixer_init}, /* Modem codec (Acer Ferrari 5k) */ /* Si3055 and compatible modems */ {0x163c3055, "Si3055", VF_SI3055_HACK, NULL, 0, NULL_mixer_init }, {0x163c3155, "Si3155", VF_SI3055_HACK, NULL, 0, NULL_mixer_init }, {0x11c13026, "Agere3026", VF_SI3055_HACK, NULL, 0, NULL_mixer_init }, {0x11c13055, "Agere3055", VF_SI3055_HACK, NULL, 0, NULL_mixer_init }, {0x11c13155, "Agere3155", VF_SI3055_HACK, NULL, 0, NULL_mixer_init }, {0x10573055, "Motorola3055", VF_SI3055_HACK, NULL, 0, NULL_mixer_init }, {0x10573057, "Motorola3057", VF_SI3055_HACK, NULL, 0, NULL_mixer_init }, {0x10573155, "Motorola3155", VF_SI3055_HACK, NULL, 0, NULL_mixer_init }, /* Creative Labs */ {0x1102000a, "Createive XFi XTreme", VF_NONE, NULL, 0x76543210}, {0x11c11040, "Agere HDA Modem", VF_NONE, NULL, 0, NULL_mixer_init}, /* Unknown */ {0, "Unknown"} }; static const char *abit_AA8_remap[] = { EMPTY_STR, /* 0 */ EMPTY_STR, /* 1 */ "front", /* 2 */ "rear", /* 3 */ "center/LFE", /* 4 */ "side", /* 5 */ "spdif-out", /* 6 */ "rec1", /* 7 */ "rec2", /* 8 */ "rec3", /* 9 */ "spdif-in", /* 10 */ "inputmix", /* 11 */ "front", /* 12 */ "rear", /* 13 */ "center/LFE", /* 14 */ "side", /* 15 */ "out-source", /* 16 */ "out-source", /* 17 */ "out-source", /* 18 */ "out-source", /* 19 */ "green1", /* 20 */ "black1", /* 21 */ "C-L", /* 22 */ "surr", /* 23 */ "pink1", /* 24 */ "pink2", /* 25 */ "blue1", /* 26 */ "blue2", /* 27 */ "cd", /* 28 */ "beep", /* 29 */ "spdout", /* 30 */ "spdin", /* 31 */ "vendor", /* 32 */ "vol", /* 33 */ NULL }; static const char *vaio_remap[] = { EMPTY_STR, /* 0x00 */ EMPTY_STR, /* 0x01 */ "headphone", /* 0x02 */ "pcm", /* 0x03 */ // Unused "pcm", /* 0x04 */ // Unused "speaker", /* 0x05 */ "rec1", /* 0x06 */ "rec1-vol", /* 0x07 */ "rec", /* 0x08 */ "rec-vol", /* 0x09 */ "headphone", /* 0x0a */ EMPTY_STR, /* 0x0b */ // Unused EMPTY_STR, /* 0x0c */ // Unused "mic", /* 0x0d */ EMPTY_STR, /* 0x0e */ "int-speaker", /* 0x0f */ "spdifout1", /* 0x10 */ "int-digout1", /* 0x11 */ "spdifin", /* 0x12 */ "int-digout", /* 0x13 */ "int-mic", /* 0x14 */ "rec", /* 0x15 */ "beep", /* 0x16 */ "vol", /* 0x17 */ "spdifout", /* 0x18 */ NULL }; static const char *alc262_vaio_remap[] = { EMPTY_STR, /* 0x00 */ EMPTY_STR, /* 0x01 */ "speaker", /* 0x02 */ "headphone", /* 0x03 */ "vendor", /* 0x04 */ "vendor", /* 0x05 */ "hdmi-out", /* 0x06 */ "rec1", /* 0x07 */ "rec2", /* 0x08 */ "rec3", /* 0x09 */ "spdif-in", /* 0x0a */ "mix", /* 0x0b */ "mix", /* 0x0c */ "mix", /* 0x0d */ "mono", /* 0x0e */ "vendor", /* 0x0f */ "vendor", /* 0x10 */ "mono", /* 0x11 */ "dmic", /* 0x12 */ "vendor", /* 0x13 */ "line-out", /* 0x14 */ "headphone", /* 0x15 */ "mono", /* 0x16 */ "beep", /* 0x17 */ "speaker", /* 0x18 */ "speaker", /* 0x19 */ "speaker", /* 0x1a */ "speaker", /* 0x1b */ "speaker", /* 0x1c */ "beep", /* 0x1d */ "spdif-out", /* 0x1e */ "spdif-in", /* 0x1f */ "vendor", /* 0x20 */ "vol", /* 0x21 */ "rec3", /* 0x22 */ "rec2", /* 0x23 */ "rec1", /* 0x24 */ NULL }; /* * Table for subsystem ID's that require special handling */ extern int hdaudio_Asus_P4B_E_mixer_init (int dev, hdaudio_mixer_t * mixer, int cad, int top_group); extern int hdaudio_scaleoP_mixer_init (int dev, hdaudio_mixer_t * mixer, int cad, int top_group); extern int hdaudio_abit_AA8_mixer_init (int dev, hdaudio_mixer_t * mixer, int cad, int top_group); extern int hdaudio_ferrari5k_mixer_init (int dev, hdaudio_mixer_t * mixer, int cad, int top_group); extern int hdaudio_vaio_vgn_mixer_init (int dev, hdaudio_mixer_t * mixer, int cad, int top_group); extern int hdaudio_thinkpad_r61_mixer_init (int dev, hdaudio_mixer_t * mixer, int cad, int top_group); extern int hdaudio_mac_sigmatel_GPIO_init (int dev, hdaudio_mixer_t * mixer, int cad, int top_group); extern int hdaudio_mac_realtek_GPIO_init (int dev, hdaudio_mixer_t * mixer, int cad, int top_group); extern int hdaudio_eeepc_mixer_init (int dev, hdaudio_mixer_t * mixer, int cad, int top_group); extern int hdaudio_asus_a7k_GPIO_init (int dev, hdaudio_mixer_t * mixer, int cad, int top_group); extern int hdaudio_asus_m9_mixer_init (int dev, hdaudio_mixer_t * mixer, int cad, int top_group); static const codec_desc_t subdevices[] = { {0x98801019, "ECS 915P-A", VF_NONE, NULL, 0x76541320}, {0x104381e1, "Asus P4B-E/AD1988A", VF_NONE, (char **) &ad1988remap, 0x76015432, hdaudio_Asus_P4B_E_mixer_init}, // {0x1043e601, "ScaleoP/ALC888", VF_ALC88X_HACK, (char **) &alc883remap, 0, hdaudio_scaleoP_mixer_init}, /* Abit AA8 (at least some revisions) have bogus codec config information, * including the subvendor ID. 0x08800000 is used by many other motherboards * too. Have to use the pci_subvendor field for alc880 based devices: * 0x147b1039 = Abit AA8 motherboard. * 0x15849077 = Rock Pegasus 665 laptop. */ {0x08800000, "Abit AA8/ALC880", VF_ALC88X_HACK, (char **) &abit_AA8_remap, 0, hdaudio_abit_AA8_mixer_init, 0, 0x147b1039}, {0x10250000, "Ferrari5k/ALC883", VF_ALC88X_HACK, (char **) &alc883remap, 0, hdaudio_ferrari5k_mixer_init, 0x10ec0883, 0x1025010a}, {0x10250000, "Acer_aspire5052/ALC883", VF_ALC88X_HACK, (char **) &alc883remap, 0, hdaudio_ferrari5k_mixer_init, 0x10ec0883, 0x1025010f}, {0x1025160d, "Acer_travelmate4060/ALC260", VF_NONE, (char **) &alc260remap, 0, hdaudio_GPIO_init_1, 0x10ec0260, 0x1025008f}, {0x10431153, "Asus M9", VF_NONE, (char **) &ad1986remap, 0x76540321, hdaudio_asus_m9_mixer_init}, /* **** Sony Vaio VGN-AR51 *** * Has three codecs. Primary (Stac9872K), Modem (Conexant) and * HDMI digital output (ALC262). Disable the mixer entries for codecs 2 and 3. */ {0x104d2200, "Vaio/STAC9872K", VF_VAIO_HACK, (char**) &vaio_remap, 0x76540213, hdaudio_vaio_vgn_mixer_init, 0x83847664, 0x104d9016}, /* 2nd codec (#1) is "Conexant2c06" modem */ {0x104d2200, "Vaio/HDMI", VF_NONE, (char **) &alc262_vaio_remap, 0, NULL_mixer_init, 0x10ec0262, 0x104d9016}, /****/ /* * Sony VAIO SZ2, SZ3, FE and FE31B */ {0x104d0700, "Vaio/CXD9872RD", VF_VAIO_HACK, (char**) &vaio_remap, 0x76540213, hdaudio_vaio_vgn_mixer_init, 0x83847661, 0x104d81e6}, {0x104d1000, "Vaio/CXD9872RD", VF_VAIO_HACK, (char**) &vaio_remap, 0x76540213, hdaudio_vaio_vgn_mixer_init, 0x83847661, 0x104d81ef}, {0x104d0c00, "Vaio/CXD9872RD", VF_VAIO_HACK, (char**) &vaio_remap, 0x76540213, hdaudio_vaio_vgn_mixer_init, 0x83847661, 0x104d81ef}, /* * Sony VAIO AR */ {0x104d1300, "Vaio/CXD9872AKD", VF_VAIO_HACK, (char**) &vaio_remap, 0x76540213, hdaudio_vaio_vgn_mixer_init, 0x83847664, 0x104d81fd}, /* * Sony Vaio SZ (SZ650) has two codecs, STAC9872AK and Conexant modem. * Assume the audio codec is identical with Vaio AGN (above). */ {0x104d1e00, "Vaio/STAC9872AK", VF_VAIO_HACK, (char**) &vaio_remap, 0x76540213, hdaudio_vaio_vgn_mixer_init, 0x83847662, 0x104d9008}, /* Vaio VGC-LA1 */ {0x104d1200, "Vaio/STAC9872AK", VF_VAIO_HACK, (char**) &vaio_remap, 0x76540213, hdaudio_vaio_vgn_mixer_init, 0x83847662, 0x104d8205}, /* * Thinkpad R61 */ {0x17aa20bb, "Thinkpad R61", VF_NONE, (char**) &ad1984remap, 0, hdaudio_thinkpad_r61_mixer_init}, /* * Asus Eee PC (model 900 at least) */ {0x10438337, "Asus Eee PC", VF_NONE, NULL, 0, hdaudio_eeepc_mixer_init}, /* * Asus A7K */ {0x10431339, "Asus A7K", VF_ALC88X_HACK, (char **) &alc880remap, 0, hdaudio_asus_a7k_GPIO_init}, // ALC660 /* * Known Macintosh systems */ {0x106b0800, "Intel Mac V1", VF_NONE, (char **) &stac922xremap, 0, hdaudio_mac_sigmatel_GPIO_init}, {0x106b0700, "Intel Mac V2", VF_NONE, (char **) &stac922xremap, 0, hdaudio_mac_sigmatel_GPIO_init}, {0x106b0600, "Intel Mac V2", VF_NONE, (char **) &stac922xremap, 0, hdaudio_mac_sigmatel_GPIO_init}, {0x106b0200, "Intel Mac V3", VF_NONE, (char **) &stac922xremap, 0, hdaudio_mac_sigmatel_GPIO_init}, {0x106b0e00, "Intel Mac V3", VF_NONE, (char **) &stac922xremap, 0, hdaudio_mac_sigmatel_GPIO_init}, {0x106b0f00, "Intel Mac V3", VF_NONE, (char **) &stac922xremap, 0, hdaudio_mac_sigmatel_GPIO_init}, {0x106b1600, "Intel Mac V3", VF_NONE, (char **) &stac922xremap, 0, hdaudio_mac_sigmatel_GPIO_init}, {0x106b1700, "Intel Mac V3", VF_NONE, (char **) &stac922xremap, 0, hdaudio_mac_sigmatel_GPIO_init}, {0x106b1e00, "Intel Mac V3", VF_NONE, (char **) &stac922xremap, 0, hdaudio_mac_sigmatel_GPIO_init}, {0x106b1a00, "Intel Mac V4", VF_NONE, (char **) &stac922xremap, 0, hdaudio_mac_sigmatel_GPIO_init}, // {0x00000100, "Intel Mac V4", VF_NONE, (char **) &stac922xremap, ?, hdaudio_mac_sigmatel_GPIO_init}, {0x106b0a00, "Intel Mac V5", VF_NONE, (char **) &stac922xremap, 0, hdaudio_mac_sigmatel_GPIO_init}, {0x106b2200, "Intel Mac V5", VF_NONE, (char **) &stac922xremap, 0, hdaudio_mac_sigmatel_GPIO_init}, {0x106b3200, "Intel iMac", VF_ALC88X_HACK, (char **) &alc883remap, 0, hdaudio_mac_realtek_GPIO_init}, // ALC885 {0, "Unknown"} };