2 * Copyright (c) 2001 Scott Long <scottl@freebsd.org>
3 * Copyright (c) 2001 Darrell Anderson <anderson@cs.duke.edu>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * $FreeBSD: src/sys/dev/sound/pci/maestro3.c,v 1.28.2.2 2007/03/12 02:03:25 ariff Exp $
28 * $DragonFly: src/sys/dev/sound/pci/maestro3.c,v 1.12 2007/06/16 20:07:19 dillon Exp $
32 * Maestro-3/Allegro FreeBSD pcm sound driver
34 * executive status summary:
35 * (+) /dev/dsp multiple concurrent play channels.
36 * (+) /dev/dsp config (speed, mono/stereo, 8/16 bit).
37 * (+) /dev/mixer sets left/right volumes.
38 * (+) /dev/dsp recording works. Tested successfully with the cdrom channel
39 * (+) apm suspend/resume works, and works properly!.
40 * (-) hardware volme controls don't work =-(
41 * (-) setblocksize() does nothing.
43 * The real credit goes to:
45 * Zach Brown for his Linux driver core and helpful technical comments.
46 * <zab@zabbo.net>, http://www.zabbo.net/maestro3
48 * Cameron Grant created the pcm framework used here nearly verbatim.
49 * <cg@freebsd.org>, http://people.freebsd.org/~cg/template.c
51 * Taku YAMAMOTO for his Maestro-1/2 FreeBSD driver and sanity reference.
52 * <taku@cent.saitama-u.ac.jp>
54 * ESS docs explained a few magic registers and numbers.
55 * http://virgo.caltech.edu/~dmoore/maestro3.pdf.gz
58 #include <dev/sound/pcm/sound.h>
59 #include <dev/sound/pcm/ac97.h>
61 #include <bus/pci/pcireg.h>
62 #include <bus/pci/pcivar.h>
64 #include <dev/sound/pci/gnu/maestro3_reg.h>
65 #include <dev/sound/pci/gnu/maestro3_dsp.h>
67 SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pci/maestro3.c,v 1.12 2007/06/16 20:07:19 dillon Exp $");
69 /* -------------------------------------------------------------------- */
71 enum {CHANGE
=0, CALL
=1, INTR
=2, BORING
=3, NONE
=-1};
72 #ifndef M3_DEBUG_LEVEL
73 #define M3_DEBUG_LEVEL NONE
75 #define M3_DEBUG(level, _msg) {if ((level) <= M3_DEBUG_LEVEL) {kprintf _msg;}}
77 /* -------------------------------------------------------------------- */
83 static struct m3_card_type
{
84 u_int32_t pci_id
; int which
; int delay1
; int delay2
; char *name
;
86 { 0x1988125d, ESS_ALLEGRO_1
, 50, 800, "ESS Technology Allegro-1" },
87 { 0x1998125d, ESS_MAESTRO3
, 20, 500, "ESS Technology Maestro3" },
88 { 0x199a125d, ESS_MAESTRO3
, 20, 500, "ESS Technology Maestro3" },
92 #define M3_BUFSIZE_MIN 4096
93 #define M3_BUFSIZE_MAX 65536
94 #define M3_BUFSIZE_DEFAULT 4096
95 #define M3_PCHANS 4 /* create /dev/dsp0.[0-N] to use more than one */
97 #define M3_MAXADDR ((1 << 27) - 1)
104 struct snd_dbuf
*buffer
;
105 struct pcm_channel
*channel
;
106 struct sc_info
*parent
;
118 struct snd_dbuf
*buffer
;
119 struct pcm_channel
*channel
;
120 struct sc_info
*parent
;
137 bus_space_handle_t sh
;
138 bus_dma_tag_t parent_dmat
;
140 struct resource
*reg
;
141 struct resource
*irq
;
147 struct sc_pchinfo pch
[M3_PCHANS
];
148 struct sc_rchinfo rch
[M3_RCHANS
];
158 #define M3_LOCK(_sc) snd_mtxlock((_sc)->sc_lock)
159 #define M3_UNLOCK(_sc) snd_mtxunlock((_sc)->sc_lock)
160 #define M3_LOCK_ASSERT(_sc) snd_mtxassert((_sc)->sc_lock)
162 /* -------------------------------------------------------------------- */
164 /* play channel interface */
165 static void *m3_pchan_init(kobj_t
, void *, struct snd_dbuf
*, struct pcm_channel
*, int);
166 static int m3_pchan_free(kobj_t
, void *);
167 static int m3_pchan_setformat(kobj_t
, void *, u_int32_t
);
168 static int m3_pchan_setspeed(kobj_t
, void *, u_int32_t
);
169 static int m3_pchan_setblocksize(kobj_t
, void *, u_int32_t
);
170 static int m3_pchan_trigger(kobj_t
, void *, int);
171 static int m3_pchan_trigger_locked(kobj_t
, void *, int);
172 static u_int32_t
m3_pchan_getptr_internal(struct sc_pchinfo
*);
173 static u_int32_t
m3_pchan_getptr(kobj_t
, void *);
174 static struct pcmchan_caps
*m3_pchan_getcaps(kobj_t
, void *);
176 /* record channel interface */
177 static void *m3_rchan_init(kobj_t
, void *, struct snd_dbuf
*, struct pcm_channel
*, int);
178 static int m3_rchan_free(kobj_t
, void *);
179 static int m3_rchan_setformat(kobj_t
, void *, u_int32_t
);
180 static int m3_rchan_setspeed(kobj_t
, void *, u_int32_t
);
181 static int m3_rchan_setblocksize(kobj_t
, void *, u_int32_t
);
182 static int m3_rchan_trigger(kobj_t
, void *, int);
183 static int m3_rchan_trigger_locked(kobj_t
, void *, int);
184 static u_int32_t
m3_rchan_getptr_internal(struct sc_rchinfo
*);
185 static u_int32_t
m3_rchan_getptr(kobj_t
, void *);
186 static struct pcmchan_caps
*m3_rchan_getcaps(kobj_t
, void *);
188 static int m3_chan_active(struct sc_info
*);
190 /* talk to the codec - called from ac97.c */
191 static int m3_initcd(kobj_t
, void *);
192 static int m3_rdcd(kobj_t
, void *, int);
193 static int m3_wrcd(kobj_t
, void *, int, u_int32_t
);
196 static void m3_intr(void *);
197 static int m3_power(struct sc_info
*, int);
198 static int m3_init(struct sc_info
*);
199 static int m3_uninit(struct sc_info
*);
200 static u_int8_t
m3_assp_halt(struct sc_info
*);
201 static void m3_config(struct sc_info
*);
202 static void m3_amp_enable(struct sc_info
*);
203 static void m3_enable_ints(struct sc_info
*);
204 static void m3_codec_reset(struct sc_info
*);
206 /* -------------------------------------------------------------------- */
207 /* Codec descriptor */
208 static kobj_method_t m3_codec_methods
[] = {
209 KOBJMETHOD(ac97_init
, m3_initcd
),
210 KOBJMETHOD(ac97_read
, m3_rdcd
),
211 KOBJMETHOD(ac97_write
, m3_wrcd
),
214 AC97_DECLARE(m3_codec
);
216 /* -------------------------------------------------------------------- */
217 /* channel descriptors */
219 static u_int32_t m3_playfmt
[] = {
221 AFMT_STEREO
| AFMT_U8
,
223 AFMT_STEREO
| AFMT_S16_LE
,
226 static struct pcmchan_caps m3_playcaps
= {8000, 48000, m3_playfmt
, 0};
228 static kobj_method_t m3_pch_methods
[] = {
229 KOBJMETHOD(channel_init
, m3_pchan_init
),
230 KOBJMETHOD(channel_setformat
, m3_pchan_setformat
),
231 KOBJMETHOD(channel_setspeed
, m3_pchan_setspeed
),
232 KOBJMETHOD(channel_setblocksize
, m3_pchan_setblocksize
),
233 KOBJMETHOD(channel_trigger
, m3_pchan_trigger
),
234 KOBJMETHOD(channel_getptr
, m3_pchan_getptr
),
235 KOBJMETHOD(channel_getcaps
, m3_pchan_getcaps
),
236 KOBJMETHOD(channel_free
, m3_pchan_free
),
239 CHANNEL_DECLARE(m3_pch
);
241 static u_int32_t m3_recfmt
[] = {
243 AFMT_STEREO
| AFMT_U8
,
245 AFMT_STEREO
| AFMT_S16_LE
,
248 static struct pcmchan_caps m3_reccaps
= {8000, 48000, m3_recfmt
, 0};
250 static kobj_method_t m3_rch_methods
[] = {
251 KOBJMETHOD(channel_init
, m3_rchan_init
),
252 KOBJMETHOD(channel_setformat
, m3_rchan_setformat
),
253 KOBJMETHOD(channel_setspeed
, m3_rchan_setspeed
),
254 KOBJMETHOD(channel_setblocksize
, m3_rchan_setblocksize
),
255 KOBJMETHOD(channel_trigger
, m3_rchan_trigger
),
256 KOBJMETHOD(channel_getptr
, m3_rchan_getptr
),
257 KOBJMETHOD(channel_getcaps
, m3_rchan_getcaps
),
258 KOBJMETHOD(channel_free
, m3_rchan_free
),
261 CHANNEL_DECLARE(m3_rch
);
263 /* -------------------------------------------------------------------- */
264 /* some i/o convenience functions */
266 #define m3_rd_1(sc, regno) bus_space_read_1(sc->st, sc->sh, regno)
267 #define m3_rd_2(sc, regno) bus_space_read_2(sc->st, sc->sh, regno)
268 #define m3_rd_4(sc, regno) bus_space_read_4(sc->st, sc->sh, regno)
269 #define m3_wr_1(sc, regno, data) bus_space_write_1(sc->st, sc->sh, regno, data)
270 #define m3_wr_2(sc, regno, data) bus_space_write_2(sc->st, sc->sh, regno, data)
271 #define m3_wr_4(sc, regno, data) bus_space_write_4(sc->st, sc->sh, regno, data)
272 #define m3_rd_assp_code(sc, index) \
273 m3_rd_assp(sc, MEMTYPE_INTERNAL_CODE, index)
274 #define m3_wr_assp_code(sc, index, data) \
275 m3_wr_assp(sc, MEMTYPE_INTERNAL_CODE, index, data)
276 #define m3_rd_assp_data(sc, index) \
277 m3_rd_assp(sc, MEMTYPE_INTERNAL_DATA, index)
278 #define m3_wr_assp_data(sc, index, data) \
279 m3_wr_assp(sc, MEMTYPE_INTERNAL_DATA, index, data)
281 static __inline u_int16_t
282 m3_rd_assp(struct sc_info
*sc
, u_int16_t region
, u_int16_t index
)
284 m3_wr_2(sc
, DSP_PORT_MEMORY_TYPE
, region
& MEMTYPE_MASK
);
285 m3_wr_2(sc
, DSP_PORT_MEMORY_INDEX
, index
);
286 return m3_rd_2(sc
, DSP_PORT_MEMORY_DATA
);
290 m3_wr_assp(struct sc_info
*sc
, u_int16_t region
, u_int16_t index
,
293 m3_wr_2(sc
, DSP_PORT_MEMORY_TYPE
, region
& MEMTYPE_MASK
);
294 m3_wr_2(sc
, DSP_PORT_MEMORY_INDEX
, index
);
295 m3_wr_2(sc
, DSP_PORT_MEMORY_DATA
, data
);
299 m3_wait(struct sc_info
*sc
)
303 for (i
=0 ; i
<20 ; i
++) {
304 if ((m3_rd_1(sc
, CODEC_STATUS
) & 1) == 0) {
312 /* -------------------------------------------------------------------- */
316 m3_initcd(kobj_t kobj
, void *devinfo
)
318 struct sc_info
*sc
= (struct sc_info
*)devinfo
;
321 M3_DEBUG(CALL
, ("m3_initcd\n"));
325 data
= m3_rd_1(sc
, CODEC_COMMAND
);
326 return ((data
& 0x1) ? 0 : 1);
330 m3_rdcd(kobj_t kobj
, void *devinfo
, int regno
)
332 struct sc_info
*sc
= (struct sc_info
*)devinfo
;
336 device_printf(sc
->dev
, "m3_rdcd timed out.\n");
339 m3_wr_1(sc
, CODEC_COMMAND
, (regno
& 0x7f) | 0x80);
340 DELAY(50); /* ac97 cycle = 20.8 usec */
342 device_printf(sc
->dev
, "m3_rdcd timed out.\n");
345 data
= m3_rd_2(sc
, CODEC_DATA
);
350 m3_wrcd(kobj_t kobj
, void *devinfo
, int regno
, u_int32_t data
)
352 struct sc_info
*sc
= (struct sc_info
*)devinfo
;
354 device_printf(sc
->dev
, "m3_wrcd timed out.\n");
357 m3_wr_2(sc
, CODEC_DATA
, data
);
358 m3_wr_1(sc
, CODEC_COMMAND
, regno
& 0x7f);
359 DELAY(50); /* ac97 cycle = 20.8 usec */
363 /* -------------------------------------------------------------------- */
364 /* play channel interface */
366 #define LO(x) (((x) & 0x0000ffff) )
367 #define HI(x) (((x) & 0xffff0000) >> 16)
370 m3_pchan_init(kobj_t kobj
, void *devinfo
, struct snd_dbuf
*b
, struct pcm_channel
*c
, int dir
)
372 struct sc_info
*sc
= devinfo
;
373 struct sc_pchinfo
*ch
;
374 u_int32_t bus_addr
, i
;
375 int idx
, data_bytes
, dac_data
;
376 int dsp_in_size
, dsp_out_size
, dsp_in_buf
, dsp_out_buf
;
379 idx
= sc
->pch_cnt
; /* dac instance number, no active reuse! */
380 M3_DEBUG(CHANGE
, ("m3_pchan_init(dac=%d)\n", idx
));
382 if (dir
!= PCMDIR_PLAY
) {
384 device_printf(sc
->dev
, "m3_pchan_init not PCMDIR_PLAY\n");
388 data_bytes
= (((MINISRC_TMP_BUFFER_SIZE
& ~1) +
389 (MINISRC_IN_BUFFER_SIZE
& ~1) +
390 (MINISRC_OUT_BUFFER_SIZE
& ~1) + 4) + 255) &~ 255;
391 dac_data
= 0x1100 + (data_bytes
* idx
);
393 dsp_in_size
= MINISRC_IN_BUFFER_SIZE
- (0x20 * 2);
394 dsp_out_size
= MINISRC_OUT_BUFFER_SIZE
- (0x20 * 2);
395 dsp_in_buf
= dac_data
+ (MINISRC_TMP_BUFFER_SIZE
/2);
396 dsp_out_buf
= dsp_in_buf
+ (dsp_in_size
/2) + 1;
400 ch
->dac_data
= dac_data
;
401 if (ch
->dac_data
+ data_bytes
/2 >= 0x1c00) {
403 device_printf(sc
->dev
, "m3_pchan_init: revb mem exhausted\n");
411 ch
->spd
= DSP_DEFAULT_SPEED
;
412 M3_UNLOCK(sc
); /* XXX */
413 if (sndbuf_alloc(ch
->buffer
, sc
->parent_dmat
, sc
->bufsz
) != 0) {
414 device_printf(sc
->dev
, "m3_pchan_init chn_allocbuf failed\n");
418 ch
->bufsize
= sndbuf_getsize(ch
->buffer
);
420 /* host dma buffer pointers */
421 bus_addr
= sndbuf_getbufaddr(ch
->buffer
);
423 device_printf(sc
->dev
, "m3_pchan_init unaligned bus_addr\n");
424 bus_addr
= (bus_addr
+ 4) & ~3;
426 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_HOST_SRC_ADDRL
, LO(bus_addr
));
427 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_HOST_SRC_ADDRH
, HI(bus_addr
));
428 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_HOST_SRC_END_PLUS_1L
,
429 LO(bus_addr
+ ch
->bufsize
));
430 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_HOST_SRC_END_PLUS_1H
,
431 HI(bus_addr
+ ch
->bufsize
));
432 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_HOST_SRC_CURRENTL
,
434 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_HOST_SRC_CURRENTH
,
438 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_IN_BUF_BEGIN
, dsp_in_buf
);
439 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_IN_BUF_END_PLUS_1
,
440 dsp_in_buf
+ dsp_in_size
/2);
441 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_IN_BUF_HEAD
, dsp_in_buf
);
442 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_IN_BUF_TAIL
, dsp_in_buf
);
443 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_OUT_BUF_BEGIN
, dsp_out_buf
);
444 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_OUT_BUF_END_PLUS_1
,
445 dsp_out_buf
+ dsp_out_size
/2);
446 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_OUT_BUF_HEAD
, dsp_out_buf
);
447 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_OUT_BUF_TAIL
, dsp_out_buf
);
449 /* some per client initializers */
450 m3_wr_assp_data(sc
, ch
->dac_data
+ SRC3_DIRECTION_OFFSET
+ 12,
451 ch
->dac_data
+ 40 + 8);
452 m3_wr_assp_data(sc
, ch
->dac_data
+ SRC3_DIRECTION_OFFSET
+ 19,
453 0x400 + MINISRC_COEF_LOC
);
454 /* enable or disable low pass filter? (0xff if rate> 45000) */
455 m3_wr_assp_data(sc
, ch
->dac_data
+ SRC3_DIRECTION_OFFSET
+ 22, 0);
456 /* tell it which way dma is going? */
457 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_DMA_CONTROL
,
458 DMACONTROL_AUTOREPEAT
+ DMAC_PAGE3_SELECTOR
+
459 DMAC_BLOCKF_SELECTOR
);
461 /* set an armload of static initializers */
462 for(i
= 0 ; i
< (sizeof(pv
) / sizeof(pv
[0])) ; i
++) {
463 m3_wr_assp_data(sc
, ch
->dac_data
+ pv
[i
].addr
, pv
[i
].val
);
466 /* put us in the packed task lists */
467 m3_wr_assp_data(sc
, KDATA_INSTANCE0_MINISRC
+
468 (sc
->pch_cnt
+ sc
->rch_cnt
),
469 ch
->dac_data
>> DP_SHIFT_COUNT
);
470 m3_wr_assp_data(sc
, KDATA_DMA_XFER0
+ (sc
->pch_cnt
+ sc
->rch_cnt
),
471 ch
->dac_data
>> DP_SHIFT_COUNT
);
472 m3_wr_assp_data(sc
, KDATA_MIXER_XFER0
+ sc
->pch_cnt
,
473 ch
->dac_data
>> DP_SHIFT_COUNT
);
475 /* gotta start before stop */
476 m3_pchan_trigger_locked(NULL
, ch
, PCMTRIG_START
);
477 /* silence noise on load */
478 m3_pchan_trigger_locked(NULL
, ch
, PCMTRIG_STOP
);
487 m3_pchan_free(kobj_t kobj
, void *chdata
)
489 struct sc_pchinfo
*ch
= chdata
;
490 struct sc_info
*sc
= ch
->parent
;
493 M3_DEBUG(CHANGE
, ("m3_pchan_free(dac=%d)\n", ch
->dac_idx
));
496 * should remove this exact instance from the packed lists, but all
497 * are released at once (and in a stopped state) so this is ok.
499 m3_wr_assp_data(sc
, KDATA_INSTANCE0_MINISRC
+
500 (sc
->pch_cnt
- 1) + sc
->rch_cnt
, 0);
501 m3_wr_assp_data(sc
, KDATA_DMA_XFER0
+
502 (sc
->pch_cnt
- 1) + sc
->rch_cnt
, 0);
503 m3_wr_assp_data(sc
, KDATA_MIXER_XFER0
+ (sc
->pch_cnt
-1), 0);
511 m3_pchan_setformat(kobj_t kobj
, void *chdata
, u_int32_t format
)
513 struct sc_pchinfo
*ch
= chdata
;
514 struct sc_info
*sc
= ch
->parent
;
519 ("m3_pchan_setformat(dac=%d, format=0x%x{%s-%s})\n",
521 format
& (AFMT_U8
|AFMT_S8
) ? "8bit":"16bit",
522 format
& AFMT_STEREO
? "STEREO":"MONO"));
525 data
= (format
& AFMT_STEREO
) ? 0 : 1;
526 m3_wr_assp_data(sc
, ch
->dac_data
+ SRC3_MODE_OFFSET
, data
);
529 data
= ((format
& AFMT_U8
) || (format
& AFMT_S8
)) ? 1 : 0;
530 m3_wr_assp_data(sc
, ch
->dac_data
+ SRC3_WORD_LENGTH_OFFSET
, data
);
539 m3_pchan_setspeed(kobj_t kobj
, void *chdata
, u_int32_t speed
)
541 struct sc_pchinfo
*ch
= chdata
;
542 struct sc_info
*sc
= ch
->parent
;
546 M3_DEBUG(CHANGE
, ("m3_pchan_setspeed(dac=%d, speed=%d)\n",
547 ch
->dac_idx
, speed
));
549 if ((freq
= ((speed
<< 15) + 24000) / 48000) != 0) {
553 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_FREQUENCY
, freq
);
557 /* return closest possible speed */
562 m3_pchan_setblocksize(kobj_t kobj
, void *chdata
, u_int32_t blocksize
)
564 struct sc_pchinfo
*ch
= chdata
;
566 M3_DEBUG(CHANGE
, ("m3_pchan_setblocksize(dac=%d, blocksize=%d)\n",
567 ch
->dac_idx
, blocksize
));
569 return (sndbuf_getblksz(ch
->buffer
));
573 m3_pchan_trigger(kobj_t kobj
, void *chdata
, int go
)
575 struct sc_pchinfo
*ch
= chdata
;
576 struct sc_info
*sc
= ch
->parent
;
580 ret
= m3_pchan_trigger_locked(kobj
, chdata
, go
);
587 m3_chan_active(struct sc_info
*sc
)
593 for (i
= 0; i
< sc
->pch_cnt
; i
++)
594 ret
+= sc
->pch
[i
].active
;
596 for (i
= 0; i
< sc
->rch_cnt
; i
++)
597 ret
+= sc
->rch
[i
].active
;
603 m3_pchan_trigger_locked(kobj_t kobj
, void *chdata
, int go
)
605 struct sc_pchinfo
*ch
= chdata
;
606 struct sc_info
*sc
= ch
->parent
;
610 M3_DEBUG(go
== PCMTRIG_START
? CHANGE
:
611 go
== PCMTRIG_STOP
? CHANGE
:
612 go
== PCMTRIG_ABORT
? CHANGE
:
614 ("m3_pchan_trigger(dac=%d, go=0x%x{%s})\n", ch
->dac_idx
, go
,
615 go
== PCMTRIG_START
? "PCMTRIG_START" :
616 go
== PCMTRIG_STOP
? "PCMTRIG_STOP" :
617 go
== PCMTRIG_ABORT
? "PCMTRIG_ABORT" : "ignore"));
627 sc
->pch_active_cnt
++;
629 /*[[inc_timer_users]]*/
630 if (m3_chan_active(sc
) == 1) {
631 m3_wr_assp_data(sc
, KDATA_TIMER_COUNT_RELOAD
, 240);
632 m3_wr_assp_data(sc
, KDATA_TIMER_COUNT_CURRENT
, 240);
633 data
= m3_rd_2(sc
, HOST_INT_CTRL
);
634 m3_wr_2(sc
, HOST_INT_CTRL
, data
| CLKRUN_GEN_ENABLE
);
637 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_INSTANCE_READY
, 1);
638 m3_wr_assp_data(sc
, KDATA_MIXER_TASK_NUMBER
,
644 if (ch
->active
== 0) {
648 sc
->pch_active_cnt
--;
650 /* XXX should the channel be drained? */
651 /*[[dec_timer_users]]*/
652 if (m3_chan_active(sc
) == 0) {
653 m3_wr_assp_data(sc
, KDATA_TIMER_COUNT_RELOAD
, 0);
654 m3_wr_assp_data(sc
, KDATA_TIMER_COUNT_CURRENT
, 0);
655 data
= m3_rd_2(sc
, HOST_INT_CTRL
);
656 m3_wr_2(sc
, HOST_INT_CTRL
, data
& ~CLKRUN_GEN_ENABLE
);
659 m3_wr_assp_data(sc
, ch
->dac_data
+ CDATA_INSTANCE_READY
, 0);
660 m3_wr_assp_data(sc
, KDATA_MIXER_TASK_NUMBER
,
664 case PCMTRIG_EMLDMAWR
:
665 /* got play irq, transfer next buffer - ignore if using dma */
666 case PCMTRIG_EMLDMARD
:
667 /* got rec irq, transfer next buffer - ignore if using dma */
675 m3_pchan_getptr_internal(struct sc_pchinfo
*ch
)
677 struct sc_info
*sc
= ch
->parent
;
678 u_int32_t hi
, lo
, bus_base
, bus_crnt
;
680 bus_base
= sndbuf_getbufaddr(ch
->buffer
);
681 hi
= m3_rd_assp_data(sc
, ch
->dac_data
+ CDATA_HOST_SRC_CURRENTH
);
682 lo
= m3_rd_assp_data(sc
, ch
->dac_data
+ CDATA_HOST_SRC_CURRENTL
);
683 bus_crnt
= lo
| (hi
<< 16);
685 M3_DEBUG(CALL
, ("m3_pchan_getptr(dac=%d) result=%d\n",
686 ch
->dac_idx
, bus_crnt
- bus_base
));
688 return (bus_crnt
- bus_base
); /* current byte offset of channel */
692 m3_pchan_getptr(kobj_t kobj
, void *chdata
)
694 struct sc_pchinfo
*ch
= chdata
;
695 struct sc_info
*sc
= ch
->parent
;
705 static struct pcmchan_caps
*
706 m3_pchan_getcaps(kobj_t kobj
, void *chdata
)
708 struct sc_pchinfo
*ch
= chdata
;
710 M3_DEBUG(CALL
, ("m3_pchan_getcaps(dac=%d)\n", ch
->dac_idx
));
715 /* -------------------------------------------------------------------- */
716 /* rec channel interface */
719 m3_rchan_init(kobj_t kobj
, void *devinfo
, struct snd_dbuf
*b
, struct pcm_channel
*c
, int dir
)
721 struct sc_info
*sc
= devinfo
;
722 struct sc_rchinfo
*ch
;
723 u_int32_t bus_addr
, i
;
725 int idx
, data_bytes
, adc_data
;
726 int dsp_in_size
, dsp_out_size
, dsp_in_buf
, dsp_out_buf
;
729 idx
= sc
->rch_cnt
; /* adc instance number, no active reuse! */
730 M3_DEBUG(CHANGE
, ("m3_rchan_init(adc=%d)\n", idx
));
732 if (dir
!= PCMDIR_REC
) {
734 device_printf(sc
->dev
, "m3_pchan_init not PCMDIR_REC\n");
738 data_bytes
= (((MINISRC_TMP_BUFFER_SIZE
& ~1) +
739 (MINISRC_IN_BUFFER_SIZE
& ~1) +
740 (MINISRC_OUT_BUFFER_SIZE
& ~1) + 4) + 255) &~ 255;
741 adc_data
= 0x1100 + (data_bytes
* idx
) + data_bytes
/2;
742 dsp_in_size
= MINISRC_IN_BUFFER_SIZE
+ (0x10 * 2);
743 dsp_out_size
= MINISRC_OUT_BUFFER_SIZE
- (0x10 * 2);
744 dsp_in_buf
= adc_data
+ (MINISRC_TMP_BUFFER_SIZE
/ 2);
745 dsp_out_buf
= dsp_in_buf
+ (dsp_in_size
/ 2) + 1;
749 ch
->adc_data
= adc_data
;
750 if (ch
->adc_data
+ data_bytes
/2 >= 0x1c00) {
752 device_printf(sc
->dev
, "m3_rchan_init: revb mem exhausted\n");
760 ch
->spd
= DSP_DEFAULT_SPEED
;
761 M3_UNLOCK(sc
); /* XXX */
762 if (sndbuf_alloc(ch
->buffer
, sc
->parent_dmat
, sc
->bufsz
) != 0) {
763 device_printf(sc
->dev
, "m3_rchan_init chn_allocbuf failed\n");
767 ch
->bufsize
= sndbuf_getsize(ch
->buffer
);
769 /* host dma buffer pointers */
770 bus_addr
= sndbuf_getbufaddr(ch
->buffer
);
772 device_printf(sc
->dev
, "m3_rchan_init unaligned bus_addr\n");
773 bus_addr
= (bus_addr
+ 4) & ~3;
775 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_HOST_SRC_ADDRL
, LO(bus_addr
));
776 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_HOST_SRC_ADDRH
, HI(bus_addr
));
777 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_HOST_SRC_END_PLUS_1L
,
778 LO(bus_addr
+ ch
->bufsize
));
779 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_HOST_SRC_END_PLUS_1H
,
780 HI(bus_addr
+ ch
->bufsize
));
781 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_HOST_SRC_CURRENTL
,
783 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_HOST_SRC_CURRENTH
,
787 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_IN_BUF_BEGIN
, dsp_in_buf
);
788 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_IN_BUF_END_PLUS_1
,
789 dsp_in_buf
+ dsp_in_size
/2);
790 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_IN_BUF_HEAD
, dsp_in_buf
);
791 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_IN_BUF_TAIL
, dsp_in_buf
);
792 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_OUT_BUF_BEGIN
, dsp_out_buf
);
793 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_OUT_BUF_END_PLUS_1
,
794 dsp_out_buf
+ dsp_out_size
/2);
795 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_OUT_BUF_HEAD
, dsp_out_buf
);
796 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_OUT_BUF_TAIL
, dsp_out_buf
);
798 /* some per client initializers */
799 m3_wr_assp_data(sc
, ch
->adc_data
+ SRC3_DIRECTION_OFFSET
+ 12,
800 ch
->adc_data
+ 40 + 8);
801 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_DMA_CONTROL
,
802 DMACONTROL_DIRECTION
+ DMACONTROL_AUTOREPEAT
+
803 DMAC_PAGE3_SELECTOR
+ DMAC_BLOCKF_SELECTOR
);
805 /* set an armload of static initializers */
806 for(i
= 0 ; i
< (sizeof(rv
) / sizeof(rv
[0])) ; i
++) {
807 m3_wr_assp_data(sc
, ch
->adc_data
+ rv
[i
].addr
, rv
[i
].val
);
810 /* put us in the packed task lists */
811 m3_wr_assp_data(sc
, KDATA_INSTANCE0_MINISRC
+
812 (sc
->pch_cnt
+ sc
->rch_cnt
),
813 ch
->adc_data
>> DP_SHIFT_COUNT
);
814 m3_wr_assp_data(sc
, KDATA_DMA_XFER0
+ (sc
->pch_cnt
+ sc
->rch_cnt
),
815 ch
->adc_data
>> DP_SHIFT_COUNT
);
816 m3_wr_assp_data(sc
, KDATA_ADC1_XFER0
+ sc
->rch_cnt
,
817 ch
->adc_data
>> DP_SHIFT_COUNT
);
819 /* gotta start before stop */
820 m3_rchan_trigger_locked(NULL
, ch
, PCMTRIG_START
);
822 m3_rchan_trigger_locked(NULL
, ch
, PCMTRIG_STOP
);
831 m3_rchan_free(kobj_t kobj
, void *chdata
)
833 struct sc_rchinfo
*ch
= chdata
;
834 struct sc_info
*sc
= ch
->parent
;
837 M3_DEBUG(CHANGE
, ("m3_rchan_free(adc=%d)\n", ch
->adc_idx
));
840 * should remove this exact instance from the packed lists, but all
841 * are released at once (and in a stopped state) so this is ok.
843 m3_wr_assp_data(sc
, KDATA_INSTANCE0_MINISRC
+
844 (sc
->rch_cnt
- 1) + sc
->pch_cnt
, 0);
845 m3_wr_assp_data(sc
, KDATA_DMA_XFER0
+
846 (sc
->rch_cnt
- 1) + sc
->pch_cnt
, 0);
847 m3_wr_assp_data(sc
, KDATA_ADC1_XFER0
+ (sc
->rch_cnt
- 1), 0);
855 m3_rchan_setformat(kobj_t kobj
, void *chdata
, u_int32_t format
)
857 struct sc_rchinfo
*ch
= chdata
;
858 struct sc_info
*sc
= ch
->parent
;
863 ("m3_rchan_setformat(dac=%d, format=0x%x{%s-%s})\n",
865 format
& (AFMT_U8
|AFMT_S8
) ? "8bit":"16bit",
866 format
& AFMT_STEREO
? "STEREO":"MONO"));
869 data
= (format
& AFMT_STEREO
) ? 0 : 1;
870 m3_wr_assp_data(sc
, ch
->adc_data
+ SRC3_MODE_OFFSET
, data
);
873 data
= ((format
& AFMT_U8
) || (format
& AFMT_S8
)) ? 1 : 0;
874 m3_wr_assp_data(sc
, ch
->adc_data
+ SRC3_WORD_LENGTH_OFFSET
, data
);
882 m3_rchan_setspeed(kobj_t kobj
, void *chdata
, u_int32_t speed
)
884 struct sc_rchinfo
*ch
= chdata
;
885 struct sc_info
*sc
= ch
->parent
;
889 M3_DEBUG(CHANGE
, ("m3_rchan_setspeed(adc=%d, speed=%d)\n",
890 ch
->adc_idx
, speed
));
892 if ((freq
= ((speed
<< 15) + 24000) / 48000) != 0) {
896 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_FREQUENCY
, freq
);
900 /* return closest possible speed */
905 m3_rchan_setblocksize(kobj_t kobj
, void *chdata
, u_int32_t blocksize
)
907 struct sc_rchinfo
*ch
= chdata
;
909 M3_DEBUG(CHANGE
, ("m3_rchan_setblocksize(adc=%d, blocksize=%d)\n",
910 ch
->adc_idx
, blocksize
));
912 return (sndbuf_getblksz(ch
->buffer
));
916 m3_rchan_trigger(kobj_t kobj
, void *chdata
, int go
)
918 struct sc_rchinfo
*ch
= chdata
;
919 struct sc_info
*sc
= ch
->parent
;
923 ret
= m3_rchan_trigger_locked(kobj
, chdata
, go
);
930 m3_rchan_trigger_locked(kobj_t kobj
, void *chdata
, int go
)
932 struct sc_rchinfo
*ch
= chdata
;
933 struct sc_info
*sc
= ch
->parent
;
937 M3_DEBUG(go
== PCMTRIG_START
? CHANGE
:
938 go
== PCMTRIG_STOP
? CHANGE
:
939 go
== PCMTRIG_ABORT
? CHANGE
:
941 ("m3_rchan_trigger(adc=%d, go=0x%x{%s})\n", ch
->adc_idx
, go
,
942 go
== PCMTRIG_START
? "PCMTRIG_START" :
943 go
== PCMTRIG_STOP
? "PCMTRIG_STOP" :
944 go
== PCMTRIG_ABORT
? "PCMTRIG_ABORT" : "ignore"));
955 /*[[inc_timer_users]]*/
956 if (m3_chan_active(sc
) == 1) {
957 m3_wr_assp_data(sc
, KDATA_TIMER_COUNT_RELOAD
, 240);
958 m3_wr_assp_data(sc
, KDATA_TIMER_COUNT_CURRENT
, 240);
959 data
= m3_rd_2(sc
, HOST_INT_CTRL
);
960 m3_wr_2(sc
, HOST_INT_CTRL
, data
| CLKRUN_GEN_ENABLE
);
963 m3_wr_assp_data(sc
, KDATA_ADC1_REQUEST
, 1);
964 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_INSTANCE_READY
, 1);
969 if (ch
->active
== 0) {
974 /*[[dec_timer_users]]*/
975 if (m3_chan_active(sc
) == 0) {
976 m3_wr_assp_data(sc
, KDATA_TIMER_COUNT_RELOAD
, 0);
977 m3_wr_assp_data(sc
, KDATA_TIMER_COUNT_CURRENT
, 0);
978 data
= m3_rd_2(sc
, HOST_INT_CTRL
);
979 m3_wr_2(sc
, HOST_INT_CTRL
, data
& ~CLKRUN_GEN_ENABLE
);
982 m3_wr_assp_data(sc
, ch
->adc_data
+ CDATA_INSTANCE_READY
, 0);
983 m3_wr_assp_data(sc
, KDATA_ADC1_REQUEST
, 0);
986 case PCMTRIG_EMLDMAWR
:
987 /* got play irq, transfer next buffer - ignore if using dma */
988 case PCMTRIG_EMLDMARD
:
989 /* got rec irq, transfer next buffer - ignore if using dma */
997 m3_rchan_getptr_internal(struct sc_rchinfo
*ch
)
999 struct sc_info
*sc
= ch
->parent
;
1000 u_int32_t hi
, lo
, bus_base
, bus_crnt
;
1002 bus_base
= sndbuf_getbufaddr(ch
->buffer
);
1003 hi
= m3_rd_assp_data(sc
, ch
->adc_data
+ CDATA_HOST_SRC_CURRENTH
);
1004 lo
= m3_rd_assp_data(sc
, ch
->adc_data
+ CDATA_HOST_SRC_CURRENTL
);
1005 bus_crnt
= lo
| (hi
<< 16);
1007 M3_DEBUG(CALL
, ("m3_rchan_getptr(adc=%d) result=%d\n",
1008 ch
->adc_idx
, bus_crnt
- bus_base
));
1010 return (bus_crnt
- bus_base
); /* current byte offset of channel */
1014 m3_rchan_getptr(kobj_t kobj
, void *chdata
)
1016 struct sc_rchinfo
*ch
= chdata
;
1017 struct sc_info
*sc
= ch
->parent
;
1027 static struct pcmchan_caps
*
1028 m3_rchan_getcaps(kobj_t kobj
, void *chdata
)
1030 struct sc_rchinfo
*ch
= chdata
;
1032 M3_DEBUG(CALL
, ("m3_rchan_getcaps(adc=%d)\n", ch
->adc_idx
));
1037 /* -------------------------------------------------------------------- */
1038 /* The interrupt handler */
1043 struct sc_info
*sc
= (struct sc_info
*)p
;
1044 struct sc_pchinfo
*pch
;
1045 struct sc_rchinfo
*rch
;
1046 u_int32_t status
, ctl
, i
, delta
;
1048 M3_DEBUG(INTR
, ("m3_intr\n"));
1051 status
= m3_rd_1(sc
, HOST_INT_STATUS
);
1057 m3_wr_1(sc
, HOST_INT_STATUS
, 0xff); /* ack the int? */
1059 if (status
& HV_INT_PENDING
) {
1062 event
= m3_rd_1(sc
, HW_VOL_COUNTER_MASTER
);
1065 mixer_hwvol_mute(sc
->dev
);
1068 mixer_hwvol_step(sc
->dev
, 1, 1);
1071 mixer_hwvol_step(sc
->dev
, -1, -1);
1076 device_printf(sc
->dev
, "Unknown HWVOL event\n");
1078 m3_wr_1(sc
, HW_VOL_COUNTER_MASTER
, 0x88);
1082 if (status
& ASSP_INT_PENDING
) {
1083 ctl
= m3_rd_1(sc
, ASSP_CONTROL_B
);
1084 if (!(ctl
& STOP_ASSP_CLOCK
)) {
1085 ctl
= m3_rd_1(sc
, ASSP_HOST_INT_STATUS
);
1086 if (ctl
& DSP2HOST_REQ_TIMER
) {
1087 m3_wr_1(sc
, ASSP_HOST_INT_STATUS
,
1088 DSP2HOST_REQ_TIMER
);
1089 /*[[ess_update_ptr]]*/
1090 goto m3_handle_channel_intr
;
1095 goto m3_handle_channel_intr_out
;
1097 m3_handle_channel_intr
:
1098 for (i
=0 ; i
<sc
->pch_cnt
; i
++) {
1101 pch
->ptr
= m3_pchan_getptr_internal(pch
);
1102 delta
= pch
->bufsize
+ pch
->ptr
- pch
->prevptr
;
1103 delta
%= pch
->bufsize
;
1104 if (delta
< sndbuf_getblksz(pch
->buffer
))
1106 pch
->prevptr
= pch
->ptr
;
1108 chn_intr(pch
->channel
);
1112 for (i
=0 ; i
<sc
->rch_cnt
; i
++) {
1115 rch
->ptr
= m3_rchan_getptr_internal(rch
);
1116 delta
= rch
->bufsize
+ rch
->ptr
- rch
->prevptr
;
1117 delta
%= rch
->bufsize
;
1118 if (delta
< sndbuf_getblksz(rch
->buffer
))
1120 rch
->prevptr
= rch
->ptr
;
1122 chn_intr(rch
->channel
);
1127 m3_handle_channel_intr_out
:
1131 /* -------------------------------------------------------------------- */
1135 m3_power(struct sc_info
*sc
, int state
)
1139 M3_DEBUG(CHANGE
, ("m3_power(%d)\n", state
));
1142 data
= pci_read_config(sc
->dev
, 0x34, 1);
1143 if (pci_read_config(sc
->dev
, data
, 1) == 1) {
1144 pci_write_config(sc
->dev
, data
+ 4, state
, 1);
1151 m3_init(struct sc_info
*sc
)
1153 u_int32_t data
, i
, size
;
1154 u_int8_t reset_state
;
1157 M3_DEBUG(CHANGE
, ("m3_init\n"));
1159 /* diable legacy emulations. */
1160 data
= pci_read_config(sc
->dev
, PCI_LEGACY_AUDIO_CTRL
, 2);
1161 data
|= DISABLE_LEGACY
;
1162 pci_write_config(sc
->dev
, PCI_LEGACY_AUDIO_CTRL
, data
, 2);
1166 reset_state
= m3_assp_halt(sc
);
1170 /* [m3_assp_init] */
1171 /* zero kernel data */
1172 size
= REV_B_DATA_MEMORY_UNIT_LENGTH
* NUM_UNITS_KERNEL_DATA
;
1173 for(i
= 0 ; i
< size
/ 2 ; i
++) {
1174 m3_wr_assp_data(sc
, KDATA_BASE_ADDR
+ i
, 0);
1176 /* zero mixer data? */
1177 size
= REV_B_DATA_MEMORY_UNIT_LENGTH
* NUM_UNITS_KERNEL_DATA
;
1178 for(i
= 0 ; i
< size
/ 2 ; i
++) {
1179 m3_wr_assp_data(sc
, KDATA_BASE_ADDR2
+ i
, 0);
1181 /* init dma pointer */
1182 m3_wr_assp_data(sc
, KDATA_CURRENT_DMA
,
1184 /* write kernel into code memory */
1185 size
= sizeof(assp_kernel_image
);
1186 for(i
= 0 ; i
< size
/ 2; i
++) {
1187 m3_wr_assp_code(sc
, REV_B_CODE_MEMORY_BEGIN
+ i
,
1188 assp_kernel_image
[i
]);
1191 * We only have this one client and we know that 0x400 is kfree in
1192 * our kernel's mem map, so lets just drop it there. It seems that
1193 * the minisrc doesn't need vectors, so we won't bother with them..
1195 size
= sizeof(assp_minisrc_image
);
1196 for(i
= 0 ; i
< size
/ 2; i
++) {
1197 m3_wr_assp_code(sc
, 0x400 + i
, assp_minisrc_image
[i
]);
1199 /* write the coefficients for the low pass filter? */
1200 size
= sizeof(minisrc_lpf_image
);
1201 for(i
= 0; i
< size
/ 2 ; i
++) {
1202 m3_wr_assp_code(sc
,0x400 + MINISRC_COEF_LOC
+ i
,
1203 minisrc_lpf_image
[i
]);
1205 m3_wr_assp_code(sc
, 0x400 + MINISRC_COEF_LOC
+ size
, 0x8000);
1206 /* the minisrc is the only thing on our task list */
1207 m3_wr_assp_data(sc
, KDATA_TASK0
, 0x400);
1208 /* init the mixer number */
1209 m3_wr_assp_data(sc
, KDATA_MIXER_TASK_NUMBER
, 0);
1210 /* extreme kernel master volume */
1211 m3_wr_assp_data(sc
, KDATA_DAC_LEFT_VOLUME
, ARB_VOLUME
);
1212 m3_wr_assp_data(sc
, KDATA_DAC_RIGHT_VOLUME
, ARB_VOLUME
);
1216 /* [m3_assp_client_init] (only one client at index 0) */
1217 for (i
=0x1100 ; i
<0x1c00 ; i
++) {
1218 m3_wr_assp_data(sc
, i
, 0); /* zero entire dac/adc area */
1221 /* [m3_assp_continue] */
1222 m3_wr_1(sc
, DSP_PORT_CONTROL_REG_B
, reset_state
| REGB_ENABLE_RESET
);
1228 m3_uninit(struct sc_info
*sc
)
1230 M3_DEBUG(CHANGE
, ("m3_uninit\n"));
1234 /* -------------------------------------------------------------------- */
1235 /* Probe and attach the card */
1238 m3_pci_probe(device_t dev
)
1240 struct m3_card_type
*card
;
1242 M3_DEBUG(CALL
, ("m3_pci_probe(0x%x)\n", pci_get_devid(dev
)));
1244 for (card
= m3_card_types
; card
->pci_id
; card
++) {
1245 if (pci_get_devid(dev
) == card
->pci_id
) {
1246 device_set_desc(dev
, card
->name
);
1247 return BUS_PROBE_DEFAULT
;
1254 m3_pci_attach(device_t dev
)
1257 struct ac97_info
*codec
= NULL
;
1259 char status
[SND_STATUSLEN
];
1260 struct m3_card_type
*card
;
1261 int i
, len
, dacn
, adcn
;
1263 M3_DEBUG(CALL
, ("m3_pci_attach\n"));
1265 if ((sc
= kmalloc(sizeof(*sc
), M_DEVBUF
, M_NOWAIT
| M_ZERO
)) == NULL
) {
1266 device_printf(dev
, "cannot allocate softc\n");
1271 sc
->type
= pci_get_devid(dev
);
1272 sc
->sc_lock
= snd_mtxcreate(device_get_nameunit(dev
),
1274 if (sc
->sc_lock
== NULL
) {
1275 device_printf(dev
, "cannot create mutex\n");
1276 kfree(sc
, M_DEVBUF
);
1279 for (card
= m3_card_types
; card
->pci_id
; card
++) {
1280 if (sc
->type
== card
->pci_id
) {
1281 sc
->which
= card
->which
;
1282 sc
->delay1
= card
->delay1
;
1283 sc
->delay2
= card
->delay2
;
1288 if (resource_int_value(device_get_name(dev
), device_get_unit(dev
),
1292 else if (i
> M3_PCHANS
)
1301 data
= pci_read_config(dev
, PCIR_COMMAND
, 2);
1302 data
|= (PCIM_CMD_PORTEN
| PCIM_CMD_MEMEN
| PCIM_CMD_BUSMASTEREN
);
1303 pci_write_config(dev
, PCIR_COMMAND
, data
, 2);
1305 sc
->regid
= PCIR_BAR(0);
1306 sc
->regtype
= SYS_RES_MEMORY
;
1307 sc
->reg
= bus_alloc_resource_any(dev
, sc
->regtype
, &sc
->regid
,
1310 sc
->regtype
= SYS_RES_IOPORT
;
1311 sc
->reg
= bus_alloc_resource_any(dev
, sc
->regtype
, &sc
->regid
,
1315 device_printf(dev
, "unable to allocate register space\n");
1318 sc
->st
= rman_get_bustag(sc
->reg
);
1319 sc
->sh
= rman_get_bushandle(sc
->reg
);
1322 sc
->irq
= bus_alloc_resource_any(dev
, SYS_RES_IRQ
, &sc
->irqid
,
1323 RF_ACTIVE
| RF_SHAREABLE
);
1325 device_printf(dev
, "unable to allocate interrupt\n");
1329 if (snd_setup_intr(dev
, sc
->irq
, INTR_MPSAFE
, m3_intr
, sc
, &sc
->ih
)) {
1330 device_printf(dev
, "unable to setup interrupt\n");
1334 sc
->bufsz
= pcm_getbuffersize(dev
, M3_BUFSIZE_MIN
, M3_BUFSIZE_DEFAULT
,
1337 if (bus_dma_tag_create(
1339 2, 0, /* alignment, boundary */
1340 M3_MAXADDR
, /* lowaddr */
1341 BUS_SPACE_MAXADDR
, /* highaddr */
1342 NULL
, NULL
, /* filtfunc, filtfuncarg */
1343 sc
->bufsz
, /* maxsize */
1345 0x3ffff, /* maxsegz */
1347 &sc
->parent_dmat
) != 0) {
1348 device_printf(dev
, "unable to create dma tag\n");
1353 m3_power(sc
, 0); /* power up */
1358 device_printf(dev
, "unable to initialize the card\n");
1362 /* create/init mixer */
1363 codec
= AC97_CREATE(dev
, sc
, m3_codec
);
1364 if (codec
== NULL
) {
1365 device_printf(dev
, "ac97_create error\n");
1368 if (mixer_init(dev
, ac97_getmixerclass(), codec
)) {
1369 device_printf(dev
, "mixer_init error\n");
1375 if (pcm_register(dev
, sc
, dacn
, adcn
)) {
1376 device_printf(dev
, "pcm_register error\n");
1379 for (i
=0 ; i
<dacn
; i
++) {
1380 if (pcm_addchan(dev
, PCMDIR_PLAY
, &m3_pch_class
, sc
)) {
1381 device_printf(dev
, "pcm_addchan (play) error\n");
1385 for (i
=0 ; i
<adcn
; i
++) {
1386 if (pcm_addchan(dev
, PCMDIR_REC
, &m3_rch_class
, sc
)) {
1387 device_printf(dev
, "pcm_addchan (rec) error\n");
1391 ksnprintf(status
, SND_STATUSLEN
, "at %s 0x%lx irq %ld %s",
1392 (sc
->regtype
== SYS_RES_IOPORT
)? "io" : "memory",
1393 rman_get_start(sc
->reg
), rman_get_start(sc
->irq
),
1394 PCM_KLDSTRING(snd_maestro3
));
1395 if (pcm_setstatus(dev
, status
)) {
1396 device_printf(dev
, "attach: pcm_setstatus error\n");
1400 mixer_hwvol_init(dev
);
1402 /* Create the buffer for saving the card state during suspend */
1403 len
= sizeof(u_int16_t
) * (REV_B_CODE_MEMORY_LENGTH
+
1404 REV_B_DATA_MEMORY_LENGTH
);
1405 sc
->savemem
= (u_int16_t
*)kmalloc(len
, M_DEVBUF
, M_NOWAIT
| M_ZERO
);
1406 if (sc
->savemem
== NULL
) {
1407 device_printf(dev
, "Failed to create suspend buffer\n");
1415 ac97_destroy(codec
);
1417 bus_teardown_intr(dev
, sc
->irq
, sc
->ih
);
1419 bus_release_resource(dev
, SYS_RES_IRQ
, sc
->irqid
, sc
->irq
);
1421 bus_release_resource(dev
, sc
->regtype
, sc
->regid
, sc
->reg
);
1422 if (sc
->parent_dmat
)
1423 bus_dma_tag_destroy(sc
->parent_dmat
);
1425 snd_mtxfree(sc
->sc_lock
);
1426 kfree(sc
, M_DEVBUF
);
1431 m3_pci_detach(device_t dev
)
1433 struct sc_info
*sc
= pcm_getdevinfo(dev
);
1436 M3_DEBUG(CALL
, ("m3_pci_detach\n"));
1438 if ((r
= pcm_unregister(dev
)) != 0) {
1443 m3_uninit(sc
); /* shutdown chip */
1444 m3_power(sc
, 3); /* power off */
1447 bus_teardown_intr(dev
, sc
->irq
, sc
->ih
);
1448 bus_release_resource(dev
, SYS_RES_IRQ
, sc
->irqid
, sc
->irq
);
1449 bus_release_resource(dev
, sc
->regtype
, sc
->regid
, sc
->reg
);
1450 bus_dma_tag_destroy(sc
->parent_dmat
);
1452 kfree(sc
->savemem
, M_DEVBUF
);
1453 snd_mtxfree(sc
->sc_lock
);
1454 kfree(sc
, M_DEVBUF
);
1459 m3_pci_suspend(device_t dev
)
1461 struct sc_info
*sc
= pcm_getdevinfo(dev
);
1464 M3_DEBUG(CHANGE
, ("m3_pci_suspend\n"));
1467 for (i
=0 ; i
<sc
->pch_cnt
; i
++) {
1468 if (sc
->pch
[i
].active
) {
1469 m3_pchan_trigger_locked(NULL
, &sc
->pch
[i
],
1473 for (i
=0 ; i
<sc
->rch_cnt
; i
++) {
1474 if (sc
->rch
[i
].active
) {
1475 m3_rchan_trigger_locked(NULL
, &sc
->rch
[i
],
1479 DELAY(10 * 1000); /* give things a chance to stop */
1481 /* Disable interrupts */
1482 m3_wr_2(sc
, HOST_INT_CTRL
, 0);
1483 m3_wr_1(sc
, ASSP_CONTROL_C
, 0);
1487 /* Save the state of the ASSP */
1488 for (i
= REV_B_CODE_MEMORY_BEGIN
; i
<= REV_B_CODE_MEMORY_END
; i
++)
1489 sc
->savemem
[index
++] = m3_rd_assp_code(sc
, i
);
1490 for (i
= REV_B_DATA_MEMORY_BEGIN
; i
<= REV_B_DATA_MEMORY_END
; i
++)
1491 sc
->savemem
[index
++] = m3_rd_assp_data(sc
, i
);
1493 /* Power down the card to D3 state */
1501 m3_pci_resume(device_t dev
)
1503 struct sc_info
*sc
= pcm_getdevinfo(dev
);
1505 u_int8_t reset_state
;
1507 M3_DEBUG(CHANGE
, ("m3_pci_resume\n"));
1510 /* Power the card back to D0 */
1515 reset_state
= m3_assp_halt(sc
);
1519 /* Restore the ASSP state */
1520 for (i
= REV_B_CODE_MEMORY_BEGIN
; i
<= REV_B_CODE_MEMORY_END
; i
++)
1521 m3_wr_assp_code(sc
, i
, sc
->savemem
[index
++]);
1522 for (i
= REV_B_DATA_MEMORY_BEGIN
; i
<= REV_B_DATA_MEMORY_END
; i
++)
1523 m3_wr_assp_data(sc
, i
, sc
->savemem
[index
++]);
1525 /* Restart the DMA engine */
1526 m3_wr_assp_data(sc
, KDATA_DMA_ACTIVE
, 0);
1528 /* [m3_assp_continue] */
1529 m3_wr_1(sc
, DSP_PORT_CONTROL_REG_B
, reset_state
| REGB_ENABLE_RESET
);
1535 M3_UNLOCK(sc
); /* XXX */
1536 if (mixer_reinit(dev
) == -1) {
1537 device_printf(dev
, "unable to reinitialize the mixer\n");
1542 /* Turn the channels back on */
1543 for (i
=0 ; i
<sc
->pch_cnt
; i
++) {
1544 if (sc
->pch
[i
].active
) {
1545 m3_pchan_trigger_locked(NULL
, &sc
->pch
[i
],
1549 for (i
=0 ; i
<sc
->rch_cnt
; i
++) {
1550 if (sc
->rch
[i
].active
) {
1551 m3_rchan_trigger_locked(NULL
, &sc
->rch
[i
],
1561 m3_pci_shutdown(device_t dev
)
1563 struct sc_info
*sc
= pcm_getdevinfo(dev
);
1565 M3_DEBUG(CALL
, ("m3_pci_shutdown\n"));
1568 m3_power(sc
, 3); /* power off */
1575 m3_assp_halt(struct sc_info
*sc
)
1577 u_int8_t data
, reset_state
;
1581 data
= m3_rd_1(sc
, DSP_PORT_CONTROL_REG_B
);
1582 reset_state
= data
& ~REGB_STOP_CLOCK
; /* remember for continue */
1584 m3_wr_1(sc
, DSP_PORT_CONTROL_REG_B
, reset_state
& ~REGB_ENABLE_RESET
);
1585 DELAY(10 * 1000); /* necessary? */
1591 m3_config(struct sc_info
*sc
)
1593 u_int32_t data
, hv_cfg
;
1600 * The volume buttons can be wired up via two different sets of pins.
1601 * This presents a problem since we can't tell which way it's
1602 * configured. Allow the user to set a hint in order to twiddle
1605 if (resource_int_value(device_get_name(sc
->dev
),
1606 device_get_unit(sc
->dev
),
1607 "hwvol_config", &hint
) == 0)
1608 hv_cfg
= (hint
> 0) ? HV_BUTTON_FROM_GD
: 0;
1610 hv_cfg
= HV_BUTTON_FROM_GD
;
1613 data
= pci_read_config(sc
->dev
, PCI_ALLEGRO_CONFIG
, 4);
1614 data
&= ~HV_BUTTON_FROM_GD
;
1615 data
|= REDUCED_DEBOUNCE
| HV_CTRL_ENABLE
| hv_cfg
;
1616 data
|= PM_CTRL_ENABLE
| CLK_DIV_BY_49
| USE_PCI_TIMING
;
1617 pci_write_config(sc
->dev
, PCI_ALLEGRO_CONFIG
, data
, 4);
1619 m3_wr_1(sc
, ASSP_CONTROL_B
, RESET_ASSP
);
1620 data
= pci_read_config(sc
->dev
, PCI_ALLEGRO_CONFIG
, 4);
1621 data
&= ~INT_CLK_SELECT
;
1622 if (sc
->which
== ESS_MAESTRO3
) {
1623 data
&= ~INT_CLK_MULT_ENABLE
;
1624 data
|= INT_CLK_SRC_NOT_PCI
;
1626 data
&= ~(CLK_MULT_MODE_SELECT
| CLK_MULT_MODE_SELECT_2
);
1627 pci_write_config(sc
->dev
, PCI_ALLEGRO_CONFIG
, data
, 4);
1629 if (sc
->which
== ESS_ALLEGRO_1
) {
1630 data
= pci_read_config(sc
->dev
, PCI_USER_CONFIG
, 4);
1631 data
|= IN_CLK_12MHZ_SELECT
;
1632 pci_write_config(sc
->dev
, PCI_USER_CONFIG
, data
, 4);
1635 data
= m3_rd_1(sc
, ASSP_CONTROL_A
);
1636 data
&= ~(DSP_CLK_36MHZ_SELECT
| ASSP_CLK_49MHZ_SELECT
);
1637 data
|= ASSP_CLK_49MHZ_SELECT
; /*XXX assumes 49MHZ dsp XXX*/
1638 data
|= ASSP_0_WS_ENABLE
;
1639 m3_wr_1(sc
, ASSP_CONTROL_A
, data
);
1641 m3_wr_1(sc
, ASSP_CONTROL_B
, RUN_ASSP
);
1645 m3_enable_ints(struct sc_info
*sc
)
1649 m3_wr_2(sc
, HOST_INT_CTRL
, ASSP_INT_ENABLE
| HV_INT_ENABLE
);
1650 data
= m3_rd_1(sc
, ASSP_CONTROL_C
);
1651 m3_wr_1(sc
, ASSP_CONTROL_C
, data
| ASSP_HOST_INT_ENABLE
);
1655 m3_amp_enable(struct sc_info
*sc
)
1657 u_int32_t gpo
, polarity_port
, polarity
;
1662 switch (sc
->which
) {
1664 polarity_port
= 0x1800;
1667 polarity_port
= 0x1100;
1670 panic("bad sc->which");
1672 gpo
= (polarity_port
>> 8) & 0x0f;
1673 polarity
= polarity_port
>> 12;
1674 polarity
= !polarity
; /* enable */
1675 polarity
= polarity
<< gpo
;
1677 m3_wr_2(sc
, GPIO_MASK
, ~gpo
);
1678 data
= m3_rd_2(sc
, GPIO_DIRECTION
);
1679 m3_wr_2(sc
, GPIO_DIRECTION
, data
| gpo
);
1680 data
= GPO_SECONDARY_AC97
| GPO_PRIMARY_AC97
| polarity
;
1681 m3_wr_2(sc
, GPIO_DATA
, data
);
1682 m3_wr_2(sc
, GPIO_MASK
, ~0);
1686 m3_codec_reset(struct sc_info
*sc
)
1688 u_int16_t data
, dir
;
1693 data
= m3_rd_2(sc
, GPIO_DIRECTION
);
1694 dir
= data
| 0x10; /* assuming pci bus master? */
1696 /* [[remote_codec_config]] */
1697 data
= m3_rd_2(sc
, RING_BUS_CTRL_B
);
1698 m3_wr_2(sc
, RING_BUS_CTRL_B
, data
& ~SECOND_CODEC_ID_MASK
);
1699 data
= m3_rd_2(sc
, SDO_OUT_DEST_CTRL
);
1700 m3_wr_2(sc
, SDO_OUT_DEST_CTRL
, data
& ~COMMAND_ADDR_OUT
);
1701 data
= m3_rd_2(sc
, SDO_IN_DEST_CTRL
);
1702 m3_wr_2(sc
, SDO_IN_DEST_CTRL
, data
& ~STATUS_ADDR_IN
);
1704 m3_wr_2(sc
, RING_BUS_CTRL_A
, IO_SRAM_ENABLE
);
1707 m3_wr_2(sc
, GPIO_DIRECTION
, dir
& ~GPO_PRIMARY_AC97
);
1708 m3_wr_2(sc
, GPIO_MASK
, ~GPO_PRIMARY_AC97
);
1709 m3_wr_2(sc
, GPIO_DATA
, 0);
1710 m3_wr_2(sc
, GPIO_DIRECTION
, dir
| GPO_PRIMARY_AC97
);
1711 DELAY(sc
->delay1
* 1000); /*delay1 (ALLEGRO:50, MAESTRO3:20)*/
1712 m3_wr_2(sc
, GPIO_DATA
, GPO_PRIMARY_AC97
);
1714 m3_wr_2(sc
, RING_BUS_CTRL_A
, IO_SRAM_ENABLE
|
1715 SERIAL_AC_LINK_ENABLE
);
1716 m3_wr_2(sc
, GPIO_MASK
, ~0);
1717 DELAY(sc
->delay2
* 1000); /*delay2 (ALLEGRO:800, MAESTRO3:500)*/
1719 /* [[try read vendor]] */
1720 data
= m3_rdcd(NULL
, sc
, 0x7c);
1721 if ((data
== 0) || (data
== 0xffff)) {
1724 device_printf(sc
->dev
, "Codec reset failed\n");
1727 device_printf(sc
->dev
, "Codec reset retry\n");
1732 static device_method_t m3_methods
[] = {
1733 DEVMETHOD(device_probe
, m3_pci_probe
),
1734 DEVMETHOD(device_attach
, m3_pci_attach
),
1735 DEVMETHOD(device_detach
, m3_pci_detach
),
1736 DEVMETHOD(device_suspend
, m3_pci_suspend
),
1737 DEVMETHOD(device_resume
, m3_pci_resume
),
1738 DEVMETHOD(device_shutdown
, m3_pci_shutdown
),
1742 static driver_t m3_driver
= {
1748 DRIVER_MODULE(snd_maestro3
, pci
, m3_driver
, pcm_devclass
, 0, 0);
1749 MODULE_DEPEND(snd_maestro3
, sound
, SOUND_MINVER
, SOUND_PREFVER
, SOUND_MAXVER
);
1750 MODULE_VERSION(snd_maestro3
, 1);