1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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
79
80
81
82
83
84
85#define YMFDBGW(fmt, arg...)
86#define YMFDBGI(fmt, arg...)
87#define YMFDBGX(fmt, arg...)
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
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
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
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
214
215
216
217
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;
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
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
300#define DMABUF_DEFAULTORDER (15-PAGE_SHIFT)
301#define DMABUF_MINORDER 1
302
303
304
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
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
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
342
343static void dealloc_dmabuf(ymfpci_t *unit, struct ymf_dmabuf *dmabuf)
344{
345 struct page *map, *mapend;
346
347 if (dmabuf->rawbuf) {
348
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
379 if (!dmabuf->rawbuf)
380 if ((ret = alloc_dmabuf(state->unit, dmabuf)))
381 return ret;
382
383
384
385
386
387 bufsize = PAGE_SIZE << dmabuf->buforder;
388
389 dmabuf->fragshift = (dmabuf->buforder + PAGE_SHIFT - 2);
390 if (dmabuf->ossfragshift > 3 &&
391 dmabuf->ossfragshift < dmabuf->fragshift) {
392
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
416
417
418
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
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
452
453
454
455
456
457
458
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
478
479
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
498
499
500}
501
502
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
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
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;
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;
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
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) {
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
662
663 if (delta < dmabuf->count) {
664
665
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
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
687
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;
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
734 if (pos < 0 || pos >= dmabuf->dmasize) {
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
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) {
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;
818 if (voices == 2 && ypcm->voices[0] != NULL && ypcm->voices[1] != NULL)
819 return 0;
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
849
850
851
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;
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
932
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;
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
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
976 int nbank;
977 int cbank;
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
994
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
1015 bank->loop_end = cpu_to_le32(ypcm->dmabuf.dmasize);
1016 bank->start = 0;
1017 bank->num_of_loops = 0;
1018 }
1019#if 0
1020 if (state->digital.dig_valid)
1021
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
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
1124#define SND_PCM_AES0_PROFESSIONAL (1<<0)
1125#define SND_PCM_AES0_NONAUDIO (1<<1)
1126#define SND_PCM_AES0_PRO_EMPHASIS (7<<2)
1127#define SND_PCM_AES0_PRO_EMPHASIS_NOTID (0<<2)
1128#define SND_PCM_AES0_PRO_EMPHASIS_NONE (1<<2)
1129#define SND_PCM_AES0_PRO_EMPHASIS_5015 (3<<2)
1130#define SND_PCM_AES0_PRO_EMPHASIS_CCITT (7<<2)
1131#define SND_PCM_AES0_PRO_FREQ_UNLOCKED (1<<5)
1132#define SND_PCM_AES0_PRO_FS (3<<6)
1133#define SND_PCM_AES0_PRO_FS_NOTID (0<<6)
1134#define SND_PCM_AES0_PRO_FS_44100 (1<<6)
1135#define SND_PCM_AES0_PRO_FS_48000 (2<<6)
1136#define SND_PCM_AES0_PRO_FS_32000 (3<<6)
1137#define SND_PCM_AES0_CON_NOT_COPYRIGHT (1<<2)
1138#define SND_PCM_AES0_CON_EMPHASIS (7<<3)
1139#define SND_PCM_AES0_CON_EMPHASIS_NONE (0<<3)
1140#define SND_PCM_AES0_CON_EMPHASIS_5015 (1<<3)
1141#define SND_PCM_AES0_CON_MODE (3<<6)
1142#define SND_PCM_AES1_PRO_MODE (15<<0)
1143#define SND_PCM_AES1_PRO_MODE_NOTID (0<<0)
1144#define SND_PCM_AES1_PRO_MODE_STEREOPHONIC (2<<0)
1145#define SND_PCM_AES1_PRO_MODE_SINGLE (4<<0)
1146#define SND_PCM_AES1_PRO_MODE_TWO (8<<0)
1147#define SND_PCM_AES1_PRO_MODE_PRIMARY (12<<0)
1148#define SND_PCM_AES1_PRO_MODE_BYTE3 (15<<0)
1149#define SND_PCM_AES1_PRO_USERBITS (15<<4)
1150#define SND_PCM_AES1_PRO_USERBITS_NOTID (0<<4)
1151#define SND_PCM_AES1_PRO_USERBITS_192 (8<<4)
1152#define SND_PCM_AES1_PRO_USERBITS_UDEF (12<<4)
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)
1185#define SND_PCM_AES2_PRO_SBITS (7<<0)
1186#define SND_PCM_AES2_PRO_SBITS_20 (2<<0)
1187#define SND_PCM_AES2_PRO_SBITS_24 (4<<0)
1188#define SND_PCM_AES2_PRO_SBITS_UDEF (6<<0)
1189#define SND_PCM_AES2_PRO_WORDLEN (7<<3)
1190#define SND_PCM_AES2_PRO_WORDLEN_NOTID (0<<3)
1191#define SND_PCM_AES2_PRO_WORDLEN_22_18 (2<<3)
1192#define SND_PCM_AES2_PRO_WORDLEN_23_19 (4<<3)
1193#define SND_PCM_AES2_PRO_WORDLEN_24_20 (5<<3)
1194#define SND_PCM_AES2_PRO_WORDLEN_20_16 (6<<3)
1195#define SND_PCM_AES2_CON_SOURCE (15<<0)
1196#define SND_PCM_AES2_CON_SOURCE_UNSPEC (0<<0)
1197#define SND_PCM_AES2_CON_CHANNEL (15<<4)
1198#define SND_PCM_AES2_CON_CHANNEL_UNSPEC (0<<4)
1199#define SND_PCM_AES3_CON_FS (15<<0)
1200#define SND_PCM_AES3_CON_FS_44100 (0<<0)
1201#define SND_PCM_AES3_CON_FS_48000 (2<<0)
1202#define SND_PCM_AES3_CON_FS_32000 (3<<0)
1203#define SND_PCM_AES3_CON_CLOCK (3<<4)
1204#define SND_PCM_AES3_CON_CLOCK_1000PPM (0<<4)
1205#define SND_PCM_AES3_CON_CLOCK_50PPM (1<<4)
1206#define SND_PCM_AES3_CON_CLOCK_VARIABLE (2<<4)
1207
1208
1209
1210
1211
1212
1213
1214
1215
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;
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
1260
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
1271 tmo = (dmabuf->dmasize * HZ) / (state->format.rate * 2);
1272 tmo >>= state->format.shift;
1273
1274
1275
1276
1277
1278
1279
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
1314
1315 count -= cnt;
1316 buffer += cnt;
1317 ret += cnt;
1318
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;
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
1354
1355
1356
1357
1358
1359 redzone = ymf_calc_lend(state->format.rate) << state->format.shift;
1360 redzone *= 3;
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
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
1398
1399
1400
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
1416
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
1454
1455
1456
1457
1458
1459 delay = state->format.rate / 20;
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
1510
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 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
1608 return 0;
1609
1610 case SNDCTL_DSP_SPEED:
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
1638
1639
1640
1641
1642 case SNDCTL_DSP_STEREO:
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:
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:
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
1748
1749
1750
1751
1752
1753
1754
1755
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
1821
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;
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
1879
1880
1881
1882
1883 YMFDBGX("ymf_ioctl: cmd 0x%x unknown\n", cmd);
1884 break;
1885 }
1886 return -ENOTTY;
1887}
1888
1889
1890
1891
1892
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) {
1904 ;
1905 } else {
1906 return -ENXIO;
1907 }
1908
1909 unit = NULL;
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
1932
1933
1934
1935
1936
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
1954 ymfpci_writew(unit, YDSXGR_TIMERCOUNT, 0xfffe);
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
1965
1966
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
1986 ymfpci_writeb(unit, YDSXGR_TIMERCTRL, 0);
1987#endif
1988
1989 down(&unit->open_sem);
1990
1991
1992
1993
1994
1995 ymf_wait_dac(state);
1996 ymf_stop_adc(state);
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;
2004 kfree(state);
2005
2006 up(&unit->open_sem);
2007
2008 return 0;
2009}
2010
2011
2012
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 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 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, u32 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);
2129
2130#ifdef CONFIG_SOUND_YMFPCI_LEGACY
2131
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
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
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
2242
2243static void ymfpci_aclink_reset(struct pci_dev * pci)
2244{
2245 u8 cmd;
2246
2247
2248
2249
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
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
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
2326 mdelay(20);
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
2368
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;
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
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
2447 ymfpci_writew(unit, YDSXGR_SPDIFINCTRL, 0);
2448
2449
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
2465
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
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
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
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;
2602
2603 if (codec->iomidi) {
2604 if (!probe_uart401(&codec->mpu_data, THIS_MODULE)) {
2605 codec->iomidi = 0;
2606 }
2607 }
2608#endif
2609
2610
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
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
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);
2692