Update all sound code to use the snd_*() locking abstraction and sndlock_t.
[dragonfly.git] / sys / dev / sound / pci / es137x.c
1 /*-
2  * Support the ENSONIQ AudioPCI board and Creative Labs SoundBlaster PCI
3  * boards based on the ES1370, ES1371 and ES1373 chips.
4  *
5  * Copyright (c) 1999 Russell Cattelan <cattelan@thebarn.com>
6  * Copyright (c) 1999 Cameron Grant <cg@freebsd.org>
7  * Copyright (c) 1998 by Joachim Kuebart. All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in
18  *    the documentation and/or other materials provided with the
19  *    distribution.
20  *
21  * 3. All advertising materials mentioning features or use of this
22  *    software must display the following acknowledgement:
23  *      This product includes software developed by Joachim Kuebart.
24  *
25  * 4. The name of the author may not be used to endorse or promote
26  *    products derived from this software without specific prior
27  *    written permission.
28  *
29  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
30  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
31  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
32  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
33  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39  * OF THE POSSIBILITY OF SUCH DAMAGE.
40  *
41  * $FreeBSD: src/sys/dev/sound/pci/es137x.c,v 1.55.2.2 2006/01/16 02:08:56 ariff Exp $
42  * $DragonFly: src/sys/dev/sound/pci/es137x.c,v 1.10 2007/06/16 20:07:19 dillon Exp $
43  */
44
45 /*
46  * Part of this code was heavily inspired by the linux driver from
47  * Thomas Sailer (sailer@ife.ee.ethz.ch)
48  * Just about everything has been touched and reworked in some way but
49  * the all the underlying sequences/timing/register values are from
50  * Thomas' code.
51  *
52 */
53
54 #include <dev/sound/pcm/sound.h>
55 #include <dev/sound/pcm/ac97.h>
56 #include <dev/sound/pci/es137x.h>
57
58 #include <bus/pci/pcireg.h>
59 #include <bus/pci/pcivar.h>
60
61 #include <sys/sysctl.h>
62
63 #include "mixer_if.h"
64
65 SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pci/es137x.c,v 1.10 2007/06/16 20:07:19 dillon Exp $");
66
67 static int debug = 0;
68 SYSCTL_INT(_debug, OID_AUTO, es_debug, CTLFLAG_RW, &debug, 0, "");
69
70 #define MEM_MAP_REG 0x14
71
72 /* PCI IDs of supported chips */
73 #define ES1370_PCI_ID 0x50001274
74 #define ES1371_PCI_ID 0x13711274
75 #define ES1371_PCI_ID2 0x13713274
76 #define CT5880_PCI_ID 0x58801274
77 #define CT4730_PCI_ID 0x89381102
78
79 #define ES1371REV_ES1371_A  0x02
80 #define ES1371REV_ES1371_B  0x09
81
82 #define ES1371REV_ES1373_8  0x08
83 #define ES1371REV_ES1373_A  0x04
84 #define ES1371REV_ES1373_B  0x06
85
86 #define ES1371REV_CT5880_A  0x07
87
88 #define CT5880REV_CT5880_C  0x02
89 #define CT5880REV_CT5880_D  0x03
90 #define CT5880REV_CT5880_E  0x04
91
92 #define CT4730REV_CT4730_A  0x00
93
94 #define ES_DEFAULT_BUFSZ 4096
95
96 /* 2 DAC for playback, 1 ADC for record */
97 #define ES_DAC1         0
98 #define ES_DAC2         1
99 #define ES_ADC          2
100 #define ES_NCHANS       3
101
102 #define ES1370_DAC1_MINSPEED    5512
103 #define ES1370_DAC1_MAXSPEED    44100
104
105 /* device private data */
106 struct es_info;
107
108 struct es_chinfo {
109         struct es_info *parent;
110         struct pcm_channel *channel;
111         struct snd_dbuf *buffer;
112         struct pcmchan_caps caps;
113         int dir, num, index;
114         u_int32_t fmt, blksz, bufsz;
115 };
116
117 /*
118  *     32bit Ensoniq Configuration (es->escfg).
119  *     ----------------------------------------
120  *
121  *     +-------+--------+------+------+---------+--------+---------+---------+
122  * len |  16   |    1   |  1   |  1   |    2    |   2    |    1    |    8    |
123  *     +-------+--------+------+------+---------+--------+---------+---------+
124  *     | fixed | single |      |      |         |        |   is    | general |
125  *     | rate  |   pcm  | DACx | DACy | numplay | numrec | es1370? | purpose |
126  *     |       |  mixer |      |      |         |        |         |         |
127  *     +-------+--------+------+------+---------+--------+---------+---------+
128  */
129 #define ES_FIXED_RATE(cfgv)     \
130                 (((cfgv) & 0xffff0000) >> 16)
131 #define ES_SET_FIXED_RATE(cfgv, nv)     \
132                 (((cfgv) & ~0xffff0000) | (((nv) & 0xffff) << 16))
133 #define ES_SINGLE_PCM_MIX(cfgv) \
134                 (((cfgv) & 0x8000) >> 15)
135 #define ES_SET_SINGLE_PCM_MIX(cfgv, nv) \
136                 (((cfgv) & ~0x8000) | (((nv) ? 1 : 0) << 15))
137 #define ES_DAC_FIRST(cfgv)      \
138                 (((cfgv) & 0x4000) >> 14)
139 #define ES_SET_DAC_FIRST(cfgv, nv)      \
140                 (((cfgv) & ~0x4000) | (((nv) & 0x1) << 14))
141 #define ES_DAC_SECOND(cfgv)     \
142                 (((cfgv) & 0x2000) >> 13)
143 #define ES_SET_DAC_SECOND(cfgv, nv)     \
144                 (((cfgv) & ~0x2000) | (((nv) & 0x1) << 13))
145 #define ES_NUMPLAY(cfgv)        \
146                 (((cfgv) & 0x1800) >> 11)
147 #define ES_SET_NUMPLAY(cfgv, nv)        \
148                 (((cfgv) & ~0x1800) | (((nv) & 0x3) << 11))
149 #define ES_NUMREC(cfgv) \
150                 (((cfgv) & 0x600) >> 9)
151 #define ES_SET_NUMREC(cfgv, nv) \
152                 (((cfgv) & ~0x600) | (((nv) & 0x3) << 9))
153 #define ES_IS_ES1370(cfgv)      \
154                 (((cfgv) & 0x100) >> 8)
155 #define ES_SET_IS_ES1370(cfgv, nv)      \
156                 (((cfgv) & ~0x100) | (((nv) ? 1 : 0) << 8))
157 #define ES_GP(cfgv)     \
158                 ((cfgv) & 0xff)
159 #define ES_SET_GP(cfgv, nv)     \
160                 (((cfgv) & ~0xff) | ((nv) & 0xff))
161
162 #define ES_DAC1_ENABLED(cfgv)   \
163                 (ES_NUMPLAY(cfgv) > 1 || \
164                 (ES_NUMPLAY(cfgv) == 1 && ES_DAC_FIRST(cfgv) == ES_DAC1))
165 #define ES_DAC2_ENABLED(cfgv)   \
166                 (ES_NUMPLAY(cfgv) > 1 || \
167                 (ES_NUMPLAY(cfgv) == 1 && ES_DAC_FIRST(cfgv) == ES_DAC2))
168
169 /*
170  * DAC 1/2 configuration through kernel hint - hint.pcm.<unit>.dac="val"
171  *
172  * 0 = Enable both DACs - Default
173  * 1 = Enable single DAC (DAC1)
174  * 2 = Enable single DAC (DAC2)
175  * 3 = Enable both DACs, swap position (DAC2 comes first instead of DAC1)
176  */
177 #define ES_DEFAULT_DAC_CFG      2
178
179 struct es_info {
180         bus_space_tag_t st;
181         bus_space_handle_t sh;
182         bus_dma_tag_t   parent_dmat;
183
184         struct resource *reg, *irq;
185         int regtype, regid, irqid;
186         void *ih;
187
188         device_t dev;
189         int num;
190         unsigned int bufsz;
191
192         /* Contents of board's registers */
193         uint32_t        ctrl;
194         uint32_t        sctrl;
195         uint32_t        escfg;
196         struct es_chinfo ch[ES_NCHANS];
197         sndlock_t       lock;
198 };
199
200 #define ES_LOCK(sc)             snd_mtxlock((sc)->lock)
201 #define ES_UNLOCK(sc)           snd_mtxunlock((sc)->lock)
202 #define ES_LOCK_ASSERT(sc)      snd_mtxassert((sc)->lock)
203
204 /* prototypes */
205 static void     es_intr(void *);
206 static uint32_t es1371_wait_src_ready(struct es_info *);
207 static void     es1371_src_write(struct es_info *, u_short, unsigned short);
208 static u_int    es1371_adc_rate(struct es_info *, u_int, int);
209 static u_int    es1371_dac_rate(struct es_info *, u_int, int);
210 static int      es1371_init(struct es_info *);
211 static int      es1370_init(struct es_info *);
212 static int      es1370_wrcodec(struct es_info *, u_char, u_char);
213
214 static u_int32_t es_fmt[] = {
215         AFMT_U8,
216         AFMT_STEREO | AFMT_U8,
217         AFMT_S16_LE,
218         AFMT_STEREO | AFMT_S16_LE,
219         0
220 };
221 static struct pcmchan_caps es_caps = {4000, 48000, es_fmt, 0};
222
223 static const struct {
224         unsigned        volidx:4;
225         unsigned        left:4;
226         unsigned        right:4;
227         unsigned        stereo:1;
228         unsigned        recmask:13;
229         unsigned        avail:1;
230 }       mixtable[SOUND_MIXER_NRDEVICES] = {
231         [SOUND_MIXER_VOLUME]    = { 0, 0x0, 0x1, 1, 0x1f7f, 1 },
232         [SOUND_MIXER_PCM]       = { 1, 0x2, 0x3, 1, 0x0400, 1 },
233         [SOUND_MIXER_SYNTH]     = { 2, 0x4, 0x5, 1, 0x0060, 1 },
234         [SOUND_MIXER_CD]        = { 3, 0x6, 0x7, 1, 0x0006, 1 },
235         [SOUND_MIXER_LINE]      = { 4, 0x8, 0x9, 1, 0x0018, 1 },
236         [SOUND_MIXER_LINE1]     = { 5, 0xa, 0xb, 1, 0x1800, 1 },
237         [SOUND_MIXER_LINE2]     = { 6, 0xc, 0x0, 0, 0x0100, 1 },
238         [SOUND_MIXER_LINE3]     = { 7, 0xd, 0x0, 0, 0x0200, 1 },
239         [SOUND_MIXER_MIC]       = { 8, 0xe, 0x0, 0, 0x0001, 1 },
240         [SOUND_MIXER_OGAIN]     = { 9, 0xf, 0x0, 0, 0x0000, 1 }
241 };
242
243 static __inline u_int32_t
244 es_rd(struct es_info *es, int regno, int size)
245 {
246         switch (size) {
247         case 1:
248                 return bus_space_read_1(es->st, es->sh, regno);
249         case 2:
250                 return bus_space_read_2(es->st, es->sh, regno);
251         case 4:
252                 return bus_space_read_4(es->st, es->sh, regno);
253         default:
254                 return 0xFFFFFFFF;
255         }
256 }
257
258 static __inline void
259 es_wr(struct es_info *es, int regno, u_int32_t data, int size)
260 {
261
262         switch (size) {
263         case 1:
264                 bus_space_write_1(es->st, es->sh, regno, data);
265                 break;
266         case 2:
267                 bus_space_write_2(es->st, es->sh, regno, data);
268                 break;
269         case 4:
270                 bus_space_write_4(es->st, es->sh, regno, data);
271                 break;
272         }
273 }
274
275 /* -------------------------------------------------------------------- */
276 /* The es1370 mixer interface */
277
278 static int
279 es1370_mixinit(struct snd_mixer *m)
280 {
281         struct es_info *es;
282         int i;
283         u_int32_t v;
284
285         es = mix_getdevinfo(m);
286         v = 0;
287         for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
288                 if (mixtable[i].avail) v |= (1 << i);
289         /*
290          * Each DAC1/2 for ES1370 can be controlled independently
291          *   DAC1 = controlled by synth
292          *   DAC2 = controlled by pcm
293          * This is indeed can confuse user if DAC1 become primary playback
294          * channel. Try to be smart and combine both if necessary.
295          */
296         if (ES_SINGLE_PCM_MIX(es->escfg))
297                 v &= ~(1 << SOUND_MIXER_SYNTH);
298         mix_setdevs(m, v);
299         v = 0;
300         for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
301                 if (mixtable[i].recmask) v |= (1 << i);
302         if (ES_SINGLE_PCM_MIX(es->escfg)) /* ditto */
303                 v &= ~(1 << SOUND_MIXER_SYNTH);
304         mix_setrecdevs(m, v);
305         return 0;
306 }
307
308 static int
309 es1370_mixset(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right)
310 {
311         struct es_info *es;
312         int l, r, rl, rr, set_dac1;
313
314         if (!mixtable[dev].avail) return -1;
315         l = left;
316         r = mixtable[dev].stereo? right : l;
317         if (mixtable[dev].left == 0xf) {
318                 rl = (l < 2)? 0x80 : 7 - (l - 2) / 14;
319         } else {
320                 rl = (l < 10)? 0x80 : 15 - (l - 10) / 6;
321         }
322         es = mix_getdevinfo(m);
323         ES_LOCK(es);
324         if (dev == SOUND_MIXER_PCM && (ES_SINGLE_PCM_MIX(es->escfg)) &&
325                         ES_DAC1_ENABLED(es->escfg)) {
326                 set_dac1 = 1;
327         } else {
328                 set_dac1 = 0;
329         }
330         if (mixtable[dev].stereo) {
331                 rr = (r < 10)? 0x80 : 15 - (r - 10) / 6;
332                 es1370_wrcodec(es, mixtable[dev].right, rr);
333                 if (set_dac1 && mixtable[SOUND_MIXER_SYNTH].stereo)
334                         es1370_wrcodec(es, mixtable[SOUND_MIXER_SYNTH].right, rr);
335         }
336         es1370_wrcodec(es, mixtable[dev].left, rl);
337         if (set_dac1)
338                 es1370_wrcodec(es, mixtable[SOUND_MIXER_SYNTH].left, rl);
339         ES_UNLOCK(es);
340
341         return l | (r << 8);
342 }
343
344 static int
345 es1370_mixsetrecsrc(struct snd_mixer *m, u_int32_t src)
346 {
347         struct es_info *es;
348         int i, j = 0;
349
350         es = mix_getdevinfo(m);
351         if (src == 0) src = 1 << SOUND_MIXER_MIC;
352         src &= mix_getrecdevs(m);
353         for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
354                 if ((src & (1 << i)) != 0) j |= mixtable[i].recmask;
355
356         ES_LOCK(es);
357         if ((src & (1 << SOUND_MIXER_PCM)) && ES_SINGLE_PCM_MIX(es->escfg) &&
358                         ES_DAC1_ENABLED(es->escfg)) {
359                 j |= mixtable[SOUND_MIXER_SYNTH].recmask;
360         }
361         es1370_wrcodec(es, CODEC_LIMIX1, j & 0x55);
362         es1370_wrcodec(es, CODEC_RIMIX1, j & 0xaa);
363         es1370_wrcodec(es, CODEC_LIMIX2, (j >> 8) & 0x17);
364         es1370_wrcodec(es, CODEC_RIMIX2, (j >> 8) & 0x0f);
365         es1370_wrcodec(es, CODEC_OMIX1, 0x7f);
366         es1370_wrcodec(es, CODEC_OMIX2, 0x3f);
367         ES_UNLOCK(es);
368
369         return src;
370 }
371
372 static kobj_method_t es1370_mixer_methods[] = {
373         KOBJMETHOD(mixer_init,          es1370_mixinit),
374         KOBJMETHOD(mixer_set,           es1370_mixset),
375         KOBJMETHOD(mixer_setrecsrc,     es1370_mixsetrecsrc),
376         { 0, 0 }
377 };
378 MIXER_DECLARE(es1370_mixer);
379
380 /* -------------------------------------------------------------------- */
381
382 static int
383 es1370_wrcodec(struct es_info *es, u_char i, u_char data)
384 {
385         u_int t;
386
387         ES_LOCK_ASSERT(es);
388
389         for (t = 0; t < 0x1000; t++) {
390                 if ((es_rd(es, ES1370_REG_STATUS, 4) &
391                       STAT_CSTAT) == 0) {
392                         es_wr(es, ES1370_REG_CODEC,
393                                 ((u_short)i << CODEC_INDEX_SHIFT) | data, 2);
394                         return 0;
395                 }
396                 DELAY(1);
397         }
398         device_printf(es->dev, "%s: timed out\n", __func__);
399         return -1;
400 }
401
402 /* -------------------------------------------------------------------- */
403
404 /* channel interface */
405 static void *
406 eschan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir)
407 {
408         struct es_info *es = devinfo;
409         struct es_chinfo *ch;
410         uint32_t index;
411
412         ES_LOCK(es);
413
414         if (dir == PCMDIR_PLAY) {
415                 index = ES_GP(es->escfg);
416                 es->escfg = ES_SET_GP(es->escfg, index + 1);
417                 if (index == 0) {
418                         index = ES_DAC_FIRST(es->escfg);
419                 } else if (index == 1) {
420                         index = ES_DAC_SECOND(es->escfg);
421                 } else {
422                         device_printf(es->dev, "Invalid ES_GP index: %d\n", index);
423                         ES_UNLOCK(es);
424                         return NULL;
425                 }
426                 if (!(index == ES_DAC1 || index == ES_DAC2)) {
427                         device_printf(es->dev, "Unknown DAC: %d\n",
428                                                 index + 1);
429                         ES_UNLOCK(es);
430                         return NULL;
431                 }
432                 if (es->ch[index].channel != NULL) {
433                         device_printf(es->dev, "DAC%d already initialized!\n",
434                                                 index + 1);
435                         ES_UNLOCK(es);
436                         return NULL;
437                 }
438         } else
439                 index = ES_ADC;
440
441         ch = &es->ch[index];
442         ch->index = index;
443         ch->num = es->num++;
444         ch->caps = es_caps;
445         if (ES_IS_ES1370(es->escfg)) {
446                 if (ch->index == ES_DAC1) {
447                         ch->caps.maxspeed = ES1370_DAC1_MAXSPEED;
448                         ch->caps.minspeed = ES1370_DAC1_MINSPEED;
449                 } else {
450                         uint32_t fixed_rate = ES_FIXED_RATE(es->escfg);
451                         if (!(fixed_rate < es_caps.minspeed ||
452                                         fixed_rate > es_caps.maxspeed)) {
453                                 ch->caps.maxspeed = fixed_rate;
454                                 ch->caps.minspeed = fixed_rate;
455                         }
456                 }
457         }
458         ch->parent = es;
459         ch->channel = c;
460         ch->buffer = b;
461         ch->bufsz = es->bufsz;
462         ch->blksz = ch->bufsz / 2;
463         ch->dir = dir;
464         ES_UNLOCK(es);
465         if (sndbuf_alloc(ch->buffer, es->parent_dmat, ch->bufsz) != 0)
466                 return NULL;
467         ES_LOCK(es);
468         if (dir == PCMDIR_PLAY) {
469                 if (ch->index == ES_DAC1) {
470                         es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_DAC1_FRAMEADR >> 8, 1);
471                         es_wr(es, ES1370_REG_DAC1_FRAMEADR & 0xff, sndbuf_getbufaddr(ch->buffer), 4);
472                         es_wr(es, ES1370_REG_DAC1_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4);
473                 } else {
474                         es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_DAC2_FRAMEADR >> 8, 1);
475                         es_wr(es, ES1370_REG_DAC2_FRAMEADR & 0xff, sndbuf_getbufaddr(ch->buffer), 4);
476                         es_wr(es, ES1370_REG_DAC2_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4);
477                 }
478         } else {
479                 es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_ADC_FRAMEADR >> 8, 1);
480                 es_wr(es, ES1370_REG_ADC_FRAMEADR & 0xff, sndbuf_getbufaddr(ch->buffer), 4);
481                 es_wr(es, ES1370_REG_ADC_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4);
482         }
483         ES_UNLOCK(es);
484         return ch;
485 }
486
487 static int
488 eschan_setformat(kobj_t obj, void *data, u_int32_t format)
489 {
490         struct es_chinfo *ch = data;
491         struct es_info *es = ch->parent;
492
493         ES_LOCK(es);
494         if (ch->dir == PCMDIR_PLAY) {
495                 if (ch->index == ES_DAC1) {
496                         es->sctrl &= ~SCTRL_P1FMT;
497                         if (format & AFMT_S16_LE) es->sctrl |= SCTRL_P1SEB;
498                         if (format & AFMT_STEREO) es->sctrl |= SCTRL_P1SMB;
499                 } else {
500                         es->sctrl &= ~SCTRL_P2FMT;
501                         if (format & AFMT_S16_LE) es->sctrl |= SCTRL_P2SEB;
502                         if (format & AFMT_STEREO) es->sctrl |= SCTRL_P2SMB;
503                 }
504         } else {
505                 es->sctrl &= ~SCTRL_R1FMT;
506                 if (format & AFMT_S16_LE) es->sctrl |= SCTRL_R1SEB;
507                 if (format & AFMT_STEREO) es->sctrl |= SCTRL_R1SMB;
508         }
509         es_wr(es, ES1370_REG_SERIAL_CONTROL, es->sctrl, 4);
510         ES_UNLOCK(es);
511         ch->fmt = format;
512         return 0;
513 }
514
515 static int
516 eschan1370_setspeed(kobj_t obj, void *data, u_int32_t speed)
517 {
518         struct es_chinfo *ch = data;
519         struct es_info *es = ch->parent;
520
521         /* Fixed rate , do nothing. */
522         if (ch->caps.minspeed == ch->caps.maxspeed)
523                 return ch->caps.maxspeed;
524         if (speed < ch->caps.minspeed)
525                 speed = ch->caps.minspeed;
526         if (speed > ch->caps.maxspeed)
527                 speed = ch->caps.maxspeed;
528         ES_LOCK(es);
529         if (ch->index == ES_DAC1) {
530                 /*
531                  * DAC1 does not support continuous rate settings.
532                  * Pick the nearest and use it since FEEDER_RATE will
533                  * do the the proper conversion for us.
534                  */
535                 es->ctrl &= ~CTRL_WTSRSEL;
536                 if (speed < 8268) {
537                         speed = 5512;
538                         es->ctrl |= 0 << CTRL_SH_WTSRSEL;
539                 } else if (speed < 16537) {
540                         speed = 11025;
541                         es->ctrl |= 1 << CTRL_SH_WTSRSEL;
542                 } else if (speed < 33075) {
543                         speed = 22050;
544                         es->ctrl |= 2 << CTRL_SH_WTSRSEL;
545                 } else {
546                         speed = 44100;
547                         es->ctrl |= 3 << CTRL_SH_WTSRSEL;
548                 }
549         } else {
550                 es->ctrl &= ~CTRL_PCLKDIV;
551                 es->ctrl |= DAC2_SRTODIV(speed) << CTRL_SH_PCLKDIV;
552         }
553         es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4);
554         ES_UNLOCK(es);
555         return speed;
556 }
557
558 static int
559 eschan1371_setspeed(kobj_t obj, void *data, u_int32_t speed)
560 {
561         struct es_chinfo *ch = data;
562         struct es_info *es = ch->parent;
563         uint32_t i;
564         int delta;
565
566         ES_LOCK(es);
567         if (ch->dir == PCMDIR_PLAY)
568                 i = es1371_dac_rate(es, speed, ch->index); /* play */
569         else
570                 i = es1371_adc_rate(es, speed, ch->index); /* record */
571         ES_UNLOCK(es);
572         delta = (speed > i) ? speed - i : i - speed;
573         if (delta < 2)
574                 return speed;
575         return i;
576 }
577
578 static int
579 eschan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
580 {
581         struct es_info *es;
582         struct es_chinfo *ch = data;
583         uint32_t oblksz, obufsz;
584         int error;
585
586         oblksz = ch->blksz;
587         obufsz = ch->bufsz;
588         ch->blksz = blocksize;
589         ch->bufsz = ch->blksz * 2;
590         error = sndbuf_resize(ch->buffer, 2, ch->blksz);
591         if (error != 0) {
592                 ch->blksz = oblksz;
593                 ch->bufsz = obufsz;
594                 es = ch->parent;
595                 device_printf(es->dev, "unable to set block size, blksz = %d, "
596                     "error = %d", blocksize, error);
597         }
598         return ch->blksz;
599 }
600
601 static int
602 eschan_trigger(kobj_t obj, void *data, int go)
603 {
604         struct es_chinfo *ch = data;
605         struct es_info *es = ch->parent;
606         uint32_t cnt, b = 0;
607
608         if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD)
609                 return 0;
610
611         cnt = (ch->blksz / sndbuf_getbps(ch->buffer)) - 1;
612         if (ch->fmt & AFMT_16BIT)
613                 b |= 0x02;
614         if (ch->fmt & AFMT_STEREO)
615                 b |= 0x01;
616         ES_LOCK(es);
617         if (ch->dir == PCMDIR_PLAY) {
618                 if (go == PCMTRIG_START) {
619                         if (ch->index == ES_DAC1) {
620                                 es->ctrl |= CTRL_DAC1_EN;
621                                 es->sctrl &= ~(SCTRL_P1LOOPSEL | SCTRL_P1PAUSE | SCTRL_P1SCTRLD);
622                                 es->sctrl |= SCTRL_P1INTEN | b;
623                                 es_wr(es, ES1370_REG_DAC1_SCOUNT, cnt, 4);
624                                 /* start at beginning of buffer */
625                                 es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_DAC1_FRAMECNT >> 8, 4);
626                                 es_wr(es, ES1370_REG_DAC1_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4);
627                         } else {
628                                 es->ctrl |= CTRL_DAC2_EN;
629                                 es->sctrl &= ~(SCTRL_P2ENDINC | SCTRL_P2STINC | SCTRL_P2LOOPSEL | SCTRL_P2PAUSE | SCTRL_P2DACSEN);
630                                 es->sctrl |= SCTRL_P2INTEN | (b << 2) |
631                                                 (((b & 2) ? : 1) << SCTRL_SH_P2ENDINC);
632                                 es_wr(es, ES1370_REG_DAC2_SCOUNT, cnt, 4);
633                                 /* start at beginning of buffer */
634                                 es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_DAC2_FRAMECNT >> 8, 4);
635                                 es_wr(es, ES1370_REG_DAC2_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4);
636                         }
637                 } else es->ctrl &= ~(ch->index == ES_DAC1 ? CTRL_DAC1_EN : CTRL_DAC2_EN);
638         } else {
639                 if (go == PCMTRIG_START) {
640                         es->ctrl |= CTRL_ADC_EN;
641                         es->sctrl &= ~SCTRL_R1LOOPSEL;
642                         es->sctrl |= SCTRL_R1INTEN | (b << 4);
643                         es_wr(es, ES1370_REG_ADC_SCOUNT, cnt, 4);
644                         /* start at beginning of buffer */
645                         es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_ADC_FRAMECNT >> 8, 4);
646                         es_wr(es, ES1370_REG_ADC_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4);
647                 } else es->ctrl &= ~CTRL_ADC_EN;
648         }
649         es_wr(es, ES1370_REG_SERIAL_CONTROL, es->sctrl, 4);
650         es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4);
651         ES_UNLOCK(es);
652         return 0;
653 }
654
655 static int
656 eschan_getptr(kobj_t obj, void *data)
657 {
658         struct es_chinfo *ch = data;
659         struct es_info *es = ch->parent;
660         u_int32_t reg, cnt;
661
662         if (ch->dir == PCMDIR_PLAY) {
663                 if (ch->index == ES_DAC1)
664                         reg = ES1370_REG_DAC1_FRAMECNT;
665                 else
666                         reg = ES1370_REG_DAC2_FRAMECNT;
667         } else
668                 reg = ES1370_REG_ADC_FRAMECNT;
669         ES_LOCK(es);
670         es_wr(es, ES1370_REG_MEMPAGE, reg >> 8, 4);
671         cnt = es_rd(es, reg & 0x000000ff, 4) >> 16;
672         ES_UNLOCK(es);
673         /* cnt is longwords */
674         return cnt << 2;
675 }
676
677 static struct pcmchan_caps *
678 eschan_getcaps(kobj_t obj, void *data)
679 {
680         struct es_chinfo *ch = data;
681
682         return &ch->caps;
683 }
684
685 static kobj_method_t eschan1370_methods[] = {
686         KOBJMETHOD(channel_init,                eschan_init),
687         KOBJMETHOD(channel_setformat,           eschan_setformat),
688         KOBJMETHOD(channel_setspeed,            eschan1370_setspeed),
689         KOBJMETHOD(channel_setblocksize,        eschan_setblocksize),
690         KOBJMETHOD(channel_trigger,             eschan_trigger),
691         KOBJMETHOD(channel_getptr,              eschan_getptr),
692         KOBJMETHOD(channel_getcaps,             eschan_getcaps),
693         { 0, 0 }
694 };
695 CHANNEL_DECLARE(eschan1370);
696
697 static kobj_method_t eschan1371_methods[] = {
698         KOBJMETHOD(channel_init,                eschan_init),
699         KOBJMETHOD(channel_setformat,           eschan_setformat),
700         KOBJMETHOD(channel_setspeed,            eschan1371_setspeed),
701         KOBJMETHOD(channel_setblocksize,        eschan_setblocksize),
702         KOBJMETHOD(channel_trigger,             eschan_trigger),
703         KOBJMETHOD(channel_getptr,              eschan_getptr),
704         KOBJMETHOD(channel_getcaps,             eschan_getcaps),
705         { 0, 0 }
706 };
707 CHANNEL_DECLARE(eschan1371);
708
709 /* -------------------------------------------------------------------- */
710 /* The interrupt handler */
711 static void
712 es_intr(void *p)
713 {
714         struct es_info *es = p;
715         uint32_t intsrc, sctrl;
716
717         ES_LOCK(es);
718         intsrc = es_rd(es, ES1370_REG_STATUS, 4);
719         if ((intsrc & STAT_INTR) == 0) {
720                 ES_UNLOCK(es);
721                 return;
722         }
723
724         sctrl = es->sctrl;
725         if (intsrc & STAT_ADC)  sctrl &= ~SCTRL_R1INTEN;
726         if (intsrc & STAT_DAC1) sctrl &= ~SCTRL_P1INTEN;
727         if (intsrc & STAT_DAC2) sctrl &= ~SCTRL_P2INTEN;
728
729         es_wr(es, ES1370_REG_SERIAL_CONTROL, sctrl, 4);
730         es_wr(es, ES1370_REG_SERIAL_CONTROL, es->sctrl, 4);
731         ES_UNLOCK(es);
732
733         if (intsrc & STAT_ADC) chn_intr(es->ch[ES_ADC].channel);
734         if (intsrc & STAT_DAC1) chn_intr(es->ch[ES_DAC1].channel);
735         if (intsrc & STAT_DAC2) chn_intr(es->ch[ES_DAC2].channel);
736 }
737
738 /* ES1370 specific */
739 static int
740 es1370_init(struct es_info *es)
741 {
742         uint32_t fixed_rate;
743         int r, single_pcm;
744
745         /* ES1370 default to fixed rate operation */
746         if (resource_int_value(device_get_name(es->dev),
747                         device_get_unit(es->dev), "fixed_rate", &r) == 0) {
748                 fixed_rate = r;
749                 if (fixed_rate) {
750                         if (fixed_rate < es_caps.minspeed)
751                                 fixed_rate = es_caps.minspeed;
752                         if (fixed_rate > es_caps.maxspeed)
753                                 fixed_rate = es_caps.maxspeed;
754                 }
755         } else
756                 fixed_rate = es_caps.maxspeed;
757
758         if (resource_int_value(device_get_name(es->dev),
759                         device_get_unit(es->dev), "single_pcm_mixer", &r) == 0)
760                 single_pcm = (r) ? 1 : 0;
761         else
762                 single_pcm = 1;
763
764         ES_LOCK(es);
765         if (ES_NUMPLAY(es->escfg) == 1)
766                 single_pcm = 1;
767         /* This is ES1370 */
768         es->escfg = ES_SET_IS_ES1370(es->escfg, 1);
769         if (fixed_rate) {
770                 es->escfg = ES_SET_FIXED_RATE(es->escfg, fixed_rate);
771         } else {
772                 es->escfg = ES_SET_FIXED_RATE(es->escfg, 0);
773                 fixed_rate = DSP_DEFAULT_SPEED;
774         }
775         if (single_pcm) {
776                 es->escfg = ES_SET_SINGLE_PCM_MIX(es->escfg, 1);
777         } else {
778                 es->escfg = ES_SET_SINGLE_PCM_MIX(es->escfg, 0);
779         }
780         es->ctrl = CTRL_CDC_EN | CTRL_JYSTK_EN | CTRL_SERR_DIS |
781                 (DAC2_SRTODIV(fixed_rate) << CTRL_SH_PCLKDIV);
782         es->ctrl |= 3 << CTRL_SH_WTSRSEL;
783         es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4);
784
785         es->sctrl = 0;
786         es_wr(es, ES1370_REG_SERIAL_CONTROL, es->sctrl, 4);
787
788         es1370_wrcodec(es, CODEC_RES_PD, 3);/* No RST, PD */
789         es1370_wrcodec(es, CODEC_CSEL, 0);      /* CODEC ADC and CODEC DAC use
790                                                  * {LR,B}CLK2 and run off the LRCLK2
791                                                  * PLL; program DAC_SYNC=0!  */
792         es1370_wrcodec(es, CODEC_ADSEL, 0);/* Recording source is mixer */
793         es1370_wrcodec(es, CODEC_MGAIN, 0);/* MIC amp is 0db */
794         ES_UNLOCK(es);
795
796         return 0;
797 }
798
799 /* ES1371 specific */
800 int
801 es1371_init(struct es_info *es)
802 {
803         uint32_t cssr, devid, revid, subdev;
804         int idx;
805
806         ES_LOCK(es);
807         /* This is NOT ES1370 */
808         es->escfg = ES_SET_IS_ES1370(es->escfg, 0);
809         es->num = 0;
810         es->sctrl = 0;
811         cssr = 0;
812         devid = pci_get_devid(es->dev);
813         revid = pci_get_revid(es->dev);
814         subdev = (pci_get_subdevice(es->dev) << 16) | pci_get_subvendor(es->dev);
815         /*
816          * Joyport blacklist. Either we're facing with broken hardware
817          * or because this hardware need special (unknown) initialization
818          * procedures.
819          */
820         switch (subdev) {
821         case 0x20001274:        /* old Ensoniq */
822                 es->ctrl = 0;
823                 break;
824         default:
825                 es->ctrl = CTRL_JYSTK_EN;
826                 break;
827         }
828         if (devid == CT4730_PCI_ID) {
829                 /* XXX amplifier hack? */
830                 es->ctrl |= (1 << 16);
831         }
832         /* initialize the chips */
833         es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4);
834         es_wr(es, ES1370_REG_SERIAL_CONTROL, es->sctrl, 4);
835         es_wr(es, ES1371_REG_LEGACY, 0, 4);
836         if ((devid == ES1371_PCI_ID && revid == ES1371REV_ES1373_8) ||
837             (devid == ES1371_PCI_ID && revid == ES1371REV_CT5880_A) ||
838             (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_C) ||
839             (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_D) ||
840             (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_E)) {
841                 cssr = 1 << 29;
842                 es_wr(es, ES1370_REG_STATUS, cssr, 4);
843                 DELAY(20000);
844         }
845         /* AC'97 warm reset to start the bitclk */
846         es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4);
847         es_wr(es, ES1371_REG_LEGACY, ES1371_SYNC_RES, 4);
848         DELAY(2000);
849         es_wr(es, ES1370_REG_CONTROL, es->sctrl, 4);
850         es1371_wait_src_ready(es);
851         /* Init the sample rate converter */
852         es_wr(es, ES1371_REG_SMPRATE, ES1371_DIS_SRC, 4);
853         for (idx = 0; idx < 0x80; idx++)
854                 es1371_src_write(es, idx, 0);
855         es1371_src_write(es, ES_SMPREG_DAC1 + ES_SMPREG_TRUNC_N,  16 << 4);
856         es1371_src_write(es, ES_SMPREG_DAC1 + ES_SMPREG_INT_REGS, 16 << 10);
857         es1371_src_write(es, ES_SMPREG_DAC2 + ES_SMPREG_TRUNC_N,  16 << 4);
858         es1371_src_write(es, ES_SMPREG_DAC2 + ES_SMPREG_INT_REGS, 16 << 10);
859         es1371_src_write(es, ES_SMPREG_VOL_ADC,                   1 << 12);
860         es1371_src_write(es, ES_SMPREG_VOL_ADC  + 1,              1 << 12);
861         es1371_src_write(es, ES_SMPREG_VOL_DAC1,                  1 << 12);
862         es1371_src_write(es, ES_SMPREG_VOL_DAC1 + 1,              1 << 12);
863         es1371_src_write(es, ES_SMPREG_VOL_DAC2,                  1 << 12);
864         es1371_src_write(es, ES_SMPREG_VOL_DAC2 + 1,              1 << 12);
865         es1371_adc_rate(es, 22050,                                ES_ADC);
866         es1371_dac_rate(es, 22050,                                ES_DAC1);
867         es1371_dac_rate(es, 22050,                                ES_DAC2);
868         /* WARNING:
869          * enabling the sample rate converter without properly programming
870          * its parameters causes the chip to lock up (the SRC busy bit will
871          * be stuck high, and I've found no way to rectify this other than
872          * power cycle)
873          */
874         es1371_wait_src_ready(es);
875         es_wr(es, ES1371_REG_SMPRATE, 0, 4);
876         /* try to reset codec directly */
877         es_wr(es, ES1371_REG_CODEC, 0, 4);
878         es_wr(es, ES1370_REG_STATUS, cssr, 4);
879         ES_UNLOCK(es);
880
881         return (0);
882 }
883
884 /* -------------------------------------------------------------------- */
885
886 static int
887 es1371_wrcd(kobj_t obj, void *s, int addr, u_int32_t data)
888 {
889         uint32_t t, x, orig;
890         struct es_info *es = (struct es_info*)s;
891
892         for (t = 0; t < 0x1000; t++)
893                 if (!es_rd(es, ES1371_REG_CODEC & CODEC_WIP, 4))
894                         break;
895         /* save the current state for later */
896         x = orig = es_rd(es, ES1371_REG_SMPRATE, 4);
897         /* enable SRC state data in SRC mux */
898         es_wr(es, ES1371_REG_SMPRATE,
899                 (x &
900                 (ES1371_DIS_SRC | ES1371_DIS_P1 | ES1371_DIS_P2 | ES1371_DIS_R1)) |
901                 0x00010000, 4);
902         /* busy wait */
903         for (t = 0; t < 0x1000; t++)
904                 if ((es_rd(es, ES1371_REG_SMPRATE, 4) & 0x00870000) == 0x00000000)
905                         break;
906         /* wait for a SAFE time to write addr/data and then do it, dammit */
907         for (t = 0; t < 0x1000; t++)
908                 if ((es_rd(es, ES1371_REG_SMPRATE, 4) & 0x00870000) == 0x00010000)
909                         break;
910
911         es_wr(es, ES1371_REG_CODEC,
912                           ((addr << CODEC_POADD_SHIFT) & CODEC_POADD_MASK) |
913                           ((data << CODEC_PODAT_SHIFT) & CODEC_PODAT_MASK), 4);
914         /* restore SRC reg */
915         es1371_wait_src_ready(s);
916         es_wr(es, ES1371_REG_SMPRATE, orig, 4);
917
918         return 0;
919 }
920
921 static int
922 es1371_rdcd(kobj_t obj, void *s, int addr)
923 {
924         uint32_t t, x, orig;
925         struct es_info *es = (struct es_info *)s;
926
927         for (t = 0; t < 0x1000; t++)
928                 if (!(x = es_rd(es, ES1371_REG_CODEC, 4) & CODEC_WIP))
929                         break;
930
931         /* save the current state for later */
932         x = orig = es_rd(es, ES1371_REG_SMPRATE, 4);
933         /* enable SRC state data in SRC mux */
934         es_wr(es, ES1371_REG_SMPRATE,
935                           (x &
936                           (ES1371_DIS_SRC | ES1371_DIS_P1 | ES1371_DIS_P2 | ES1371_DIS_R1)) |
937                           0x00010000, 4);
938         /* busy wait */
939         for (t = 0; t < 0x1000; t++)
940                 if ((x = es_rd(es, ES1371_REG_SMPRATE, 4) & 0x00870000) == 0x00000000)
941                         break;
942         /* wait for a SAFE time to write addr/data and then do it, dammit */
943         for (t = 0; t < 0x1000; t++)
944                 if ((x = es_rd(es, ES1371_REG_SMPRATE, 4) & 0x00870000) == 0x00010000)
945                         break;
946
947         es_wr(es, ES1371_REG_CODEC,
948                           ((addr << CODEC_POADD_SHIFT) & CODEC_POADD_MASK) |
949                           CODEC_PORD, 4);
950
951         /* restore SRC reg */
952         es1371_wait_src_ready(s);
953         es_wr(es, ES1371_REG_SMPRATE, orig, 4);
954
955         /* now wait for the stinkin' data (RDY) */
956         for (t = 0; t < 0x1000; t++)
957                 if ((x = es_rd(es, ES1371_REG_CODEC, 4)) & CODEC_RDY)
958                         break;
959
960         return ((x & CODEC_PIDAT_MASK) >> CODEC_PIDAT_SHIFT);
961 }
962
963 static kobj_method_t es1371_ac97_methods[] = {
964         KOBJMETHOD(ac97_read,           es1371_rdcd),
965         KOBJMETHOD(ac97_write,          es1371_wrcd),
966         { 0, 0 }
967 };
968 AC97_DECLARE(es1371_ac97);
969
970 /* -------------------------------------------------------------------- */
971
972 static u_int
973 es1371_src_read(struct es_info *es, u_short reg)
974 {
975         uint32_t r;
976
977         r = es1371_wait_src_ready(es) &
978                 (ES1371_DIS_SRC | ES1371_DIS_P1 | ES1371_DIS_P2 | ES1371_DIS_R1);
979         r |= ES1371_SRC_RAM_ADDRO(reg);
980         es_wr(es, ES1371_REG_SMPRATE, r, 4);
981         return ES1371_SRC_RAM_DATAI(es1371_wait_src_ready(es));
982 }
983
984 static void
985 es1371_src_write(struct es_info *es, u_short reg, u_short data)
986 {
987         uint32_t r;
988
989         r = es1371_wait_src_ready(es) &
990                 (ES1371_DIS_SRC | ES1371_DIS_P1 | ES1371_DIS_P2 | ES1371_DIS_R1);
991         r |= ES1371_SRC_RAM_ADDRO(reg) |  ES1371_SRC_RAM_DATAO(data);
992         es_wr(es, ES1371_REG_SMPRATE, r | ES1371_SRC_RAM_WE, 4);
993 }
994
995 static u_int
996 es1371_adc_rate(struct es_info *es, u_int rate, int set)
997 {
998         u_int n, truncm, freq, result;
999
1000         ES_LOCK_ASSERT(es);
1001
1002         if (rate > 48000) rate = 48000;
1003         if (rate < 4000) rate = 4000;
1004         n = rate / 3000;
1005         if ((1 << n) & ((1 << 15) | (1 << 13) | (1 << 11) | (1 << 9)))
1006                 n--;
1007         truncm = (21 * n - 1) | 1;
1008         freq = ((48000UL << 15) / rate) * n;
1009         result = (48000UL << 15) / (freq / n);
1010         if (set) {
1011                 if (rate >= 24000) {
1012                         if (truncm > 239) truncm = 239;
1013                         es1371_src_write(es, ES_SMPREG_ADC + ES_SMPREG_TRUNC_N,
1014                                 (((239 - truncm) >> 1) << 9) | (n << 4));
1015                 } else {
1016                         if (truncm > 119) truncm = 119;
1017                         es1371_src_write(es, ES_SMPREG_ADC + ES_SMPREG_TRUNC_N,
1018                                 0x8000 | (((119 - truncm) >> 1) << 9) | (n << 4));
1019                 }
1020                 es1371_src_write(es, ES_SMPREG_ADC + ES_SMPREG_INT_REGS,
1021                         (es1371_src_read(es, ES_SMPREG_ADC + ES_SMPREG_INT_REGS) &
1022                         0x00ff) | ((freq >> 5) & 0xfc00));
1023                 es1371_src_write(es, ES_SMPREG_ADC + ES_SMPREG_VFREQ_FRAC, freq & 0x7fff);
1024                 es1371_src_write(es, ES_SMPREG_VOL_ADC, n << 8);
1025                 es1371_src_write(es, ES_SMPREG_VOL_ADC + 1, n << 8);
1026         }
1027         return result;
1028 }
1029
1030 static u_int
1031 es1371_dac_rate(struct es_info *es, u_int rate, int set)
1032 {
1033         u_int freq, r, result, dac, dis;
1034
1035         ES_LOCK_ASSERT(es);
1036
1037         if (rate > 48000) rate = 48000;
1038         if (rate < 4000) rate = 4000;
1039         freq = ((rate << 15) + 1500) / 3000;
1040         result = (freq * 3000) >> 15;
1041         
1042         dac = (set == ES_DAC1) ? ES_SMPREG_DAC1 : ES_SMPREG_DAC2;
1043         dis = (set == ES_DAC1) ? ES1371_DIS_P2 : ES1371_DIS_P1;
1044         r = (es1371_wait_src_ready(es) & (ES1371_DIS_SRC | ES1371_DIS_P1 | ES1371_DIS_P2 | ES1371_DIS_R1));
1045         es_wr(es, ES1371_REG_SMPRATE, r, 4);
1046         es1371_src_write(es, dac + ES_SMPREG_INT_REGS,
1047                         (es1371_src_read(es, dac + ES_SMPREG_INT_REGS) & 0x00ff) | ((freq >> 5) & 0xfc00));
1048         es1371_src_write(es, dac + ES_SMPREG_VFREQ_FRAC, freq & 0x7fff);
1049         r = (es1371_wait_src_ready(es) & (ES1371_DIS_SRC | dis | ES1371_DIS_R1));
1050         es_wr(es, ES1371_REG_SMPRATE, r, 4);
1051         return result;
1052 }
1053
1054 static uint32_t
1055 es1371_wait_src_ready(struct es_info *es)
1056 {
1057         uint32_t t, r;
1058
1059         for (t = 0; t < 0x1000; t++) {
1060                 if (!((r = es_rd(es, ES1371_REG_SMPRATE, 4)) & ES1371_SRC_RAM_BUSY))
1061                         return r;
1062                 DELAY(1);
1063         }
1064         device_printf(es->dev, "%s: timed out 0x%x [0x%x]\n", __func__,
1065                 ES1371_REG_SMPRATE, r);
1066         return 0;
1067 }
1068
1069 /* -------------------------------------------------------------------- */
1070
1071 /*
1072  * Probe and attach the card
1073  */
1074
1075 static int
1076 es_pci_probe(device_t dev)
1077 {
1078         switch(pci_get_devid(dev)) {
1079         case ES1370_PCI_ID:
1080                 device_set_desc(dev, "AudioPCI ES1370");
1081                 return BUS_PROBE_DEFAULT;
1082
1083         case ES1371_PCI_ID:
1084                 switch(pci_get_revid(dev)) {
1085                 case ES1371REV_ES1371_A:
1086                         device_set_desc(dev, "AudioPCI ES1371-A");
1087                         return BUS_PROBE_DEFAULT;
1088
1089                 case ES1371REV_ES1371_B:
1090                         device_set_desc(dev, "AudioPCI ES1371-B");
1091                         return BUS_PROBE_DEFAULT;
1092
1093                 case ES1371REV_ES1373_A:
1094                         device_set_desc(dev, "AudioPCI ES1373-A");
1095                         return BUS_PROBE_DEFAULT;
1096
1097                 case ES1371REV_ES1373_B:
1098                         device_set_desc(dev, "AudioPCI ES1373-B");
1099                         return BUS_PROBE_DEFAULT;
1100
1101                 case ES1371REV_ES1373_8:
1102                         device_set_desc(dev, "AudioPCI ES1373-8");
1103                         return BUS_PROBE_DEFAULT;
1104
1105                 case ES1371REV_CT5880_A:
1106                         device_set_desc(dev, "Creative CT5880-A");
1107                         return BUS_PROBE_DEFAULT;
1108
1109                 default:
1110                         device_set_desc(dev, "AudioPCI ES1371-?");
1111                         device_printf(dev, "unknown revision %d -- please report to cg@freebsd.org\n", pci_get_revid(dev));
1112                         return BUS_PROBE_DEFAULT;
1113                 }
1114
1115         case ES1371_PCI_ID2:
1116                 device_set_desc(dev, "Strange AudioPCI ES1371-? (vid=3274)");
1117                 device_printf(dev, "unknown revision %d -- please report to cg@freebsd.org\n", pci_get_revid(dev));
1118                 return BUS_PROBE_DEFAULT;
1119
1120         case CT4730_PCI_ID:
1121                 switch(pci_get_revid(dev)) {
1122                 case CT4730REV_CT4730_A:
1123                         device_set_desc(dev, "Creative SB AudioPCI CT4730/EV1938");
1124                         return BUS_PROBE_DEFAULT;
1125                 default:
1126                         device_set_desc(dev, "Creative SB AudioPCI CT4730-?");
1127                         device_printf(dev, "unknown revision %d -- please report to cg@freebsd.org\n", pci_get_revid(dev));
1128                         return BUS_PROBE_DEFAULT;
1129                 }
1130
1131         case CT5880_PCI_ID:
1132                 switch(pci_get_revid(dev)) {
1133                 case CT5880REV_CT5880_C:
1134                         device_set_desc(dev, "Creative CT5880-C");
1135                         return BUS_PROBE_DEFAULT;
1136
1137                 case CT5880REV_CT5880_D:
1138                         device_set_desc(dev, "Creative CT5880-D");
1139                         return BUS_PROBE_DEFAULT;
1140
1141                 case CT5880REV_CT5880_E:
1142                         device_set_desc(dev, "Creative CT5880-E");
1143                         return BUS_PROBE_DEFAULT;
1144
1145                 default:
1146                         device_set_desc(dev, "Creative CT5880-?");
1147                         device_printf(dev, "unknown revision %d -- please report to cg@freebsd.org\n", pci_get_revid(dev));
1148                         return BUS_PROBE_DEFAULT;
1149                 }
1150
1151         default:
1152                 return ENXIO;
1153         }
1154 }
1155
1156 #ifdef SND_DYNSYSCTL
1157 static int
1158 sysctl_es137x_spdif_enable(SYSCTL_HANDLER_ARGS)
1159 {
1160         struct es_info *es;
1161         device_t dev;
1162         uint32_t r;
1163         int err, new_en;
1164
1165         dev = oidp->oid_arg1;
1166         es = pcm_getdevinfo(dev);
1167         ES_LOCK(es);
1168         r = es_rd(es, ES1370_REG_STATUS, 4);
1169         ES_UNLOCK(es);
1170         new_en = (r & ENABLE_SPDIF) ? 1 : 0;
1171         err = sysctl_handle_int(oidp, &new_en, sizeof(new_en), req);
1172
1173         if (err || req->newptr == NULL)
1174                 return (err);
1175         if (new_en < 0 || new_en > 1)
1176                 return (EINVAL);
1177
1178         ES_LOCK(es);
1179         if (new_en) {
1180                 r |= ENABLE_SPDIF;
1181                 es->ctrl |= SPDIFEN_B;
1182                 es->ctrl |= RECEN_B;
1183         } else {
1184                 r &= ~ENABLE_SPDIF;
1185                 es->ctrl &= ~SPDIFEN_B;
1186                 es->ctrl &= ~RECEN_B;
1187         }
1188         es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4);
1189         es_wr(es, ES1370_REG_STATUS, r, 4);
1190         ES_UNLOCK(es);
1191
1192         return (0);
1193 }
1194
1195 #if 0
1196 static int
1197 sysctl_es137x_latency_timer(SYSCTL_HANDLER_ARGS)
1198 {
1199         struct es_info *es;
1200         device_t dev;
1201         uint32_t val;
1202         int err;
1203
1204         dev = oidp->oid_arg1;
1205         es = pcm_getdevinfo(dev);
1206         ES_LOCK(es);
1207         val = pci_read_config(dev, PCIR_LATTIMER, 1);
1208         ES_UNLOCK(es);
1209         err = sysctl_handle_int(oidp, &val, sizeof(val), req);
1210         
1211         if (err || req->newptr == NULL)
1212                 return (err);
1213         if (val > 255)
1214                 return (EINVAL);
1215
1216         ES_LOCK(es);
1217         pci_write_config(dev, PCIR_LATTIMER, val, 1);
1218         ES_UNLOCK(es);
1219
1220         return (0);
1221 }
1222
1223 static int
1224 sysctl_es137x_fixed_rate(SYSCTL_HANDLER_ARGS)
1225 {
1226         struct es_info *es;
1227         device_t dev;
1228         uint32_t val;
1229         int err;
1230
1231         dev = oidp->oid_arg1;
1232         es = pcm_getdevinfo(dev);
1233         ES_LOCK(es);
1234         val = ES_FIXED_RATE(es->escfg);
1235         if (val < es_caps.minspeed)
1236                 val = 0;
1237         ES_UNLOCK(es);
1238         err = sysctl_handle_int(oidp, &val, sizeof(val), req);
1239         
1240         if (err || req->newptr == NULL)
1241                 return (err);
1242         if (val != 0 && (val < es_caps.minspeed || val > es_caps.maxspeed))
1243                 return (EINVAL);
1244
1245         ES_LOCK(es);
1246         if (es->ctrl & (CTRL_DAC2_EN|CTRL_ADC_EN)) {
1247                 ES_UNLOCK(es);
1248                 return (EBUSY);
1249         }
1250         if (val) {
1251                 if (val != ES_FIXED_RATE(es->escfg)) {
1252                         es->escfg = ES_SET_FIXED_RATE(es->escfg, val);
1253                         es->ch[ES_DAC2].caps.maxspeed = val;
1254                         es->ch[ES_DAC2].caps.minspeed = val;
1255                         es->ch[ES_ADC].caps.maxspeed = val;
1256                         es->ch[ES_ADC].caps.minspeed = val;
1257                         es->ctrl &= ~CTRL_PCLKDIV;
1258                         es->ctrl |= DAC2_SRTODIV(val) << CTRL_SH_PCLKDIV;
1259                         es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4);
1260                 }
1261         } else {
1262                 es->escfg = ES_SET_FIXED_RATE(es->escfg, 0);
1263                 es->ch[ES_DAC2].caps = es_caps;
1264                 es->ch[ES_ADC].caps = es_caps;
1265         }
1266         ES_UNLOCK(es);
1267
1268         return (0);
1269 }
1270
1271 static int
1272 sysctl_es137x_single_pcm_mixer(SYSCTL_HANDLER_ARGS)
1273 {
1274         struct es_info *es;
1275         struct snddev_info *d;
1276         struct snd_mixer *m;
1277         struct cdev *i_dev;
1278         device_t dev;
1279         uint32_t val, set;
1280         int recsrc, level, err;
1281
1282         dev = oidp->oid_arg1;
1283         d = device_get_softc(dev);
1284         if (d == NULL || d->mixer_dev == NULL || d->mixer_dev->si_drv1 == NULL)
1285                 return (EINVAL);
1286         es = d->devinfo;
1287         if (es == NULL)
1288                 return (EINVAL);
1289         ES_LOCK(es);
1290         set = ES_SINGLE_PCM_MIX(es->escfg);
1291         val = set;
1292         ES_UNLOCK(es);
1293         err = sysctl_handle_int(oidp, &val, sizeof(val), req);
1294         
1295         if (err || req->newptr == NULL)
1296                 return (err);
1297         if (!(val == 0 || val == 1))
1298                 return (EINVAL);
1299         if (val == set)
1300                 return (0);
1301         i_dev = d->mixer_dev;
1302         if (mixer_ioctl(i_dev, 0, (caddr_t)&recsrc, 0, NULL) != EBADF)
1303                 return (EBUSY);
1304         err = mixer_ioctl(i_dev, MIXER_READ(SOUND_MIXER_PCM),
1305                                         (caddr_t)&level, -1, NULL);
1306         if (!err)
1307                 err = mixer_ioctl(i_dev, MIXER_READ(SOUND_MIXER_RECSRC),
1308                                                 (caddr_t)&recsrc, -1, NULL);
1309         if (err)
1310                 return (err);
1311         if (level < 0)
1312                 return (EINVAL);
1313
1314         ES_LOCK(es);
1315         if (es->ctrl & (CTRL_ADC_EN | CTRL_DAC1_EN | CTRL_DAC2_EN)) {
1316                 ES_UNLOCK(es);
1317                 return (EBUSY);
1318         }
1319         if (val) {
1320                 es->escfg = ES_SET_SINGLE_PCM_MIX(es->escfg, 1);
1321         } else {
1322                 es->escfg = ES_SET_SINGLE_PCM_MIX(es->escfg, 0);
1323         }
1324         ES_UNLOCK(es);
1325         m = i_dev->si_drv1;
1326         if (!val) {
1327                 mix_setdevs(m, mix_getdevs(d->mixer_dev->si_drv1) |
1328                                 (1 << SOUND_MIXER_SYNTH));
1329                 mix_setrecdevs(m, mix_getrecdevs(d->mixer_dev->si_drv1) |
1330                                 (1 << SOUND_MIXER_SYNTH));
1331                 err = mixer_ioctl(i_dev, MIXER_WRITE(SOUND_MIXER_SYNTH),
1332                                 (caddr_t)&level, -1, NULL);
1333         } else {
1334                 err = mixer_ioctl(i_dev, MIXER_WRITE(SOUND_MIXER_SYNTH),
1335                                 (caddr_t)&level, -1, NULL);
1336                 mix_setdevs(m, mix_getdevs(d->mixer_dev->si_drv1) &
1337                                 ~(1 << SOUND_MIXER_SYNTH));
1338                 mix_setrecdevs(m, mix_getrecdevs(d->mixer_dev->si_drv1) &
1339                                 ~(1 << SOUND_MIXER_SYNTH));
1340         }
1341         if (!err) {
1342                 level = recsrc;
1343                 if (recsrc & (1 << SOUND_MIXER_PCM))
1344                         recsrc |= 1 << SOUND_MIXER_SYNTH;
1345                 else if (recsrc & (1 << SOUND_MIXER_SYNTH))
1346                         recsrc |= 1 << SOUND_MIXER_PCM;
1347                 if (level != recsrc)
1348                         err = mixer_ioctl(i_dev, MIXER_WRITE(SOUND_MIXER_RECSRC),
1349                                                 (caddr_t)&recsrc, -1, NULL);
1350         }
1351         return (err);
1352 }
1353 #endif
1354 #endif /* SND_DYNSYSCTL */
1355
1356 static void
1357 es_init_sysctls(device_t dev)
1358 {
1359 #ifdef SND_DYNSYSCTL
1360         struct es_info *es;
1361         int r, devid, revid;
1362
1363         devid = pci_get_devid(dev);
1364         revid = pci_get_revid(dev);
1365         es = pcm_getdevinfo(dev);
1366         if ((devid == ES1371_PCI_ID && revid == ES1371REV_ES1373_8) ||
1367                     (devid == ES1371_PCI_ID && revid == ES1371REV_CT5880_A) ||
1368                     (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_C) ||
1369                     (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_D) ||
1370                     (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_E)) {
1371                 SYSCTL_ADD_PROC(snd_sysctl_tree(dev),
1372                                 SYSCTL_CHILDREN(snd_sysctl_tree_top(dev)),
1373                                 OID_AUTO, "spdif_enabled",
1374                                 CTLTYPE_INT | CTLFLAG_RW, dev, sizeof(dev),
1375                                 sysctl_es137x_spdif_enable, "I",
1376                                 "Enable S/PDIF output on primary playback channel");
1377 #if 0
1378         } else if (devid == ES1370_PCI_ID) {
1379                 /*
1380                  * Enable fixed rate sysctl if both DAC2 / ADC enabled.
1381                  */
1382                 if (es->ch[ES_DAC2].channel != NULL && es->ch[ES_ADC].channel != NULL) {
1383                         SYSCTL_ADD_PROC(snd_sysctl_tree(dev),
1384                                         SYSCTL_CHILDREN(snd_sysctl_tree_top(dev)),
1385                                         OID_AUTO, "fixed_rate",
1386                                         CTLTYPE_INT | CTLFLAG_RW, dev, sizeof(dev),
1387                                         sysctl_es137x_fixed_rate, "I",
1388                                         "Enable fixed rate playback/recording");
1389                 }
1390                 /*
1391                  * Enable single pcm mixer sysctl if both DAC1/2 enabled.
1392                  */
1393                 if (es->ch[ES_DAC1].channel != NULL && es->ch[ES_DAC2].channel != NULL) {
1394                         SYSCTL_ADD_PROC(snd_sysctl_tree(dev),
1395                                         SYSCTL_CHILDREN(snd_sysctl_tree_top(dev)),
1396                                         OID_AUTO, "single_pcm_mixer",
1397                                         CTLTYPE_INT | CTLFLAG_RW, dev, sizeof(dev),
1398                                         sysctl_es137x_single_pcm_mixer, "I",
1399                                         "Single PCM mixer controller for both DAC1/DAC2");
1400                 }
1401 #endif
1402         }
1403         if (resource_int_value(device_get_name(dev),
1404                         device_get_unit(dev), "latency_timer", &r) == 0 &&
1405                         !(r < 0 || r > 255))
1406                 pci_write_config(dev, PCIR_LATTIMER, r, 1);
1407 #if 0
1408         SYSCTL_ADD_PROC(snd_sysctl_tree(dev),
1409                         SYSCTL_CHILDREN(snd_sysctl_tree_top(dev)),
1410                         OID_AUTO, "latency_timer",
1411                         CTLTYPE_INT | CTLFLAG_RW, dev, sizeof(dev),
1412                         sysctl_es137x_latency_timer, "I",
1413                         "PCI Latency Timer configuration");
1414 #endif
1415 #endif /* SND_DYNSYSCTL */
1416 }
1417
1418 static int
1419 es_pci_attach(device_t dev)
1420 {
1421         u_int32_t       data;
1422         struct es_info *es = NULL;
1423         int             mapped, i, numplay, dac_cfg;
1424         char            status[SND_STATUSLEN];
1425         struct ac97_info *codec = NULL;
1426         kobj_class_t    ct = NULL;
1427         uint32_t devid;
1428
1429         if ((es = kmalloc(sizeof *es, M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) {
1430                 device_printf(dev, "cannot allocate softc\n");
1431                 return ENXIO;
1432         }
1433         es->lock = snd_mtxcreate(device_get_nameunit(dev), "sound softc");
1434         es->dev = dev;
1435         es->escfg = 0;
1436         mapped = 0;
1437
1438         pci_enable_busmaster(dev);
1439         data = pci_read_config(dev, PCIR_COMMAND, 2);
1440         data |= (PCIM_CMD_PORTEN|PCIM_CMD_MEMEN);
1441         pci_write_config(dev, PCIR_COMMAND, data, 2);
1442         data = pci_read_config(dev, PCIR_COMMAND, 2);
1443         if (mapped == 0 && (data & PCIM_CMD_MEMEN)) {
1444                 es->regid = MEM_MAP_REG;
1445                 es->regtype = SYS_RES_MEMORY;
1446                 es->reg = bus_alloc_resource_any(dev, es->regtype, &es->regid,
1447                                          RF_ACTIVE);
1448                 if (es->reg)
1449                         mapped++;
1450         }
1451         if (mapped == 0 && (data & PCIM_CMD_PORTEN)) {
1452                 es->regid = PCIR_BAR(0);
1453                 es->regtype = SYS_RES_IOPORT;
1454                 es->reg = bus_alloc_resource_any(dev, es->regtype, &es->regid,
1455                                          RF_ACTIVE);
1456                 if (es->reg)
1457                         mapped++;
1458         }
1459         if (mapped == 0) {
1460                 device_printf(dev, "unable to map register space\n");
1461                 goto bad;
1462         }
1463
1464         es->st = rman_get_bustag(es->reg);
1465         es->sh = rman_get_bushandle(es->reg);
1466         es->bufsz = pcm_getbuffersize(dev, 4096, ES_DEFAULT_BUFSZ, 65536);
1467
1468         if (resource_int_value(device_get_name(dev),
1469                         device_get_unit(dev), "dac", &dac_cfg) == 0) {
1470                 if (dac_cfg < 0 || dac_cfg > 3)
1471                         dac_cfg = ES_DEFAULT_DAC_CFG;
1472         } else
1473                 dac_cfg = ES_DEFAULT_DAC_CFG;
1474
1475         switch (dac_cfg) {
1476                 case 0: /* Enable all DAC: DAC1, DAC2 */
1477                         numplay = 2;
1478                         es->escfg = ES_SET_DAC_FIRST(es->escfg, ES_DAC1);
1479                         es->escfg = ES_SET_DAC_SECOND(es->escfg, ES_DAC2);
1480                         break;
1481                 case 1: /* Only DAC1 */
1482                         numplay = 1;
1483                         es->escfg = ES_SET_DAC_FIRST(es->escfg, ES_DAC1);
1484                         break;
1485                 case 3: /* Enable all DAC / swap position: DAC2, DAC1 */
1486                         numplay = 2;
1487                         es->escfg = ES_SET_DAC_FIRST(es->escfg, ES_DAC2);
1488                         es->escfg = ES_SET_DAC_SECOND(es->escfg, ES_DAC1);
1489                         break;
1490                 case 2: /* Only DAC2 */
1491                 default:
1492                         numplay = 1;
1493                         es->escfg = ES_SET_DAC_FIRST(es->escfg, ES_DAC2);
1494                         break;
1495         }
1496         es->escfg = ES_SET_NUMPLAY(es->escfg, numplay);
1497         es->escfg = ES_SET_NUMREC(es->escfg, 1);
1498
1499         devid = pci_get_devid(dev);
1500         switch (devid) {
1501         case ES1371_PCI_ID:
1502         case ES1371_PCI_ID2:
1503         case CT5880_PCI_ID:
1504         case CT4730_PCI_ID:
1505                 es1371_init(es);
1506                 codec = AC97_CREATE(dev, es, es1371_ac97);
1507                 if (codec == NULL)
1508                         goto bad;
1509                 /* our init routine does everything for us */
1510                 /* set to NULL; flag mixer_init not to run the ac97_init */
1511                 /*        ac97_mixer.init = NULL;  */
1512                 if (mixer_init(dev, ac97_getmixerclass(), codec))
1513                         goto bad;
1514                 ct = &eschan1371_class;
1515                 break;
1516         case ES1370_PCI_ID:
1517                 es1370_init(es);
1518                 /* 
1519                  * Disable fixed rate operation if DAC2 disabled.
1520                  * This is a special case for es1370 only, where the
1521                  * speed of both ADC and DAC2 locked together.
1522                  */
1523                 if (!ES_DAC2_ENABLED(es->escfg)) {
1524                         es->escfg = ES_SET_FIXED_RATE(es->escfg, 0);
1525                 }
1526                 if (mixer_init(dev, &es1370_mixer_class, es))
1527                         goto bad;
1528                 ct = &eschan1370_class;
1529                 break;
1530         default:
1531                 goto bad;
1532                 /* NOTREACHED */
1533         }
1534
1535         es->irqid = 0;
1536         es->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &es->irqid,
1537                                  RF_ACTIVE | RF_SHAREABLE);
1538         if (!es->irq || snd_setup_intr(dev, es->irq, INTR_MPSAFE, es_intr, es, &es->ih)) {
1539                 device_printf(dev, "unable to map interrupt\n");
1540                 goto bad;
1541         }
1542
1543         if (bus_dma_tag_create(/*parent*/NULL, /*alignment*/2, /*boundary*/0,
1544                 /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
1545                 /*highaddr*/BUS_SPACE_MAXADDR,
1546                 /*filter*/NULL, /*filterarg*/NULL,
1547                 /*maxsize*/es->bufsz, /*nsegments*/1, /*maxsegz*/0x3ffff,
1548                 /*flags*/0,
1549                 &es->parent_dmat) != 0) {
1550                 device_printf(dev, "unable to create dma tag\n");
1551                 goto bad;
1552         }
1553
1554         ksnprintf(status, SND_STATUSLEN, "at %s 0x%lx irq %ld %s",
1555                  (es->regtype == SYS_RES_IOPORT)? "io" : "memory",
1556                  rman_get_start(es->reg), rman_get_start(es->irq),PCM_KLDSTRING(snd_es137x));
1557
1558         if (pcm_register(dev, es, numplay, 1))
1559                 goto bad;
1560         for (i = 0; i < numplay; i++)
1561                 pcm_addchan(dev, PCMDIR_PLAY, ct, es);
1562         pcm_addchan(dev, PCMDIR_REC, ct, es);
1563         es_init_sysctls(dev);
1564         pcm_setstatus(dev, status);
1565         es->escfg = ES_SET_GP(es->escfg, 0);
1566         if (numplay == 1) {
1567                 device_printf(dev, "<Playback: DAC%d / Record: ADC>\n",
1568                                                 ES_DAC_FIRST(es->escfg) + 1);
1569         } else if (numplay == 2) {
1570                 device_printf(dev, "<Playback: DAC%d,DAC%d / Record: ADC>\n",
1571                                                 ES_DAC_FIRST(es->escfg) + 1,
1572                                                 ES_DAC_SECOND(es->escfg) + 1);
1573         }
1574         return 0;
1575
1576  bad:
1577         if (es->parent_dmat) bus_dma_tag_destroy(es->parent_dmat);
1578         if (es->ih) bus_teardown_intr(dev, es->irq, es->ih);
1579         if (es->irq) bus_release_resource(dev, SYS_RES_IRQ, es->irqid, es->irq);
1580         if (codec) ac97_destroy(codec);
1581         if (es->reg) bus_release_resource(dev, es->regtype, es->regid, es->reg);
1582         if (es->lock) snd_mtxfree(es->lock);
1583         if (es) kfree(es, M_DEVBUF);
1584         return ENXIO;
1585 }
1586
1587 static int
1588 es_pci_detach(device_t dev)
1589 {
1590         int r;
1591         struct es_info *es;
1592
1593         r = pcm_unregister(dev);
1594         if (r) return r;
1595
1596         es = pcm_getdevinfo(dev);
1597         bus_teardown_intr(dev, es->irq, es->ih);
1598         bus_release_resource(dev, SYS_RES_IRQ, es->irqid, es->irq);
1599         bus_release_resource(dev, es->regtype, es->regid, es->reg);
1600         bus_dma_tag_destroy(es->parent_dmat);
1601         snd_mtxfree(es->lock);
1602         kfree(es, M_DEVBUF);
1603
1604         return 0;
1605 }
1606
1607 static device_method_t es_methods[] = {
1608         /* Device interface */
1609         DEVMETHOD(device_probe,         es_pci_probe),
1610         DEVMETHOD(device_attach,        es_pci_attach),
1611         DEVMETHOD(device_detach,        es_pci_detach),
1612
1613         { 0, 0 }
1614 };
1615
1616 static driver_t es_driver = {
1617         "pcm",
1618         es_methods,
1619         PCM_SOFTC_SIZE,
1620 };
1621
1622 DRIVER_MODULE(snd_es137x, pci, es_driver, pcm_devclass, 0, 0);
1623 MODULE_DEPEND(snd_es137x, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER);
1624 MODULE_VERSION(snd_es137x, 1);