1/*
2 * sound/oss/sb_audio.c
3 *
4 * Audio routines for Sound Blaster compatible cards.
5 *
6 *
7 * Copyright (C) by Hannu Savolainen 1993-1997
8 *
9 * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
10 * Version 2 (June 1991). See the "COPYING" file distributed with this software
11 * for more info.
12 *
13 * Changes
14 *	Alan Cox	:	Formatting and clean ups
15 *
16 * Status
17 *	Mostly working. Weird uart bug causing irq storms
18 *
19 * Daniel J. Rodriksson: Changes to make sb16 work full duplex.
20 *                       Maybe other 16 bit cards in this code could behave
21 *                       the same.
22 * Chris Rankin:         Use spinlocks instead of CLI/STI
23 */
24
25#include <linux/spinlock.h>
26
27#include "sound_config.h"
28
29#include "sb_mixer.h"
30#include "sb.h"
31
32#include "sb_ess.h"
33
34int sb_audio_open(int dev, int mode)
35{
36	sb_devc *devc = audio_devs[dev]->devc;
37	unsigned long flags;
38
39	if (devc == NULL)
40	{
41		  printk(KERN_ERR "Sound Blaster: incomplete initialization.\n");
42		  return -ENXIO;
43	}
44	if (devc->caps & SB_NO_RECORDING && mode & OPEN_READ)
45	{
46		if (mode == OPEN_READ)
47			return -EPERM;
48	}
49	spin_lock_irqsave(&devc->lock, flags);
50	if (devc->opened)
51	{
52		  spin_unlock_irqrestore(&devc->lock, flags);
53		  return -EBUSY;
54	}
55	if (devc->dma16 != -1 && devc->dma16 != devc->dma8 && !devc->duplex)
56	{
57		if (sound_open_dma(devc->dma16, "Sound Blaster 16 bit"))
58		{
59		  	spin_unlock_irqrestore(&devc->lock, flags);
60			return -EBUSY;
61		}
62	}
63	devc->opened = mode;
64	spin_unlock_irqrestore(&devc->lock, flags);
65
66	devc->irq_mode = IMODE_NONE;
67	devc->irq_mode_16 = IMODE_NONE;
68	devc->fullduplex = devc->duplex &&
69		((mode & OPEN_READ) && (mode & OPEN_WRITE));
70	sb_dsp_reset(devc);
71
72	/* At first glance this check isn't enough, some ESS chips might not
73	 * have a RECLEV. However if they don't common_mixer_set will refuse
74	 * cause devc->iomap has no register mapping for RECLEV
75	 */
76	if (devc->model == MDL_ESS) ess_mixer_reload (devc, SOUND_MIXER_RECLEV);
77
78	/* The ALS007 seems to require that the DSP be removed from the output */
79	/* in order for recording to be activated properly.  This is done by   */
80	/* setting the appropriate bits of the output control register 4ch to  */
81	/* zero.  This code assumes that the output control registers are not  */
82	/* used anywhere else and therefore the DSP bits are *always* ON for   */
83	/* output and OFF for sampling.                                        */
84
85	if (devc->submodel == SUBMDL_ALS007)
86	{
87		if (mode & OPEN_READ)
88			sb_setmixer(devc,ALS007_OUTPUT_CTRL2,
89				sb_getmixer(devc,ALS007_OUTPUT_CTRL2) & 0xf9);
90		else
91			sb_setmixer(devc,ALS007_OUTPUT_CTRL2,
92				sb_getmixer(devc,ALS007_OUTPUT_CTRL2) | 0x06);
93	}
94	return 0;
95}
96
97void sb_audio_close(int dev)
98{
99	sb_devc *devc = audio_devs[dev]->devc;
100
101	/* fix things if mmap turned off fullduplex */
102	if(devc->duplex
103	   && !devc->fullduplex
104	   && (devc->opened & OPEN_READ) && (devc->opened & OPEN_WRITE))
105	{
106		struct dma_buffparms *dmap_temp;
107		dmap_temp = audio_devs[dev]->dmap_out;
108		audio_devs[dev]->dmap_out = audio_devs[dev]->dmap_in;
109		audio_devs[dev]->dmap_in = dmap_temp;
110	}
111	audio_devs[dev]->dmap_out->dma = devc->dma8;
112	audio_devs[dev]->dmap_in->dma = ( devc->duplex ) ?
113		devc->dma16 : devc->dma8;
114
115	if (devc->dma16 != -1 && devc->dma16 != devc->dma8 && !devc->duplex)
116		sound_close_dma(devc->dma16);
117
118	/* For ALS007, turn DSP output back on if closing the device for read */
119
120	if ((devc->submodel == SUBMDL_ALS007) && (devc->opened & OPEN_READ))
121	{
122		sb_setmixer(devc,ALS007_OUTPUT_CTRL2,
123			sb_getmixer(devc,ALS007_OUTPUT_CTRL2) | 0x06);
124	}
125	devc->opened = 0;
126}
127
128static void sb_set_output_parms(int dev, unsigned long buf, int nr_bytes,
129		    int intrflag)
130{
131	sb_devc *devc = audio_devs[dev]->devc;
132
133	if (!devc->fullduplex || devc->bits == AFMT_S16_LE)
134	{
135		devc->trg_buf = buf;
136		devc->trg_bytes = nr_bytes;
137		devc->trg_intrflag = intrflag;
138		devc->irq_mode = IMODE_OUTPUT;
139	}
140	else
141	{
142		devc->trg_buf_16 = buf;
143		devc->trg_bytes_16 = nr_bytes;
144		devc->trg_intrflag_16 = intrflag;
145		devc->irq_mode_16 = IMODE_OUTPUT;
146	}
147}
148
149static void sb_set_input_parms(int dev, unsigned long buf, int count, int intrflag)
150{
151	sb_devc *devc = audio_devs[dev]->devc;
152
153	if (!devc->fullduplex || devc->bits != AFMT_S16_LE)
154	{
155		devc->trg_buf = buf;
156		devc->trg_bytes = count;
157		devc->trg_intrflag = intrflag;
158		devc->irq_mode = IMODE_INPUT;
159	}
160	else
161	{
162		devc->trg_buf_16 = buf;
163		devc->trg_bytes_16 = count;
164		devc->trg_intrflag_16 = intrflag;
165		devc->irq_mode_16 = IMODE_INPUT;
166	}
167}
168
169/*
170 * SB1.x compatible routines
171 */
172
173static void sb1_audio_output_block(int dev, unsigned long buf, int nr_bytes, int intrflag)
174{
175	unsigned long flags;
176	int count = nr_bytes;
177	sb_devc *devc = audio_devs[dev]->devc;
178
179	/* DMAbuf_start_dma (dev, buf, count, DMA_MODE_WRITE); */
180
181	if (audio_devs[dev]->dmap_out->dma > 3)
182		count >>= 1;
183	count--;
184
185	devc->irq_mode = IMODE_OUTPUT;
186
187	spin_lock_irqsave(&devc->lock, flags);
188	if (sb_dsp_command(devc, 0x14))		/* 8 bit DAC using DMA */
189	{
190		sb_dsp_command(devc, (unsigned char) (count & 0xff));
191		sb_dsp_command(devc, (unsigned char) ((count >> 8) & 0xff));
192	}
193	else
194		printk(KERN_WARNING "Sound Blaster:  unable to start DAC.\n");
195	spin_unlock_irqrestore(&devc->lock, flags);
196	devc->intr_active = 1;
197}
198
199static void sb1_audio_start_input(int dev, unsigned long buf, int nr_bytes, int intrflag)
200{
201	unsigned long flags;
202	int count = nr_bytes;
203	sb_devc *devc = audio_devs[dev]->devc;
204
205	/*
206	 * Start a DMA input to the buffer pointed by dmaqtail
207	 */
208
209	/* DMAbuf_start_dma (dev, buf, count, DMA_MODE_READ); */
210
211	if (audio_devs[dev]->dmap_out->dma > 3)
212		count >>= 1;
213	count--;
214
215	devc->irq_mode = IMODE_INPUT;
216
217	spin_lock_irqsave(&devc->lock, flags);
218	if (sb_dsp_command(devc, 0x24))		/* 8 bit ADC using DMA */
219	{
220		sb_dsp_command(devc, (unsigned char) (count & 0xff));
221		sb_dsp_command(devc, (unsigned char) ((count >> 8) & 0xff));
222	}
223	else
224		printk(KERN_ERR "Sound Blaster:  unable to start ADC.\n");
225	spin_unlock_irqrestore(&devc->lock, flags);
226
227	devc->intr_active = 1;
228}
229
230static void sb1_audio_trigger(int dev, int bits)
231{
232	sb_devc *devc = audio_devs[dev]->devc;
233
234	bits &= devc->irq_mode;
235
236	if (!bits)
237		sb_dsp_command(devc, 0xd0);	/* Halt DMA */
238	else
239	{
240		switch (devc->irq_mode)
241		{
242			case IMODE_INPUT:
243				sb1_audio_start_input(dev, devc->trg_buf, devc->trg_bytes,
244						devc->trg_intrflag);
245				break;
246
247			case IMODE_OUTPUT:
248				sb1_audio_output_block(dev, devc->trg_buf, devc->trg_bytes,
249						devc->trg_intrflag);
250				break;
251		}
252	}
253	devc->trigger_bits = bits;
254}
255
256static int sb1_audio_prepare_for_input(int dev, int bsize, int bcount)
257{
258	sb_devc *devc = audio_devs[dev]->devc;
259	unsigned long flags;
260
261	spin_lock_irqsave(&devc->lock, flags);
262	if (sb_dsp_command(devc, 0x40))
263		sb_dsp_command(devc, devc->tconst);
264	sb_dsp_command(devc, DSP_CMD_SPKOFF);
265	spin_unlock_irqrestore(&devc->lock, flags);
266
267	devc->trigger_bits = 0;
268	return 0;
269}
270
271static int sb1_audio_prepare_for_output(int dev, int bsize, int bcount)
272{
273	sb_devc *devc = audio_devs[dev]->devc;
274	unsigned long flags;
275
276	spin_lock_irqsave(&devc->lock, flags);
277	if (sb_dsp_command(devc, 0x40))
278		sb_dsp_command(devc, devc->tconst);
279	sb_dsp_command(devc, DSP_CMD_SPKON);
280	spin_unlock_irqrestore(&devc->lock, flags);
281	devc->trigger_bits = 0;
282	return 0;
283}
284
285static int sb1_audio_set_speed(int dev, int speed)
286{
287	int max_speed = 23000;
288	sb_devc *devc = audio_devs[dev]->devc;
289	int tmp;
290
291	if (devc->opened & OPEN_READ)
292		max_speed = 13000;
293
294	if (speed > 0)
295	{
296		if (speed < 4000)
297			speed = 4000;
298
299		if (speed > max_speed)
300			speed = max_speed;
301
302		devc->tconst = (256 - ((1000000 + speed / 2) / speed)) & 0xff;
303		tmp = 256 - devc->tconst;
304		speed = (1000000 + tmp / 2) / tmp;
305
306		devc->speed = speed;
307	}
308	return devc->speed;
309}
310
311static short sb1_audio_set_channels(int dev, short channels)
312{
313	sb_devc *devc = audio_devs[dev]->devc;
314	return devc->channels = 1;
315}
316
317static unsigned int sb1_audio_set_bits(int dev, unsigned int bits)
318{
319	sb_devc        *devc = audio_devs[dev]->devc;
320	return devc->bits = 8;
321}
322
323static void sb1_audio_halt_xfer(int dev)
324{
325	unsigned long flags;
326	sb_devc *devc = audio_devs[dev]->devc;
327
328	spin_lock_irqsave(&devc->lock, flags);
329	sb_dsp_reset(devc);
330	spin_unlock_irqrestore(&devc->lock, flags);
331}
332
333/*
334 * SB 2.0 and SB 2.01 compatible routines
335 */
336
337static void sb20_audio_output_block(int dev, unsigned long buf, int nr_bytes,
338			int intrflag)
339{
340	unsigned long flags;
341	int count = nr_bytes;
342	sb_devc *devc = audio_devs[dev]->devc;
343	unsigned char cmd;
344
345	/* DMAbuf_start_dma (dev, buf, count, DMA_MODE_WRITE); */
346
347	if (audio_devs[dev]->dmap_out->dma > 3)
348		count >>= 1;
349	count--;
350
351	devc->irq_mode = IMODE_OUTPUT;
352
353	spin_lock_irqsave(&devc->lock, flags);
354	if (sb_dsp_command(devc, 0x48))		/* DSP Block size */
355	{
356		sb_dsp_command(devc, (unsigned char) (count & 0xff));
357		sb_dsp_command(devc, (unsigned char) ((count >> 8) & 0xff));
358
359		if (devc->speed * devc->channels <= 23000)
360			cmd = 0x1c;	/* 8 bit PCM output */
361		else
362			cmd = 0x90;	/* 8 bit high speed PCM output (SB2.01/Pro) */
363
364		if (!sb_dsp_command(devc, cmd))
365			printk(KERN_ERR "Sound Blaster:  unable to start DAC.\n");
366	}
367	else
368		printk(KERN_ERR "Sound Blaster: unable to start DAC.\n");
369	spin_unlock_irqrestore(&devc->lock, flags);
370	devc->intr_active = 1;
371}
372
373static void sb20_audio_start_input(int dev, unsigned long buf, int nr_bytes, int intrflag)
374{
375	unsigned long flags;
376	int count = nr_bytes;
377	sb_devc *devc = audio_devs[dev]->devc;
378	unsigned char cmd;
379
380	/*
381	 * Start a DMA input to the buffer pointed by dmaqtail
382	 */
383
384	/* DMAbuf_start_dma (dev, buf, count, DMA_MODE_READ); */
385
386	if (audio_devs[dev]->dmap_out->dma > 3)
387		count >>= 1;
388	count--;
389
390	devc->irq_mode = IMODE_INPUT;
391
392	spin_lock_irqsave(&devc->lock, flags);
393	if (sb_dsp_command(devc, 0x48))		/* DSP Block size */
394	{
395		sb_dsp_command(devc, (unsigned char) (count & 0xff));
396		sb_dsp_command(devc, (unsigned char) ((count >> 8) & 0xff));
397
398		if (devc->speed * devc->channels <= (devc->major == 3 ? 23000 : 13000))
399			cmd = 0x2c;	/* 8 bit PCM input */
400		else
401			cmd = 0x98;	/* 8 bit high speed PCM input (SB2.01/Pro) */
402
403		if (!sb_dsp_command(devc, cmd))
404			printk(KERN_ERR "Sound Blaster:  unable to start ADC.\n");
405	}
406	else
407		printk(KERN_ERR "Sound Blaster:  unable to start ADC.\n");
408	spin_unlock_irqrestore(&devc->lock, flags);
409	devc->intr_active = 1;
410}
411
412static void sb20_audio_trigger(int dev, int bits)
413{
414	sb_devc *devc = audio_devs[dev]->devc;
415	bits &= devc->irq_mode;
416
417	if (!bits)
418		sb_dsp_command(devc, 0xd0);	/* Halt DMA */
419	else
420	{
421		switch (devc->irq_mode)
422		{
423			case IMODE_INPUT:
424				sb20_audio_start_input(dev, devc->trg_buf, devc->trg_bytes,
425						devc->trg_intrflag);
426				break;
427
428			case IMODE_OUTPUT:
429				sb20_audio_output_block(dev, devc->trg_buf, devc->trg_bytes,
430						devc->trg_intrflag);
431			    break;
432		}
433	}
434	devc->trigger_bits = bits;
435}
436
437/*
438 * SB2.01 specific speed setup
439 */
440
441static int sb201_audio_set_speed(int dev, int speed)
442{
443	sb_devc *devc = audio_devs[dev]->devc;
444	int tmp;
445	int s;
446
447	if (speed > 0)
448	{
449		if (speed < 4000)
450			speed = 4000;
451		if (speed > 44100)
452			speed = 44100;
453		if (devc->opened & OPEN_READ && speed > 15000)
454			speed = 15000;
455		s = speed * devc->channels;
456		devc->tconst = (256 - ((1000000 + s / 2) / s)) & 0xff;
457		tmp = 256 - devc->tconst;
458		speed = ((1000000 + tmp / 2) / tmp) / devc->channels;
459
460		devc->speed = speed;
461	}
462	return devc->speed;
463}
464
465/*
466 * SB Pro specific routines
467 */
468
469static int sbpro_audio_prepare_for_input(int dev, int bsize, int bcount)
470{				/* For SB Pro and Jazz16 */
471	sb_devc *devc = audio_devs[dev]->devc;
472	unsigned long flags;
473	unsigned char bits = 0;
474
475	if (devc->dma16 >= 0 && devc->dma16 != devc->dma8)
476		audio_devs[dev]->dmap_out->dma = audio_devs[dev]->dmap_in->dma =
477			devc->bits == 16 ? devc->dma16 : devc->dma8;
478
479	if (devc->model == MDL_JAZZ || devc->model == MDL_SMW)
480		if (devc->bits == AFMT_S16_LE)
481			bits = 0x04;	/* 16 bit mode */
482
483	spin_lock_irqsave(&devc->lock, flags);
484	if (sb_dsp_command(devc, 0x40))
485		sb_dsp_command(devc, devc->tconst);
486	sb_dsp_command(devc, DSP_CMD_SPKOFF);
487	if (devc->channels == 1)
488		sb_dsp_command(devc, 0xa0 | bits);	/* Mono input */
489	else
490		sb_dsp_command(devc, 0xa8 | bits);	/* Stereo input */
491	spin_unlock_irqrestore(&devc->lock, flags);
492
493	devc->trigger_bits = 0;
494	return 0;
495}
496
497static int sbpro_audio_prepare_for_output(int dev, int bsize, int bcount)
498{				/* For SB Pro and Jazz16 */
499	sb_devc *devc = audio_devs[dev]->devc;
500	unsigned long flags;
501	unsigned char tmp;
502	unsigned char bits = 0;
503
504	if (devc->dma16 >= 0 && devc->dma16 != devc->dma8)
505		audio_devs[dev]->dmap_out->dma = audio_devs[dev]->dmap_in->dma = devc->bits == 16 ? devc->dma16 : devc->dma8;
506	if (devc->model == MDL_SBPRO)
507		sb_mixer_set_stereo(devc, devc->channels == 2);
508
509	spin_lock_irqsave(&devc->lock, flags);
510	if (sb_dsp_command(devc, 0x40))
511		sb_dsp_command(devc, devc->tconst);
512	sb_dsp_command(devc, DSP_CMD_SPKON);
513
514	if (devc->model == MDL_JAZZ || devc->model == MDL_SMW)
515	{
516		if (devc->bits == AFMT_S16_LE)
517			bits = 0x04;	/* 16 bit mode */
518
519		if (devc->channels == 1)
520			sb_dsp_command(devc, 0xa0 | bits);	/* Mono output */
521		else
522			sb_dsp_command(devc, 0xa8 | bits);	/* Stereo output */
523		spin_unlock_irqrestore(&devc->lock, flags);
524	}
525	else
526	{
527		spin_unlock_irqrestore(&devc->lock, flags);
528		tmp = sb_getmixer(devc, 0x0e);
529		if (devc->channels == 1)
530			tmp &= ~0x02;
531		else
532			tmp |= 0x02;
533		sb_setmixer(devc, 0x0e, tmp);
534	}
535	devc->trigger_bits = 0;
536	return 0;
537}
538
539static int sbpro_audio_set_speed(int dev, int speed)
540{
541	sb_devc *devc = audio_devs[dev]->devc;
542
543	if (speed > 0)
544	{
545		if (speed < 4000)
546			speed = 4000;
547		if (speed > 44100)
548			speed = 44100;
549		if (devc->channels > 1 && speed > 22050)
550			speed = 22050;
551		sb201_audio_set_speed(dev, speed);
552	}
553	return devc->speed;
554}
555
556static short sbpro_audio_set_channels(int dev, short channels)
557{
558	sb_devc *devc = audio_devs[dev]->devc;
559
560	if (channels == 1 || channels == 2)
561	{
562		if (channels != devc->channels)
563		{
564			devc->channels = channels;
565			if (devc->model == MDL_SBPRO && devc->channels == 2)
566				sbpro_audio_set_speed(dev, devc->speed);
567		}
568	}
569	return devc->channels;
570}
571
572static int jazz16_audio_set_speed(int dev, int speed)
573{
574	sb_devc *devc = audio_devs[dev]->devc;
575
576	if (speed > 0)
577	{
578		int tmp;
579		int s;
580
581		if (speed < 5000)
582			speed = 5000;
583		if (speed > 44100)
584			speed = 44100;
585
586		s = speed * devc->channels;
587
588		devc->tconst = (256 - ((1000000 + s / 2) / s)) & 0xff;
589
590		tmp = 256 - devc->tconst;
591		speed = ((1000000 + tmp / 2) / tmp) / devc->channels;
592
593		devc->speed = speed;
594	}
595	return devc->speed;
596}
597
598/*
599 * SB16 specific routines
600 */
601
602static int sb16_audio_set_speed(int dev, int speed)
603{
604	sb_devc *devc = audio_devs[dev]->devc;
605	int	max_speed = devc->submodel == SUBMDL_ALS100 ? 48000 : 44100;
606
607	if (speed > 0)
608	{
609		if (speed < 5000)
610			speed = 5000;
611
612		if (speed > max_speed)
613			speed = max_speed;
614
615		devc->speed = speed;
616	}
617	return devc->speed;
618}
619
620static unsigned int sb16_audio_set_bits(int dev, unsigned int bits)
621{
622	sb_devc *devc = audio_devs[dev]->devc;
623
624	if (bits != 0)
625	{
626		if (bits == AFMT_U8 || bits == AFMT_S16_LE)
627			devc->bits = bits;
628		else
629			devc->bits = AFMT_U8;
630	}
631
632	return devc->bits;
633}
634
635static int sb16_audio_prepare_for_input(int dev, int bsize, int bcount)
636{
637	sb_devc *devc = audio_devs[dev]->devc;
638
639	if (!devc->fullduplex)
640	{
641		audio_devs[dev]->dmap_out->dma =
642			audio_devs[dev]->dmap_in->dma =
643				devc->bits == AFMT_S16_LE ?
644					devc->dma16 : devc->dma8;
645	}
646	else if (devc->bits == AFMT_S16_LE)
647	{
648		audio_devs[dev]->dmap_out->dma = devc->dma8;
649		audio_devs[dev]->dmap_in->dma = devc->dma16;
650	}
651	else
652	{
653		audio_devs[dev]->dmap_out->dma = devc->dma16;
654		audio_devs[dev]->dmap_in->dma = devc->dma8;
655	}
656
657	devc->trigger_bits = 0;
658	return 0;
659}
660
661static int sb16_audio_prepare_for_output(int dev, int bsize, int bcount)
662{
663	sb_devc *devc = audio_devs[dev]->devc;
664
665	if (!devc->fullduplex)
666	{
667		audio_devs[dev]->dmap_out->dma =
668			audio_devs[dev]->dmap_in->dma =
669				devc->bits == AFMT_S16_LE ?
670					devc->dma16 : devc->dma8;
671	}
672	else if (devc->bits == AFMT_S16_LE)
673	{
674		audio_devs[dev]->dmap_out->dma = devc->dma8;
675		audio_devs[dev]->dmap_in->dma = devc->dma16;
676	}
677	else
678	{
679		audio_devs[dev]->dmap_out->dma = devc->dma16;
680		audio_devs[dev]->dmap_in->dma = devc->dma8;
681	}
682
683	devc->trigger_bits = 0;
684	return 0;
685}
686
687static void sb16_audio_output_block(int dev, unsigned long buf, int count,
688			int intrflag)
689{
690	unsigned long   flags, cnt;
691	sb_devc        *devc = audio_devs[dev]->devc;
692	unsigned long   bits;
693
694	if (!devc->fullduplex || devc->bits == AFMT_S16_LE)
695	{
696		devc->irq_mode = IMODE_OUTPUT;
697		devc->intr_active = 1;
698	}
699	else
700	{
701		devc->irq_mode_16 = IMODE_OUTPUT;
702		devc->intr_active_16 = 1;
703	}
704
705	/* save value */
706	spin_lock_irqsave(&devc->lock, flags);
707	bits = devc->bits;
708	if (devc->fullduplex)
709		devc->bits = (devc->bits == AFMT_S16_LE) ?
710			AFMT_U8 : AFMT_S16_LE;
711	spin_unlock_irqrestore(&devc->lock, flags);
712
713	cnt = count;
714	if (devc->bits == AFMT_S16_LE)
715		cnt >>= 1;
716	cnt--;
717
718	spin_lock_irqsave(&devc->lock, flags);
719
720	/* DMAbuf_start_dma (dev, buf, count, DMA_MODE_WRITE); */
721
722	sb_dsp_command(devc, 0x41);
723	sb_dsp_command(devc, (unsigned char) ((devc->speed >> 8) & 0xff));
724	sb_dsp_command(devc, (unsigned char) (devc->speed & 0xff));
725
726	sb_dsp_command(devc, (devc->bits == AFMT_S16_LE ? 0xb6 : 0xc6));
727	sb_dsp_command(devc, ((devc->channels == 2 ? 0x20 : 0) +
728			      (devc->bits == AFMT_S16_LE ? 0x10 : 0)));
729	sb_dsp_command(devc, (unsigned char) (cnt & 0xff));
730	sb_dsp_command(devc, (unsigned char) (cnt >> 8));
731
732	/* restore real value after all programming */
733	devc->bits = bits;
734	spin_unlock_irqrestore(&devc->lock, flags);
735}
736
737
738/*
739 *	This fails on the Cyrix MediaGX. If you don't have the DMA enabled
740 *	before the first sample arrives it locks up. However even if you
741 *	do enable the DMA in time you just get DMA timeouts and missing
742 *	interrupts and stuff, so for now I've not bothered fixing this either.
743 */
744
745static void sb16_audio_start_input(int dev, unsigned long buf, int count, int intrflag)
746{
747	unsigned long   flags, cnt;
748	sb_devc        *devc = audio_devs[dev]->devc;
749
750	if (!devc->fullduplex || devc->bits != AFMT_S16_LE)
751	{
752		devc->irq_mode = IMODE_INPUT;
753		devc->intr_active = 1;
754	}
755	else
756	{
757		devc->irq_mode_16 = IMODE_INPUT;
758		devc->intr_active_16 = 1;
759	}
760
761	cnt = count;
762	if (devc->bits == AFMT_S16_LE)
763		cnt >>= 1;
764	cnt--;
765
766	spin_lock_irqsave(&devc->lock, flags);
767
768	/* DMAbuf_start_dma (dev, buf, count, DMA_MODE_READ); */
769
770	sb_dsp_command(devc, 0x42);
771	sb_dsp_command(devc, (unsigned char) ((devc->speed >> 8) & 0xff));
772	sb_dsp_command(devc, (unsigned char) (devc->speed & 0xff));
773
774	sb_dsp_command(devc, (devc->bits == AFMT_S16_LE ? 0xbe : 0xce));
775	sb_dsp_command(devc, ((devc->channels == 2 ? 0x20 : 0) +
776			      (devc->bits == AFMT_S16_LE ? 0x10 : 0)));
777	sb_dsp_command(devc, (unsigned char) (cnt & 0xff));
778	sb_dsp_command(devc, (unsigned char) (cnt >> 8));
779
780	spin_unlock_irqrestore(&devc->lock, flags);
781}
782
783static void sb16_audio_trigger(int dev, int bits)
784{
785	sb_devc *devc = audio_devs[dev]->devc;
786
787	int bits_16 = bits & devc->irq_mode_16;
788	bits &= devc->irq_mode;
789
790	if (!bits && !bits_16)
791		sb_dsp_command(devc, 0xd0);	/* Halt DMA */
792	else
793	{
794		if (bits)
795		{
796			switch (devc->irq_mode)
797			{
798				case IMODE_INPUT:
799					sb16_audio_start_input(dev,
800							devc->trg_buf,
801							devc->trg_bytes,
802							devc->trg_intrflag);
803					break;
804
805				case IMODE_OUTPUT:
806					sb16_audio_output_block(dev,
807							devc->trg_buf,
808							devc->trg_bytes,
809							devc->trg_intrflag);
810					break;
811			}
812		}
813		if (bits_16)
814		{
815			switch (devc->irq_mode_16)
816			{
817				case IMODE_INPUT:
818					sb16_audio_start_input(dev,
819							devc->trg_buf_16,
820							devc->trg_bytes_16,
821							devc->trg_intrflag_16);
822					break;
823
824				case IMODE_OUTPUT:
825					sb16_audio_output_block(dev,
826							devc->trg_buf_16,
827							devc->trg_bytes_16,
828							devc->trg_intrflag_16);
829					break;
830			}
831		}
832	}
833
834	devc->trigger_bits = bits | bits_16;
835}
836
837static unsigned char lbuf8[2048];
838static signed short *lbuf16 = (signed short *)lbuf8;
839#define LBUFCOPYSIZE 1024
840static void
841sb16_copy_from_user(int dev,
842		char *localbuf, int localoffs,
843		const char __user *userbuf, int useroffs,
844		int max_in, int max_out,
845		int *used, int *returned,
846		int len)
847{
848	sb_devc       *devc = audio_devs[dev]->devc;
849	int           i, c, p, locallen;
850	unsigned char *buf8;
851	signed short  *buf16;
852
853	/* if not duplex no conversion */
854	if (!devc->fullduplex)
855	{
856		if (copy_from_user(localbuf + localoffs,
857				   userbuf + useroffs, len))
858			return;
859		*used = len;
860		*returned = len;
861	}
862	else if (devc->bits == AFMT_S16_LE)
863	{
864		/* 16 -> 8 */
865		/* max_in >> 1, max number of samples in ( 16 bits ) */
866		/* max_out, max number of samples out ( 8 bits ) */
867		/* len, number of samples that will be taken ( 16 bits )*/
868		/* c, count of samples remaining in buffer ( 16 bits )*/
869		/* p, count of samples already processed ( 16 bits )*/
870		len = ( (max_in >> 1) > max_out) ? max_out : (max_in >> 1);
871		c = len;
872		p = 0;
873		buf8 = (unsigned char *)(localbuf + localoffs);
874		while (c)
875		{
876			locallen = (c >= LBUFCOPYSIZE ? LBUFCOPYSIZE : c);
877			/* << 1 in order to get 16 bit samples */
878			if (copy_from_user(lbuf16,
879					   userbuf + useroffs + (p << 1),
880					   locallen << 1))
881				return;
882			for (i = 0; i < locallen; i++)
883			{
884				buf8[p+i] = ~((lbuf16[i] >> 8) & 0xff) ^ 0x80;
885			}
886			c -= locallen; p += locallen;
887		}
888		/* used = ( samples * 16 bits size ) */
889		*used =  max_in  > ( max_out << 1) ? (max_out << 1) : max_in;
890		/* returned = ( samples * 8 bits size ) */
891		*returned = len;
892	}
893	else
894	{
895		/* 8 -> 16 */
896		/* max_in, max number of samples in ( 8 bits ) */
897		/* max_out >> 1, max number of samples out ( 16 bits ) */
898		/* len, number of samples that will be taken ( 8 bits )*/
899		/* c, count of samples remaining in buffer ( 8 bits )*/
900		/* p, count of samples already processed ( 8 bits )*/
901		len = max_in > (max_out >> 1) ? (max_out >> 1) : max_in;
902		c = len;
903		p = 0;
904		buf16 = (signed short *)(localbuf + localoffs);
905		while (c)
906		{
907			locallen = (c >= LBUFCOPYSIZE ? LBUFCOPYSIZE : c);
908			if (copy_from_user(lbuf8,
909					   userbuf+useroffs + p,
910					   locallen))
911				return;
912			for (i = 0; i < locallen; i++)
913			{
914				buf16[p+i] = (~lbuf8[i] ^ 0x80) << 8;
915			}
916	      		c -= locallen; p += locallen;
917		}
918		/* used = ( samples * 8 bits size ) */
919		*used = len;
920		/* returned = ( samples * 16 bits size ) */
921		*returned = len << 1;
922	}
923}
924
925static void
926sb16_audio_mmap(int dev)
927{
928	sb_devc       *devc = audio_devs[dev]->devc;
929	devc->fullduplex = 0;
930}
931
932static struct audio_driver sb1_audio_driver =	/* SB1.x */
933{
934	.owner			= THIS_MODULE,
935	.open			= sb_audio_open,
936	.close			= sb_audio_close,
937	.output_block		= sb_set_output_parms,
938	.start_input		= sb_set_input_parms,
939	.prepare_for_input	= sb1_audio_prepare_for_input,
940	.prepare_for_output	= sb1_audio_prepare_for_output,
941	.halt_io		= sb1_audio_halt_xfer,
942	.trigger		= sb1_audio_trigger,
943	.set_speed		= sb1_audio_set_speed,
944	.set_bits		= sb1_audio_set_bits,
945	.set_channels		= sb1_audio_set_channels
946};
947
948static struct audio_driver sb20_audio_driver =	/* SB2.0 */
949{
950	.owner			= THIS_MODULE,
951	.open			= sb_audio_open,
952	.close			= sb_audio_close,
953	.output_block		= sb_set_output_parms,
954	.start_input		= sb_set_input_parms,
955	.prepare_for_input	= sb1_audio_prepare_for_input,
956	.prepare_for_output	= sb1_audio_prepare_for_output,
957	.halt_io		= sb1_audio_halt_xfer,
958	.trigger		= sb20_audio_trigger,
959	.set_speed		= sb1_audio_set_speed,
960	.set_bits		= sb1_audio_set_bits,
961	.set_channels		= sb1_audio_set_channels
962};
963
964static struct audio_driver sb201_audio_driver =		/* SB2.01 */
965{
966	.owner			= THIS_MODULE,
967	.open			= sb_audio_open,
968	.close			= sb_audio_close,
969	.output_block		= sb_set_output_parms,
970	.start_input		= sb_set_input_parms,
971	.prepare_for_input	= sb1_audio_prepare_for_input,
972	.prepare_for_output	= sb1_audio_prepare_for_output,
973	.halt_io		= sb1_audio_halt_xfer,
974	.trigger		= sb20_audio_trigger,
975	.set_speed		= sb201_audio_set_speed,
976	.set_bits		= sb1_audio_set_bits,
977	.set_channels		= sb1_audio_set_channels
978};
979
980static struct audio_driver sbpro_audio_driver =		/* SB Pro */
981{
982	.owner			= THIS_MODULE,
983	.open			= sb_audio_open,
984	.close			= sb_audio_close,
985	.output_block		= sb_set_output_parms,
986	.start_input		= sb_set_input_parms,
987	.prepare_for_input	= sbpro_audio_prepare_for_input,
988	.prepare_for_output	= sbpro_audio_prepare_for_output,
989	.halt_io		= sb1_audio_halt_xfer,
990	.trigger		= sb20_audio_trigger,
991	.set_speed		= sbpro_audio_set_speed,
992	.set_bits		= sb1_audio_set_bits,
993	.set_channels		= sbpro_audio_set_channels
994};
995
996static struct audio_driver jazz16_audio_driver =	/* Jazz16 and SM Wave */
997{
998	.owner			= THIS_MODULE,
999	.open			= sb_audio_open,
1000	.close			= sb_audio_close,
1001	.output_block		= sb_set_output_parms,
1002	.start_input		= sb_set_input_parms,
1003	.prepare_for_input	= sbpro_audio_prepare_for_input,
1004	.prepare_for_output	= sbpro_audio_prepare_for_output,
1005	.halt_io		= sb1_audio_halt_xfer,
1006	.trigger		= sb20_audio_trigger,
1007	.set_speed		= jazz16_audio_set_speed,
1008	.set_bits		= sb16_audio_set_bits,
1009	.set_channels		= sbpro_audio_set_channels
1010};
1011
1012static struct audio_driver sb16_audio_driver =	/* SB16 */
1013{
1014	.owner			= THIS_MODULE,
1015	.open			= sb_audio_open,
1016	.close			= sb_audio_close,
1017	.output_block		= sb_set_output_parms,
1018	.start_input		= sb_set_input_parms,
1019	.prepare_for_input	= sb16_audio_prepare_for_input,
1020	.prepare_for_output	= sb16_audio_prepare_for_output,
1021	.halt_io		= sb1_audio_halt_xfer,
1022	.copy_user		= sb16_copy_from_user,
1023	.trigger		= sb16_audio_trigger,
1024	.set_speed		= sb16_audio_set_speed,
1025	.set_bits		= sb16_audio_set_bits,
1026	.set_channels		= sbpro_audio_set_channels,
1027	.mmap			= sb16_audio_mmap
1028};
1029
1030void sb_audio_init(sb_devc * devc, char *name, struct module *owner)
1031{
1032	int audio_flags = 0;
1033	int format_mask = AFMT_U8;
1034
1035	struct audio_driver *driver = &sb1_audio_driver;
1036
1037	switch (devc->model)
1038	{
1039		case MDL_SB1:	/* SB1.0 or SB 1.5 */
1040			DDB(printk("Will use standard SB1.x driver\n"));
1041			audio_flags = DMA_HARDSTOP;
1042			break;
1043
1044		case MDL_SB2:
1045			DDB(printk("Will use SB2.0 driver\n"));
1046			audio_flags = DMA_AUTOMODE;
1047			driver = &sb20_audio_driver;
1048			break;
1049
1050		case MDL_SB201:
1051			DDB(printk("Will use SB2.01 (high speed) driver\n"));
1052			audio_flags = DMA_AUTOMODE;
1053			driver = &sb201_audio_driver;
1054			break;
1055
1056		case MDL_JAZZ:
1057		case MDL_SMW:
1058			DDB(printk("Will use Jazz16 driver\n"));
1059			audio_flags = DMA_AUTOMODE;
1060			format_mask |= AFMT_S16_LE;
1061			driver = &jazz16_audio_driver;
1062			break;
1063
1064		case MDL_ESS:
1065			DDB(printk("Will use ESS ES688/1688 driver\n"));
1066			driver = ess_audio_init (devc, &audio_flags, &format_mask);
1067			break;
1068
1069		case MDL_SB16:
1070			DDB(printk("Will use SB16 driver\n"));
1071			audio_flags = DMA_AUTOMODE;
1072			format_mask |= AFMT_S16_LE;
1073			if (devc->dma8 != devc->dma16 && devc->dma16 != -1)
1074			{
1075				audio_flags |= DMA_DUPLEX;
1076				devc->duplex = 1;
1077			}
1078			driver = &sb16_audio_driver;
1079			break;
1080
1081		default:
1082			DDB(printk("Will use SB Pro driver\n"));
1083			audio_flags = DMA_AUTOMODE;
1084			driver = &sbpro_audio_driver;
1085	}
1086
1087	if (owner)
1088			driver->owner = owner;
1089
1090	if ((devc->dev = sound_install_audiodrv(AUDIO_DRIVER_VERSION,
1091				name,driver, sizeof(struct audio_driver),
1092				audio_flags, format_mask, devc,
1093				devc->dma8,
1094				devc->duplex ? devc->dma16 : devc->dma8)) < 0)
1095	{
1096		  printk(KERN_ERR "Sound Blaster:  unable to install audio.\n");
1097		  return;
1098	}
1099	audio_devs[devc->dev]->mixer_dev = devc->my_mixerdev;
1100	audio_devs[devc->dev]->min_fragment = 5;
1101}
1102