aboutsummaryrefslogtreecommitdiffstats
path: root/sound/oss/ymfpci.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
commit1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch)
tree0bba044c4ce775e45a88a51686b5d9f90697ea9d /sound/oss/ymfpci.c
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
Diffstat (limited to 'sound/oss/ymfpci.c')
-rw-r--r--sound/oss/ymfpci.c2691
1 files changed, 2691 insertions, 0 deletions
diff --git a/sound/oss/ymfpci.c b/sound/oss/ymfpci.c
new file mode 100644
index 000000000000..05203ad523f7
--- /dev/null
+++ b/sound/oss/ymfpci.c
@@ -0,0 +1,2691 @@
1/*
2 * Copyright 1999 Jaroslav Kysela <perex@suse.cz>
3 * Copyright 2000 Alan Cox <alan@redhat.com>
4 * Copyright 2001 Kai Germaschewski <kai@tp1.ruhr-uni-bochum.de>
5 * Copyright 2002 Pete Zaitcev <zaitcev@yahoo.com>
6 *
7 * Yamaha YMF7xx driver.
8 *
9 * This code is a result of high-speed collision
10 * between ymfpci.c of ALSA and cs46xx.c of Linux.
11 * -- Pete Zaitcev <zaitcev@yahoo.com>; 2000/09/18
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 *
27 * TODO:
28 * - Use P44Slot for 44.1 playback (beware of idle buzzing in P44Slot).
29 * - 96KHz playback for DVD - use pitch of 2.0.
30 * - Retain DMA buffer on close, do not wait the end of frame.
31 * - Resolve XXX tagged questions.
32 * - Cannot play 5133Hz.
33 * - 2001/01/07 Consider if we can remove voice_lock, like so:
34 * : Allocate/deallocate voices in open/close under semafore.
35 * : We access voices in interrupt, that only for pcms that open.
36 * voice_lock around playback_prepare closes interrupts for insane duration.
37 * - Revisit the way voice_alloc is done - too confusing, overcomplicated.
38 * Should support various channel types, however.
39 * - Remove prog_dmabuf from read/write, leave it in open.
40 * - 2001/01/07 Replace the OPL3 part of CONFIG_SOUND_YMFPCI_LEGACY code with
41 * native synthesizer through a playback slot.
42 * - 2001/11/29 ac97_save_state
43 * Talk to Kai to remove ac97_save_state before it's too late!
44 * - Second AC97
45 * - Restore S/PDIF - Toshibas have it.
46 *
47 * Kai used pci_alloc_consistent for DMA buffer, which sounds a little
48 * unconventional. However, given how small our fragments can be,
49 * a little uncached access is perhaps better than endless flushing.
50 * On i386 and other I/O-coherent architectures pci_alloc_consistent
51 * is entirely harmless.
52 */
53
54#include <linux/config.h>
55#include <linux/module.h>
56#include <linux/init.h>
57#include <linux/interrupt.h>
58#include <linux/ioport.h>
59#include <linux/delay.h>
60#include <linux/pci.h>
61#include <linux/slab.h>
62#include <linux/poll.h>
63#include <linux/soundcard.h>
64#include <linux/ac97_codec.h>
65#include <linux/sound.h>
66
67#include <asm/io.h>
68#include <asm/dma.h>
69#include <asm/uaccess.h>
70
71#ifdef CONFIG_SOUND_YMFPCI_LEGACY
72# include "sound_config.h"
73# include "mpu401.h"
74#endif
75#include "ymfpci.h"
76
77/*
78 * I do not believe in debug levels as I never can guess what
79 * part of the code is going to be problematic in the future.
80 * Don't forget to run your klogd with -c 8.
81 *
82 * Example (do not remove):
83 * #define YMFDBG(fmt, arg...) do{ printk(KERN_DEBUG fmt, ##arg); }while(0)
84 */
85#define YMFDBGW(fmt, arg...) /* */ /* write counts */
86#define YMFDBGI(fmt, arg...) /* */ /* interrupts */
87#define YMFDBGX(fmt, arg...) /* */ /* ioctl */
88
89static int ymf_playback_trigger(ymfpci_t *unit, struct ymf_pcm *ypcm, int cmd);
90static void ymf_capture_trigger(ymfpci_t *unit, struct ymf_pcm *ypcm, int cmd);
91static void ymfpci_voice_free(ymfpci_t *unit, ymfpci_voice_t *pvoice);
92static int ymf_capture_alloc(struct ymf_unit *unit, int *pbank);
93static int ymf_playback_prepare(struct ymf_state *state);
94static int ymf_capture_prepare(struct ymf_state *state);
95static struct ymf_state *ymf_state_alloc(ymfpci_t *unit);
96
97static void ymfpci_aclink_reset(struct pci_dev * pci);
98static void ymfpci_disable_dsp(ymfpci_t *unit);
99static void ymfpci_download_image(ymfpci_t *codec);
100static void ymf_memload(ymfpci_t *unit);
101
102static DEFINE_SPINLOCK(ymf_devs_lock);
103static LIST_HEAD(ymf_devs);
104
105/*
106 * constants
107 */
108
109static struct pci_device_id ymf_id_tbl[] = {
110#define DEV(v, d, data) \
111 { PCI_VENDOR_ID_##v, PCI_DEVICE_ID_##v##_##d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (unsigned long)data }
112 DEV (YAMAHA, 724, "YMF724"),
113 DEV (YAMAHA, 724F, "YMF724F"),
114 DEV (YAMAHA, 740, "YMF740"),
115 DEV (YAMAHA, 740C, "YMF740C"),
116 DEV (YAMAHA, 744, "YMF744"),
117 DEV (YAMAHA, 754, "YMF754"),
118#undef DEV
119 { }
120};
121MODULE_DEVICE_TABLE(pci, ymf_id_tbl);
122
123/*
124 * common I/O routines
125 */
126
127static inline void ymfpci_writeb(ymfpci_t *codec, u32 offset, u8 val)
128{
129 writeb(val, codec->reg_area_virt + offset);
130}
131
132static inline u16 ymfpci_readw(ymfpci_t *codec, u32 offset)
133{
134 return readw(codec->reg_area_virt + offset);
135}
136
137static inline void ymfpci_writew(ymfpci_t *codec, u32 offset, u16 val)
138{
139 writew(val, codec->reg_area_virt + offset);
140}
141
142static inline u32 ymfpci_readl(ymfpci_t *codec, u32 offset)
143{
144 return readl(codec->reg_area_virt + offset);
145}
146
147static inline void ymfpci_writel(ymfpci_t *codec, u32 offset, u32 val)
148{
149 writel(val, codec->reg_area_virt + offset);
150}
151
152static int ymfpci_codec_ready(ymfpci_t *codec, int secondary, int sched)
153{
154 signed long end_time;
155 u32 reg = secondary ? YDSXGR_SECSTATUSADR : YDSXGR_PRISTATUSADR;
156
157 end_time = jiffies + 3 * (HZ / 4);
158 do {
159 if ((ymfpci_readw(codec, reg) & 0x8000) == 0)
160 return 0;
161 if (sched) {
162 set_current_state(TASK_UNINTERRUPTIBLE);
163 schedule_timeout(1);
164 }
165 } while (end_time - (signed long)jiffies >= 0);
166 printk(KERN_ERR "ymfpci_codec_ready: codec %i is not ready [0x%x]\n",
167 secondary, ymfpci_readw(codec, reg));
168 return -EBUSY;
169}
170
171static void ymfpci_codec_write(struct ac97_codec *dev, u8 reg, u16 val)
172{
173 ymfpci_t *codec = dev->private_data;
174 u32 cmd;
175
176 spin_lock(&codec->ac97_lock);
177 /* XXX Do make use of dev->id */
178 ymfpci_codec_ready(codec, 0, 0);
179 cmd = ((YDSXG_AC97WRITECMD | reg) << 16) | val;
180 ymfpci_writel(codec, YDSXGR_AC97CMDDATA, cmd);
181 spin_unlock(&codec->ac97_lock);
182}
183
184static u16 _ymfpci_codec_read(ymfpci_t *unit, u8 reg)
185{
186 int i;
187
188 if (ymfpci_codec_ready(unit, 0, 0))
189 return ~0;
190 ymfpci_writew(unit, YDSXGR_AC97CMDADR, YDSXG_AC97READCMD | reg);
191 if (ymfpci_codec_ready(unit, 0, 0))
192 return ~0;
193 if (unit->pci->device == PCI_DEVICE_ID_YAMAHA_744 && unit->rev < 2) {
194 for (i = 0; i < 600; i++)
195 ymfpci_readw(unit, YDSXGR_PRISTATUSDATA);
196 }
197 return ymfpci_readw(unit, YDSXGR_PRISTATUSDATA);
198}
199
200static u16 ymfpci_codec_read(struct ac97_codec *dev, u8 reg)
201{
202 ymfpci_t *unit = dev->private_data;
203 u16 ret;
204
205 spin_lock(&unit->ac97_lock);
206 ret = _ymfpci_codec_read(unit, reg);
207 spin_unlock(&unit->ac97_lock);
208
209 return ret;
210}
211
212/*
213 * Misc routines
214 */
215
216/*
217 * Calculate the actual sampling rate relatetively to the base clock (48kHz).
218 */
219static u32 ymfpci_calc_delta(u32 rate)
220{
221 switch (rate) {
222 case 8000: return 0x02aaab00;
223 case 11025: return 0x03accd00;
224 case 16000: return 0x05555500;
225 case 22050: return 0x07599a00;
226 case 32000: return 0x0aaaab00;
227 case 44100: return 0x0eb33300;
228 default: return ((rate << 16) / 48000) << 12;
229 }
230}
231
232static u32 def_rate[8] = {
233 100, 2000, 8000, 11025, 16000, 22050, 32000, 48000
234};
235
236static u32 ymfpci_calc_lpfK(u32 rate)
237{
238 u32 i;
239 static u32 val[8] = {
240 0x00570000, 0x06AA0000, 0x18B20000, 0x20930000,
241 0x2B9A0000, 0x35A10000, 0x3EAA0000, 0x40000000
242 };
243
244 if (rate == 44100)
245 return 0x40000000; /* FIXME: What's the right value? */
246 for (i = 0; i < 8; i++)
247 if (rate <= def_rate[i])
248 return val[i];
249 return val[0];
250}
251
252static u32 ymfpci_calc_lpfQ(u32 rate)
253{
254 u32 i;
255 static u32 val[8] = {
256 0x35280000, 0x34A70000, 0x32020000, 0x31770000,
257 0x31390000, 0x31C90000, 0x33D00000, 0x40000000
258 };
259
260 if (rate == 44100)
261 return 0x370A0000;
262 for (i = 0; i < 8; i++)
263 if (rate <= def_rate[i])
264 return val[i];
265 return val[0];
266}
267
268static u32 ymf_calc_lend(u32 rate)
269{
270 return (rate * YMF_SAMPF) / 48000;
271}
272
273/*
274 * We ever allow only a few formats, but let's be generic, for smaller surprise.
275 */
276static int ymf_pcm_format_width(int format)
277{
278 static int mask16 = AFMT_S16_LE|AFMT_S16_BE|AFMT_U16_LE|AFMT_U16_BE;
279
280 if ((format & (format-1)) != 0) {
281 printk(KERN_ERR "ymfpci: format 0x%x is not a power of 2\n", format);
282 return 8;
283 }
284
285 if (format == AFMT_IMA_ADPCM) return 4;
286 if ((format & mask16) != 0) return 16;
287 return 8;
288}
289
290static void ymf_pcm_update_shift(struct ymf_pcm_format *f)
291{
292 f->shift = 0;
293 if (f->voices == 2)
294 f->shift++;
295 if (ymf_pcm_format_width(f->format) == 16)
296 f->shift++;
297}
298
299/* Are you sure 32K is not too much? See if mpg123 skips on loaded systems. */
300#define DMABUF_DEFAULTORDER (15-PAGE_SHIFT)
301#define DMABUF_MINORDER 1
302
303/*
304 * Allocate DMA buffer
305 */
306static int alloc_dmabuf(ymfpci_t *unit, struct ymf_dmabuf *dmabuf)
307{
308 void *rawbuf = NULL;
309 dma_addr_t dma_addr;
310 int order;
311 struct page *map, *mapend;
312
313 /* alloc as big a chunk as we can */
314 for (order = DMABUF_DEFAULTORDER; order >= DMABUF_MINORDER; order--) {
315 rawbuf = pci_alloc_consistent(unit->pci, PAGE_SIZE << order, &dma_addr);
316 if (rawbuf)
317 break;
318 }
319 if (!rawbuf)
320 return -ENOMEM;
321
322#if 0
323 printk(KERN_DEBUG "ymfpci: allocated %ld (order = %d) bytes at %p\n",
324 PAGE_SIZE << order, order, rawbuf);
325#endif
326
327 dmabuf->ready = dmabuf->mapped = 0;
328 dmabuf->rawbuf = rawbuf;
329 dmabuf->dma_addr = dma_addr;
330 dmabuf->buforder = order;
331
332 /* now mark the pages as reserved; otherwise remap_pfn_range doesn't do what we want */
333 mapend = virt_to_page(rawbuf + (PAGE_SIZE << order) - 1);
334 for (map = virt_to_page(rawbuf); map <= mapend; map++)
335 set_bit(PG_reserved, &map->flags);
336
337 return 0;
338}
339
340/*
341 * Free DMA buffer
342 */
343static void dealloc_dmabuf(ymfpci_t *unit, struct ymf_dmabuf *dmabuf)
344{
345 struct page *map, *mapend;
346
347 if (dmabuf->rawbuf) {
348 /* undo marking the pages as reserved */
349 mapend = virt_to_page(dmabuf->rawbuf + (PAGE_SIZE << dmabuf->buforder) - 1);
350 for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
351 clear_bit(PG_reserved, &map->flags);
352
353 pci_free_consistent(unit->pci, PAGE_SIZE << dmabuf->buforder,
354 dmabuf->rawbuf, dmabuf->dma_addr);
355 }
356 dmabuf->rawbuf = NULL;
357 dmabuf->mapped = dmabuf->ready = 0;
358}
359
360static int prog_dmabuf(struct ymf_state *state, int rec)
361{
362 struct ymf_dmabuf *dmabuf;
363 int w_16;
364 unsigned bufsize;
365 unsigned long flags;
366 int redzone, redfrags;
367 int ret;
368
369 w_16 = ymf_pcm_format_width(state->format.format) == 16;
370 dmabuf = rec ? &state->rpcm.dmabuf : &state->wpcm.dmabuf;
371
372 spin_lock_irqsave(&state->unit->reg_lock, flags);
373 dmabuf->hwptr = dmabuf->swptr = 0;
374 dmabuf->total_bytes = 0;
375 dmabuf->count = 0;
376 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
377
378 /* allocate DMA buffer if not allocated yet */
379 if (!dmabuf->rawbuf)
380 if ((ret = alloc_dmabuf(state->unit, dmabuf)))
381 return ret;
382
383 /*
384 * Create fake fragment sizes and numbers for OSS ioctls.
385 * Import what Doom might have set with SNDCTL_DSP_SETFRAGMENT.
386 */
387 bufsize = PAGE_SIZE << dmabuf->buforder;
388 /* By default we give 4 big buffers. */
389 dmabuf->fragshift = (dmabuf->buforder + PAGE_SHIFT - 2);
390 if (dmabuf->ossfragshift > 3 &&
391 dmabuf->ossfragshift < dmabuf->fragshift) {
392 /* If OSS set smaller fragments, give more smaller buffers. */
393 dmabuf->fragshift = dmabuf->ossfragshift;
394 }
395 dmabuf->fragsize = 1 << dmabuf->fragshift;
396
397 dmabuf->numfrag = bufsize >> dmabuf->fragshift;
398 dmabuf->dmasize = dmabuf->numfrag << dmabuf->fragshift;
399
400 if (dmabuf->ossmaxfrags >= 2) {
401 redzone = ymf_calc_lend(state->format.rate);
402 redzone <<= state->format.shift;
403 redzone *= 3;
404 redfrags = (redzone + dmabuf->fragsize-1) >> dmabuf->fragshift;
405
406 if (dmabuf->ossmaxfrags + redfrags < dmabuf->numfrag) {
407 dmabuf->numfrag = dmabuf->ossmaxfrags + redfrags;
408 dmabuf->dmasize = dmabuf->numfrag << dmabuf->fragshift;
409 }
410 }
411
412 memset(dmabuf->rawbuf, w_16 ? 0 : 0x80, dmabuf->dmasize);
413
414 /*
415 * Now set up the ring
416 */
417
418 /* XXX ret = rec? cap_pre(): pbk_pre(); */
419 spin_lock_irqsave(&state->unit->voice_lock, flags);
420 if (rec) {
421 if ((ret = ymf_capture_prepare(state)) != 0) {
422 spin_unlock_irqrestore(&state->unit->voice_lock, flags);
423 return ret;
424 }
425 } else {
426 if ((ret = ymf_playback_prepare(state)) != 0) {
427 spin_unlock_irqrestore(&state->unit->voice_lock, flags);
428 return ret;
429 }
430 }
431 spin_unlock_irqrestore(&state->unit->voice_lock, flags);
432
433 /* set the ready flag for the dma buffer (this comment is not stupid) */
434 dmabuf->ready = 1;
435
436#if 0
437 printk(KERN_DEBUG "prog_dmabuf: rate %d format 0x%x,"
438 " numfrag %d fragsize %d dmasize %d\n",
439 state->format.rate, state->format.format, dmabuf->numfrag,
440 dmabuf->fragsize, dmabuf->dmasize);
441#endif
442
443 return 0;
444}
445
446static void ymf_start_dac(struct ymf_state *state)
447{
448 ymf_playback_trigger(state->unit, &state->wpcm, 1);
449}
450
451// static void ymf_start_adc(struct ymf_state *state)
452// {
453// ymf_capture_trigger(state->unit, &state->rpcm, 1);
454// }
455
456/*
457 * Wait until output is drained.
458 * This does not kill the hardware for the sake of ioctls.
459 */
460static void ymf_wait_dac(struct ymf_state *state)
461{
462 struct ymf_unit *unit = state->unit;
463 struct ymf_pcm *ypcm = &state->wpcm;
464 DECLARE_WAITQUEUE(waita, current);
465 unsigned long flags;
466
467 add_wait_queue(&ypcm->dmabuf.wait, &waita);
468
469 spin_lock_irqsave(&unit->reg_lock, flags);
470 if (ypcm->dmabuf.count != 0 && !ypcm->running) {
471 ymf_playback_trigger(unit, ypcm, 1);
472 }
473
474#if 0
475 if (file->f_flags & O_NONBLOCK) {
476 /*
477 * XXX Our mistake is to attach DMA buffer to state
478 * rather than to some per-device structure.
479 * Cannot skip waiting, can only make it shorter.
480 */
481 }
482#endif
483
484 set_current_state(TASK_UNINTERRUPTIBLE);
485 while (ypcm->running) {
486 spin_unlock_irqrestore(&unit->reg_lock, flags);
487 schedule();
488 spin_lock_irqsave(&unit->reg_lock, flags);
489 set_current_state(TASK_UNINTERRUPTIBLE);
490 }
491 spin_unlock_irqrestore(&unit->reg_lock, flags);
492
493 set_current_state(TASK_RUNNING);
494 remove_wait_queue(&ypcm->dmabuf.wait, &waita);
495
496 /*
497 * This function may take up to 4 seconds to reach this point
498 * (32K circular buffer, 8000 Hz). User notices.
499 */
500}
501
502/* Can just stop, without wait. Or can we? */
503static void ymf_stop_adc(struct ymf_state *state)
504{
505 struct ymf_unit *unit = state->unit;
506 unsigned long flags;
507
508 spin_lock_irqsave(&unit->reg_lock, flags);
509 ymf_capture_trigger(unit, &state->rpcm, 0);
510 spin_unlock_irqrestore(&unit->reg_lock, flags);
511}
512
513/*
514 * Hardware start management
515 */
516
517static void ymfpci_hw_start(ymfpci_t *unit)
518{
519 unsigned long flags;
520
521 spin_lock_irqsave(&unit->reg_lock, flags);
522 if (unit->start_count++ == 0) {
523 ymfpci_writel(unit, YDSXGR_MODE,
524 ymfpci_readl(unit, YDSXGR_MODE) | 3);
525 unit->active_bank = ymfpci_readl(unit, YDSXGR_CTRLSELECT) & 1;
526 }
527 spin_unlock_irqrestore(&unit->reg_lock, flags);
528}
529
530static void ymfpci_hw_stop(ymfpci_t *unit)
531{
532 unsigned long flags;
533 long timeout = 1000;
534
535 spin_lock_irqsave(&unit->reg_lock, flags);
536 if (--unit->start_count == 0) {
537 ymfpci_writel(unit, YDSXGR_MODE,
538 ymfpci_readl(unit, YDSXGR_MODE) & ~3);
539 while (timeout-- > 0) {
540 if ((ymfpci_readl(unit, YDSXGR_STATUS) & 2) == 0)
541 break;
542 }
543 }
544 spin_unlock_irqrestore(&unit->reg_lock, flags);
545}
546
547/*
548 * Playback voice management
549 */
550
551static int voice_alloc(ymfpci_t *codec, ymfpci_voice_type_t type, int pair, ymfpci_voice_t *rvoice[])
552{
553 ymfpci_voice_t *voice, *voice2;
554 int idx;
555
556 for (idx = 0; idx < YDSXG_PLAYBACK_VOICES; idx += pair ? 2 : 1) {
557 voice = &codec->voices[idx];
558 voice2 = pair ? &codec->voices[idx+1] : NULL;
559 if (voice->use || (voice2 && voice2->use))
560 continue;
561 voice->use = 1;
562 if (voice2)
563 voice2->use = 1;
564 switch (type) {
565 case YMFPCI_PCM:
566 voice->pcm = 1;
567 if (voice2)
568 voice2->pcm = 1;
569 break;
570 case YMFPCI_SYNTH:
571 voice->synth = 1;
572 break;
573 case YMFPCI_MIDI:
574 voice->midi = 1;
575 break;
576 }
577 ymfpci_hw_start(codec);
578 rvoice[0] = voice;
579 if (voice2) {
580 ymfpci_hw_start(codec);
581 rvoice[1] = voice2;
582 }
583 return 0;
584 }
585 return -EBUSY; /* Your audio channel is open by someone else. */
586}
587
588static void ymfpci_voice_free(ymfpci_t *unit, ymfpci_voice_t *pvoice)
589{
590 ymfpci_hw_stop(unit);
591 pvoice->use = pvoice->pcm = pvoice->synth = pvoice->midi = 0;
592 pvoice->ypcm = NULL;
593}
594
595/*
596 */
597
598static void ymf_pcm_interrupt(ymfpci_t *codec, ymfpci_voice_t *voice)
599{
600 struct ymf_pcm *ypcm;
601 int redzone;
602 int pos, delta, swptr;
603 int played, distance;
604 struct ymf_state *state;
605 struct ymf_dmabuf *dmabuf;
606 char silence;
607
608 if ((ypcm = voice->ypcm) == NULL) {
609 return;
610 }
611 if ((state = ypcm->state) == NULL) {
612 ypcm->running = 0; // lock it
613 return;
614 }
615 dmabuf = &ypcm->dmabuf;
616 spin_lock(&codec->reg_lock);
617 if (ypcm->running) {
618 YMFDBGI("ymfpci: %d, intr bank %d count %d start 0x%x:%x\n",
619 voice->number, codec->active_bank, dmabuf->count,
620 le32_to_cpu(voice->bank[0].start),
621 le32_to_cpu(voice->bank[1].start));
622 silence = (ymf_pcm_format_width(state->format.format) == 16) ?
623 0 : 0x80;
624 /* We need actual left-hand-side redzone size here. */
625 redzone = ymf_calc_lend(state->format.rate);
626 redzone <<= (state->format.shift + 1);
627 swptr = dmabuf->swptr;
628
629 pos = le32_to_cpu(voice->bank[codec->active_bank].start);
630 pos <<= state->format.shift;
631 if (pos < 0 || pos >= dmabuf->dmasize) { /* ucode bug */
632 printk(KERN_ERR "ymfpci%d: runaway voice %d: hwptr %d=>%d dmasize %d\n",
633 codec->dev_audio, voice->number,
634 dmabuf->hwptr, pos, dmabuf->dmasize);
635 pos = 0;
636 }
637 if (pos < dmabuf->hwptr) {
638 delta = dmabuf->dmasize - dmabuf->hwptr;
639 memset(dmabuf->rawbuf + dmabuf->hwptr, silence, delta);
640 delta += pos;
641 memset(dmabuf->rawbuf, silence, pos);
642 } else {
643 delta = pos - dmabuf->hwptr;
644 memset(dmabuf->rawbuf + dmabuf->hwptr, silence, delta);
645 }
646 dmabuf->hwptr = pos;
647
648 if (dmabuf->count == 0) {
649 printk(KERN_ERR "ymfpci%d: %d: strain: hwptr %d\n",
650 codec->dev_audio, voice->number, dmabuf->hwptr);
651 ymf_playback_trigger(codec, ypcm, 0);
652 }
653
654 if (swptr <= pos) {
655 distance = pos - swptr;
656 } else {
657 distance = dmabuf->dmasize - (swptr - pos);
658 }
659 if (distance < redzone) {
660 /*
661 * hwptr inside redzone => DMA ran out of samples.
662 */
663 if (delta < dmabuf->count) {
664 /*
665 * Lost interrupt or other screwage.
666 */
667 printk(KERN_ERR "ymfpci%d: %d: lost: delta %d"
668 " hwptr %d swptr %d distance %d count %d\n",
669 codec->dev_audio, voice->number, delta,
670 dmabuf->hwptr, swptr, distance, dmabuf->count);
671 } else {
672 /*
673 * Normal end of DMA.
674 */
675 YMFDBGI("ymfpci%d: %d: done: delta %d"
676 " hwptr %d swptr %d distance %d count %d\n",
677 codec->dev_audio, voice->number, delta,
678 dmabuf->hwptr, swptr, distance, dmabuf->count);
679 }
680 played = dmabuf->count;
681 if (ypcm->running) {
682 ymf_playback_trigger(codec, ypcm, 0);
683 }
684 } else {
685 /*
686 * hwptr is chipping away towards a remote swptr.
687 * Calculate other distance and apply it to count.
688 */
689 if (swptr >= pos) {
690 distance = swptr - pos;
691 } else {
692 distance = dmabuf->dmasize - (pos - swptr);
693 }
694 if (distance < dmabuf->count) {
695 played = dmabuf->count - distance;
696 } else {
697 played = 0;
698 }
699 }
700
701 dmabuf->total_bytes += played;
702 dmabuf->count -= played;
703 if (dmabuf->count < dmabuf->dmasize / 2) {
704 wake_up(&dmabuf->wait);
705 }
706 }
707 spin_unlock(&codec->reg_lock);
708}
709
710static void ymf_cap_interrupt(ymfpci_t *unit, struct ymf_capture *cap)
711{
712 struct ymf_pcm *ypcm;
713 int redzone;
714 struct ymf_state *state;
715 struct ymf_dmabuf *dmabuf;
716 int pos, delta;
717 int cnt;
718
719 if ((ypcm = cap->ypcm) == NULL) {
720 return;
721 }
722 if ((state = ypcm->state) == NULL) {
723 ypcm->running = 0; // lock it
724 return;
725 }
726 dmabuf = &ypcm->dmabuf;
727 spin_lock(&unit->reg_lock);
728 if (ypcm->running) {
729 redzone = ymf_calc_lend(state->format.rate);
730 redzone <<= (state->format.shift + 1);
731
732 pos = le32_to_cpu(cap->bank[unit->active_bank].start);
733 // pos <<= state->format.shift;
734 if (pos < 0 || pos >= dmabuf->dmasize) { /* ucode bug */
735 printk(KERN_ERR "ymfpci%d: runaway capture %d: hwptr %d=>%d dmasize %d\n",
736 unit->dev_audio, ypcm->capture_bank_number,
737 dmabuf->hwptr, pos, dmabuf->dmasize);
738 pos = 0;
739 }
740 if (pos < dmabuf->hwptr) {
741 delta = dmabuf->dmasize - dmabuf->hwptr;
742 delta += pos;
743 } else {
744 delta = pos - dmabuf->hwptr;
745 }
746 dmabuf->hwptr = pos;
747
748 cnt = dmabuf->count;
749 cnt += delta;
750 if (cnt + redzone > dmabuf->dmasize) {
751 /* Overflow - bump swptr */
752 dmabuf->count = dmabuf->dmasize - redzone;
753 dmabuf->swptr = dmabuf->hwptr + redzone;
754 if (dmabuf->swptr >= dmabuf->dmasize) {
755 dmabuf->swptr -= dmabuf->dmasize;
756 }
757 } else {
758 dmabuf->count = cnt;
759 }
760
761 dmabuf->total_bytes += delta;
762 if (dmabuf->count) { /* && is_sleeping XXX */
763 wake_up(&dmabuf->wait);
764 }
765 }
766 spin_unlock(&unit->reg_lock);
767}
768
769static int ymf_playback_trigger(ymfpci_t *codec, struct ymf_pcm *ypcm, int cmd)
770{
771
772 if (ypcm->voices[0] == NULL) {
773 return -EINVAL;
774 }
775 if (cmd != 0) {
776 codec->ctrl_playback[ypcm->voices[0]->number + 1] =
777 cpu_to_le32(ypcm->voices[0]->bank_ba);
778 if (ypcm->voices[1] != NULL)
779 codec->ctrl_playback[ypcm->voices[1]->number + 1] =
780 cpu_to_le32(ypcm->voices[1]->bank_ba);
781 ypcm->running = 1;
782 } else {
783 codec->ctrl_playback[ypcm->voices[0]->number + 1] = 0;
784 if (ypcm->voices[1] != NULL)
785 codec->ctrl_playback[ypcm->voices[1]->number + 1] = 0;
786 ypcm->running = 0;
787 }
788 return 0;
789}
790
791static void ymf_capture_trigger(ymfpci_t *codec, struct ymf_pcm *ypcm, int cmd)
792{
793 u32 tmp;
794
795 if (cmd != 0) {
796 tmp = ymfpci_readl(codec, YDSXGR_MAPOFREC) | (1 << ypcm->capture_bank_number);
797 ymfpci_writel(codec, YDSXGR_MAPOFREC, tmp);
798 ypcm->running = 1;
799 } else {
800 tmp = ymfpci_readl(codec, YDSXGR_MAPOFREC) & ~(1 << ypcm->capture_bank_number);
801 ymfpci_writel(codec, YDSXGR_MAPOFREC, tmp);
802 ypcm->running = 0;
803 }
804}
805
806static int ymfpci_pcm_voice_alloc(struct ymf_pcm *ypcm, int voices)
807{
808 struct ymf_unit *unit;
809 int err;
810
811 unit = ypcm->state->unit;
812 if (ypcm->voices[1] != NULL && voices < 2) {
813 ymfpci_voice_free(unit, ypcm->voices[1]);
814 ypcm->voices[1] = NULL;
815 }
816 if (voices == 1 && ypcm->voices[0] != NULL)
817 return 0; /* already allocated */
818 if (voices == 2 && ypcm->voices[0] != NULL && ypcm->voices[1] != NULL)
819 return 0; /* already allocated */
820 if (voices > 1) {
821 if (ypcm->voices[0] != NULL && ypcm->voices[1] == NULL) {
822 ymfpci_voice_free(unit, ypcm->voices[0]);
823 ypcm->voices[0] = NULL;
824 }
825 if ((err = voice_alloc(unit, YMFPCI_PCM, 1, ypcm->voices)) < 0)
826 return err;
827 ypcm->voices[0]->ypcm = ypcm;
828 ypcm->voices[1]->ypcm = ypcm;
829 } else {
830 if ((err = voice_alloc(unit, YMFPCI_PCM, 0, ypcm->voices)) < 0)
831 return err;
832 ypcm->voices[0]->ypcm = ypcm;
833 }
834 return 0;
835}
836
837static void ymf_pcm_init_voice(ymfpci_voice_t *voice, int stereo,
838 int rate, int w_16, unsigned long addr, unsigned int end, int spdif)
839{
840 u32 format;
841 u32 delta = ymfpci_calc_delta(rate);
842 u32 lpfQ = ymfpci_calc_lpfQ(rate);
843 u32 lpfK = ymfpci_calc_lpfK(rate);
844 ymfpci_playback_bank_t *bank;
845 int nbank;
846
847 /*
848 * The gain is a floating point number. According to the manual,
849 * bit 31 indicates a sign bit, bit 30 indicates an integer part,
850 * and bits [29:15] indicate a decimal fraction part. Thus,
851 * for a gain of 1.0 the constant of 0x40000000 is loaded.
852 */
853 unsigned default_gain = cpu_to_le32(0x40000000);
854
855 format = (stereo ? 0x00010000 : 0) | (w_16 ? 0 : 0x80000000);
856 if (stereo)
857 end >>= 1;
858 if (w_16)
859 end >>= 1;
860 for (nbank = 0; nbank < 2; nbank++) {
861 bank = &voice->bank[nbank];
862 bank->format = cpu_to_le32(format);
863 bank->loop_default = 0; /* 0-loops forever, otherwise count */
864 bank->base = cpu_to_le32(addr);
865 bank->loop_start = 0;
866 bank->loop_end = cpu_to_le32(end);
867 bank->loop_frac = 0;
868 bank->eg_gain_end = default_gain;
869 bank->lpfQ = cpu_to_le32(lpfQ);
870 bank->status = 0;
871 bank->num_of_frames = 0;
872 bank->loop_count = 0;
873 bank->start = 0;
874 bank->start_frac = 0;
875 bank->delta =
876 bank->delta_end = cpu_to_le32(delta);
877 bank->lpfK =
878 bank->lpfK_end = cpu_to_le32(lpfK);
879 bank->eg_gain = default_gain;
880 bank->lpfD1 =
881 bank->lpfD2 = 0;
882
883 bank->left_gain =
884 bank->right_gain =
885 bank->left_gain_end =
886 bank->right_gain_end =
887 bank->eff1_gain =
888 bank->eff2_gain =
889 bank->eff3_gain =
890 bank->eff1_gain_end =
891 bank->eff2_gain_end =
892 bank->eff3_gain_end = 0;
893
894 if (!stereo) {
895 if (!spdif) {
896 bank->left_gain =
897 bank->right_gain =
898 bank->left_gain_end =
899 bank->right_gain_end = default_gain;
900 } else {
901 bank->eff2_gain =
902 bank->eff2_gain_end =
903 bank->eff3_gain =
904 bank->eff3_gain_end = default_gain;
905 }
906 } else {
907 if (!spdif) {
908 if ((voice->number & 1) == 0) {
909 bank->left_gain =
910 bank->left_gain_end = default_gain;
911 } else {
912 bank->format |= cpu_to_le32(1);
913 bank->right_gain =
914 bank->right_gain_end = default_gain;
915 }
916 } else {
917 if ((voice->number & 1) == 0) {
918 bank->eff2_gain =
919 bank->eff2_gain_end = default_gain;
920 } else {
921 bank->format |= cpu_to_le32(1);
922 bank->eff3_gain =
923 bank->eff3_gain_end = default_gain;
924 }
925 }
926 }
927 }
928}
929
930/*
931 * XXX Capture channel allocation is entirely fake at the moment.
932 * We use only one channel and mark it busy as required.
933 */
934static int ymf_capture_alloc(struct ymf_unit *unit, int *pbank)
935{
936 struct ymf_capture *cap;
937 int cbank;
938
939 cbank = 1; /* Only ADC slot is used for now. */
940 cap = &unit->capture[cbank];
941 if (cap->use)
942 return -EBUSY;
943 cap->use = 1;
944 *pbank = cbank;
945 return 0;
946}
947
948static int ymf_playback_prepare(struct ymf_state *state)
949{
950 struct ymf_pcm *ypcm = &state->wpcm;
951 int err, nvoice;
952
953 if ((err = ymfpci_pcm_voice_alloc(ypcm, state->format.voices)) < 0) {
954 /* Somebody started 32 mpg123's in parallel? */
955 printk(KERN_INFO "ymfpci%d: cannot allocate voice\n",
956 state->unit->dev_audio);
957 return err;
958 }
959
960 for (nvoice = 0; nvoice < state->format.voices; nvoice++) {
961 ymf_pcm_init_voice(ypcm->voices[nvoice],
962 state->format.voices == 2, state->format.rate,
963 ymf_pcm_format_width(state->format.format) == 16,
964 ypcm->dmabuf.dma_addr, ypcm->dmabuf.dmasize,
965 ypcm->spdif);
966 }
967 return 0;
968}
969
970static int ymf_capture_prepare(struct ymf_state *state)
971{
972 ymfpci_t *unit = state->unit;
973 struct ymf_pcm *ypcm = &state->rpcm;
974 ymfpci_capture_bank_t * bank;
975 /* XXX This is confusing, gotta rename one of them banks... */
976 int nbank; /* flip-flop bank */
977 int cbank; /* input [super-]bank */
978 struct ymf_capture *cap;
979 u32 rate, format;
980
981 if (ypcm->capture_bank_number == -1) {
982 if (ymf_capture_alloc(unit, &cbank) != 0)
983 return -EBUSY;
984
985 ypcm->capture_bank_number = cbank;
986
987 cap = &unit->capture[cbank];
988 cap->bank = unit->bank_capture[cbank][0];
989 cap->ypcm = ypcm;
990 ymfpci_hw_start(unit);
991 }
992
993 // ypcm->frag_size = snd_pcm_lib_transfer_fragment(substream);
994 // frag_size is replaced with nonfragged byte-aligned rolling buffer
995 rate = ((48000 * 4096) / state->format.rate) - 1;
996 format = 0;
997 if (state->format.voices == 2)
998 format |= 2;
999 if (ymf_pcm_format_width(state->format.format) == 8)
1000 format |= 1;
1001 switch (ypcm->capture_bank_number) {
1002 case 0:
1003 ymfpci_writel(unit, YDSXGR_RECFORMAT, format);
1004 ymfpci_writel(unit, YDSXGR_RECSLOTSR, rate);
1005 break;
1006 case 1:
1007 ymfpci_writel(unit, YDSXGR_ADCFORMAT, format);
1008 ymfpci_writel(unit, YDSXGR_ADCSLOTSR, rate);
1009 break;
1010 }
1011 for (nbank = 0; nbank < 2; nbank++) {
1012 bank = unit->bank_capture[ypcm->capture_bank_number][nbank];
1013 bank->base = cpu_to_le32(ypcm->dmabuf.dma_addr);
1014 // bank->loop_end = ypcm->dmabuf.dmasize >> state->format.shift;
1015 bank->loop_end = cpu_to_le32(ypcm->dmabuf.dmasize);
1016 bank->start = 0;
1017 bank->num_of_loops = 0;
1018 }
1019#if 0 /* s/pdif */
1020 if (state->digital.dig_valid)
1021 /*state->digital.type == SND_PCM_DIG_AES_IEC958*/
1022 ymfpci_writew(codec, YDSXGR_SPDIFOUTSTATUS,
1023 state->digital.dig_status[0] | (state->digital.dig_status[1] << 8));
1024#endif
1025 return 0;
1026}
1027
1028static irqreturn_t ymf_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1029{
1030 ymfpci_t *codec = dev_id;
1031 u32 status, nvoice, mode;
1032 struct ymf_voice *voice;
1033 struct ymf_capture *cap;
1034
1035 status = ymfpci_readl(codec, YDSXGR_STATUS);
1036 if (status & 0x80000000) {
1037 codec->active_bank = ymfpci_readl(codec, YDSXGR_CTRLSELECT) & 1;
1038 spin_lock(&codec->voice_lock);
1039 for (nvoice = 0; nvoice < YDSXG_PLAYBACK_VOICES; nvoice++) {
1040 voice = &codec->voices[nvoice];
1041 if (voice->use)
1042 ymf_pcm_interrupt(codec, voice);
1043 }
1044 for (nvoice = 0; nvoice < YDSXG_CAPTURE_VOICES; nvoice++) {
1045 cap = &codec->capture[nvoice];
1046 if (cap->use)
1047 ymf_cap_interrupt(codec, cap);
1048 }
1049 spin_unlock(&codec->voice_lock);
1050 spin_lock(&codec->reg_lock);
1051 ymfpci_writel(codec, YDSXGR_STATUS, 0x80000000);
1052 mode = ymfpci_readl(codec, YDSXGR_MODE) | 2;
1053 ymfpci_writel(codec, YDSXGR_MODE, mode);
1054 spin_unlock(&codec->reg_lock);
1055 }
1056
1057 status = ymfpci_readl(codec, YDSXGR_INTFLAG);
1058 if (status & 1) {
1059 /* timer handler */
1060 ymfpci_writel(codec, YDSXGR_INTFLAG, ~0);
1061 }
1062 return IRQ_HANDLED;
1063}
1064
1065static void ymf_pcm_free_substream(struct ymf_pcm *ypcm)
1066{
1067 unsigned long flags;
1068 struct ymf_unit *unit;
1069
1070 unit = ypcm->state->unit;
1071
1072 if (ypcm->type == PLAYBACK_VOICE) {
1073 spin_lock_irqsave(&unit->voice_lock, flags);
1074 if (ypcm->voices[1])
1075 ymfpci_voice_free(unit, ypcm->voices[1]);
1076 if (ypcm->voices[0])
1077 ymfpci_voice_free(unit, ypcm->voices[0]);
1078 spin_unlock_irqrestore(&unit->voice_lock, flags);
1079 } else {
1080 if (ypcm->capture_bank_number != -1) {
1081 unit->capture[ypcm->capture_bank_number].use = 0;
1082 ypcm->capture_bank_number = -1;
1083 ymfpci_hw_stop(unit);
1084 }
1085 }
1086}
1087
1088static struct ymf_state *ymf_state_alloc(ymfpci_t *unit)
1089{
1090 struct ymf_pcm *ypcm;
1091 struct ymf_state *state;
1092
1093 if ((state = kmalloc(sizeof(struct ymf_state), GFP_KERNEL)) == NULL) {
1094 goto out0;
1095 }
1096 memset(state, 0, sizeof(struct ymf_state));
1097
1098 ypcm = &state->wpcm;
1099 ypcm->state = state;
1100 ypcm->type = PLAYBACK_VOICE;
1101 ypcm->capture_bank_number = -1;
1102 init_waitqueue_head(&ypcm->dmabuf.wait);
1103
1104 ypcm = &state->rpcm;
1105 ypcm->state = state;
1106 ypcm->type = CAPTURE_AC97;
1107 ypcm->capture_bank_number = -1;
1108 init_waitqueue_head(&ypcm->dmabuf.wait);
1109
1110 state->unit = unit;
1111
1112 state->format.format = AFMT_U8;
1113 state->format.rate = 8000;
1114 state->format.voices = 1;
1115 ymf_pcm_update_shift(&state->format);
1116
1117 return state;
1118
1119out0:
1120 return NULL;
1121}
1122
1123/* AES/IEC958 channel status bits */
1124#define SND_PCM_AES0_PROFESSIONAL (1<<0) /* 0 = consumer, 1 = professional */
1125#define SND_PCM_AES0_NONAUDIO (1<<1) /* 0 = audio, 1 = non-audio */
1126#define SND_PCM_AES0_PRO_EMPHASIS (7<<2) /* mask - emphasis */
1127#define SND_PCM_AES0_PRO_EMPHASIS_NOTID (0<<2) /* emphasis not indicated */
1128#define SND_PCM_AES0_PRO_EMPHASIS_NONE (1<<2) /* none emphasis */
1129#define SND_PCM_AES0_PRO_EMPHASIS_5015 (3<<2) /* 50/15us emphasis */
1130#define SND_PCM_AES0_PRO_EMPHASIS_CCITT (7<<2) /* CCITT J.17 emphasis */
1131#define SND_PCM_AES0_PRO_FREQ_UNLOCKED (1<<5) /* source sample frequency: 0 = locked, 1 = unlocked */
1132#define SND_PCM_AES0_PRO_FS (3<<6) /* mask - sample frequency */
1133#define SND_PCM_AES0_PRO_FS_NOTID (0<<6) /* fs not indicated */
1134#define SND_PCM_AES0_PRO_FS_44100 (1<<6) /* 44.1kHz */
1135#define SND_PCM_AES0_PRO_FS_48000 (2<<6) /* 48kHz */
1136#define SND_PCM_AES0_PRO_FS_32000 (3<<6) /* 32kHz */
1137#define SND_PCM_AES0_CON_NOT_COPYRIGHT (1<<2) /* 0 = copyright, 1 = not copyright */
1138#define SND_PCM_AES0_CON_EMPHASIS (7<<3) /* mask - emphasis */
1139#define SND_PCM_AES0_CON_EMPHASIS_NONE (0<<3) /* none emphasis */
1140#define SND_PCM_AES0_CON_EMPHASIS_5015 (1<<3) /* 50/15us emphasis */
1141#define SND_PCM_AES0_CON_MODE (3<<6) /* mask - mode */
1142#define SND_PCM_AES1_PRO_MODE (15<<0) /* mask - channel mode */
1143#define SND_PCM_AES1_PRO_MODE_NOTID (0<<0) /* not indicated */
1144#define SND_PCM_AES1_PRO_MODE_STEREOPHONIC (2<<0) /* stereophonic - ch A is left */
1145#define SND_PCM_AES1_PRO_MODE_SINGLE (4<<0) /* single channel */
1146#define SND_PCM_AES1_PRO_MODE_TWO (8<<0) /* two channels */
1147#define SND_PCM_AES1_PRO_MODE_PRIMARY (12<<0) /* primary/secondary */
1148#define SND_PCM_AES1_PRO_MODE_BYTE3 (15<<0) /* vector to byte 3 */
1149#define SND_PCM_AES1_PRO_USERBITS (15<<4) /* mask - user bits */
1150#define SND_PCM_AES1_PRO_USERBITS_NOTID (0<<4) /* not indicated */
1151#define SND_PCM_AES1_PRO_USERBITS_192 (8<<4) /* 192-bit structure */
1152#define SND_PCM_AES1_PRO_USERBITS_UDEF (12<<4) /* user defined application */
1153#define SND_PCM_AES1_CON_CATEGORY 0x7f
1154#define SND_PCM_AES1_CON_GENERAL 0x00
1155#define SND_PCM_AES1_CON_EXPERIMENTAL 0x40
1156#define SND_PCM_AES1_CON_SOLIDMEM_MASK 0x0f
1157#define SND_PCM_AES1_CON_SOLIDMEM_ID 0x08
1158#define SND_PCM_AES1_CON_BROADCAST1_MASK 0x07
1159#define SND_PCM_AES1_CON_BROADCAST1_ID 0x04
1160#define SND_PCM_AES1_CON_DIGDIGCONV_MASK 0x07
1161#define SND_PCM_AES1_CON_DIGDIGCONV_ID 0x02
1162#define SND_PCM_AES1_CON_ADC_COPYRIGHT_MASK 0x1f
1163#define SND_PCM_AES1_CON_ADC_COPYRIGHT_ID 0x06
1164#define SND_PCM_AES1_CON_ADC_MASK 0x1f
1165#define SND_PCM_AES1_CON_ADC_ID 0x16
1166#define SND_PCM_AES1_CON_BROADCAST2_MASK 0x0f
1167#define SND_PCM_AES1_CON_BROADCAST2_ID 0x0e
1168#define SND_PCM_AES1_CON_LASEROPT_MASK 0x07
1169#define SND_PCM_AES1_CON_LASEROPT_ID 0x01
1170#define SND_PCM_AES1_CON_MUSICAL_MASK 0x07
1171#define SND_PCM_AES1_CON_MUSICAL_ID 0x05
1172#define SND_PCM_AES1_CON_MAGNETIC_MASK 0x07
1173#define SND_PCM_AES1_CON_MAGNETIC_ID 0x03
1174#define SND_PCM_AES1_CON_IEC908_CD (SND_PCM_AES1_CON_LASEROPT_ID|0x00)
1175#define SND_PCM_AES1_CON_NON_IEC908_CD (SND_PCM_AES1_CON_LASEROPT_ID|0x08)
1176#define SND_PCM_AES1_CON_PCM_CODER (SND_PCM_AES1_CON_DIGDIGCONV_ID|0x00)
1177#define SND_PCM_AES1_CON_SAMPLER (SND_PCM_AES1_CON_DIGDIGCONV_ID|0x20)
1178#define SND_PCM_AES1_CON_MIXER (SND_PCM_AES1_CON_DIGDIGCONV_ID|0x10)
1179#define SND_PCM_AES1_CON_RATE_CONVERTER (SND_PCM_AES1_CON_DIGDIGCONV_ID|0x18)
1180#define SND_PCM_AES1_CON_SYNTHESIZER (SND_PCM_AES1_CON_MUSICAL_ID|0x00)
1181#define SND_PCM_AES1_CON_MICROPHONE (SND_PCM_AES1_CON_MUSICAL_ID|0x08)
1182#define SND_PCM_AES1_CON_DAT (SND_PCM_AES1_CON_MAGNETIC_ID|0x00)
1183#define SND_PCM_AES1_CON_VCR (SND_PCM_AES1_CON_MAGNETIC_ID|0x08)
1184#define SND_PCM_AES1_CON_ORIGINAL (1<<7) /* this bits depends on the category code */
1185#define SND_PCM_AES2_PRO_SBITS (7<<0) /* mask - sample bits */
1186#define SND_PCM_AES2_PRO_SBITS_20 (2<<0) /* 20-bit - coordination */
1187#define SND_PCM_AES2_PRO_SBITS_24 (4<<0) /* 24-bit - main audio */
1188#define SND_PCM_AES2_PRO_SBITS_UDEF (6<<0) /* user defined application */
1189#define SND_PCM_AES2_PRO_WORDLEN (7<<3) /* mask - source word length */
1190#define SND_PCM_AES2_PRO_WORDLEN_NOTID (0<<3) /* not indicated */
1191#define SND_PCM_AES2_PRO_WORDLEN_22_18 (2<<3) /* 22-bit or 18-bit */
1192#define SND_PCM_AES2_PRO_WORDLEN_23_19 (4<<3) /* 23-bit or 19-bit */
1193#define SND_PCM_AES2_PRO_WORDLEN_24_20 (5<<3) /* 24-bit or 20-bit */
1194#define SND_PCM_AES2_PRO_WORDLEN_20_16 (6<<3) /* 20-bit or 16-bit */
1195#define SND_PCM_AES2_CON_SOURCE (15<<0) /* mask - source number */
1196#define SND_PCM_AES2_CON_SOURCE_UNSPEC (0<<0) /* unspecified */
1197#define SND_PCM_AES2_CON_CHANNEL (15<<4) /* mask - channel number */
1198#define SND_PCM_AES2_CON_CHANNEL_UNSPEC (0<<4) /* unspecified */
1199#define SND_PCM_AES3_CON_FS (15<<0) /* mask - sample frequency */
1200#define SND_PCM_AES3_CON_FS_44100 (0<<0) /* 44.1kHz */
1201#define SND_PCM_AES3_CON_FS_48000 (2<<0) /* 48kHz */
1202#define SND_PCM_AES3_CON_FS_32000 (3<<0) /* 32kHz */
1203#define SND_PCM_AES3_CON_CLOCK (3<<4) /* mask - clock accuracy */
1204#define SND_PCM_AES3_CON_CLOCK_1000PPM (0<<4) /* 1000 ppm */
1205#define SND_PCM_AES3_CON_CLOCK_50PPM (1<<4) /* 50 ppm */
1206#define SND_PCM_AES3_CON_CLOCK_VARIABLE (2<<4) /* variable pitch */
1207
1208/*
1209 * User interface
1210 */
1211
1212/*
1213 * in this loop, dmabuf.count signifies the amount of data that is
1214 * waiting to be copied to the user's buffer. it is filled by the dma
1215 * machine and drained by this loop.
1216 */
1217static ssize_t
1218ymf_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
1219{
1220 struct ymf_state *state = (struct ymf_state *)file->private_data;
1221 struct ymf_dmabuf *dmabuf = &state->rpcm.dmabuf;
1222 struct ymf_unit *unit = state->unit;
1223 DECLARE_WAITQUEUE(waita, current);
1224 ssize_t ret;
1225 unsigned long flags;
1226 unsigned int swptr;
1227 int cnt; /* This many to go in this revolution */
1228
1229 if (dmabuf->mapped)
1230 return -ENXIO;
1231 if (!dmabuf->ready && (ret = prog_dmabuf(state, 1)))
1232 return ret;
1233 ret = 0;
1234
1235 add_wait_queue(&dmabuf->wait, &waita);
1236 set_current_state(TASK_INTERRUPTIBLE);
1237 while (count > 0) {
1238 spin_lock_irqsave(&unit->reg_lock, flags);
1239 if (unit->suspended) {
1240 spin_unlock_irqrestore(&unit->reg_lock, flags);
1241 schedule();
1242 set_current_state(TASK_INTERRUPTIBLE);
1243 if (signal_pending(current)) {
1244 if (!ret) ret = -EAGAIN;
1245 break;
1246 }
1247 continue;
1248 }
1249 swptr = dmabuf->swptr;
1250 cnt = dmabuf->dmasize - swptr;
1251 if (dmabuf->count < cnt)
1252 cnt = dmabuf->count;
1253 spin_unlock_irqrestore(&unit->reg_lock, flags);
1254
1255 if (cnt > count)
1256 cnt = count;
1257 if (cnt <= 0) {
1258 unsigned long tmo;
1259 /* buffer is empty, start the dma machine and wait for data to be
1260 recorded */
1261 spin_lock_irqsave(&state->unit->reg_lock, flags);
1262 if (!state->rpcm.running) {
1263 ymf_capture_trigger(state->unit, &state->rpcm, 1);
1264 }
1265 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1266 if (file->f_flags & O_NONBLOCK) {
1267 if (!ret) ret = -EAGAIN;
1268 break;
1269 }
1270 /* This isnt strictly right for the 810 but it'll do */
1271 tmo = (dmabuf->dmasize * HZ) / (state->format.rate * 2);
1272 tmo >>= state->format.shift;
1273 /* There are two situations when sleep_on_timeout returns, one is when
1274 the interrupt is serviced correctly and the process is waked up by
1275 ISR ON TIME. Another is when timeout is expired, which means that
1276 either interrupt is NOT serviced correctly (pending interrupt) or it
1277 is TOO LATE for the process to be scheduled to run (scheduler latency)
1278 which results in a (potential) buffer overrun. And worse, there is
1279 NOTHING we can do to prevent it. */
1280 tmo = schedule_timeout(tmo);
1281 spin_lock_irqsave(&state->unit->reg_lock, flags);
1282 set_current_state(TASK_INTERRUPTIBLE);
1283 if (tmo == 0 && dmabuf->count == 0) {
1284 printk(KERN_ERR "ymfpci%d: recording schedule timeout, "
1285 "dmasz %u fragsz %u count %i hwptr %u swptr %u\n",
1286 state->unit->dev_audio,
1287 dmabuf->dmasize, dmabuf->fragsize, dmabuf->count,
1288 dmabuf->hwptr, dmabuf->swptr);
1289 }
1290 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1291 if (signal_pending(current)) {
1292 if (!ret) ret = -ERESTARTSYS;
1293 break;
1294 }
1295 continue;
1296 }
1297
1298 if (copy_to_user(buffer, dmabuf->rawbuf + swptr, cnt)) {
1299 if (!ret) ret = -EFAULT;
1300 break;
1301 }
1302
1303 swptr = (swptr + cnt) % dmabuf->dmasize;
1304
1305 spin_lock_irqsave(&unit->reg_lock, flags);
1306 if (unit->suspended) {
1307 spin_unlock_irqrestore(&unit->reg_lock, flags);
1308 continue;
1309 }
1310
1311 dmabuf->swptr = swptr;
1312 dmabuf->count -= cnt;
1313 // spin_unlock_irqrestore(&unit->reg_lock, flags);
1314
1315 count -= cnt;
1316 buffer += cnt;
1317 ret += cnt;
1318 // spin_lock_irqsave(&unit->reg_lock, flags);
1319 if (!state->rpcm.running) {
1320 ymf_capture_trigger(unit, &state->rpcm, 1);
1321 }
1322 spin_unlock_irqrestore(&unit->reg_lock, flags);
1323 }
1324 set_current_state(TASK_RUNNING);
1325 remove_wait_queue(&dmabuf->wait, &waita);
1326
1327 return ret;
1328}
1329
1330static ssize_t
1331ymf_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
1332{
1333 struct ymf_state *state = (struct ymf_state *)file->private_data;
1334 struct ymf_dmabuf *dmabuf = &state->wpcm.dmabuf;
1335 struct ymf_unit *unit = state->unit;
1336 DECLARE_WAITQUEUE(waita, current);
1337 ssize_t ret;
1338 unsigned long flags;
1339 unsigned int swptr;
1340 int cnt; /* This many to go in this revolution */
1341 int redzone;
1342 int delay;
1343
1344 YMFDBGW("ymf_write: count %d\n", count);
1345
1346 if (dmabuf->mapped)
1347 return -ENXIO;
1348 if (!dmabuf->ready && (ret = prog_dmabuf(state, 0)))
1349 return ret;
1350 ret = 0;
1351
1352 /*
1353 * Alan's cs46xx works without a red zone - marvel of ingenuity.
1354 * We are not so brilliant... Red zone does two things:
1355 * 1. allows for safe start after a pause as we have no way
1356 * to know what the actual, relentlessly advancing, hwptr is.
1357 * 2. makes computations in ymf_pcm_interrupt simpler.
1358 */
1359 redzone = ymf_calc_lend(state->format.rate) << state->format.shift;
1360 redzone *= 3; /* 2 redzone + 1 possible uncertainty reserve. */
1361
1362 add_wait_queue(&dmabuf->wait, &waita);
1363 set_current_state(TASK_INTERRUPTIBLE);
1364 while (count > 0) {
1365 spin_lock_irqsave(&unit->reg_lock, flags);
1366 if (unit->suspended) {
1367 spin_unlock_irqrestore(&unit->reg_lock, flags);
1368 schedule();
1369 set_current_state(TASK_INTERRUPTIBLE);
1370 if (signal_pending(current)) {
1371 if (!ret) ret = -EAGAIN;
1372 break;
1373 }
1374 continue;
1375 }
1376 if (dmabuf->count < 0) {
1377 printk(KERN_ERR
1378 "ymf_write: count %d, was legal in cs46xx\n",
1379 dmabuf->count);
1380 dmabuf->count = 0;
1381 }
1382 if (dmabuf->count == 0) {
1383 swptr = dmabuf->hwptr;
1384 if (state->wpcm.running) {
1385 /*
1386 * Add uncertainty reserve.
1387 */
1388 cnt = ymf_calc_lend(state->format.rate);
1389 cnt <<= state->format.shift;
1390 if ((swptr += cnt) >= dmabuf->dmasize) {
1391 swptr -= dmabuf->dmasize;
1392 }
1393 }
1394 dmabuf->swptr = swptr;
1395 } else {
1396 /*
1397 * XXX This is not right if dmabuf->count is small -
1398 * about 2*x frame size or less. We cannot count on
1399 * on appending and not causing an artefact.
1400 * Should use a variation of the count==0 case above.
1401 */
1402 swptr = dmabuf->swptr;
1403 }
1404 cnt = dmabuf->dmasize - swptr;
1405 if (dmabuf->count + cnt > dmabuf->dmasize - redzone)
1406 cnt = (dmabuf->dmasize - redzone) - dmabuf->count;
1407 spin_unlock_irqrestore(&unit->reg_lock, flags);
1408
1409 if (cnt > count)
1410 cnt = count;
1411 if (cnt <= 0) {
1412 YMFDBGW("ymf_write: full, count %d swptr %d\n",
1413 dmabuf->count, dmabuf->swptr);
1414 /*
1415 * buffer is full, start the dma machine and
1416 * wait for data to be played
1417 */
1418 spin_lock_irqsave(&unit->reg_lock, flags);
1419 if (!state->wpcm.running) {
1420 ymf_playback_trigger(unit, &state->wpcm, 1);
1421 }
1422 spin_unlock_irqrestore(&unit->reg_lock, flags);
1423 if (file->f_flags & O_NONBLOCK) {
1424 if (!ret) ret = -EAGAIN;
1425 break;
1426 }
1427 schedule();
1428 set_current_state(TASK_INTERRUPTIBLE);
1429 if (signal_pending(current)) {
1430 if (!ret) ret = -ERESTARTSYS;
1431 break;
1432 }
1433 continue;
1434 }
1435 if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) {
1436 if (!ret) ret = -EFAULT;
1437 break;
1438 }
1439
1440 if ((swptr += cnt) >= dmabuf->dmasize) {
1441 swptr -= dmabuf->dmasize;
1442 }
1443
1444 spin_lock_irqsave(&unit->reg_lock, flags);
1445 if (unit->suspended) {
1446 spin_unlock_irqrestore(&unit->reg_lock, flags);
1447 continue;
1448 }
1449 dmabuf->swptr = swptr;
1450 dmabuf->count += cnt;
1451
1452 /*
1453 * Start here is a bad idea - may cause startup click
1454 * in /bin/play when dmabuf is not full yet.
1455 * However, some broken applications do not make
1456 * any use of SNDCTL_DSP_SYNC (Doom is the worst).
1457 * One frame is about 5.3ms, Doom write size is 46ms.
1458 */
1459 delay = state->format.rate / 20; /* 50ms */
1460 delay <<= state->format.shift;
1461 if (dmabuf->count >= delay && !state->wpcm.running) {
1462 ymf_playback_trigger(unit, &state->wpcm, 1);
1463 }
1464
1465 spin_unlock_irqrestore(&unit->reg_lock, flags);
1466
1467 count -= cnt;
1468 buffer += cnt;
1469 ret += cnt;
1470 }
1471
1472 set_current_state(TASK_RUNNING);
1473 remove_wait_queue(&dmabuf->wait, &waita);
1474
1475 YMFDBGW("ymf_write: ret %d dmabuf.count %d\n", ret, dmabuf->count);
1476 return ret;
1477}
1478
1479static unsigned int ymf_poll(struct file *file, struct poll_table_struct *wait)
1480{
1481 struct ymf_state *state = (struct ymf_state *)file->private_data;
1482 struct ymf_dmabuf *dmabuf;
1483 int redzone;
1484 unsigned long flags;
1485 unsigned int mask = 0;
1486
1487 if (file->f_mode & FMODE_WRITE)
1488 poll_wait(file, &state->wpcm.dmabuf.wait, wait);
1489 if (file->f_mode & FMODE_READ)
1490 poll_wait(file, &state->rpcm.dmabuf.wait, wait);
1491
1492 spin_lock_irqsave(&state->unit->reg_lock, flags);
1493 if (file->f_mode & FMODE_READ) {
1494 dmabuf = &state->rpcm.dmabuf;
1495 if (dmabuf->count >= (signed)dmabuf->fragsize)
1496 mask |= POLLIN | POLLRDNORM;
1497 }
1498 if (file->f_mode & FMODE_WRITE) {
1499 redzone = ymf_calc_lend(state->format.rate);
1500 redzone <<= state->format.shift;
1501 redzone *= 3;
1502
1503 dmabuf = &state->wpcm.dmabuf;
1504 if (dmabuf->mapped) {
1505 if (dmabuf->count >= (signed)dmabuf->fragsize)
1506 mask |= POLLOUT | POLLWRNORM;
1507 } else {
1508 /*
1509 * Don't select unless a full fragment is available.
1510 * Otherwise artsd does GETOSPACE, sees 0, and loops.
1511 */
1512 if (dmabuf->count + redzone + dmabuf->fragsize
1513 <= dmabuf->dmasize)
1514 mask |= POLLOUT | POLLWRNORM;
1515 }
1516 }
1517 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1518
1519 return mask;
1520}
1521
1522static int ymf_mmap(struct file *file, struct vm_area_struct *vma)
1523{
1524 struct ymf_state *state = (struct ymf_state *)file->private_data;
1525 struct ymf_dmabuf *dmabuf = &state->wpcm.dmabuf;
1526 int ret;
1527 unsigned long size;
1528
1529 if (vma->vm_flags & VM_WRITE) {
1530 if ((ret = prog_dmabuf(state, 0)) != 0)
1531 return ret;
1532 } else if (vma->vm_flags & VM_READ) {
1533 if ((ret = prog_dmabuf(state, 1)) != 0)
1534 return ret;
1535 } else
1536 return -EINVAL;
1537
1538 if (vma->vm_pgoff != 0)
1539 return -EINVAL;
1540 size = vma->vm_end - vma->vm_start;
1541 if (size > (PAGE_SIZE << dmabuf->buforder))
1542 return -EINVAL;
1543 if (remap_pfn_range(vma, vma->vm_start,
1544 virt_to_phys(dmabuf->rawbuf) >> PAGE_SHIFT,
1545 size, vma->vm_page_prot))
1546 return -EAGAIN;
1547 dmabuf->mapped = 1;
1548
1549/* P3 */ printk(KERN_INFO "ymfpci: using memory mapped sound, untested!\n");
1550 return 0;
1551}
1552
1553static int ymf_ioctl(struct inode *inode, struct file *file,
1554 unsigned int cmd, unsigned long arg)
1555{
1556 struct ymf_state *state = (struct ymf_state *)file->private_data;
1557 struct ymf_dmabuf *dmabuf;
1558 unsigned long flags;
1559 audio_buf_info abinfo;
1560 count_info cinfo;
1561 int redzone;
1562 int val;
1563 void __user *argp = (void __user *)arg;
1564 int __user *p = argp;
1565
1566 switch (cmd) {
1567 case OSS_GETVERSION:
1568 YMFDBGX("ymf_ioctl: cmd 0x%x(GETVER) arg 0x%lx\n", cmd, arg);
1569 return put_user(SOUND_VERSION, p);
1570
1571 case SNDCTL_DSP_RESET:
1572 YMFDBGX("ymf_ioctl: cmd 0x%x(RESET)\n", cmd);
1573 if (file->f_mode & FMODE_WRITE) {
1574 ymf_wait_dac(state);
1575 dmabuf = &state->wpcm.dmabuf;
1576 spin_lock_irqsave(&state->unit->reg_lock, flags);
1577 dmabuf->ready = 0;
1578 dmabuf->swptr = dmabuf->hwptr;
1579 dmabuf->count = dmabuf->total_bytes = 0;
1580 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1581 }
1582 if (file->f_mode & FMODE_READ) {
1583 ymf_stop_adc(state);
1584 dmabuf = &state->rpcm.dmabuf;
1585 spin_lock_irqsave(&state->unit->reg_lock, flags);
1586 dmabuf->ready = 0;
1587 dmabuf->swptr = dmabuf->hwptr;
1588 dmabuf->count = dmabuf->total_bytes = 0;
1589 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1590 }
1591 return 0;
1592
1593 case SNDCTL_DSP_SYNC:
1594 YMFDBGX("ymf_ioctl: cmd 0x%x(SYNC)\n", cmd);
1595 if (file->f_mode & FMODE_WRITE) {
1596 dmabuf = &state->wpcm.dmabuf;
1597 if (file->f_flags & O_NONBLOCK) {
1598 spin_lock_irqsave(&state->unit->reg_lock, flags);
1599 if (dmabuf->count != 0 && !state->wpcm.running) {
1600 ymf_start_dac(state);
1601 }
1602 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1603 } else {
1604 ymf_wait_dac(state);
1605 }
1606 }
1607 /* XXX What does this do for reading? dmabuf->count=0; ? */
1608 return 0;
1609
1610 case SNDCTL_DSP_SPEED: /* set smaple rate */
1611 if (get_user(val, p))
1612 return -EFAULT;
1613 YMFDBGX("ymf_ioctl: cmd 0x%x(SPEED) sp %d\n", cmd, val);
1614 if (val >= 8000 && val <= 48000) {
1615 if (file->f_mode & FMODE_WRITE) {
1616 ymf_wait_dac(state);
1617 dmabuf = &state->wpcm.dmabuf;
1618 spin_lock_irqsave(&state->unit->reg_lock, flags);
1619 dmabuf->ready = 0;
1620 state->format.rate = val;
1621 ymf_pcm_update_shift(&state->format);
1622 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1623 }
1624 if (file->f_mode & FMODE_READ) {
1625 ymf_stop_adc(state);
1626 dmabuf = &state->rpcm.dmabuf;
1627 spin_lock_irqsave(&state->unit->reg_lock, flags);
1628 dmabuf->ready = 0;
1629 state->format.rate = val;
1630 ymf_pcm_update_shift(&state->format);
1631 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1632 }
1633 }
1634 return put_user(state->format.rate, p);
1635
1636 /*
1637 * OSS manual does not mention SNDCTL_DSP_STEREO at all.
1638 * All channels are mono and if you want stereo, you
1639 * play into two channels with SNDCTL_DSP_CHANNELS.
1640 * However, mpg123 calls it. I wonder, why Michael Hipp used it.
1641 */
1642 case SNDCTL_DSP_STEREO: /* set stereo or mono channel */
1643 if (get_user(val, p))
1644 return -EFAULT;
1645 YMFDBGX("ymf_ioctl: cmd 0x%x(STEREO) st %d\n", cmd, val);
1646 if (file->f_mode & FMODE_WRITE) {
1647 ymf_wait_dac(state);
1648 dmabuf = &state->wpcm.dmabuf;
1649 spin_lock_irqsave(&state->unit->reg_lock, flags);
1650 dmabuf->ready = 0;
1651 state->format.voices = val ? 2 : 1;
1652 ymf_pcm_update_shift(&state->format);
1653 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1654 }
1655 if (file->f_mode & FMODE_READ) {
1656 ymf_stop_adc(state);
1657 dmabuf = &state->rpcm.dmabuf;
1658 spin_lock_irqsave(&state->unit->reg_lock, flags);
1659 dmabuf->ready = 0;
1660 state->format.voices = val ? 2 : 1;
1661 ymf_pcm_update_shift(&state->format);
1662 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1663 }
1664 return 0;
1665
1666 case SNDCTL_DSP_GETBLKSIZE:
1667 YMFDBGX("ymf_ioctl: cmd 0x%x(GETBLK)\n", cmd);
1668 if (file->f_mode & FMODE_WRITE) {
1669 if ((val = prog_dmabuf(state, 0)))
1670 return val;
1671 val = state->wpcm.dmabuf.fragsize;
1672 YMFDBGX("ymf_ioctl: GETBLK w %d\n", val);
1673 return put_user(val, p);
1674 }
1675 if (file->f_mode & FMODE_READ) {
1676 if ((val = prog_dmabuf(state, 1)))
1677 return val;
1678 val = state->rpcm.dmabuf.fragsize;
1679 YMFDBGX("ymf_ioctl: GETBLK r %d\n", val);
1680 return put_user(val, p);
1681 }
1682 return -EINVAL;
1683
1684 case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/
1685 YMFDBGX("ymf_ioctl: cmd 0x%x(GETFMTS)\n", cmd);
1686 return put_user(AFMT_S16_LE|AFMT_U8, p);
1687
1688 case SNDCTL_DSP_SETFMT: /* Select sample format */
1689 if (get_user(val, p))
1690 return -EFAULT;
1691 YMFDBGX("ymf_ioctl: cmd 0x%x(SETFMT) fmt %d\n", cmd, val);
1692 if (val == AFMT_S16_LE || val == AFMT_U8) {
1693 if (file->f_mode & FMODE_WRITE) {
1694 ymf_wait_dac(state);
1695 dmabuf = &state->wpcm.dmabuf;
1696 spin_lock_irqsave(&state->unit->reg_lock, flags);
1697 dmabuf->ready = 0;
1698 state->format.format = val;
1699 ymf_pcm_update_shift(&state->format);
1700 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1701 }
1702 if (file->f_mode & FMODE_READ) {
1703 ymf_stop_adc(state);
1704 dmabuf = &state->rpcm.dmabuf;
1705 spin_lock_irqsave(&state->unit->reg_lock, flags);
1706 dmabuf->ready = 0;
1707 state->format.format = val;
1708 ymf_pcm_update_shift(&state->format);
1709 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1710 }
1711 }
1712 return put_user(state->format.format, p);
1713
1714 case SNDCTL_DSP_CHANNELS:
1715 if (get_user(val, p))
1716 return -EFAULT;
1717 YMFDBGX("ymf_ioctl: cmd 0x%x(CHAN) ch %d\n", cmd, val);
1718 if (val != 0) {
1719 if (file->f_mode & FMODE_WRITE) {
1720 ymf_wait_dac(state);
1721 if (val == 1 || val == 2) {
1722 spin_lock_irqsave(&state->unit->reg_lock, flags);
1723 dmabuf = &state->wpcm.dmabuf;
1724 dmabuf->ready = 0;
1725 state->format.voices = val;
1726 ymf_pcm_update_shift(&state->format);
1727 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1728 }
1729 }
1730 if (file->f_mode & FMODE_READ) {
1731 ymf_stop_adc(state);
1732 if (val == 1 || val == 2) {
1733 spin_lock_irqsave(&state->unit->reg_lock, flags);
1734 dmabuf = &state->rpcm.dmabuf;
1735 dmabuf->ready = 0;
1736 state->format.voices = val;
1737 ymf_pcm_update_shift(&state->format);
1738 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1739 }
1740 }
1741 }
1742 return put_user(state->format.voices, p);
1743
1744 case SNDCTL_DSP_POST:
1745 YMFDBGX("ymf_ioctl: cmd 0x%x(POST)\n", cmd);
1746 /*
1747 * Quoting OSS PG:
1748 * The ioctl SNDCTL_DSP_POST is a lightweight version of
1749 * SNDCTL_DSP_SYNC. It just tells to the driver that there
1750 * is likely to be a pause in the output. This makes it
1751 * possible for the device to handle the pause more
1752 * intelligently. This ioctl doesn't block the application.
1753 *
1754 * The paragraph above is a clumsy way to say "flush ioctl".
1755 * This ioctl is used by mpg123.
1756 */
1757 spin_lock_irqsave(&state->unit->reg_lock, flags);
1758 if (state->wpcm.dmabuf.count != 0 && !state->wpcm.running) {
1759 ymf_start_dac(state);
1760 }
1761 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1762 return 0;
1763
1764 case SNDCTL_DSP_SETFRAGMENT:
1765 if (get_user(val, p))
1766 return -EFAULT;
1767 YMFDBGX("ymf_ioctl: cmd 0x%x(SETFRAG) fr 0x%04x:%04x(%d:%d)\n",
1768 cmd,
1769 (val >> 16) & 0xFFFF, val & 0xFFFF,
1770 (val >> 16) & 0xFFFF, val & 0xFFFF);
1771 dmabuf = &state->wpcm.dmabuf;
1772 dmabuf->ossfragshift = val & 0xffff;
1773 dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
1774 if (dmabuf->ossfragshift < 4)
1775 dmabuf->ossfragshift = 4;
1776 if (dmabuf->ossfragshift > 15)
1777 dmabuf->ossfragshift = 15;
1778 return 0;
1779
1780 case SNDCTL_DSP_GETOSPACE:
1781 YMFDBGX("ymf_ioctl: cmd 0x%x(GETOSPACE)\n", cmd);
1782 if (!(file->f_mode & FMODE_WRITE))
1783 return -EINVAL;
1784 dmabuf = &state->wpcm.dmabuf;
1785 if (!dmabuf->ready && (val = prog_dmabuf(state, 0)) != 0)
1786 return val;
1787 redzone = ymf_calc_lend(state->format.rate);
1788 redzone <<= state->format.shift;
1789 redzone *= 3;
1790 spin_lock_irqsave(&state->unit->reg_lock, flags);
1791 abinfo.fragsize = dmabuf->fragsize;
1792 abinfo.bytes = dmabuf->dmasize - dmabuf->count - redzone;
1793 abinfo.fragstotal = dmabuf->numfrag;
1794 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
1795 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1796 return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
1797
1798 case SNDCTL_DSP_GETISPACE:
1799 YMFDBGX("ymf_ioctl: cmd 0x%x(GETISPACE)\n", cmd);
1800 if (!(file->f_mode & FMODE_READ))
1801 return -EINVAL;
1802 dmabuf = &state->rpcm.dmabuf;
1803 if (!dmabuf->ready && (val = prog_dmabuf(state, 1)) != 0)
1804 return val;
1805 spin_lock_irqsave(&state->unit->reg_lock, flags);
1806 abinfo.fragsize = dmabuf->fragsize;
1807 abinfo.bytes = dmabuf->count;
1808 abinfo.fragstotal = dmabuf->numfrag;
1809 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
1810 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1811 return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
1812
1813 case SNDCTL_DSP_NONBLOCK:
1814 YMFDBGX("ymf_ioctl: cmd 0x%x(NONBLOCK)\n", cmd);
1815 file->f_flags |= O_NONBLOCK;
1816 return 0;
1817
1818 case SNDCTL_DSP_GETCAPS:
1819 YMFDBGX("ymf_ioctl: cmd 0x%x(GETCAPS)\n", cmd);
1820 /* return put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP,
1821 p); */
1822 return put_user(0, p);
1823
1824 case SNDCTL_DSP_GETIPTR:
1825 YMFDBGX("ymf_ioctl: cmd 0x%x(GETIPTR)\n", cmd);
1826 if (!(file->f_mode & FMODE_READ))
1827 return -EINVAL;
1828 dmabuf = &state->rpcm.dmabuf;
1829 spin_lock_irqsave(&state->unit->reg_lock, flags);
1830 cinfo.bytes = dmabuf->total_bytes;
1831 cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
1832 cinfo.ptr = dmabuf->hwptr;
1833 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1834 YMFDBGX("ymf_ioctl: GETIPTR ptr %d bytes %d\n",
1835 cinfo.ptr, cinfo.bytes);
1836 return copy_to_user(argp, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
1837
1838 case SNDCTL_DSP_GETOPTR:
1839 YMFDBGX("ymf_ioctl: cmd 0x%x(GETOPTR)\n", cmd);
1840 if (!(file->f_mode & FMODE_WRITE))
1841 return -EINVAL;
1842 dmabuf = &state->wpcm.dmabuf;
1843 spin_lock_irqsave(&state->unit->reg_lock, flags);
1844 cinfo.bytes = dmabuf->total_bytes;
1845 cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
1846 cinfo.ptr = dmabuf->hwptr;
1847 spin_unlock_irqrestore(&state->unit->reg_lock, flags);
1848 YMFDBGX("ymf_ioctl: GETOPTR ptr %d bytes %d\n",
1849 cinfo.ptr, cinfo.bytes);
1850 return copy_to_user(argp, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
1851
1852 case SNDCTL_DSP_SETDUPLEX:
1853 YMFDBGX("ymf_ioctl: cmd 0x%x(SETDUPLEX)\n", cmd);
1854 return 0; /* Always duplex */
1855
1856 case SOUND_PCM_READ_RATE:
1857 YMFDBGX("ymf_ioctl: cmd 0x%x(READ_RATE)\n", cmd);
1858 return put_user(state->format.rate, p);
1859
1860 case SOUND_PCM_READ_CHANNELS:
1861 YMFDBGX("ymf_ioctl: cmd 0x%x(READ_CH)\n", cmd);
1862 return put_user(state->format.voices, p);
1863
1864 case SOUND_PCM_READ_BITS:
1865 YMFDBGX("ymf_ioctl: cmd 0x%x(READ_BITS)\n", cmd);
1866 return put_user(AFMT_S16_LE, p);
1867
1868 case SNDCTL_DSP_MAPINBUF:
1869 case SNDCTL_DSP_MAPOUTBUF:
1870 case SNDCTL_DSP_SETSYNCRO:
1871 case SOUND_PCM_WRITE_FILTER:
1872 case SOUND_PCM_READ_FILTER:
1873 YMFDBGX("ymf_ioctl: cmd 0x%x unsupported\n", cmd);
1874 return -ENOTTY;
1875
1876 default:
1877 /*
1878 * Some programs mix up audio devices and ioctls
1879 * or perhaps they expect "universal" ioctls,
1880 * for instance we get SNDCTL_TMR_CONTINUE here.
1881 * (mpg123 -g 100 ends here too - to be fixed.)
1882 */
1883 YMFDBGX("ymf_ioctl: cmd 0x%x unknown\n", cmd);
1884 break;
1885 }
1886 return -ENOTTY;
1887}
1888
1889/*
1890 * open(2)
1891 * We use upper part of the minor to distinguish between soundcards.
1892 * Channels are opened with a clone open.
1893 */
1894static int ymf_open(struct inode *inode, struct file *file)
1895{
1896 struct list_head *list;
1897 ymfpci_t *unit = NULL;
1898 int minor;
1899 struct ymf_state *state;
1900 int err;
1901
1902 minor = iminor(inode);
1903 if ((minor & 0x0F) == 3) { /* /dev/dspN */
1904 ;
1905 } else {
1906 return -ENXIO;
1907 }
1908
1909 unit = NULL; /* gcc warns */
1910 spin_lock(&ymf_devs_lock);
1911 list_for_each(list, &ymf_devs) {
1912 unit = list_entry(list, ymfpci_t, ymf_devs);
1913 if (((unit->dev_audio ^ minor) & ~0x0F) == 0)
1914 break;
1915 }
1916 spin_unlock(&ymf_devs_lock);
1917 if (unit == NULL)
1918 return -ENODEV;
1919
1920 down(&unit->open_sem);
1921
1922 if ((state = ymf_state_alloc(unit)) == NULL) {
1923 up(&unit->open_sem);
1924 return -ENOMEM;
1925 }
1926 list_add_tail(&state->chain, &unit->states);
1927
1928 file->private_data = state;
1929
1930 /*
1931 * ymf_read and ymf_write that we borrowed from cs46xx
1932 * allocate buffers with prog_dmabuf(). We call prog_dmabuf
1933 * here so that in case of DMA memory exhaustion open
1934 * fails rather than write.
1935 *
1936 * XXX prog_dmabuf allocates voice. Should allocate explicitly, above.
1937 */
1938 if (file->f_mode & FMODE_WRITE) {
1939 if (!state->wpcm.dmabuf.ready) {
1940 if ((err = prog_dmabuf(state, 0)) != 0) {
1941 goto out_nodma;
1942 }
1943 }
1944 }
1945 if (file->f_mode & FMODE_READ) {
1946 if (!state->rpcm.dmabuf.ready) {
1947 if ((err = prog_dmabuf(state, 1)) != 0) {
1948 goto out_nodma;
1949 }
1950 }
1951 }
1952
1953#if 0 /* test if interrupts work */
1954 ymfpci_writew(unit, YDSXGR_TIMERCOUNT, 0xfffe); /* ~ 680ms */
1955 ymfpci_writeb(unit, YDSXGR_TIMERCTRL,
1956 (YDSXGR_TIMERCTRL_TEN|YDSXGR_TIMERCTRL_TIEN));
1957#endif
1958 up(&unit->open_sem);
1959
1960 return nonseekable_open(inode, file);
1961
1962out_nodma:
1963 /*
1964 * XXX Broken custom: "goto out_xxx" in other place is
1965 * a nestable exception, but here it is not nestable due to semaphore.
1966 * XXX Doubtful technique of self-describing objects....
1967 */
1968 dealloc_dmabuf(unit, &state->wpcm.dmabuf);
1969 dealloc_dmabuf(unit, &state->rpcm.dmabuf);
1970 ymf_pcm_free_substream(&state->wpcm);
1971 ymf_pcm_free_substream(&state->rpcm);
1972
1973 list_del(&state->chain);
1974 kfree(state);
1975
1976 up(&unit->open_sem);
1977 return err;
1978}
1979
1980static int ymf_release(struct inode *inode, struct file *file)
1981{
1982 struct ymf_state *state = (struct ymf_state *)file->private_data;
1983 ymfpci_t *unit = state->unit;
1984
1985#if 0 /* test if interrupts work */
1986 ymfpci_writeb(unit, YDSXGR_TIMERCTRL, 0);
1987#endif
1988
1989 down(&unit->open_sem);
1990
1991 /*
1992 * XXX Solve the case of O_NONBLOCK close - don't deallocate here.
1993 * Deallocate when unloading the driver and we can wait.
1994 */
1995 ymf_wait_dac(state);
1996 ymf_stop_adc(state); /* fortunately, it's immediate */
1997 dealloc_dmabuf(unit, &state->wpcm.dmabuf);
1998 dealloc_dmabuf(unit, &state->rpcm.dmabuf);
1999 ymf_pcm_free_substream(&state->wpcm);
2000 ymf_pcm_free_substream(&state->rpcm);
2001
2002 list_del(&state->chain);
2003 file->private_data = NULL; /* Can you tell I programmed Solaris */
2004 kfree(state);
2005
2006 up(&unit->open_sem);
2007
2008 return 0;
2009}
2010
2011/*
2012 * Mixer operations are based on cs46xx.
2013 */
2014static int ymf_open_mixdev(struct inode *inode, struct file *file)
2015{
2016 int minor = iminor(inode);
2017 struct list_head *list;
2018 ymfpci_t *unit;
2019 int i;
2020
2021 spin_lock(&ymf_devs_lock);
2022 list_for_each(list, &ymf_devs) {
2023 unit = list_entry(list, ymfpci_t, ymf_devs);
2024 for (i = 0; i < NR_AC97; i++) {
2025 if (unit->ac97_codec[i] != NULL &&
2026 unit->ac97_codec[i]->dev_mixer == minor) {
2027 spin_unlock(&ymf_devs_lock);
2028 goto match;
2029 }
2030 }
2031 }
2032 spin_unlock(&ymf_devs_lock);
2033 return -ENODEV;
2034
2035 match:
2036 file->private_data = unit->ac97_codec[i];
2037
2038 return nonseekable_open(inode, file);
2039}
2040
2041static int ymf_ioctl_mixdev(struct inode *inode, struct file *file,
2042 unsigned int cmd, unsigned long arg)
2043{
2044 struct ac97_codec *codec = (struct ac97_codec *)file->private_data;
2045
2046 return codec->mixer_ioctl(codec, cmd, arg);
2047}
2048
2049static int ymf_release_mixdev(struct inode *inode, struct file *file)
2050{
2051 return 0;
2052}
2053
2054static /*const*/ struct file_operations ymf_fops = {
2055 .owner = THIS_MODULE,
2056 .llseek = no_llseek,
2057 .read = ymf_read,
2058 .write = ymf_write,
2059 .poll = ymf_poll,
2060 .ioctl = ymf_ioctl,
2061 .mmap = ymf_mmap,
2062 .open = ymf_open,
2063 .release = ymf_release,
2064};
2065
2066static /*const*/ struct file_operations ymf_mixer_fops = {
2067 .owner = THIS_MODULE,
2068 .llseek = no_llseek,
2069 .ioctl = ymf_ioctl_mixdev,
2070 .open = ymf_open_mixdev,
2071 .release = ymf_release_mixdev,
2072};
2073
2074/*
2075 */
2076
2077static int ymf_suspend(struct pci_dev *pcidev, pm_message_t unused)
2078{
2079 struct ymf_unit *unit = pci_get_drvdata(pcidev);
2080 unsigned long flags;
2081 struct ymf_dmabuf *dmabuf;
2082 struct list_head *p;
2083 struct ymf_state *state;
2084 struct ac97_codec *codec;
2085 int i;
2086
2087 spin_lock_irqsave(&unit->reg_lock, flags);
2088
2089 unit->suspended = 1;
2090
2091 for (i = 0; i < NR_AC97; i++) {
2092 if ((codec = unit->ac97_codec[i]) != NULL)
2093 ac97_save_state(codec);
2094 }
2095
2096 list_for_each(p, &unit->states) {
2097 state = list_entry(p, struct ymf_state, chain);
2098
2099 dmabuf = &state->wpcm.dmabuf;
2100 dmabuf->hwptr = dmabuf->swptr = 0;
2101 dmabuf->total_bytes = 0;
2102 dmabuf->count = 0;
2103
2104 dmabuf = &state->rpcm.dmabuf;
2105 dmabuf->hwptr = dmabuf->swptr = 0;
2106 dmabuf->total_bytes = 0;
2107 dmabuf->count = 0;
2108 }
2109
2110 ymfpci_writel(unit, YDSXGR_NATIVEDACOUTVOL, 0);
2111 ymfpci_disable_dsp(unit);
2112
2113 spin_unlock_irqrestore(&unit->reg_lock, flags);
2114
2115 return 0;
2116}
2117
2118static int ymf_resume(struct pci_dev *pcidev)
2119{
2120 struct ymf_unit *unit = pci_get_drvdata(pcidev);
2121 unsigned long flags;
2122 struct list_head *p;
2123 struct ymf_state *state;
2124 struct ac97_codec *codec;
2125 int i;
2126
2127 ymfpci_aclink_reset(unit->pci);
2128 ymfpci_codec_ready(unit, 0, 1); /* prints diag if not ready. */
2129
2130#ifdef CONFIG_SOUND_YMFPCI_LEGACY
2131 /* XXX At this time the legacy registers are probably deprogrammed. */
2132#endif
2133
2134 ymfpci_download_image(unit);
2135
2136 ymf_memload(unit);
2137
2138 spin_lock_irqsave(&unit->reg_lock, flags);
2139
2140 if (unit->start_count) {
2141 ymfpci_writel(unit, YDSXGR_MODE, 3);
2142 unit->active_bank = ymfpci_readl(unit, YDSXGR_CTRLSELECT) & 1;
2143 }
2144
2145 for (i = 0; i < NR_AC97; i++) {
2146 if ((codec = unit->ac97_codec[i]) != NULL)
2147 ac97_restore_state(codec);
2148 }
2149
2150 unit->suspended = 0;
2151 list_for_each(p, &unit->states) {
2152 state = list_entry(p, struct ymf_state, chain);
2153 wake_up(&state->wpcm.dmabuf.wait);
2154 wake_up(&state->rpcm.dmabuf.wait);
2155 }
2156
2157 spin_unlock_irqrestore(&unit->reg_lock, flags);
2158 return 0;
2159}
2160
2161/*
2162 * initialization routines
2163 */
2164
2165#ifdef CONFIG_SOUND_YMFPCI_LEGACY
2166
2167static int ymfpci_setup_legacy(ymfpci_t *unit, struct pci_dev *pcidev)
2168{
2169 int v;
2170 int mpuio = -1, oplio = -1;
2171
2172 switch (unit->iomidi) {
2173 case 0x330:
2174 mpuio = 0;
2175 break;
2176 case 0x300:
2177 mpuio = 1;
2178 break;
2179 case 0x332:
2180 mpuio = 2;
2181 break;
2182 case 0x334:
2183 mpuio = 3;
2184 break;
2185 default: ;
2186 }
2187
2188 switch (unit->iosynth) {
2189 case 0x388:
2190 oplio = 0;
2191 break;
2192 case 0x398:
2193 oplio = 1;
2194 break;
2195 case 0x3a0:
2196 oplio = 2;
2197 break;
2198 case 0x3a8:
2199 oplio = 3;
2200 break;
2201 default: ;
2202 }
2203
2204 if (mpuio >= 0 || oplio >= 0) {
2205 /* 0x0020: 1 - 10 bits of I/O address decoded, 0 - 16 bits. */
2206 v = 0x001e;
2207 pci_write_config_word(pcidev, PCIR_LEGCTRL, v);
2208
2209 switch (pcidev->device) {
2210 case PCI_DEVICE_ID_YAMAHA_724:
2211 case PCI_DEVICE_ID_YAMAHA_740:
2212 case PCI_DEVICE_ID_YAMAHA_724F:
2213 case PCI_DEVICE_ID_YAMAHA_740C:
2214 v = 0x8800;
2215 if (mpuio >= 0) { v |= mpuio<<4; }
2216 if (oplio >= 0) { v |= oplio; }
2217 pci_write_config_word(pcidev, PCIR_ELEGCTRL, v);
2218 break;
2219
2220 case PCI_DEVICE_ID_YAMAHA_744:
2221 case PCI_DEVICE_ID_YAMAHA_754:
2222 v = 0x8800;
2223 pci_write_config_word(pcidev, PCIR_ELEGCTRL, v);
2224 if (oplio >= 0) {
2225 pci_write_config_word(pcidev, PCIR_OPLADR, unit->iosynth);
2226 }
2227 if (mpuio >= 0) {
2228 pci_write_config_word(pcidev, PCIR_MPUADR, unit->iomidi);
2229 }
2230 break;
2231
2232 default:
2233 printk(KERN_ERR "ymfpci: Unknown device ID: 0x%x\n",
2234 pcidev->device);
2235 return -EINVAL;
2236 }
2237 }
2238
2239 return 0;
2240}
2241#endif /* CONFIG_SOUND_YMFPCI_LEGACY */
2242
2243static void ymfpci_aclink_reset(struct pci_dev * pci)
2244{
2245 u8 cmd;
2246
2247 /*
2248 * In the 744, 754 only 0x01 exists, 0x02 is undefined.
2249 * It does not seem to hurt to trip both regardless of revision.
2250 */
2251 pci_read_config_byte(pci, PCIR_DSXGCTRL, &cmd);
2252 pci_write_config_byte(pci, PCIR_DSXGCTRL, cmd & 0xfc);
2253 pci_write_config_byte(pci, PCIR_DSXGCTRL, cmd | 0x03);
2254 pci_write_config_byte(pci, PCIR_DSXGCTRL, cmd & 0xfc);
2255
2256 pci_write_config_word(pci, PCIR_DSXPWRCTRL1, 0);
2257 pci_write_config_word(pci, PCIR_DSXPWRCTRL2, 0);
2258}
2259
2260static void ymfpci_enable_dsp(ymfpci_t *codec)
2261{
2262 ymfpci_writel(codec, YDSXGR_CONFIG, 0x00000001);
2263}
2264
2265static void ymfpci_disable_dsp(ymfpci_t *codec)
2266{
2267 u32 val;
2268 int timeout = 1000;
2269
2270 val = ymfpci_readl(codec, YDSXGR_CONFIG);
2271 if (val)
2272 ymfpci_writel(codec, YDSXGR_CONFIG, 0x00000000);
2273 while (timeout-- > 0) {
2274 val = ymfpci_readl(codec, YDSXGR_STATUS);
2275 if ((val & 0x00000002) == 0)
2276 break;
2277 }
2278}
2279
2280#include "ymfpci_image.h"
2281
2282static void ymfpci_download_image(ymfpci_t *codec)
2283{
2284 int i, ver_1e;
2285 u16 ctrl;
2286
2287 ymfpci_writel(codec, YDSXGR_NATIVEDACOUTVOL, 0x00000000);
2288 ymfpci_disable_dsp(codec);
2289 ymfpci_writel(codec, YDSXGR_MODE, 0x00010000);
2290 ymfpci_writel(codec, YDSXGR_MODE, 0x00000000);
2291 ymfpci_writel(codec, YDSXGR_MAPOFREC, 0x00000000);
2292 ymfpci_writel(codec, YDSXGR_MAPOFEFFECT, 0x00000000);
2293 ymfpci_writel(codec, YDSXGR_PLAYCTRLBASE, 0x00000000);
2294 ymfpci_writel(codec, YDSXGR_RECCTRLBASE, 0x00000000);
2295 ymfpci_writel(codec, YDSXGR_EFFCTRLBASE, 0x00000000);
2296 ctrl = ymfpci_readw(codec, YDSXGR_GLOBALCTRL);
2297 ymfpci_writew(codec, YDSXGR_GLOBALCTRL, ctrl & ~0x0007);
2298
2299 /* setup DSP instruction code */
2300 for (i = 0; i < YDSXG_DSPLENGTH / 4; i++)
2301 ymfpci_writel(codec, YDSXGR_DSPINSTRAM + (i << 2), DspInst[i]);
2302
2303 switch (codec->pci->device) {
2304 case PCI_DEVICE_ID_YAMAHA_724F:
2305 case PCI_DEVICE_ID_YAMAHA_740C:
2306 case PCI_DEVICE_ID_YAMAHA_744:
2307 case PCI_DEVICE_ID_YAMAHA_754:
2308 ver_1e = 1;
2309 break;
2310 default:
2311 ver_1e = 0;
2312 }
2313
2314 if (ver_1e) {
2315 /* setup control instruction code */
2316 for (i = 0; i < YDSXG_CTRLLENGTH / 4; i++)
2317 ymfpci_writel(codec, YDSXGR_CTRLINSTRAM + (i << 2), CntrlInst1E[i]);
2318 } else {
2319 for (i = 0; i < YDSXG_CTRLLENGTH / 4; i++)
2320 ymfpci_writel(codec, YDSXGR_CTRLINSTRAM + (i << 2), CntrlInst[i]);
2321 }
2322
2323 ymfpci_enable_dsp(codec);
2324
2325 /* 0.02s sounds not too bad, we may do schedule_timeout() later. */
2326 mdelay(20); /* seems we need some delay after downloading image.. */
2327}
2328
2329static int ymfpci_memalloc(ymfpci_t *codec)
2330{
2331 unsigned int playback_ctrl_size;
2332 unsigned int bank_size_playback;
2333 unsigned int bank_size_capture;
2334 unsigned int bank_size_effect;
2335 unsigned int size;
2336 unsigned int off;
2337 char *ptr;
2338 dma_addr_t pba;
2339 int voice, bank;
2340
2341 playback_ctrl_size = 4 + 4 * YDSXG_PLAYBACK_VOICES;
2342 bank_size_playback = ymfpci_readl(codec, YDSXGR_PLAYCTRLSIZE) << 2;
2343 bank_size_capture = ymfpci_readl(codec, YDSXGR_RECCTRLSIZE) << 2;
2344 bank_size_effect = ymfpci_readl(codec, YDSXGR_EFFCTRLSIZE) << 2;
2345 codec->work_size = YDSXG_DEFAULT_WORK_SIZE;
2346
2347 size = ((playback_ctrl_size + 0x00ff) & ~0x00ff) +
2348 ((bank_size_playback * 2 * YDSXG_PLAYBACK_VOICES + 0xff) & ~0xff) +
2349 ((bank_size_capture * 2 * YDSXG_CAPTURE_VOICES + 0xff) & ~0xff) +
2350 ((bank_size_effect * 2 * YDSXG_EFFECT_VOICES + 0xff) & ~0xff) +
2351 codec->work_size;
2352
2353 ptr = pci_alloc_consistent(codec->pci, size + 0xff, &pba);
2354 if (ptr == NULL)
2355 return -ENOMEM;
2356 codec->dma_area_va = ptr;
2357 codec->dma_area_ba = pba;
2358 codec->dma_area_size = size + 0xff;
2359
2360 off = (unsigned long)ptr & 0xff;
2361 if (off) {
2362 ptr += 0x100 - off;
2363 pba += 0x100 - off;
2364 }
2365
2366 /*
2367 * Hardware requires only ptr[playback_ctrl_size] zeroed,
2368 * but in our judgement it is a wrong kind of savings, so clear it all.
2369 */
2370 memset(ptr, 0, size);
2371
2372 codec->ctrl_playback = (u32 *)ptr;
2373 codec->ctrl_playback_ba = pba;
2374 codec->ctrl_playback[0] = cpu_to_le32(YDSXG_PLAYBACK_VOICES);
2375 ptr += (playback_ctrl_size + 0x00ff) & ~0x00ff;
2376 pba += (playback_ctrl_size + 0x00ff) & ~0x00ff;
2377
2378 off = 0;
2379 for (voice = 0; voice < YDSXG_PLAYBACK_VOICES; voice++) {
2380 codec->voices[voice].number = voice;
2381 codec->voices[voice].bank =
2382 (ymfpci_playback_bank_t *) (ptr + off);
2383 codec->voices[voice].bank_ba = pba + off;
2384 off += 2 * bank_size_playback; /* 2 banks */
2385 }
2386 off = (off + 0xff) & ~0xff;
2387 ptr += off;
2388 pba += off;
2389
2390 off = 0;
2391 codec->bank_base_capture = pba;
2392 for (voice = 0; voice < YDSXG_CAPTURE_VOICES; voice++)
2393 for (bank = 0; bank < 2; bank++) {
2394 codec->bank_capture[voice][bank] =
2395 (ymfpci_capture_bank_t *) (ptr + off);
2396 off += bank_size_capture;
2397 }
2398 off = (off + 0xff) & ~0xff;
2399 ptr += off;
2400 pba += off;
2401
2402 off = 0;
2403 codec->bank_base_effect = pba;
2404 for (voice = 0; voice < YDSXG_EFFECT_VOICES; voice++)
2405 for (bank = 0; bank < 2; bank++) {
2406 codec->bank_effect[voice][bank] =
2407 (ymfpci_effect_bank_t *) (ptr + off);
2408 off += bank_size_effect;
2409 }
2410 off = (off + 0xff) & ~0xff;
2411 ptr += off;
2412 pba += off;
2413
2414 codec->work_base = pba;
2415
2416 return 0;
2417}
2418
2419static void ymfpci_memfree(ymfpci_t *codec)
2420{
2421 ymfpci_writel(codec, YDSXGR_PLAYCTRLBASE, 0);
2422 ymfpci_writel(codec, YDSXGR_RECCTRLBASE, 0);
2423 ymfpci_writel(codec, YDSXGR_EFFCTRLBASE, 0);
2424 ymfpci_writel(codec, YDSXGR_WORKBASE, 0);
2425 ymfpci_writel(codec, YDSXGR_WORKSIZE, 0);
2426 pci_free_consistent(codec->pci,
2427 codec->dma_area_size, codec->dma_area_va, codec->dma_area_ba);
2428}
2429
2430static void ymf_memload(ymfpci_t *unit)
2431{
2432
2433 ymfpci_writel(unit, YDSXGR_PLAYCTRLBASE, unit->ctrl_playback_ba);
2434 ymfpci_writel(unit, YDSXGR_RECCTRLBASE, unit->bank_base_capture);
2435 ymfpci_writel(unit, YDSXGR_EFFCTRLBASE, unit->bank_base_effect);
2436 ymfpci_writel(unit, YDSXGR_WORKBASE, unit->work_base);
2437 ymfpci_writel(unit, YDSXGR_WORKSIZE, unit->work_size >> 2);
2438
2439 /* S/PDIF output initialization */
2440 ymfpci_writew(unit, YDSXGR_SPDIFOUTCTRL, 0);
2441 ymfpci_writew(unit, YDSXGR_SPDIFOUTSTATUS,
2442 SND_PCM_AES0_CON_EMPHASIS_NONE |
2443 (SND_PCM_AES1_CON_ORIGINAL << 8) |
2444 (SND_PCM_AES1_CON_PCM_CODER << 8));
2445
2446 /* S/PDIF input initialization */
2447 ymfpci_writew(unit, YDSXGR_SPDIFINCTRL, 0);
2448
2449 /* move this volume setup to mixer */
2450 ymfpci_writel(unit, YDSXGR_NATIVEDACOUTVOL, 0x3fff3fff);
2451 ymfpci_writel(unit, YDSXGR_BUF441OUTVOL, 0);
2452 ymfpci_writel(unit, YDSXGR_NATIVEADCINVOL, 0x3fff3fff);
2453 ymfpci_writel(unit, YDSXGR_NATIVEDACINVOL, 0x3fff3fff);
2454}
2455
2456static int ymf_ac97_init(ymfpci_t *unit, int num_ac97)
2457{
2458 struct ac97_codec *codec;
2459 u16 eid;
2460
2461 if ((codec = ac97_alloc_codec()) == NULL)
2462 return -ENOMEM;
2463
2464 /* initialize some basic codec information, other fields will be filled
2465 in ac97_probe_codec */
2466 codec->private_data = unit;
2467 codec->id = num_ac97;
2468
2469 codec->codec_read = ymfpci_codec_read;
2470 codec->codec_write = ymfpci_codec_write;
2471
2472 if (ac97_probe_codec(codec) == 0) {
2473 printk(KERN_ERR "ymfpci: ac97_probe_codec failed\n");
2474 goto out_kfree;
2475 }
2476
2477 eid = ymfpci_codec_read(codec, AC97_EXTENDED_ID);
2478 if (eid==0xFFFF) {
2479 printk(KERN_WARNING "ymfpci: no codec attached ?\n");
2480 goto out_kfree;
2481 }
2482
2483 unit->ac97_features = eid;
2484
2485 if ((codec->dev_mixer = register_sound_mixer(&ymf_mixer_fops, -1)) < 0) {
2486 printk(KERN_ERR "ymfpci: couldn't register mixer!\n");
2487 goto out_kfree;
2488 }
2489
2490 unit->ac97_codec[num_ac97] = codec;
2491
2492 return 0;
2493 out_kfree:
2494 ac97_release_codec(codec);
2495 return -ENODEV;
2496}
2497
2498#ifdef CONFIG_SOUND_YMFPCI_LEGACY
2499# ifdef MODULE
2500static int mpu_io;
2501static int synth_io;
2502module_param(mpu_io, int, 0);
2503module_param(synth_io, int, 0);
2504# else
2505static int mpu_io = 0x330;
2506static int synth_io = 0x388;
2507# endif
2508static int assigned;
2509#endif /* CONFIG_SOUND_YMFPCI_LEGACY */
2510
2511static int __devinit ymf_probe_one(struct pci_dev *pcidev, const struct pci_device_id *ent)
2512{
2513 u16 ctrl;
2514 unsigned long base;
2515 ymfpci_t *codec;
2516
2517 int err;
2518
2519 if ((err = pci_enable_device(pcidev)) != 0) {
2520 printk(KERN_ERR "ymfpci: pci_enable_device failed\n");
2521 return err;
2522 }
2523 base = pci_resource_start(pcidev, 0);
2524
2525 if ((codec = kmalloc(sizeof(ymfpci_t), GFP_KERNEL)) == NULL) {
2526 printk(KERN_ERR "ymfpci: no core\n");
2527 return -ENOMEM;
2528 }
2529 memset(codec, 0, sizeof(*codec));
2530
2531 spin_lock_init(&codec->reg_lock);
2532 spin_lock_init(&codec->voice_lock);
2533 spin_lock_init(&codec->ac97_lock);
2534 init_MUTEX(&codec->open_sem);
2535 INIT_LIST_HEAD(&codec->states);
2536 codec->pci = pcidev;
2537
2538 pci_read_config_byte(pcidev, PCI_REVISION_ID, &codec->rev);
2539
2540 if (request_mem_region(base, 0x8000, "ymfpci") == NULL) {
2541 printk(KERN_ERR "ymfpci: unable to request mem region\n");
2542 goto out_free;
2543 }
2544
2545 if ((codec->reg_area_virt = ioremap(base, 0x8000)) == NULL) {
2546 printk(KERN_ERR "ymfpci: unable to map registers\n");
2547 goto out_release_region;
2548 }
2549
2550 pci_set_master(pcidev);
2551
2552 printk(KERN_INFO "ymfpci: %s at 0x%lx IRQ %d\n",
2553 (char *)ent->driver_data, base, pcidev->irq);
2554
2555 ymfpci_aclink_reset(pcidev);
2556 if (ymfpci_codec_ready(codec, 0, 1) < 0)
2557 goto out_unmap;
2558
2559#ifdef CONFIG_SOUND_YMFPCI_LEGACY
2560 if (assigned == 0) {
2561 codec->iomidi = mpu_io;
2562 codec->iosynth = synth_io;
2563 if (ymfpci_setup_legacy(codec, pcidev) < 0)
2564 goto out_unmap;
2565 assigned = 1;
2566 }
2567#endif
2568
2569 ymfpci_download_image(codec);
2570
2571 if (ymfpci_memalloc(codec) < 0)
2572 goto out_disable_dsp;
2573 ymf_memload(codec);
2574
2575 if (request_irq(pcidev->irq, ymf_interrupt, SA_SHIRQ, "ymfpci", codec) != 0) {
2576 printk(KERN_ERR "ymfpci: unable to request IRQ %d\n",
2577 pcidev->irq);
2578 goto out_memfree;
2579 }
2580
2581 /* register /dev/dsp */
2582 if ((codec->dev_audio = register_sound_dsp(&ymf_fops, -1)) < 0) {
2583 printk(KERN_ERR "ymfpci: unable to register dsp\n");
2584 goto out_free_irq;
2585 }
2586
2587 /*
2588 * Poke just the primary for the moment.
2589 */
2590 if ((err = ymf_ac97_init(codec, 0)) != 0)
2591 goto out_unregister_sound_dsp;
2592
2593#ifdef CONFIG_SOUND_YMFPCI_LEGACY
2594 codec->opl3_data.name = "ymfpci";
2595 codec->mpu_data.name = "ymfpci";
2596
2597 codec->opl3_data.io_base = codec->iosynth;
2598 codec->opl3_data.irq = -1;
2599
2600 codec->mpu_data.io_base = codec->iomidi;
2601 codec->mpu_data.irq = -1; /* May be different from our PCI IRQ. */
2602
2603 if (codec->iomidi) {
2604 if (!probe_uart401(&codec->mpu_data, THIS_MODULE)) {
2605 codec->iomidi = 0; /* XXX kludge */
2606 }
2607 }
2608#endif /* CONFIG_SOUND_YMFPCI_LEGACY */
2609
2610 /* put it into driver list */
2611 spin_lock(&ymf_devs_lock);
2612 list_add_tail(&codec->ymf_devs, &ymf_devs);
2613 spin_unlock(&ymf_devs_lock);
2614 pci_set_drvdata(pcidev, codec);
2615
2616 return 0;
2617
2618 out_unregister_sound_dsp:
2619 unregister_sound_dsp(codec->dev_audio);
2620 out_free_irq:
2621 free_irq(pcidev->irq, codec);
2622 out_memfree:
2623 ymfpci_memfree(codec);
2624 out_disable_dsp:
2625 ymfpci_disable_dsp(codec);
2626 ctrl = ymfpci_readw(codec, YDSXGR_GLOBALCTRL);
2627 ymfpci_writew(codec, YDSXGR_GLOBALCTRL, ctrl & ~0x0007);
2628 ymfpci_writel(codec, YDSXGR_STATUS, ~0);
2629 out_unmap:
2630 iounmap(codec->reg_area_virt);
2631 out_release_region:
2632 release_mem_region(pci_resource_start(pcidev, 0), 0x8000);
2633 out_free:
2634 if (codec->ac97_codec[0])
2635 ac97_release_codec(codec->ac97_codec[0]);
2636 return -ENODEV;
2637}
2638
2639static void __devexit ymf_remove_one(struct pci_dev *pcidev)
2640{
2641 __u16 ctrl;
2642 ymfpci_t *codec = pci_get_drvdata(pcidev);
2643
2644 /* remove from list of devices */
2645 spin_lock(&ymf_devs_lock);
2646 list_del(&codec->ymf_devs);
2647 spin_unlock(&ymf_devs_lock);
2648
2649 unregister_sound_mixer(codec->ac97_codec[0]->dev_mixer);
2650 ac97_release_codec(codec->ac97_codec[0]);
2651 unregister_sound_dsp(codec->dev_audio);
2652 free_irq(pcidev->irq, codec);
2653 ymfpci_memfree(codec);
2654 ymfpci_writel(codec, YDSXGR_STATUS, ~0);
2655 ymfpci_disable_dsp(codec);
2656 ctrl = ymfpci_readw(codec, YDSXGR_GLOBALCTRL);
2657 ymfpci_writew(codec, YDSXGR_GLOBALCTRL, ctrl & ~0x0007);
2658 iounmap(codec->reg_area_virt);
2659 release_mem_region(pci_resource_start(pcidev, 0), 0x8000);
2660#ifdef CONFIG_SOUND_YMFPCI_LEGACY
2661 if (codec->iomidi) {
2662 unload_uart401(&codec->mpu_data);
2663 }
2664#endif /* CONFIG_SOUND_YMFPCI_LEGACY */
2665}
2666
2667MODULE_AUTHOR("Jaroslav Kysela");
2668MODULE_DESCRIPTION("Yamaha YMF7xx PCI Audio");
2669MODULE_LICENSE("GPL");
2670
2671static struct pci_driver ymfpci_driver = {
2672 .name = "ymfpci",
2673 .id_table = ymf_id_tbl,
2674 .probe = ymf_probe_one,
2675 .remove = __devexit_p(ymf_remove_one),
2676 .suspend = ymf_suspend,
2677 .resume = ymf_resume
2678};
2679
2680static int __init ymf_init_module(void)
2681{
2682 return pci_module_init(&ymfpci_driver);
2683}
2684
2685static void __exit ymf_cleanup_module (void)
2686{
2687 pci_unregister_driver(&ymfpci_driver);
2688}
2689
2690module_init(ymf_init_module);
2691module_exit(ymf_cleanup_module);