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