ALSA: hda - Additional pin nids for STAC92HD71Bx and STAC92HD75Bx codecs

Current code for STAC92HD71Bx and STAC92HD75Bx doesn't consider pin
complexes 0x20 and 0x27. Also for 4 port models, nids 0x0e and 0x0f
are vendor reserved. This commit changes code so it'll consider the
additional pin complexes for models that have it, and avoid reserved
nids to be touched on 4 port models.

Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Herton Ronaldo Krzesinski 2009-02-04 11:23:19 -05:00 коммит произвёл Takashi Iwai
Родитель 306f47bd63
Коммит 616f89e74c
1 изменённых файлов: 43 добавлений и 16 удалений

Просмотреть файл

@ -481,10 +481,17 @@ static hda_nid_t stac92hd83xxx_pin_nids[14] = {
0x0f, 0x10, 0x11, 0x12, 0x13, 0x0f, 0x10, 0x11, 0x12, 0x13,
0x1d, 0x1e, 0x1f, 0x20 0x1d, 0x1e, 0x1f, 0x20
}; };
static hda_nid_t stac92hd71bxx_pin_nids[11] = {
#define STAC92HD71BXX_NUM_PINS 13
static hda_nid_t stac92hd71bxx_pin_nids_4port[STAC92HD71BXX_NUM_PINS] = {
0x0a, 0x0b, 0x0c, 0x0d, 0x00,
0x00, 0x14, 0x18, 0x19, 0x1e,
0x1f, 0x20, 0x27
};
static hda_nid_t stac92hd71bxx_pin_nids_6port[STAC92HD71BXX_NUM_PINS] = {
0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
0x0f, 0x14, 0x18, 0x19, 0x1e, 0x0f, 0x14, 0x18, 0x19, 0x1e,
0x1f, 0x1f, 0x20, 0x27
}; };
static hda_nid_t stac927x_pin_nids[14] = { static hda_nid_t stac927x_pin_nids[14] = {
@ -1745,28 +1752,32 @@ static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = {
{} /* terminator */ {} /* terminator */
}; };
static unsigned int ref92hd71bxx_pin_configs[11] = { static unsigned int ref92hd71bxx_pin_configs[STAC92HD71BXX_NUM_PINS] = {
0x02214030, 0x02a19040, 0x01a19020, 0x01014010, 0x02214030, 0x02a19040, 0x01a19020, 0x01014010,
0x0181302e, 0x01014010, 0x01019020, 0x90a000f0, 0x0181302e, 0x01014010, 0x01019020, 0x90a000f0,
0x90a000f0, 0x01452050, 0x01452050, 0x90a000f0, 0x01452050, 0x01452050, 0x00000000,
0x00000000
}; };
static unsigned int dell_m4_1_pin_configs[11] = { static unsigned int dell_m4_1_pin_configs[STAC92HD71BXX_NUM_PINS] = {
0x0421101f, 0x04a11221, 0x40f000f0, 0x90170110, 0x0421101f, 0x04a11221, 0x40f000f0, 0x90170110,
0x23a1902e, 0x23014250, 0x40f000f0, 0x90a000f0, 0x23a1902e, 0x23014250, 0x40f000f0, 0x90a000f0,
0x40f000f0, 0x4f0000f0, 0x4f0000f0, 0x40f000f0, 0x4f0000f0, 0x4f0000f0, 0x00000000,
0x00000000
}; };
static unsigned int dell_m4_2_pin_configs[11] = { static unsigned int dell_m4_2_pin_configs[STAC92HD71BXX_NUM_PINS] = {
0x0421101f, 0x04a11221, 0x90a70330, 0x90170110, 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
0x23a1902e, 0x23014250, 0x40f000f0, 0x40f000f0, 0x23a1902e, 0x23014250, 0x40f000f0, 0x40f000f0,
0x40f000f0, 0x044413b0, 0x044413b0, 0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
0x00000000
}; };
static unsigned int dell_m4_3_pin_configs[11] = { static unsigned int dell_m4_3_pin_configs[STAC92HD71BXX_NUM_PINS] = {
0x0421101f, 0x04a11221, 0x90a70330, 0x90170110, 0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0, 0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0,
0x40f000f0, 0x044413b0, 0x044413b0, 0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
0x00000000
}; };
static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
@ -2312,6 +2323,8 @@ static int stac92xx_save_bios_config_regs(struct hda_codec *codec)
hda_nid_t nid = spec->pin_nids[i]; hda_nid_t nid = spec->pin_nids[i];
unsigned int pin_cfg; unsigned int pin_cfg;
if (!nid)
continue;
pin_cfg = snd_hda_codec_read(codec, nid, 0, pin_cfg = snd_hda_codec_read(codec, nid, 0,
AC_VERB_GET_CONFIG_DEFAULT, 0x00); AC_VERB_GET_CONFIG_DEFAULT, 0x00);
snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x bios pin config %8.8x\n", snd_printdd(KERN_INFO "hda_codec: pin nid %2.2x bios pin config %8.8x\n",
@ -2354,6 +2367,7 @@ static void stac92xx_set_config_regs(struct hda_codec *codec)
return; return;
for (i = 0; i < spec->num_pins; i++) for (i = 0; i < spec->num_pins; i++)
if (spec->pin_nids[i] && spec->pin_configs[i])
stac92xx_set_config_reg(codec, spec->pin_nids[i], stac92xx_set_config_reg(codec, spec->pin_nids[i],
spec->pin_configs[i]); spec->pin_configs[i]);
} }
@ -4952,9 +4966,21 @@ static int patch_stac92hd71bxx(struct hda_codec *codec)
codec->spec = spec; codec->spec = spec;
codec->patch_ops = stac92xx_patch_ops; codec->patch_ops = stac92xx_patch_ops;
spec->num_pins = ARRAY_SIZE(stac92hd71bxx_pin_nids); spec->num_pins = STAC92HD71BXX_NUM_PINS;
switch (codec->vendor_id) {
case 0x111d76b6:
case 0x111d76b7:
spec->pin_nids = stac92hd71bxx_pin_nids_4port;
break;
case 0x111d7603:
case 0x111d7608:
/* On 92HD75Bx 0x27 isn't a pin nid */
spec->num_pins--;
/* fallthrough */
default:
spec->pin_nids = stac92hd71bxx_pin_nids_6port;
}
spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids); spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids);
spec->pin_nids = stac92hd71bxx_pin_nids;
memcpy(&spec->private_dimux, &stac92hd71bxx_dmux, memcpy(&spec->private_dimux, &stac92hd71bxx_dmux,
sizeof(stac92hd71bxx_dmux)); sizeof(stac92hd71bxx_dmux));
spec->board_config = snd_hda_check_board_config(codec, spec->board_config = snd_hda_check_board_config(codec,
@ -5018,7 +5044,8 @@ again:
/* disable VSW */ /* disable VSW */
spec->init = &stac92hd71bxx_analog_core_init[HD_DISABLE_PORTF]; spec->init = &stac92hd71bxx_analog_core_init[HD_DISABLE_PORTF];
unmute_init++; unmute_init++;
stac_change_pin_config(codec, 0xf, 0x40f000f0); stac_change_pin_config(codec, 0x0f, 0x40f000f0);
stac_change_pin_config(codec, 0x19, 0x40f000f3);
break; break;
case 0x111d7603: /* 6 Port with Analog Mixer */ case 0x111d7603: /* 6 Port with Analog Mixer */
if ((codec->revision_id & 0xf) == 1) if ((codec->revision_id & 0xf) == 1)