audioens.c revision 11936:54dc8a89ba0d
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 * Purpose: Creative/Ensoniq AudioPCI97  driver (ES1371/ES1373)
27 *
28 * This driver is used with the original Ensoniq AudioPCI97 card and many
29 * PCI based Sound Blaster cards by Creative Technologies. For example
30 * Sound Blaster PCI128 and Creative/Ectiva EV1938.
31 */
32
33/*
34 * This file is part of Open Sound System
35 *
36 * Copyright (C) 4Front Technologies 1996-2008.
37 *
38 * This software is released under CDDL 1.0 source license.
39 * See the COPYING file included in the main directory of this source
40 * distribution for the license terms and conditions.
41 */
42
43#include <sys/audio/audio_driver.h>
44#include <sys/audio/ac97.h>
45#include <sys/note.h>
46#include <sys/pci.h>
47#include "audioens.h"
48
49/*
50 * Set the latency to 32, 64, 96, 128 clocks - some APCI97 devices exhibit
51 * garbled audio in some cases and setting the latency to higer values fixes it
52 * Values: 32, 64, 96, 128 - Default: 64 (or defined by bios)
53 */
54int audioens_latency = 0;
55
56/*
57 * Enable SPDIF port on SoundBlaster 128D or Sound Blaster Digital-4.1 models
58 * Values: 1=Enable 0=Disable Default: 0
59 */
60int audioens_spdif = 0;
61
62/*
63 * Note: Latest devices can support SPDIF with AC3 pass thru.
64 * However, in order to do this, one of the two DMA engines must be
65 * dedicated to this, which would prevent the card from supporting 4
66 * channel audio.  For now we don't bother with the AC3 pass through
67 * mode, and instead just focus on 4 channel support.  In the future,
68 * this could be selectable via a property.
69 */
70
71#define	ENSONIQ_VENDOR_ID	0x1274
72#define	CREATIVE_VENDOR_ID	0x1102
73#define	ECTIVA_VENDOR_ID	0x1102
74#define	ENSONIQ_ES1371		0x1371
75#define	ENSONIQ_ES5880		0x8001
76#define	ENSONIQ_ES5880A		0x8002
77#define	ENSONIQ_ES5880B		0x5880
78#define	ECTIVA_ES1938		0x8938
79
80#define	DEFRATE			48000
81#define	DRVNAME			"audioens"
82
83typedef struct audioens_port
84{
85	/* Audio parameters */
86	int			speed;
87
88	int			num;
89#define	PORT_DAC		0
90#define	PORT_ADC		1
91#define	PORT_MAX		PORT_ADC
92
93	caddr_t			kaddr;
94	uint32_t		paddr;
95	ddi_acc_handle_t	acch;
96	ddi_dma_handle_t	dmah;
97	int			nchan;
98	unsigned		nframes;
99	unsigned		frameno;
100	uint64_t		count;
101
102	struct audioens_dev	*dev;
103	audio_engine_t	*engine;
104} audioens_port_t;
105
106typedef struct audioens_dev
107{
108	audio_dev_t		*osdev;
109	kmutex_t		mutex;
110	uint16_t		devid;
111	uint8_t			revision;
112	dev_info_t		*dip;
113
114	audioens_port_t		port[PORT_MAX + 1];
115
116	ac97_t			*ac97;
117
118	caddr_t			regs;
119	ddi_acc_handle_t	acch;
120} audioens_dev_t;
121
122static ddi_device_acc_attr_t acc_attr = {
123	DDI_DEVICE_ATTR_V0,
124	DDI_STRUCTURE_LE_ACC,
125	DDI_STRICTORDER_ACC
126};
127
128static ddi_device_acc_attr_t buf_attr = {
129	DDI_DEVICE_ATTR_V0,
130	DDI_NEVERSWAP_ACC,
131	DDI_STRICTORDER_ACC
132};
133
134/*
135 * The hardware appears to be able to address up to 16-bits worth of longwords,
136 * giving a total address space of 256K.  But we need substantially less.
137 */
138#define	AUDIOENS_BUF_LEN	(16384)
139
140static ddi_dma_attr_t dma_attr = {
141	DMA_ATTR_VERSION,	/* dma_attr_version */
142	0x0,			/* dma_attr_addr_lo */
143	0xffffffffU,		/* dma_attr_addr_hi */
144	0x3ffff,		/* dma_attr_count_max */
145	0x8,			/* dma_attr_align */
146	0x7f,			/* dma_attr_burstsizes */
147	0x1,			/* dma_attr_minxfer */
148	0x3ffff,		/* dma_attr_maxxfer */
149	0x3ffff,		/* dma_attr_seg */
150	0x1,			/* dma_attr_sgllen */
151	0x1,			/* dma_attr_granular */
152	0			/* dma_attr_flags */
153};
154
155#define	GET8(dev, offset)	\
156	ddi_get8(dev->acch, (uint8_t *)(dev->regs + (offset)))
157#define	GET16(dev, offset)	\
158	ddi_get16(dev->acch, (uint16_t *)(void *)(dev->regs + (offset)))
159#define	GET32(dev, offset)	\
160	ddi_get32(dev->acch, (uint32_t *)(void *)(dev->regs + (offset)))
161#define	PUT8(dev, offset, v)	\
162	ddi_put8(dev->acch, (uint8_t *)(dev->regs + (offset)), v)
163#define	PUT16(dev, offset, v)	\
164	ddi_put16(dev->acch, (uint16_t *)(void *)(dev->regs + (offset)), v)
165#define	PUT32(dev, offset, v)	\
166	ddi_put32(dev->acch, (uint32_t *)(void *)(dev->regs + (offset)), v)
167
168#define	CLR8(dev, offset, v)	PUT8(dev, offset, GET8(dev, offset) & ~(v))
169#define	SET8(dev, offset, v)	PUT8(dev, offset, GET8(dev, offset) | (v))
170#define	CLR32(dev, offset, v)	PUT32(dev, offset, GET32(dev, offset) & ~(v))
171#define	SET32(dev, offset, v)	PUT32(dev, offset, GET32(dev, offset) | (v))
172
173static void audioens_init_hw(audioens_dev_t *);
174
175static uint16_t
176audioens_rd97(void *dev_, uint8_t wAddr)
177{
178	audioens_dev_t *dev = dev_;
179	int i, dtemp;
180
181	mutex_enter(&dev->mutex);
182	dtemp = GET32(dev, CONC_dCODECCTL_OFF);
183	/* wait for WIP to go away saving the current state for later */
184	for (i = 0; i < 0x100UL; ++i) {
185		dtemp = GET32(dev, CONC_dCODECCTL_OFF);
186		if ((dtemp & (1UL << 30)) == 0)
187			break;
188	}
189
190	/* write addr w/data=0 and assert read request ... */
191	PUT32(dev, CONC_dCODECCTL_OFF, ((int)wAddr << 16) | (1UL << 23));
192
193	/* now wait for the data (RDY) */
194	for (i = 0; i < 0x100UL; ++i) {
195		dtemp = GET32(dev, CONC_dCODECCTL_OFF);
196		if (dtemp & (1UL << 31))
197			break;
198	}
199	dtemp = GET32(dev, CONC_dCODECCTL_OFF);
200	mutex_exit(&dev->mutex);
201
202	return (dtemp & 0xffff);
203}
204
205static void
206audioens_wr97(void *dev_, uint8_t wAddr, uint16_t wData)
207{
208	audioens_dev_t *dev = dev_;
209	int i, dtemp;
210
211	mutex_enter(&dev->mutex);
212	/* wait for WIP to go away */
213	for (i = 0; i < 0x100UL; ++i) {
214		dtemp = GET32(dev, CONC_dCODECCTL_OFF);
215		if ((dtemp & (1UL << 30)) == 0)
216			break;
217	}
218
219	PUT32(dev, CONC_dCODECCTL_OFF, ((int)wAddr << 16) | wData);
220
221	mutex_exit(&dev->mutex);
222}
223
224static unsigned short
225SRCRegRead(audioens_dev_t *dev, unsigned short reg)
226{
227	int i, dtemp;
228
229	dtemp = GET32(dev, CONC_dSRCIO_OFF);
230	/* wait for ready */
231	for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
232		dtemp = GET32(dev, CONC_dSRCIO_OFF);
233		if ((dtemp & SRC_BUSY) == 0)
234			break;
235	}
236
237	/* assert a read request */
238	PUT32(dev, CONC_dSRCIO_OFF, (dtemp & SRC_CTLMASK) | ((int)reg << 25));
239
240	/* now wait for the data */
241	for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
242		dtemp = GET32(dev, CONC_dSRCIO_OFF);
243		if ((dtemp & SRC_BUSY) == 0)
244			break;
245	}
246
247	return ((unsigned short) dtemp);
248}
249
250static void
251SRCRegWrite(audioens_dev_t *dev, unsigned short reg, unsigned short val)
252{
253	int i, dtemp;
254	int writeval;
255
256	dtemp = GET32(dev, CONC_dSRCIO_OFF);
257	/* wait for ready */
258	for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
259		dtemp = GET32(dev, CONC_dSRCIO_OFF);
260		if ((dtemp & SRC_BUSY) == 0)
261			break;
262	}
263
264	/* assert the write request */
265	writeval = (dtemp & SRC_CTLMASK) | SRC_WENABLE |
266	    ((int)reg << 25) | val;
267	PUT32(dev, CONC_dSRCIO_OFF, writeval);
268}
269
270static void
271SRCSetRate(audioens_dev_t *dev, unsigned char base, unsigned short rate)
272{
273	int i, freq, dtemp;
274	unsigned short N, truncM, truncStart;
275
276	if (base != SRC_ADC_BASE) {
277		/* freeze the channel */
278		dtemp = (base == SRC_DAC1_BASE) ?
279		    SRC_DAC1FREEZE : SRC_DAC2FREEZE;
280		for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
281			if (!(GET32(dev, CONC_dSRCIO_OFF) & SRC_BUSY))
282				break;
283		}
284		PUT32(dev, CONC_dSRCIO_OFF,
285		    (GET32(dev, CONC_dSRCIO_OFF) & SRC_CTLMASK) | dtemp);
286
287		/* calculate new frequency and write it - preserve accum */
288		freq = ((int)rate << 16) / 3000U;
289		SRCRegWrite(dev, (unsigned short) base + SRC_INT_REGS_OFF,
290		    (SRCRegRead(dev, (unsigned short) base + SRC_INT_REGS_OFF)
291		    & 0x00ffU) | ((unsigned short) (freq >> 6) & 0xfc00));
292		SRCRegWrite(dev, (unsigned short) base + SRC_VFREQ_FRAC_OFF,
293		    (unsigned short) freq >> 1);
294
295		/* un-freeze the channel */
296		for (i = 0; i < SRC_IOPOLL_COUNT; ++i)
297			if (!(GET32(dev, CONC_dSRCIO_OFF) & SRC_BUSY))
298				break;
299		PUT32(dev, CONC_dSRCIO_OFF,
300		    (GET32(dev, CONC_dSRCIO_OFF) & SRC_CTLMASK) & ~dtemp);
301	} else {
302		/* derive oversample ratio */
303		N = rate / 3000U;
304		if (N == 15 || N == 13 || N == 11 || N == 9)
305			--N;
306
307		/* truncate the filter and write n/trunc_start */
308		truncM = (21 * N - 1) | 1;
309		if (rate >= 24000U) {
310			if (truncM > 239)
311				truncM = 239;
312			truncStart = (239 - truncM) >> 1;
313
314			SRCRegWrite(dev, base + SRC_TRUNC_N_OFF,
315			    (truncStart << 9) | (N << 4));
316		} else {
317			if (truncM > 119)
318				truncM = 119;
319			truncStart = (119 - truncM) >> 1;
320
321			SRCRegWrite(dev, base + SRC_TRUNC_N_OFF,
322			    0x8000U | (truncStart << 9) | (N << 4));
323		}
324
325		/* calculate new frequency and write it - preserve accum */
326		freq = ((48000UL << 16) / rate) * N;
327		SRCRegWrite(dev, base + SRC_INT_REGS_OFF,
328		    (SRCRegRead(dev, (unsigned short) base + SRC_INT_REGS_OFF)
329		    & 0x00ff) | ((unsigned short) (freq >> 6) & 0xfc00));
330		SRCRegWrite(dev, base + SRC_VFREQ_FRAC_OFF,
331		    (unsigned short) freq >> 1);
332
333		SRCRegWrite(dev, SRC_ADC_VOL_L, N << 8);
334		SRCRegWrite(dev, SRC_ADC_VOL_R, N << 8);
335	}
336}
337
338static void
339SRCInit(audioens_dev_t *dev)
340{
341	int i;
342
343	/* Clear all SRC RAM then init - keep SRC disabled until done */
344	for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
345		if (!(GET32(dev, CONC_dSRCIO_OFF) & SRC_BUSY))
346			break;
347	}
348	PUT32(dev, CONC_dSRCIO_OFF, SRC_DISABLE);
349
350	for (i = 0; i < 0x80; ++i)
351		SRCRegWrite(dev, (unsigned short) i, 0U);
352
353	SRCRegWrite(dev, SRC_DAC1_BASE + SRC_TRUNC_N_OFF, 16 << 4);
354	SRCRegWrite(dev, SRC_DAC1_BASE + SRC_INT_REGS_OFF, 16 << 10);
355	SRCRegWrite(dev, SRC_DAC2_BASE + SRC_TRUNC_N_OFF, 16 << 4);
356	SRCRegWrite(dev, SRC_DAC2_BASE + SRC_INT_REGS_OFF, 16 << 10);
357	SRCRegWrite(dev, SRC_DAC1_VOL_L, 1 << 12);
358	SRCRegWrite(dev, SRC_DAC1_VOL_R, 1 << 12);
359	SRCRegWrite(dev, SRC_DAC2_VOL_L, 1 << 12);
360	SRCRegWrite(dev, SRC_DAC2_VOL_R, 1 << 12);
361	SRCRegWrite(dev, SRC_ADC_VOL_L, 1 << 12);
362	SRCRegWrite(dev, SRC_ADC_VOL_R, 1 << 12);
363
364	/* default some rates */
365	SRCSetRate(dev, SRC_DAC1_BASE, 48000);
366	SRCSetRate(dev, SRC_DAC2_BASE, 48000);
367	SRCSetRate(dev, SRC_ADC_BASE, 48000);
368
369	/* now enable the whole deal */
370	for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
371		if (!(GET32(dev, CONC_dSRCIO_OFF) & SRC_BUSY))
372			break;
373	}
374	PUT32(dev, CONC_dSRCIO_OFF, 0);
375}
376
377static void
378audioens_writemem(audioens_dev_t *dev, uint32_t page, uint32_t offs,
379    uint32_t data)
380{
381	/* Select memory page */
382	PUT32(dev, CONC_bMEMPAGE_OFF, page);
383	PUT32(dev, offs, data);
384}
385
386static uint32_t
387audioens_readmem(audioens_dev_t *dev, uint32_t page, uint32_t offs)
388{
389	PUT32(dev, CONC_bMEMPAGE_OFF, page);	/* Select memory page */
390	return (GET32(dev, offs));
391}
392
393/*
394 * Audio routines
395 */
396static int
397audioens_format(void *arg)
398{
399	_NOTE(ARGUNUSED(arg));
400
401	/* hardware can also do AUDIO_FORMAT_U8, but no need for it */
402	return (AUDIO_FORMAT_S16_LE);
403}
404
405static int
406audioens_channels(void *arg)
407{
408	audioens_port_t *port = arg;
409
410	return (port->nchan);
411}
412
413static int
414audioens_rate(void *arg)
415{
416	audioens_port_t *port = arg;
417
418	return (port->speed);
419}
420
421static int
422audioens_open(void *arg, int flag, unsigned *nframes, caddr_t *bufp)
423{
424	audioens_port_t	*port = arg;
425	audioens_dev_t	*dev = port->dev;
426
427	_NOTE(ARGUNUSED(flag));
428
429	mutex_enter(&dev->mutex);
430
431	port->nframes = AUDIOENS_BUF_LEN / (port->nchan * sizeof (int16_t));
432	port->count = 0;
433
434	*nframes = port->nframes;
435	*bufp = port->kaddr;
436	mutex_exit(&dev->mutex);
437
438	return (0);
439}
440
441static int
442audioens_start(void *arg)
443{
444	audioens_port_t *port = arg;
445	audioens_dev_t *dev = port->dev;
446	uint32_t tmp;
447
448	mutex_enter(&dev->mutex);
449
450	switch (port->num) {
451	case PORT_DAC:
452		/* Set physical address of the DMA buffer */
453		audioens_writemem(dev, CONC_DAC1CTL_PAGE, CONC_dDAC1PADDR_OFF,
454		    port->paddr);
455		audioens_writemem(dev, CONC_DAC2CTL_PAGE, CONC_dDAC2PADDR_OFF,
456		    port->paddr + (port->nframes * sizeof (int16_t) * 2));
457
458		/* Set DAC rate */
459		SRCSetRate(dev, SRC_DAC1_BASE, port->speed);
460		SRCSetRate(dev, SRC_DAC2_BASE, port->speed);
461
462		/* Configure the channel setup - SPDIF only uses front */
463		tmp = GET32(dev, CONC_dSTATUS_OFF);
464		tmp &= ~(CONC_STATUS_SPKR_MASK | CONC_STATUS_SPDIF_MASK);
465		tmp |= CONC_STATUS_SPKR_4CH | CONC_STATUS_SPDIF_P1;
466		PUT32(dev, CONC_dSTATUS_OFF, tmp);
467
468		/* Set format */
469		PUT8(dev, CONC_bSKIPC_OFF, 0x10);
470		SET8(dev, CONC_bSERFMT_OFF,
471		    CONC_PCM_DAC1_16BIT | CONC_PCM_DAC2_16BIT |
472		    CONC_PCM_DAC1_STEREO | CONC_PCM_DAC2_STEREO);
473
474		/* Set the frame count */
475		audioens_writemem(dev, CONC_DAC1CTL_PAGE, CONC_wDAC1FC_OFF,
476		    port->nframes - 1);
477		audioens_writemem(dev, CONC_DAC2CTL_PAGE, CONC_wDAC2FC_OFF,
478		    port->nframes - 1);
479
480		/* Set # of frames between interrupts */
481		PUT16(dev, CONC_wDAC1IC_OFF, port->nframes - 1);
482		PUT16(dev, CONC_wDAC2IC_OFF, port->nframes - 1);
483
484		SET8(dev, CONC_bDEVCTL_OFF,
485		    CONC_DEVCTL_DAC2_EN | CONC_DEVCTL_DAC1_EN);
486
487		break;
488
489	case PORT_ADC:
490		/* Set physical address of the DMA buffer */
491		audioens_writemem(dev, CONC_ADCCTL_PAGE, CONC_dADCPADDR_OFF,
492		    port->paddr);
493
494		/* Set ADC rate */
495		SRCSetRate(dev, SRC_ADC_BASE, port->speed);
496
497		/* Set format - for input we only support 16 bit input */
498		tmp = GET8(dev, CONC_bSERFMT_OFF);
499		tmp |= CONC_PCM_ADC_16BIT;
500		tmp |= CONC_PCM_ADC_STEREO;
501
502		PUT8(dev, CONC_bSKIPC_OFF, 0x10);
503
504		PUT8(dev, CONC_bSERFMT_OFF, tmp);
505
506		/* Set the frame count */
507		audioens_writemem(dev, CONC_ADCCTL_PAGE, CONC_wADCFC_OFF,
508		    port->nframes - 1);
509
510		/* Set # of frames between interrupts */
511		PUT16(dev, CONC_wADCIC_OFF, port->nframes - 1);
512
513		SET8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_ADC_EN);
514		break;
515	}
516
517	port->frameno = 0;
518	mutex_exit(&dev->mutex);
519
520	return (0);
521}
522
523static void
524audioens_stop(void *arg)
525{
526	audioens_port_t *port = arg;
527	audioens_dev_t *dev = port->dev;
528
529	mutex_enter(&dev->mutex);
530	switch (port->num) {
531	case PORT_DAC:
532		CLR8(dev, CONC_bDEVCTL_OFF,
533		    CONC_DEVCTL_DAC2_EN | CONC_DEVCTL_DAC1_EN);
534		break;
535	case PORT_ADC:
536		CLR8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_ADC_EN);
537		break;
538	}
539	mutex_exit(&dev->mutex);
540}
541
542static uint64_t
543audioens_count(void *arg)
544{
545	audioens_port_t *port = arg;
546	audioens_dev_t *dev = port->dev;
547	uint64_t val;
548	uint32_t page, offs;
549	int frameno, n;
550
551	switch (port->num) {
552	case PORT_DAC:
553		page = CONC_DAC1CTL_PAGE;
554		offs = CONC_wDAC1FC_OFF;
555		break;
556
557	case PORT_ADC:
558		page = CONC_ADCCTL_PAGE;
559		offs = CONC_wADCFC_OFF;
560		break;
561	}
562
563	mutex_enter(&dev->mutex);
564	/*
565	 * Note that the current frame counter is in the high nybble.
566	 */
567	frameno = audioens_readmem(port->dev, page, offs) >> 16;
568	n = frameno >= port->frameno ?
569	    frameno - port->frameno :
570	    frameno + port->nframes - port->frameno;
571	port->frameno = frameno;
572	port->count += n;
573
574	val = port->count;
575	mutex_exit(&dev->mutex);
576
577	return (val);
578}
579
580static void
581audioens_close(void *arg)
582{
583	_NOTE(ARGUNUSED(arg));
584}
585
586static void
587audioens_sync(void *arg, unsigned nframes)
588{
589	audioens_port_t *port = arg;
590
591	_NOTE(ARGUNUSED(nframes));
592
593	if (port->num == PORT_ADC) {
594		(void) ddi_dma_sync(port->dmah, 0, 0, DDI_DMA_SYNC_FORKERNEL);
595	} else {
596		(void) ddi_dma_sync(port->dmah, 0, 0, DDI_DMA_SYNC_FORDEV);
597	}
598}
599
600static void
601audioens_chinfo(void *arg, int chan, unsigned *offset, unsigned *incr)
602{
603	audioens_port_t *port = arg;
604
605	if ((port->num == PORT_DAC) && (chan >= 2)) {
606		*offset = (port->nframes * 2) + (chan % 2);
607		*incr = 2;
608	} else {
609		*offset = chan;
610		*incr = 2;
611	}
612}
613
614audio_engine_ops_t audioens_engine_ops = {
615	AUDIO_ENGINE_VERSION,		/* version number */
616	audioens_open,
617	audioens_close,
618	audioens_start,
619	audioens_stop,
620	audioens_count,
621	audioens_format,
622	audioens_channels,
623	audioens_rate,
624	audioens_sync,
625	NULL,
626	audioens_chinfo,
627	NULL,
628};
629
630void
631audioens_init_hw(audioens_dev_t *dev)
632{
633	int tmp;
634
635	if ((dev->devid == ENSONIQ_ES5880) ||
636	    (dev->devid == ENSONIQ_ES5880A) ||
637	    (dev->devid == ENSONIQ_ES5880B) ||
638	    (dev->devid == 0x1371 && dev->revision == 7) ||
639	    (dev->devid == 0x1371 && dev->revision >= 9)) {
640
641		/* Have a ES5880 so enable the codec manually */
642		tmp = GET8(dev, CONC_bINTSUMM_OFF) & 0xff;
643		tmp |= 0x20;
644		PUT8(dev, CONC_bINTSUMM_OFF, tmp);
645		for (int i = 0; i < 2000; i++)
646			drv_usecwait(10);
647	}
648
649	SRCInit(dev);
650
651	/*
652	 * Turn on CODEC (UART and joystick left disabled)
653	 */
654	tmp = GET32(dev, CONC_bDEVCTL_OFF) & 0xff;
655	tmp &= ~(CONC_DEVCTL_PCICLK_DS | CONC_DEVCTL_XTALCLK_DS);
656	PUT8(dev, CONC_bDEVCTL_OFF, tmp);
657	PUT8(dev, CONC_bUARTCSTAT_OFF, 0x00);
658
659	/* Perform AC97 codec warm reset */
660	tmp = GET8(dev, CONC_bMISCCTL_OFF) & 0xff;
661	PUT8(dev, CONC_bMISCCTL_OFF, tmp | CONC_MISCCTL_SYNC_RES);
662	drv_usecwait(200);
663	PUT8(dev, CONC_bMISCCTL_OFF, tmp);
664	drv_usecwait(200);
665
666	if (dev->revision >= 4) {
667		/* XXX: enable SPDIF - PCM only for now */
668		if (audioens_spdif) {
669			/* enable SPDIF */
670			PUT32(dev, 0x04, GET32(dev, 0x04) | (1 << 18));
671			/* SPDIF out = data from DAC */
672			PUT32(dev, 0x00, GET32(dev, 0x00) | (1 << 26));
673			CLR32(dev, CONC_dSPDIF_OFF, CONC_SPDIF_AC3);
674
675		} else {
676			/* disable spdif out */
677			PUT32(dev, 0x04, GET32(dev, 0x04) & ~(1 << 18));
678			PUT32(dev, 0x00, GET32(dev, 0x00) & ~(1 << 26));
679		}
680
681		/* we want to run each channel independently */
682		CLR32(dev, CONC_dSTATUS_OFF, CONC_STATUS_ECHO);
683	}
684}
685
686static int
687audioens_init(audioens_dev_t *dev)
688{
689
690	audioens_init_hw(dev);
691
692	/*
693	 * On this hardware, we want to disable the internal speaker by
694	 * default, if it exists.  (We don't have a speakerphone on any
695	 * of these cards, and no SPARC hardware uses it either!)
696	 */
697	(void) ddi_prop_update_int(DDI_DEV_T_NONE, dev->dip, AC97_PROP_SPEAKER,
698	    0);
699
700	/*
701	 * Init mixer
702	 */
703
704	dev->ac97 = ac97_alloc(dev->dip, audioens_rd97, audioens_wr97, dev);
705	if (dev->ac97 == NULL)
706		return (DDI_FAILURE);
707
708	if (ac97_init(dev->ac97, dev->osdev) != 0) {
709		return (DDI_FAILURE);
710	}
711
712	for (int i = 0; i <= PORT_MAX; i++) {
713		audioens_port_t *port;
714		unsigned caps;
715		unsigned dmaflags;
716		size_t rlen;
717		ddi_dma_cookie_t c;
718		unsigned ccnt;
719
720		port = &dev->port[i];
721		port->dev = dev;
722
723		switch (i) {
724		case PORT_DAC:
725			port->nchan = 4;
726			port->speed = 48000;
727			caps = ENGINE_OUTPUT_CAP;
728			dmaflags = DDI_DMA_WRITE | DDI_DMA_CONSISTENT;
729			break;
730
731		case PORT_ADC:
732			port->nchan = 2;
733			port->speed = 48000;
734			caps = ENGINE_INPUT_CAP;
735			dmaflags = DDI_DMA_READ | DDI_DMA_CONSISTENT;
736			break;
737		}
738
739		port->num = i;
740
741		/*
742		 * Allocate DMA resources.
743		 */
744
745		if (ddi_dma_alloc_handle(dev->dip, &dma_attr, DDI_DMA_SLEEP,
746		    NULL, &port->dmah) != DDI_SUCCESS) {
747			audio_dev_warn(dev->osdev,
748			    "port %d: dma handle allocation failed", i);
749			return (DDI_FAILURE);
750		}
751		if (ddi_dma_mem_alloc(port->dmah, AUDIOENS_BUF_LEN, &buf_attr,
752		    DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->kaddr,
753		    &rlen, &port->acch) != DDI_SUCCESS) {
754			audio_dev_warn(dev->osdev,
755			    "port %d: dma memory allocation failed", i);
756			return (DDI_FAILURE);
757		}
758		/* ensure that the buffer is zeroed out properly */
759		bzero(port->kaddr, rlen);
760		if (ddi_dma_addr_bind_handle(port->dmah, NULL, port->kaddr,
761		    AUDIOENS_BUF_LEN, dmaflags, DDI_DMA_SLEEP, NULL,
762		    &c, &ccnt) != DDI_DMA_MAPPED) {
763			audio_dev_warn(dev->osdev,
764			    "port %d: dma binding failed", i);
765			return (DDI_FAILURE);
766		}
767		port->paddr = c.dmac_address;
768
769		/*
770		 * Allocate and configure audio engine.
771		 */
772		port->engine = audio_engine_alloc(&audioens_engine_ops, caps);
773		if (port->engine == NULL) {
774			audio_dev_warn(dev->osdev,
775			    "port %d: audio_engine_alloc failed", i);
776			return (DDI_FAILURE);
777		}
778
779		audio_engine_set_private(port->engine, port);
780		audio_dev_add_engine(dev->osdev, port->engine);
781	}
782
783	/*
784	 * Set up kstats for interrupt reporting.
785	 */
786	if (audio_dev_register(dev->osdev) != DDI_SUCCESS) {
787		audio_dev_warn(dev->osdev,
788		    "unable to register with audio framework");
789		return (DDI_FAILURE);
790	}
791
792	return (DDI_SUCCESS);
793}
794
795void
796audioens_destroy(audioens_dev_t *dev)
797{
798	int	i;
799
800	mutex_destroy(&dev->mutex);
801
802	/* free up ports, including DMA resources for ports */
803	for (i = 0; i <= PORT_MAX; i++) {
804		audioens_port_t	*port = &dev->port[i];
805
806		if (port->paddr != 0)
807			(void) ddi_dma_unbind_handle(port->dmah);
808		if (port->acch != NULL)
809			ddi_dma_mem_free(&port->acch);
810		if (port->dmah != NULL)
811			ddi_dma_free_handle(&port->dmah);
812
813		if (port->engine != NULL) {
814			audio_dev_remove_engine(dev->osdev, port->engine);
815			audio_engine_free(port->engine);
816		}
817	}
818
819	if (dev->acch != NULL) {
820		ddi_regs_map_free(&dev->acch);
821	}
822
823	if (dev->ac97) {
824		ac97_free(dev->ac97);
825	}
826
827	if (dev->osdev != NULL) {
828		audio_dev_free(dev->osdev);
829	}
830
831	kmem_free(dev, sizeof (*dev));
832}
833
834int
835audioens_attach(dev_info_t *dip)
836{
837	uint16_t pci_command, vendor, device;
838	uint8_t revision;
839	audioens_dev_t *dev;
840	ddi_acc_handle_t pcih;
841	const char *chip_name;
842	const char *chip_vers;
843
844	dev = kmem_zalloc(sizeof (*dev), KM_SLEEP);
845	dev->dip = dip;
846	ddi_set_driver_private(dip, dev);
847	mutex_init(&dev->mutex, NULL, MUTEX_DRIVER, NULL);
848
849	if (pci_config_setup(dip, &pcih) != DDI_SUCCESS) {
850		audio_dev_warn(dev->osdev, "pci_config_setup failed");
851		kmem_free(dev, sizeof (*dev));
852		mutex_destroy(&dev->mutex);
853		return (DDI_FAILURE);
854	}
855
856	vendor = pci_config_get16(pcih, PCI_CONF_VENID);
857	device = pci_config_get16(pcih, PCI_CONF_DEVID);
858	revision = pci_config_get8(pcih, PCI_CONF_REVID);
859
860	if ((vendor != ENSONIQ_VENDOR_ID && vendor != CREATIVE_VENDOR_ID) ||
861	    (device != ENSONIQ_ES1371 && device != ENSONIQ_ES5880 &&
862	    device != ENSONIQ_ES5880A && device != ECTIVA_ES1938 &&
863	    device != ENSONIQ_ES5880B))
864		goto err_exit;
865
866	chip_name = "AudioPCI97";
867	chip_vers = "unknown";
868
869	switch (device) {
870	case ENSONIQ_ES1371:
871		chip_name = "AudioPCI97";
872		switch (revision) {
873		case 0x02:
874		case 0x09:
875		default:
876			chip_vers = "ES1371";
877			break;
878		case 0x04:
879		case 0x06:
880		case 0x08:
881			chip_vers = "ES1373";
882			break;
883		case 0x07:
884			chip_vers = "ES5880";
885			break;
886		}
887		break;
888
889	case ENSONIQ_ES5880:
890		chip_name = "SB PCI128";
891		chip_vers = "ES5880";
892		break;
893	case ENSONIQ_ES5880A:
894		chip_name = "SB PCI128";
895		chip_vers = "ES5880A";
896		break;
897	case ENSONIQ_ES5880B:
898		chip_name = "SB PCI128";
899		chip_vers = "ES5880B";
900		break;
901
902	case ECTIVA_ES1938:
903		chip_name = "AudioPCI";
904		chip_vers = "ES1938";
905		break;
906	}
907
908	dev->revision = revision;
909	dev->devid = device;
910
911	dev->osdev = audio_dev_alloc(dip, 0);
912	if (dev->osdev == NULL) {
913		goto err_exit;
914	}
915
916	audio_dev_set_description(dev->osdev, chip_name);
917	audio_dev_set_version(dev->osdev, chip_vers);
918
919	/* set the PCI latency */
920	if ((audioens_latency == 32) || (audioens_latency == 64) ||
921	    (audioens_latency == 96))
922		pci_config_put8(pcih, PCI_CONF_LATENCY_TIMER,
923		    audioens_latency);
924
925	/* activate the device */
926	pci_command = pci_config_get16(pcih, PCI_CONF_COMM);
927	pci_command |= PCI_COMM_ME | PCI_COMM_IO;
928	pci_config_put16(pcih, PCI_CONF_COMM, pci_command);
929
930	/* map registers */
931	if (ddi_regs_map_setup(dip, 1, &dev->regs, 0, 0, &acc_attr,
932	    &dev->acch) != DDI_SUCCESS) {
933		audio_dev_warn(dev->osdev, "can't map registers");
934		goto err_exit;
935	}
936
937	/* This allocates and configures the engines */
938	if (audioens_init(dev) != DDI_SUCCESS) {
939		audio_dev_warn(dev->osdev, "can't init device");
940		goto err_exit;
941	}
942
943	pci_config_teardown(&pcih);
944
945	ddi_report_dev(dip);
946
947	return (DDI_SUCCESS);
948
949err_exit:
950	pci_config_teardown(&pcih);
951
952	audioens_destroy(dev);
953
954	return (DDI_FAILURE);
955}
956
957int
958audioens_detach(audioens_dev_t *dev)
959{
960	int tmp;
961
962	/* first unregister us from the DDI framework, might be busy */
963	if (audio_dev_unregister(dev->osdev) != DDI_SUCCESS)
964		return (DDI_FAILURE);
965
966	mutex_enter(&dev->mutex);
967
968	tmp = GET8(dev, CONC_bSERCTL_OFF) &
969	    ~(CONC_SERCTL_DAC2IE | CONC_SERCTL_DAC1IE | CONC_SERCTL_ADCIE);
970	PUT8(dev, CONC_bSERCTL_OFF, tmp);
971	PUT8(dev, CONC_bSERCTL_OFF, tmp);
972	PUT8(dev, CONC_bSERCTL_OFF, tmp);
973	PUT8(dev, CONC_bSERCTL_OFF, tmp);
974
975	tmp = GET8(dev, CONC_bDEVCTL_OFF) &
976	    ~(CONC_DEVCTL_DAC2_EN | CONC_DEVCTL_ADC_EN | CONC_DEVCTL_DAC1_EN);
977	PUT8(dev, CONC_bDEVCTL_OFF, tmp);
978	PUT8(dev, CONC_bDEVCTL_OFF, tmp);
979	PUT8(dev, CONC_bDEVCTL_OFF, tmp);
980	PUT8(dev, CONC_bDEVCTL_OFF, tmp);
981
982	mutex_exit(&dev->mutex);
983
984	audioens_destroy(dev);
985
986	return (DDI_SUCCESS);
987}
988
989static int
990audioens_resume(audioens_dev_t *dev)
991{
992	/* reinitialize hardware */
993	audioens_init_hw(dev);
994
995	/* restore AC97 state */
996	ac97_reset(dev->ac97);
997
998	audio_dev_resume(dev->osdev);
999
1000	return (DDI_SUCCESS);
1001}
1002
1003static int
1004audioens_suspend(audioens_dev_t *dev)
1005{
1006	audio_dev_suspend(dev->osdev);
1007
1008	return (DDI_SUCCESS);
1009}
1010
1011static int
1012audioens_quiesce(dev_info_t *dip)
1013{
1014	audioens_dev_t	*dev;
1015	uint8_t		tmp;
1016
1017	if ((dev = ddi_get_driver_private(dip)) == NULL) {
1018		return (DDI_FAILURE);
1019	}
1020
1021	/* This disables all DMA engines and interrupts */
1022	tmp = GET8(dev, CONC_bSERCTL_OFF) &
1023	    ~(CONC_SERCTL_DAC2IE | CONC_SERCTL_DAC1IE | CONC_SERCTL_ADCIE);
1024	PUT8(dev, CONC_bSERCTL_OFF, tmp);
1025	PUT8(dev, CONC_bSERCTL_OFF, tmp);
1026	PUT8(dev, CONC_bSERCTL_OFF, tmp);
1027	PUT8(dev, CONC_bSERCTL_OFF, tmp);
1028
1029	tmp = GET8(dev, CONC_bDEVCTL_OFF) &
1030	    ~(CONC_DEVCTL_DAC2_EN | CONC_DEVCTL_ADC_EN | CONC_DEVCTL_DAC1_EN);
1031	PUT8(dev, CONC_bDEVCTL_OFF, tmp);
1032	PUT8(dev, CONC_bDEVCTL_OFF, tmp);
1033	PUT8(dev, CONC_bDEVCTL_OFF, tmp);
1034	PUT8(dev, CONC_bDEVCTL_OFF, tmp);
1035
1036	return (DDI_SUCCESS);
1037}
1038
1039
1040static int
1041audioens_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
1042{
1043	audioens_dev_t *dev;
1044
1045	switch (cmd) {
1046	case DDI_ATTACH:
1047		return (audioens_attach(dip));
1048
1049	case DDI_RESUME:
1050		if ((dev = ddi_get_driver_private(dip)) == NULL) {
1051			return (DDI_FAILURE);
1052		}
1053		return (audioens_resume(dev));
1054
1055	default:
1056		return (DDI_FAILURE);
1057	}
1058}
1059
1060static int
1061audioens_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
1062{
1063	audioens_dev_t *dev;
1064
1065	if ((dev = ddi_get_driver_private(dip)) == NULL) {
1066		return (DDI_FAILURE);
1067	}
1068
1069	switch (cmd) {
1070	case DDI_DETACH:
1071		return (audioens_detach(dev));
1072
1073	case DDI_SUSPEND:
1074		return (audioens_suspend(dev));
1075	default:
1076		return (DDI_FAILURE);
1077	}
1078}
1079
1080static int audioens_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
1081static int audioens_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
1082
1083static struct dev_ops audioens_dev_ops = {
1084	DEVO_REV,		/* rev */
1085	0,			/* refcnt */
1086	NULL,			/* getinfo */
1087	nulldev,		/* identify */
1088	nulldev,		/* probe */
1089	audioens_ddi_attach,	/* attach */
1090	audioens_ddi_detach,	/* detach */
1091	nodev,			/* reset */
1092	NULL,			/* cb_ops */
1093	NULL,			/* bus_ops */
1094	NULL,			/* power */
1095	audioens_quiesce,	/* quiesce */
1096};
1097
1098static struct modldrv audioens_modldrv = {
1099	&mod_driverops,			/* drv_modops */
1100	"Ensoniq 1371/1373 Audio",	/* linkinfo */
1101	&audioens_dev_ops,		/* dev_ops */
1102};
1103
1104static struct modlinkage modlinkage = {
1105	MODREV_1,
1106	{ &audioens_modldrv, NULL }
1107};
1108
1109int
1110_init(void)
1111{
1112	int	rv;
1113
1114	audio_init_ops(&audioens_dev_ops, DRVNAME);
1115	if ((rv = mod_install(&modlinkage)) != 0) {
1116		audio_fini_ops(&audioens_dev_ops);
1117	}
1118	return (rv);
1119}
1120
1121int
1122_fini(void)
1123{
1124	int	rv;
1125
1126	if ((rv = mod_remove(&modlinkage)) == 0) {
1127		audio_fini_ops(&audioens_dev_ops);
1128	}
1129	return (rv);
1130}
1131
1132int
1133_info(struct modinfo *modinfop)
1134{
1135	return (mod_info(&modlinkage, modinfop));
1136}
1137