ac97.c revision 9484:fbd5ddc28e96
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright (C) 4Front Technologies 1996-2008.
23 *
24 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
25 * Use is subject to license terms.
26 */
27
28#include <sys/types.h>
29#include <sys/list.h>
30#include <sys/sysmacros.h>
31#include <sys/ddi.h>
32#include <sys/sunddi.h>
33#include <sys/audio/audio_driver.h>
34#include <sys/audio/ac97.h>
35#include <sys/note.h>
36#include "ac97_impl.h"
37
38/*
39 * This is the initial value for many controls. This is
40 * a 75% level.
41 */
42#define	INIT_VAL_MAIN	((75 << 8) | 75)
43#define	INIT_VAL_ST	((75 << 8) | 75)
44#define	INIT_VAL_MN	75
45#define	INIT_IGAIN_ST	((50 << 8) | 50)
46#define	INIT_IGAIN_MN	50
47
48/*
49 * In AC'97 v2.3, the registers are carved up as follows:
50 *
51 * Audio Base Registers: 	0x00 - 0x26
52 * Audio Extended Registers:	0x28 - 0x3A
53 * Modem Extended Registers:	0x3C - 0x58
54 * Vendor Reserved Registers:	0x5A - 0x5F
55 * Page Registers:		0x60 - 0x6F
56 * Vendor Reserved Registers:	0x70 - 0x7A
57 * Vendor ID Registers:		0x7C - 0x7F
58 *
59 * We only need to shadow the normal audio registers by default.
60 * TBD: Handling of codec-specific registers in vendor reserved space.
61 * We cannot necessarily meaningfully shadow them.
62 */
63#define	LAST_SHADOW_REG	0x3A
64#define	NUM_SHADOW	((LAST_SHADOW_REG / sizeof (uint16_t)) + 1)
65#define	SHADOW(ac, reg)	((ac)->shadow[((reg) / sizeof (uint16_t))])
66
67/*
68 * Record source selection.
69 */
70#define	INPUT_MIC		0
71#define	INPUT_CD		1
72#define	INPUT_VIDEO		2
73#define	INPUT_AUXIN		3
74#define	INPUT_LINEIN		4
75#define	INPUT_STEREOMIX		5
76#define	INPUT_MONOMIX		6
77#define	INPUT_PHONE		7
78
79static const char *ac97_insrcs[] = {
80	AUDIO_PORT_MIC,
81	AUDIO_PORT_CD,
82	AUDIO_PORT_VIDEO,
83	AUDIO_PORT_AUX1IN,
84	AUDIO_PORT_LINEIN,
85	AUDIO_PORT_STEREOMIX,
86	AUDIO_PORT_MONOMIX,
87	AUDIO_PORT_PHONE,
88	NULL,
89};
90
91/*
92 * Per audio device state structure
93 */
94struct ac97 {
95	dev_info_t	*dip;	/* DDI device instance */
96	audio_dev_t	*d;
97	void		*private;  /* drivers devc */
98	ac97_rd_t	rd;	/* drivers port read routine */
99	ac97_wr_t	wr;	/* drivers port write routine */
100	char		name[128]; /* driver instance name */
101
102	uint16_t	shadow[NUM_SHADOW];
103
104	boolean_t	suspended;		/* true if suspended */
105	kt_did_t	resumer;		/* resumer if suspended */
106	uint32_t	flags;
107#define	AC97_FLAG_AMPLIFIER	(1 << 0)	/* ext. amp on by default */
108#define	AC97_FLAG_MICBOOST	(1 << 1)	/* micboost on by default */
109#define	AC97_FLAG_SPEAKER	(1 << 2)	/* mono out on by default */
110
111#define	AC97_FLAG_AUX_HP	(1 << 4)	/* possible uses for AUX_OUT */
112#define	AC97_FLAG_AUX_4CH	(1 << 5)
113#define	AC97_FLAG_AUX_LVL	(1 << 6)
114#define	AC97_FLAG_SPEAKER_OK	(1 << 7)	/* expose mono out */
115#define	AC97_FLAG_NO_HEADPHONE	(1 << 8)	/* do not expose headphone */
116#define	AC97_FLAG_NO_CDROM	(1 << 9)	/* do not expose CDROM */
117#define	AC97_FLAG_NO_PHONE	(1 << 10)	/* do not expose phone in */
118#define	AC97_FLAG_NO_VIDEO	(1 << 11)	/* do not expose video in */
119#define	AC97_FLAG_NO_AUXIN	(1 << 12)	/* do not expose aux in */
120#define	AC97_FLAG_NO_AUXOUT	(1 << 13)	/* do not expose aux out */
121#define	AC97_FLAG_NO_LINEIN	(1 << 14)	/* do not expose linein */
122#define	AC97_FLAG_NO_MIC	(1 << 15)	/* do not expose mic */
123
124	uint32_t	vid;			/* Vendor ID for CODEC */
125	uint16_t	caps;
126
127	void		(*codec_init)(ac97_t *);
128	void		(*codec_reset)(ac97_t *);
129
130	kmutex_t	ac_lock;
131	list_t		ctrls;
132
133	uint64_t	inputs;
134};
135
136struct modlmisc ac97_modlmisc = {
137	&mod_miscops,
138	"Audio Codec '97 Support"
139};
140
141struct modlinkage ac97_modlinkage = {
142	MODREV_1,
143	{ &ac97_modlmisc, NULL }
144};
145
146int
147_init(void)
148{
149	return (mod_install(&ac97_modlinkage));
150}
151
152int
153_fini(void)
154{
155	return (mod_install(&ac97_modlinkage));
156}
157
158int
159_info(struct modinfo *modinfop)
160{
161	return (mod_info(&ac97_modlinkage, modinfop));
162}
163
164
165#if 0
166/*
167 * The following table, and the code to scale it, works in percentages.
168 * This may be convenient for humans, but it would be faster if the table
169 * entries were rescaled to 256.  (Division by 100 is painful.  Divison by
170 * 256 is trivial.)
171 */
172static const char ac97_val_cvt[101] = {
173	0, 0, 3, 7, 10, 13, 16, 19,
174	21, 23, 26, 28, 30, 32, 34, 35,
175	37, 39, 40, 42,	43, 45, 46, 47,
176	49, 50, 51, 52, 53, 55, 56, 57,
177	58, 59, 60, 61, 62, 63, 64, 65,
178	65, 66, 67, 68, 69, 70, 70, 71,
179	72, 73, 73, 74, 75, 75, 76, 77,
180	77, 78, 79, 79, 80, 81, 81, 82,
181	82, 83, 84, 84, 85, 85, 86, 86,
182	87, 87, 88, 88, 89, 89, 90, 90,
183	91, 91, 92, 92, 93, 93, 94, 94,
184	95, 95, 96, 96, 96, 97, 97, 98,
185	98, 98, 99, 99, 100
186};
187#endif
188
189/*
190 * This code has three main functions. All related to converting
191 * a standard controls value to hardware specific values. All
192 * Standard passed in values are 0-100 as in percent.
193 *
194 * First it takes a value passed in as volume or gain and
195 * converts to attenuation or gain correspondingly. Since this is
196 * what the hardware needs.
197 *
198 * Second it adjusts the value passed in to compensate for the none
199 * linear nature of human hearing, sound loudness, sensitivity. It
200 * converts the linear value to a logarithmic value. This gives users
201 * the perception that the controls are linear.
202 *
203 * Third it converts the value to the number of bits that a hardware
204 * register needs to be.
205 *
206 * On input the following are supplied:
207 * left           - The gain or volume in percent for left channel.
208 * right          - The gain or volume in percent for right channel.
209 * bits           - The number of bits the hardware needs. If this value
210 *                  is negetive then right and left are gain else they
211 *                  are volume.
212 *
213 * On return the following is returned:
214 *
215 * bit: 15             8 7             0
216 *     ----------------------------------
217 *     | left channel   | right channel |
218 *     ----------------------------------
219 *      ( each channel is "bits" wide )
220 */
221uint16_t
222ac97_val_scale(int left, int right, int bits)
223{
224	ASSERT(left <= 100);
225	ASSERT(right <= 100);
226
227	if (bits < 0) {		/* This is gain not ATTN */
228		left = 100 - left;
229		right = 100 - right;
230		bits = -bits;
231	}
232
233#if 0
234	/*
235	 * 4Front's code used a table to smooth the transitions
236	 * somewhat.  Without this change, the volume levels adjusted
237	 * near the top of the table seem to have less effect.  Its
238	 * hard to notice a volume change from 100 to 95, without the
239	 * val_cvt table, for example.  However, the scaling has an
240	 * ugly side effect, which is at the default volumes (75%), we
241	 * wind up having the level set too high for some
242	 * codec/amplifier combinations.
243	 *
244	 * Legacy Sun code didn't have this table, and some
245	 * qualitative testing shows that it isn't really necessary.
246	 */
247	left = 100 - ac97_val_cvt[left];
248	right = 100 - ac97_val_cvt[right];
249#else
250	left = 100 - left;
251	right = 100 - right;
252#endif
253	return (((left * ((1 << bits) - 1) / 100) << 8) |
254	    (right * ((1 << bits) - 1) / 100));
255}
256
257uint16_t
258ac97_mono_scale(int val, int bits)
259{
260	ASSERT(val <= 100);
261
262	if (bits < 0) {		/* This is gain not ATTN */
263		bits = -bits;
264	} else {
265		val = 100 - val;	/* convert to attenuation */
266	}
267	return (val * ((1 << bits) - 1) / 100);
268}
269
270
271audio_dev_t *
272ac97_get_dev(ac97_t *ac)
273{
274	return (ac->d);
275}
276
277int
278ac97_get_prop(ac97_t *ac, char *prop, int defval)
279{
280	int	rv;
281
282	rv = ddi_prop_get_int(DDI_DEV_T_ANY, ac->dip, DDI_PROP_DONTPASS,
283	    prop, defval);
284	return (rv);
285}
286
287/*
288 * This calls the Hardware drivers access write routine
289 * to write to a device register.
290 */
291#define	WR(r, v)	(ac)->wr((ac)->private, (r), (v))
292#define	RD(r)		(ac)->rd((ac)->private, (r))
293
294/*
295 * Probe routines for optional controls
296 *
297 * These routines each probe one aspect of hardware
298 * for controls presents.
299 * If the control is present these routines should
300 * return none zero.
301 */
302
303/*
304 * Is the named register implemented?  This routine saves and
305 * restores the original value, and relies on the fact that the
306 * registers (if implemented) will have at least one bit that acts
307 * as a mute (0x8000, 0x8080), so we can probe "silently".
308 *
309 * The probe logic is suggested by the AC'97 2.3 spec.  (Unimplemented
310 * registers are required to return zero to facilitate this sort of
311 * detection.)
312 */
313static int
314ac97_probe_reg(ac97_t *ac, uint8_t reg)
315{
316	uint16_t	val;
317	int		rv = 0;
318
319	/* get the original value */
320	val = RD(reg);
321	WR(reg, 0xffff);
322	if (RD(reg) != 0) {
323		rv = 1;
324	}
325	/* restore the original value */
326	WR(reg, val);
327	return (rv);
328}
329
330/*
331 * Does this device have bass/treble controls?
332 */
333static int
334ac97_probe_tone(ac97_t *ac)
335{
336	/* Bass/Treble contols  present */
337	if (ac->caps & RR_BASS_TREBLE)
338		return (1);
339	else
340		return (0);
341}
342
343/*
344 * If there is a loudness switch?
345 */
346static int
347ac97_probe_loud(ac97_t *ac)
348{
349	/* loudness contol present */
350	if (ac->caps & RR_LOUDNESS_SUPPORT)
351		return (1);
352	else
353		return (0);
354}
355
356/*
357 * Does this device have a mono-mic input volume control?
358 */
359static int
360ac97_probe_mmic(ac97_t *ac)
361{
362	/* mono mic present */
363	if (ac->caps & RR_DEDICATED_MIC)
364		return (1);
365	else
366		return (0);
367}
368
369/*
370 * Does this device have a simulated stereo switch?
371 */
372static int
373ac97_probe_stsim(ac97_t *ac)
374{
375	/* simulated stereocontol present */
376	if (ac->caps & RR_PSEUDO_STEREO)
377		return (1);
378	else
379		return (0);
380}
381
382/*
383 * Does this device have a PC beeper input volume control?
384 */
385static int
386ac97_probe_pcbeep(ac97_t *ac)
387{
388	return (ac97_probe_reg(ac, AC97_PC_BEEP_REGISTER));
389}
390
391/*
392 * Does this device have AUX output port volume control?
393 */
394static int
395ac97_probe_rear(ac97_t *ac)
396{
397	if (ac->flags & AC97_FLAG_AUX_4CH)
398		return (1);
399	else
400		return (0);
401
402}
403
404/*
405 * Does this device have a mic?
406 */
407static int
408ac97_probe_mic(ac97_t *ac)
409{
410	if ((!(ac->flags & AC97_FLAG_NO_MIC)) &&
411	    (ac97_probe_reg(ac, AC97_MIC_VOLUME_REGISTER))) {
412		ac->inputs |= (1U << INPUT_MIC);
413		return (1);
414	}
415	return (0);
416}
417
418/*
419 * If this device has an AUX output port is it used for headphones?
420 */
421static int
422ac97_probe_headphone(ac97_t *ac)
423{
424	/* headphone control present */
425	if ((ac->flags & AC97_FLAG_AUX_HP) &&
426	    !(ac->flags & AC97_FLAG_NO_HEADPHONE)) {
427		return (1);
428	}
429	return (0);
430}
431
432/*
433 * Does this device have AUX output port volume control?
434 */
435static int
436ac97_probe_auxout(ac97_t *ac)
437{
438	/* ALT PCM control present */
439	if ((ac->flags & AC97_FLAG_AUX_LVL) &&
440	    !(ac->flags & AC97_FLAG_NO_AUXOUT)) {
441		return (1);
442	}
443	return (0);
444}
445
446/*
447 * Does this device have an AUX input port volume control?
448 */
449static int
450ac97_probe_auxin(ac97_t *ac)
451{
452	if ((!(ac->flags & AC97_FLAG_NO_AUXIN)) &&
453	    (ac97_probe_reg(ac, AC97_AUX_VOLUME_REGISTER))) {
454		ac->inputs |= (1U << INPUT_AUXIN);
455		return (1);
456	}
457	return (0);
458}
459
460/*
461 * Does this device have a phone input port with a volume control?
462 */
463static int
464ac97_probe_phone(ac97_t *ac)
465{
466	if ((!(ac->flags & AC97_FLAG_NO_PHONE)) &&
467	    (ac97_probe_reg(ac, AC97_PHONE_VOLUME_REGISTER))) {
468		ac->inputs |= (1U << INPUT_PHONE);
469		return (1);
470	}
471	return (0);
472}
473
474/*
475 * Does this device have a mono output port with volume control?
476 */
477static int
478ac97_probe_mono(ac97_t *ac)
479{
480	if (!(ac->flags & AC97_FLAG_SPEAKER_OK)) {
481		return (0);
482	}
483	if (ac97_probe_reg(ac, AC97_MONO_MASTER_VOLUME_REGISTER)) {
484		return (1);
485	}
486	return (0);
487}
488
489/*
490 * Does this device have a line input port with volume control?
491 */
492static int
493ac97_probe_linein(ac97_t *ac)
494{
495	if ((!(ac->flags & AC97_FLAG_NO_LINEIN)) &&
496	    (ac97_probe_reg(ac, AC97_LINE_IN_VOLUME_REGISTER))) {
497		ac->inputs |= (1U << INPUT_LINEIN);
498		return (1);
499	}
500	return (0);
501}
502
503/*
504 * Does this device have a cdrom input port with volume control?
505 */
506static int
507ac97_probe_cdrom(ac97_t *ac)
508{
509	if ((!(ac->flags & AC97_FLAG_NO_CDROM)) &&
510	    (ac97_probe_reg(ac, AC97_CD_VOLUME_REGISTER))) {
511		ac->inputs |= (1U << INPUT_CD);
512		return (1);
513	}
514	return (0);
515}
516
517/*
518 * Does this device have a video input port with volume control?
519 */
520static int
521ac97_probe_video(ac97_t *ac)
522{
523	if ((!(ac->flags & AC97_FLAG_NO_VIDEO)) &&
524	    (ac97_probe_reg(ac, AC97_VIDEO_VOLUME_REGISTER))) {
525		ac->inputs |= (1U << INPUT_VIDEO);
526		return (1);
527	}
528	return (0);
529}
530
531/*
532 * Does this device have a 3D sound enhancement?
533 */
534static int
535ac97_probe_3d(ac97_t *ac)
536{
537	/* 3D control present */
538	if (ac->caps & RR_3D_STEREO_ENHANCE_MASK)
539		return (1);
540	else
541		return (0);
542}
543
544static int
545ac97_probe_3d_impl(ac97_t *ac, uint16_t mask)
546{
547	int	rv = 0;
548	uint16_t val;
549
550	if ((ac->caps & RR_3D_STEREO_ENHANCE_MASK) == 0)
551		return (0);
552
553	/* get the original value */
554	val = RD(AC97_THREE_D_CONTROL_REGISTER);
555	WR(AC97_THREE_D_CONTROL_REGISTER, mask);
556	if ((RD(AC97_THREE_D_CONTROL_REGISTER) & mask) != 0) {
557		rv = 1;
558	}
559	/* restore the original value */
560	WR(AC97_THREE_D_CONTROL_REGISTER, val);
561	return (rv);
562}
563
564static int
565ac97_probe_3d_depth(ac97_t *ac)
566{
567	return (ac97_probe_3d_impl(ac, TDCR_DEPTH_MASK));
568}
569
570static int
571ac97_probe_3d_center(ac97_t *ac)
572{
573	return (ac97_probe_3d_impl(ac, TDCR_CENTER_MASK));
574}
575
576/*
577 * Does this device have a center output port with volume control?
578 */
579static int
580ac97_probe_center(ac97_t *ac)
581{
582	uint16_t val;
583
584	val = RD(AC97_EXTENDED_AUDIO_REGISTER);
585
586	/* center volume present */
587	if (val & EAR_CDAC)
588		return (1);
589	else
590		return (0);
591}
592
593/*
594 * Does this device have a LFE (Sub-woofer) output port with
595 * a volume control?
596 */
597static int
598ac97_probe_lfe(ac97_t *ac)
599{
600	uint16_t val;
601
602	val = RD(AC97_EXTENDED_AUDIO_REGISTER);
603
604	/* We have LFE control */
605	if (val & EAR_LDAC)
606		return (1);
607	else
608		return (0);
609
610}
611
612/*
613 * Are we a multichannel codec?
614 */
615static int
616ac97_probe_front(ac97_t *ac)
617{
618	uint16_t val;
619
620	val = RD(AC97_EXTENDED_AUDIO_REGISTER);
621
622	/* Are any of the Surround, Center, or LFE dacs present? */
623	if (val & (EAR_SDAC | EAR_CDAC | EAR_LDAC))
624		return (1);
625	else
626		return (0);
627}
628
629static int
630ac97_probe_lineout(ac97_t *ac)
631{
632	/* if not multichannel, then use "lineout" instead of "front" label */
633	return (!ac97_probe_front(ac));
634}
635
636static const char *ac97_mics[] = {
637	AUDIO_PORT_MIC1,
638	AUDIO_PORT_MIC2,
639	NULL,
640};
641
642static const char *ac97_monos[] = {
643	AUDIO_PORT_MONOMIX,
644	AUDIO_PORT_MIC,
645	NULL
646};
647
648/*
649 * This calls the Hardware drivers access write routine
650 * to write to a device register.
651 */
652void
653ac97_wr(ac97_t *ac, uint8_t reg, uint16_t val)
654{
655	if ((reg < LAST_SHADOW_REG) && (reg > 0)) {
656		SHADOW(ac, reg) = val;
657	}
658
659	/*
660	 * Don't touch hardware _unless_ if we are suspended, unless we
661	 * are in the process of resuming.
662	 */
663	if ((!ac->suspended) || (ac->resumer == ddi_get_kt_did())) {
664		ac->wr(ac->private, reg, val);
665	}
666}
667
668/*
669 * This obtains the shadowed value of a register.  If the register is
670 * out of range, zero is returned.
671 *
672 * To read a hardware register, use the RD() macro above.
673 */
674uint16_t
675ac97_rd(ac97_t *ac, uint8_t reg)
676{
677	if ((reg < LAST_SHADOW_REG) && (reg > 0)) {
678		return (SHADOW(ac, reg));
679	}
680	if ((!ac->suspended) || (ac->resumer == ddi_get_kt_did())) {
681		return (ac->rd(ac->private, reg));
682	}
683	return (0);
684}
685
686/*
687 * This calls the hardware driver's access read/write routine
688 * to set bits in a device register.
689 */
690void
691ac97_set(ac97_t *ac, uint8_t reg, uint16_t val)
692{
693	ac97_wr(ac, reg, ac->rd(ac->private, reg) | val);
694}
695
696/*
697 * This calls the hardware driver's access read/write routine
698 * to clear bits in a device register.
699 */
700void
701ac97_clr(ac97_t *ac, uint8_t reg, uint16_t val)
702{
703	ac97_wr(ac, reg, ac->rd(ac->private, reg) & ~val);
704}
705
706/*
707 * Look for a control attached to this device based
708 * on its control number.
709 *
710 * If this control number is found the per controls state
711 * structure is returned.
712 */
713ac97_ctrl_t *
714ac97_control_find(ac97_t *ac, const char *name)
715{
716	ac97_ctrl_t *ctrl;
717	list_t *l = &ac->ctrls;
718
719	/* Validate that ctrlnum is real and usable */
720	mutex_enter(&ac->ac_lock);
721	for (ctrl = list_head(l); ctrl; ctrl = list_next(l, ctrl)) {
722		if (strcmp(ctrl->actrl_name, name) == 0) {
723			mutex_exit(&ac->ac_lock);
724			return (ctrl);
725		}
726	}
727	mutex_exit(&ac->ac_lock);
728	return (NULL);
729}
730
731/*
732 * This will update all the codec registers from the shadow table.
733 */
734static void
735ac97_restore(ac97_t *ac)
736{
737	/*
738	 * If we are restoring previous settings, just reload from the
739	 * shadowed settings.
740	 */
741	for (int i = 2; i < LAST_SHADOW_REG; i += sizeof (uint16_t)) {
742		ac->wr(ac->private, i, SHADOW(ac, i));
743	}
744
745	/*
746	 * Then go and do the controls.  This is important because some of
747	 * the controls might use registers that aren't shadowed.  Doing it
748	 * a second time also may help guarantee that it all works.
749	 */
750	for (ac97_ctrl_t *ctrl = list_head(&ac->ctrls); ctrl;
751	    ctrl = list_next(&ac->ctrls, ctrl)) {
752		ctrl->actrl_write_fn(ctrl, ctrl->actrl_value);
753	}
754}
755
756/*
757 * This will update all the hardware controls to the initial values at
758 * start of day.
759 */
760static void
761ac97_init_values(ac97_t *ac)
762{
763	ac97_ctrl_t	*ctrl;
764
765	mutex_enter(&ac->ac_lock);
766	for (ctrl = list_head(&ac->ctrls); ctrl;
767	    ctrl = list_next(&ac->ctrls, ctrl)) {
768		ctrl->actrl_value = ctrl->actrl_initval;
769		ctrl->actrl_write_fn(ctrl, ctrl->actrl_initval);
770	}
771	mutex_exit(&ac->ac_lock);
772}
773
774/*
775 * Select the input source for recording. This is the set routine
776 * for the control AUDIO_CONTROL_INPUTS.
777 */
778static void
779ac97_insrc_set(ac97_ctrl_t *ctrl, uint64_t value)
780{
781	ac97_t		*ac = ctrl->actrl_ac97;
782	uint16_t	set_val;
783
784	set_val = ddi_ffs(value & 0xffff);
785	if ((set_val > 0) && (set_val <= 8)) {
786		set_val--;
787		ac97_wr(ac, AC97_RECORD_SELECT_CTRL_REGISTER,
788		    set_val | (set_val << 8));
789	}
790}
791
792static void
793ac97_gpr_toggle(ac97_ctrl_t *ctrl, int bit, uint64_t onoff)
794{
795	ac97_t			*ac = ctrl->actrl_ac97;
796	uint16_t		v;
797
798	v = SHADOW(ac, AC97_GENERAL_PURPOSE_REGISTER);
799	if (onoff) {
800		v |= bit;
801	} else {
802		v &= ~bit;
803	}
804	ac97_wr(ac, AC97_GENERAL_PURPOSE_REGISTER, v);
805}
806
807static void
808ac97_3donoff_set(ac97_ctrl_t *ctrl, uint64_t value)
809{
810	ac97_gpr_toggle(ctrl, GPR_3D_STEREO_ENHANCE, value);
811}
812
813static void
814ac97_loudness_set(ac97_ctrl_t *ctrl, uint64_t value)
815{
816	ac97_gpr_toggle(ctrl, GPR_BASS_BOOST, value);
817}
818
819static void
820ac97_loopback_set(ac97_ctrl_t *ctrl, uint64_t value)
821{
822	ac97_gpr_toggle(ctrl, GPR_LPBK, value);
823}
824
825/*
826 * This will set simulated stereo control to on or off.
827 */
828static void
829ac97_stsim_set(ac97_ctrl_t *ctrl, uint64_t value)
830{
831	ac97_gpr_toggle(ctrl, GPR_ST, value);
832}
833
834/*
835 * This will set mic select control to mic1=0 or mic2=1.
836 */
837static void
838ac97_selmic_set(ac97_ctrl_t *ctrl, uint64_t value)
839{
840	ac97_gpr_toggle(ctrl, GPR_MS_MIC2, value & 2);
841}
842
843/*
844 * This will set mono source select control to mix=0 or mic=1.
845 */
846static void
847ac97_monosrc_set(ac97_ctrl_t *ctrl, uint64_t value)
848{
849	ac97_gpr_toggle(ctrl, GPR_MONO_MIC_IN, value & 2);
850}
851
852static void
853ac97_stereo_set(ac97_ctrl_t *ctrl, uint64_t value, uint8_t reg)
854{
855	ac97_t			*ac = ctrl->actrl_ac97;
856	uint8_t			left, right;
857	uint16_t		mute;
858
859	left = (value >> 8) & 0xff;
860	right = value & 0xff;
861	mute = value ? 0 : ctrl->actrl_muteable;
862
863	ac97_wr(ac, reg, ac97_val_scale(left, right, ctrl->actrl_bits) | mute);
864}
865
866static void
867ac97_mono_set(ac97_ctrl_t *ctrl, uint64_t value, uint8_t reg, int shift)
868{
869	ac97_t			*ac = ctrl->actrl_ac97;
870	uint8_t			val;
871	uint16_t		mute, v;
872	uint16_t		mask;
873
874	val = value & 0xff;
875	mute = val ? 0 : ctrl->actrl_muteable;
876
877	mask = ctrl->actrl_muteable |
878	    (((1 << ABS(ctrl->actrl_bits)) - 1) << shift);
879
880	v = SHADOW(ac, reg);
881	v &= ~mask;	/* clear all of our bits, preserve others */
882
883	/* now set the mute bit, and volume bits */
884	v |= mute;
885	v |= (ac97_mono_scale(val, ctrl->actrl_bits) << shift);
886
887	ac97_wr(ac, reg, v);
888}
889
890static void
891ac97_master_set(ac97_ctrl_t *ctrl, uint64_t value)
892{
893	value = value | (value << 8);
894	ac97_stereo_set(ctrl, value, AC97_PCM_OUT_VOLUME_REGISTER);
895}
896
897static void
898ac97_lineout_set(ac97_ctrl_t *ctrl, uint64_t value)
899{
900	ac97_stereo_set(ctrl, value, AC97_MASTER_VOLUME_REGISTER);
901}
902
903static void
904ac97_surround_set(ac97_ctrl_t *ctrl, uint64_t value)
905{
906	ac97_stereo_set(ctrl, value, AC97_EXTENDED_LRS_VOLUME_REGISTER);
907}
908
909static void
910ac97_aux1out_set(ac97_ctrl_t *ctrl, uint64_t value)
911{
912	ac97_stereo_set(ctrl, value, AC97_HEADPHONE_VOLUME_REGISTER);
913}
914
915static void
916ac97_headphone_set(ac97_ctrl_t *ctrl, uint64_t value)
917{
918	ac97_stereo_set(ctrl, value, AC97_HEADPHONE_VOLUME_REGISTER);
919}
920
921static void
922ac97_cd_set(ac97_ctrl_t *ctrl, uint64_t value)
923{
924	ac97_stereo_set(ctrl, value, AC97_CD_VOLUME_REGISTER);
925}
926
927static void
928ac97_video_set(ac97_ctrl_t *ctrl, uint64_t value)
929{
930	ac97_stereo_set(ctrl, value, AC97_VIDEO_VOLUME_REGISTER);
931}
932
933static void
934ac97_auxin_set(ac97_ctrl_t *ctrl, uint64_t value)
935{
936	ac97_stereo_set(ctrl, value, AC97_AUX_VOLUME_REGISTER);
937}
938
939static void
940ac97_linein_set(ac97_ctrl_t *ctrl, uint64_t value)
941{
942	ac97_stereo_set(ctrl, value, AC97_LINE_IN_VOLUME_REGISTER);
943}
944
945/*
946 * This will set mono mic gain control.
947 */
948static void
949ac97_monomic_set(ac97_ctrl_t *ctrl, uint64_t value)
950{
951	ac97_mono_set(ctrl, value, AC97_RECORD_GAIN_MIC_REGISTER, 0);
952}
953
954static void
955ac97_phone_set(ac97_ctrl_t *ctrl, uint64_t value)
956{
957	ac97_mono_set(ctrl, value, AC97_PHONE_VOLUME_REGISTER, 0);
958}
959
960static void
961ac97_mic_set(ac97_ctrl_t *ctrl, uint64_t value)
962{
963	ac97_mono_set(ctrl, value, AC97_MIC_VOLUME_REGISTER, 0);
964}
965
966static void
967ac97_speaker_set(ac97_ctrl_t *ctrl, uint64_t value)
968{
969	ac97_mono_set(ctrl, value, AC97_MONO_MASTER_VOLUME_REGISTER, 0);
970}
971
972static void
973ac97_pcbeep_set(ac97_ctrl_t *ctrl, uint64_t value)
974{
975	ac97_mono_set(ctrl, value, AC97_PC_BEEP_REGISTER, 1);
976}
977
978static void
979ac97_recgain_set(ac97_ctrl_t *ctrl, uint64_t value)
980{
981	ac97_stereo_set(ctrl, value, AC97_RECORD_GAIN_REGISTER);
982}
983
984static void
985ac97_center_set(ac97_ctrl_t *ctrl, uint64_t value)
986{
987	ac97_mono_set(ctrl, value, AC97_EXTENDED_C_LFE_VOLUME_REGISTER, 0);
988}
989
990static void
991ac97_lfe_set(ac97_ctrl_t *ctrl, uint64_t value)
992{
993	ac97_mono_set(ctrl, value, AC97_EXTENDED_C_LFE_VOLUME_REGISTER, 8);
994}
995
996static void
997ac97_bass_set(ac97_ctrl_t *ctrl, uint64_t value)
998{
999	ac97_mono_set(ctrl, value, AC97_MASTER_TONE_CONTROL_REGISTER, 8);
1000}
1001
1002static void
1003ac97_treble_set(ac97_ctrl_t *ctrl, uint64_t value)
1004{
1005	ac97_mono_set(ctrl, value, AC97_MASTER_TONE_CONTROL_REGISTER, 0);
1006}
1007
1008static void
1009ac97_3ddepth_set(ac97_ctrl_t *ctrl, uint64_t value)
1010{
1011	/*
1012	 * XXX: This is all wrong... 3D depth/center cannot necessarily
1013	 * be scaled, because the technology in use may vary.  We
1014	 * need more information about each of the options available
1015	 * to do the right thing.
1016	 */
1017	ac97_mono_set(ctrl, value, AC97_THREE_D_CONTROL_REGISTER, 0);
1018}
1019
1020static void
1021ac97_3dcent_set(ac97_ctrl_t *ctrl, uint64_t value)
1022{
1023	/*
1024	 * XXX: This is all wrong... 3D depth/center cannot necessarily
1025	 * be scaled, because the technology in use may vary.  We
1026	 * need more information about each of the options available
1027	 * to do the right thing.
1028	 */
1029	ac97_mono_set(ctrl, value, AC97_THREE_D_CONTROL_REGISTER, 8);
1030}
1031
1032static void
1033ac97_micboost_set(ac97_ctrl_t *ctrl, uint64_t value)
1034{
1035	ac97_t		*ac = ctrl->actrl_ac97;
1036	uint16_t	v;
1037
1038	v = SHADOW(ac, AC97_MIC_VOLUME_REGISTER);
1039	if (value) {
1040		v |= MICVR_20dB_BOOST;
1041	} else {
1042		v &= ~MICVR_20dB_BOOST;
1043	}
1044	ac97_wr(ac, AC97_MIC_VOLUME_REGISTER, v);
1045}
1046
1047/*
1048 * This will return the stored value for any control that has been set.
1049 * Note this does not return the actual hardware value from a port. But
1050 * instead returns the cached value from the last write to the hardware
1051 * port.
1052 *
1053 * arg            - This control structure for this control.
1054 * value          - This is a pointer to the location to put the
1055 *                  controls value.
1056 *
1057 * On success zero is returned.
1058 */
1059static int
1060ac97_control_get(void *arg, uint64_t *value)
1061{
1062	ac97_ctrl_t	*ctrl = arg;
1063	ac97_t		*ac = ctrl->actrl_ac97;
1064
1065	mutex_enter(&ac->ac_lock);
1066	*value = ctrl->actrl_value;
1067	mutex_exit(&ac->ac_lock);
1068
1069	return (0);
1070}
1071
1072static int
1073ac97_control_set(void *arg, uint64_t value)
1074{
1075	ac97_ctrl_t		*ctrl = arg;
1076	ac97_t			*ac = ctrl->actrl_ac97;
1077	uint8_t			v1, v2;
1078
1079	/* a bit of quick checking */
1080	switch (ctrl->actrl_type) {
1081	case AUDIO_CTRL_TYPE_STEREO:
1082		v1 = (value >> 8) & 0xff;
1083		v2 = value & 0xff;
1084		if ((v1 < ctrl->actrl_minval) || (v1 > ctrl->actrl_maxval) ||
1085		    (v2 < ctrl->actrl_minval) || (v2 > ctrl->actrl_maxval) ||
1086		    (value > 0xffff)) {
1087			return (EINVAL);
1088		}
1089		break;
1090
1091	case AUDIO_CTRL_TYPE_ENUM:
1092		if ((value & ~ctrl->actrl_minval) !=
1093		    (ctrl->actrl_maxval & ~ctrl->actrl_minval)) {
1094			return (EINVAL);
1095		}
1096		break;
1097
1098	case AUDIO_CTRL_TYPE_MONO:
1099	case AUDIO_CTRL_TYPE_BOOLEAN:
1100		if ((value < ctrl->actrl_minval) ||
1101		    (value > ctrl->actrl_maxval)) {
1102			return (EINVAL);
1103		}
1104		break;
1105	}
1106
1107	mutex_enter(&ac->ac_lock);
1108	ctrl->actrl_value = value;
1109	ctrl->actrl_write_fn(ctrl, value);
1110	mutex_exit(&ac->ac_lock);
1111
1112	return (0);
1113}
1114
1115/*
1116 * This simply sets a flag to block calls to the underlying
1117 * hardware driver to get or set hardware controls. This is usually
1118 * called just before a power down of devices. Once this gets called any
1119 * calls to set controls will not touch the real hardware. But
1120 * since all control updates are always saved in soft registers it
1121 * is a simple mater to update the hardware with the latest values
1122 * on resume which also unblocks calls to the hardware controls.
1123 */
1124void
1125ac97_suspend(ac97_t *ac)
1126{
1127	mutex_enter(&ac->ac_lock);
1128
1129	/* This will prevent any new operations from starting! */
1130	ac->suspended = B_TRUE;
1131	ac->resumer = 0;
1132
1133	/* XXX - should we powerdown codec's here?? */
1134	mutex_exit(&ac->ac_lock);
1135}
1136
1137/*
1138 * Reset the analog codec hardware
1139 *
1140 * Reset all analog AC97 hardware, input ADC's, output DAC's and MIXER.
1141 * Wait a resonable amount of time for hardware to become ready.
1142 */
1143static void
1144ac97_analog_reset(ac97_t *ac)
1145{
1146	uint16_t	tmp;
1147	int		wait = 1000; /* delay for up to 1s */
1148
1149	/* Clear stale data and resync register accesses */
1150	tmp = RD(AC97_POWERDOWN_CTRL_STAT_REGISTER);
1151
1152	/* reset the codec */
1153	WR(AC97_RESET_REGISTER, 0);
1154	tmp = RD(AC97_RESET_REGISTER);
1155
1156	/* power up */
1157	WR(AC97_POWERDOWN_CTRL_STAT_REGISTER, 0);
1158
1159	/* Wait for ADC/DAC/MIXER to become ready */
1160	while (wait--) {
1161		/* 1 msec delay */
1162		drv_usecwait(1000);
1163
1164		/* If all ready - end delay */
1165		tmp = RD(AC97_POWERDOWN_CTRL_STAT_REGISTER);
1166		SHADOW(ac, AC97_POWERDOWN_CTRL_STAT_REGISTER) = tmp;
1167		if ((tmp & PCSR_POWERD_UP) == PCSR_POWERD_UP) {
1168			return;
1169		}
1170	}
1171
1172	audio_dev_warn(ac->d, "AC'97 analog powerup timed out");
1173}
1174
1175/*
1176 * This is the internal hardware reset routine.
1177 * It has no locking and we must be locked before it is
1178 * called!
1179 *
1180 * This will reset and re-initialize the device.
1181 * It has two modes of operation that affect how it handles
1182 * all controls.
1183 *
1184 * It re-initializes the device and reloads values with
1185 * last updated versions.
1186 */
1187static void
1188ac97_hw_reset(ac97_t *ac)
1189{
1190	/*
1191	 * Fully Power up the device
1192	 */
1193	if (ac->flags & AC97_FLAG_AMPLIFIER) {
1194		/* power up - external amp powerd up */
1195		ac97_wr(ac, AC97_POWERDOWN_CTRL_STAT_REGISTER, 0);
1196	} else {
1197		/* power up - external amp powered down */
1198		ac97_wr(ac, AC97_POWERDOWN_CTRL_STAT_REGISTER, PCSR_EAPD);
1199	}
1200
1201	ac97_wr(ac, AC97_GENERAL_PURPOSE_REGISTER, 0);
1202
1203	switch (ac->vid) {
1204	case AC97_CODEC_STAC9708:
1205#if 0
1206		/* non-inverted phase */
1207		/* ac97_rd(ac, AC97_VENDOR_REGISTER_11) & ~0x8); */
1208#endif
1209		WR(AC97_VENDOR_REGISTER_11, 8);
1210		break;
1211
1212	case AC97_CODEC_EM28028:
1213		ac97_wr(ac, AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER,
1214		    (ac97_rd(ac, AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER) &
1215		    ~3800) | 0xE0);
1216		break;
1217
1218	case AC97_CODEC_AD1886:
1219		/* jack sense */
1220		WR(AC97_VENDOR_REGISTER_13,
1221		    (RD(AC97_VENDOR_REGISTER_13) & ~0xEF) | 0x10);
1222		break;
1223
1224	case AC97_CODEC_AD1888:
1225		WR(AC97_VENDOR_REGISTER_15, 0xC420);
1226#if 0
1227		/* GED: This looks fishy to me, so I'm nuking it for now */
1228		/* headphone/aux volume (?) */
1229		ac97_wr(ac, AC97_HEADPHONE_VOLUME_REGISTER,  0x0808);
1230#endif
1231		break;
1232
1233	case AC97_CODEC_AD1980:
1234#if 0
1235		/* set jacksense to mute line if headphone is plugged */
1236		WR(AC97_VENDOR_REGISTER_13,
1237		    (RD(AC97_VENDOR_REGISTER_13) & ~0xe00) | 0x400);
1238#endif
1239		WR(AC97_VENDOR_REGISTER_15, 0xC420);
1240		break;
1241
1242	case AC97_CODEC_AD1985:
1243		WR(AC97_VENDOR_REGISTER_15, 0xC420);
1244		break;
1245
1246	case AC97_CODEC_WM9704:
1247		/* enable I2S */
1248		WR(AC97_VENDOR_REGISTER_01, RD(AC97_VENDOR_REGISTER_01) | 0x80);
1249		break;
1250
1251	case AC97_CODEC_VT1612A:
1252	case AC97_CODEC_VT1617A:
1253	case AC97_CODEC_VT1616:
1254		/* Turn off Center, Surround, and LFE DACs */
1255		ac97_clr(ac, AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER,
1256		    EASCR_PRI | EASCR_PRJ | EASCR_PRK);
1257		WR(AC97_VENDOR_REGISTER_01, 0x0230);
1258		break;
1259
1260	case AC97_CODEC_YMF753:
1261		/* set TX8 + 3AWE */
1262		WR(AC97_VENDOR_REGISTER_07, RD(AC97_VENDOR_REGISTER_07) | 0x9);
1263		break;
1264
1265	default:
1266		break;
1267	}
1268
1269	/* call codec specific reset hook */
1270	if (ac->codec_reset != NULL) {
1271		ac->codec_reset(ac);
1272	}
1273
1274	/* Turn off variable sampling rate support */
1275	ac97_clr(ac, AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER, EASCR_VRA);
1276}
1277
1278/*
1279 * This will reset and re-initialize the device.
1280 * It has two modes of operation that affect how it handles
1281 * all controls.
1282 *
1283 * It re-initializes the device and then can either reset
1284 * all controls back to their initial values or it can
1285 * re-load all controls with their last updated values.
1286 *
1287 * initval         - If this is none zero then all controls will
1288 *                   be restored to their initial values.
1289 */
1290void
1291ac97_reset(ac97_t *ac)
1292{
1293	/* If we are about to suspend so no point in going on */
1294	mutex_enter(&ac->ac_lock);
1295	if (ac->suspended) {
1296		mutex_exit(&ac->ac_lock);
1297		return;
1298	}
1299	ac97_analog_reset(ac);
1300	ac97_hw_reset(ac);
1301	ac97_restore(ac);
1302
1303	mutex_exit(&ac->ac_lock);
1304}
1305
1306/*
1307 * Given the need to resume the hardware this reloads the base hardware
1308 * and then takes the stored values for each control and sends them
1309 * to the hardware again.
1310 */
1311void
1312ac97_resume(ac97_t *ac)
1313{
1314
1315	/*
1316	 * This should only be called when already suspended.
1317	 * this takes us out of suspend state after it brings the
1318	 * controls back to life.
1319	 */
1320	ASSERT(ac->suspended);
1321	mutex_enter(&ac->ac_lock);
1322	ac->resumer = ddi_get_kt_did();
1323
1324	/* We simply call reset since the operation is the same */
1325	ac97_analog_reset(ac);
1326	ac97_hw_reset(ac);
1327	ac97_restore(ac);
1328
1329	ac->resumer = 0;
1330	ac->suspended = B_FALSE;
1331	mutex_exit(&ac->ac_lock);
1332}
1333
1334
1335/*
1336 * Register a control -- if it fails, it will generate a message to
1337 * syslog, but the driver muddles on.  (Failure to register a control
1338 * should never occur, and is generally benign if it happens.)
1339 */
1340void
1341ac97_alloc_control(ac97_t *ac, ac97_ctrl_probe_t *cpt)
1342{
1343	ac97_ctrl_t		*ctrl;
1344	audio_ctrl_desc_t	ctrl_des;
1345
1346	ASSERT(ac);
1347	ASSERT(ac->d);
1348
1349	ctrl = kmem_zalloc(sizeof (ac97_ctrl_t), KM_SLEEP);
1350
1351	bzero(&ctrl_des, sizeof (ctrl_des));
1352	ctrl_des.acd_name = cpt->cp_name;
1353	ctrl_des.acd_minvalue = cpt->cp_minval;
1354	ctrl_des.acd_maxvalue = cpt->cp_maxval;
1355	ctrl_des.acd_type = cpt->cp_type;
1356	ctrl_des.acd_flags = cpt->cp_flags;
1357	if (cpt->cp_enum) {
1358		for (int e = 0; e < 64; e++) {
1359			if (cpt->cp_enum[e] == NULL)
1360				break;
1361			ctrl_des.acd_enum[e] = cpt->cp_enum[e];
1362		}
1363	}
1364
1365	ctrl->actrl_ac97 = ac;
1366	/*
1367	 * Warning for extended controls this field gets changed
1368	 * by audio_dev_add_control() to be a unique value.
1369	 */
1370	ctrl->actrl_minval = cpt->cp_minval;
1371	ctrl->actrl_maxval = cpt->cp_maxval;
1372	ctrl->actrl_initval = cpt->cp_initval;
1373	ctrl->actrl_muteable = cpt->cp_muteable;
1374	ctrl->actrl_write_fn = cpt->cp_write_fn;
1375	ctrl->actrl_bits = cpt->cp_bits;
1376	ctrl->actrl_type = cpt->cp_type;
1377	ctrl->actrl_name = cpt->cp_name;
1378
1379	/* Register control with framework */
1380	ctrl->actrl_ctrl = audio_dev_add_control(ac->d, &ctrl_des,
1381	    ac97_control_get, ac97_control_set, ctrl);
1382	if (!ctrl->actrl_ctrl) {
1383		audio_dev_warn(ac->d, "AC97 %s alloc failed", cpt->cp_name);
1384		kmem_free(ctrl, sizeof (ac97_ctrl_t));
1385		return;
1386	}
1387
1388	/*
1389	 * Not that it can not be referenced until in is in the
1390	 * list. So again by adding to the list last we avoid the need
1391	 * for control locks.
1392	 */
1393	mutex_enter(&ac->ac_lock);
1394	list_insert_tail(&ac->ctrls, ctrl);
1395	mutex_exit(&ac->ac_lock);
1396}
1397
1398/*
1399 * De-Register and free up a control
1400 *
1401 * Note ctrl_lock read write must be held for writing when calling
1402 * this function
1403 */
1404void
1405ac97_free_control(ac97_ctrl_t *ctrl)
1406{
1407	ac97_t	*ac = ctrl->actrl_ac97;
1408
1409	mutex_enter(&ac->ac_lock);
1410	list_remove(&ac->ctrls, ctrl);
1411	mutex_exit(&ac->ac_lock);
1412
1413	audio_dev_del_control(ctrl->actrl_ctrl);
1414	kmem_free(ctrl, sizeof (ac97_ctrl_t));
1415}
1416
1417/*
1418 * This is the master list of all controls known and handled by
1419 * the AC97 framework. This is the list used to probe, allocate
1420 * and configure controls. If a control is not in this list it
1421 * will not be handled. If a control is in this list but does not
1422 * have a probe routine then it will always be included. If a
1423 * control in list has a probe routine then it must return true
1424 * for that control to be included.
1425 */
1426
1427#define	MONCTL	(AC97_FLAGS | AUDIO_CTRL_FLAG_MONITOR)
1428#define	PLAYCTL	(AC97_FLAGS | AUDIO_CTRL_FLAG_PLAY)
1429#define	RECCTL	(AC97_FLAGS | AUDIO_CTRL_FLAG_REC)
1430#define	T3DCTL	(AC97_FLAGS | AUDIO_CTRL_FLAG_3D)
1431#define	TONECTL	(AC97_FLAGS | AUDIO_CTRL_FLAG_TONE)
1432#define	MAINVOL	(PLAYCTL | AUDIO_CTRL_FLAG_MAINVOL)
1433#define	PCMVOL	(PLAYCTL | AUDIO_CTRL_FLAG_PCMVOL)
1434#define	RECVOL	(RECCTL | AUDIO_CTRL_FLAG_RECVOL)
1435#define	MONVOL	(MONCTL | AUDIO_CTRL_FLAG_MONVOL)
1436
1437ac97_ctrl_probe_t	ctrl_probe_tbl[] = {
1438
1439	/* Master PCM Volume */
1440	{AUDIO_CTRL_ID_VOLUME, INIT_VAL_MAIN, 0, 100, AUDIO_CTRL_TYPE_MONO,
1441	PCMVOL, PCMOVR_MUTE, ac97_master_set, NULL, 5},
1442
1443	/* LINE out volume */
1444	{AUDIO_CTRL_ID_LINEOUT, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
1445	MAINVOL, 0x8080, ac97_lineout_set, ac97_probe_lineout, 6},
1446
1447	/* Front volume */
1448	{AUDIO_CTRL_ID_FRONT, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
1449	MAINVOL, 0x8080, ac97_lineout_set, ac97_probe_front, 6},
1450
1451	/* 4CH out volume (has one of three possible uses, first use) */
1452	{AUDIO_CTRL_ID_SURROUND, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
1453	MAINVOL, 0x8080, ac97_surround_set, ac97_probe_rear, 6},
1454
1455	/* ALT out volume (has one of three possible uses, second use) */
1456	{AUDIO_CTRL_ID_HEADPHONE, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
1457	MAINVOL, 0x8080, ac97_headphone_set, ac97_probe_headphone, 6},
1458
1459	/* ALT out volume (has one of three possible uses, third use) */
1460	{AUDIO_CTRL_ID_AUX1OUT, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
1461	MAINVOL, 0x8080, ac97_aux1out_set, ac97_probe_auxout, 6},
1462
1463	/* center out volume */
1464	{AUDIO_CTRL_ID_CENTER, INIT_VAL_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
1465	MAINVOL, EXLFEVR_CENTER_MUTE, ac97_center_set, ac97_probe_center, 6},
1466
1467	/* LFE out volume (sub-woofer) */
1468	{AUDIO_CTRL_ID_LFE, INIT_VAL_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
1469	MAINVOL, EXLFEVR_LFE_MUTE, ac97_lfe_set, ac97_probe_lfe, 6},
1470
1471	/* MONO out volume */
1472	{AUDIO_CTRL_ID_SPEAKER, INIT_VAL_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
1473	MAINVOL, MMVR_MUTE, ac97_speaker_set, ac97_probe_mono, 6},
1474
1475	/* Record in GAIN */
1476	{AUDIO_CTRL_ID_RECGAIN, INIT_IGAIN_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
1477	RECVOL, RGR_MUTE, ac97_recgain_set, NULL, -4},
1478
1479	/* MIC in volume */
1480	{AUDIO_CTRL_ID_MIC, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
1481	MONVOL, MICVR_MUTE, ac97_mic_set, ac97_probe_mic, 5},
1482
1483	/* LINE in volume */
1484	{AUDIO_CTRL_ID_LINEIN, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
1485	MONVOL, LIVR_MUTE, ac97_linein_set, ac97_probe_linein, 5},
1486
1487	/* CD in volume */
1488	{AUDIO_CTRL_ID_CD, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
1489	MONVOL, CDVR_MUTE, ac97_cd_set, ac97_probe_cdrom, 5},
1490
1491	/* VIDEO in volume */
1492	{AUDIO_CTRL_ID_VIDEO, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
1493	MONVOL, VIDVR_MUTE, ac97_video_set, ac97_probe_video, 5},
1494
1495	/* AUX in volume */
1496	{AUDIO_CTRL_ID_AUX1IN, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
1497	MONVOL, AUXVR_MUTE, ac97_auxin_set, ac97_probe_auxin, 5},
1498
1499	/* PHONE in volume */
1500	{AUDIO_CTRL_ID_PHONE, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
1501	MONVOL, PVR_MUTE, ac97_phone_set, ac97_probe_phone, 5},
1502
1503	/* PC BEEPER in volume (motherboard speaker pins) */
1504	{AUDIO_CTRL_ID_BEEP, INIT_VAL_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
1505	AC97_RW, PCBR_MUTE, ac97_pcbeep_set, ac97_probe_pcbeep, 4},
1506
1507	/* BASS out level (note, zero is hardware bypass) */
1508	{AUDIO_CTRL_ID_BASS, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
1509	TONECTL, 0, ac97_bass_set, ac97_probe_tone, 4},
1510
1511	/* TREBLE out level (note, zero is hardware bypass) */
1512	{AUDIO_CTRL_ID_TREBLE, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
1513	TONECTL, 0, ac97_treble_set, ac97_probe_tone, 4},
1514
1515	/* Loudness on/off switch */
1516	{AUDIO_CTRL_ID_LOUDNESS, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
1517	TONECTL, 0, ac97_loudness_set, ac97_probe_loud, 0},
1518
1519	/* 3D depth out level */
1520	{AUDIO_CTRL_ID_3DDEPTH, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
1521	T3DCTL, 0, ac97_3ddepth_set, ac97_probe_3d_depth, 4},
1522
1523	/* 3D center out level */
1524	{AUDIO_CTRL_ID_3DCENT, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
1525	T3DCTL, 0, ac97_3dcent_set, ac97_probe_3d_center, 4},
1526
1527	/* 3D enhance on/off switch */
1528	{AUDIO_CTRL_ID_3DENHANCE, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
1529	T3DCTL, 0, ac97_3donoff_set, ac97_probe_3d, 0},
1530
1531	/* MIC BOOST switch */
1532	{AUDIO_CTRL_ID_MICBOOST, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
1533	RECCTL, 0, ac97_micboost_set, ac97_probe_mic, 0},
1534
1535	/* Loopback on/off switch */
1536	{AUDIO_CTRL_ID_LOOPBACK, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
1537	AC97_RW, 0, ac97_loopback_set, NULL, 0},
1538
1539	/*
1540	 * The following selectors *must* come after the others, as they rely
1541	 * on the probe results of other controls.
1542	 */
1543	/* record src select  (only one port at a time) */
1544	{AUDIO_CTRL_ID_RECSRC, (1U << INPUT_MIC), 0, 0, AUDIO_CTRL_TYPE_ENUM,
1545	RECCTL, 0, ac97_insrc_set, NULL, 0, ac97_insrcs},
1546
1547	/* Start of non-standard private controls */
1548
1549	/* Simulated stereo on/off switch */
1550	{AUDIO_CTRL_ID_STEREOSIM, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
1551	AC97_RW, 0, ac97_stsim_set, ac97_probe_stsim, 0},
1552
1553	/* mono MIC GAIN */
1554	{AUDIO_CTRL_ID_MICGAIN, INIT_IGAIN_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
1555	RECCTL, RGMR_MUTE, ac97_monomic_set, ac97_probe_mmic, -4},
1556
1557	/* MIC select switch 0=mic1 1=mic2 */
1558	{AUDIO_CTRL_ID_MICSRC, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM,
1559	RECCTL, 0, ac97_selmic_set, ac97_probe_mic, 0, ac97_mics},
1560
1561	/* MONO out src select 0=mix 1=mic */
1562	{AUDIO_CTRL_ID_SPKSRC, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM,
1563	AC97_RW, 0, ac97_monosrc_set, ac97_probe_mono, 0, ac97_monos},
1564
1565	{NULL}
1566};
1567
1568/*
1569 * Probe all possible controls and register existing
1570 * ones and set initial values
1571 *
1572 * Returns zero on success
1573 */
1574static int
1575ac97_probeinit_ctrls(ac97_t *ac, int vol_bits, int enh_bits)
1576{
1577	ac97_ctrl_probe_t	*cpt;
1578	ac97_ctrl_probe_t	my_cpt;
1579
1580	ASSERT(ac);
1581
1582	/*
1583	 * Set some ports which are always present.
1584	 */
1585	ac->inputs = (1U << INPUT_STEREOMIX) | (1U << INPUT_MONOMIX);
1586	for (cpt = &ctrl_probe_tbl[0]; cpt->cp_name != NULL; cpt++) {
1587		bcopy(cpt, &my_cpt, sizeof (my_cpt));
1588
1589		if (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_RECSRC) == 0) {
1590			my_cpt.cp_minval |= ac->inputs;
1591			my_cpt.cp_maxval |= ac->inputs;
1592		}
1593
1594		if (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_MICBOOST) == 0) {
1595			if (ac->flags & AC97_FLAG_MICBOOST)
1596				my_cpt.cp_initval = 1;
1597		}
1598
1599		if ((strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_FRONT) == 0) ||
1600		    (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_HEADPHONE) == 0) ||
1601		    (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_SURROUND) == 0) ||
1602		    (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_SPEAKER) == 0)) {
1603			my_cpt.cp_bits = vol_bits;
1604		}
1605
1606		if ((strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_3DDEPTH) == 0) ||
1607		    (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_3DCENT) == 0)) {
1608			my_cpt.cp_bits = enh_bits;
1609		}
1610
1611		if (!my_cpt.cp_probe || my_cpt.cp_probe(ac)) {
1612			ac97_alloc_control(ac, &my_cpt);
1613		}
1614	}
1615
1616	if (ac->codec_init != NULL) {
1617		ac->codec_init(ac);
1618	}
1619
1620	return (0);
1621}
1622
1623/*
1624 * Allocate an AC97 instance for use by a hardware driver.
1625 *
1626 * returns an allocated and initialize ac97 structure.
1627 */
1628ac97_t *
1629ac97_alloc(dev_info_t *dip, ac97_rd_t rd, ac97_wr_t wr, void *priv)
1630{
1631	ac97_t	*ac;
1632
1633	ac = kmem_zalloc(sizeof (ac97_t), KM_SLEEP);
1634	ac->dip = dip;
1635	ac->rd = rd;
1636	ac->wr = wr;
1637	ac->private = priv;
1638
1639	list_create(&ac->ctrls, sizeof (struct ac97_ctrl),
1640	    offsetof(struct ac97_ctrl, actrl_linkage));
1641
1642	mutex_init(&ac->ac_lock, NULL, MUTEX_DRIVER, NULL);
1643
1644#define	PROP_FLAG(prop, flag, def)				    \
1645	if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, \
1646	    (prop), (def))) {					    \
1647		ac->flags |= (flag);				    \
1648	} else {						    \
1649		ac->flags &= ~(flag);				    \
1650	}
1651
1652	/*
1653	 * Engage the external amplifier by default, suppress with
1654	 * a property of the form "ac97-amplifier=0".
1655	 */
1656	PROP_FLAG(AC97_PROP_AMPLIFIER, AC97_FLAG_AMPLIFIER, 1);
1657
1658	/*
1659	 * We cannot necessarily know if the headphone jack is present
1660	 * or not.  There's a technique to probe the codec for
1661	 * headphone support, but many vendors seem to simply hang the
1662	 * headphone jack on the line out circuit, and have some kind
1663	 * of jack sense detection to enable or disable it by default.
1664	 * None of this is visible in the AC'97 registers.
1665	 *
1666	 * We cannot do much about it, but what we can do is offer users
1667	 * a way to suppress the option for a headphone port.  Users and
1668	 * administrators can then set a flag in the driver.conf to suppress
1669	 * the option from display.
1670	 *
1671	 * It turns out that this problem exists for other signals as
1672	 * well.
1673	 */
1674	PROP_FLAG(AC97_PROP_NO_HEADPHONE, AC97_FLAG_NO_HEADPHONE, 0);
1675	PROP_FLAG(AC97_PROP_NO_AUXOUT, AC97_FLAG_NO_AUXOUT, 0);
1676	PROP_FLAG(AC97_PROP_NO_CDROM, AC97_FLAG_NO_CDROM, 0);
1677	PROP_FLAG(AC97_PROP_NO_AUXIN, AC97_FLAG_NO_AUXIN, 0);
1678	PROP_FLAG(AC97_PROP_NO_VIDEO, AC97_FLAG_NO_VIDEO, 0);
1679	PROP_FLAG(AC97_PROP_NO_LINEIN, AC97_FLAG_NO_LINEIN, 0);
1680	PROP_FLAG(AC97_PROP_NO_MIC, AC97_FLAG_NO_MIC, 0);
1681
1682	/*
1683	 * Most SPARC systems use the AC97 monoaural output for the
1684	 * built-in speaker.  On these systems, we want to expose and
1685	 * enable the built-in speaker by default.
1686	 *
1687	 * On most x86 systems, the mono output is not connected to
1688	 * anything -- the AC'97 spec makes it pretty clear that the
1689	 * output was actually intended for use with speaker phones.
1690	 * So on those systems, we really don't want to activate the
1691	 * speaker -- we don't even want to expose it's presence
1692	 * normally.
1693	 *
1694	 * However, there could be an exception to the rule here.  To
1695	 * facilitate this, we allow for the presence of the property
1696	 * to indicate that the speaker should be exposed.  Whether it
1697	 * is enabled by default or not depends on the value of the
1698	 * property.  (Generally on SPARC, we enable by default.  On
1699	 * other systems we do not.)
1700	 */
1701#ifdef	__sparc
1702	ac->flags |= AC97_FLAG_SPEAKER_OK;
1703	PROP_FLAG(AC97_PROP_SPEAKER, AC97_FLAG_SPEAKER, 1);
1704#else
1705	if (ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1706	    AC97_PROP_SPEAKER)) {
1707		ac->flags |= AC97_FLAG_SPEAKER_OK;
1708		PROP_FLAG(AC97_PROP_SPEAKER, AC97_FLAG_SPEAKER, 0);
1709	}
1710#endif
1711
1712	/*
1713	 * Enable microphone boost (20dB normally) by default?
1714	 */
1715	PROP_FLAG(AC97_PROP_MICBOOST, AC97_FLAG_MICBOOST, 0);
1716
1717	return (ac);
1718}
1719
1720/*
1721 * Free an AC97 instance.
1722 */
1723void
1724ac97_free(ac97_t *ac)
1725{
1726	ac97_ctrl_t *ctrl;
1727
1728	/* Clear out any controls that are still attached */
1729	while ((ctrl = list_head(&ac->ctrls)) != NULL) {
1730		ac97_free_control(ctrl);
1731	}
1732
1733	list_destroy(&ac->ctrls);
1734	mutex_destroy(&ac->ac_lock);
1735	kmem_free(ac, sizeof (ac97_t));
1736}
1737
1738static struct vendor {
1739	unsigned	id;
1740	const char	*name;
1741} vendors[] = {
1742	{ AC97_VENDOR_ADS,	"Analog Devices" },
1743	{ AC97_VENDOR_AKM,	"Asahi Kasei" },
1744	{ AC97_VENDOR_ALC,	"Realtek" },
1745	{ AC97_VENDOR_ALG,	"Avance Logic" },
1746	{ AC97_VENDOR_CMI,	"C-Media" },
1747	{ AC97_VENDOR_CRY,	"Cirrus Logic" },
1748	{ AC97_VENDOR_CXT,	"Conexant" },
1749	{ AC97_VENDOR_ESS,	"ESS Technology" },
1750	{ AC97_VENDOR_EV,	"Ectiva" },
1751	{ AC97_VENDOR_ICE,	"ICEnsemble" },
1752	{ AC97_VENDOR_ST,	"SigmaTel" },
1753	{ AC97_VENDOR_TRA,	"TriTech", },
1754	{ AC97_VENDOR_VIA,	"VIA Technologies" },
1755	{ AC97_VENDOR_WML,	"Wolfson" },
1756	{ AC97_VENDOR_YMH,	"Yamaha" },
1757	{ 0, NULL },
1758};
1759
1760static struct codec {
1761	unsigned	id;
1762	const char	*name;
1763	int		enh_bits;
1764	void		(*init)(ac97_t *ac);
1765	void		(*reset)(ac97_t *ac);
1766} codecs[] = {
1767	{ AC97_CODEC_AK4540,	"AK4540" },
1768	{ AC97_CODEC_STAC9700,	"STAC9700" },
1769	{ AC97_CODEC_STAC9701,  "STAC9701" },
1770	{ AC97_CODEC_STAC9701_2,	"STAC9701" },
1771	{ AC97_CODEC_STAC9704,	"STAC9704" },
1772	{ AC97_CODEC_STAC9705,	"STAC9705" },
1773	{ AC97_CODEC_STAC9721,	"STAC9721" },
1774	{ AC97_CODEC_STAC9708,	"STAC9708", 2 },
1775	{ AC97_CODEC_STAC9744,	"STAC9744" },
1776	{ AC97_CODEC_STAC9750,	"STAC9750", 3 },
1777	{ AC97_CODEC_STAC9752,	"STAC9752", 3 },
1778	{ AC97_CODEC_STAC9756,	"STAC9756", 3 },
1779	{ AC97_CODEC_STAC9758,	"STAC9758", 3 },
1780	{ AC97_CODEC_STAC9766,	"STAC9766", 3 },
1781	{ AC97_CODEC_TR28028,	"TR28028" },
1782	{ AC97_CODEC_TR28028_2,	"TR28028" },
1783	{ AC97_CODEC_TR28023,	"TR28023" },
1784	{ AC97_CODEC_TR28023_2,	"TR28023" },
1785	{ AC97_CODEC_EM28028,	"EM28028" },
1786	{ AC97_CODEC_CX20468,	"CX20468" },
1787	{ AC97_CODEC_CX20468_2,	"CX20468" },
1788	{ AC97_CODEC_CX20468_21,	"CX20468-21" },
1789	{ AC97_CODEC_CS4297,	"CS4297" },
1790	{ AC97_CODEC_CS4297A,	"CS4297A" },
1791	{ AC97_CODEC_CS4294,	"CS4294" },
1792	{ AC97_CODEC_CS4299,	"CS4299" },
1793	{ AC97_CODEC_CS4202,	"CS4202" },
1794	{ AC97_CODEC_CS4205,	"CS4205" },
1795	{ AC97_CODEC_AD1819B,	"AD1819B" },
1796	{ AC97_CODEC_AD1881,	"AD1881" },
1797	{ AC97_CODEC_AD1881A,	"AD1881A" },
1798	{ AC97_CODEC_AD1885,	"AD1885" },
1799	{ AC97_CODEC_AD1886,	"AD1886" },
1800	{ AC97_CODEC_AD1887,	"AD1887" },
1801	{ AC97_CODEC_AD1888,	"AD1888" },
1802	{ AC97_CODEC_AD1980,	"AD1980" },
1803	{ AC97_CODEC_AD1981,	"AD1981" },	/* no data sheet */
1804	{ AC97_CODEC_AD1981A,	"AD1981A", 0, ad1981a_init },
1805	{ AC97_CODEC_AD1981B,	"AD1981B", 0, ad1981b_init },
1806	{ AC97_CODEC_AD1985,	"AD1985" },
1807	{ AC97_CODEC_WM9701A,	"WM9701A" },
1808	{ AC97_CODEC_WM9703,	"WM9703" },
1809	{ AC97_CODEC_WM9704,	"WM9704" },
1810	{ AC97_CODEC_ES1921,	"ES1921" },
1811	{ AC97_CODEC_ICE1232,	"ICE1232/VT1611A" },
1812	{ AC97_CODEC_VT1612A,	"VT1612A" },
1813	{ AC97_CODEC_VT1616,	"VT1616" },
1814	{ AC97_CODEC_VT1616A,	"VT1616A" },
1815	{ AC97_CODEC_VT1617A,	"VT1617A" },
1816	{ AC97_CODEC_VT1618,	"VT1618" },
1817	{ AC97_CODEC_ALC100,	"ALC100", 2 },
1818	{ AC97_CODEC_ALC200P,	"ALC200P", 2 },
1819	{ AC97_CODEC_ALC202,	"ALC202", 2 },
1820	{ AC97_CODEC_ALC203,	"ALC203", 2 },
1821	{ AC97_CODEC_ALC250,	"ALC250", 2 },
1822	{ AC97_CODEC_ALC250_2,	"ALC250", 2 },
1823	{ AC97_CODEC_ALC650,	"ALC650", 2, alc650_init },
1824	{ AC97_CODEC_ALC655,	"ALC655", 2, alc650_init },
1825	{ AC97_CODEC_ALC658,	"ALC658", 2, alc650_init },
1826	{ AC97_CODEC_ALC850,	"ALC850", 2, alc850_init },
1827	{ AC97_CODEC_EV1938,	"EV1938" },
1828	{ AC97_CODEC_CMI9738,	"CMI9738", 0, cmi9738_init },
1829	{ AC97_CODEC_CMI9739,	"CMI9739", 0, cmi9739_init },
1830	{ AC97_CODEC_CMI9780,	"CMI9780" },
1831	{ AC97_CODEC_CMI9761,	"CMI9761A", 0, cmi9761_init },
1832	{ AC97_CODEC_CMI9761_2,	"CMI9761B", 0, cmi9761_init },
1833	{ AC97_CODEC_CMI9761_3,	"CMI9761A+", 0, cmi9761_init },
1834	{ AC97_CODEC_YMF743,	"YMF743" },
1835	{ AC97_CODEC_YMF753,	"YMF753" },
1836	{ 0, NULL }
1837};
1838
1839/*
1840 * Init the actual hardware related to a previously
1841 * allocated instance of an AC97 device.
1842 *
1843 * Return zero on success.
1844 */
1845int
1846ac97_init(ac97_t *ac, struct audio_dev *d)
1847{
1848	uint32_t		vid1, vid2;
1849	const char		*name = NULL;
1850	const char		*vendor = NULL;
1851	int			enh_bits;
1852	int			vol_bits;
1853	uint32_t		flags;
1854	char			nmbuf[128];
1855	char			buf[128];
1856
1857	/* Save audio framework instance structure */
1858	ac->d = d;
1859
1860	ac97_analog_reset(ac);
1861
1862	vid1 = RD(AC97_VENDOR_ID1_REGISTER);
1863	vid2 = RD(AC97_VENDOR_ID2_REGISTER);
1864
1865	if (vid1 == 0xffff) {
1866		audio_dev_warn(d, "AC'97 codec unresponsive");
1867		return (-1);
1868	}
1869
1870	ac->vid = (vid1 << 16) | vid2;
1871
1872	/*
1873	 * Find out kind of codec we have and set any special case
1874	 * settings needed.
1875	 */
1876	for (int i = 0; codecs[i].id; i++) {
1877		if (ac->vid == codecs[i].id) {
1878			name = codecs[i].name;
1879			enh_bits = codecs[i].enh_bits;
1880			ac->codec_init = codecs[i].init;
1881			break;
1882		}
1883	}
1884	for (int i = 0; vendors[i].id; i++) {
1885		if ((ac->vid & 0xffffff00) == vendors[i].id) {
1886			vendor = vendors[i].name;
1887			break;
1888		}
1889	}
1890	if (name == NULL) {
1891		(void) snprintf(nmbuf, sizeof (nmbuf), "0x%04x%04x",
1892		    vid1, vid2);
1893		name = nmbuf;
1894	}
1895	if (vendor == NULL) {
1896		vendor = "Unknown";
1897	}
1898
1899	/*
1900	 * Populate the initial shadow table.
1901	 */
1902	for (int i = 0; i < LAST_SHADOW_REG; i += sizeof (uint16_t)) {
1903		SHADOW(ac, i) = RD(i);
1904	}
1905
1906	ac->caps = RD(AC97_RESET_REGISTER);
1907
1908	enh_bits = 4;
1909	vol_bits = 6;
1910	flags = 0;
1911
1912	/* detect the bit width of the master volume controls */
1913	WR(AC97_MASTER_VOLUME_REGISTER, 0x20);
1914	if ((RD(AC97_MASTER_VOLUME_REGISTER) & 0x1f) == 0x1f) {
1915		vol_bits = 5;
1916	}
1917
1918	/*
1919	 * AC'97 2.3 spec indicates three possible uses for AUX_OUT
1920	 * (aka LNLVL_OUT aka HP_OUT).  We have to figure out which one
1921	 * is in use.
1922	 */
1923	if (ac->caps & RR_HEADPHONE_SUPPORT) {
1924		/* it looks like it is probably headphones */
1925		if (ac97_probe_reg(ac, AC97_HEADPHONE_VOLUME_REGISTER)) {
1926			/* it is implemented */
1927			ac->flags |= AC97_FLAG_AUX_HP;
1928		}
1929	}
1930
1931	/*
1932	 * If not a headphone, is it 4CH_OUT (surround?)
1933	 */
1934	if ((!(ac->flags & AC97_FLAG_AUX_HP)) &&
1935	    (RD(AC97_EXTENDED_AUDIO_REGISTER) & EAR_SDAC)) {
1936		if (ac97_probe_reg(ac, AC97_EXTENDED_LRS_VOLUME_REGISTER)) {
1937			ac->flags |= AC97_FLAG_AUX_4CH;
1938		}
1939	}
1940
1941	/*
1942	 * If neither, then maybe its an auxiliary line level output?
1943	 */
1944	if (!(ac->flags & (AC97_FLAG_AUX_HP | AC97_FLAG_AUX_4CH))) {
1945		if (ac97_probe_reg(ac, AC97_HEADPHONE_VOLUME_REGISTER)) {
1946			ac->flags |= AC97_FLAG_AUX_LVL;
1947		}
1948	}
1949
1950	ac->flags |= flags;
1951	(void) snprintf(ac->name, sizeof (ac->name), "%s %s", vendor, name);
1952
1953	(void) snprintf(buf, sizeof (buf), "AC'97 codec: %s", ac->name);
1954	audio_dev_add_info(d, buf);
1955
1956	cmn_err(CE_CONT, "?%s#%d: AC'97 codec id %s (%x, caps %x)\n",
1957	    ddi_driver_name(ac->dip), ddi_get_instance(ac->dip),
1958	    ac->name, ac->vid, ac->caps);
1959
1960	/*
1961	 * Probe and register all known controls with framework
1962	 */
1963	if (ac97_probeinit_ctrls(ac, vol_bits, enh_bits)) {
1964		audio_dev_warn(d, "AC97 controls init failed");
1965
1966		/* XXX - need to free all controls registered? */
1967		return (-1);
1968	}
1969
1970	ac97_hw_reset(ac);
1971	ac97_init_values(ac);
1972
1973	return (0);
1974}
1975