xref: /illumos-gate/usr/src/uts/common/io/audio/drv/audio810/audio810.c (revision b8767451d156f585534afac0bf22721810d0dc63)
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 2010 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 
27 /*
28  * audio810 Audio Driver
29  *
30  * The driver is primarily targeted at providing audio support for the
31  * Intel ICHx family of AC'97 controllers and compatible parts (such
32  * as those from nVidia and AMD.)
33  *
34  * These audio parts have independent channels for PCM in, PCM out,
35  * mic in, and sometimes modem in, and modem out.  The AC'97
36  * controller is a PCI bus master with scatter/gather support. Each
37  * channel has a DMA engine. Currently, we use only the PCM in and PCM
38  * out channels. Each DMA engine uses one buffer descriptor list. And
39  * the buffer descriptor list is an array of up to 32 entries, each of
40  * which describes a data buffer.  Each entry contains a pointer to a
41  * data buffer, control bits, and the length of the buffer being
42  * pointed to, where the length is expressed as the number of
43  * samples. This, combined with the 16-bit sample size, gives the
44  * actual physical length of the buffer.
45  *
46  * A workaround for the AD1980 and AD1985 codec:
47  *	Most vendors connect the surr-out of the codecs to the line-out jack.
48  *	So far we haven't found which vendors don't do that. So we assume that
49  *	all vendors swap the surr-out and the line-out outputs. So we need swap
50  *	the two outputs. But we still internally process the
51  *	"ad198x-swap-output" property. If someday some vendors do not swap the
52  *	outputs, we would set "ad198x-swap-output = 0" in the
53  *	/kernel/drv/audio810.conf file, and unload and reload the audio810
54  *	driver (or reboot).
55  *
56  * 	NOTE:
57  * 	This driver depends on the drv/audio and misc/ac97
58  * 	modules being loaded first.
59  *
60  * The audio framework guarantees that our entry points are exclusive
61  * with suspend and resume.  This includes data flow and control entry
62  * points alike.
63  *
64  * The audio framework guarantees that only one control is being
65  * accessed on any given audio device at a time.
66  *
67  * The audio framework guarantees that entry points are themselves
68  * serialized for a given engine.
69  *
70  * We have no interrupt routine or other internal asynchronous routines.
71  *
72  * Our device uses completely separate registers for each engine,
73  * except for the start/stop registers, which are implemented in a
74  * manner that allows for them to be accessed concurrently safely from
75  * different threads.
76  *
77  * Hence, it turns out that we simply don't need any locking in this
78  * driver.
79  */
80 #include <sys/types.h>
81 #include <sys/modctl.h>
82 #include <sys/kmem.h>
83 #include <sys/conf.h>
84 #include <sys/ddi.h>
85 #include <sys/sunddi.h>
86 #include <sys/pci.h>
87 #include <sys/note.h>
88 #include <sys/audio/audio_driver.h>
89 #include <sys/audio/ac97.h>
90 #include "audio810.h"
91 
92 /*
93  * Module linkage routines for the kernel
94  */
95 static int audio810_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
96 static int audio810_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
97 static int audio810_ddi_quiesce(dev_info_t *);
98 
99 /*
100  * Entry point routine prototypes
101  */
102 static int audio810_open(void *, int, unsigned *, caddr_t *);
103 static void audio810_close(void *);
104 static int audio810_start(void *);
105 static void audio810_stop(void *);
106 static int audio810_format(void *);
107 static int audio810_channels(void *);
108 static int audio810_rate(void *);
109 static uint64_t audio810_count(void *);
110 static void audio810_sync(void *, unsigned);
111 static unsigned audio810_playahead(void *);
112 
113 static audio_engine_ops_t audio810_engine_ops = {
114 	AUDIO_ENGINE_VERSION,
115 	audio810_open,
116 	audio810_close,
117 	audio810_start,
118 	audio810_stop,
119 	audio810_count,
120 	audio810_format,
121 	audio810_channels,
122 	audio810_rate,
123 	audio810_sync,
124 	NULL,
125 	NULL,
126 	audio810_playahead
127 };
128 
129 /*
130  * Local Routine Prototypes
131  */
132 static int audio810_attach(dev_info_t *);
133 static int audio810_resume(dev_info_t *);
134 static int audio810_detach(dev_info_t *);
135 static int audio810_suspend(dev_info_t *);
136 
137 static int audio810_alloc_port(audio810_state_t *, int, uint8_t);
138 static int audio810_codec_sync(audio810_state_t *);
139 static void audio810_write_ac97(void *, uint8_t, uint16_t);
140 static uint16_t audio810_read_ac97(void *, uint8_t);
141 static int audio810_map_regs(dev_info_t *, audio810_state_t *);
142 static void audio810_unmap_regs(audio810_state_t *);
143 static void audio810_stop_dma(audio810_state_t *);
144 static int audio810_chip_init(audio810_state_t *);
145 static void audio810_set_channels(audio810_state_t *);
146 static void audio810_destroy(audio810_state_t *);
147 
148 /*
149  * Global variables, but used only by this file.
150  */
151 
152 /*
153  * DDI Structures
154  */
155 
156 /* Device operations structure */
157 static struct dev_ops audio810_dev_ops = {
158 	DEVO_REV,		/* devo_rev */
159 	0,			/* devo_refcnt */
160 	NULL,			/* devo_getinfo */
161 	nulldev,		/* devo_identify - obsolete */
162 	nulldev,		/* devo_probe */
163 	audio810_ddi_attach,	/* devo_attach */
164 	audio810_ddi_detach,	/* devo_detach */
165 	nodev,			/* devo_reset */
166 	NULL,			/* devi_cb_ops */
167 	NULL,			/* devo_bus_ops */
168 	NULL,			/* devo_power */
169 	audio810_ddi_quiesce,	/* devo_quiesce */
170 };
171 
172 /* Linkage structure for loadable drivers */
173 static struct modldrv audio810_modldrv = {
174 	&mod_driverops,		/* drv_modops */
175 	I810_MOD_NAME,		/* drv_linkinfo */
176 	&audio810_dev_ops,	/* drv_dev_ops */
177 };
178 
179 /* Module linkage structure */
180 static struct modlinkage audio810_modlinkage = {
181 	MODREV_1,			/* ml_rev */
182 	(void *)&audio810_modldrv,	/* ml_linkage */
183 	NULL				/* NULL terminates the list */
184 };
185 
186 /*
187  * device access attributes for register mapping
188  */
189 static struct ddi_device_acc_attr dev_attr = {
190 	DDI_DEVICE_ATTR_V0,
191 	DDI_STRUCTURE_LE_ACC,
192 	DDI_STRICTORDER_ACC
193 };
194 
195 static struct ddi_device_acc_attr buf_attr = {
196 	DDI_DEVICE_ATTR_V0,
197 	DDI_STRUCTURE_LE_ACC,
198 	DDI_STRICTORDER_ACC
199 };
200 
201 /*
202  * DMA attributes of buffer descriptor list
203  */
204 static ddi_dma_attr_t	bdlist_dma_attr = {
205 	DMA_ATTR_V0,	/* version */
206 	0,		/* addr_lo */
207 	0xffffffff,	/* addr_hi */
208 	0x0000ffff,	/* count_max */
209 	8,		/* align, BDL must be aligned on a 8-byte boundary */
210 	0x3c,		/* burstsize */
211 	8,		/* minxfer, set to the size of a BDlist entry */
212 	0x0000ffff,	/* maxxfer */
213 	0x00000fff,	/* seg, set to the RAM pagesize of intel platform */
214 	1,		/* sgllen, there's no scatter-gather list */
215 	8,		/* granular, set to the value of minxfer */
216 	0		/* flags, use virtual address */
217 };
218 
219 /*
220  * DMA attributes of buffers to be used to receive/send audio data
221  */
222 static ddi_dma_attr_t	sample_buf_dma_attr = {
223 	DMA_ATTR_V0,
224 	0,		/* addr_lo */
225 	0xffffffff,	/* addr_hi */
226 	0x0001ffff,	/* count_max */
227 	4,		/* align, data buffer is aligned on a 4-byte boundary */
228 	0x3c,		/* burstsize */
229 	4,		/* minxfer, set to the size of a sample data */
230 	0x0001ffff,	/* maxxfer */
231 	0x0001ffff,	/* seg */
232 	1,		/* sgllen, no scatter-gather */
233 	4,		/* granular, set to the value of minxfer */
234 	0,		/* flags, use virtual address */
235 };
236 
237 /*
238  * _init()
239  *
240  * Description:
241  *	Driver initialization, called when driver is first loaded.
242  *	This is how access is initially given to all the static structures.
243  *
244  * Arguments:
245  *	None
246  *
247  * Returns:
248  *	mod_install() status, see mod_install(9f)
249  */
250 int
251 _init(void)
252 {
253 	int	error;
254 
255 	audio_init_ops(&audio810_dev_ops, I810_NAME);
256 
257 	if ((error = mod_install(&audio810_modlinkage)) != 0) {
258 		audio_fini_ops(&audio810_dev_ops);
259 	}
260 
261 	return (error);
262 }
263 
264 /*
265  * _fini()
266  *
267  * Description:
268  *	Module de-initialization, called when the driver is to be unloaded.
269  *
270  * Arguments:
271  *	None
272  *
273  * Returns:
274  *	mod_remove() status, see mod_remove(9f)
275  */
276 int
277 _fini(void)
278 {
279 	int		error;
280 
281 	if ((error = mod_remove(&audio810_modlinkage)) != 0) {
282 		return (error);
283 	}
284 
285 	/* clean up ops */
286 	audio_fini_ops(&audio810_dev_ops);
287 
288 	return (0);
289 }
290 
291 /*
292  * _info()
293  *
294  * Description:
295  *	Module information, returns information about the driver.
296  *
297  * Arguments:
298  *	modinfo		*modinfop	Pointer to the opaque modinfo structure
299  *
300  * Returns:
301  *	mod_info() status, see mod_info(9f)
302  */
303 int
304 _info(struct modinfo *modinfop)
305 {
306 	return (mod_info(&audio810_modlinkage, modinfop));
307 }
308 
309 
310 /* ******************* Driver Entry Points ********************************* */
311 
312 /*
313  * audio810_ddi_attach()
314  *
315  * Description:
316  *	Implements the DDI attach(9e) entry point.
317  *
318  * Arguments:
319  *	dev_info_t	*dip	Pointer to the device's dev_info struct
320  *	ddi_attach_cmd_t cmd	Attach command
321  *
322  * Returns:
323  *	DDI_SUCCESS		The driver was initialized properly
324  *	DDI_FAILURE		The driver couldn't be initialized properly
325  */
326 static int
327 audio810_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
328 {
329 	switch (cmd) {
330 	case DDI_ATTACH:
331 		return (audio810_attach(dip));
332 
333 	case DDI_RESUME:
334 		return (audio810_resume(dip));
335 	}
336 	return (DDI_FAILURE);
337 }
338 
339 /*
340  * audio810_ddi_detach()
341  *
342  * Description:
343  *	Implements the detach(9e) entry point.
344  *
345  * Arguments:
346  *	dev_info_t		*dip	Pointer to the device's dev_info struct
347  *	ddi_detach_cmd_t	cmd	Detach command
348  *
349  * Returns:
350  *	DDI_SUCCESS	The driver was detached
351  *	DDI_FAILURE	The driver couldn't be detached
352  */
353 static int
354 audio810_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
355 {
356 	switch (cmd) {
357 	case DDI_DETACH:
358 		return (audio810_detach(dip));
359 
360 	case DDI_SUSPEND:
361 		return (audio810_suspend(dip));
362 	}
363 	return (DDI_FAILURE);
364 }
365 
366 /*
367  * audio810_ddi_quiesce()
368  *
369  * Description:
370  *	Implements the quiesce(9e) entry point.
371  *
372  * Arguments:
373  *	dev_info_t		*dip	Pointer to the device's dev_info struct
374  *
375  * Returns:
376  *	DDI_SUCCESS	The driver was quiesced
377  *	DDI_FAILURE	The driver couldn't be quiesced
378  */
379 static int
380 audio810_ddi_quiesce(dev_info_t *dip)
381 {
382 	audio810_state_t	*statep;
383 
384 	if ((statep = ddi_get_driver_private(dip)) == NULL)
385 		return (DDI_FAILURE);
386 
387 	audio810_stop_dma(statep);
388 	return (DDI_SUCCESS);
389 }
390 
391 /*
392  * audio810_open()
393  *
394  * Description:
395  *	Opens a DMA engine for use.
396  *
397  * Arguments:
398  *	void		*arg		The DMA engine to set up
399  *	int		flag		Open flags
400  *	unsigned	*nframes	Receives total number of frames
401  *	caddr_t		*bufp		Receives kernel data buffer
402  *
403  * Returns:
404  *	0	on success
405  *	errno	on failure
406  */
407 static int
408 audio810_open(void *arg, int flag, unsigned *nframes, caddr_t *bufp)
409 {
410 	audio810_port_t	*port = arg;
411 
412 	_NOTE(ARGUNUSED(flag));
413 
414 	port->count = 0;
415 	*nframes = port->samp_frames;
416 	*bufp = port->samp_kaddr;
417 
418 	return (0);
419 }
420 
421 /*
422  * audio810_close()
423  *
424  * Description:
425  *	Closes an audio DMA engine that was previously opened.  Since
426  *	nobody is using it, we take this opportunity to possibly power
427  *	down the entire device.
428  *
429  * Arguments:
430  *	void	*arg		The DMA engine to shut down
431  */
432 static void
433 audio810_close(void *arg)
434 {
435 	_NOTE(ARGUNUSED(arg));
436 }
437 
438 /*
439  * audio810_stop()
440  *
441  * Description:
442  *	This is called by the framework to stop a port that is
443  *	transferring data.
444  *
445  * Arguments:
446  *	void	*arg		The DMA engine to stop
447  */
448 static void
449 audio810_stop(void *arg)
450 {
451 	audio810_port_t		*port = arg;
452 	audio810_state_t	*statep = port->statep;
453 	uint8_t			cr;
454 
455 	cr = I810_BM_GET8(port->regoff + I810_OFFSET_CR);
456 	cr &= ~I810_BM_CR_RUN;
457 	I810_BM_PUT8(port->regoff + I810_OFFSET_CR, cr);
458 }
459 
460 /*
461  * audio810_start()
462  *
463  * Description:
464  *	This is called by the framework to start a port transferring data.
465  *
466  * Arguments:
467  *	void	*arg		The DMA engine to start
468  *
469  * Returns:
470  *	0 	on success (never fails, errno if it did)
471  */
472 static int
473 audio810_start(void *arg)
474 {
475 	audio810_port_t		*port = arg;
476 	audio810_state_t	*statep = port->statep;
477 	uint8_t			regoff, cr;
478 
479 	regoff = port->regoff;
480 	port->offset = 0;
481 
482 	/* program multiple channel settings */
483 	if (port->num == I810_PCM_OUT) {
484 		audio810_set_channels(statep);
485 
486 		if (statep->quirk == QUIRK_SIS7012) {
487 			/*
488 			 * SiS 7012 has special unmute bit.
489 			 */
490 			I810_BM_PUT8(I810_REG_SISCTL, I810_SISCTL_UNMUTE);
491 		}
492 	}
493 
494 	/*
495 	 * Perform full reset of the engine, but leave it turned off.
496 	 */
497 	I810_BM_PUT8(regoff + I810_OFFSET_CR, 0);
498 	I810_BM_PUT8(regoff + I810_OFFSET_CR, I810_BM_CR_RST);
499 
500 	/* program the offset of the BD list */
501 	I810_BM_PUT32(regoff + I810_OFFSET_BD_BASE, port->bdl_paddr);
502 
503 	/* we set the last index to the full count -- all buffers are valid */
504 	I810_BM_PUT8(regoff + I810_OFFSET_LVI, I810_BD_NUMS - 1);
505 
506 	cr = I810_BM_GET8(regoff + I810_OFFSET_CR);
507 	cr |= I810_BM_CR_RUN;
508 	I810_BM_PUT8(regoff + I810_OFFSET_CR, cr);
509 
510 	(void) I810_BM_GET8(regoff + I810_OFFSET_CR);
511 
512 	return (0);
513 }
514 
515 /*
516  * audio810_format()
517  *
518  * Description:
519  *	This is called by the framework to query the format of the device.
520  *
521  * Arguments:
522  *	void	*arg		The DMA engine to query
523  *
524  * Returns:
525  *	Format of the device (fixed at AUDIO_FORMAT_S16_LE)
526  */
527 static int
528 audio810_format(void *arg)
529 {
530 	_NOTE(ARGUNUSED(arg));
531 
532 	return (AUDIO_FORMAT_S16_LE);
533 }
534 
535 /*
536  * audio810_channels()
537  *
538  * Description:
539  *	This is called by the framework to query the num channels of
540  *	the device.
541  *
542  * Arguments:
543  *	void	*arg		The DMA engine to query
544  *
545  * Returns:
546  *	0 number of channels for device
547  */
548 static int
549 audio810_channels(void *arg)
550 {
551 	audio810_port_t	*port = arg;
552 
553 	return (port->nchan);
554 }
555 
556 /*
557  * audio810_rate()
558  *
559  * Description:
560  *	This is called by the framework to query the rate of the device.
561  *
562  * Arguments:
563  *	void	*arg		The DMA engine to query
564  *
565  * Returns:
566  *	Rate of device (fixed at 48000 Hz)
567  */
568 static int
569 audio810_rate(void *arg)
570 {
571 	_NOTE(ARGUNUSED(arg));
572 
573 	return (48000);
574 }
575 
576 /*
577  * audio810_count()
578  *
579  * Description:
580  *	This is called by the framework to get the engine's frame counter
581  *
582  * Arguments:
583  *	void	*arg		The DMA engine to query
584  *
585  * Returns:
586  *	frame count for current engine
587  */
588 static uint64_t
589 audio810_count(void *arg)
590 {
591 	audio810_port_t		*port = arg;
592 	audio810_state_t	*statep = port->statep;
593 	uint8_t			regoff = port->regoff;
594 	uint64_t		val;
595 	uint32_t		offset;
596 	uint8_t			civ;
597 
598 	/*
599 	 * Read the position counters.  We also take this opportunity
600 	 * to update the last valid index to the one just previous to
601 	 * the one we're working on (so we'll fully loop.)
602 	 */
603 	offset = I810_BM_GET16(port->picboff);
604 	civ = I810_BM_GET8(regoff + I810_OFFSET_CIV);
605 	I810_BM_PUT8(port->regoff + I810_OFFSET_LVI, (civ - 1) % I810_BD_NUMS);
606 
607 	/* SiS counts in bytes, all others in words. */
608 	if (statep->quirk != QUIRK_SIS7012)
609 		offset *= 2;
610 
611 	/* counter is reversed */
612 	offset = port->samp_size - offset;
613 
614 	if (offset < port->offset) {
615 		val = (port->samp_size - port->offset) + offset;
616 	} else {
617 		val = offset - port->offset;
618 	}
619 	port->offset = offset;
620 	port->count += (val / (port->nchan * 2));
621 	val = port->count;
622 
623 	return (val);
624 }
625 
626 /*
627  * audio810_sync()
628  *
629  * Description:
630  *	This is called by the framework to synchronize DMA caches.
631  *
632  * Arguments:
633  *	void	*arg		The DMA engine to sync
634  */
635 static void
636 audio810_sync(void *arg, unsigned nframes)
637 {
638 	audio810_port_t *port = arg;
639 	_NOTE(ARGUNUSED(nframes));
640 
641 	(void) ddi_dma_sync(port->samp_dmah, 0, 0, port->sync_dir);
642 }
643 
644 /*
645  * audio810_playahead()
646  *
647  * Description:
648  *	This is called by the framework to determine how much data it
649  *	should queue up.  We desire a deeper playahead than most to
650  *	allow for virtualized devices which have less "regular"
651  *	interrupt scheduling.
652  *
653  * Arguments:
654  *	void	*arg		The DMA engine to query
655  *
656  * Returns:
657  *	Play ahead in frames.
658  */
659 static unsigned
660 audio810_playahead(void *arg)
661 {
662 	audio810_port_t *port = arg;
663 	audio810_state_t	*statep = port->statep;
664 
665 	/* Older ICH is likely to be emulated, deeper (40 ms) playahead */
666 	return (statep->quirk == QUIRK_OLDICH ? 1920 : 0);
667 }
668 
669 
670 
671 /* *********************** Local Routines *************************** */
672 
673 /*
674  * audio810_attach()
675  *
676  * Description:
677  *	Attach an instance of the audio810 driver. This routine does the
678  * 	device dependent attach tasks, and registers with the audio framework.
679  *
680  * Arguments:
681  *	dev_info_t	*dip	Pointer to the device's dev_info struct
682  *	ddi_attach_cmd_t cmd	Attach command
683  *
684  * Returns:
685  *	DDI_SUCCESS		The driver was initialized properly
686  *	DDI_FAILURE		The driver couldn't be initialized properly
687  */
688 static int
689 audio810_attach(dev_info_t *dip)
690 {
691 	uint16_t		cmdreg;
692 	audio810_state_t	*statep;
693 	audio_dev_t		*adev;
694 	ddi_acc_handle_t	pcih;
695 	uint32_t		devid;
696 	uint32_t		gsr;
697 	const char		*name;
698 	const char		*vers;
699 	uint8_t			nch;
700 	int			maxch;
701 
702 	/* allocate the soft state structure */
703 	statep = kmem_zalloc(sizeof (*statep), KM_SLEEP);
704 	ddi_set_driver_private(dip, statep);
705 
706 	if ((adev = audio_dev_alloc(dip, 0)) == NULL) {
707 		cmn_err(CE_WARN, "!%s%d: unable to allocate audio dev",
708 		    ddi_driver_name(dip), ddi_get_instance(dip));
709 		goto error;
710 	}
711 	statep->adev = adev;
712 	statep->dip = dip;
713 
714 	/* map in the registers, allocate DMA buffers, etc. */
715 	if (audio810_map_regs(dip, statep) != DDI_SUCCESS) {
716 		audio_dev_warn(adev, "couldn't map registers");
717 		goto error;
718 	}
719 
720 	/* set PCI command register */
721 	if (pci_config_setup(dip, &pcih) != DDI_SUCCESS) {
722 		audio_dev_warn(adev, "pci conf mapping failed");
723 		goto error;
724 	}
725 	cmdreg = pci_config_get16(pcih, PCI_CONF_COMM);
726 	pci_config_put16(pcih, PCI_CONF_COMM,
727 	    cmdreg | PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
728 	devid = pci_config_get16(pcih, PCI_CONF_VENID);
729 	devid <<= 16;
730 	devid |= pci_config_get16(pcih, PCI_CONF_DEVID);
731 	pci_config_teardown(&pcih);
732 
733 	name = "Unknown AC'97";
734 	vers = "";
735 
736 	statep->quirk = QUIRK_NONE;
737 	switch (devid) {
738 	case 0x80862415:
739 		name = "Intel AC'97";
740 		vers = "ICH";
741 		statep->quirk = QUIRK_OLDICH;
742 		break;
743 	case 0x80862425:
744 		name = "Intel AC'97";
745 		vers = "ICH0";
746 		break;
747 	case 0x80867195:
748 		name = "Intel AC'97";
749 		vers = "440MX";
750 		break;
751 	case 0x80862445:
752 		name = "Intel AC'97";
753 		vers = "ICH2";
754 		break;
755 	case 0x80862485:
756 		name = "Intel AC'97";
757 		vers = "ICH3";
758 		break;
759 	case 0x808624C5:
760 		name = "Intel AC'97";
761 		vers = "ICH4";
762 		break;
763 	case 0x808624D5:
764 		name = "Intel AC'97";
765 		vers = "ICH5";
766 		break;
767 	case 0x8086266E:
768 		name = "Intel AC'97";
769 		vers = "ICH6";
770 		break;
771 	case 0x808627DE:
772 		name = "Intel AC'97";
773 		vers = "ICH7";
774 		break;
775 	case 0x808625A6:
776 		name = "Intel AC'97";
777 		vers = "6300ESB";
778 		break;
779 	case 0x80862698:
780 		name = "Intel AC'97";
781 		vers = "ESB2";
782 		break;
783 	case 0x10397012:
784 		name = "SiS AC'97";
785 		vers = "7012";
786 		statep->quirk = QUIRK_SIS7012;
787 		break;
788 	case 0x10de01b1:	/* nForce */
789 		name = "NVIDIA AC'97";
790 		vers = "MCP1";
791 		break;
792 	case 0x10de006a:	/* nForce 2 */
793 		name = "NVIDIA AC'97";
794 		vers = "MCP2";
795 		break;
796 	case 0x10de00da:	/* nForce 3 */
797 		name = "NVIDIA AC'97";
798 		vers = "MCP3";
799 		break;
800 	case 0x10de00ea:
801 		name = "NVIDIA AC'97";
802 		vers = "CK8S";
803 		break;
804 	case 0x10de0059:
805 		name = "NVIDIA AC'97";
806 		vers = "CK804";
807 		break;
808 	case 0x10de008a:
809 		name = "NVIDIA AC'97";
810 		vers = "CK8";
811 		break;
812 	case 0x10de003a:	/* nForce 4 */
813 		name = "NVIDIA AC'97";
814 		vers = "MCP4";
815 		break;
816 	case 0x10de026b:
817 		name = "NVIDIA AC'97";
818 		vers = "MCP51";
819 		break;
820 	case 0x1022746d:
821 		name = "AMD AC'97";
822 		vers = "8111";
823 		break;
824 	case 0x10227445:
825 		name = "AMD AC'97";
826 		vers = "AMD768";
827 		break;
828 	}
829 	/* set device information */
830 	audio_dev_set_description(adev, name);
831 	audio_dev_set_version(adev, vers);
832 
833 	/* initialize audio controller and AC97 codec */
834 	if (audio810_chip_init(statep) != DDI_SUCCESS) {
835 		audio_dev_warn(adev, "failed to init chip");
836 		goto error;
837 	}
838 
839 	/* allocate ac97 handle */
840 	statep->ac97 = ac97_alloc(dip, audio810_read_ac97, audio810_write_ac97,
841 	    statep);
842 	if (statep->ac97 == NULL) {
843 		audio_dev_warn(adev, "failed to allocate ac97 handle");
844 		goto error;
845 	}
846 
847 	/* initialize the AC'97 part */
848 	if (ac97_init(statep->ac97, adev) != DDI_SUCCESS) {
849 		audio_dev_warn(adev, "ac'97 initialization failed");
850 		goto error;
851 	}
852 
853 	/*
854 	 * Override "max-channels" property to prevent configuration
855 	 * of 4 or 6 (or possibly even 8!) channel audio.  The default
856 	 * is to support as many channels as the hardware can do.
857 	 *
858 	 * (Hmmm... perhaps this should be driven in the common
859 	 * framework.  The framework could even offer simplistic upmix
860 	 * and downmix for various standard configs.)
861 	 */
862 	maxch = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
863 	    "max-channels", ac97_num_channels(statep->ac97));
864 	if (maxch < 2) {
865 		maxch = 2;
866 	}
867 
868 	gsr = I810_BM_GET32(I810_REG_GSR);
869 	if (gsr & I810_GSR_CAP6CH) {
870 		nch = 6;
871 	} else if (gsr & I810_GSR_CAP4CH) {
872 		nch = 4;
873 	} else {
874 		nch = 2;
875 	}
876 
877 	statep->maxch = (uint8_t)min(nch, maxch);
878 	statep->maxch &= ~1;
879 
880 	/* allocate port structures */
881 	if ((audio810_alloc_port(statep, I810_PCM_OUT, statep->maxch) !=
882 	    DDI_SUCCESS) ||
883 	    (audio810_alloc_port(statep, I810_PCM_IN, 2) != DDI_SUCCESS)) {
884 		goto error;
885 	}
886 
887 	if (audio_dev_register(adev) != DDI_SUCCESS) {
888 		audio_dev_warn(adev, "unable to register with framework");
889 		goto error;
890 	}
891 
892 	ddi_report_dev(dip);
893 
894 	return (DDI_SUCCESS);
895 
896 error:
897 	audio810_destroy(statep);
898 
899 	return (DDI_FAILURE);
900 }
901 
902 
903 /*
904  * audio810_resume()
905  *
906  * Description:
907  *	Resume operation of the device after sleeping or hibernating.
908  *	Note that this should never fail, even if hardware goes wonky,
909  *	because the current PM framework will panic if it does.
910  *
911  * Arguments:
912  *	dev_info_t	*dip	Pointer to the device's dev_info struct
913  *
914  * Returns:
915  *	DDI_SUCCESS		The driver was resumed.
916  */
917 static int
918 audio810_resume(dev_info_t *dip)
919 {
920 	audio810_state_t	*statep;
921 	audio_dev_t		*adev;
922 
923 	/* this should always be valid */
924 	statep = ddi_get_driver_private(dip);
925 	adev = statep->adev;
926 
927 	ASSERT(statep != NULL);
928 	ASSERT(dip == statep->dip);
929 
930 	/* Restore the audio810 chip's state */
931 	if (audio810_chip_init(statep) != DDI_SUCCESS) {
932 		/*
933 		 * Note that PM gurus say we should return success
934 		 * here.  Failure of audio shouldn't be considered
935 		 * FATAL to the system.
936 		 *
937 		 * It turns out that the only way that the
938 		 * audio810_chip_init fails is that the codec won't
939 		 * re-initialize.  Audio streams may or may not make
940 		 * progress; setting changes may or may not have the
941 		 * desired effect.  What we'd really to do at this
942 		 * point is use FMA to offline the part.  In the
943 		 * meantime, we just muddle on logging the error.
944 		 *
945 		 * Note that returning from this routine without
946 		 * allowing the audio_dev_resume() to take place can
947 		 * have bad effects, as the framework does not know
948 		 * what to do in the event of a failure of this
949 		 * nature.  (It may be unsafe to call ENG_CLOSE(), for
950 		 * example.)
951 		 */
952 		audio_dev_warn(adev, "failure to resume codec");
953 	}
954 
955 	/* Reset the AC'97 codec. */
956 	ac97_reset(statep->ac97);
957 
958 	/* And let the framework know we're ready for business again. */
959 	audio_dev_resume(statep->adev);
960 
961 	return (DDI_SUCCESS);
962 }
963 
964 /*
965  * audio810_detach()
966  *
967  * Description:
968  *	Detach an instance of the audio810 driver.
969  *
970  * Arguments:
971  *	dev_info_t		*dip	Pointer to the device's dev_info struct
972  *
973  * Returns:
974  *	DDI_SUCCESS	The driver was detached
975  *	DDI_FAILURE	The driver couldn't be detached
976  */
977 static int
978 audio810_detach(dev_info_t *dip)
979 {
980 	audio810_state_t	*statep;
981 
982 	statep = ddi_get_driver_private(dip);
983 	ASSERT(statep != NULL);
984 
985 	/* don't detach us if we are still in use */
986 	if (audio_dev_unregister(statep->adev) != DDI_SUCCESS) {
987 		return (DDI_FAILURE);
988 	}
989 
990 	audio810_destroy(statep);
991 	return (DDI_SUCCESS);
992 }
993 
994 /*
995  * audio810_suspend()
996  *
997  * Description:
998  *	Suspend an instance of the audio810 driver, in preparation for
999  *	sleep or hibernation.
1000  *
1001  * Arguments:
1002  *	dev_info_t		*dip	Pointer to the device's dev_info struct
1003  *
1004  * Returns:
1005  *	DDI_SUCCESS	The driver was suspended
1006  */
1007 static int
1008 audio810_suspend(dev_info_t *dip)
1009 {
1010 	audio810_state_t	*statep;
1011 
1012 	statep = ddi_get_driver_private(dip);
1013 	ASSERT(statep != NULL);
1014 
1015 	audio_dev_suspend(statep->adev);
1016 
1017 	/* stop DMA engines - should be redundant (paranoia) */
1018 	audio810_stop_dma(statep);
1019 
1020 	return (DDI_SUCCESS);
1021 }
1022 
1023 /*
1024  * audio810_alloc_port()
1025  *
1026  * Description:
1027  *	This routine allocates the DMA handles and the memory for the
1028  *	DMA engines to use.  It also configures the BDL lists properly
1029  *	for use.
1030  *
1031  * Arguments:
1032  *	dev_info_t	*dip	Pointer to the device's devinfo
1033  *
1034  * Returns:
1035  *	DDI_SUCCESS		Registers successfully mapped
1036  *	DDI_FAILURE		Registers not successfully mapped
1037  */
1038 static int
1039 audio810_alloc_port(audio810_state_t *statep, int num, uint8_t nchan)
1040 {
1041 	ddi_dma_cookie_t	cookie;
1042 	uint_t			count;
1043 	int			dir;
1044 	unsigned		caps;
1045 	audio_dev_t		*adev;
1046 	audio810_port_t		*port;
1047 	int			rc;
1048 	dev_info_t		*dip;
1049 	i810_bd_entry_t		*bdentry;
1050 
1051 	adev = statep->adev;
1052 	dip = statep->dip;
1053 
1054 	port = kmem_zalloc(sizeof (*port), KM_SLEEP);
1055 	statep->ports[num] = port;
1056 	port->statep = statep;
1057 	port->nchan = nchan;
1058 	port->num = num;
1059 
1060 	switch (num) {
1061 	case I810_PCM_IN:
1062 		dir = DDI_DMA_READ;
1063 		caps = ENGINE_INPUT_CAP;
1064 		port->sync_dir = DDI_DMA_SYNC_FORKERNEL;
1065 		port->regoff = I810_BASE_PCM_IN;
1066 		break;
1067 	case I810_PCM_OUT:
1068 		dir = DDI_DMA_WRITE;
1069 		caps = ENGINE_OUTPUT_CAP;
1070 		port->sync_dir = DDI_DMA_SYNC_FORDEV;
1071 		port->regoff = I810_BASE_PCM_OUT;
1072 		break;
1073 	default:
1074 		audio_dev_warn(adev, "bad port number (%d)!", num);
1075 		return (DDI_FAILURE);
1076 	}
1077 
1078 	/*
1079 	 * SiS 7012 swaps status and picb registers.
1080 	 */
1081 	if (statep->quirk == QUIRK_SIS7012) {
1082 		port->stsoff = port->regoff + I810_OFFSET_PICB;
1083 		port->picboff = port->regoff + I810_OFFSET_SR;
1084 	} else {
1085 		port->stsoff = port->regoff + I810_OFFSET_SR;
1086 		port->picboff = port->regoff + I810_OFFSET_PICB;
1087 	}
1088 
1089 	/*
1090 	 * We use one big sample area.  The sample area must be larger
1091 	 * than about 1.5 framework fragment sizes.  (Currently 480 *
1092 	 * 1.5 = 720 frames.)  This is necessary to ensure that we
1093 	 * don't have to involve an interrupt service routine on our
1094 	 * own, to keep the last valid index updated reasonably.
1095 	 */
1096 	port->samp_frames = 4096;
1097 	port->samp_size = port->samp_frames * port->nchan * sizeof (int16_t);
1098 
1099 	/* allocate dma handle */
1100 	rc = ddi_dma_alloc_handle(dip, &sample_buf_dma_attr, DDI_DMA_SLEEP,
1101 	    NULL, &port->samp_dmah);
1102 	if (rc != DDI_SUCCESS) {
1103 		audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc);
1104 		return (DDI_FAILURE);
1105 	}
1106 	/* allocate DMA buffer */
1107 	rc = ddi_dma_mem_alloc(port->samp_dmah, port->samp_size, &buf_attr,
1108 	    DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->samp_kaddr,
1109 	    &port->samp_size, &port->samp_acch);
1110 	if (rc == DDI_FAILURE) {
1111 		audio_dev_warn(adev, "dma_mem_alloc (%d) failed: %d",
1112 		    port->samp_size, rc);
1113 		return (DDI_FAILURE);
1114 	}
1115 
1116 	/* bind DMA buffer */
1117 	rc = ddi_dma_addr_bind_handle(port->samp_dmah, NULL,
1118 	    port->samp_kaddr, port->samp_size, dir|DDI_DMA_CONSISTENT,
1119 	    DDI_DMA_SLEEP, NULL, &cookie, &count);
1120 	if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
1121 		audio_dev_warn(adev,
1122 		    "ddi_dma_addr_bind_handle failed: %d", rc);
1123 		return (DDI_FAILURE);
1124 	}
1125 	port->samp_paddr = cookie.dmac_address;
1126 
1127 	/*
1128 	 * now, from here we allocate DMA memory for buffer descriptor list.
1129 	 * we allocate adjacent DMA memory for all DMA engines.
1130 	 */
1131 	rc = ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
1132 	    NULL, &port->bdl_dmah);
1133 	if (rc != DDI_SUCCESS) {
1134 		audio_dev_warn(adev, "ddi_dma_alloc_handle(bdlist) failed");
1135 		return (DDI_FAILURE);
1136 	}
1137 
1138 	/*
1139 	 * we allocate all buffer descriptors lists in continuous dma memory.
1140 	 */
1141 	port->bdl_size = sizeof (i810_bd_entry_t) * I810_BD_NUMS;
1142 	rc = ddi_dma_mem_alloc(port->bdl_dmah, port->bdl_size,
1143 	    &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
1144 	    &port->bdl_kaddr, &port->bdl_size, &port->bdl_acch);
1145 	if (rc != DDI_SUCCESS) {
1146 		audio_dev_warn(adev, "ddi_dma_mem_alloc(bdlist) failed");
1147 		return (DDI_FAILURE);
1148 	}
1149 
1150 	rc = ddi_dma_addr_bind_handle(port->bdl_dmah, NULL, port->bdl_kaddr,
1151 	    port->bdl_size, DDI_DMA_WRITE|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP,
1152 	    NULL, &cookie, &count);
1153 	if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
1154 		audio_dev_warn(adev, "addr_bind_handle failed");
1155 		return (DDI_FAILURE);
1156 	}
1157 	port->bdl_paddr = cookie.dmac_address;
1158 
1159 	/*
1160 	 * Wire up the BD list.
1161 	 */
1162 	bdentry = (void *)port->bdl_kaddr;
1163 	for (int i = 0; i < I810_BD_NUMS; i++) {
1164 
1165 		/* set base address of buffer */
1166 		ddi_put32(port->bdl_acch, &bdentry->buf_base,
1167 		    port->samp_paddr);
1168 		/* SiS 7012 counts in bytes, all others in words */
1169 		ddi_put16(port->bdl_acch, &bdentry->buf_len,
1170 		    statep->quirk == QUIRK_SIS7012 ? port->samp_size :
1171 		    port->samp_size / 2);
1172 		ddi_put16(port->bdl_acch, &bdentry->buf_cmd, BUF_CMD_BUP);
1173 
1174 		bdentry++;
1175 	}
1176 	(void) ddi_dma_sync(port->bdl_dmah, 0, 0, DDI_DMA_SYNC_FORDEV);
1177 
1178 	port->engine = audio_engine_alloc(&audio810_engine_ops, caps);
1179 	if (port->engine == NULL) {
1180 		audio_dev_warn(adev, "audio_engine_alloc failed");
1181 		return (DDI_FAILURE);
1182 	}
1183 
1184 	audio_engine_set_private(port->engine, port);
1185 	audio_dev_add_engine(adev, port->engine);
1186 
1187 	return (DDI_SUCCESS);
1188 }
1189 
1190 /*
1191  * audio810_free_port()
1192  *
1193  * Description:
1194  *	This routine unbinds the DMA cookies, frees the DMA buffers,
1195  *	deallocates the DMA handles.
1196  *
1197  * Arguments:
1198  *	audio810_port_t	*port	The port structure for a DMA engine.
1199  */
1200 static void
1201 audio810_free_port(audio810_port_t *port)
1202 {
1203 	if (port == NULL)
1204 		return;
1205 
1206 	if (port->engine) {
1207 		audio_dev_remove_engine(port->statep->adev, port->engine);
1208 		audio_engine_free(port->engine);
1209 	}
1210 	if (port->bdl_paddr) {
1211 		(void) ddi_dma_unbind_handle(port->bdl_dmah);
1212 	}
1213 	if (port->bdl_acch) {
1214 		ddi_dma_mem_free(&port->bdl_acch);
1215 	}
1216 	if (port->bdl_dmah) {
1217 		ddi_dma_free_handle(&port->bdl_dmah);
1218 	}
1219 	if (port->samp_paddr) {
1220 		(void) ddi_dma_unbind_handle(port->samp_dmah);
1221 	}
1222 	if (port->samp_acch) {
1223 		ddi_dma_mem_free(&port->samp_acch);
1224 	}
1225 	if (port->samp_dmah) {
1226 		ddi_dma_free_handle(&port->samp_dmah);
1227 	}
1228 	kmem_free(port, sizeof (*port));
1229 }
1230 
1231 /*
1232  * audio810_map_regs()
1233  *
1234  * Description:
1235  *	The registers are mapped in.
1236  *
1237  * Arguments:
1238  *	dev_info_t	*dip	Pointer to the device's devinfo
1239  *
1240  * Returns:
1241  *	DDI_SUCCESS		Registers successfully mapped
1242  *	DDI_FAILURE		Registers not successfully mapped
1243  */
1244 static int
1245 audio810_map_regs(dev_info_t *dip, audio810_state_t *statep)
1246 {
1247 	uint_t			nregs = 0;
1248 	int			*regs_list;
1249 	int			i;
1250 	int			pciBar1 = 0;
1251 	int			pciBar2 = 0;
1252 	int			pciBar3 = 0;
1253 	int			pciBar4 = 0;
1254 
1255 	/* check the "reg" property to get the length of memory-mapped I/O */
1256 	if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1257 	    "reg", (int **)&regs_list, &nregs) != DDI_PROP_SUCCESS) {
1258 		audio_dev_warn(statep->adev, "inquire regs property failed");
1259 		goto error;
1260 	}
1261 	/*
1262 	 * Some hardwares, such as Intel ICH0/ICH and AMD 8111, use PCI 0x10
1263 	 * and 0x14 BAR separately for native audio mixer BAR and native bus
1264 	 * mastering BAR. More advanced hardwares, such as Intel ICH4 and ICH5,
1265 	 * support PCI memory BAR, via PCI 0x18 and 0x1C BAR, that allows for
1266 	 * higher performance access to the controller register. All features
1267 	 * can be accessed via this BAR making the I/O BAR (PCI 0x10 and 0x14
1268 	 * BAR) capabilities obsolete. However, these controller maintain the
1269 	 * I/O BAR capability to allow for the reuse of legacy code maintaining
1270 	 * backward compatibility. The I/O BAR is disabled unless system BIOS
1271 	 * enables the simultaneous backward compatible capability on the 0x41
1272 	 * register.
1273 	 *
1274 	 * When I/O BAR is enabled, the value of "reg" property should be like
1275 	 * this,
1276 	 *	phys_hi   phys_mid  phys_lo   size_hi   size_lo
1277 	 * --------------------------------------------------------
1278 	 *	0000fd00  00000000  00000000  00000000  00000000
1279 	 *	0100fd10  00000000  00000000  00000000  00000100
1280 	 *	0100fd14  00000000  00000000  00000000  00000040
1281 	 *	0200fd18  00000000  00000000  00000000  00000200
1282 	 *	0200fd1c  00000000  00000000  00000000  00000100
1283 	 *
1284 	 * When I/O BAR is disabled, the "reg" property of the device node does
1285 	 * not consist of the description for the I/O BAR. The following example
1286 	 * illustrates the vaule of "reg" property,
1287 	 *
1288 	 *	phys_hi   phys_mid  phys_lo   size_hi   size_lo
1289 	 * --------------------------------------------------------
1290 	 *	0000fd00  00000000  00000000  00000000  00000000
1291 	 *	0200fd18  00000000  00000000  00000000  00000200
1292 	 *	0200fd1c  00000000  00000000  00000000  00000100
1293 	 *
1294 	 * If the hardware has memory-mapped I/O access, first try to use
1295 	 * this facility, otherwise we will try I/O access.
1296 	 */
1297 	for (i = 1; i < nregs/I810_INTS_PER_REG_PROP; i++) {
1298 		switch (regs_list[I810_INTS_PER_REG_PROP * i] & 0x000000ff) {
1299 			case 0x10:
1300 				pciBar1 = i;
1301 				break;
1302 			case 0x14:
1303 				pciBar2 = i;
1304 				break;
1305 			case 0x18:
1306 				pciBar3 = i;
1307 				break;
1308 			case 0x1c:
1309 				pciBar4 = i;
1310 				break;
1311 			default:	/* we don't care others */
1312 				break;
1313 		}
1314 	}
1315 
1316 	if ((pciBar3 != 0) && (pciBar4 != 0)) {
1317 		/* map audio mixer registers */
1318 		if ((ddi_regs_map_setup(dip, pciBar3, &statep->am_regs_base, 0,
1319 		    0, &dev_attr, &statep->am_regs_handle)) != DDI_SUCCESS) {
1320 			audio_dev_warn(statep->adev,
1321 			    "memory am mapping failed");
1322 			goto error;
1323 		}
1324 
1325 		/* map bus master register */
1326 		if ((ddi_regs_map_setup(dip, pciBar4, &statep->bm_regs_base, 0,
1327 		    0, &dev_attr, &statep->bm_regs_handle)) != DDI_SUCCESS) {
1328 			audio_dev_warn(statep->adev,
1329 			    "memory bm mapping failed");
1330 			goto error;
1331 		}
1332 
1333 	} else if ((pciBar1 != 0) && (pciBar2 != 0)) {
1334 		/* map audio mixer registers */
1335 		if ((ddi_regs_map_setup(dip, pciBar1, &statep->am_regs_base, 0,
1336 		    0, &dev_attr, &statep->am_regs_handle)) != DDI_SUCCESS) {
1337 			audio_dev_warn(statep->adev, "I/O am mapping failed");
1338 			goto error;
1339 		}
1340 
1341 		/* map bus master register */
1342 		if ((ddi_regs_map_setup(dip, pciBar2, &statep->bm_regs_base, 0,
1343 		    0, &dev_attr, &statep->bm_regs_handle)) != DDI_SUCCESS) {
1344 			audio_dev_warn(statep->adev, "I/O bm mapping failed");
1345 			goto error;
1346 		}
1347 	} else {
1348 		audio_dev_warn(statep->adev, "map_regs() pci BAR error");
1349 		goto error;
1350 	}
1351 
1352 	ddi_prop_free(regs_list);
1353 
1354 	return (DDI_SUCCESS);
1355 
1356 error:
1357 	if (nregs > 0) {
1358 		ddi_prop_free(regs_list);
1359 	}
1360 	audio810_unmap_regs(statep);
1361 
1362 	return (DDI_FAILURE);
1363 }
1364 
1365 /*
1366  * audio810_unmap_regs()
1367  *
1368  * Description:
1369  *	This routine unmaps control registers.
1370  *
1371  * Arguments:
1372  *	audio810_state_t	*state	The device's state structure
1373  */
1374 static void
1375 audio810_unmap_regs(audio810_state_t *statep)
1376 {
1377 	if (statep->bm_regs_handle) {
1378 		ddi_regs_map_free(&statep->bm_regs_handle);
1379 	}
1380 
1381 	if (statep->am_regs_handle) {
1382 		ddi_regs_map_free(&statep->am_regs_handle);
1383 	}
1384 }
1385 
1386 /*
1387  * audio810_chip_init()
1388  *
1389  * Description:
1390  *	This routine initializes the audio controller.
1391  *
1392  * Arguments:
1393  *	audio810_state_t	*state		The device's state structure
1394  *
1395  * Returns:
1396  *	DDI_SUCCESS	The hardware was initialized properly
1397  *	DDI_FAILURE	The hardware couldn't be initialized properly
1398  */
1399 static int
1400 audio810_chip_init(audio810_state_t *statep)
1401 {
1402 	uint32_t	gcr;
1403 	uint32_t	gsr;
1404 	uint32_t	codec_ready;
1405 	int 		loop;
1406 	clock_t		ticks;
1407 
1408 	gcr = I810_BM_GET32(I810_REG_GCR);
1409 	ticks = drv_usectohz(100);
1410 
1411 	/*
1412 	 * Clear the channels bits for now.  We'll set them later in
1413 	 * reset port.
1414 	 */
1415 	if (statep->quirk == QUIRK_SIS7012) {
1416 		gcr &= ~(I810_GCR_ACLINK_OFF | I810_GCR_SIS_CHANNELS_MASK);
1417 	} else {
1418 		gcr &= ~(I810_GCR_ACLINK_OFF | I810_GCR_CHANNELS_MASK);
1419 	}
1420 
1421 	/*
1422 	 * Datasheet(ICH5, document number of Intel: 252751-001):
1423 	 * 3.6.5.5(page 37)
1424 	 * 	if reset bit(bit1) is "0", driver must set it
1425 	 * 	to "1" to de-assert the AC_RESET# signal in AC
1426 	 * 	link, thus completing a cold reset. But if the
1427 	 * 	bit is "1", then a warm reset is required.
1428 	 */
1429 	gcr |= (gcr & I810_GCR_COLD_RST) == 0 ?
1430 	    I810_GCR_COLD_RST:I810_GCR_WARM_RST;
1431 	I810_BM_PUT32(I810_REG_GCR, gcr);
1432 
1433 	/* according AC'97 spec, wait for codec reset */
1434 	for (loop = 6000; --loop >= 0; ) {
1435 		delay(ticks);
1436 		gcr = I810_BM_GET32(I810_REG_GCR);
1437 		if ((gcr & I810_GCR_WARM_RST) == 0) {
1438 			break;
1439 		}
1440 	}
1441 
1442 	/* codec reset failed */
1443 	if (loop < 0) {
1444 		audio_dev_warn(statep->adev, "Failed to reset codec");
1445 		return (DDI_FAILURE);
1446 	}
1447 
1448 	/*
1449 	 * Wait for codec ready. The hardware can provide the state of
1450 	 * codec ready bit on SDATA_IN[0], SDATA_IN[1] or SDATA_IN[2]
1451 	 */
1452 	codec_ready =
1453 	    I810_GSR_PRI_READY | I810_GSR_SEC_READY | I810_GSR_TRI_READY;
1454 	for (loop = 7000; --loop >= 0; ) {
1455 		delay(ticks);
1456 		gsr = I810_BM_GET32(I810_REG_GSR);
1457 		if ((gsr & codec_ready) != 0) {
1458 			break;
1459 		}
1460 	}
1461 	if (loop < 0) {
1462 		audio_dev_warn(statep->adev, "No codec ready signal received");
1463 		return (DDI_FAILURE);
1464 	}
1465 
1466 	/*
1467 	 * put the audio controller into quiet state, everything off
1468 	 */
1469 	audio810_stop_dma(statep);
1470 
1471 	return (DDI_SUCCESS);
1472 }
1473 
1474 /*
1475  * audio810_set_channels()
1476  *
1477  * Description:
1478  *	This routine initializes the multichannel configuration.
1479  *
1480  * Arguments:
1481  *	audio810_state_t	*state		The device's state structure
1482  */
1483 static void
1484 audio810_set_channels(audio810_state_t *statep)
1485 {
1486 	uint32_t	gcr;
1487 
1488 	/*
1489 	 * Configure multi-channel.
1490 	 */
1491 	if (statep->quirk == QUIRK_SIS7012) {
1492 		/*
1493 		 * SiS 7012 needs its own special multichannel config.
1494 		 */
1495 		gcr = I810_BM_GET32(I810_REG_GCR);
1496 		gcr &= ~I810_GCR_SIS_CHANNELS_MASK;
1497 		I810_BM_PUT32(I810_REG_GCR, gcr);
1498 		delay(drv_usectohz(50000));	/* 50 msec */
1499 
1500 		switch (statep->maxch) {
1501 		case 2:
1502 			gcr |= I810_GCR_SIS_2_CHANNELS;
1503 			break;
1504 		case 4:
1505 			gcr |= I810_GCR_SIS_4_CHANNELS;
1506 			break;
1507 		case 6:
1508 			gcr |= I810_GCR_SIS_6_CHANNELS;
1509 			break;
1510 		}
1511 		I810_BM_PUT32(I810_REG_GCR, gcr);
1512 		delay(drv_usectohz(50000));	/* 50 msec */
1513 	} else {
1514 
1515 		/*
1516 		 * All other devices work the same.
1517 		 */
1518 		gcr = I810_BM_GET32(I810_REG_GCR);
1519 		gcr &= ~I810_GCR_CHANNELS_MASK;
1520 
1521 		I810_BM_PUT32(I810_REG_GCR, gcr);
1522 		delay(drv_usectohz(50000));	/* 50 msec */
1523 
1524 		switch (statep->maxch) {
1525 		case 2:
1526 			gcr |= I810_GCR_2_CHANNELS;
1527 			break;
1528 		case 4:
1529 			gcr |= I810_GCR_4_CHANNELS;
1530 			break;
1531 		case 6:
1532 			gcr |= I810_GCR_6_CHANNELS;
1533 			break;
1534 		}
1535 		I810_BM_PUT32(I810_REG_GCR, gcr);
1536 		delay(drv_usectohz(50000));	/* 50 msec */
1537 	}
1538 }
1539 
1540 /*
1541  * audio810_stop_dma()
1542  *
1543  * Description:
1544  *	This routine is used to put each DMA engine into the quiet state.
1545  *
1546  * Arguments:
1547  *	audio810_state_t	*state		The device's state structure
1548  */
1549 static void
1550 audio810_stop_dma(audio810_state_t *statep)
1551 {
1552 	if (statep->bm_regs_handle == NULL) {
1553 		return;
1554 	}
1555 	/* pause bus master (needed for the following reset register) */
1556 	I810_BM_PUT8(I810_BASE_PCM_IN + I810_OFFSET_CR, 0x0);
1557 	I810_BM_PUT8(I810_BASE_PCM_OUT + I810_OFFSET_CR, 0x0);
1558 	I810_BM_PUT8(I810_BASE_MIC + I810_OFFSET_CR, 0x0);
1559 
1560 	/* and then reset the bus master registers for a three DMA engines */
1561 	I810_BM_PUT8(I810_BASE_PCM_IN + I810_OFFSET_CR, I810_BM_CR_RST);
1562 	I810_BM_PUT8(I810_BASE_PCM_OUT + I810_OFFSET_CR, I810_BM_CR_RST);
1563 	I810_BM_PUT8(I810_BASE_MIC + I810_OFFSET_CR, I810_BM_CR_RST);
1564 }
1565 
1566 
1567 /*
1568  * audio810_codec_sync()
1569  *
1570  * Description:
1571  *	Serialize access to the AC97 audio mixer registers.
1572  *
1573  * Arguments:
1574  *	audio810_state_t	*state		The device's state structure
1575  *
1576  * Returns:
1577  *	DDI_SUCCESS		Ready for an I/O access to the codec
1578  *	DDI_FAILURE		An I/O access is currently in progress, can't
1579  *				perform another I/O access.
1580  */
1581 static int
1582 audio810_codec_sync(audio810_state_t *statep)
1583 {
1584 	int 		i;
1585 	uint16_t	casr;
1586 
1587 	for (i = 0; i < 300; i++) {
1588 		casr = I810_BM_GET8(I810_REG_CASR);
1589 		if ((casr & 1) == 0) {
1590 			return (DDI_SUCCESS);
1591 		}
1592 		drv_usecwait(10);
1593 	}
1594 
1595 	return (DDI_FAILURE);
1596 }
1597 
1598 /*
1599  * audio810_write_ac97()
1600  *
1601  * Description:
1602  *	Set the specific AC97 Codec register.
1603  *
1604  * Arguments:
1605  *	void		*arg		The device's state structure
1606  *	uint8_t		reg		AC97 register number
1607  *	uint16_t	data		The data want to be set
1608  */
1609 static void
1610 audio810_write_ac97(void *arg, uint8_t reg, uint16_t data)
1611 {
1612 	audio810_state_t	*statep = arg;
1613 
1614 	if (audio810_codec_sync(statep) == DDI_SUCCESS) {
1615 		I810_AM_PUT16(reg, data);
1616 	}
1617 
1618 	(void) audio810_read_ac97(statep, reg);
1619 }
1620 
1621 /*
1622  * audio810_read_ac97()
1623  *
1624  * Description:
1625  *	Get the specific AC97 Codec register.
1626  *
1627  * Arguments:
1628  *	void		*arg		The device's state structure
1629  *	uint8_t		reg		AC97 register number
1630  *
1631  * Returns:
1632  *	The register value.
1633  */
1634 static uint16_t
1635 audio810_read_ac97(void *arg, uint8_t reg)
1636 {
1637 	audio810_state_t	*statep = arg;
1638 	uint16_t		val = 0xffff;
1639 
1640 	if (audio810_codec_sync(statep) == DDI_SUCCESS) {
1641 		val = I810_AM_GET16(reg);
1642 	}
1643 	return (val);
1644 }
1645 
1646 /*
1647  * audio810_destroy()
1648  *
1649  * Description:
1650  *	This routine releases all resources held by the device instance,
1651  *	as part of either detach or a failure in attach.
1652  *
1653  * Arguments:
1654  *	audio810_state_t	*state	The device soft state.
1655  */
1656 void
1657 audio810_destroy(audio810_state_t *statep)
1658 {
1659 	/* stop DMA engines */
1660 	audio810_stop_dma(statep);
1661 
1662 	for (int i = 0; i < I810_NUM_PORTS; i++) {
1663 		audio810_free_port(statep->ports[i]);
1664 	}
1665 
1666 	audio810_unmap_regs(statep);
1667 
1668 	if (statep->ac97)
1669 		ac97_free(statep->ac97);
1670 
1671 	if (statep->adev)
1672 		audio_dev_free(statep->adev);
1673 
1674 	kmem_free(statep, sizeof (*statep));
1675 }
1676