···505 unsigned short pcmreg[3]; // PCM registers506 unsigned short codec_cfg[3]; // CODEC_CFG bits507 unsigned char swap_mic_linein; // AD1986/AD1986A only0508 } ad18xx;509 unsigned int dev_flags; /* device specific */510 } spec;
···505 unsigned short pcmreg[3]; // PCM registers506 unsigned short codec_cfg[3]; // CODEC_CFG bits507 unsigned char swap_mic_linein; // AD1986/AD1986A only508+ 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
···19711972 val = ac97->regs[AC97_AD_MISC];1973 ucontrol->value.integer.value[0] = !(val & AC97_AD198X_LOSEL);0001974 return 0;1975}1976···1982 struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);1983 unsigned short val;19841985- val = !ucontrol->value.integer.value[0]1986- ? (AC97_AD198X_LOSEL | AC97_AD198X_HPSEL) : 0;001987 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))···20722073static 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");00002078 return patch_build_controls(ac97, snd_ac97_ad1888_controls, ARRAY_SIZE(snd_ac97_ad1888_controls));2079}2080···20972098 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 */000000002102 /* 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);0002110 ac97->flags |= AC97_STEREO_MUTES;2111 return 0;2112}
···19711972 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;19811982+ 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))···20672068static 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···20882089 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 switches2095+ */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 to2107+ * headphone out of AC'972108+ */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}