Linux Audio

Check our new training course

In-person Linux kernel drivers training

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