[ALSA] ac97 - Fix ASUS A9T laptop output

ASUS A9T laptop uses line-out pin as the real front-output while
other devices use it as the surround.

Signed-off-by: Takashi Iwai <tiwai@suse.de>

+35 -14
+1
include/sound/ac97_codec.h
··· 505 unsigned short pcmreg[3]; // PCM registers 506 unsigned short codec_cfg[3]; // CODEC_CFG bits 507 unsigned char swap_mic_linein; // AD1986/AD1986A only 508 } ad18xx; 509 unsigned int dev_flags; /* device specific */ 510 } spec;
··· 505 unsigned short pcmreg[3]; // PCM registers 506 unsigned short codec_cfg[3]; // CODEC_CFG bits 507 unsigned char swap_mic_linein; // AD1986/AD1986A only 508 + unsigned char lo_as_master; /* LO as master */ 509 } ad18xx; 510 unsigned int dev_flags; /* device specific */ 511 } spec;
+34 -14
sound/pci/ac97/ac97_patch.c
··· 1971 1972 val = ac97->regs[AC97_AD_MISC]; 1973 ucontrol->value.integer.value[0] = !(val & AC97_AD198X_LOSEL); 1974 return 0; 1975 } 1976 ··· 1982 struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); 1983 unsigned short val; 1984 1985 - val = !ucontrol->value.integer.value[0] 1986 - ? (AC97_AD198X_LOSEL | AC97_AD198X_HPSEL) : 0; 1987 return snd_ac97_update_bits(ac97, AC97_AD_MISC, 1988 AC97_AD198X_LOSEL | AC97_AD198X_HPSEL, val); 1989 } ··· 2036 { 2037 unsigned short val = 0; 2038 /* clear LODIS if shared jack is to be used for Surround out */ 2039 - if (is_shared_linein(ac97)) 2040 val |= (1 << 12); 2041 /* clear CLDIS if shared jack is to be used for C/LFE out */ 2042 if (is_shared_micin(ac97)) ··· 2072 2073 static int patch_ad1888_specific(struct snd_ac97 *ac97) 2074 { 2075 - /* rename 0x04 as "Master" and 0x02 as "Master Surround" */ 2076 - snd_ac97_rename_vol_ctl(ac97, "Master Playback", "Master Surround Playback"); 2077 - snd_ac97_rename_vol_ctl(ac97, "Headphone Playback", "Master Playback"); 2078 return patch_build_controls(ac97, snd_ac97_ad1888_controls, ARRAY_SIZE(snd_ac97_ad1888_controls)); 2079 } 2080 ··· 2097 2098 patch_ad1881(ac97); 2099 ac97->build_ops = &patch_ad1888_build_ops; 2100 - /* Switch FRONT/SURROUND LINE-OUT/HP-OUT default connection */ 2101 - /* it seems that most vendors connect line-out connector to headphone out of AC'97 */ 2102 /* AD-compatible mode */ 2103 /* Stereo mutes enabled */ 2104 - misc = snd_ac97_read(ac97, AC97_AD_MISC); 2105 - snd_ac97_write_cache(ac97, AC97_AD_MISC, misc | 2106 - AC97_AD198X_LOSEL | 2107 - AC97_AD198X_HPSEL | 2108 - AC97_AD198X_MSPLT | 2109 - AC97_AD198X_AC97NC); 2110 ac97->flags |= AC97_STEREO_MUTES; 2111 return 0; 2112 }
··· 1971 1972 val = ac97->regs[AC97_AD_MISC]; 1973 ucontrol->value.integer.value[0] = !(val & AC97_AD198X_LOSEL); 1974 + if (ac97->spec.ad18xx.lo_as_master) 1975 + ucontrol->value.integer.value[0] = 1976 + !ucontrol->value.integer.value[0]; 1977 return 0; 1978 } 1979 ··· 1979 struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); 1980 unsigned short val; 1981 1982 + val = !ucontrol->value.integer.value[0]; 1983 + if (ac97->spec.ad18xx.lo_as_master) 1984 + val = !val; 1985 + val = val ? (AC97_AD198X_LOSEL | AC97_AD198X_HPSEL) : 0; 1986 return snd_ac97_update_bits(ac97, AC97_AD_MISC, 1987 AC97_AD198X_LOSEL | AC97_AD198X_HPSEL, val); 1988 } ··· 2031 { 2032 unsigned short val = 0; 2033 /* clear LODIS if shared jack is to be used for Surround out */ 2034 + if (!ac97->spec.ad18xx.lo_as_master && is_shared_linein(ac97)) 2035 val |= (1 << 12); 2036 /* clear CLDIS if shared jack is to be used for C/LFE out */ 2037 if (is_shared_micin(ac97)) ··· 2067 2068 static int patch_ad1888_specific(struct snd_ac97 *ac97) 2069 { 2070 + if (!ac97->spec.ad18xx.lo_as_master) { 2071 + /* rename 0x04 as "Master" and 0x02 as "Master Surround" */ 2072 + snd_ac97_rename_vol_ctl(ac97, "Master Playback", 2073 + "Master Surround Playback"); 2074 + snd_ac97_rename_vol_ctl(ac97, "Headphone Playback", 2075 + "Master Playback"); 2076 + } 2077 return patch_build_controls(ac97, snd_ac97_ad1888_controls, ARRAY_SIZE(snd_ac97_ad1888_controls)); 2078 } 2079 ··· 2088 2089 patch_ad1881(ac97); 2090 ac97->build_ops = &patch_ad1888_build_ops; 2091 + 2092 + /* 2093 + * LO can be used as a real line-out on some devices, 2094 + * and we need to revert the front/surround mixer switches 2095 + */ 2096 + if (ac97->subsystem_vendor == 0x1043 && 2097 + ac97->subsystem_device == 0x1193) /* ASUS A9T laptop */ 2098 + ac97->spec.ad18xx.lo_as_master = 1; 2099 + 2100 + misc = snd_ac97_read(ac97, AC97_AD_MISC); 2101 /* AD-compatible mode */ 2102 /* Stereo mutes enabled */ 2103 + misc |= AC97_AD198X_MSPLT | AC97_AD198X_AC97NC; 2104 + if (!ac97->spec.ad18xx.lo_as_master) 2105 + /* Switch FRONT/SURROUND LINE-OUT/HP-OUT default connection */ 2106 + /* it seems that most vendors connect line-out connector to 2107 + * headphone out of AC'97 2108 + */ 2109 + misc |= AC97_AD198X_LOSEL | AC97_AD198X_HPSEL; 2110 + 2111 + snd_ac97_write_cache(ac97, AC97_AD_MISC, misc); 2112 ac97->flags |= AC97_STEREO_MUTES; 2113 return 0; 2114 }