Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

[ALSA] ac97 - fix various issues with AD1986/AD1986A support

Previously, ac97_codec.c was coded to support AD1986 and AD1986A
CODECs using code written for the AD1985 CODEC. This allowed the
LINE_OUT and HEADPHONE jacks to function properly, however register
differences between the CODECs prevented line and microphone inputs
from functioning.
Specifically, this patch fixes issues with the following mixer
controls: 'V_REFOUT', 'Spread Front to Surround and Center/LFE',
'Exchange Front/Surround', 'Surround Jack Mode', and 'Channel Mode'.
This patch removes the undocumented AD1888 control
'High Pass Filter Enable' and adds the new control
'Exchange Mic/Line In'.

Signed-off-by: Randy Cushman <rcushman_linux@earthlink.net>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>

authored by

Randy Cushman and committed by
Jaroslav Kysela
67e9f4b6 6428ea1b

+369 -2
+1
include/sound/ac97_codec.h
··· 503 503 unsigned short id[3]; // codec IDs (lower 16-bit word) 504 504 unsigned short pcmreg[3]; // PCM registers 505 505 unsigned short codec_cfg[3]; // CODEC_CFG bits 506 + unsigned char swap_mic_linein; // AD1986/AD1986A only 506 507 } ad18xx; 507 508 unsigned int dev_flags; /* device specific */ 508 509 } spec;
+1 -1
sound/pci/ac97/ac97_codec.c
··· 111 111 { 0x41445372, 0xffffffff, "AD1981A", patch_ad1981a, NULL }, 112 112 { 0x41445374, 0xffffffff, "AD1981B", patch_ad1981b, NULL }, 113 113 { 0x41445375, 0xffffffff, "AD1985", patch_ad1985, NULL }, 114 - { 0x41445378, 0xffffffff, "AD1986", patch_ad1985, NULL }, 114 + { 0x41445378, 0xffffffff, "AD1986", patch_ad1986, NULL }, 115 115 { 0x414c4300, 0xffffff00, "ALC100,100P", NULL, NULL }, 116 116 { 0x414c4710, 0xfffffff0, "ALC200,200P", NULL, NULL }, 117 117 { 0x414c4721, 0xffffffff, "ALC650D", NULL, NULL }, /* already patched */
+366 -1
sound/pci/ac97/ac97_patch.c
··· 1626 1626 return 0; 1627 1627 } 1628 1628 1629 - /* MISC bits */ 1629 + /* MISC bits (AD1888/AD1980/AD1985 register 0x76) */ 1630 1630 #define AC97_AD198X_MBC 0x0003 /* mic boost */ 1631 1631 #define AC97_AD198X_MBC_20 0x0000 /* +20dB */ 1632 1632 #define AC97_AD198X_MBC_10 0x0001 /* +10dB */ ··· 1649 1649 #define AC97_AD198X_MSPLT 0x2000 /* mute split */ 1650 1650 #define AC97_AD198X_AC97NC 0x4000 /* AC97 no compatible mode */ 1651 1651 #define AC97_AD198X_DACZ 0x8000 /* DAC zero-fill mode */ 1652 + 1653 + /* MISC 1 bits (AD1986 register 0x76) */ 1654 + #define AC97_AD1986_MBC 0x0003 /* mic boost */ 1655 + #define AC97_AD1986_MBC_20 0x0000 /* +20dB */ 1656 + #define AC97_AD1986_MBC_10 0x0001 /* +10dB */ 1657 + #define AC97_AD1986_MBC_30 0x0002 /* +30dB */ 1658 + #define AC97_AD1986_LISEL0 0x0004 /* LINE_IN select bit 0 */ 1659 + #define AC97_AD1986_LISEL1 0x0008 /* LINE_IN select bit 1 */ 1660 + #define AC97_AD1986_LISEL_MASK (AC97_AD1986_LISEL1 | AC97_AD1986_LISEL0) 1661 + #define AC97_AD1986_LISEL_LI 0x0000 /* LINE_IN pins as LINE_IN source */ 1662 + #define AC97_AD1986_LISEL_SURR 0x0004 /* SURROUND pins as LINE_IN source */ 1663 + #define AC97_AD1986_LISEL_MIC 0x0008 /* MIC_1/2 pins as LINE_IN source */ 1664 + #define AC97_AD1986_SRU 0x0010 /* sample rate unlock */ 1665 + #define AC97_AD1986_SOSEL 0x0020 /* SURROUND_OUT amplifiers input sel */ 1666 + #define AC97_AD1986_2MIC 0x0040 /* 2-channel mic select */ 1667 + #define AC97_AD1986_SPRD 0x0080 /* SPREAD enable */ 1668 + #define AC97_AD1986_DMIX0 0x0100 /* downmix mode: */ 1669 + /* 0 = 6-to-4, 1 = 6-to-2 downmix */ 1670 + #define AC97_AD1986_DMIX1 0x0200 /* downmix mode: 1 = enabled */ 1671 + #define AC97_AD1986_CLDIS 0x0800 /* center/lfe disable */ 1672 + #define AC97_AD1986_SODIS 0x1000 /* SURROUND_OUT disable */ 1673 + #define AC97_AD1986_MSPLT 0x2000 /* mute split (read only 1) */ 1674 + #define AC97_AD1986_AC97NC 0x4000 /* AC97 no compatible mode (r/o 1) */ 1675 + #define AC97_AD1986_DACZ 0x8000 /* DAC zero-fill mode */ 1676 + 1677 + /* MISC 2 bits (AD1986 register 0x70) */ 1678 + #define AC97_AD_MISC2 0x70 /* Misc Control Bits 2 (AD1986) */ 1679 + 1680 + #define AC97_AD1986_CVREF0 0x0004 /* C/LFE VREF_OUT 2.25V */ 1681 + #define AC97_AD1986_CVREF1 0x0008 /* C/LFE VREF_OUT 0V */ 1682 + #define AC97_AD1986_CVREF2 0x0010 /* C/LFE VREF_OUT 3.7V */ 1683 + #define AC97_AD1986_CVREF_MASK \ 1684 + (AC97_AD1986_CVREF2 | AC97_AD1986_CVREF1 | AC97_AD1986_CVREF0) 1685 + #define AC97_AD1986_JSMAP 0x0020 /* Jack Sense Mapping 1 = alternate */ 1686 + #define AC97_AD1986_MMDIS 0x0080 /* Mono Mute Disable */ 1687 + #define AC97_AD1986_MVREF0 0x0400 /* MIC VREF_OUT 2.25V */ 1688 + #define AC97_AD1986_MVREF1 0x0800 /* MIC VREF_OUT 0V */ 1689 + #define AC97_AD1986_MVREF2 0x1000 /* MIC VREF_OUT 3.7V */ 1690 + #define AC97_AD1986_MVREF_MASK \ 1691 + (AC97_AD1986_MVREF2 | AC97_AD1986_MVREF1 | AC97_AD1986_MVREF0) 1692 + 1693 + /* MISC 3 bits (AD1986 register 0x7a) */ 1694 + #define AC97_AD_MISC3 0x7a /* Misc Control Bits 3 (AD1986) */ 1695 + 1696 + #define AC97_AD1986_MMIX 0x0004 /* Mic Mix, left/right */ 1697 + #define AC97_AD1986_GPO 0x0008 /* General Purpose Out */ 1698 + #define AC97_AD1986_LOHPEN 0x0010 /* LINE_OUT headphone drive */ 1699 + #define AC97_AD1986_LVREF0 0x0100 /* LINE_OUT VREF_OUT 2.25V */ 1700 + #define AC97_AD1986_LVREF1 0x0200 /* LINE_OUT VREF_OUT 0V */ 1701 + #define AC97_AD1986_LVREF2 0x0400 /* LINE_OUT VREF_OUT 3.7V */ 1702 + #define AC97_AD1986_LVREF_MASK \ 1703 + (AC97_AD1986_LVREF2 | AC97_AD1986_LVREF1 | AC97_AD1986_LVREF0) 1704 + #define AC97_AD1986_JSINVA 0x0800 /* Jack Sense Invert SENSE_A */ 1705 + #define AC97_AD1986_LOSEL 0x1000 /* LINE_OUT amplifiers input select */ 1706 + #define AC97_AD1986_HPSEL0 0x2000 /* Headphone amplifiers */ 1707 + /* input select Surround DACs */ 1708 + #define AC97_AD1986_HPSEL1 0x4000 /* Headphone amplifiers input */ 1709 + /* select C/LFE DACs */ 1710 + #define AC97_AD1986_JSINVB 0x8000 /* Jack Sense Invert SENSE_B */ 1711 + 1712 + /* Serial Config bits (AD1986 register 0x74) (incomplete) */ 1713 + #define AC97_AD1986_OMS0 0x0100 /* Optional Mic Selector bit 0 */ 1714 + #define AC97_AD1986_OMS1 0x0200 /* Optional Mic Selector bit 1 */ 1715 + #define AC97_AD1986_OMS2 0x0400 /* Optional Mic Selector bit 2 */ 1716 + #define AC97_AD1986_OMS_MASK \ 1717 + (AC97_AD1986_OMS2 | AC97_AD1986_OMS1 | AC97_AD1986_OMS0) 1718 + #define AC97_AD1986_OMS_M 0x0000 /* MIC_1/2 pins are MIC sources */ 1719 + #define AC97_AD1986_OMS_L 0x0100 /* LINE_IN pins are MIC sources */ 1720 + #define AC97_AD1986_OMS_C 0x0200 /* Center/LFE pins are MCI sources */ 1721 + #define AC97_AD1986_OMS_MC 0x0400 /* Mix of MIC and C/LFE pins */ 1722 + /* are MIC sources */ 1723 + #define AC97_AD1986_OMS_ML 0x0500 /* MIX of MIC and LINE_IN pins */ 1724 + /* are MIC sources */ 1725 + #define AC97_AD1986_OMS_LC 0x0600 /* MIX of LINE_IN and C/LFE pins */ 1726 + /* are MIC sources */ 1727 + #define AC97_AD1986_OMS_MLC 0x0700 /* MIX of MIC, LINE_IN, C/LFE pins */ 1728 + /* are MIC sources */ 1652 1729 1653 1730 1654 1731 static int snd_ac97_ad198x_spdif_source_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) ··· 2181 2104 ac97->ext_id = (ac97->ext_id & ~AC97_EI_REV_MASK) | AC97_EI_REV_23; 2182 2105 return 0; 2183 2106 } 2107 + 2108 + static int snd_ac97_ad1986_bool_info(struct snd_kcontrol *kcontrol, 2109 + struct snd_ctl_elem_info *uinfo) 2110 + { 2111 + uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 2112 + uinfo->count = 1; 2113 + uinfo->value.integer.min = 0; 2114 + uinfo->value.integer.max = 1; 2115 + return 0; 2116 + } 2117 + 2118 + static int snd_ac97_ad1986_lososel_get(struct snd_kcontrol *kcontrol, 2119 + struct snd_ctl_elem_value *ucontrol) 2120 + { 2121 + struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); 2122 + unsigned short val; 2123 + 2124 + val = ac97->regs[AC97_AD_MISC3]; 2125 + ucontrol->value.integer.value[0] = (val & AC97_AD1986_LOSEL) != 0; 2126 + return 0; 2127 + } 2128 + 2129 + static int snd_ac97_ad1986_lososel_put(struct snd_kcontrol *kcontrol, 2130 + struct snd_ctl_elem_value *ucontrol) 2131 + { 2132 + struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); 2133 + int ret0; 2134 + int ret1; 2135 + int sprd = (ac97->regs[AC97_AD_MISC] & AC97_AD1986_SPRD) != 0; 2136 + 2137 + ret0 = snd_ac97_update_bits(ac97, AC97_AD_MISC3, AC97_AD1986_LOSEL, 2138 + ucontrol->value.integer.value[0] != 0 2139 + ? AC97_AD1986_LOSEL : 0); 2140 + if (ret0 < 0) 2141 + return ret0; 2142 + 2143 + /* SOSEL is set to values of "Spread" or "Exchange F/S" controls */ 2144 + ret1 = snd_ac97_update_bits(ac97, AC97_AD_MISC, AC97_AD1986_SOSEL, 2145 + (ucontrol->value.integer.value[0] != 0 2146 + || sprd) 2147 + ? AC97_AD1986_SOSEL : 0); 2148 + if (ret1 < 0) 2149 + return ret1; 2150 + 2151 + return (ret0 > 0 || ret1 > 0) ? 1 : 0; 2152 + } 2153 + 2154 + static int snd_ac97_ad1986_spread_get(struct snd_kcontrol *kcontrol, 2155 + struct snd_ctl_elem_value *ucontrol) 2156 + { 2157 + struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); 2158 + unsigned short val; 2159 + 2160 + val = ac97->regs[AC97_AD_MISC]; 2161 + ucontrol->value.integer.value[0] = (val & AC97_AD1986_SPRD) != 0; 2162 + return 0; 2163 + } 2164 + 2165 + static int snd_ac97_ad1986_spread_put(struct snd_kcontrol *kcontrol, 2166 + struct snd_ctl_elem_value *ucontrol) 2167 + { 2168 + struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); 2169 + int ret0; 2170 + int ret1; 2171 + int sprd = (ac97->regs[AC97_AD_MISC3] & AC97_AD1986_LOSEL) != 0; 2172 + 2173 + ret0 = snd_ac97_update_bits(ac97, AC97_AD_MISC, AC97_AD1986_SPRD, 2174 + ucontrol->value.integer.value[0] != 0 2175 + ? AC97_AD1986_SPRD : 0); 2176 + if (ret0 < 0) 2177 + return ret0; 2178 + 2179 + /* SOSEL is set to values of "Spread" or "Exchange F/S" controls */ 2180 + ret1 = snd_ac97_update_bits(ac97, AC97_AD_MISC, AC97_AD1986_SOSEL, 2181 + (ucontrol->value.integer.value[0] != 0 2182 + || sprd) 2183 + ? AC97_AD1986_SOSEL : 0); 2184 + if (ret1 < 0) 2185 + return ret1; 2186 + 2187 + return (ret0 > 0 || ret1 > 0) ? 1 : 0; 2188 + } 2189 + 2190 + static int snd_ac97_ad1986_miclisel_get(struct snd_kcontrol *kcontrol, 2191 + struct snd_ctl_elem_value *ucontrol) 2192 + { 2193 + struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); 2194 + 2195 + ucontrol->value.integer.value[0] = ac97->spec.ad18xx.swap_mic_linein; 2196 + return 0; 2197 + } 2198 + 2199 + static int snd_ac97_ad1986_miclisel_put(struct snd_kcontrol *kcontrol, 2200 + struct snd_ctl_elem_value *ucontrol) 2201 + { 2202 + struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); 2203 + unsigned char swap = ucontrol->value.integer.value[0] != 0; 2204 + 2205 + if (swap != ac97->spec.ad18xx.swap_mic_linein) { 2206 + ac97->spec.ad18xx.swap_mic_linein = swap; 2207 + if (ac97->build_ops->update_jacks) 2208 + ac97->build_ops->update_jacks(ac97); 2209 + return 1; 2210 + } 2211 + return 0; 2212 + } 2213 + 2214 + static int snd_ac97_ad1986_vrefout_get(struct snd_kcontrol *kcontrol, 2215 + struct snd_ctl_elem_value *ucontrol) 2216 + { 2217 + /* Use MIC_1/2 V_REFOUT as the "get" value */ 2218 + struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); 2219 + unsigned short val; 2220 + unsigned short reg = ac97->regs[AC97_AD_MISC2]; 2221 + if ((reg & AC97_AD1986_MVREF0) != 0) 2222 + val = 2; 2223 + else if ((reg & AC97_AD1986_MVREF1) != 0) 2224 + val = 3; 2225 + else if ((reg & AC97_AD1986_MVREF2) != 0) 2226 + val = 1; 2227 + else 2228 + val = 0; 2229 + ucontrol->value.enumerated.item[0] = val; 2230 + return 0; 2231 + } 2232 + 2233 + static int snd_ac97_ad1986_vrefout_put(struct snd_kcontrol *kcontrol, 2234 + struct snd_ctl_elem_value *ucontrol) 2235 + { 2236 + struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); 2237 + unsigned short cval; 2238 + unsigned short lval; 2239 + unsigned short mval; 2240 + int cret; 2241 + int lret; 2242 + int mret; 2243 + 2244 + switch (ucontrol->value.enumerated.item[0]) 2245 + { 2246 + case 0: /* High-Z */ 2247 + cval = 0; 2248 + lval = 0; 2249 + mval = 0; 2250 + break; 2251 + case 1: /* 3.7 V */ 2252 + cval = AC97_AD1986_CVREF2; 2253 + lval = AC97_AD1986_LVREF2; 2254 + mval = AC97_AD1986_MVREF2; 2255 + break; 2256 + case 2: /* 2.25 V */ 2257 + cval = AC97_AD1986_CVREF0; 2258 + lval = AC97_AD1986_LVREF0; 2259 + mval = AC97_AD1986_MVREF0; 2260 + break; 2261 + case 3: /* 0 V */ 2262 + cval = AC97_AD1986_CVREF1; 2263 + lval = AC97_AD1986_LVREF1; 2264 + mval = AC97_AD1986_MVREF1; 2265 + break; 2266 + default: 2267 + return -EINVAL; 2268 + } 2269 + 2270 + cret = snd_ac97_update_bits(ac97, AC97_AD_MISC2, 2271 + AC97_AD1986_CVREF_MASK, cval); 2272 + if (cret < 0) 2273 + return cret; 2274 + lret = snd_ac97_update_bits(ac97, AC97_AD_MISC3, 2275 + AC97_AD1986_LVREF_MASK, lval); 2276 + if (lret < 0) 2277 + return lret; 2278 + mret = snd_ac97_update_bits(ac97, AC97_AD_MISC2, 2279 + AC97_AD1986_MVREF_MASK, mval); 2280 + if (mret < 0) 2281 + return mret; 2282 + 2283 + return (cret > 0 || lret > 0 || mret > 0) ? 1 : 0; 2284 + } 2285 + 2286 + static const struct snd_kcontrol_new snd_ac97_ad1986_controls[] = { 2287 + AC97_SINGLE("Exchange Center/LFE", AC97_AD_SERIAL_CFG, 3, 1, 0), 2288 + { 2289 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2290 + .name = "Exchange Front/Surround", 2291 + .info = snd_ac97_ad1986_bool_info, 2292 + .get = snd_ac97_ad1986_lososel_get, 2293 + .put = snd_ac97_ad1986_lososel_put 2294 + }, 2295 + { 2296 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2297 + .name = "Exchange Mic/Line In", 2298 + .info = snd_ac97_ad1986_bool_info, 2299 + .get = snd_ac97_ad1986_miclisel_get, 2300 + .put = snd_ac97_ad1986_miclisel_put 2301 + }, 2302 + { 2303 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2304 + .name = "Spread Front to Surround and Center/LFE", 2305 + .info = snd_ac97_ad1986_bool_info, 2306 + .get = snd_ac97_ad1986_spread_get, 2307 + .put = snd_ac97_ad1986_spread_put 2308 + }, 2309 + { 2310 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2311 + .name = "Downmix", 2312 + .info = snd_ac97_ad1888_downmix_info, 2313 + .get = snd_ac97_ad1888_downmix_get, 2314 + .put = snd_ac97_ad1888_downmix_put 2315 + }, 2316 + { 2317 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2318 + .name = "V_REFOUT", 2319 + .info = snd_ac97_ad1985_vrefout_info, 2320 + .get = snd_ac97_ad1986_vrefout_get, 2321 + .put = snd_ac97_ad1986_vrefout_put 2322 + }, 2323 + AC97_SURROUND_JACK_MODE_CTL, 2324 + AC97_CHANNEL_MODE_CTL, 2325 + 2326 + AC97_SINGLE("Headphone Jack Sense", AC97_AD_JACK_SPDIF, 10, 1, 0), 2327 + AC97_SINGLE("Line Jack Sense", AC97_AD_JACK_SPDIF, 12, 1, 0) 2328 + }; 2329 + 2330 + static void ad1986_update_jacks(struct snd_ac97 *ac97) 2331 + { 2332 + unsigned short misc_val = 0; 2333 + unsigned short ser_val; 2334 + 2335 + /* disable SURROUND and CENTER/LFE if not surround mode */ 2336 + if (! is_surround_on(ac97)) 2337 + misc_val |= AC97_AD1986_SODIS; 2338 + if (! is_clfe_on(ac97)) 2339 + misc_val |= AC97_AD1986_CLDIS; 2340 + 2341 + /* select line input (default=LINE_IN, SURROUND or MIC_1/2) */ 2342 + if (is_shared_linein(ac97)) 2343 + misc_val |= AC97_AD1986_LISEL_SURR; 2344 + else if (ac97->spec.ad18xx.swap_mic_linein != 0) 2345 + misc_val |= AC97_AD1986_LISEL_MIC; 2346 + snd_ac97_update_bits(ac97, AC97_AD_MISC, 2347 + AC97_AD1986_SODIS | AC97_AD1986_CLDIS | 2348 + AC97_AD1986_LISEL_MASK, 2349 + misc_val); 2350 + 2351 + /* select microphone input (MIC_1/2, Center/LFE or LINE_IN) */ 2352 + if (is_shared_micin(ac97)) 2353 + ser_val = AC97_AD1986_OMS_C; 2354 + else if (ac97->spec.ad18xx.swap_mic_linein != 0) 2355 + ser_val = AC97_AD1986_OMS_L; 2356 + else 2357 + ser_val = AC97_AD1986_OMS_M; 2358 + snd_ac97_update_bits(ac97, AC97_AD_SERIAL_CFG, 2359 + AC97_AD1986_OMS_MASK, 2360 + ser_val); 2361 + } 2362 + 2363 + static int patch_ad1986_specific(struct snd_ac97 *ac97) 2364 + { 2365 + int err; 2366 + 2367 + if ((err = patch_build_controls(ac97, &snd_ac97_ad198x_2cmic, 1)) < 0) 2368 + return err; 2369 + 2370 + return patch_build_controls(ac97, snd_ac97_ad1986_controls, 2371 + ARRAY_SIZE(snd_ac97_ad1985_controls)); 2372 + } 2373 + 2374 + static struct snd_ac97_build_ops patch_ad1986_build_ops = { 2375 + .build_post_spdif = patch_ad198x_post_spdif, 2376 + .build_specific = patch_ad1986_specific, 2377 + #ifdef CONFIG_PM 2378 + .resume = ad18xx_resume, 2379 + #endif 2380 + .update_jacks = ad1986_update_jacks, 2381 + }; 2382 + 2383 + int patch_ad1986(struct snd_ac97 * ac97) 2384 + { 2385 + patch_ad1881(ac97); 2386 + ac97->build_ops = &patch_ad1986_build_ops; 2387 + ac97->flags |= AC97_STEREO_MUTES; 2388 + 2389 + /* update current jack configuration */ 2390 + ad1986_update_jacks(ac97); 2391 + 2392 + return 0; 2393 + } 2394 + 2184 2395 2185 2396 /* 2186 2397 * realtek ALC65x/850 codecs
+1
sound/pci/ac97/ac97_patch.h
··· 48 48 int patch_ad1981a(struct snd_ac97 * ac97); 49 49 int patch_ad1981b(struct snd_ac97 * ac97); 50 50 int patch_ad1985(struct snd_ac97 * ac97); 51 + int patch_ad1986(struct snd_ac97 * ac97); 51 52 int patch_alc650(struct snd_ac97 * ac97); 52 53 int patch_alc655(struct snd_ac97 * ac97); 53 54 int patch_alc850(struct snd_ac97 * ac97);