19484Sgarrett.damore@Sun.COM /*
29484Sgarrett.damore@Sun.COM * CDDL HEADER START
39484Sgarrett.damore@Sun.COM *
49484Sgarrett.damore@Sun.COM * The contents of this file are subject to the terms of the
59484Sgarrett.damore@Sun.COM * Common Development and Distribution License (the "License").
69484Sgarrett.damore@Sun.COM * You may not use this file except in compliance with the License.
79484Sgarrett.damore@Sun.COM *
89484Sgarrett.damore@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99484Sgarrett.damore@Sun.COM * or http://www.opensolaris.org/os/licensing.
109484Sgarrett.damore@Sun.COM * See the License for the specific language governing permissions
119484Sgarrett.damore@Sun.COM * and limitations under the License.
129484Sgarrett.damore@Sun.COM *
139484Sgarrett.damore@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
149484Sgarrett.damore@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159484Sgarrett.damore@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
169484Sgarrett.damore@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
179484Sgarrett.damore@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
189484Sgarrett.damore@Sun.COM *
199484Sgarrett.damore@Sun.COM * CDDL HEADER END
209484Sgarrett.damore@Sun.COM */
219484Sgarrett.damore@Sun.COM /*
22*12165Sgdamore@opensolaris.org * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
239484Sgarrett.damore@Sun.COM */
249484Sgarrett.damore@Sun.COM
259484Sgarrett.damore@Sun.COM /*
269484Sgarrett.damore@Sun.COM * CMI (C-Media) codec extensions.
279484Sgarrett.damore@Sun.COM */
289484Sgarrett.damore@Sun.COM
299484Sgarrett.damore@Sun.COM #include <sys/types.h>
309484Sgarrett.damore@Sun.COM #include <sys/ddi.h>
319484Sgarrett.damore@Sun.COM #include <sys/sunddi.h>
329484Sgarrett.damore@Sun.COM #include <sys/audio/audio_driver.h>
339484Sgarrett.damore@Sun.COM #include <sys/audio/ac97.h>
349484Sgarrett.damore@Sun.COM #include <sys/note.h>
359484Sgarrett.damore@Sun.COM #include "ac97_impl.h"
369484Sgarrett.damore@Sun.COM
379484Sgarrett.damore@Sun.COM /*
389484Sgarrett.damore@Sun.COM * C-Media 9739 part is weird. Instead of having independent volume
399484Sgarrett.damore@Sun.COM * controls for each of the channels, it uses a single master volume
409484Sgarrett.damore@Sun.COM * and just provides mute support for the other bits. It does this
419484Sgarrett.damore@Sun.COM * for PCM volume as well, so we can't use it either. Ugh. It also
429484Sgarrett.damore@Sun.COM * has an optional 30 dB mic boost. Apparently the 9761 behaves in
439484Sgarrett.damore@Sun.COM * much the same fashion as the 9739.
449484Sgarrett.damore@Sun.COM *
459484Sgarrett.damore@Sun.COM * C-Media 9738 is a more or less typical 4CH device according to the
469484Sgarrett.damore@Sun.COM * datasheet. It however supports jack retasking allowing the line in
479484Sgarrett.damore@Sun.COM * jack to function as a surround output. Google suggests that the
489484Sgarrett.damore@Sun.COM * volume controls on this part are about as busted as on the other
499484Sgarrett.damore@Sun.COM * parts. So, we just use synthetic volume for it.
509484Sgarrett.damore@Sun.COM *
519484Sgarrett.damore@Sun.COM * C-Media 9780 is largely a mystery (ENODATASHEET).
529484Sgarrett.damore@Sun.COM */
539484Sgarrett.damore@Sun.COM
549484Sgarrett.damore@Sun.COM
559484Sgarrett.damore@Sun.COM #define CMI_TASK_REGISTER 0x5A /* 9738 jack retasking */
569484Sgarrett.damore@Sun.COM #define CTR_F2R 0x2000 /* front routed to rear */
579484Sgarrett.damore@Sun.COM #define CTR_S2LNI 0x0400 /* surround to line in */
589484Sgarrett.damore@Sun.COM
599484Sgarrett.damore@Sun.COM #define CMI_MULTICH_REGISTER 0x64 /* 9739 and 9761a */
609484Sgarrett.damore@Sun.COM #define CMR_PCBSW 0x8000 /* PC Beep volume bypass */
619484Sgarrett.damore@Sun.COM #define CMR_P47 0x4000 /* configure P47 function */
629484Sgarrett.damore@Sun.COM #define CMR_REFCTL 0x2000 /* enable vref output */
639484Sgarrett.damore@Sun.COM #define CMR_CLCTL 0x1000 /* center/lfe output enable */
649484Sgarrett.damore@Sun.COM #define CMR_S2LNI 0x0400 /* surround to line in */
659484Sgarrett.damore@Sun.COM #define CMR_MIX2S 0x0200 /* analog input pass to surround */
669484Sgarrett.damore@Sun.COM #define CMR_BSTSEL 0x0001 /* micboost use 30dB */
679484Sgarrett.damore@Sun.COM
689484Sgarrett.damore@Sun.COM static void
cmi_set_micboost(ac97_ctrl_t * actrl,uint64_t value)699484Sgarrett.damore@Sun.COM cmi_set_micboost(ac97_ctrl_t *actrl, uint64_t value)
709484Sgarrett.damore@Sun.COM {
719484Sgarrett.damore@Sun.COM ac97_t *ac = actrl->actrl_ac97;
729484Sgarrett.damore@Sun.COM
7310413SGarrett.Damore@Sun.COM ac_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
749484Sgarrett.damore@Sun.COM switch (value) {
759484Sgarrett.damore@Sun.COM case 0x1:
769484Sgarrett.damore@Sun.COM /* 0db */
7710413SGarrett.Damore@Sun.COM ac_clr(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
7810413SGarrett.Damore@Sun.COM ac_clr(ac, CMI_MULTICH_REGISTER, CMR_BSTSEL);
799484Sgarrett.damore@Sun.COM break;
809484Sgarrett.damore@Sun.COM case 0x2:
819484Sgarrett.damore@Sun.COM /* 20dB */
8210413SGarrett.Damore@Sun.COM ac_set(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
8310413SGarrett.Damore@Sun.COM ac_clr(ac, CMI_MULTICH_REGISTER, CMR_BSTSEL);
849484Sgarrett.damore@Sun.COM break;
859484Sgarrett.damore@Sun.COM case 0x4:
869484Sgarrett.damore@Sun.COM /* 30dB */
8710413SGarrett.Damore@Sun.COM ac_set(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
8810413SGarrett.Damore@Sun.COM ac_set(ac, CMI_MULTICH_REGISTER, CMR_BSTSEL);
899484Sgarrett.damore@Sun.COM break;
909484Sgarrett.damore@Sun.COM }
919484Sgarrett.damore@Sun.COM }
929484Sgarrett.damore@Sun.COM
939484Sgarrett.damore@Sun.COM static void
cmi_set_linein_func(ac97_ctrl_t * actrl,uint64_t value)949484Sgarrett.damore@Sun.COM cmi_set_linein_func(ac97_ctrl_t *actrl, uint64_t value)
959484Sgarrett.damore@Sun.COM {
969484Sgarrett.damore@Sun.COM ac97_t *ac = actrl->actrl_ac97;
979484Sgarrett.damore@Sun.COM
9810413SGarrett.Damore@Sun.COM ac_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
999484Sgarrett.damore@Sun.COM if (value & 2) {
10010413SGarrett.Damore@Sun.COM ac_set(ac, CMI_MULTICH_REGISTER, CMR_S2LNI);
1019484Sgarrett.damore@Sun.COM } else {
10210413SGarrett.Damore@Sun.COM ac_clr(ac, CMI_MULTICH_REGISTER, CMR_S2LNI);
1039484Sgarrett.damore@Sun.COM }
1049484Sgarrett.damore@Sun.COM }
1059484Sgarrett.damore@Sun.COM
1069484Sgarrett.damore@Sun.COM static void
cmi_set_mic_func(ac97_ctrl_t * actrl,uint64_t value)1079484Sgarrett.damore@Sun.COM cmi_set_mic_func(ac97_ctrl_t *actrl, uint64_t value)
1089484Sgarrett.damore@Sun.COM {
1099484Sgarrett.damore@Sun.COM ac97_t *ac = actrl->actrl_ac97;
1109484Sgarrett.damore@Sun.COM
11110413SGarrett.Damore@Sun.COM ac_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
1129484Sgarrett.damore@Sun.COM if (value & 2) {
11310413SGarrett.Damore@Sun.COM ac_set(ac, CMI_MULTICH_REGISTER, CMR_CLCTL);
1149484Sgarrett.damore@Sun.COM } else {
11510413SGarrett.Damore@Sun.COM ac_clr(ac, CMI_MULTICH_REGISTER, CMR_CLCTL);
1169484Sgarrett.damore@Sun.COM }
1179484Sgarrett.damore@Sun.COM }
1189484Sgarrett.damore@Sun.COM
1199484Sgarrett.damore@Sun.COM static void
cmi_setup_micboost(ac97_t * ac)1209484Sgarrett.damore@Sun.COM cmi_setup_micboost(ac97_t *ac)
1219484Sgarrett.damore@Sun.COM {
1229484Sgarrett.damore@Sun.COM ac97_ctrl_t *ctrl;
1239484Sgarrett.damore@Sun.COM
1249484Sgarrett.damore@Sun.COM static const char *values[] = {
1259484Sgarrett.damore@Sun.COM AUDIO_VALUE_OFF, /* 0dB */
1269484Sgarrett.damore@Sun.COM AUDIO_VALUE_MEDIUM, /* 20dB */
1279484Sgarrett.damore@Sun.COM AUDIO_VALUE_HIGH, /* 30dB */
1289484Sgarrett.damore@Sun.COM NULL
1299484Sgarrett.damore@Sun.COM };
1309484Sgarrett.damore@Sun.COM ac97_ctrl_probe_t cpt = {
1319484Sgarrett.damore@Sun.COM AUDIO_CTRL_ID_MICBOOST, 1, 0xf, 0xf, AUDIO_CTRL_TYPE_ENUM,
1329484Sgarrett.damore@Sun.COM AC97_FLAGS | AUDIO_CTRL_FLAG_REC, 0, cmi_set_micboost,
1339484Sgarrett.damore@Sun.COM NULL, 0, values };
1349484Sgarrett.damore@Sun.COM
1359484Sgarrett.damore@Sun.COM ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_MICBOOST);
1369484Sgarrett.damore@Sun.COM if (ctrl) {
1379484Sgarrett.damore@Sun.COM if (ctrl->actrl_initval) {
1389484Sgarrett.damore@Sun.COM /* 20dB by default */
1399484Sgarrett.damore@Sun.COM cpt.cp_initval = 1;
1409484Sgarrett.damore@Sun.COM }
1419484Sgarrett.damore@Sun.COM }
1429484Sgarrett.damore@Sun.COM
14310413SGarrett.Damore@Sun.COM ac_add_control(ac, &cpt);
1449484Sgarrett.damore@Sun.COM }
1459484Sgarrett.damore@Sun.COM
1469484Sgarrett.damore@Sun.COM static const char *cmi_linein_funcs[] = {
1479484Sgarrett.damore@Sun.COM AUDIO_PORT_LINEIN,
1489484Sgarrett.damore@Sun.COM AUDIO_PORT_SURROUND,
1499484Sgarrett.damore@Sun.COM NULL
1509484Sgarrett.damore@Sun.COM };
1519484Sgarrett.damore@Sun.COM
1529484Sgarrett.damore@Sun.COM static const char *cmi_mic_funcs[] = {
1539484Sgarrett.damore@Sun.COM AUDIO_PORT_MIC,
1549484Sgarrett.damore@Sun.COM AUDIO_PORT_CENLFE,
1559484Sgarrett.damore@Sun.COM NULL
1569484Sgarrett.damore@Sun.COM };
1579484Sgarrett.damore@Sun.COM
1589484Sgarrett.damore@Sun.COM static void
cmi_setup_jack_funcs(ac97_t * ac)1599484Sgarrett.damore@Sun.COM cmi_setup_jack_funcs(ac97_t *ac)
1609484Sgarrett.damore@Sun.COM {
1619484Sgarrett.damore@Sun.COM ac97_ctrl_probe_t cp;
1629484Sgarrett.damore@Sun.COM int ival;
1639484Sgarrett.damore@Sun.COM
1649484Sgarrett.damore@Sun.COM ac97_ctrl_probe_t linein_cpt = {
1659484Sgarrett.damore@Sun.COM AUDIO_CTRL_ID_JACK1, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM, AC97_FLAGS,
1669484Sgarrett.damore@Sun.COM 0, cmi_set_linein_func, NULL, 0, cmi_linein_funcs
1679484Sgarrett.damore@Sun.COM };
1689484Sgarrett.damore@Sun.COM ac97_ctrl_probe_t mic_cpt = {
1699484Sgarrett.damore@Sun.COM AUDIO_CTRL_ID_JACK2, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM, AC97_FLAGS,
1709484Sgarrett.damore@Sun.COM 0, cmi_set_mic_func, NULL, 0, cmi_mic_funcs
1719484Sgarrett.damore@Sun.COM };
1729484Sgarrett.damore@Sun.COM
1739484Sgarrett.damore@Sun.COM bcopy(&linein_cpt, &cp, sizeof (cp));
17410413SGarrett.Damore@Sun.COM ival = ac_get_prop(ac, AC97_PROP_LINEIN_FUNC, 0);
1759484Sgarrett.damore@Sun.COM if ((ival >= 1) && (ival <= 2)) {
1769484Sgarrett.damore@Sun.COM cp.cp_initval = ival;
1779484Sgarrett.damore@Sun.COM }
17810413SGarrett.Damore@Sun.COM ac_add_control(ac, &cp);
1799484Sgarrett.damore@Sun.COM
1809484Sgarrett.damore@Sun.COM bcopy(&mic_cpt, &cp, sizeof (cp));
18110413SGarrett.Damore@Sun.COM ival = ac_get_prop(ac, AC97_PROP_MIC_FUNC, 0);
1829484Sgarrett.damore@Sun.COM if ((ival >= 1) && (ival <= 2)) {
1839484Sgarrett.damore@Sun.COM cp.cp_initval = ival;
1849484Sgarrett.damore@Sun.COM }
18510413SGarrett.Damore@Sun.COM ac_add_control(ac, &cp);
1869484Sgarrett.damore@Sun.COM }
1879484Sgarrett.damore@Sun.COM
1889484Sgarrett.damore@Sun.COM static void
cmi_set_linein_func_9738(ac97_ctrl_t * actrl,uint64_t value)1899484Sgarrett.damore@Sun.COM cmi_set_linein_func_9738(ac97_ctrl_t *actrl, uint64_t value)
1909484Sgarrett.damore@Sun.COM {
1919484Sgarrett.damore@Sun.COM ac97_t *ac = actrl->actrl_ac97;
1929484Sgarrett.damore@Sun.COM
1939484Sgarrett.damore@Sun.COM if (value & 2) {
19410413SGarrett.Damore@Sun.COM ac_set(ac, CMI_TASK_REGISTER, CTR_S2LNI);
1959484Sgarrett.damore@Sun.COM } else {
19610413SGarrett.Damore@Sun.COM ac_clr(ac, CMI_TASK_REGISTER, CTR_S2LNI);
1979484Sgarrett.damore@Sun.COM }
1989484Sgarrett.damore@Sun.COM }
1999484Sgarrett.damore@Sun.COM
2009484Sgarrett.damore@Sun.COM static void
cmi_set_spread_9738(ac97_ctrl_t * actrl,uint64_t value)2019484Sgarrett.damore@Sun.COM cmi_set_spread_9738(ac97_ctrl_t *actrl, uint64_t value)
2029484Sgarrett.damore@Sun.COM {
2039484Sgarrett.damore@Sun.COM ac97_t *ac = actrl->actrl_ac97;
2049484Sgarrett.damore@Sun.COM
2059484Sgarrett.damore@Sun.COM if (value) {
20610413SGarrett.Damore@Sun.COM ac_set(ac, CMI_TASK_REGISTER, CTR_F2R);
2079484Sgarrett.damore@Sun.COM } else {
20810413SGarrett.Damore@Sun.COM ac_clr(ac, CMI_TASK_REGISTER, CTR_F2R);
2099484Sgarrett.damore@Sun.COM }
2109484Sgarrett.damore@Sun.COM }
2119484Sgarrett.damore@Sun.COM
2129484Sgarrett.damore@Sun.COM static void
cmi_setup_jack_func_9738(ac97_t * ac)2139484Sgarrett.damore@Sun.COM cmi_setup_jack_func_9738(ac97_t *ac)
2149484Sgarrett.damore@Sun.COM {
2159484Sgarrett.damore@Sun.COM ac97_ctrl_probe_t cp;
2169484Sgarrett.damore@Sun.COM int ival;
2179484Sgarrett.damore@Sun.COM
2189484Sgarrett.damore@Sun.COM ac97_ctrl_probe_t linein_cpt = {
2199484Sgarrett.damore@Sun.COM AUDIO_CTRL_ID_JACK1, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM, AC97_FLAGS,
2209484Sgarrett.damore@Sun.COM 0, cmi_set_linein_func_9738, NULL, 0, cmi_linein_funcs
2219484Sgarrett.damore@Sun.COM };
2229484Sgarrett.damore@Sun.COM ac97_ctrl_probe_t spread_cpt = {
2239484Sgarrett.damore@Sun.COM AUDIO_CTRL_ID_SPREAD, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
2249484Sgarrett.damore@Sun.COM AC97_FLAGS, 0, cmi_set_spread_9738,
2259484Sgarrett.damore@Sun.COM };
2269484Sgarrett.damore@Sun.COM
2279484Sgarrett.damore@Sun.COM bcopy(&linein_cpt, &cp, sizeof (cp));
22810413SGarrett.Damore@Sun.COM ival = ac_get_prop(ac, AC97_PROP_LINEIN_FUNC, 0);
2299484Sgarrett.damore@Sun.COM if ((ival >= 1) && (ival <= 2)) {
2309484Sgarrett.damore@Sun.COM cp.cp_initval = ival;
2319484Sgarrett.damore@Sun.COM }
23210413SGarrett.Damore@Sun.COM ac_add_control(ac, &cp);
2339484Sgarrett.damore@Sun.COM
2349484Sgarrett.damore@Sun.COM bcopy(&spread_cpt, &cp, sizeof (cp));
23510413SGarrett.Damore@Sun.COM ival = ac_get_prop(ac, AC97_PROP_SPREAD, -1);
2369484Sgarrett.damore@Sun.COM if ((ival >= 0) && (ival <= 1)) {
2379484Sgarrett.damore@Sun.COM cp.cp_initval = ival;
2389484Sgarrett.damore@Sun.COM }
23910413SGarrett.Damore@Sun.COM ac_add_control(ac, &cp);
2409484Sgarrett.damore@Sun.COM }
2419484Sgarrett.damore@Sun.COM
2429484Sgarrett.damore@Sun.COM
2439484Sgarrett.damore@Sun.COM static void
cmi_setup_volume(ac97_t * ac)2449484Sgarrett.damore@Sun.COM cmi_setup_volume(ac97_t *ac)
2459484Sgarrett.damore@Sun.COM {
2469484Sgarrett.damore@Sun.COM ac97_ctrl_t *ctrl;
2479484Sgarrett.damore@Sun.COM
2489484Sgarrett.damore@Sun.COM /*
2499484Sgarrett.damore@Sun.COM * These CMI parts seem to be really weird. They don't have
2509484Sgarrett.damore@Sun.COM * *any* functioning volume controls on them (mute only) apart
2519484Sgarrett.damore@Sun.COM * from the record and monitor sources (excluding PCM). I
2529484Sgarrett.damore@Sun.COM * don't understand why not. We just eliminate all of the
2539484Sgarrett.damore@Sun.COM * volume controls and replace with a soft volume control.
2549484Sgarrett.damore@Sun.COM * Its not an ideal situation, but I don't know what else I
2559484Sgarrett.damore@Sun.COM * can do about it.
2569484Sgarrett.damore@Sun.COM */
2579484Sgarrett.damore@Sun.COM ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_VOLUME);
2589484Sgarrett.damore@Sun.COM if (ctrl) {
25910413SGarrett.Damore@Sun.COM ac97_control_remove(ctrl);
2609484Sgarrett.damore@Sun.COM }
2619484Sgarrett.damore@Sun.COM ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_FRONT);
2629484Sgarrett.damore@Sun.COM if (ctrl) {
26310413SGarrett.Damore@Sun.COM ac97_control_remove(ctrl);
2649484Sgarrett.damore@Sun.COM }
2659484Sgarrett.damore@Sun.COM ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_SURROUND);
2669484Sgarrett.damore@Sun.COM if (ctrl) {
26710413SGarrett.Damore@Sun.COM ac97_control_remove(ctrl);
2689484Sgarrett.damore@Sun.COM }
2699484Sgarrett.damore@Sun.COM ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_CENTER);
2709484Sgarrett.damore@Sun.COM if (ctrl) {
27110413SGarrett.Damore@Sun.COM ac97_control_remove(ctrl);
2729484Sgarrett.damore@Sun.COM }
2739484Sgarrett.damore@Sun.COM ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_LFE);
2749484Sgarrett.damore@Sun.COM if (ctrl) {
27510413SGarrett.Damore@Sun.COM ac97_control_remove(ctrl);
2769484Sgarrett.damore@Sun.COM }
2779484Sgarrett.damore@Sun.COM
2789484Sgarrett.damore@Sun.COM /* make sure we have disabled mute and attenuation on physical ctrls */
27910413SGarrett.Damore@Sun.COM ac_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
28010413SGarrett.Damore@Sun.COM ac_wr(ac, AC97_PCM_OUT_VOLUME_REGISTER, 0);
28110413SGarrett.Damore@Sun.COM ac_wr(ac, AC97_MASTER_VOLUME_REGISTER, 0);
28210413SGarrett.Damore@Sun.COM ac_wr(ac, AC97_EXTENDED_C_LFE_VOLUME_REGISTER, 0);
28310413SGarrett.Damore@Sun.COM ac_wr(ac, AC97_EXTENDED_LRS_VOLUME_REGISTER, 0);
2849484Sgarrett.damore@Sun.COM
28510413SGarrett.Damore@Sun.COM /*
28610413SGarrett.Damore@Sun.COM * NB: This is probably not the best way to do this, because
28710413SGarrett.Damore@Sun.COM * it will make overriding this hard for drivers that desire
28810413SGarrett.Damore@Sun.COM * to. Fortunately, we don't think any drivers that want to
28910413SGarrett.Damore@Sun.COM * override or fine tune AC'97 controls (i.e. creative cards)
29010413SGarrett.Damore@Sun.COM * use these C-Media codecs.
29110413SGarrett.Damore@Sun.COM */
292*12165Sgdamore@opensolaris.org audio_dev_add_soft_volume(ac_get_dev(ac));
2939484Sgarrett.damore@Sun.COM }
2949484Sgarrett.damore@Sun.COM
2959484Sgarrett.damore@Sun.COM void
cmi9739_init(ac97_t * ac)2969484Sgarrett.damore@Sun.COM cmi9739_init(ac97_t *ac)
2979484Sgarrett.damore@Sun.COM {
2989484Sgarrett.damore@Sun.COM cmi_setup_volume(ac);
2999484Sgarrett.damore@Sun.COM cmi_setup_micboost(ac);
3009484Sgarrett.damore@Sun.COM cmi_setup_jack_funcs(ac);
3019484Sgarrett.damore@Sun.COM }
3029484Sgarrett.damore@Sun.COM
3039484Sgarrett.damore@Sun.COM void
cmi9761_init(ac97_t * ac)3049484Sgarrett.damore@Sun.COM cmi9761_init(ac97_t *ac)
3059484Sgarrett.damore@Sun.COM {
3069484Sgarrett.damore@Sun.COM cmi_setup_volume(ac);
3079484Sgarrett.damore@Sun.COM cmi_setup_micboost(ac);
3089484Sgarrett.damore@Sun.COM cmi_setup_jack_funcs(ac);
3099484Sgarrett.damore@Sun.COM }
3109484Sgarrett.damore@Sun.COM
3119484Sgarrett.damore@Sun.COM void
cmi9738_init(ac97_t * ac)3129484Sgarrett.damore@Sun.COM cmi9738_init(ac97_t *ac)
3139484Sgarrett.damore@Sun.COM {
3149484Sgarrett.damore@Sun.COM cmi_setup_volume(ac);
3159484Sgarrett.damore@Sun.COM cmi_setup_jack_func_9738(ac);
3169484Sgarrett.damore@Sun.COM }
317