Commit 54a88ce8 authored by Jaroslav Kysela's avatar Jaroslav Kysela

ALSA CVS update - Takashi Iwai <tiwai@suse.de>

Intel8x0 driver,VIA82xx driver,AC97 Codec Core
- use ADI-compatible mode on AD1980 for more better controls.
- swap master and headphone on AD1980 and AD1985 as default.
- export remove_ctl, swap_ctl and rename_ctl for patch functions.
- removed AD1980/AD1985 master-swap quirks (since it's set as default).
parent b0d992e2
...@@ -2234,7 +2234,7 @@ void snd_ac97_resume(ac97_t *ac97) ...@@ -2234,7 +2234,7 @@ void snd_ac97_resume(ac97_t *ac97)
/* /*
*/ */
static int remove_ctl(ac97_t *ac97, const char *name) int snd_ac97_remove_ctl(ac97_t *ac97, const char *name)
{ {
snd_ctl_elem_id_t id; snd_ctl_elem_id_t id;
memset(&id, 0, sizeof(id)); memset(&id, 0, sizeof(id));
...@@ -2252,7 +2252,7 @@ static snd_kcontrol_t *ctl_find(ac97_t *ac97, const char *name) ...@@ -2252,7 +2252,7 @@ static snd_kcontrol_t *ctl_find(ac97_t *ac97, const char *name)
return snd_ctl_find_id(ac97->card, &sid); return snd_ctl_find_id(ac97->card, &sid);
} }
static int rename_ctl(ac97_t *ac97, const char *src, const char *dst) int snd_ac97_rename_ctl(ac97_t *ac97, const char *src, const char *dst)
{ {
snd_kcontrol_t *kctl = ctl_find(ac97, src); snd_kcontrol_t *kctl = ctl_find(ac97, src);
if (kctl) { if (kctl) {
...@@ -2262,7 +2262,7 @@ static int rename_ctl(ac97_t *ac97, const char *src, const char *dst) ...@@ -2262,7 +2262,7 @@ static int rename_ctl(ac97_t *ac97, const char *src, const char *dst)
return -ENOENT; return -ENOENT;
} }
static int swap_ctl(ac97_t *ac97, const char *s1, const char *s2) int snd_ac97_swap_ctl(ac97_t *ac97, const char *s1, const char *s2)
{ {
snd_kcontrol_t *kctl1, *kctl2; snd_kcontrol_t *kctl1, *kctl2;
kctl1 = ctl_find(ac97, s1); kctl1 = ctl_find(ac97, s1);
...@@ -2279,22 +2279,22 @@ static int swap_headphone(ac97_t *ac97, int remove_master) ...@@ -2279,22 +2279,22 @@ static int swap_headphone(ac97_t *ac97, int remove_master)
{ {
/* FIXME: error checks.. */ /* FIXME: error checks.. */
if (remove_master) { if (remove_master) {
remove_ctl(ac97, "Master Playback Switch"); snd_ac97_remove_ctl(ac97, "Master Playback Switch");
remove_ctl(ac97, "Master Playback Volume"); snd_ac97_remove_ctl(ac97, "Master Playback Volume");
} else { } else {
rename_ctl(ac97, "Master Playback Switch", "Line-Out Playback Switch"); snd_ac97_rename_ctl(ac97, "Master Playback Switch", "Line-Out Playback Switch");
rename_ctl(ac97, "Master Playback Volume", "Line-Out Playback Volume"); snd_ac97_rename_ctl(ac97, "Master Playback Volume", "Line-Out Playback Volume");
} }
rename_ctl(ac97, "Headphone Playback Switch", "Master Playback Switch"); snd_ac97_rename_ctl(ac97, "Headphone Playback Switch", "Master Playback Switch");
rename_ctl(ac97, "Headphone Playback Volume", "Master Playback Volume"); snd_ac97_rename_ctl(ac97, "Headphone Playback Volume", "Master Playback Volume");
return 0; return 0;
} }
static int swap_surround(ac97_t *ac97) static int swap_surround(ac97_t *ac97)
{ {
/* FIXME: error checks.. */ /* FIXME: error checks.. */
swap_ctl(ac97, "Master Playback Switch", "Surround Playback Switch"); snd_ac97_swap_ctl(ac97, "Master Playback Switch", "Surround Playback Switch");
swap_ctl(ac97, "Master Playback Volume", "Surround Playback Volume"); snd_ac97_swap_ctl(ac97, "Master Playback Volume", "Surround Playback Volume");
return 0; return 0;
} }
...@@ -2304,7 +2304,7 @@ static int tune_ad_sharing(ac97_t *ac97) ...@@ -2304,7 +2304,7 @@ static int tune_ad_sharing(ac97_t *ac97)
/* Turn on OMS bit to route microphone to back panel */ /* Turn on OMS bit to route microphone to back panel */
scfg = snd_ac97_read(ac97, AC97_AD_SERIAL_CFG); scfg = snd_ac97_read(ac97, AC97_AD_SERIAL_CFG);
snd_ac97_write_cache(ac97, AC97_AD_SERIAL_CFG, scfg | 0x0200); snd_ac97_write_cache(ac97, AC97_AD_SERIAL_CFG, scfg | 0x0200);
return swap_headphone(ac97, 1); return 0;
} }
/** /**
......
...@@ -37,6 +37,9 @@ int snd_ac97_info_single(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo); ...@@ -37,6 +37,9 @@ int snd_ac97_info_single(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo);
int snd_ac97_get_single(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol); int snd_ac97_get_single(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol);
int snd_ac97_put_single(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol); int snd_ac97_put_single(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol);
int snd_ac97_try_bit(ac97_t * ac97, int reg, int bit); int snd_ac97_try_bit(ac97_t * ac97, int reg, int bit);
int snd_ac97_remove_ctl(ac97_t *ac97, const char *name);
int snd_ac97_rename_ctl(ac97_t *ac97, const char *src, const char *dst);
int snd_ac97_swap_ctl(ac97_t *ac97, const char *s1, const char *s2);
/* ac97_proc.c */ /* ac97_proc.c */
void snd_ac97_proc_init(snd_card_t * card, ac97_t * ac97, const char *prefix); void snd_ac97_proc_init(snd_card_t * card, ac97_t * ac97, const char *prefix);
...@@ -764,8 +764,19 @@ static int patch_ad1980_post_spdif(ac97_t * ac97) ...@@ -764,8 +764,19 @@ static int patch_ad1980_post_spdif(ac97_t * ac97)
return patch_build_controls(ac97, &snd_ac97_ad1980_spdif_source, 1); return patch_build_controls(ac97, &snd_ac97_ad1980_spdif_source, 1);
} }
static int patch_ad1980_specific(ac97_t *ac97)
{
/* rename 0x04 as "Master" and 0x02 as "Master Surround" */
snd_ac97_rename_ctl(ac97, "Master Playback Switch", "Master Surround Playback Switch");
snd_ac97_rename_ctl(ac97, "Master Playback Volume", "Master Surround Playback Volume");
snd_ac97_rename_ctl(ac97, "Headphone Playback Switch", "Master Playback Switch");
snd_ac97_rename_ctl(ac97, "Headphone Playback Volume", "Headphone Playback Volume");
return 0;
}
static struct snd_ac97_build_ops patch_ad1980_build_ops = { static struct snd_ac97_build_ops patch_ad1980_build_ops = {
.build_post_spdif = &patch_ad1980_post_spdif .build_post_spdif = patch_ad1980_post_spdif,
.build_specific = patch_ad1980_specific
}; };
int patch_ad1980(ac97_t * ac97) int patch_ad1980(ac97_t * ac97)
...@@ -776,12 +787,14 @@ int patch_ad1980(ac97_t * ac97) ...@@ -776,12 +787,14 @@ int patch_ad1980(ac97_t * ac97)
ac97->build_ops = &patch_ad1980_build_ops; ac97->build_ops = &patch_ad1980_build_ops;
/* Switch FRONT/SURROUND LINE-OUT/HP-OUT default connection */ /* Switch FRONT/SURROUND LINE-OUT/HP-OUT default connection */
/* it seems that most vendors connect line-out connector to headphone out of AC'97 */ /* it seems that most vendors connect line-out connector to headphone out of AC'97 */
/* AD-compatible mode */
/* Stereo mutes enabled */ /* Stereo mutes enabled */
misc = snd_ac97_read(ac97, AC97_AD_MISC); misc = snd_ac97_read(ac97, AC97_AD_MISC);
snd_ac97_write_cache(ac97, AC97_AD_MISC, misc | snd_ac97_write_cache(ac97, AC97_AD_MISC, misc |
AC97_AD198X_LOSEL | AC97_AD198X_LOSEL |
AC97_AD198X_HPSEL | AC97_AD198X_HPSEL |
AC97_AD198X_MSPLT); AC97_AD198X_MSPLT |
AC97_AD198X_AC97NC);
ac97->flags |= AC97_STEREO_MUTES; ac97->flags |= AC97_STEREO_MUTES;
return 0; return 0;
} }
......
...@@ -1579,27 +1579,15 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { ...@@ -1579,27 +1579,15 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
{ {
.vendor = 0x1028, .vendor = 0x1028,
.device = 0x00d8, .device = 0x00d8,
.name = "Dell Precision 530", .name = "Dell Precision 530", /* AD1885 */
.type = AC97_TUNE_HP_ONLY .type = AC97_TUNE_HP_ONLY
}, },
{ {
.vendor = 0x1028, .vendor = 0x1028,
.device = 0x0126, .device = 0x0126,
.name = "Dell Optiplex GX260", .name = "Dell Optiplex GX260", /* AD1981A */
.type = AC97_TUNE_HP_ONLY .type = AC97_TUNE_HP_ONLY
}, },
{
.vendor = 0x1028,
.device = 0x0157,
.name = "Dell Dimension 8300",
.type = AC97_TUNE_SWAP_SURROUND
},
{
.vendor = 0x1043,
.device =0x80b0,
.name = "ASUS P4PE Mobo",
.type = AC97_TUNE_SWAP_SURROUND
},
{ {
.vendor = 0x1043, .vendor = 0x1043,
.device = 0x80f3, .device = 0x80f3,
...@@ -1609,41 +1597,19 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { ...@@ -1609,41 +1597,19 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
{ {
.vendor = 0x10f1, .vendor = 0x10f1,
.device = 0x2665, .device = 0x2665,
.name = "Fujitsu-Siemens Celcius", .name = "Fujitsu-Siemens Celsius", /* AD1981? */
.type = AC97_TUNE_HP_ONLY .type = AC97_TUNE_HP_ONLY
}, },
{ {
.vendor = 0x110a, .vendor = 0x110a,
.device = 0x0056, .device = 0x0056,
.name = "Fujitsu-Siemens Scenic", .name = "Fujitsu-Siemens Scenic", /* AD1981? */
.type = AC97_TUNE_HP_ONLY
},
{
.vendor = 0x11d4,
.device = 0x5375,
.name = "ADI AD1985 (discrete)",
.type = AC97_TUNE_HP_ONLY .type = AC97_TUNE_HP_ONLY
}, },
{ {
.vendor = 0x1734, .vendor = 0x1734,
.device = 0x0088, .device = 0x0088,
.name = "Fujitsu-Siemens D1522", .name = "Fujitsu-Siemens D1522", /* AD1981 */
.type = AC97_TUNE_HP_ONLY
},
#if 0
/* FIXME: this seems invalid */
{
.vendor = 0x4144,
.device = 0x5360,
.type = "AMD64 Motherboard",
.name = AC97_TUNE_HP_ONLY
},
#endif
{
.vendor = 0x8086,
.device = 0x2000,
.mask = 0xfff0,
.name = "Intel ICH5/AD1985 (discrete)",
.type = AC97_TUNE_HP_ONLY .type = AC97_TUNE_HP_ONLY
}, },
{ {
...@@ -1656,7 +1622,7 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { ...@@ -1656,7 +1622,7 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
{ {
.vendor = 0x8086, .vendor = 0x8086,
.device = 0x4d44, .device = 0x4d44,
.name = "Intel D850EMV2", .name = "Intel D850EMV2", /* AD1885 */
.type = AC97_TUNE_HP_ONLY .type = AC97_TUNE_HP_ONLY
}, },
{ {
...@@ -1673,14 +1639,7 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { ...@@ -1673,14 +1639,7 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
.name = "Intel ICH5/AD1985", .name = "Intel ICH5/AD1985",
.type = AC97_TUNE_AD_SHARING .type = AC97_TUNE_AD_SHARING
}, },
{ { /* FIXME: which codec? */
.vendor = 0x8086,
.device = 0xa000,
.mask = 0xfff0,
.name = "Intel ICH5/AD1985 (discrete)",
.type = AC97_TUNE_HP_ONLY
},
{
.vendor = 0x103c, .vendor = 0x103c,
.device = 0x00c3, .device = 0x00c3,
.name = "Hewlett-Packard onboard", .name = "Hewlett-Packard onboard",
......
...@@ -1535,18 +1535,12 @@ static void snd_via82xx_mixer_free_ac97(ac97_t *ac97) ...@@ -1535,18 +1535,12 @@ static void snd_via82xx_mixer_free_ac97(ac97_t *ac97)
} }
static struct ac97_quirk ac97_quirks[] = { static struct ac97_quirk ac97_quirks[] = {
{ { /* FIXME: which codec? */
.vendor = 0x1106, .vendor = 0x1106,
.device = 0x4161, .device = 0x4161,
.name = "ASRock K7VT2", .name = "ASRock K7VT2",
.type = AC97_TUNE_HP_ONLY .type = AC97_TUNE_HP_ONLY
}, },
{
.vendor = 0x1043,
.device = 0x80a1,
.name = "ASUS A7V8-X",
.type = AC97_TUNE_SWAP_SURROUND
},
{ } /* terminator */ { } /* terminator */
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment