audio1575.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 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26
27/*
28 * audio1575 Audio Driver
29 *
30 * The driver is primarily targeted at providing audio support for
31 * those systems which use the Uli M1575 audio core.
32 *
33 * The M1575 audio core, in AC'97 controller mode, has independent
34 * channels for PCM in, PCM out, mic in, modem in, and modem out.
35 *
36 * The AC'97 controller is a PCI bus master with scatter/gather
37 * support. Each channel has a DMA engine. Currently, we use only
38 * the PCM in and PCM out channels. Each DMA engine uses one buffer
39 * descriptor list. And the buffer descriptor list is an array of up
40 * to 32 entries, each of which describes a data buffer. Each entry
41 * contains a pointer to a data buffer, control bits, and the length
42 * of the buffer being pointed to, where the length is expressed as
43 * the number of samples. This, combined with the 16-bit sample size,
44 * gives the actual physical length of the buffer.
45 *
46 * TODO: System power management is not yet supported by the driver.
47 *
48 * 	NOTE:
49 * 	This driver depends on the drv/audio, misc/ac97
50 * 	modules being loaded first.
51 */
52
53#include <sys/types.h>
54#include <sys/modctl.h>
55#include <sys/kmem.h>
56#include <sys/conf.h>
57#include <sys/ddi.h>
58#include <sys/sunddi.h>
59#include <sys/pci.h>
60#include <sys/note.h>
61#include <sys/audio/audio_driver.h>
62#include <sys/audio/ac97.h>
63#include "audio1575.h"
64
65/*
66 * Module linkage routines for the kernel
67 */
68static int audio1575_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
69static int audio1575_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
70
71/*
72 * Entry point routine prototypes
73 */
74static int audio1575_open(void *, int, unsigned *, unsigned *, caddr_t *);
75static void audio1575_close(void *);
76static int audio1575_start(void *);
77static void audio1575_stop(void *);
78static int audio1575_format(void *);
79static int audio1575_channels(void *);
80static int audio1575_rate(void *);
81static uint64_t audio1575_count(void *);
82static void audio1575_sync(void *, unsigned);
83static size_t audio1575_qlen(void *);
84
85static audio_engine_ops_t audio1575_engine_ops = {
86	AUDIO_ENGINE_VERSION,
87	audio1575_open,
88	audio1575_close,
89	audio1575_start,
90	audio1575_stop,
91	audio1575_count,
92	audio1575_format,
93	audio1575_channels,
94	audio1575_rate,
95	audio1575_sync,
96	audio1575_qlen
97};
98
99/*
100 * interrupt handler
101 */
102static uint_t	audio1575_intr(caddr_t, caddr_t);
103
104/*
105 * Local Routine Prototypes
106 */
107static int audio1575_attach(dev_info_t *);
108static int audio1575_resume(dev_info_t *);
109static int audio1575_detach(dev_info_t *);
110static int audio1575_suspend(dev_info_t *);
111
112static int audio1575_alloc_port(audio1575_state_t *, int);
113static void audio1575_free_port(audio1575_port_t *);
114static void audio1575_start_port(audio1575_port_t *);
115static void audio1575_stop_port(audio1575_port_t *);
116static void audio1575_reset_port(audio1575_port_t *);
117static void audio1575_update_port(audio1575_port_t *);
118
119static int audio1575_setup_intr(audio1575_state_t *);
120static int audio1575_codec_sync(audio1575_state_t *);
121static void audio1575_write_ac97(void *, uint8_t, uint16_t);
122static uint16_t audio1575_read_ac97(void *, uint8_t);
123static int audio1575_chip_init(audio1575_state_t *);
124static int audio1575_map_regs(audio1575_state_t *);
125static void audio1575_unmap_regs(audio1575_state_t *);
126static void audio1575_dma_stop(audio1575_state_t *);
127static void audio1575_pci_enable(audio1575_state_t *);
128static void audio1575_pci_disable(audio1575_state_t *);
129
130static void audio1575_destroy(audio1575_state_t *);
131
132/*
133 * Global variables, but used only by this file.
134 */
135
136/*
137 * DDI Structures
138 */
139
140
141/* Device operations structure */
142static struct dev_ops audio1575_dev_ops = {
143	DEVO_REV,		/* devo_rev */
144	0,			/* devo_refcnt */
145	NULL,			/* devo_getinfo */
146	nulldev,		/* devo_identify - obsolete */
147	nulldev,		/* devo_probe */
148	audio1575_ddi_attach,	/* devo_attach */
149	audio1575_ddi_detach,	/* devo_detach */
150	nodev,			/* devo_reset */
151	NULL,			/* devi_cb_ops */
152	NULL,			/* devo_bus_ops */
153	NULL,			/* devo_power */
154	ddi_quiesce_not_supported,	/* devo_quiesce */
155};
156
157/* Linkage structure for loadable drivers */
158static struct modldrv audio1575_modldrv = {
159	&mod_driverops,		/* drv_modops */
160	M1575_MOD_NAME,		/* drv_linkinfo */
161	&audio1575_dev_ops,	/* drv_dev_ops */
162};
163
164/* Module linkage structure */
165static struct modlinkage audio1575_modlinkage = {
166	MODREV_1,			/* ml_rev */
167	(void *)&audio1575_modldrv,	/* ml_linkage */
168	NULL				/* NULL terminates the list */
169};
170
171
172/*
173 * device access attributes for register mapping
174 */
175static struct ddi_device_acc_attr dev_attr = {
176	DDI_DEVICE_ATTR_V0,
177	DDI_STRUCTURE_LE_ACC,
178	DDI_STRICTORDER_ACC
179};
180
181static struct ddi_device_acc_attr buf_attr = {
182	DDI_DEVICE_ATTR_V0,
183	DDI_NEVERSWAP_ACC,
184	DDI_STRICTORDER_ACC
185};
186
187/*
188 * DMA attributes of buffer descriptor list
189 */
190static ddi_dma_attr_t bdlist_dma_attr = {
191	DMA_ATTR_V0,	/* version */
192	0x0000000000000000LL,		/* dlim_addr_lo */
193	0x00000000ffffffffLL,		/* dlim_addr_hi */
194	0x000000000000ffffLL,		/* DMA counter register - 64 bits */
195	0x0000000000000008LL,		/* DMA address align must be 8-bytes */
196	0x0000003c,			/* 1 through 64 byte burst sizes */
197	0x00000008,			/* min xfer DMA size BDList entry */
198	0x00000000000ffffLL,		/* max xfer size, 64K */
199	0x000000000001fffLL,		/* seg, set to PAGESIZE */
200	0x00000001,			/* s/g list length, no s/g */
201	0x00000008,			/* granularity of device minxfer */
202	0				/* DMA flags use virtual address */
203};
204
205/*
206 * DMA attributes of buffers to be used to receive/send audio data
207 */
208static ddi_dma_attr_t	sample_buf_dma_attr = {
209	DMA_ATTR_V0,
210	0x0000000000000000LL,		/* dlim_addr_lo */
211	0x00000000ffffffffLL,		/* dlim_addr_hi */
212	0x000000000001fffeLL,		/* DMA counter register - 16 bits */
213	0x0000000000000004LL,		/* DMA address align 2-byte boundary */
214	0x0000003c,			/* 1 through 60 byte burst sizes */
215	0x00000004,			/* min xfer DMA size BDList entry */
216	0x000000000001ffffLL,		/* max xfer size, 64K */
217	0x000000000001ffffLL,		/* seg, set to 64K */
218	0x00000001,			/* s/g list length, no s/g */
219	0x00000004,			/* granularity of device minxfer */
220	0				/* DMA flags use virtual address */
221};
222
223/*
224 * _init()
225 *
226 * Description:
227 *	Driver initialization, called when driver is first loaded.
228 *	This is how access is initially given to all the static structures.
229 *
230 * Arguments:
231 *	None
232 *
233 * Returns:
234 *	mod_install() status, see mod_install(9f)
235 */
236int
237_init(void)
238{
239	int	error;
240
241	audio_init_ops(&audio1575_dev_ops, M1575_NAME);
242
243	if ((error = mod_install(&audio1575_modlinkage)) != 0) {
244		audio_fini_ops(&audio1575_dev_ops);
245	}
246
247	return (error);
248}
249
250/*
251 * _fini()
252 *
253 * Description:
254 *	Module de-initialization, called when the driver is to be unloaded.
255 *
256 * Arguments:
257 *	None
258 *
259 * Returns:
260 *	mod_remove() status, see mod_remove(9f)
261 */
262int
263_fini(void)
264{
265	int		error;
266
267	if ((error = mod_remove(&audio1575_modlinkage)) != 0) {
268		return (error);
269	}
270
271	/* clean up ops */
272	audio_fini_ops(&audio1575_dev_ops);
273
274	return (0);
275}
276
277/*
278 * _info()
279 *
280 * Description:
281 *	Module information, returns information about the driver.
282 *
283 * Arguments:
284 *	modinfo		*modinfop	Pointer to the opaque modinfo structure
285 *
286 * Returns:
287 *	mod_info() status, see mod_info(9f)
288 */
289int
290_info(struct modinfo *modinfop)
291{
292	return (mod_info(&audio1575_modlinkage, modinfop));
293}
294
295
296/* ******************* Driver Entry Points ********************************* */
297
298/*
299 * audio1575_ddi_attach()
300 *
301 * Description:
302 *	Implements the DDI attach(9e) entry point.
303 *
304 * Arguments:
305 *	dev_info_t	*dip	Pointer to the device's dev_info struct
306 *	ddi_attach_cmd_t cmd	Attach command
307 *
308 * Returns:
309 *	DDI_SUCCESS		The driver was initialized properly
310 *	DDI_FAILURE		The driver couldn't be initialized properly
311 */
312static int
313audio1575_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
314{
315	switch (cmd) {
316	case DDI_ATTACH:
317		return (audio1575_attach(dip));
318
319	case DDI_RESUME:
320		return (audio1575_resume(dip));
321	}
322	return (DDI_FAILURE);
323}
324
325/*
326 * audio1575_ddi_detach()
327 *
328 * Description:
329 *	Implements the detach(9e) entry point.
330 *
331 * Arguments:
332 *	dev_info_t		*dip	Pointer to the device's dev_info struct
333 *	ddi_detach_cmd_t	cmd	Detach command
334 *
335 * Returns:
336 *	DDI_SUCCESS	The driver was detached
337 *	DDI_FAILURE	The driver couldn't be detached
338 */
339static int
340audio1575_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
341{
342	switch (cmd) {
343	case DDI_DETACH:
344		return (audio1575_detach(dip));
345
346	case DDI_SUSPEND:
347		return (audio1575_suspend(dip));
348	}
349	return (DDI_FAILURE);
350}
351
352/*
353 * audio1575_intr()
354 *
355 * Description:
356 *	Interrupt service routine for both play and record. For play we
357 *	get the next buffers worth of audio. For record we send it on to
358 *	the mixer.
359 *
360 *	Each of buffer descriptor has a field IOC(interrupt on completion)
361 *	When both this and the IOC bit of correspondent dma control register
362 *	is set, it means that the controller should issue an interrupt upon
363 *	completion of this buffer. Note that in the clearing of the interrupts
364 *	below that the PCM IN and PCM out interrupts ar cleared by their
365 *	respective control registers and not by writing a '1' to the INTRSR
366 *	the interrupt status register. Only CPRINTR,SPINTR,and GPIOINTR
367 *	require a '1' written to the INTRSR register to clear those
368 *	interrupts. See comments below.
369 *
370 * Arguments:
371 *	caddr_t		arg	Pointer to the interrupting device's state
372 *				structure
373 *
374 * Returns:
375 *	DDI_INTR_CLAIMED	Interrupt claimed and processed
376 *	DDI_INTR_UNCLAIMED	Interrupt not claimed, and thus ignored
377 */
378static uint_t
379audio1575_intr(caddr_t arg, caddr_t dontcare)
380{
381	audio1575_state_t	*statep = (void *)arg;
382	uint32_t		intrsr;
383	uint8_t			index;
384	audio1575_port_t	*consume = NULL;
385	audio1575_port_t	*produce = NULL;
386
387	_NOTE(ARGUNUSED(dontcare));
388
389	mutex_enter(&statep->lock);
390
391	intrsr = GET32(M1575_INTRSR_REG);
392
393	/* check if device is interrupting */
394	if (intrsr == 0) {
395		if (statep->ksp) {
396			/* increment the spurious ino5 interrupt cnt */
397			M1575_KIOP(statep)->intrs[KSTAT_INTR_SPURIOUS]++;
398		}
399
400		mutex_exit(&statep->lock);
401		return (DDI_INTR_UNCLAIMED);
402	}
403
404	/* update the kernel interrupt statistics */
405	if (statep->ksp) {
406		M1575_KIOP(statep)->intrs[KSTAT_INTR_HARD]++;
407	}
408
409	/*
410	 * The Uli M1575 generates an interrupt for each interrupt
411	 * type. therefore we only process one interrupt type
412	 * per invocation of the audio1575_intr() routine.
413	 * WARNING: DO NOT attempt to optimize this by looping
414	 * until the INTRSR register is clear as this will
415	 * generate spurious ino5 interrupts.
416	 */
417	if (GET16(M1575_PCMISR_REG) & M1575_PCMISR_BCIS) {
418		/* Clear PCM IN interrupt */
419		PUT16(M1575_PCMISR_REG, M1575_SR_CLR);
420		/*
421		 * Note: This interrupt is not cleared by writing a '1'
422		 * to the M1575_INTRSR_REG according to the M1575 Super I/O
423		 * data sheet on page 189.
424		 */
425
426		/* update the LVI -- we just set it to the current value - 1 */
427		index = GET8(M1575_PCMICIV_REG);
428		index = (index - 1) % M1575_BD_NUMS;
429		PUT8(M1575_PCMILVIV_REG, index);
430		produce = statep->ports[M1575_REC];
431
432	} else if (GET16(M1575_PCMOSR_REG) & M1575_PCMOSR_BCIS) {
433		/* Clear PCM OUT interrupt */
434		PUT16(M1575_PCMOSR_REG, M1575_SR_CLR);
435		/*
436		 * Note: This interrupt is not cleared by writing a '1'
437		 * to the M1575_INTRSR_REG according to the M1575 Super I/O
438		 * data sheet on page 189.
439		 */
440
441		/* update the LVI -- we just set it to the current value - 1 */
442		index = GET8(M1575_PCMOCIV_REG);
443		index = (index - 1) % M1575_BD_NUMS;
444		PUT8(M1575_PCMOLVIV_REG, index);
445		consume = statep->ports[M1575_PLAY];
446
447	} else {
448		/* Clear other interrupts (there should not be any) */
449		PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
450	}
451
452	mutex_exit(&statep->lock);
453
454	if (produce) {
455		audio_engine_produce(produce->engine);
456	}
457	if (consume) {
458		audio_engine_consume(consume->engine);
459	}
460
461	return (DDI_INTR_CLAIMED);
462}
463
464/*
465 * audio1575_open()
466 *
467 * Description:
468 *	Opens a DMA engine for use.
469 *
470 * Arguments:
471 *	void		*arg		The DMA engine to set up
472 *	int		flag		Open flags
473 *	unsigned	*fragfrp	Receives number of frames per fragment
474 *	unsigned	*nfragsp	Receives number of fragments
475 *	caddr_t		*bufp		Receives kernel data buffer
476 *
477 * Returns:
478 *	0	on success
479 *	errno	on failure
480 */
481static int
482audio1575_open(void *arg, int flag,
483    unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
484{
485	audio1575_port_t	*port = arg;
486
487	_NOTE(ARGUNUSED(flag));
488
489	port->started = B_FALSE;
490	port->count = 0;
491	*fragfrp = port->fragfr;
492	*nfragsp = M1575_BD_NUMS;
493	*bufp = port->samp_kaddr;
494
495	mutex_enter(&port->statep->lock);
496	audio1575_reset_port(port);
497	mutex_exit(&port->statep->lock);
498
499	return (0);
500}
501
502
503/*
504 * audio1575_close()
505 *
506 * Description:
507 *	Closes an audio DMA engine that was previously opened.  Since
508 *	nobody is using it, we take this opportunity to possibly power
509 *	down the entire device.
510 *
511 * Arguments:
512 *	void	*arg		The DMA engine to shut down
513 */
514static void
515audio1575_close(void *arg)
516{
517	audio1575_port_t	*port = arg;
518	audio1575_state_t	*statep = port->statep;
519
520	mutex_enter(&statep->lock);
521	audio1575_stop_port(port);
522	port->started = B_FALSE;
523	mutex_exit(&statep->lock);
524}
525
526/*
527 * audio1575_stop()
528 *
529 * Description:
530 *	This is called by the framework to stop a port that is
531 *	transferring data.
532 *
533 * Arguments:
534 *	void	*arg		The DMA engine to stop
535 */
536static void
537audio1575_stop(void *arg)
538{
539	audio1575_port_t	*port = arg;
540	audio1575_state_t	*statep = port->statep;
541
542	mutex_enter(&statep->lock);
543	if (port->started) {
544		audio1575_stop_port(port);
545	}
546	port->started = B_FALSE;
547	mutex_exit(&statep->lock);
548}
549
550/*
551 * audio1575_start()
552 *
553 * Description:
554 *	This is called by the framework to start a port transferring data.
555 *
556 * Arguments:
557 *	void	*arg		The DMA engine to start
558 *
559 * Returns:
560 *	0 	on success (never fails, errno if it did)
561 */
562static int
563audio1575_start(void *arg)
564{
565	audio1575_port_t	*port = arg;
566	audio1575_state_t	*statep = port->statep;
567
568	mutex_enter(&statep->lock);
569	if (!port->started) {
570		audio1575_start_port(port);
571		port->started = B_TRUE;
572	}
573	mutex_exit(&statep->lock);
574	return (0);
575}
576
577/*
578 * audio1575_format()
579 *
580 * Description:
581 *	Called by the framework to query the format for the device.
582 *
583 * Arguments:
584 *	void	*arg		The DMA engine to query
585 *
586 * Returns:
587 *	AUDIO_FORMAT_S16_LE
588 */
589static int
590audio1575_format(void *arg)
591{
592	_NOTE(ARGUNUSED(arg));
593
594	return (AUDIO_FORMAT_S16_LE);
595}
596
597/*
598 * audio1575_channels()
599 *
600 * Description:
601 *	Called by the framework to query the channels for the device.
602 *
603 * Arguments:
604 *	void	*arg		The DMA engine to query
605 *
606 * Returns:
607 *	Number of channels for the device
608 */
609static int
610audio1575_channels(void *arg)
611{
612	audio1575_port_t *port = arg;
613
614	return (port->nchan);
615}
616
617/*
618 * audio1575_rate()
619 *
620 * Description:
621 *	Called by the framework to query the sample rate for the device.
622 *
623 * Arguments:
624 *	void	*arg		The DMA engine to query
625 *
626 * Returns:
627 *	48000
628 */
629static int
630audio1575_rate(void *arg)
631{
632	_NOTE(ARGUNUSED(arg));
633
634	return (48000);
635}
636
637/*
638 * audio1575_count()
639 *
640 * Description:
641 *	This is called by the framework to get the engine's frame counter
642 *
643 * Arguments:
644 *	void	*arg		The DMA engine to query
645 *
646 * Returns:
647 *	frame count for current engine
648 */
649static uint64_t
650audio1575_count(void *arg)
651{
652	audio1575_port_t	*port = arg;
653	audio1575_state_t	*statep = port->statep;
654	uint64_t		val;
655
656	mutex_enter(&statep->lock);
657	audio1575_update_port(port);
658	val = port->count + port->picb;
659	mutex_exit(&statep->lock);
660
661	return (val);
662}
663
664/*
665 * audio1575_sync()
666 *
667 * Description:
668 *	This is called by the framework to synchronize DMA caches.
669 *
670 * Arguments:
671 *	void	*arg		The DMA engine to sync
672 */
673static void
674audio1575_sync(void *arg, unsigned nframes)
675{
676	audio1575_port_t *port = arg;
677	_NOTE(ARGUNUSED(nframes));
678
679	(void) ddi_dma_sync(port->samp_dmah, 0, 0, port->sync_dir);
680}
681
682/*
683 * audio1575_qlen()
684 *
685 * Description:
686 *	This is called by the framework to determine on-device queue length.
687 *
688 * Arguments:
689 *	void	*arg		The DMA engine to query
690 *
691 * Returns:
692 *	hardware queue length not reported by count (0 for this device)
693 */
694static size_t
695audio1575_qlen(void *arg)
696{
697	_NOTE(ARGUNUSED(arg));
698	return (0);
699}
700
701
702/*
703 * audio1575_start_port()
704 *
705 * Description:
706 *	This routine starts the DMA engine.
707 *
708 * Arguments:
709 *	audio1575_port_t	*port	Port of DMA engine to start.
710 */
711static void
712audio1575_start_port(audio1575_port_t *port)
713{
714	audio1575_state_t	*statep = port->statep;
715
716	ASSERT(mutex_owned(&statep->lock));
717
718	/* if suspended, then do nothing else */
719	if (statep->suspended) {
720		return;
721	}
722
723	if (port->num == M1575_REC) {
724		/* ULi says do fifo resets here */
725		SET32(M1575_FIFOCR1_REG, M1575_FIFOCR1_PCMIRST);
726		CLR32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
727		PUT8(M1575_PCMICR_REG, M1575_PCMICR_IOCE);
728		SET32(M1575_DMACR_REG, M1575_DMACR_PCMISTART);
729	} else {
730		CLR32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
731		PUT8(M1575_PCMOCR_REG, M1575_PCMOCR_IOCE);
732		SET32(M1575_DMACR_REG, M1575_DMACR_PCMOSTART);
733	}
734}
735
736/*
737 * audio1575_stop_port()
738 *
739 * Description:
740 *	This routine stops the DMA engine.
741 *
742 * Arguments:
743 *	audio1575_port_t	*port	Port of DMA engine to stop.
744 */
745static void
746audio1575_stop_port(audio1575_port_t *port)
747{
748	audio1575_state_t	*statep = port->statep;
749
750	ASSERT(mutex_owned(&statep->lock));
751
752	/* if suspended, then do nothing else */
753	if (statep->suspended) {
754		return;
755	}
756
757	if (port->num == M1575_REC) {
758		SET32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
759	} else {
760		SET32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
761	}
762}
763
764/*
765 * audio1575_reset_port()
766 *
767 * Description:
768 *	This routine resets the DMA engine pareparing it for work.
769 *
770 * Arguments:
771 *	audio1575_port_t	*port	Port of DMA engine to reset.
772 */
773static void
774audio1575_reset_port(audio1575_port_t *port)
775{
776	audio1575_state_t	*statep = port->statep;
777
778	ASSERT(mutex_owned(&statep->lock));
779
780	port->civ = 0;
781	port->picb = 0;
782
783	if (statep->suspended)
784		return;
785
786	if (port->num == M1575_REC) {
787		/* Uli FIFO madness ... */
788		SET32(M1575_FIFOCR1_REG, M1575_FIFOCR1_PCMIRST);
789		SET32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
790
791		PUT8(M1575_PCMICR_REG, 0);
792		PUT8(M1575_PCMICR_REG, M1575_CR_RR | M1575_CR_IOCE);
793
794		PUT32(M1575_PCMIBDBAR_REG, port->bdl_paddr);
795		PUT8(M1575_PCMILVIV_REG, M1575_BD_NUMS - 1);
796
797		CLR32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
798
799	} else {
800
801		/* Uli FIFO madness ... */
802		SET32(M1575_FIFOCR1_REG, M1575_FIFOCR1_PCMORST);
803		SET32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
804
805		PUT8(M1575_PCMOCR_REG, 0);
806		PUT8(M1575_PCMOCR_REG, M1575_CR_RR | M1575_CR_IOCE);
807
808		PUT32(M1575_PCMOBDBAR_REG, port->bdl_paddr);
809		PUT8(M1575_PCMOLVIV_REG, M1575_BD_NUMS - 1);
810
811		CLR32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
812	}
813}
814
815/*
816 * audio1575_update_port()
817 *
818 * Description:
819 *	This routine updates the ports frame counter from hardware, and
820 *	gracefully handles wraps.
821 *
822 * Arguments:
823 *	audio1575_port_t	*port		The port to update.
824 */
825static void
826audio1575_update_port(audio1575_port_t *port)
827{
828	audio1575_state_t	*statep = port->statep;
829	uint8_t			civ;
830	uint16_t		picb;
831	unsigned		n;
832	int			civoff;
833	int			picoff;
834
835	if (port->num == M1575_REC) {
836		civoff = M1575_PCMICIV_REG;
837		picoff = M1575_PCMIPICB_REG;
838	} else {
839		civoff = M1575_PCMOCIV_REG;
840		picoff = M1575_PCMOPICB_REG;
841	}
842
843	if (statep->suspended) {
844		civ = 0;
845		picb = 0;
846	} else {
847		/*
848		 * We read the position counters, but we're careful to avoid
849		 * the situation where the position counter resets at the end
850		 * of a buffer.
851		 */
852		for (int i = 0; i < 2; i++) {
853			civ = GET8(civoff);
854			picb = GET16(picoff);
855			if (GET8(civoff) == civ) {
856				/*
857				 * Chip did not start a new index, so
858				 * the picb is valid.
859				 */
860				break;
861			}
862		}
863		if (civ >= port->civ) {
864			n = civ - port->civ;
865		} else {
866			n = civ + (M1575_BD_NUMS - port->civ);
867		}
868		port->count += (n * port->fragfr);
869	}
870	port->civ = civ;
871	port->picb = picb;
872}
873
874/*
875 * audio1575_attach()
876 *
877 * Description:
878 *	Attach an instance of the audio1575 driver. This routine does the
879 * 	device dependent attach tasks. When it is completed, it registers
880 *	with the audio framework.
881 *
882 * Arguments:
883 *	dev_info_t	*dip	Pointer to the device's dev_info struct
884 *
885 * Returns:
886 *	DDI_SUCCESS		The driver was initialized properly
887 *	DDI_FAILURE		The driver couldn't be initialized properly
888 */
889static int
890audio1575_attach(dev_info_t *dip)
891{
892	audio1575_state_t	*statep;
893	audio_dev_t		*adev;
894	uint32_t		devid;
895	const char		*name;
896	const char		*rev;
897
898	/* allocate the soft state structure */
899	statep = kmem_zalloc(sizeof (*statep), KM_SLEEP);
900	ddi_set_driver_private(dip, statep);
901	statep->dip = dip;
902
903	/*
904	 * We want the micboost enabled by default as well.
905	 */
906	ddi_prop_update_int(DDI_DEV_T_NONE, dip, AC97_PROP_MICBOOST, 1);
907
908	/* allocate common audio dev structure */
909	adev = audio_dev_alloc(dip, 0);
910	if (adev == NULL) {
911		audio_dev_warn(NULL, "unable to allocate audio dev");
912		goto error;
913	}
914	statep->adev = adev;
915
916	/* map in the audio registers */
917	if (audio1575_map_regs(statep) != DDI_SUCCESS) {
918		audio_dev_warn(adev, "couldn't map registers");
919		goto error;
920	}
921
922	if (audio1575_setup_intr(statep) != DDI_SUCCESS) {
923		/* message already noted */
924		goto error;
925	}
926
927	/* Enable PCI I/O and Memory Spaces */
928	audio1575_pci_enable(statep);
929
930	devid = (pci_config_get16(statep->pcih, PCI_CONF_VENID) << 16) |
931	    pci_config_get16(statep->pcih, PCI_CONF_DEVID);
932	switch (devid) {
933	case 0x10b95455:
934		name = "Uli M1575 AC'97";
935		rev = "M5455";
936		break;
937	default:
938		name = "Uli AC'97";
939		rev = "Unknown";
940		break;
941	}
942	/* set device information -- this should check PCI config space */
943	audio_dev_set_description(adev, name);
944	audio_dev_set_version(adev, rev);
945
946
947	/* allocate port structures */
948	if ((audio1575_alloc_port(statep, M1575_PLAY) != DDI_SUCCESS) ||
949	    (audio1575_alloc_port(statep, M1575_REC) != DDI_SUCCESS)) {
950		goto error;
951	}
952
953	statep->ac97 = ac97_alloc(dip, audio1575_read_ac97,
954	    audio1575_write_ac97, statep);
955	ASSERT(statep->ac97 != NULL);
956
957	if (audio1575_chip_init(statep) != DDI_SUCCESS) {
958		audio_dev_warn(adev, "failed to init chip");
959		goto error;
960	}
961
962	if (ac97_init(statep->ac97, adev) != DDI_SUCCESS) {
963		audio_dev_warn(adev, "ac'97 initialization failed");
964		goto error;
965	}
966
967	/* set up kernel statistics */
968	if ((statep->ksp = kstat_create(M1575_NAME,
969	    ddi_get_instance(dip), M1575_NAME, "controller",
970	    KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT)) != NULL) {
971		kstat_install(statep->ksp);
972	}
973
974	/* Enable PCI Interrupts */
975	pci_config_put8(statep->pcih, M1575_PCIMISC_REG, M1575_PCIMISC_INTENB);
976
977	/* enable audio interrupts */
978	if (ddi_intr_enable(statep->ih) != DDI_SUCCESS) {
979		audio_dev_warn(adev, "ddi_intr_enable() failure");
980		goto error;
981	}
982
983	/* register with the framework */
984	if (audio_dev_register(adev) != DDI_SUCCESS) {
985		audio_dev_warn(adev, "unable to register with framework");
986		goto error;
987	}
988
989	/* everything worked out, so report the device */
990	ddi_report_dev(dip);
991
992	return (DDI_SUCCESS);
993
994error:
995	audio1575_destroy(statep);
996	return (DDI_FAILURE);
997}
998
999/*
1000 * audio1575_detach()
1001 *
1002 * Description:
1003 *	Detach an instance of the audio1575 driver.
1004 *
1005 * Arguments:
1006 *	dev_info_t	*dip	Pointer to the device's dev_info struct
1007 *
1008 * Returns:
1009 *	DDI_SUCCESS	The driver was detached
1010 *	DDI_FAILURE	The driver couldn't be detached
1011 */
1012static int
1013audio1575_detach(dev_info_t *dip)
1014{
1015	audio1575_state_t	*statep;
1016
1017	statep = ddi_get_driver_private(dip);
1018
1019	if (audio_dev_unregister(statep->adev) != DDI_SUCCESS) {
1020		return (DDI_FAILURE);
1021	}
1022
1023	audio1575_destroy(statep);
1024	return (DDI_SUCCESS);
1025}
1026
1027/* *********************** Local Routines *************************** */
1028
1029/*
1030 * audio1575_setup_intr()
1031 *
1032 * Description:
1033 *	This routine initializes the audio driver's interrupt handle and
1034 *	mutex.
1035 *
1036 * Arguments:
1037 *	audio1575_state_t	*state		The device's state structure
1038 *
1039 * Returns:
1040 *	DDI_SUCCESS		Interrupt handle & mutex initialized
1041 *	DDI_FAILURE		Interrupt handle & mutex not initialized
1042 */
1043int
1044audio1575_setup_intr(audio1575_state_t *statep)
1045{
1046	audio_dev_t		*adev;
1047	dev_info_t		*dip;
1048	uint_t			ipri;
1049	int			actual;
1050	int			rv;
1051	int			itype;
1052	int			count;
1053	ddi_intr_handle_t	ih = NULL;
1054
1055	dip = statep->dip;
1056	adev = statep->adev;
1057
1058	/* get supported interrupt types */
1059	rv = ddi_intr_get_supported_types(dip, &itype);
1060	if ((rv != DDI_SUCCESS) || (!(itype & DDI_INTR_TYPE_FIXED))) {
1061		audio_dev_warn(adev, "Fixed type interrupts not supported");
1062		return (DDI_FAILURE);
1063	}
1064
1065	/* make sure we only have one fixed type interrupt */
1066	rv = ddi_intr_get_nintrs(dip, DDI_INTR_TYPE_FIXED, &count);
1067	if ((rv != DDI_SUCCESS) || (count != 1)) {
1068		audio_dev_warn(adev, "No fixed interrupts");
1069		return (DDI_FAILURE);
1070	}
1071
1072	rv = ddi_intr_alloc(statep->dip, &ih, DDI_INTR_TYPE_FIXED,
1073	    0, 1, &actual, DDI_INTR_ALLOC_STRICT);
1074	if ((rv != DDI_SUCCESS) || (actual != 1)) {
1075		audio_dev_warn(adev, "Can't alloc interrupt handle");
1076		return (DDI_FAILURE);
1077	}
1078
1079	/* test for a high level interrupt */
1080	if (ddi_intr_get_pri(ih, &ipri) != DDI_SUCCESS) {
1081		audio_dev_warn(adev, "Can't get interrupt priority");
1082		(void) ddi_intr_free(ih);
1083		return (DDI_FAILURE);
1084	}
1085	if (ipri >= ddi_intr_get_hilevel_pri()) {
1086		audio_dev_warn(adev, "Unsupported high level interrupt");
1087		(void) ddi_intr_free(ih);
1088		return (DDI_FAILURE);
1089	}
1090
1091	if (ddi_intr_add_handler(ih, audio1575_intr, statep, NULL) !=
1092	    DDI_SUCCESS) {
1093		audio_dev_warn(adev, "Can't add interrupt handler");
1094		(void) ddi_intr_free(ih);
1095		return (DDI_FAILURE);
1096	}
1097
1098	statep->ih = ih;
1099	mutex_init(&statep->lock, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
1100	mutex_init(&statep->ac_lock, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
1101
1102	return (DDI_SUCCESS);
1103}
1104
1105/*
1106 * audio1575_alloc_port()
1107 *
1108 * Description:
1109 *	This routine allocates the DMA handles and the memory for the
1110 *	DMA engines to use.  It also configures the BDL lists properly
1111 *	for use.
1112 *
1113 * Arguments:
1114 *	dev_info_t	*dip	Pointer to the device's devinfo
1115 *
1116 * Returns:
1117 *	DDI_SUCCESS		Registers successfully mapped
1118 *	DDI_FAILURE		Registers not successfully mapped
1119 */
1120static int
1121audio1575_alloc_port(audio1575_state_t *statep, int num)
1122{
1123	ddi_dma_cookie_t	cookie;
1124	uint_t			count;
1125	int			dir;
1126	unsigned		caps;
1127	char			*prop;
1128	audio_dev_t		*adev;
1129	audio1575_port_t	*port;
1130	uint32_t		*kaddr;
1131	uint32_t		paddr;
1132	int			rc;
1133	dev_info_t		*dip;
1134
1135	adev = statep->adev;
1136	dip = statep->dip;
1137
1138	port = kmem_zalloc(sizeof (*port), KM_SLEEP);
1139	statep->ports[num] = port;
1140	port->num = num;
1141	port->statep = statep;
1142	port->started = B_FALSE;
1143
1144	if (num == M1575_REC) {
1145		prop = "record-interrupts";
1146		dir = DDI_DMA_READ;
1147		caps = ENGINE_INPUT_CAP;
1148		port->sync_dir = DDI_DMA_SYNC_FORKERNEL;
1149		port->nchan = 2;
1150	} else {
1151		prop = "play-interrupts";
1152		dir = DDI_DMA_WRITE;
1153		caps = ENGINE_OUTPUT_CAP;
1154		port->sync_dir = DDI_DMA_SYNC_FORDEV;
1155		/* XXX: possibly support multichannel! */
1156		port->nchan = 2;
1157	}
1158
1159	port->intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
1160	    DDI_PROP_DONTPASS, prop, M1575_INTS);
1161
1162	/* make sure the values are good */
1163	if (port->intrs < M1575_MIN_INTS) {
1164		audio_dev_warn(adev, "%s too low, %d, resetting to %d",
1165		    prop, port->intrs, M1575_INTS);
1166		port->intrs = M1575_INTS;
1167	} else if (port->intrs > M1575_MAX_INTS) {
1168		audio_dev_warn(adev, "%s too high, %d, resetting to %d",
1169		    prop, port->intrs, M1575_INTS);
1170		port->intrs = M1575_INTS;
1171	}
1172
1173	/*
1174	 * Figure out how much space we need.  Sample rate is 48kHz, and
1175	 * we need to store 32 chunks.  (Note that this means that low
1176	 * interrupt frequencies will require more RAM.  We could probably
1177	 * do some cleverness to use a shorter BD list.)
1178	 */
1179	port->fragfr = 48000 / port->intrs;
1180	port->fragfr = M1575_ROUNDUP(port->fragfr, M1575_MOD_SIZE);
1181	port->samp_size = port->fragfr * port->nchan * 2;
1182	port->samp_size *= M1575_BD_NUMS;
1183
1184	/* allocate dma handle */
1185	rc = ddi_dma_alloc_handle(dip, &sample_buf_dma_attr, DDI_DMA_SLEEP,
1186	    NULL, &port->samp_dmah);
1187	if (rc != DDI_SUCCESS) {
1188		audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc);
1189		return (DDI_FAILURE);
1190	}
1191	/* allocate DMA buffer */
1192	rc = ddi_dma_mem_alloc(port->samp_dmah, port->samp_size, &buf_attr,
1193	    DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->samp_kaddr,
1194	    &port->samp_size, &port->samp_acch);
1195	if (rc == DDI_FAILURE) {
1196		audio_dev_warn(adev, "dma_mem_alloc failed");
1197		return (DDI_FAILURE);
1198	}
1199
1200	/* bind DMA buffer */
1201	rc = ddi_dma_addr_bind_handle(port->samp_dmah, NULL,
1202	    port->samp_kaddr, port->samp_size, dir|DDI_DMA_CONSISTENT,
1203	    DDI_DMA_SLEEP, NULL, &cookie, &count);
1204	if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
1205		audio_dev_warn(adev,
1206		    "ddi_dma_addr_bind_handle failed: %d", rc);
1207		return (DDI_FAILURE);
1208	}
1209	port->samp_paddr = cookie.dmac_address;
1210
1211	/*
1212	 * now, from here we allocate DMA memory for buffer descriptor list.
1213	 * we allocate adjacent DMA memory for all DMA engines.
1214	 */
1215	rc = ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
1216	    NULL, &port->bdl_dmah);
1217	if (rc != DDI_SUCCESS) {
1218		audio_dev_warn(adev, "ddi_dma_alloc_handle(bdlist) failed");
1219		return (DDI_FAILURE);
1220	}
1221
1222	/*
1223	 * we allocate all buffer descriptors lists in continuous dma memory.
1224	 */
1225	port->bdl_size = sizeof (m1575_bd_entry_t) * M1575_BD_NUMS;
1226	rc = ddi_dma_mem_alloc(port->bdl_dmah, port->bdl_size,
1227	    &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
1228	    &port->bdl_kaddr, &port->bdl_size, &port->bdl_acch);
1229	if (rc != DDI_SUCCESS) {
1230		audio_dev_warn(adev, "ddi_dma_mem_alloc(bdlist) failed");
1231		return (DDI_FAILURE);
1232	}
1233
1234	/*
1235	 * Wire up the BD list.  We do this *before* binding the BD list
1236	 * so that we don't have to do an extra ddi_dma_sync.
1237	 */
1238	paddr = port->samp_paddr;
1239	kaddr = (void *)port->bdl_kaddr;
1240	for (int i = 0; i < M1575_BD_NUMS; i++) {
1241
1242		/* set base address of buffer */
1243		ddi_put32(port->bdl_acch, kaddr, paddr);
1244		kaddr++;
1245
1246		/* set size in frames, and enable IOC interrupt */
1247		ddi_put32(port->bdl_acch, kaddr,
1248		    ((port->fragfr * port->nchan) | (1U << 31)));
1249		kaddr++;
1250
1251		paddr += (port->fragfr * port->nchan * 2);
1252	}
1253
1254	rc = ddi_dma_addr_bind_handle(port->bdl_dmah, NULL, port->bdl_kaddr,
1255	    port->bdl_size, DDI_DMA_WRITE|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP,
1256	    NULL, &cookie, &count);
1257	if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
1258		audio_dev_warn(adev, "addr_bind_handle failed");
1259		return (DDI_FAILURE);
1260	}
1261	port->bdl_paddr = cookie.dmac_address;
1262
1263	port->engine = audio_engine_alloc(&audio1575_engine_ops, caps);
1264	if (port->engine == NULL) {
1265		audio_dev_warn(adev, "audio_engine_alloc failed");
1266		return (DDI_FAILURE);
1267	}
1268
1269	audio_engine_set_private(port->engine, port);
1270	audio_dev_add_engine(adev, port->engine);
1271
1272	return (DDI_SUCCESS);
1273}
1274
1275/*
1276 * audio1575_free_port()
1277 *
1278 * Description:
1279 *	This routine unbinds the DMA cookies, frees the DMA buffers,
1280 *	deallocates the DMA handles.
1281 *
1282 * Arguments:
1283 *	audio810_port_t	*port	The port structure for a DMA engine.
1284 */
1285static void
1286audio1575_free_port(audio1575_port_t *port)
1287{
1288	if (port == NULL)
1289		return;
1290
1291	if (port->engine) {
1292		audio_dev_remove_engine(port->statep->adev, port->engine);
1293		audio_engine_free(port->engine);
1294	}
1295	if (port->bdl_paddr) {
1296		(void) ddi_dma_unbind_handle(port->bdl_dmah);
1297	}
1298	if (port->bdl_acch) {
1299		ddi_dma_mem_free(&port->bdl_acch);
1300	}
1301	if (port->bdl_dmah) {
1302		ddi_dma_free_handle(&port->bdl_dmah);
1303	}
1304	if (port->samp_paddr) {
1305		(void) ddi_dma_unbind_handle(port->samp_dmah);
1306	}
1307	if (port->samp_acch) {
1308		ddi_dma_mem_free(&port->samp_acch);
1309	}
1310	if (port->samp_dmah) {
1311		ddi_dma_free_handle(&port->samp_dmah);
1312	}
1313	kmem_free(port, sizeof (*port));
1314}
1315
1316/*
1317 * audio1575_map_regs()
1318 *
1319 * Description:
1320 *	The registers are mapped in.
1321 *
1322 * Arguments:
1323 *	dev_info_t	*dip	Pointer to the device's devinfo
1324 *
1325 * Returns:
1326 *	DDI_SUCCESS		Registers successfully mapped
1327 *	DDI_FAILURE		Registers not successfully mapped
1328 */
1329static int
1330audio1575_map_regs(audio1575_state_t *statep)
1331{
1332	dev_info_t		*dip = statep->dip;
1333
1334	/* Check for fault management capabilities */
1335	if (DDI_FM_ACC_ERR_CAP(ddi_fm_capable(dip))) {
1336		dev_attr.devacc_attr_access = DDI_FLAGERR_ACC;
1337	}
1338
1339	/* map the M1575 Audio PCI Cfg Space */
1340	if (pci_config_setup(dip, &statep->pcih) != DDI_SUCCESS) {
1341		audio_dev_warn(statep->adev, "PCI config map failure");
1342		goto error;
1343	}
1344
1345	/* map the M1575 Audio registers in PCI IO Space */
1346	if ((ddi_regs_map_setup(dip, M1575_AUDIO_IO_SPACE, &statep->regsp,
1347	    0, 0, &dev_attr, &statep->regsh)) != DDI_SUCCESS) {
1348		audio_dev_warn(statep->adev, "Audio IO mapping failure");
1349		goto error;
1350	}
1351	return (DDI_SUCCESS);
1352
1353error:
1354	audio1575_unmap_regs(statep);
1355
1356	return (DDI_FAILURE);
1357}
1358
1359/*
1360 * audio1575_unmap_regs()
1361 *
1362 * Description:
1363 *	This routine unmaps control registers.
1364 *
1365 * Arguments:
1366 *	audio1575_state_t	*state	The device's state structure
1367 */
1368static void
1369audio1575_unmap_regs(audio1575_state_t *statep)
1370{
1371	if (statep->regsh) {
1372		ddi_regs_map_free(&statep->regsh);
1373	}
1374
1375	if (statep->pcih) {
1376		pci_config_teardown(&statep->pcih);
1377	}
1378}
1379
1380/*
1381 * audio1575_chip_init()
1382 *
1383 * Description:
1384 *	This routine initializes the M1575 AC97 audio controller and the AC97
1385 *	codec.	The AC97 codec registers are programmed from codec_shadow[].
1386 *	If we are not doing a restore, we initialize codec_shadow[], otherwise
1387 *	we use the current values of shadow.	This routine expects that the
1388 *	PCI IO and Memory spaces have been mapped and enabled already.
1389 * Arguments:
1390 *	audio1575_state_t	*state		The device's state structure
1391 *						restore	from codec_shadow[]
1392 * Returns:
1393 *	DDI_SUCCESS	The hardware was initialized properly
1394 *	DDI_FAILURE	The hardware couldn't be initialized properly
1395 */
1396static int
1397audio1575_chip_init(audio1575_state_t *statep)
1398{
1399	uint32_t		ssr;
1400	uint32_t		rtsr;
1401	uint32_t		intrsr;
1402	int 			i;
1403	int			j;
1404	uint8_t			clk_detect;
1405	clock_t			ticks;
1406	ddi_acc_handle_t	pcih;
1407
1408	/*
1409	 * clear the interrupt control and status register
1410	 * READ/WRITE/READ workaround required
1411	 * for buggy hardware
1412	 */
1413
1414	PUT32(M1575_INTRCR_REG, 0);
1415	(void) GET32(M1575_INTRCR_REG);
1416
1417	intrsr = GET32(M1575_INTRSR_REG);
1418	PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
1419	(void) GET32(M1575_INTRSR_REG);
1420
1421	ticks = drv_usectohz(M1575_LOOP_CTR);
1422
1423	/*
1424	 * SADA only supports stereo, so we set the channel bits
1425	 * to "00" to select 2 channels.
1426	 * will also set the following:
1427	 *
1428	 * Disable double rate enable
1429	 * no SPDIF output selected
1430	 * 16 bit audio record mode
1431	 * 16 bit pcm out mode
1432	 * PCM Out 6 chan mode FL FR CEN BL BR LFE
1433	 * PCM Out 2 channel mode (00)
1434	 */
1435	for (i = 0; i < M1575_LOOP_CTR; i++) {
1436		/* Reset the AC97 Codec	and default to 2 channel 16 bit mode */
1437		PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
1438		delay(ticks<<1);
1439
1440		/* Read the System Status Reg */
1441		ssr = GET32(M1575_SSR_REG);
1442
1443		/* make sure and release the blocked reset bit */
1444		if (ssr & M1575_SSR_RSTBLK) {
1445			SET32(M1575_INTFCR_REG, M1575_INTFCR_RSTREL);
1446			delay(ticks);
1447
1448			/* Read the System Status Reg */
1449			ssr = GET32(M1575_SSR_REG);
1450
1451			/* make sure and release the blocked reset bit */
1452			if (ssr & M1575_SSR_RSTBLK) {
1453				return (DDI_FAILURE);
1454			}
1455
1456			/* Reset the controller */
1457			PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
1458			delay(ticks);
1459		}
1460
1461		/* according AC'97 spec, wait for codec reset */
1462		for (j = 0; j < M1575_LOOP_CTR; j++) {
1463			if ((GET32(M1575_SCR_REG) & M1575_SCR_COLDRST) == 0) {
1464				break;
1465			}
1466			delay(ticks);
1467		}
1468
1469		/* codec reset failed */
1470		if (j >= M1575_LOOP_CTR) {
1471			audio_dev_warn(statep->adev,
1472			    "failure to reset codec");
1473			return (DDI_FAILURE);
1474		}
1475
1476		/*
1477		 * Wait for FACRDY First codec ready. The hardware can
1478		 * provide the state of
1479		 * codec ready bit on SDATA_IN[0] and as reflected in
1480		 * the Recv Tag Slot Reg.
1481		 */
1482		rtsr = GET32(M1575_RTSR_REG);
1483		if (rtsr & M1575_RTSR_FACRDY) {
1484			break;
1485		} else { /* reset the status and wait for new status to set */
1486			rtsr |= M1575_RTSR_FACRDY;
1487			PUT32(M1575_RTSR_REG, rtsr);
1488			drv_usecwait(10);
1489		}
1490	}
1491
1492	/* if we could not reset the AC97 codec then report failure */
1493	if (i >= M1575_LOOP_CTR) {
1494		audio_dev_warn(statep->adev,
1495		    "no codec ready signal received");
1496		return (DDI_FAILURE);
1497	}
1498
1499	/* Magic code from ULi to Turn on the AC_LINK clock */
1500	pcih = statep->pcih;
1501	pci_config_put8(pcih, M1575_PCIACD_REG, 0);
1502	pci_config_put8(pcih, M1575_PCIACD_REG, 4);
1503	pci_config_put8(pcih, M1575_PCIACD_REG, 0);
1504	(void) pci_config_get8(pcih, M1575_PCIACD_REG);
1505	pci_config_put8(pcih, M1575_PCIACD_REG, 2);
1506	pci_config_put8(pcih, M1575_PCIACD_REG, 0);
1507	clk_detect = pci_config_get8(pcih, M1575_PCIACD_REG);
1508
1509	if (clk_detect != 1) {
1510		audio_dev_warn(statep->adev, "No AC97 Clock Detected");
1511		return (DDI_FAILURE);
1512	}
1513
1514	/* Magic code from Uli to Init FIFO1 and FIFO2 */
1515	PUT32(M1575_FIFOCR1_REG, 0x81818181);
1516	PUT32(M1575_FIFOCR2_REG, 0x81818181);
1517	PUT32(M1575_FIFOCR3_REG, 0x81818181);
1518
1519	/* Make sure that PCM in and PCM out are enabled */
1520	SET32(M1575_INTFCR_REG, (M1575_INTFCR_PCMIENB | M1575_INTFCR_PCMOENB));
1521
1522	audio1575_dma_stop(statep);
1523
1524	return (DDI_SUCCESS);
1525}
1526
1527/*
1528 * audio1575_dma_stop()
1529 *
1530 * Description:
1531 *	This routine is used to put each DMA engine into the quiet state.
1532 *
1533 * Arguments:
1534 *	audio1575_state_t *statep	The device's state structure
1535 */
1536static void
1537audio1575_dma_stop(audio1575_state_t *statep)
1538{
1539	uint32_t	intrsr;
1540	int		i;
1541
1542	if (statep->regsh == NULL) {
1543		return;
1544	}
1545
1546	/* pause bus master (needed for the following reset register) */
1547	for (i = 0; i < M1575_LOOP_CTR; i++) {
1548
1549		SET32(M1575_DMACR_REG, M1575_DMACR_PAUSE_ALL);
1550		if (GET32(M1575_DMACR_REG) & M1575_DMACR_PAUSE_ALL) {
1551			break;
1552		}
1553		drv_usecwait(10);
1554	}
1555
1556	if (i >= M1575_LOOP_CTR) {
1557		audio_dev_warn(statep->adev, "failed to stop DMA");
1558		return;
1559	}
1560
1561	/* Pause bus master (needed for the following reset register) */
1562	PUT8(M1575_PCMICR_REG, 0);
1563	PUT8(M1575_PCMOCR_REG, 0);
1564	PUT8(M1575_MICICR_REG, 0);
1565	PUT8(M1575_CSPOCR_REG, 0);
1566	PUT8(M1575_PCMI2CR_RR, 0);
1567	PUT8(M1575_MICI2CR_RR, 0);
1568
1569	/* Reset the bus master registers for all DMA engines */
1570	PUT8(M1575_PCMICR_REG, M1575_PCMICR_RR);
1571	PUT8(M1575_PCMOCR_REG, M1575_PCMOCR_RR);
1572	PUT8(M1575_MICICR_REG, M1575_MICICR_RR);
1573	PUT8(M1575_CSPOCR_REG, M1575_CSPOCR_RR);
1574	PUT8(M1575_PCMI2CR_REG, M1575_PCMI2CR_RR);
1575	PUT8(M1575_MICI2CR_REG, M1575_MICI2CR_RR);
1576
1577	/* Reset FIFOS */
1578	PUT32(M1575_FIFOCR1_REG, 0x81818181);
1579	PUT32(M1575_FIFOCR2_REG, 0x81818181);
1580	PUT32(M1575_FIFOCR3_REG, 0x81818181);
1581
1582	/* Clear Interrupts */
1583	SET16(M1575_PCMISR_REG, M1575_SR_CLR);
1584	SET16(M1575_PCMOSR_REG, M1575_SR_CLR);
1585	SET16(M1575_MICISR_REG, M1575_SR_CLR);
1586	SET16(M1575_CSPOSR_REG, M1575_SR_CLR);
1587	SET16(M1575_PCMI2SR_REG, M1575_SR_CLR);
1588	SET16(M1575_MICI2SR_REG, M1575_SR_CLR);
1589
1590	/*
1591	 * clear the interrupt control and status register
1592	 * READ/WRITE/READ workaround required
1593	 * for buggy hardware
1594	 */
1595
1596	PUT32(M1575_INTRCR_REG, 0);
1597	(void) GET32(M1575_INTRCR_REG);
1598
1599	intrsr = GET32(M1575_INTRSR_REG);
1600	PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
1601	(void) GET32(M1575_INTRSR_REG);
1602}
1603
1604/*
1605 * audio1575_codec_sync()
1606 *
1607 * Description:
1608 *	Serialize access to the AC97 audio mixer registers.
1609 *
1610 * Arguments:
1611 *	audio1575_state_t	*state		The device's state structure
1612 *
1613 * Returns:
1614 *	DDI_SUCCESS		Ready for an I/O access to the codec
1615 *	DDI_FAILURE		An I/O access is currently in progress, can't
1616 *				perform another I/O access.
1617 */
1618static int
1619audio1575_codec_sync(audio1575_state_t *statep)
1620{
1621	/* do the Uli Shuffle ... */
1622	for (int i = 0; i < M1575_LOOP_CTR; i++) {
1623		/* Read the semaphore, and loop till we own it */
1624		if ((GET32(M1575_CASR_REG) & 1) == 0) {
1625			for (int j = 0; j < M1575_LOOP_CTR; j++) {
1626				/* Wait for CWRSUCC 0x8 */
1627				if (GET32(M1575_CSPSR_REG) &
1628				    M1575_CSPSR_SUCC) {
1629					return (DDI_SUCCESS);
1630				}
1631				drv_usecwait(1);
1632			}
1633		}
1634		drv_usecwait(10);
1635	}
1636
1637	return (DDI_FAILURE);
1638}
1639
1640/*
1641 * audio1575_write_ac97()
1642 *
1643 * Description:
1644 *	Set the specific AC97 Codec register.
1645 *
1646 * Arguments:
1647 *	void		*arg		The device's state structure
1648 *	uint8_t		reg		AC97 register number
1649 *	uint16_t	data		The data want to be set
1650 */
1651static void
1652audio1575_write_ac97(void *arg, uint8_t reg, uint16_t data)
1653{
1654	audio1575_state_t	*statep = arg;
1655	int			i;
1656
1657	mutex_enter(&statep->ac_lock);
1658
1659	if (audio1575_codec_sync(statep) != DDI_SUCCESS) {
1660		mutex_exit(&statep->ac_lock);
1661		return;
1662	}
1663
1664	/* write the data to WRITE to the lo word of the CPR register */
1665	PUT16(M1575_CPR_REG, data);
1666
1667	/* write the address to WRITE to the hi word of the CPR register */
1668	PUT16(M1575_CPR_REG+2, reg);
1669
1670	/* wait until command is completed sucessfully */
1671	for (i = 0; i < M1575_LOOP_CTR; i++) {
1672		/* Wait for Write Ready	0x01 */
1673		if (GET32(M1575_CSPSR_REG) & M1575_CSPSR_WRRDY) {
1674			break;
1675		}
1676		drv_usecwait(1);
1677	}
1678
1679	mutex_exit(&statep->ac_lock);
1680
1681	if (i < M1575_LOOP_CTR) {
1682		(void) audio1575_read_ac97(statep, reg);
1683	}
1684}
1685
1686/*
1687 * audio1575_read_ac97()
1688 *
1689 * Description:
1690 *	Get the specific AC97 Codec register. It also updates codec_shadow[]
1691 *	with the register value.
1692 *
1693 * Arguments:
1694 *	void		*arg		The device's state structure
1695 *	uint8_t		reg		AC97 register number
1696 *
1697 * Returns:
1698 *	Value of AC97 register.  (0xffff in failure situations).
1699 */
1700static uint16_t
1701audio1575_read_ac97(void *arg, uint8_t reg)
1702{
1703	audio1575_state_t	*statep = arg;
1704	uint16_t		addr = 0;
1705	uint16_t		data = 0xffff;
1706	int			i;
1707
1708	mutex_enter(&statep->ac_lock);
1709	if ((audio1575_codec_sync(statep)) != DDI_SUCCESS) {
1710		mutex_exit(&statep->ac_lock);
1711		return (data);
1712	}
1713
1714	/*
1715	 * at this point we have the CASR semaphore
1716	 * and the codec is r/w ready
1717	 * OR in the READ opcode into the address field
1718	 */
1719
1720	addr = (reg | M1575_CPR_READ);
1721
1722	/* write the address to READ to the hi word of the CPR register */
1723	PUT16(M1575_CPR_REG+2, addr);
1724
1725	/* wait until command is completed sucessfully */
1726	for (i = 0; i < M1575_LOOP_CTR; i++) {
1727		/* Wait for Read Ready	0x02 */
1728		if (GET32(M1575_CSPSR_REG) & M1575_CSPSR_RDRDY) {
1729			break;
1730		}
1731		drv_usecwait(1);
1732	}
1733
1734	if (i < M1575_LOOP_CTR) {
1735		/* read back the data and address */
1736		data = GET16(M1575_SPR_REG);
1737		addr = GET16(M1575_SPR_REG+2);
1738		if (addr != reg) {
1739			data = 0xffff;
1740		}
1741	}
1742
1743	mutex_exit(&statep->ac_lock);
1744	return (data);
1745}
1746
1747/*
1748 * audio1575_pci_enable()
1749 *
1750 * Description:
1751 *	This routine Enables all PCI IO and MEMORY accesses
1752 *
1753 * Arguments:
1754 *	audio1575_state_t *statep	 The device's state structure
1755 */
1756static void
1757audio1575_pci_enable(audio1575_state_t *statep)
1758{
1759	uint16_t pcics_reg;
1760
1761	pcics_reg = pci_config_get16(statep->pcih, PCI_CONF_COMM);
1762	pcics_reg |= (PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
1763	pci_config_put16(statep->pcih, PCI_CONF_COMM, pcics_reg);
1764}
1765
1766/*
1767 * audio1575_pci_disable()
1768 *
1769 * Description:
1770 *	This routine Disables all PCI IO and MEMORY accesses
1771 *
1772 * Arguments:
1773 *	audio1575_state_t *statep	The device's state structure
1774 */
1775static void
1776audio1575_pci_disable(audio1575_state_t *statep)
1777{
1778	uint16_t pcics_reg;
1779
1780	if (statep->pcih == NULL)
1781		return;
1782	pcics_reg = pci_config_get16(statep->pcih, PCI_CONF_COMM);
1783	pcics_reg &= ~(PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
1784	pci_config_put16(statep->pcih, PCI_CONF_COMM, pcics_reg);
1785}
1786
1787/*
1788 * audio1575_resume()
1789 *
1790 * Description:
1791 *	Resume operation of the device after sleeping or hibernating.
1792 *	Note that this should never fail, even if hardware goes wonky,
1793 *	because the current PM framework will panic if it does.
1794 *
1795 * Arguments:
1796 *	dev_info_t	*dip	Pointer to the device's dev_info struct
1797 *
1798 * Returns:
1799 *	DDI_SUCCESS		The driver was resumed
1800 */
1801static int
1802audio1575_resume(dev_info_t *dip)
1803{
1804	audio1575_state_t	*statep;
1805	audio_dev_t		*adev;
1806
1807	/* we've already allocated the state structure so get ptr */
1808	statep = ddi_get_driver_private(dip);
1809	adev = statep->adev;
1810	ASSERT(!mutex_owned(&statep->lock));
1811
1812	if (audio1575_chip_init(statep) != DDI_SUCCESS) {
1813		/*
1814		 * Note that PM gurus say we should return
1815		 * success here.  Failure of audio shouldn't
1816		 * be considered FATAL to the system.  The
1817		 * upshot is that audio will not progress.
1818		 */
1819		audio_dev_warn(adev, "DDI_RESUME failed to init chip");
1820		return (DDI_SUCCESS);
1821	}
1822
1823	/* allow ac97 operations again */
1824	ac97_resume(statep->ac97);
1825
1826	mutex_enter(&statep->lock);
1827
1828	ASSERT(statep->suspended);
1829	statep->suspended = B_FALSE;
1830
1831	for (int i = 0; i < M1575_NUM_PORTS; i++) {
1832
1833		audio1575_port_t *port = statep->ports[i];
1834
1835		if (port != NULL) {
1836			/* reset framework DMA engine buffer */
1837			if (port->engine != NULL) {
1838				audio_engine_reset(port->engine);
1839			}
1840
1841			/* reset and initialize hardware ports */
1842			audio1575_reset_port(port);
1843			if (port->started) {
1844				audio1575_start_port(port);
1845			} else {
1846				audio1575_stop_port(port);
1847			}
1848		}
1849	}
1850	mutex_exit(&statep->lock);
1851
1852	return (DDI_SUCCESS);
1853}
1854
1855/*
1856 * audio1575_suspend()
1857 *
1858 * Description:
1859 *	Suspend an instance of the audio1575 driver.
1860 *
1861 * Arguments:
1862 *	dev_info_t	*dip	Pointer to the device's dev_info struct
1863 *
1864 * Returns:
1865 *	DDI_SUCCESS	The driver was suspended
1866 */
1867static int
1868audio1575_suspend(dev_info_t *dip)
1869{
1870	audio1575_state_t	*statep;
1871
1872	statep = ddi_get_driver_private(dip);
1873
1874	ac97_suspend(statep->ac97);
1875
1876	mutex_enter(&statep->lock);
1877
1878	statep->suspended = B_TRUE;
1879
1880	/*
1881	 * stop all DMA operations
1882	 */
1883	audio1575_dma_stop(statep);
1884
1885	mutex_exit(&statep->lock);
1886
1887	return (DDI_SUCCESS);
1888}
1889
1890/*
1891 * audio1575_destroy()
1892 *
1893 * Description:
1894 *	This routine releases all resources held by the device instance,
1895 *	as part of either detach or a failure in attach.
1896 *
1897 * Arguments:
1898 *	audio1575_state_t	*state	The device soft state.
1899 *
1900 * Returns:
1901 *	None
1902 */
1903void
1904audio1575_destroy(audio1575_state_t *statep)
1905{
1906	ddi_acc_handle_t	pcih;
1907
1908	/* stop DMA engines */
1909	audio1575_dma_stop(statep);
1910
1911	if (statep->regsh != NULL) {
1912		/* reset the codec */
1913		PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
1914	}
1915
1916	if ((pcih = statep->pcih) != NULL) {
1917		/* turn off the AC_LINK clock */
1918		pci_config_put8(pcih, M1575_PCIACD_REG, 0);
1919		pci_config_put8(pcih, M1575_PCIACD_REG, 4);
1920		pci_config_put8(pcih, M1575_PCIACD_REG, 0);
1921	}
1922
1923	/* Disable PCI I/O and Memory Spaces */
1924	audio1575_pci_disable(statep);
1925
1926	if (statep->ih != NULL) {
1927		(void) ddi_intr_disable(statep->ih);
1928		(void) ddi_intr_remove_handler(statep->ih);
1929		(void) ddi_intr_free(statep->ih);
1930		mutex_destroy(&statep->lock);
1931		mutex_destroy(&statep->ac_lock);
1932	}
1933
1934	if (statep->ksp != NULL) {
1935		kstat_delete(statep->ksp);
1936	}
1937
1938	audio1575_free_port(statep->ports[M1575_PLAY]);
1939	audio1575_free_port(statep->ports[M1575_REC]);
1940
1941	audio1575_unmap_regs(statep);
1942
1943	if (statep->ac97 != NULL) {
1944		ac97_free(statep->ac97);
1945	}
1946
1947	if (statep->adev != NULL) {
1948		audio_dev_free(statep->adev);
1949	}
1950
1951	kmem_free(statep, sizeof (*statep));
1952}
1953