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)
/*
*/
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;
memset(&id, 0, sizeof(id));
......@@ -2252,7 +2252,7 @@ static snd_kcontrol_t *ctl_find(ac97_t *ac97, const char *name)
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);
if (kctl) {
......@@ -2262,7 +2262,7 @@ static int rename_ctl(ac97_t *ac97, const char *src, const char *dst)
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;
kctl1 = ctl_find(ac97, s1);
......@@ -2279,22 +2279,22 @@ static int swap_headphone(ac97_t *ac97, int remove_master)
{
/* FIXME: error checks.. */
if (remove_master) {
remove_ctl(ac97, "Master Playback Switch");
remove_ctl(ac97, "Master Playback Volume");
snd_ac97_remove_ctl(ac97, "Master Playback Switch");
snd_ac97_remove_ctl(ac97, "Master Playback Volume");
} else {
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 Switch", "Line-Out Playback Switch");
snd_ac97_rename_ctl(ac97, "Master Playback Volume", "Line-Out Playback Volume");
}
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 Switch", "Master Playback Switch");
snd_ac97_rename_ctl(ac97, "Headphone Playback Volume", "Master Playback Volume");
return 0;
}
static int swap_surround(ac97_t *ac97)
{
/* FIXME: error checks.. */
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 Switch", "Surround Playback Switch");
snd_ac97_swap_ctl(ac97, "Master Playback Volume", "Surround Playback Volume");
return 0;
}
......@@ -2304,7 +2304,7 @@ static int tune_ad_sharing(ac97_t *ac97)
/* Turn on OMS bit to route microphone to back panel */
scfg = snd_ac97_read(ac97, AC97_AD_SERIAL_CFG);
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);
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_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 */
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)
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 = {
.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)
......@@ -776,12 +787,14 @@ int patch_ad1980(ac97_t * ac97)
ac97->build_ops = &patch_ad1980_build_ops;
/* Switch FRONT/SURROUND LINE-OUT/HP-OUT default connection */
/* it seems that most vendors connect line-out connector to headphone out of AC'97 */
/* AD-compatible mode */
/* Stereo mutes enabled */
misc = snd_ac97_read(ac97, AC97_AD_MISC);
snd_ac97_write_cache(ac97, AC97_AD_MISC, misc |
AC97_AD198X_LOSEL |
AC97_AD198X_HPSEL |
AC97_AD198X_MSPLT);
AC97_AD198X_MSPLT |
AC97_AD198X_AC97NC);
ac97->flags |= AC97_STEREO_MUTES;
return 0;
}
......
......@@ -1579,27 +1579,15 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
{
.vendor = 0x1028,
.device = 0x00d8,
.name = "Dell Precision 530",
.name = "Dell Precision 530", /* AD1885 */
.type = AC97_TUNE_HP_ONLY
},
{
.vendor = 0x1028,
.device = 0x0126,
.name = "Dell Optiplex GX260",
.name = "Dell Optiplex GX260", /* AD1981A */
.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,
.device = 0x80f3,
......@@ -1609,41 +1597,19 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
{
.vendor = 0x10f1,
.device = 0x2665,
.name = "Fujitsu-Siemens Celcius",
.name = "Fujitsu-Siemens Celsius", /* AD1981? */
.type = AC97_TUNE_HP_ONLY
},
{
.vendor = 0x110a,
.device = 0x0056,
.name = "Fujitsu-Siemens Scenic",
.type = AC97_TUNE_HP_ONLY
},
{
.vendor = 0x11d4,
.device = 0x5375,
.name = "ADI AD1985 (discrete)",
.name = "Fujitsu-Siemens Scenic", /* AD1981? */
.type = AC97_TUNE_HP_ONLY
},
{
.vendor = 0x1734,
.device = 0x0088,
.name = "Fujitsu-Siemens D1522",
.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)",
.name = "Fujitsu-Siemens D1522", /* AD1981 */
.type = AC97_TUNE_HP_ONLY
},
{
......@@ -1656,7 +1622,7 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
{
.vendor = 0x8086,
.device = 0x4d44,
.name = "Intel D850EMV2",
.name = "Intel D850EMV2", /* AD1885 */
.type = AC97_TUNE_HP_ONLY
},
{
......@@ -1673,14 +1639,7 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
.name = "Intel ICH5/AD1985",
.type = AC97_TUNE_AD_SHARING
},
{
.vendor = 0x8086,
.device = 0xa000,
.mask = 0xfff0,
.name = "Intel ICH5/AD1985 (discrete)",
.type = AC97_TUNE_HP_ONLY
},
{
{ /* FIXME: which codec? */
.vendor = 0x103c,
.device = 0x00c3,
.name = "Hewlett-Packard onboard",
......
......@@ -1535,18 +1535,12 @@ static void snd_via82xx_mixer_free_ac97(ac97_t *ac97)
}
static struct ac97_quirk ac97_quirks[] = {
{
{ /* FIXME: which codec? */
.vendor = 0x1106,
.device = 0x4161,
.name = "ASRock K7VT2",
.type = AC97_TUNE_HP_ONLY
},
{
.vendor = 0x1043,
.device = 0x80a1,
.name = "ASUS A7V8-X",
.type = AC97_TUNE_SWAP_SURROUND
},
{ } /* 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