Linux Audio

Check our new training course

Loading...
v3.1
 
   1/*
   2 *  Driver for ESS Solo-1 (ES1938, ES1946, ES1969) soundcard
   3 *  Copyright (c) by Jaromir Koutek <miri@punknet.cz>,
   4 *                   Jaroslav Kysela <perex@perex.cz>,
   5 *                   Thomas Sailer <sailer@ife.ee.ethz.ch>,
   6 *                   Abramo Bagnara <abramo@alsa-project.org>,
   7 *                   Markus Gruber <gruber@eikon.tum.de>
   8 * 
   9 * Rewritten from sonicvibes.c source.
  10 *
  11 *  TODO:
  12 *    Rewrite better spinlocks
  13 *
  14 *
  15 *   This program is free software; you can redistribute it and/or modify
  16 *   it under the terms of the GNU General Public License as published by
  17 *   the Free Software Foundation; either version 2 of the License, or
  18 *   (at your option) any later version.
  19 *
  20 *   This program is distributed in the hope that it will be useful,
  21 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  22 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23 *   GNU General Public License for more details.
  24 *
  25 *   You should have received a copy of the GNU General Public License
  26 *   along with this program; if not, write to the Free Software
  27 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  28 *
  29 */
  30
  31/*
  32  NOTES:
  33  - Capture data is written unaligned starting from dma_base + 1 so I need to
  34    disable mmap and to add a copy callback.
  35  - After several cycle of the following:
  36    while : ; do arecord -d1 -f cd -t raw | aplay -f cd ; done
  37    a "playback write error (DMA or IRQ trouble?)" may happen.
  38    This is due to playback interrupts not generated.
  39    I suspect a timing issue.
  40  - Sometimes the interrupt handler is invoked wrongly during playback.
  41    This generates some harmless "Unexpected hw_pointer: wrong interrupt
  42    acknowledge".
  43    I've seen that using small period sizes.
  44    Reproducible with:
  45    mpg123 test.mp3 &
  46    hdparm -t -T /dev/hda
  47*/
  48
  49
  50#include <linux/init.h>
  51#include <linux/interrupt.h>
  52#include <linux/pci.h>
  53#include <linux/slab.h>
  54#include <linux/gameport.h>
  55#include <linux/moduleparam.h>
  56#include <linux/delay.h>
  57#include <linux/dma-mapping.h>
 
  58#include <sound/core.h>
  59#include <sound/control.h>
  60#include <sound/pcm.h>
  61#include <sound/opl3.h>
  62#include <sound/mpu401.h>
  63#include <sound/initval.h>
  64#include <sound/tlv.h>
  65
  66#include <asm/io.h>
  67
  68MODULE_AUTHOR("Jaromir Koutek <miri@punknet.cz>");
  69MODULE_DESCRIPTION("ESS Solo-1");
  70MODULE_LICENSE("GPL");
  71MODULE_SUPPORTED_DEVICE("{{ESS,ES1938},"
  72                "{ESS,ES1946},"
  73                "{ESS,ES1969},"
  74		"{TerraTec,128i PCI}}");
  75
  76#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
  77#define SUPPORT_JOYSTICK 1
  78#endif
  79
  80static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
  81static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
  82static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
  83
  84module_param_array(index, int, NULL, 0444);
  85MODULE_PARM_DESC(index, "Index value for ESS Solo-1 soundcard.");
  86module_param_array(id, charp, NULL, 0444);
  87MODULE_PARM_DESC(id, "ID string for ESS Solo-1 soundcard.");
  88module_param_array(enable, bool, NULL, 0444);
  89MODULE_PARM_DESC(enable, "Enable ESS Solo-1 soundcard.");
  90
  91#define SLIO_REG(chip, x) ((chip)->io_port + ESSIO_REG_##x)
  92
  93#define SLDM_REG(chip, x) ((chip)->ddma_port + ESSDM_REG_##x)
  94
  95#define SLSB_REG(chip, x) ((chip)->sb_port + ESSSB_REG_##x)
  96
  97#define SL_PCI_LEGACYCONTROL		0x40
  98#define SL_PCI_CONFIG			0x50
  99#define SL_PCI_DDMACONTROL		0x60
 100
 101#define ESSIO_REG_AUDIO2DMAADDR		0
 102#define ESSIO_REG_AUDIO2DMACOUNT	4
 103#define ESSIO_REG_AUDIO2MODE		6
 104#define ESSIO_REG_IRQCONTROL		7
 105
 106#define ESSDM_REG_DMAADDR		0x00
 107#define ESSDM_REG_DMACOUNT		0x04
 108#define ESSDM_REG_DMACOMMAND		0x08
 109#define ESSDM_REG_DMASTATUS		0x08
 110#define ESSDM_REG_DMAMODE		0x0b
 111#define ESSDM_REG_DMACLEAR		0x0d
 112#define ESSDM_REG_DMAMASK		0x0f
 113
 114#define ESSSB_REG_FMLOWADDR		0x00
 115#define ESSSB_REG_FMHIGHADDR		0x02
 116#define ESSSB_REG_MIXERADDR		0x04
 117#define ESSSB_REG_MIXERDATA		0x05
 118
 119#define ESSSB_IREG_AUDIO1		0x14
 120#define ESSSB_IREG_MICMIX		0x1a
 121#define ESSSB_IREG_RECSRC		0x1c
 122#define ESSSB_IREG_MASTER		0x32
 123#define ESSSB_IREG_FM			0x36
 124#define ESSSB_IREG_AUXACD		0x38
 125#define ESSSB_IREG_AUXB			0x3a
 126#define ESSSB_IREG_PCSPEAKER		0x3c
 127#define ESSSB_IREG_LINE			0x3e
 128#define ESSSB_IREG_SPATCONTROL		0x50
 129#define ESSSB_IREG_SPATLEVEL		0x52
 130#define ESSSB_IREG_MASTER_LEFT		0x60
 131#define ESSSB_IREG_MASTER_RIGHT		0x62
 132#define ESSSB_IREG_MPU401CONTROL	0x64
 133#define ESSSB_IREG_MICMIXRECORD		0x68
 134#define ESSSB_IREG_AUDIO2RECORD		0x69
 135#define ESSSB_IREG_AUXACDRECORD		0x6a
 136#define ESSSB_IREG_FMRECORD		0x6b
 137#define ESSSB_IREG_AUXBRECORD		0x6c
 138#define ESSSB_IREG_MONO			0x6d
 139#define ESSSB_IREG_LINERECORD		0x6e
 140#define ESSSB_IREG_MONORECORD		0x6f
 141#define ESSSB_IREG_AUDIO2SAMPLE		0x70
 142#define ESSSB_IREG_AUDIO2MODE		0x71
 143#define ESSSB_IREG_AUDIO2FILTER		0x72
 144#define ESSSB_IREG_AUDIO2TCOUNTL	0x74
 145#define ESSSB_IREG_AUDIO2TCOUNTH	0x76
 146#define ESSSB_IREG_AUDIO2CONTROL1	0x78
 147#define ESSSB_IREG_AUDIO2CONTROL2	0x7a
 148#define ESSSB_IREG_AUDIO2		0x7c
 149
 150#define ESSSB_REG_RESET			0x06
 151
 152#define ESSSB_REG_READDATA		0x0a
 153#define ESSSB_REG_WRITEDATA		0x0c
 154#define ESSSB_REG_READSTATUS		0x0c
 155
 156#define ESSSB_REG_STATUS		0x0e
 157
 158#define ESS_CMD_EXTSAMPLERATE		0xa1
 159#define ESS_CMD_FILTERDIV		0xa2
 160#define ESS_CMD_DMACNTRELOADL		0xa4
 161#define ESS_CMD_DMACNTRELOADH		0xa5
 162#define ESS_CMD_ANALOGCONTROL		0xa8
 163#define ESS_CMD_IRQCONTROL		0xb1
 164#define ESS_CMD_DRQCONTROL		0xb2
 165#define ESS_CMD_RECLEVEL		0xb4
 166#define ESS_CMD_SETFORMAT		0xb6
 167#define ESS_CMD_SETFORMAT2		0xb7
 168#define ESS_CMD_DMACONTROL		0xb8
 169#define ESS_CMD_DMATYPE			0xb9
 170#define ESS_CMD_OFFSETLEFT		0xba	
 171#define ESS_CMD_OFFSETRIGHT		0xbb
 172#define ESS_CMD_READREG			0xc0
 173#define ESS_CMD_ENABLEEXT		0xc6
 174#define ESS_CMD_PAUSEDMA		0xd0
 175#define ESS_CMD_ENABLEAUDIO1		0xd1
 176#define ESS_CMD_STOPAUDIO1		0xd3
 177#define ESS_CMD_AUDIO1STATUS		0xd8
 178#define ESS_CMD_CONTDMA			0xd4
 179#define ESS_CMD_TESTIRQ			0xf2
 180
 181#define ESS_RECSRC_MIC		0
 182#define ESS_RECSRC_AUXACD	2
 183#define ESS_RECSRC_AUXB		5
 184#define ESS_RECSRC_LINE		6
 185#define ESS_RECSRC_NONE		7
 186
 187#define DAC1 0x01
 188#define ADC1 0x02
 189#define DAC2 0x04
 190
 191/*
 192
 193 */
 194
 195#define SAVED_REG_SIZE	32 /* max. number of registers to save */
 196
 197struct es1938 {
 198	int irq;
 199
 200	unsigned long io_port;
 201	unsigned long sb_port;
 202	unsigned long vc_port;
 203	unsigned long mpu_port;
 204	unsigned long game_port;
 205	unsigned long ddma_port;
 206
 207	unsigned char irqmask;
 208	unsigned char revision;
 209
 210	struct snd_kcontrol *hw_volume;
 211	struct snd_kcontrol *hw_switch;
 212	struct snd_kcontrol *master_volume;
 213	struct snd_kcontrol *master_switch;
 214
 215	struct pci_dev *pci;
 216	struct snd_card *card;
 217	struct snd_pcm *pcm;
 218	struct snd_pcm_substream *capture_substream;
 219	struct snd_pcm_substream *playback1_substream;
 220	struct snd_pcm_substream *playback2_substream;
 221	struct snd_rawmidi *rmidi;
 222
 223	unsigned int dma1_size;
 224	unsigned int dma2_size;
 225	unsigned int dma1_start;
 226	unsigned int dma2_start;
 227	unsigned int dma1_shift;
 228	unsigned int dma2_shift;
 229	unsigned int last_capture_dmaaddr;
 230	unsigned int active;
 231
 232	spinlock_t reg_lock;
 233	spinlock_t mixer_lock;
 234        struct snd_info_entry *proc_entry;
 235
 236#ifdef SUPPORT_JOYSTICK
 237	struct gameport *gameport;
 238#endif
 239#ifdef CONFIG_PM
 240	unsigned char saved_regs[SAVED_REG_SIZE];
 241#endif
 242};
 243
 244static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id);
 245
 246static DEFINE_PCI_DEVICE_TABLE(snd_es1938_ids) = {
 247	{ PCI_VDEVICE(ESS, 0x1969), 0, },   /* Solo-1 */
 248	{ 0, }
 249};
 250
 251MODULE_DEVICE_TABLE(pci, snd_es1938_ids);
 252
 253#define RESET_LOOP_TIMEOUT	0x10000
 254#define WRITE_LOOP_TIMEOUT	0x10000
 255#define GET_LOOP_TIMEOUT	0x01000
 256
 257#undef REG_DEBUG
 258/* -----------------------------------------------------------------
 259 * Write to a mixer register
 260 * -----------------------------------------------------------------*/
 261static void snd_es1938_mixer_write(struct es1938 *chip, unsigned char reg, unsigned char val)
 262{
 263	unsigned long flags;
 264	spin_lock_irqsave(&chip->mixer_lock, flags);
 265	outb(reg, SLSB_REG(chip, MIXERADDR));
 266	outb(val, SLSB_REG(chip, MIXERDATA));
 267	spin_unlock_irqrestore(&chip->mixer_lock, flags);
 268#ifdef REG_DEBUG
 269	snd_printk(KERN_DEBUG "Mixer reg %02x set to %02x\n", reg, val);
 270#endif
 271}
 272
 273/* -----------------------------------------------------------------
 274 * Read from a mixer register
 275 * -----------------------------------------------------------------*/
 276static int snd_es1938_mixer_read(struct es1938 *chip, unsigned char reg)
 277{
 278	int data;
 279	unsigned long flags;
 280	spin_lock_irqsave(&chip->mixer_lock, flags);
 281	outb(reg, SLSB_REG(chip, MIXERADDR));
 282	data = inb(SLSB_REG(chip, MIXERDATA));
 283	spin_unlock_irqrestore(&chip->mixer_lock, flags);
 284#ifdef REG_DEBUG
 285	snd_printk(KERN_DEBUG "Mixer reg %02x now is %02x\n", reg, data);
 286#endif
 287	return data;
 288}
 289
 290/* -----------------------------------------------------------------
 291 * Write to some bits of a mixer register (return old value)
 292 * -----------------------------------------------------------------*/
 293static int snd_es1938_mixer_bits(struct es1938 *chip, unsigned char reg,
 294				 unsigned char mask, unsigned char val)
 295{
 296	unsigned long flags;
 297	unsigned char old, new, oval;
 298	spin_lock_irqsave(&chip->mixer_lock, flags);
 299	outb(reg, SLSB_REG(chip, MIXERADDR));
 300	old = inb(SLSB_REG(chip, MIXERDATA));
 301	oval = old & mask;
 302	if (val != oval) {
 303		new = (old & ~mask) | (val & mask);
 304		outb(new, SLSB_REG(chip, MIXERDATA));
 305#ifdef REG_DEBUG
 306		snd_printk(KERN_DEBUG "Mixer reg %02x was %02x, set to %02x\n",
 307			   reg, old, new);
 308#endif
 309	}
 310	spin_unlock_irqrestore(&chip->mixer_lock, flags);
 311	return oval;
 312}
 313
 314/* -----------------------------------------------------------------
 315 * Write command to Controller Registers
 316 * -----------------------------------------------------------------*/
 317static void snd_es1938_write_cmd(struct es1938 *chip, unsigned char cmd)
 318{
 319	int i;
 320	unsigned char v;
 321	for (i = 0; i < WRITE_LOOP_TIMEOUT; i++) {
 322		if (!(v = inb(SLSB_REG(chip, READSTATUS)) & 0x80)) {
 
 323			outb(cmd, SLSB_REG(chip, WRITEDATA));
 324			return;
 325		}
 326	}
 327	printk(KERN_ERR "snd_es1938_write_cmd timeout (0x02%x/0x02%x)\n", cmd, v);
 
 328}
 329
 330/* -----------------------------------------------------------------
 331 * Read the Read Data Buffer
 332 * -----------------------------------------------------------------*/
 333static int snd_es1938_get_byte(struct es1938 *chip)
 334{
 335	int i;
 336	unsigned char v;
 337	for (i = GET_LOOP_TIMEOUT; i; i--)
 338		if ((v = inb(SLSB_REG(chip, STATUS))) & 0x80)
 
 339			return inb(SLSB_REG(chip, READDATA));
 340	snd_printk(KERN_ERR "get_byte timeout: status 0x02%x\n", v);
 
 341	return -ENODEV;
 342}
 343
 344/* -----------------------------------------------------------------
 345 * Write value cmd register
 346 * -----------------------------------------------------------------*/
 347static void snd_es1938_write(struct es1938 *chip, unsigned char reg, unsigned char val)
 348{
 349	unsigned long flags;
 350	spin_lock_irqsave(&chip->reg_lock, flags);
 351	snd_es1938_write_cmd(chip, reg);
 352	snd_es1938_write_cmd(chip, val);
 353	spin_unlock_irqrestore(&chip->reg_lock, flags);
 354#ifdef REG_DEBUG
 355	snd_printk(KERN_DEBUG "Reg %02x set to %02x\n", reg, val);
 356#endif
 357}
 358
 359/* -----------------------------------------------------------------
 360 * Read data from cmd register and return it
 361 * -----------------------------------------------------------------*/
 362static unsigned char snd_es1938_read(struct es1938 *chip, unsigned char reg)
 363{
 364	unsigned char val;
 365	unsigned long flags;
 366	spin_lock_irqsave(&chip->reg_lock, flags);
 367	snd_es1938_write_cmd(chip, ESS_CMD_READREG);
 368	snd_es1938_write_cmd(chip, reg);
 369	val = snd_es1938_get_byte(chip);
 370	spin_unlock_irqrestore(&chip->reg_lock, flags);
 371#ifdef REG_DEBUG
 372	snd_printk(KERN_DEBUG "Reg %02x now is %02x\n", reg, val);
 373#endif
 374	return val;
 375}
 376
 377/* -----------------------------------------------------------------
 378 * Write data to cmd register and return old value
 379 * -----------------------------------------------------------------*/
 380static int snd_es1938_bits(struct es1938 *chip, unsigned char reg, unsigned char mask,
 381			   unsigned char val)
 382{
 383	unsigned long flags;
 384	unsigned char old, new, oval;
 385	spin_lock_irqsave(&chip->reg_lock, flags);
 386	snd_es1938_write_cmd(chip, ESS_CMD_READREG);
 387	snd_es1938_write_cmd(chip, reg);
 388	old = snd_es1938_get_byte(chip);
 389	oval = old & mask;
 390	if (val != oval) {
 391		snd_es1938_write_cmd(chip, reg);
 392		new = (old & ~mask) | (val & mask);
 393		snd_es1938_write_cmd(chip, new);
 394#ifdef REG_DEBUG
 395		snd_printk(KERN_DEBUG "Reg %02x was %02x, set to %02x\n",
 396			   reg, old, new);
 397#endif
 398	}
 399	spin_unlock_irqrestore(&chip->reg_lock, flags);
 400	return oval;
 401}
 402
 403/* --------------------------------------------------------------------
 404 * Reset the chip
 405 * --------------------------------------------------------------------*/
 406static void snd_es1938_reset(struct es1938 *chip)
 407{
 408	int i;
 409
 410	outb(3, SLSB_REG(chip, RESET));
 411	inb(SLSB_REG(chip, RESET));
 412	outb(0, SLSB_REG(chip, RESET));
 413	for (i = 0; i < RESET_LOOP_TIMEOUT; i++) {
 414		if (inb(SLSB_REG(chip, STATUS)) & 0x80) {
 415			if (inb(SLSB_REG(chip, READDATA)) == 0xaa)
 416				goto __next;
 417		}
 418	}
 419	snd_printk(KERN_ERR "ESS Solo-1 reset failed\n");
 420
 421     __next:
 422	snd_es1938_write_cmd(chip, ESS_CMD_ENABLEEXT);
 423
 424	/* Demand transfer DMA: 4 bytes per DMA request */
 425	snd_es1938_write(chip, ESS_CMD_DMATYPE, 2);
 426
 427	/* Change behaviour of register A1
 428	   4x oversampling
 429	   2nd channel DAC asynchronous */                                                      
 430	snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2MODE, 0x32);
 431	/* enable/select DMA channel and IRQ channel */
 432	snd_es1938_bits(chip, ESS_CMD_IRQCONTROL, 0xf0, 0x50);
 433	snd_es1938_bits(chip, ESS_CMD_DRQCONTROL, 0xf0, 0x50);
 434	snd_es1938_write_cmd(chip, ESS_CMD_ENABLEAUDIO1);
 435	/* Set spatializer parameters to recommended values */
 436	snd_es1938_mixer_write(chip, 0x54, 0x8f);
 437	snd_es1938_mixer_write(chip, 0x56, 0x95);
 438	snd_es1938_mixer_write(chip, 0x58, 0x94);
 439	snd_es1938_mixer_write(chip, 0x5a, 0x80);
 440}
 441
 442/* --------------------------------------------------------------------
 443 * Reset the FIFOs
 444 * --------------------------------------------------------------------*/
 445static void snd_es1938_reset_fifo(struct es1938 *chip)
 446{
 447	outb(2, SLSB_REG(chip, RESET));
 448	outb(0, SLSB_REG(chip, RESET));
 449}
 450
 451static struct snd_ratnum clocks[2] = {
 452	{
 453		.num = 793800,
 454		.den_min = 1,
 455		.den_max = 128,
 456		.den_step = 1,
 457	},
 458	{
 459		.num = 768000,
 460		.den_min = 1,
 461		.den_max = 128,
 462		.den_step = 1,
 463	}
 464};
 465
 466static struct snd_pcm_hw_constraint_ratnums hw_constraints_clocks = {
 467	.nrats = 2,
 468	.rats = clocks,
 469};
 470
 471
 472static void snd_es1938_rate_set(struct es1938 *chip, 
 473				struct snd_pcm_substream *substream,
 474				int mode)
 475{
 476	unsigned int bits, div0;
 477	struct snd_pcm_runtime *runtime = substream->runtime;
 478	if (runtime->rate_num == clocks[0].num)
 479		bits = 128 - runtime->rate_den;
 480	else
 481		bits = 256 - runtime->rate_den;
 482
 483	/* set filter register */
 484	div0 = 256 - 7160000*20/(8*82*runtime->rate);
 485		
 486	if (mode == DAC2) {
 487		snd_es1938_mixer_write(chip, 0x70, bits);
 488		snd_es1938_mixer_write(chip, 0x72, div0);
 489	} else {
 490		snd_es1938_write(chip, 0xA1, bits);
 491		snd_es1938_write(chip, 0xA2, div0);
 492	}
 493}
 494
 495/* --------------------------------------------------------------------
 496 * Configure Solo1 builtin DMA Controller
 497 * --------------------------------------------------------------------*/
 498
 499static void snd_es1938_playback1_setdma(struct es1938 *chip)
 500{
 501	outb(0x00, SLIO_REG(chip, AUDIO2MODE));
 502	outl(chip->dma2_start, SLIO_REG(chip, AUDIO2DMAADDR));
 503	outw(0, SLIO_REG(chip, AUDIO2DMACOUNT));
 504	outw(chip->dma2_size, SLIO_REG(chip, AUDIO2DMACOUNT));
 505}
 506
 507static void snd_es1938_playback2_setdma(struct es1938 *chip)
 508{
 509	/* Enable DMA controller */
 510	outb(0xc4, SLDM_REG(chip, DMACOMMAND));
 511	/* 1. Master reset */
 512	outb(0, SLDM_REG(chip, DMACLEAR));
 513	/* 2. Mask DMA */
 514	outb(1, SLDM_REG(chip, DMAMASK));
 515	outb(0x18, SLDM_REG(chip, DMAMODE));
 516	outl(chip->dma1_start, SLDM_REG(chip, DMAADDR));
 517	outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT));
 518	/* 3. Unmask DMA */
 519	outb(0, SLDM_REG(chip, DMAMASK));
 520}
 521
 522static void snd_es1938_capture_setdma(struct es1938 *chip)
 523{
 524	/* Enable DMA controller */
 525	outb(0xc4, SLDM_REG(chip, DMACOMMAND));
 526	/* 1. Master reset */
 527	outb(0, SLDM_REG(chip, DMACLEAR));
 528	/* 2. Mask DMA */
 529	outb(1, SLDM_REG(chip, DMAMASK));
 530	outb(0x14, SLDM_REG(chip, DMAMODE));
 531	outl(chip->dma1_start, SLDM_REG(chip, DMAADDR));
 532	chip->last_capture_dmaaddr = chip->dma1_start;
 533	outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT));
 534	/* 3. Unmask DMA */
 535	outb(0, SLDM_REG(chip, DMAMASK));
 536}
 537
 538/* ----------------------------------------------------------------------
 539 *
 540 *                           *** PCM part ***
 541 */
 542
 543static int snd_es1938_capture_trigger(struct snd_pcm_substream *substream,
 544				      int cmd)
 545{
 546	struct es1938 *chip = snd_pcm_substream_chip(substream);
 547	int val;
 548	switch (cmd) {
 549	case SNDRV_PCM_TRIGGER_START:
 550	case SNDRV_PCM_TRIGGER_RESUME:
 551		val = 0x0f;
 552		chip->active |= ADC1;
 553		break;
 554	case SNDRV_PCM_TRIGGER_STOP:
 555	case SNDRV_PCM_TRIGGER_SUSPEND:
 556		val = 0x00;
 557		chip->active &= ~ADC1;
 558		break;
 559	default:
 560		return -EINVAL;
 561	}
 562	snd_es1938_write(chip, ESS_CMD_DMACONTROL, val);
 563	return 0;
 564}
 565
 566static int snd_es1938_playback1_trigger(struct snd_pcm_substream *substream,
 567					int cmd)
 568{
 569	struct es1938 *chip = snd_pcm_substream_chip(substream);
 570	switch (cmd) {
 571	case SNDRV_PCM_TRIGGER_START:
 572	case SNDRV_PCM_TRIGGER_RESUME:
 573		/* According to the documentation this should be:
 574		   0x13 but that value may randomly swap stereo channels */
 575                snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0x92);
 576                udelay(10);
 577		snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0x93);
 578                /* This two stage init gives the FIFO -> DAC connection time to
 579                 * settle before first data from DMA flows in.  This should ensure
 580                 * no swapping of stereo channels.  Report a bug if otherwise :-) */
 581		outb(0x0a, SLIO_REG(chip, AUDIO2MODE));
 582		chip->active |= DAC2;
 583		break;
 584	case SNDRV_PCM_TRIGGER_STOP:
 585	case SNDRV_PCM_TRIGGER_SUSPEND:
 586		outb(0, SLIO_REG(chip, AUDIO2MODE));
 587		snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0);
 588		chip->active &= ~DAC2;
 589		break;
 590	default:
 591		return -EINVAL;
 592	}
 593	return 0;
 594}
 595
 596static int snd_es1938_playback2_trigger(struct snd_pcm_substream *substream,
 597					int cmd)
 598{
 599	struct es1938 *chip = snd_pcm_substream_chip(substream);
 600	int val;
 601	switch (cmd) {
 602	case SNDRV_PCM_TRIGGER_START:
 603	case SNDRV_PCM_TRIGGER_RESUME:
 604		val = 5;
 605		chip->active |= DAC1;
 606		break;
 607	case SNDRV_PCM_TRIGGER_STOP:
 608	case SNDRV_PCM_TRIGGER_SUSPEND:
 609		val = 0;
 610		chip->active &= ~DAC1;
 611		break;
 612	default:
 613		return -EINVAL;
 614	}
 615	snd_es1938_write(chip, ESS_CMD_DMACONTROL, val);
 616	return 0;
 617}
 618
 619static int snd_es1938_playback_trigger(struct snd_pcm_substream *substream,
 620				       int cmd)
 621{
 622	switch (substream->number) {
 623	case 0:
 624		return snd_es1938_playback1_trigger(substream, cmd);
 625	case 1:
 626		return snd_es1938_playback2_trigger(substream, cmd);
 627	}
 628	snd_BUG();
 629	return -EINVAL;
 630}
 631
 632/* --------------------------------------------------------------------
 633 * First channel for Extended Mode Audio 1 ADC Operation
 634 * --------------------------------------------------------------------*/
 635static int snd_es1938_capture_prepare(struct snd_pcm_substream *substream)
 636{
 637	struct es1938 *chip = snd_pcm_substream_chip(substream);
 638	struct snd_pcm_runtime *runtime = substream->runtime;
 639	int u, is8, mono;
 640	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
 641	unsigned int count = snd_pcm_lib_period_bytes(substream);
 642
 643	chip->dma1_size = size;
 644	chip->dma1_start = runtime->dma_addr;
 645
 646	mono = (runtime->channels > 1) ? 0 : 1;
 647	is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1;
 648	u = snd_pcm_format_unsigned(runtime->format);
 649
 650	chip->dma1_shift = 2 - mono - is8;
 651
 652	snd_es1938_reset_fifo(chip);
 653	
 654	/* program type */
 655	snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1));
 656
 657	/* set clock and counters */
 658        snd_es1938_rate_set(chip, substream, ADC1);
 659
 660	count = 0x10000 - count;
 661	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADL, count & 0xff);
 662	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADH, count >> 8);
 663
 664	/* initialize and configure ADC */
 665	snd_es1938_write(chip, ESS_CMD_SETFORMAT2, u ? 0x51 : 0x71);
 666	snd_es1938_write(chip, ESS_CMD_SETFORMAT2, 0x90 | 
 667		       (u ? 0x00 : 0x20) | 
 668		       (is8 ? 0x00 : 0x04) | 
 669		       (mono ? 0x40 : 0x08));
 670
 671	//	snd_es1938_reset_fifo(chip);	
 672
 673	/* 11. configure system interrupt controller and DMA controller */
 674	snd_es1938_capture_setdma(chip);
 675
 676	return 0;
 677}
 678
 679
 680/* ------------------------------------------------------------------------------
 681 * Second Audio channel DAC Operation
 682 * ------------------------------------------------------------------------------*/
 683static int snd_es1938_playback1_prepare(struct snd_pcm_substream *substream)
 684{
 685	struct es1938 *chip = snd_pcm_substream_chip(substream);
 686	struct snd_pcm_runtime *runtime = substream->runtime;
 687	int u, is8, mono;
 688	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
 689	unsigned int count = snd_pcm_lib_period_bytes(substream);
 690
 691	chip->dma2_size = size;
 692	chip->dma2_start = runtime->dma_addr;
 693
 694	mono = (runtime->channels > 1) ? 0 : 1;
 695	is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1;
 696	u = snd_pcm_format_unsigned(runtime->format);
 697
 698	chip->dma2_shift = 2 - mono - is8;
 699
 700        snd_es1938_reset_fifo(chip);
 701
 702	/* set clock and counters */
 703        snd_es1938_rate_set(chip, substream, DAC2);
 704
 705	count >>= 1;
 706	count = 0x10000 - count;
 707	snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2TCOUNTL, count & 0xff);
 708	snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2TCOUNTH, count >> 8);
 709
 710	/* initialize and configure Audio 2 DAC */
 711	snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x40 | (u ? 0 : 4) |
 712			       (mono ? 0 : 2) | (is8 ? 0 : 1));
 713
 714	/* program DMA */
 715	snd_es1938_playback1_setdma(chip);
 716	
 717	return 0;
 718}
 719
 720static int snd_es1938_playback2_prepare(struct snd_pcm_substream *substream)
 721{
 722	struct es1938 *chip = snd_pcm_substream_chip(substream);
 723	struct snd_pcm_runtime *runtime = substream->runtime;
 724	int u, is8, mono;
 725	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
 726	unsigned int count = snd_pcm_lib_period_bytes(substream);
 727
 728	chip->dma1_size = size;
 729	chip->dma1_start = runtime->dma_addr;
 730
 731	mono = (runtime->channels > 1) ? 0 : 1;
 732	is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1;
 733	u = snd_pcm_format_unsigned(runtime->format);
 734
 735	chip->dma1_shift = 2 - mono - is8;
 736
 737	count = 0x10000 - count;
 738 
 739	/* reset */
 740	snd_es1938_reset_fifo(chip);
 741	
 742	snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1));
 743
 744	/* set clock and counters */
 745        snd_es1938_rate_set(chip, substream, DAC1);
 746	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADL, count & 0xff);
 747	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADH, count >> 8);
 748
 749	/* initialized and configure DAC */
 750        snd_es1938_write(chip, ESS_CMD_SETFORMAT, u ? 0x80 : 0x00);
 751        snd_es1938_write(chip, ESS_CMD_SETFORMAT, u ? 0x51 : 0x71);
 752        snd_es1938_write(chip, ESS_CMD_SETFORMAT2, 
 753			 0x90 | (mono ? 0x40 : 0x08) |
 754			 (is8 ? 0x00 : 0x04) | (u ? 0x00 : 0x20));
 755
 756	/* program DMA */
 757	snd_es1938_playback2_setdma(chip);
 758	
 759	return 0;
 760}
 761
 762static int snd_es1938_playback_prepare(struct snd_pcm_substream *substream)
 763{
 764	switch (substream->number) {
 765	case 0:
 766		return snd_es1938_playback1_prepare(substream);
 767	case 1:
 768		return snd_es1938_playback2_prepare(substream);
 769	}
 770	snd_BUG();
 771	return -EINVAL;
 772}
 773
 774/* during the incrementing of dma counters the DMA register reads sometimes
 775   returns garbage. To ensure a valid hw pointer, the following checks which
 776   should be very unlikely to fail are used:
 777   - is the current DMA address in the valid DMA range ?
 778   - is the sum of DMA address and DMA counter pointing to the last DMA byte ?
 779   One can argue this could differ by one byte depending on which register is
 780   updated first, so the implementation below allows for that.
 781*/
 782static snd_pcm_uframes_t snd_es1938_capture_pointer(struct snd_pcm_substream *substream)
 783{
 784	struct es1938 *chip = snd_pcm_substream_chip(substream);
 785	size_t ptr;
 786#if 0
 787	size_t old, new;
 788	/* This stuff is *needed*, don't ask why - AB */
 789	old = inw(SLDM_REG(chip, DMACOUNT));
 790	while ((new = inw(SLDM_REG(chip, DMACOUNT))) != old)
 791		old = new;
 792	ptr = chip->dma1_size - 1 - new;
 793#else
 794	size_t count;
 795	unsigned int diff;
 796
 797	ptr = inl(SLDM_REG(chip, DMAADDR));
 798	count = inw(SLDM_REG(chip, DMACOUNT));
 799	diff = chip->dma1_start + chip->dma1_size - ptr - count;
 800
 801	if (diff > 3 || ptr < chip->dma1_start
 802	      || ptr >= chip->dma1_start+chip->dma1_size)
 803	  ptr = chip->last_capture_dmaaddr;            /* bad, use last saved */
 804	else
 805	  chip->last_capture_dmaaddr = ptr;            /* good, remember it */
 806
 807	ptr -= chip->dma1_start;
 808#endif
 809	return ptr >> chip->dma1_shift;
 810}
 811
 812static snd_pcm_uframes_t snd_es1938_playback1_pointer(struct snd_pcm_substream *substream)
 813{
 814	struct es1938 *chip = snd_pcm_substream_chip(substream);
 815	size_t ptr;
 816#if 1
 817	ptr = chip->dma2_size - inw(SLIO_REG(chip, AUDIO2DMACOUNT));
 818#else
 819	ptr = inl(SLIO_REG(chip, AUDIO2DMAADDR)) - chip->dma2_start;
 820#endif
 821	return ptr >> chip->dma2_shift;
 822}
 823
 824static snd_pcm_uframes_t snd_es1938_playback2_pointer(struct snd_pcm_substream *substream)
 825{
 826	struct es1938 *chip = snd_pcm_substream_chip(substream);
 827	size_t ptr;
 828	size_t old, new;
 829#if 1
 830	/* This stuff is *needed*, don't ask why - AB */
 831	old = inw(SLDM_REG(chip, DMACOUNT));
 832	while ((new = inw(SLDM_REG(chip, DMACOUNT))) != old)
 833		old = new;
 834	ptr = chip->dma1_size - 1 - new;
 835#else
 836	ptr = inl(SLDM_REG(chip, DMAADDR)) - chip->dma1_start;
 837#endif
 838	return ptr >> chip->dma1_shift;
 839}
 840
 841static snd_pcm_uframes_t snd_es1938_playback_pointer(struct snd_pcm_substream *substream)
 842{
 843	switch (substream->number) {
 844	case 0:
 845		return snd_es1938_playback1_pointer(substream);
 846	case 1:
 847		return snd_es1938_playback2_pointer(substream);
 848	}
 849	snd_BUG();
 850	return -EINVAL;
 851}
 852
 853static int snd_es1938_capture_copy(struct snd_pcm_substream *substream,
 854				   int channel,
 855				   snd_pcm_uframes_t pos,
 856				   void __user *dst,
 857				   snd_pcm_uframes_t count)
 858{
 859	struct snd_pcm_runtime *runtime = substream->runtime;
 860	struct es1938 *chip = snd_pcm_substream_chip(substream);
 861	pos <<= chip->dma1_shift;
 862	count <<= chip->dma1_shift;
 863	if (snd_BUG_ON(pos + count > chip->dma1_size))
 864		return -EINVAL;
 865	if (pos + count < chip->dma1_size) {
 866		if (copy_to_user(dst, runtime->dma_area + pos + 1, count))
 867			return -EFAULT;
 868	} else {
 869		if (copy_to_user(dst, runtime->dma_area + pos + 1, count - 1))
 870			return -EFAULT;
 871		if (put_user(runtime->dma_area[0], ((unsigned char __user *)dst) + count - 1))
 872			return -EFAULT;
 873	}
 874	return 0;
 875}
 876
 877/*
 878 * buffer management
 879 */
 880static int snd_es1938_pcm_hw_params(struct snd_pcm_substream *substream,
 881				    struct snd_pcm_hw_params *hw_params)
 882
 883{
 884	int err;
 885
 886	if ((err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params))) < 0)
 887		return err;
 888	return 0;
 889}
 890
 891static int snd_es1938_pcm_hw_free(struct snd_pcm_substream *substream)
 892{
 893	return snd_pcm_lib_free_pages(substream);
 894}
 895
 896/* ----------------------------------------------------------------------
 897 * Audio1 Capture (ADC)
 898 * ----------------------------------------------------------------------*/
 899static struct snd_pcm_hardware snd_es1938_capture =
 900{
 901	.info =			(SNDRV_PCM_INFO_INTERLEAVED |
 902				SNDRV_PCM_INFO_BLOCK_TRANSFER),
 903	.formats =		(SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE |
 904				 SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE),
 905	.rates =		SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
 906	.rate_min =		6000,
 907	.rate_max =		48000,
 908	.channels_min =		1,
 909	.channels_max =		2,
 910        .buffer_bytes_max =	0x8000,       /* DMA controller screws on higher values */
 911	.period_bytes_min =	64,
 912	.period_bytes_max =	0x8000,
 913	.periods_min =		1,
 914	.periods_max =		1024,
 915	.fifo_size =		256,
 916};
 917
 918/* -----------------------------------------------------------------------
 919 * Audio2 Playback (DAC)
 920 * -----------------------------------------------------------------------*/
 921static struct snd_pcm_hardware snd_es1938_playback =
 922{
 923	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
 924				 SNDRV_PCM_INFO_BLOCK_TRANSFER |
 925				 SNDRV_PCM_INFO_MMAP_VALID),
 926	.formats =		(SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE |
 927				 SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE),
 928	.rates =		SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
 929	.rate_min =		6000,
 930	.rate_max =		48000,
 931	.channels_min =		1,
 932	.channels_max =		2,
 933        .buffer_bytes_max =	0x8000,       /* DMA controller screws on higher values */
 934	.period_bytes_min =	64,
 935	.period_bytes_max =	0x8000,
 936	.periods_min =		1,
 937	.periods_max =		1024,
 938	.fifo_size =		256,
 939};
 940
 941static int snd_es1938_capture_open(struct snd_pcm_substream *substream)
 942{
 943	struct es1938 *chip = snd_pcm_substream_chip(substream);
 944	struct snd_pcm_runtime *runtime = substream->runtime;
 945
 946	if (chip->playback2_substream)
 947		return -EAGAIN;
 948	chip->capture_substream = substream;
 949	runtime->hw = snd_es1938_capture;
 950	snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
 951				      &hw_constraints_clocks);
 952	snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 0, 0xff00);
 953	return 0;
 954}
 955
 956static int snd_es1938_playback_open(struct snd_pcm_substream *substream)
 957{
 958	struct es1938 *chip = snd_pcm_substream_chip(substream);
 959	struct snd_pcm_runtime *runtime = substream->runtime;
 960
 961	switch (substream->number) {
 962	case 0:
 963		chip->playback1_substream = substream;
 964		break;
 965	case 1:
 966		if (chip->capture_substream)
 967			return -EAGAIN;
 968		chip->playback2_substream = substream;
 969		break;
 970	default:
 971		snd_BUG();
 972		return -EINVAL;
 973	}
 974	runtime->hw = snd_es1938_playback;
 975	snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
 976				      &hw_constraints_clocks);
 977	snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 0, 0xff00);
 978	return 0;
 979}
 980
 981static int snd_es1938_capture_close(struct snd_pcm_substream *substream)
 982{
 983	struct es1938 *chip = snd_pcm_substream_chip(substream);
 984
 985	chip->capture_substream = NULL;
 986	return 0;
 987}
 988
 989static int snd_es1938_playback_close(struct snd_pcm_substream *substream)
 990{
 991	struct es1938 *chip = snd_pcm_substream_chip(substream);
 992
 993	switch (substream->number) {
 994	case 0:
 995		chip->playback1_substream = NULL;
 996		break;
 997	case 1:
 998		chip->playback2_substream = NULL;
 999		break;
1000	default:
1001		snd_BUG();
1002		return -EINVAL;
1003	}
1004	return 0;
1005}
1006
1007static struct snd_pcm_ops snd_es1938_playback_ops = {
1008	.open =		snd_es1938_playback_open,
1009	.close =	snd_es1938_playback_close,
1010	.ioctl =	snd_pcm_lib_ioctl,
1011	.hw_params =	snd_es1938_pcm_hw_params,
1012	.hw_free =	snd_es1938_pcm_hw_free,
1013	.prepare =	snd_es1938_playback_prepare,
1014	.trigger =	snd_es1938_playback_trigger,
1015	.pointer =	snd_es1938_playback_pointer,
1016};
1017
1018static struct snd_pcm_ops snd_es1938_capture_ops = {
1019	.open =		snd_es1938_capture_open,
1020	.close =	snd_es1938_capture_close,
1021	.ioctl =	snd_pcm_lib_ioctl,
1022	.hw_params =	snd_es1938_pcm_hw_params,
1023	.hw_free =	snd_es1938_pcm_hw_free,
1024	.prepare =	snd_es1938_capture_prepare,
1025	.trigger =	snd_es1938_capture_trigger,
1026	.pointer =	snd_es1938_capture_pointer,
1027	.copy =		snd_es1938_capture_copy,
1028};
1029
1030static int __devinit snd_es1938_new_pcm(struct es1938 *chip, int device)
1031{
1032	struct snd_pcm *pcm;
1033	int err;
1034
1035	if ((err = snd_pcm_new(chip->card, "es-1938-1946", device, 2, 1, &pcm)) < 0)
 
1036		return err;
1037	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_es1938_playback_ops);
1038	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_es1938_capture_ops);
1039	
1040	pcm->private_data = chip;
1041	pcm->info_flags = 0;
1042	strcpy(pcm->name, "ESS Solo-1");
1043
1044	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
1045					      snd_dma_pci_data(chip->pci), 64*1024, 64*1024);
1046
1047	chip->pcm = pcm;
1048	return 0;
1049}
1050
1051/* -------------------------------------------------------------------
1052 * 
1053 *                       *** Mixer part ***
1054 */
1055
1056static int snd_es1938_info_mux(struct snd_kcontrol *kcontrol,
1057			       struct snd_ctl_elem_info *uinfo)
1058{
1059	static char *texts[8] = {
1060		"Mic", "Mic Master", "CD", "AOUT",
1061		"Mic1", "Mix", "Line", "Master"
1062	};
1063
1064	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1065	uinfo->count = 1;
1066	uinfo->value.enumerated.items = 8;
1067	if (uinfo->value.enumerated.item > 7)
1068		uinfo->value.enumerated.item = 7;
1069	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
1070	return 0;
1071}
1072
1073static int snd_es1938_get_mux(struct snd_kcontrol *kcontrol,
1074			      struct snd_ctl_elem_value *ucontrol)
1075{
1076	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1077	ucontrol->value.enumerated.item[0] = snd_es1938_mixer_read(chip, 0x1c) & 0x07;
1078	return 0;
1079}
1080
1081static int snd_es1938_put_mux(struct snd_kcontrol *kcontrol,
1082			      struct snd_ctl_elem_value *ucontrol)
1083{
1084	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1085	unsigned char val = ucontrol->value.enumerated.item[0];
1086	
1087	if (val > 7)
1088		return -EINVAL;
1089	return snd_es1938_mixer_bits(chip, 0x1c, 0x07, val) != val;
1090}
1091
1092#define snd_es1938_info_spatializer_enable	snd_ctl_boolean_mono_info
1093
1094static int snd_es1938_get_spatializer_enable(struct snd_kcontrol *kcontrol,
1095					     struct snd_ctl_elem_value *ucontrol)
1096{
1097	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1098	unsigned char val = snd_es1938_mixer_read(chip, 0x50);
1099	ucontrol->value.integer.value[0] = !!(val & 8);
1100	return 0;
1101}
1102
1103static int snd_es1938_put_spatializer_enable(struct snd_kcontrol *kcontrol,
1104					     struct snd_ctl_elem_value *ucontrol)
1105{
1106	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1107	unsigned char oval, nval;
1108	int change;
1109	nval = ucontrol->value.integer.value[0] ? 0x0c : 0x04;
1110	oval = snd_es1938_mixer_read(chip, 0x50) & 0x0c;
1111	change = nval != oval;
1112	if (change) {
1113		snd_es1938_mixer_write(chip, 0x50, nval & ~0x04);
1114		snd_es1938_mixer_write(chip, 0x50, nval);
1115	}
1116	return change;
1117}
1118
1119static int snd_es1938_info_hw_volume(struct snd_kcontrol *kcontrol,
1120				     struct snd_ctl_elem_info *uinfo)
1121{
1122	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1123	uinfo->count = 2;
1124	uinfo->value.integer.min = 0;
1125	uinfo->value.integer.max = 63;
1126	return 0;
1127}
1128
1129static int snd_es1938_get_hw_volume(struct snd_kcontrol *kcontrol,
1130				    struct snd_ctl_elem_value *ucontrol)
1131{
1132	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1133	ucontrol->value.integer.value[0] = snd_es1938_mixer_read(chip, 0x61) & 0x3f;
1134	ucontrol->value.integer.value[1] = snd_es1938_mixer_read(chip, 0x63) & 0x3f;
1135	return 0;
1136}
1137
1138#define snd_es1938_info_hw_switch		snd_ctl_boolean_stereo_info
1139
1140static int snd_es1938_get_hw_switch(struct snd_kcontrol *kcontrol,
1141				    struct snd_ctl_elem_value *ucontrol)
1142{
1143	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1144	ucontrol->value.integer.value[0] = !(snd_es1938_mixer_read(chip, 0x61) & 0x40);
1145	ucontrol->value.integer.value[1] = !(snd_es1938_mixer_read(chip, 0x63) & 0x40);
1146	return 0;
1147}
1148
1149static void snd_es1938_hwv_free(struct snd_kcontrol *kcontrol)
1150{
1151	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1152	chip->master_volume = NULL;
1153	chip->master_switch = NULL;
1154	chip->hw_volume = NULL;
1155	chip->hw_switch = NULL;
1156}
1157
1158static int snd_es1938_reg_bits(struct es1938 *chip, unsigned char reg,
1159			       unsigned char mask, unsigned char val)
1160{
1161	if (reg < 0xa0)
1162		return snd_es1938_mixer_bits(chip, reg, mask, val);
1163	else
1164		return snd_es1938_bits(chip, reg, mask, val);
1165}
1166
1167static int snd_es1938_reg_read(struct es1938 *chip, unsigned char reg)
1168{
1169	if (reg < 0xa0)
1170		return snd_es1938_mixer_read(chip, reg);
1171	else
1172		return snd_es1938_read(chip, reg);
1173}
1174
1175#define ES1938_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv)    \
1176{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1177  .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,\
1178  .name = xname, .index = xindex, \
1179  .info = snd_es1938_info_single, \
1180  .get = snd_es1938_get_single, .put = snd_es1938_put_single, \
1181  .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24), \
1182  .tlv = { .p = xtlv } }
1183#define ES1938_SINGLE(xname, xindex, reg, shift, mask, invert) \
1184{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1185  .info = snd_es1938_info_single, \
1186  .get = snd_es1938_get_single, .put = snd_es1938_put_single, \
1187  .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24) }
1188
1189static int snd_es1938_info_single(struct snd_kcontrol *kcontrol,
1190				  struct snd_ctl_elem_info *uinfo)
1191{
1192	int mask = (kcontrol->private_value >> 16) & 0xff;
1193
1194	uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1195	uinfo->count = 1;
1196	uinfo->value.integer.min = 0;
1197	uinfo->value.integer.max = mask;
1198	return 0;
1199}
1200
1201static int snd_es1938_get_single(struct snd_kcontrol *kcontrol,
1202				 struct snd_ctl_elem_value *ucontrol)
1203{
1204	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1205	int reg = kcontrol->private_value & 0xff;
1206	int shift = (kcontrol->private_value >> 8) & 0xff;
1207	int mask = (kcontrol->private_value >> 16) & 0xff;
1208	int invert = (kcontrol->private_value >> 24) & 0xff;
1209	int val;
1210	
1211	val = snd_es1938_reg_read(chip, reg);
1212	ucontrol->value.integer.value[0] = (val >> shift) & mask;
1213	if (invert)
1214		ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1215	return 0;
1216}
1217
1218static int snd_es1938_put_single(struct snd_kcontrol *kcontrol,
1219				 struct snd_ctl_elem_value *ucontrol)
1220{
1221	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1222	int reg = kcontrol->private_value & 0xff;
1223	int shift = (kcontrol->private_value >> 8) & 0xff;
1224	int mask = (kcontrol->private_value >> 16) & 0xff;
1225	int invert = (kcontrol->private_value >> 24) & 0xff;
1226	unsigned char val;
1227	
1228	val = (ucontrol->value.integer.value[0] & mask);
1229	if (invert)
1230		val = mask - val;
1231	mask <<= shift;
1232	val <<= shift;
1233	return snd_es1938_reg_bits(chip, reg, mask, val) != val;
1234}
1235
1236#define ES1938_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert, xtlv) \
1237{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1238  .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,\
1239  .name = xname, .index = xindex, \
1240  .info = snd_es1938_info_double, \
1241  .get = snd_es1938_get_double, .put = snd_es1938_put_double, \
1242  .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22), \
1243  .tlv = { .p = xtlv } }
1244#define ES1938_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
1245{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1246  .info = snd_es1938_info_double, \
1247  .get = snd_es1938_get_double, .put = snd_es1938_put_double, \
1248  .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) }
1249
1250static int snd_es1938_info_double(struct snd_kcontrol *kcontrol,
1251				  struct snd_ctl_elem_info *uinfo)
1252{
1253	int mask = (kcontrol->private_value >> 24) & 0xff;
1254
1255	uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1256	uinfo->count = 2;
1257	uinfo->value.integer.min = 0;
1258	uinfo->value.integer.max = mask;
1259	return 0;
1260}
1261
1262static int snd_es1938_get_double(struct snd_kcontrol *kcontrol,
1263				 struct snd_ctl_elem_value *ucontrol)
1264{
1265	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1266	int left_reg = kcontrol->private_value & 0xff;
1267	int right_reg = (kcontrol->private_value >> 8) & 0xff;
1268	int shift_left = (kcontrol->private_value >> 16) & 0x07;
1269	int shift_right = (kcontrol->private_value >> 19) & 0x07;
1270	int mask = (kcontrol->private_value >> 24) & 0xff;
1271	int invert = (kcontrol->private_value >> 22) & 1;
1272	unsigned char left, right;
1273	
1274	left = snd_es1938_reg_read(chip, left_reg);
1275	if (left_reg != right_reg)
1276		right = snd_es1938_reg_read(chip, right_reg);
1277	else
1278		right = left;
1279	ucontrol->value.integer.value[0] = (left >> shift_left) & mask;
1280	ucontrol->value.integer.value[1] = (right >> shift_right) & mask;
1281	if (invert) {
1282		ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1283		ucontrol->value.integer.value[1] = mask - ucontrol->value.integer.value[1];
1284	}
1285	return 0;
1286}
1287
1288static int snd_es1938_put_double(struct snd_kcontrol *kcontrol,
1289				 struct snd_ctl_elem_value *ucontrol)
1290{
1291	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1292	int left_reg = kcontrol->private_value & 0xff;
1293	int right_reg = (kcontrol->private_value >> 8) & 0xff;
1294	int shift_left = (kcontrol->private_value >> 16) & 0x07;
1295	int shift_right = (kcontrol->private_value >> 19) & 0x07;
1296	int mask = (kcontrol->private_value >> 24) & 0xff;
1297	int invert = (kcontrol->private_value >> 22) & 1;
1298	int change;
1299	unsigned char val1, val2, mask1, mask2;
1300	
1301	val1 = ucontrol->value.integer.value[0] & mask;
1302	val2 = ucontrol->value.integer.value[1] & mask;
1303	if (invert) {
1304		val1 = mask - val1;
1305		val2 = mask - val2;
1306	}
1307	val1 <<= shift_left;
1308	val2 <<= shift_right;
1309	mask1 = mask << shift_left;
1310	mask2 = mask << shift_right;
1311	if (left_reg != right_reg) {
1312		change = 0;
1313		if (snd_es1938_reg_bits(chip, left_reg, mask1, val1) != val1)
1314			change = 1;
1315		if (snd_es1938_reg_bits(chip, right_reg, mask2, val2) != val2)
1316			change = 1;
1317	} else {
1318		change = (snd_es1938_reg_bits(chip, left_reg, mask1 | mask2, 
1319					      val1 | val2) != (val1 | val2));
1320	}
1321	return change;
1322}
1323
1324static unsigned int db_scale_master[] = {
1325	TLV_DB_RANGE_HEAD(2),
1326	0, 54, TLV_DB_SCALE_ITEM(-3600, 50, 1),
1327	54, 63, TLV_DB_SCALE_ITEM(-900, 100, 0),
1328};
1329
1330static unsigned int db_scale_audio1[] = {
1331	TLV_DB_RANGE_HEAD(2),
1332	0, 8, TLV_DB_SCALE_ITEM(-3300, 300, 1),
1333	8, 15, TLV_DB_SCALE_ITEM(-900, 150, 0),
1334};
1335
1336static unsigned int db_scale_audio2[] = {
1337	TLV_DB_RANGE_HEAD(2),
1338	0, 8, TLV_DB_SCALE_ITEM(-3450, 300, 1),
1339	8, 15, TLV_DB_SCALE_ITEM(-1050, 150, 0),
1340};
1341
1342static unsigned int db_scale_mic[] = {
1343	TLV_DB_RANGE_HEAD(2),
1344	0, 8, TLV_DB_SCALE_ITEM(-2400, 300, 1),
1345	8, 15, TLV_DB_SCALE_ITEM(0, 150, 0),
1346};
1347
1348static unsigned int db_scale_line[] = {
1349	TLV_DB_RANGE_HEAD(2),
1350	0, 8, TLV_DB_SCALE_ITEM(-3150, 300, 1),
1351	8, 15, TLV_DB_SCALE_ITEM(-750, 150, 0),
1352};
1353
1354static const DECLARE_TLV_DB_SCALE(db_scale_capture, 0, 150, 0);
1355
1356static struct snd_kcontrol_new snd_es1938_controls[] = {
1357ES1938_DOUBLE_TLV("Master Playback Volume", 0, 0x60, 0x62, 0, 0, 63, 0,
1358		  db_scale_master),
1359ES1938_DOUBLE("Master Playback Switch", 0, 0x60, 0x62, 6, 6, 1, 1),
1360{
1361	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1362	.name = "Hardware Master Playback Volume",
1363	.access = SNDRV_CTL_ELEM_ACCESS_READ,
1364	.info = snd_es1938_info_hw_volume,
1365	.get = snd_es1938_get_hw_volume,
1366},
1367{
1368	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1369	.access = (SNDRV_CTL_ELEM_ACCESS_READ |
1370		   SNDRV_CTL_ELEM_ACCESS_TLV_READ),
1371	.name = "Hardware Master Playback Switch",
1372	.info = snd_es1938_info_hw_switch,
1373	.get = snd_es1938_get_hw_switch,
1374	.tlv = { .p = db_scale_master },
1375},
1376ES1938_SINGLE("Hardware Volume Split", 0, 0x64, 7, 1, 0),
1377ES1938_DOUBLE_TLV("Line Playback Volume", 0, 0x3e, 0x3e, 4, 0, 15, 0,
1378		  db_scale_line),
1379ES1938_DOUBLE("CD Playback Volume", 0, 0x38, 0x38, 4, 0, 15, 0),
1380ES1938_DOUBLE_TLV("FM Playback Volume", 0, 0x36, 0x36, 4, 0, 15, 0,
1381		  db_scale_mic),
1382ES1938_DOUBLE_TLV("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0,
1383		  db_scale_line),
1384ES1938_DOUBLE_TLV("Mic Playback Volume", 0, 0x1a, 0x1a, 4, 0, 15, 0,
1385		  db_scale_mic),
1386ES1938_DOUBLE_TLV("Aux Playback Volume", 0, 0x3a, 0x3a, 4, 0, 15, 0,
1387		  db_scale_line),
1388ES1938_DOUBLE_TLV("Capture Volume", 0, 0xb4, 0xb4, 4, 0, 15, 0,
1389		  db_scale_capture),
1390ES1938_SINGLE("Beep Volume", 0, 0x3c, 0, 7, 0),
1391ES1938_SINGLE("Record Monitor", 0, 0xa8, 3, 1, 0),
1392ES1938_SINGLE("Capture Switch", 0, 0x1c, 4, 1, 1),
1393{
1394	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1395	.name = "Capture Source",
1396	.info = snd_es1938_info_mux,
1397	.get = snd_es1938_get_mux,
1398	.put = snd_es1938_put_mux,
1399},
1400ES1938_DOUBLE_TLV("Mono Input Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0,
1401		  db_scale_line),
1402ES1938_DOUBLE_TLV("PCM Capture Volume", 0, 0x69, 0x69, 4, 0, 15, 0,
1403		  db_scale_audio2),
1404ES1938_DOUBLE_TLV("Mic Capture Volume", 0, 0x68, 0x68, 4, 0, 15, 0,
1405		  db_scale_mic),
1406ES1938_DOUBLE_TLV("Line Capture Volume", 0, 0x6e, 0x6e, 4, 0, 15, 0,
1407		  db_scale_line),
1408ES1938_DOUBLE_TLV("FM Capture Volume", 0, 0x6b, 0x6b, 4, 0, 15, 0,
1409		  db_scale_mic),
1410ES1938_DOUBLE_TLV("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0,
1411		  db_scale_line),
1412ES1938_DOUBLE_TLV("CD Capture Volume", 0, 0x6a, 0x6a, 4, 0, 15, 0,
1413		  db_scale_line),
1414ES1938_DOUBLE_TLV("Aux Capture Volume", 0, 0x6c, 0x6c, 4, 0, 15, 0,
1415		  db_scale_line),
1416ES1938_DOUBLE_TLV("PCM Playback Volume", 0, 0x7c, 0x7c, 4, 0, 15, 0,
1417		  db_scale_audio2),
1418ES1938_DOUBLE_TLV("PCM Playback Volume", 1, 0x14, 0x14, 4, 0, 15, 0,
1419		  db_scale_audio1),
1420ES1938_SINGLE("3D Control - Level", 0, 0x52, 0, 63, 0),
1421{
1422	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1423	.name = "3D Control - Switch",
1424	.info = snd_es1938_info_spatializer_enable,
1425	.get = snd_es1938_get_spatializer_enable,
1426	.put = snd_es1938_put_spatializer_enable,
1427},
1428ES1938_SINGLE("Mic Boost (+26dB)", 0, 0x7d, 3, 1, 0)
1429};
1430
1431
1432/* ---------------------------------------------------------------------------- */
1433/* ---------------------------------------------------------------------------- */
1434
1435/*
1436 * initialize the chip - used by resume callback, too
1437 */
1438static void snd_es1938_chip_init(struct es1938 *chip)
1439{
1440	/* reset chip */
1441	snd_es1938_reset(chip);
1442
1443	/* configure native mode */
1444
1445	/* enable bus master */
1446	pci_set_master(chip->pci);
1447
1448	/* disable legacy audio */
1449	pci_write_config_word(chip->pci, SL_PCI_LEGACYCONTROL, 0x805f);
1450
1451	/* set DDMA base */
1452	pci_write_config_word(chip->pci, SL_PCI_DDMACONTROL, chip->ddma_port | 1);
1453
1454	/* set DMA/IRQ policy */
1455	pci_write_config_dword(chip->pci, SL_PCI_CONFIG, 0);
1456
1457	/* enable Audio 1, Audio 2, MPU401 IRQ and HW volume IRQ*/
1458	outb(0xf0, SLIO_REG(chip, IRQCONTROL));
1459
1460	/* reset DMA */
1461	outb(0, SLDM_REG(chip, DMACLEAR));
1462}
1463
1464#ifdef CONFIG_PM
1465/*
1466 * PM support
1467 */
1468
1469static unsigned char saved_regs[SAVED_REG_SIZE+1] = {
1470	0x14, 0x1a, 0x1c, 0x3a, 0x3c, 0x3e, 0x36, 0x38,
1471	0x50, 0x52, 0x60, 0x61, 0x62, 0x63, 0x64, 0x68,
1472	0x69, 0x6a, 0x6b, 0x6d, 0x6e, 0x6f, 0x7c, 0x7d,
1473	0xa8, 0xb4,
1474};
1475
1476
1477static int es1938_suspend(struct pci_dev *pci, pm_message_t state)
1478{
1479	struct snd_card *card = pci_get_drvdata(pci);
1480	struct es1938 *chip = card->private_data;
1481	unsigned char *s, *d;
 
1482
1483	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
1484	snd_pcm_suspend_all(chip->pcm);
1485
1486	/* save mixer-related registers */
1487	for (s = saved_regs, d = chip->saved_regs; *s; s++, d++)
1488		*d = snd_es1938_reg_read(chip, *s);
1489
1490	outb(0x00, SLIO_REG(chip, IRQCONTROL)); /* disable irqs */
1491	if (chip->irq >= 0) {
1492		free_irq(chip->irq, chip);
1493		chip->irq = -1;
 
1494	}
1495	pci_disable_device(pci);
1496	pci_save_state(pci);
1497	pci_set_power_state(pci, pci_choose_state(pci, state));
1498	return 0;
1499}
1500
1501static int es1938_resume(struct pci_dev *pci)
1502{
1503	struct snd_card *card = pci_get_drvdata(pci);
 
1504	struct es1938 *chip = card->private_data;
1505	unsigned char *s, *d;
1506
1507	pci_set_power_state(pci, PCI_D0);
1508	pci_restore_state(pci);
1509	if (pci_enable_device(pci) < 0) {
1510		printk(KERN_ERR "es1938: pci_enable_device failed, "
1511		       "disabling device\n");
1512		snd_card_disconnect(card);
1513		return -EIO;
1514	}
1515
1516	if (request_irq(pci->irq, snd_es1938_interrupt,
1517			IRQF_SHARED, KBUILD_MODNAME, chip)) {
1518		printk(KERN_ERR "es1938: unable to grab IRQ %d, "
1519		       "disabling device\n", pci->irq);
1520		snd_card_disconnect(card);
1521		return -EIO;
1522	}
1523	chip->irq = pci->irq;
 
1524	snd_es1938_chip_init(chip);
1525
1526	/* restore mixer-related registers */
1527	for (s = saved_regs, d = chip->saved_regs; *s; s++, d++) {
1528		if (*s < 0xa0)
1529			snd_es1938_mixer_write(chip, *s, *d);
1530		else
1531			snd_es1938_write(chip, *s, *d);
1532	}
1533
1534	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
1535	return 0;
1536}
1537#endif /* CONFIG_PM */
 
 
 
 
 
1538
1539#ifdef SUPPORT_JOYSTICK
1540static int __devinit snd_es1938_create_gameport(struct es1938 *chip)
1541{
1542	struct gameport *gp;
1543
1544	chip->gameport = gp = gameport_allocate_port();
1545	if (!gp) {
1546		printk(KERN_ERR "es1938: cannot allocate memory for gameport\n");
 
1547		return -ENOMEM;
1548	}
1549
1550	gameport_set_name(gp, "ES1938");
1551	gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci));
1552	gameport_set_dev_parent(gp, &chip->pci->dev);
1553	gp->io = chip->game_port;
1554
1555	gameport_register_port(gp);
1556
1557	return 0;
1558}
1559
1560static void snd_es1938_free_gameport(struct es1938 *chip)
1561{
1562	if (chip->gameport) {
1563		gameport_unregister_port(chip->gameport);
1564		chip->gameport = NULL;
1565	}
1566}
1567#else
1568static inline int snd_es1938_create_gameport(struct es1938 *chip) { return -ENOSYS; }
1569static inline void snd_es1938_free_gameport(struct es1938 *chip) { }
1570#endif /* SUPPORT_JOYSTICK */
1571
1572static int snd_es1938_free(struct es1938 *chip)
1573{
 
 
1574	/* disable irqs */
1575	outb(0x00, SLIO_REG(chip, IRQCONTROL));
1576	if (chip->rmidi)
1577		snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0);
1578
1579	snd_es1938_free_gameport(chip);
1580
1581	if (chip->irq >= 0)
1582		free_irq(chip->irq, chip);
1583	pci_release_regions(chip->pci);
1584	pci_disable_device(chip->pci);
1585	kfree(chip);
1586	return 0;
1587}
1588
1589static int snd_es1938_dev_free(struct snd_device *device)
1590{
1591	struct es1938 *chip = device->device_data;
1592	return snd_es1938_free(chip);
1593}
1594
1595static int __devinit snd_es1938_create(struct snd_card *card,
1596				    struct pci_dev * pci,
1597				    struct es1938 ** rchip)
1598{
1599	struct es1938 *chip;
1600	int err;
1601	static struct snd_device_ops ops = {
1602		.dev_free =	snd_es1938_dev_free,
1603	};
1604
1605	*rchip = NULL;
1606
1607	/* enable PCI device */
1608	if ((err = pci_enable_device(pci)) < 0)
 
1609		return err;
1610        /* check, if we can restrict PCI DMA transfers to 24 bits */
1611	if (pci_set_dma_mask(pci, DMA_BIT_MASK(24)) < 0 ||
1612	    pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(24)) < 0) {
1613		snd_printk(KERN_ERR "architecture does not support 24bit PCI busmaster DMA\n");
1614		pci_disable_device(pci);
1615                return -ENXIO;
1616        }
1617
1618	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
1619	if (chip == NULL) {
1620		pci_disable_device(pci);
1621		return -ENOMEM;
1622	}
1623	spin_lock_init(&chip->reg_lock);
1624	spin_lock_init(&chip->mixer_lock);
1625	chip->card = card;
1626	chip->pci = pci;
1627	chip->irq = -1;
1628	if ((err = pci_request_regions(pci, "ESS Solo-1")) < 0) {
1629		kfree(chip);
1630		pci_disable_device(pci);
1631		return err;
1632	}
1633	chip->io_port = pci_resource_start(pci, 0);
1634	chip->sb_port = pci_resource_start(pci, 1);
1635	chip->vc_port = pci_resource_start(pci, 2);
1636	chip->mpu_port = pci_resource_start(pci, 3);
1637	chip->game_port = pci_resource_start(pci, 4);
 
1638	if (request_irq(pci->irq, snd_es1938_interrupt, IRQF_SHARED,
1639			KBUILD_MODNAME, chip)) {
1640		snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq);
1641		snd_es1938_free(chip);
1642		return -EBUSY;
1643	}
1644	chip->irq = pci->irq;
1645#ifdef ES1938_DDEBUG
1646	snd_printk(KERN_DEBUG "create: io: 0x%lx, sb: 0x%lx, vc: 0x%lx, mpu: 0x%lx, game: 0x%lx\n",
 
 
1647		   chip->io_port, chip->sb_port, chip->vc_port, chip->mpu_port, chip->game_port);
1648#endif
1649
1650	chip->ddma_port = chip->vc_port + 0x00;		/* fix from Thomas Sailer */
1651
1652	snd_es1938_chip_init(chip);
1653
1654	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
1655		snd_es1938_free(chip);
1656		return err;
1657	}
1658
1659	snd_card_set_dev(card, &pci->dev);
1660
1661	*rchip = chip;
1662	return 0;
1663}
1664
1665/* --------------------------------------------------------------------
1666 * Interrupt handler
1667 * -------------------------------------------------------------------- */
1668static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id)
1669{
1670	struct es1938 *chip = dev_id;
1671	unsigned char status, audiostatus;
 
1672	int handled = 0;
1673
1674	status = inb(SLIO_REG(chip, IRQCONTROL));
1675#if 0
1676	printk(KERN_DEBUG "Es1938debug - interrupt status: =0x%x\n", status);
 
1677#endif
1678	
1679	/* AUDIO 1 */
1680	if (status & 0x10) {
1681#if 0
1682                printk(KERN_DEBUG
1683		       "Es1938debug - AUDIO channel 1 interrupt\n");
1684		printk(KERN_DEBUG
1685		       "Es1938debug - AUDIO channel 1 DMAC DMA count: %u\n",
1686		       inw(SLDM_REG(chip, DMACOUNT)));
1687		printk(KERN_DEBUG
1688		       "Es1938debug - AUDIO channel 1 DMAC DMA base: %u\n",
1689		       inl(SLDM_REG(chip, DMAADDR)));
1690		printk(KERN_DEBUG
1691		       "Es1938debug - AUDIO channel 1 DMAC DMA status: 0x%x\n",
1692		       inl(SLDM_REG(chip, DMASTATUS)));
1693#endif
1694		/* clear irq */
1695		handled = 1;
1696		audiostatus = inb(SLSB_REG(chip, STATUS));
1697		if (chip->active & ADC1)
1698			snd_pcm_period_elapsed(chip->capture_substream);
1699		else if (chip->active & DAC1)
1700			snd_pcm_period_elapsed(chip->playback2_substream);
1701	}
1702	
1703	/* AUDIO 2 */
1704	if (status & 0x20) {
1705#if 0
1706                printk(KERN_DEBUG
1707		       "Es1938debug - AUDIO channel 2 interrupt\n");
1708		printk(KERN_DEBUG
1709		       "Es1938debug - AUDIO channel 2 DMAC DMA count: %u\n",
1710		       inw(SLIO_REG(chip, AUDIO2DMACOUNT)));
1711		printk(KERN_DEBUG
1712		       "Es1938debug - AUDIO channel 2 DMAC DMA base: %u\n",
1713		       inl(SLIO_REG(chip, AUDIO2DMAADDR)));
1714
1715#endif
1716		/* clear irq */
1717		handled = 1;
1718		snd_es1938_mixer_bits(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x80, 0);
1719		if (chip->active & DAC2)
1720			snd_pcm_period_elapsed(chip->playback1_substream);
1721	}
1722
1723	/* Hardware volume */
1724	if (status & 0x40) {
1725		int split = snd_es1938_mixer_read(chip, 0x64) & 0x80;
1726		handled = 1;
1727		snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_switch->id);
1728		snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_volume->id);
1729		if (!split) {
1730			snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1731				       &chip->master_switch->id);
1732			snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1733				       &chip->master_volume->id);
1734		}
1735		/* ack interrupt */
1736		snd_es1938_mixer_write(chip, 0x66, 0x00);
1737	}
1738
1739	/* MPU401 */
1740	if (status & 0x80) {
1741		// the following line is evil! It switches off MIDI interrupt handling after the first interrupt received.
1742		// replacing the last 0 by 0x40 works for ESS-Solo1, but just doing nothing works as well!
1743		// andreas@flying-snail.de
1744		// snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0); /* ack? */
1745		if (chip->rmidi) {
1746			handled = 1;
1747			snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data);
1748		}
1749	}
1750	return IRQ_RETVAL(handled);
1751}
1752
1753#define ES1938_DMA_SIZE 64
1754
1755static int __devinit snd_es1938_mixer(struct es1938 *chip)
1756{
1757	struct snd_card *card;
1758	unsigned int idx;
1759	int err;
1760
1761	card = chip->card;
1762
1763	strcpy(card->mixername, "ESS Solo-1");
1764
1765	for (idx = 0; idx < ARRAY_SIZE(snd_es1938_controls); idx++) {
1766		struct snd_kcontrol *kctl;
1767		kctl = snd_ctl_new1(&snd_es1938_controls[idx], chip);
1768		switch (idx) {
1769			case 0:
1770				chip->master_volume = kctl;
1771				kctl->private_free = snd_es1938_hwv_free;
1772				break;
1773			case 1:
1774				chip->master_switch = kctl;
1775				kctl->private_free = snd_es1938_hwv_free;
1776				break;
1777			case 2:
1778				chip->hw_volume = kctl;
1779				kctl->private_free = snd_es1938_hwv_free;
1780				break;
1781			case 3:
1782				chip->hw_switch = kctl;
1783				kctl->private_free = snd_es1938_hwv_free;
1784				break;
1785			}
1786		if ((err = snd_ctl_add(card, kctl)) < 0)
 
1787			return err;
1788	}
1789	return 0;
1790}
1791       
1792
1793static int __devinit snd_es1938_probe(struct pci_dev *pci,
1794				      const struct pci_device_id *pci_id)
1795{
1796	static int dev;
1797	struct snd_card *card;
1798	struct es1938 *chip;
1799	struct snd_opl3 *opl3;
1800	int idx, err;
1801
1802	if (dev >= SNDRV_CARDS)
1803		return -ENODEV;
1804	if (!enable[dev]) {
1805		dev++;
1806		return -ENOENT;
1807	}
1808
1809	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
 
1810	if (err < 0)
1811		return err;
1812	for (idx = 0; idx < 5; idx++) {
 
 
1813		if (pci_resource_start(pci, idx) == 0 ||
1814		    !(pci_resource_flags(pci, idx) & IORESOURCE_IO)) {
1815		    	snd_card_free(card);
1816		    	return -ENODEV;
1817		}
1818	}
1819	if ((err = snd_es1938_create(card, pci, &chip)) < 0) {
1820		snd_card_free(card);
1821		return err;
1822	}
1823	card->private_data = chip;
1824
1825	strcpy(card->driver, "ES1938");
1826	strcpy(card->shortname, "ESS ES1938 (Solo-1)");
1827	sprintf(card->longname, "%s rev %i, irq %i",
1828		card->shortname,
1829		chip->revision,
1830		chip->irq);
1831
1832	if ((err = snd_es1938_new_pcm(chip, 0)) < 0) {
1833		snd_card_free(card);
1834		return err;
1835	}
1836	if ((err = snd_es1938_mixer(chip)) < 0) {
1837		snd_card_free(card);
1838		return err;
1839	}
1840	if (snd_opl3_create(card,
1841			    SLSB_REG(chip, FMLOWADDR),
1842			    SLSB_REG(chip, FMHIGHADDR),
1843			    OPL3_HW_OPL3, 1, &opl3) < 0) {
1844		printk(KERN_ERR "es1938: OPL3 not detected at 0x%lx\n",
1845			   SLSB_REG(chip, FMLOWADDR));
1846	} else {
1847	        if ((err = snd_opl3_timer_new(opl3, 0, 1)) < 0) {
1848	                snd_card_free(card);
1849	                return err;
1850		}
1851	        if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
1852	                snd_card_free(card);
1853	                return err;
1854		}
1855	}
1856	if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
1857				chip->mpu_port, MPU401_INFO_INTEGRATED,
1858				chip->irq, 0, &chip->rmidi) < 0) {
1859		printk(KERN_ERR "es1938: unable to initialize MPU-401\n");
 
1860	} else {
1861		// this line is vital for MIDI interrupt handling on ess-solo1
1862		// andreas@flying-snail.de
1863		snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0x40);
1864	}
1865
1866	snd_es1938_create_gameport(chip);
1867
1868	if ((err = snd_card_register(card)) < 0) {
1869		snd_card_free(card);
1870		return err;
1871	}
1872
1873	pci_set_drvdata(pci, card);
1874	dev++;
1875	return 0;
1876}
1877
1878static void __devexit snd_es1938_remove(struct pci_dev *pci)
 
1879{
1880	snd_card_free(pci_get_drvdata(pci));
1881	pci_set_drvdata(pci, NULL);
1882}
1883
1884static struct pci_driver driver = {
1885	.name = KBUILD_MODNAME,
1886	.id_table = snd_es1938_ids,
1887	.probe = snd_es1938_probe,
1888	.remove = __devexit_p(snd_es1938_remove),
1889#ifdef CONFIG_PM
1890	.suspend = es1938_suspend,
1891	.resume = es1938_resume,
1892#endif
1893};
1894
1895static int __init alsa_card_es1938_init(void)
1896{
1897	return pci_register_driver(&driver);
1898}
1899
1900static void __exit alsa_card_es1938_exit(void)
1901{
1902	pci_unregister_driver(&driver);
1903}
1904
1905module_init(alsa_card_es1938_init)
1906module_exit(alsa_card_es1938_exit)
v6.8
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *  Driver for ESS Solo-1 (ES1938, ES1946, ES1969) soundcard
   4 *  Copyright (c) by Jaromir Koutek <miri@punknet.cz>,
   5 *                   Jaroslav Kysela <perex@perex.cz>,
   6 *                   Thomas Sailer <sailer@ife.ee.ethz.ch>,
   7 *                   Abramo Bagnara <abramo@alsa-project.org>,
   8 *                   Markus Gruber <gruber@eikon.tum.de>
   9 * 
  10 * Rewritten from sonicvibes.c source.
  11 *
  12 *  TODO:
  13 *    Rewrite better spinlocks
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  14 */
  15
  16/*
  17  NOTES:
  18  - Capture data is written unaligned starting from dma_base + 1 so I need to
  19    disable mmap and to add a copy callback.
  20  - After several cycle of the following:
  21    while : ; do arecord -d1 -f cd -t raw | aplay -f cd ; done
  22    a "playback write error (DMA or IRQ trouble?)" may happen.
  23    This is due to playback interrupts not generated.
  24    I suspect a timing issue.
  25  - Sometimes the interrupt handler is invoked wrongly during playback.
  26    This generates some harmless "Unexpected hw_pointer: wrong interrupt
  27    acknowledge".
  28    I've seen that using small period sizes.
  29    Reproducible with:
  30    mpg123 test.mp3 &
  31    hdparm -t -T /dev/hda
  32*/
  33
  34
  35#include <linux/init.h>
  36#include <linux/interrupt.h>
  37#include <linux/pci.h>
  38#include <linux/slab.h>
  39#include <linux/gameport.h>
  40#include <linux/module.h>
  41#include <linux/delay.h>
  42#include <linux/dma-mapping.h>
  43#include <linux/io.h>
  44#include <sound/core.h>
  45#include <sound/control.h>
  46#include <sound/pcm.h>
  47#include <sound/opl3.h>
  48#include <sound/mpu401.h>
  49#include <sound/initval.h>
  50#include <sound/tlv.h>
  51
 
 
  52MODULE_AUTHOR("Jaromir Koutek <miri@punknet.cz>");
  53MODULE_DESCRIPTION("ESS Solo-1");
  54MODULE_LICENSE("GPL");
 
 
 
 
  55
  56#if IS_REACHABLE(CONFIG_GAMEPORT)
  57#define SUPPORT_JOYSTICK 1
  58#endif
  59
  60static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
  61static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
  62static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
  63
  64module_param_array(index, int, NULL, 0444);
  65MODULE_PARM_DESC(index, "Index value for ESS Solo-1 soundcard.");
  66module_param_array(id, charp, NULL, 0444);
  67MODULE_PARM_DESC(id, "ID string for ESS Solo-1 soundcard.");
  68module_param_array(enable, bool, NULL, 0444);
  69MODULE_PARM_DESC(enable, "Enable ESS Solo-1 soundcard.");
  70
  71#define SLIO_REG(chip, x) ((chip)->io_port + ESSIO_REG_##x)
  72
  73#define SLDM_REG(chip, x) ((chip)->ddma_port + ESSDM_REG_##x)
  74
  75#define SLSB_REG(chip, x) ((chip)->sb_port + ESSSB_REG_##x)
  76
  77#define SL_PCI_LEGACYCONTROL		0x40
  78#define SL_PCI_CONFIG			0x50
  79#define SL_PCI_DDMACONTROL		0x60
  80
  81#define ESSIO_REG_AUDIO2DMAADDR		0
  82#define ESSIO_REG_AUDIO2DMACOUNT	4
  83#define ESSIO_REG_AUDIO2MODE		6
  84#define ESSIO_REG_IRQCONTROL		7
  85
  86#define ESSDM_REG_DMAADDR		0x00
  87#define ESSDM_REG_DMACOUNT		0x04
  88#define ESSDM_REG_DMACOMMAND		0x08
  89#define ESSDM_REG_DMASTATUS		0x08
  90#define ESSDM_REG_DMAMODE		0x0b
  91#define ESSDM_REG_DMACLEAR		0x0d
  92#define ESSDM_REG_DMAMASK		0x0f
  93
  94#define ESSSB_REG_FMLOWADDR		0x00
  95#define ESSSB_REG_FMHIGHADDR		0x02
  96#define ESSSB_REG_MIXERADDR		0x04
  97#define ESSSB_REG_MIXERDATA		0x05
  98
  99#define ESSSB_IREG_AUDIO1		0x14
 100#define ESSSB_IREG_MICMIX		0x1a
 101#define ESSSB_IREG_RECSRC		0x1c
 102#define ESSSB_IREG_MASTER		0x32
 103#define ESSSB_IREG_FM			0x36
 104#define ESSSB_IREG_AUXACD		0x38
 105#define ESSSB_IREG_AUXB			0x3a
 106#define ESSSB_IREG_PCSPEAKER		0x3c
 107#define ESSSB_IREG_LINE			0x3e
 108#define ESSSB_IREG_SPATCONTROL		0x50
 109#define ESSSB_IREG_SPATLEVEL		0x52
 110#define ESSSB_IREG_MASTER_LEFT		0x60
 111#define ESSSB_IREG_MASTER_RIGHT		0x62
 112#define ESSSB_IREG_MPU401CONTROL	0x64
 113#define ESSSB_IREG_MICMIXRECORD		0x68
 114#define ESSSB_IREG_AUDIO2RECORD		0x69
 115#define ESSSB_IREG_AUXACDRECORD		0x6a
 116#define ESSSB_IREG_FMRECORD		0x6b
 117#define ESSSB_IREG_AUXBRECORD		0x6c
 118#define ESSSB_IREG_MONO			0x6d
 119#define ESSSB_IREG_LINERECORD		0x6e
 120#define ESSSB_IREG_MONORECORD		0x6f
 121#define ESSSB_IREG_AUDIO2SAMPLE		0x70
 122#define ESSSB_IREG_AUDIO2MODE		0x71
 123#define ESSSB_IREG_AUDIO2FILTER		0x72
 124#define ESSSB_IREG_AUDIO2TCOUNTL	0x74
 125#define ESSSB_IREG_AUDIO2TCOUNTH	0x76
 126#define ESSSB_IREG_AUDIO2CONTROL1	0x78
 127#define ESSSB_IREG_AUDIO2CONTROL2	0x7a
 128#define ESSSB_IREG_AUDIO2		0x7c
 129
 130#define ESSSB_REG_RESET			0x06
 131
 132#define ESSSB_REG_READDATA		0x0a
 133#define ESSSB_REG_WRITEDATA		0x0c
 134#define ESSSB_REG_READSTATUS		0x0c
 135
 136#define ESSSB_REG_STATUS		0x0e
 137
 138#define ESS_CMD_EXTSAMPLERATE		0xa1
 139#define ESS_CMD_FILTERDIV		0xa2
 140#define ESS_CMD_DMACNTRELOADL		0xa4
 141#define ESS_CMD_DMACNTRELOADH		0xa5
 142#define ESS_CMD_ANALOGCONTROL		0xa8
 143#define ESS_CMD_IRQCONTROL		0xb1
 144#define ESS_CMD_DRQCONTROL		0xb2
 145#define ESS_CMD_RECLEVEL		0xb4
 146#define ESS_CMD_SETFORMAT		0xb6
 147#define ESS_CMD_SETFORMAT2		0xb7
 148#define ESS_CMD_DMACONTROL		0xb8
 149#define ESS_CMD_DMATYPE			0xb9
 150#define ESS_CMD_OFFSETLEFT		0xba	
 151#define ESS_CMD_OFFSETRIGHT		0xbb
 152#define ESS_CMD_READREG			0xc0
 153#define ESS_CMD_ENABLEEXT		0xc6
 154#define ESS_CMD_PAUSEDMA		0xd0
 155#define ESS_CMD_ENABLEAUDIO1		0xd1
 156#define ESS_CMD_STOPAUDIO1		0xd3
 157#define ESS_CMD_AUDIO1STATUS		0xd8
 158#define ESS_CMD_CONTDMA			0xd4
 159#define ESS_CMD_TESTIRQ			0xf2
 160
 161#define ESS_RECSRC_MIC		0
 162#define ESS_RECSRC_AUXACD	2
 163#define ESS_RECSRC_AUXB		5
 164#define ESS_RECSRC_LINE		6
 165#define ESS_RECSRC_NONE		7
 166
 167#define DAC1 0x01
 168#define ADC1 0x02
 169#define DAC2 0x04
 170
 171/*
 172
 173 */
 174
 175#define SAVED_REG_SIZE	32 /* max. number of registers to save */
 176
 177struct es1938 {
 178	int irq;
 179
 180	unsigned long io_port;
 181	unsigned long sb_port;
 182	unsigned long vc_port;
 183	unsigned long mpu_port;
 184	unsigned long game_port;
 185	unsigned long ddma_port;
 186
 187	unsigned char irqmask;
 188	unsigned char revision;
 189
 190	struct snd_kcontrol *hw_volume;
 191	struct snd_kcontrol *hw_switch;
 192	struct snd_kcontrol *master_volume;
 193	struct snd_kcontrol *master_switch;
 194
 195	struct pci_dev *pci;
 196	struct snd_card *card;
 197	struct snd_pcm *pcm;
 198	struct snd_pcm_substream *capture_substream;
 199	struct snd_pcm_substream *playback1_substream;
 200	struct snd_pcm_substream *playback2_substream;
 201	struct snd_rawmidi *rmidi;
 202
 203	unsigned int dma1_size;
 204	unsigned int dma2_size;
 205	unsigned int dma1_start;
 206	unsigned int dma2_start;
 207	unsigned int dma1_shift;
 208	unsigned int dma2_shift;
 209	unsigned int last_capture_dmaaddr;
 210	unsigned int active;
 211
 212	spinlock_t reg_lock;
 213	spinlock_t mixer_lock;
 214        struct snd_info_entry *proc_entry;
 215
 216#ifdef SUPPORT_JOYSTICK
 217	struct gameport *gameport;
 218#endif
 219#ifdef CONFIG_PM_SLEEP
 220	unsigned char saved_regs[SAVED_REG_SIZE];
 221#endif
 222};
 223
 224static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id);
 225
 226static const struct pci_device_id snd_es1938_ids[] = {
 227	{ PCI_VDEVICE(ESS, 0x1969), 0, },   /* Solo-1 */
 228	{ 0, }
 229};
 230
 231MODULE_DEVICE_TABLE(pci, snd_es1938_ids);
 232
 233#define RESET_LOOP_TIMEOUT	0x10000
 234#define WRITE_LOOP_TIMEOUT	0x10000
 235#define GET_LOOP_TIMEOUT	0x01000
 236
 
 237/* -----------------------------------------------------------------
 238 * Write to a mixer register
 239 * -----------------------------------------------------------------*/
 240static void snd_es1938_mixer_write(struct es1938 *chip, unsigned char reg, unsigned char val)
 241{
 242	unsigned long flags;
 243	spin_lock_irqsave(&chip->mixer_lock, flags);
 244	outb(reg, SLSB_REG(chip, MIXERADDR));
 245	outb(val, SLSB_REG(chip, MIXERDATA));
 246	spin_unlock_irqrestore(&chip->mixer_lock, flags);
 247	dev_dbg(chip->card->dev, "Mixer reg %02x set to %02x\n", reg, val);
 
 
 248}
 249
 250/* -----------------------------------------------------------------
 251 * Read from a mixer register
 252 * -----------------------------------------------------------------*/
 253static int snd_es1938_mixer_read(struct es1938 *chip, unsigned char reg)
 254{
 255	int data;
 256	unsigned long flags;
 257	spin_lock_irqsave(&chip->mixer_lock, flags);
 258	outb(reg, SLSB_REG(chip, MIXERADDR));
 259	data = inb(SLSB_REG(chip, MIXERDATA));
 260	spin_unlock_irqrestore(&chip->mixer_lock, flags);
 261	dev_dbg(chip->card->dev, "Mixer reg %02x now is %02x\n", reg, data);
 
 
 262	return data;
 263}
 264
 265/* -----------------------------------------------------------------
 266 * Write to some bits of a mixer register (return old value)
 267 * -----------------------------------------------------------------*/
 268static int snd_es1938_mixer_bits(struct es1938 *chip, unsigned char reg,
 269				 unsigned char mask, unsigned char val)
 270{
 271	unsigned long flags;
 272	unsigned char old, new, oval;
 273	spin_lock_irqsave(&chip->mixer_lock, flags);
 274	outb(reg, SLSB_REG(chip, MIXERADDR));
 275	old = inb(SLSB_REG(chip, MIXERDATA));
 276	oval = old & mask;
 277	if (val != oval) {
 278		new = (old & ~mask) | (val & mask);
 279		outb(new, SLSB_REG(chip, MIXERDATA));
 280		dev_dbg(chip->card->dev,
 281			"Mixer reg %02x was %02x, set to %02x\n",
 282			   reg, old, new);
 
 283	}
 284	spin_unlock_irqrestore(&chip->mixer_lock, flags);
 285	return oval;
 286}
 287
 288/* -----------------------------------------------------------------
 289 * Write command to Controller Registers
 290 * -----------------------------------------------------------------*/
 291static void snd_es1938_write_cmd(struct es1938 *chip, unsigned char cmd)
 292{
 293	int i;
 294	unsigned char v;
 295	for (i = 0; i < WRITE_LOOP_TIMEOUT; i++) {
 296		v = inb(SLSB_REG(chip, READSTATUS));
 297		if (!(v & 0x80)) {
 298			outb(cmd, SLSB_REG(chip, WRITEDATA));
 299			return;
 300		}
 301	}
 302	dev_err(chip->card->dev,
 303		"snd_es1938_write_cmd timeout (0x02%x/0x02%x)\n", cmd, v);
 304}
 305
 306/* -----------------------------------------------------------------
 307 * Read the Read Data Buffer
 308 * -----------------------------------------------------------------*/
 309static int snd_es1938_get_byte(struct es1938 *chip)
 310{
 311	int i;
 312	unsigned char v;
 313	for (i = GET_LOOP_TIMEOUT; i; i--) {
 314		v = inb(SLSB_REG(chip, STATUS));
 315		if (v & 0x80)
 316			return inb(SLSB_REG(chip, READDATA));
 317	}
 318	dev_err(chip->card->dev, "get_byte timeout: status 0x02%x\n", v);
 319	return -ENODEV;
 320}
 321
 322/* -----------------------------------------------------------------
 323 * Write value cmd register
 324 * -----------------------------------------------------------------*/
 325static void snd_es1938_write(struct es1938 *chip, unsigned char reg, unsigned char val)
 326{
 327	unsigned long flags;
 328	spin_lock_irqsave(&chip->reg_lock, flags);
 329	snd_es1938_write_cmd(chip, reg);
 330	snd_es1938_write_cmd(chip, val);
 331	spin_unlock_irqrestore(&chip->reg_lock, flags);
 332	dev_dbg(chip->card->dev, "Reg %02x set to %02x\n", reg, val);
 
 
 333}
 334
 335/* -----------------------------------------------------------------
 336 * Read data from cmd register and return it
 337 * -----------------------------------------------------------------*/
 338static unsigned char snd_es1938_read(struct es1938 *chip, unsigned char reg)
 339{
 340	unsigned char val;
 341	unsigned long flags;
 342	spin_lock_irqsave(&chip->reg_lock, flags);
 343	snd_es1938_write_cmd(chip, ESS_CMD_READREG);
 344	snd_es1938_write_cmd(chip, reg);
 345	val = snd_es1938_get_byte(chip);
 346	spin_unlock_irqrestore(&chip->reg_lock, flags);
 347	dev_dbg(chip->card->dev, "Reg %02x now is %02x\n", reg, val);
 
 
 348	return val;
 349}
 350
 351/* -----------------------------------------------------------------
 352 * Write data to cmd register and return old value
 353 * -----------------------------------------------------------------*/
 354static int snd_es1938_bits(struct es1938 *chip, unsigned char reg, unsigned char mask,
 355			   unsigned char val)
 356{
 357	unsigned long flags;
 358	unsigned char old, new, oval;
 359	spin_lock_irqsave(&chip->reg_lock, flags);
 360	snd_es1938_write_cmd(chip, ESS_CMD_READREG);
 361	snd_es1938_write_cmd(chip, reg);
 362	old = snd_es1938_get_byte(chip);
 363	oval = old & mask;
 364	if (val != oval) {
 365		snd_es1938_write_cmd(chip, reg);
 366		new = (old & ~mask) | (val & mask);
 367		snd_es1938_write_cmd(chip, new);
 368		dev_dbg(chip->card->dev, "Reg %02x was %02x, set to %02x\n",
 
 369			   reg, old, new);
 
 370	}
 371	spin_unlock_irqrestore(&chip->reg_lock, flags);
 372	return oval;
 373}
 374
 375/* --------------------------------------------------------------------
 376 * Reset the chip
 377 * --------------------------------------------------------------------*/
 378static void snd_es1938_reset(struct es1938 *chip)
 379{
 380	int i;
 381
 382	outb(3, SLSB_REG(chip, RESET));
 383	inb(SLSB_REG(chip, RESET));
 384	outb(0, SLSB_REG(chip, RESET));
 385	for (i = 0; i < RESET_LOOP_TIMEOUT; i++) {
 386		if (inb(SLSB_REG(chip, STATUS)) & 0x80) {
 387			if (inb(SLSB_REG(chip, READDATA)) == 0xaa)
 388				goto __next;
 389		}
 390	}
 391	dev_err(chip->card->dev, "ESS Solo-1 reset failed\n");
 392
 393     __next:
 394	snd_es1938_write_cmd(chip, ESS_CMD_ENABLEEXT);
 395
 396	/* Demand transfer DMA: 4 bytes per DMA request */
 397	snd_es1938_write(chip, ESS_CMD_DMATYPE, 2);
 398
 399	/* Change behaviour of register A1
 400	   4x oversampling
 401	   2nd channel DAC asynchronous */                                                      
 402	snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2MODE, 0x32);
 403	/* enable/select DMA channel and IRQ channel */
 404	snd_es1938_bits(chip, ESS_CMD_IRQCONTROL, 0xf0, 0x50);
 405	snd_es1938_bits(chip, ESS_CMD_DRQCONTROL, 0xf0, 0x50);
 406	snd_es1938_write_cmd(chip, ESS_CMD_ENABLEAUDIO1);
 407	/* Set spatializer parameters to recommended values */
 408	snd_es1938_mixer_write(chip, 0x54, 0x8f);
 409	snd_es1938_mixer_write(chip, 0x56, 0x95);
 410	snd_es1938_mixer_write(chip, 0x58, 0x94);
 411	snd_es1938_mixer_write(chip, 0x5a, 0x80);
 412}
 413
 414/* --------------------------------------------------------------------
 415 * Reset the FIFOs
 416 * --------------------------------------------------------------------*/
 417static void snd_es1938_reset_fifo(struct es1938 *chip)
 418{
 419	outb(2, SLSB_REG(chip, RESET));
 420	outb(0, SLSB_REG(chip, RESET));
 421}
 422
 423static const struct snd_ratnum clocks[2] = {
 424	{
 425		.num = 793800,
 426		.den_min = 1,
 427		.den_max = 128,
 428		.den_step = 1,
 429	},
 430	{
 431		.num = 768000,
 432		.den_min = 1,
 433		.den_max = 128,
 434		.den_step = 1,
 435	}
 436};
 437
 438static const struct snd_pcm_hw_constraint_ratnums hw_constraints_clocks = {
 439	.nrats = 2,
 440	.rats = clocks,
 441};
 442
 443
 444static void snd_es1938_rate_set(struct es1938 *chip, 
 445				struct snd_pcm_substream *substream,
 446				int mode)
 447{
 448	unsigned int bits, div0;
 449	struct snd_pcm_runtime *runtime = substream->runtime;
 450	if (runtime->rate_num == clocks[0].num)
 451		bits = 128 - runtime->rate_den;
 452	else
 453		bits = 256 - runtime->rate_den;
 454
 455	/* set filter register */
 456	div0 = 256 - 7160000*20/(8*82*runtime->rate);
 457		
 458	if (mode == DAC2) {
 459		snd_es1938_mixer_write(chip, 0x70, bits);
 460		snd_es1938_mixer_write(chip, 0x72, div0);
 461	} else {
 462		snd_es1938_write(chip, 0xA1, bits);
 463		snd_es1938_write(chip, 0xA2, div0);
 464	}
 465}
 466
 467/* --------------------------------------------------------------------
 468 * Configure Solo1 builtin DMA Controller
 469 * --------------------------------------------------------------------*/
 470
 471static void snd_es1938_playback1_setdma(struct es1938 *chip)
 472{
 473	outb(0x00, SLIO_REG(chip, AUDIO2MODE));
 474	outl(chip->dma2_start, SLIO_REG(chip, AUDIO2DMAADDR));
 475	outw(0, SLIO_REG(chip, AUDIO2DMACOUNT));
 476	outw(chip->dma2_size, SLIO_REG(chip, AUDIO2DMACOUNT));
 477}
 478
 479static void snd_es1938_playback2_setdma(struct es1938 *chip)
 480{
 481	/* Enable DMA controller */
 482	outb(0xc4, SLDM_REG(chip, DMACOMMAND));
 483	/* 1. Master reset */
 484	outb(0, SLDM_REG(chip, DMACLEAR));
 485	/* 2. Mask DMA */
 486	outb(1, SLDM_REG(chip, DMAMASK));
 487	outb(0x18, SLDM_REG(chip, DMAMODE));
 488	outl(chip->dma1_start, SLDM_REG(chip, DMAADDR));
 489	outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT));
 490	/* 3. Unmask DMA */
 491	outb(0, SLDM_REG(chip, DMAMASK));
 492}
 493
 494static void snd_es1938_capture_setdma(struct es1938 *chip)
 495{
 496	/* Enable DMA controller */
 497	outb(0xc4, SLDM_REG(chip, DMACOMMAND));
 498	/* 1. Master reset */
 499	outb(0, SLDM_REG(chip, DMACLEAR));
 500	/* 2. Mask DMA */
 501	outb(1, SLDM_REG(chip, DMAMASK));
 502	outb(0x14, SLDM_REG(chip, DMAMODE));
 503	outl(chip->dma1_start, SLDM_REG(chip, DMAADDR));
 504	chip->last_capture_dmaaddr = chip->dma1_start;
 505	outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT));
 506	/* 3. Unmask DMA */
 507	outb(0, SLDM_REG(chip, DMAMASK));
 508}
 509
 510/* ----------------------------------------------------------------------
 511 *
 512 *                           *** PCM part ***
 513 */
 514
 515static int snd_es1938_capture_trigger(struct snd_pcm_substream *substream,
 516				      int cmd)
 517{
 518	struct es1938 *chip = snd_pcm_substream_chip(substream);
 519	int val;
 520	switch (cmd) {
 521	case SNDRV_PCM_TRIGGER_START:
 522	case SNDRV_PCM_TRIGGER_RESUME:
 523		val = 0x0f;
 524		chip->active |= ADC1;
 525		break;
 526	case SNDRV_PCM_TRIGGER_STOP:
 527	case SNDRV_PCM_TRIGGER_SUSPEND:
 528		val = 0x00;
 529		chip->active &= ~ADC1;
 530		break;
 531	default:
 532		return -EINVAL;
 533	}
 534	snd_es1938_write(chip, ESS_CMD_DMACONTROL, val);
 535	return 0;
 536}
 537
 538static int snd_es1938_playback1_trigger(struct snd_pcm_substream *substream,
 539					int cmd)
 540{
 541	struct es1938 *chip = snd_pcm_substream_chip(substream);
 542	switch (cmd) {
 543	case SNDRV_PCM_TRIGGER_START:
 544	case SNDRV_PCM_TRIGGER_RESUME:
 545		/* According to the documentation this should be:
 546		   0x13 but that value may randomly swap stereo channels */
 547                snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0x92);
 548                udelay(10);
 549		snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0x93);
 550                /* This two stage init gives the FIFO -> DAC connection time to
 551                 * settle before first data from DMA flows in.  This should ensure
 552                 * no swapping of stereo channels.  Report a bug if otherwise :-) */
 553		outb(0x0a, SLIO_REG(chip, AUDIO2MODE));
 554		chip->active |= DAC2;
 555		break;
 556	case SNDRV_PCM_TRIGGER_STOP:
 557	case SNDRV_PCM_TRIGGER_SUSPEND:
 558		outb(0, SLIO_REG(chip, AUDIO2MODE));
 559		snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0);
 560		chip->active &= ~DAC2;
 561		break;
 562	default:
 563		return -EINVAL;
 564	}
 565	return 0;
 566}
 567
 568static int snd_es1938_playback2_trigger(struct snd_pcm_substream *substream,
 569					int cmd)
 570{
 571	struct es1938 *chip = snd_pcm_substream_chip(substream);
 572	int val;
 573	switch (cmd) {
 574	case SNDRV_PCM_TRIGGER_START:
 575	case SNDRV_PCM_TRIGGER_RESUME:
 576		val = 5;
 577		chip->active |= DAC1;
 578		break;
 579	case SNDRV_PCM_TRIGGER_STOP:
 580	case SNDRV_PCM_TRIGGER_SUSPEND:
 581		val = 0;
 582		chip->active &= ~DAC1;
 583		break;
 584	default:
 585		return -EINVAL;
 586	}
 587	snd_es1938_write(chip, ESS_CMD_DMACONTROL, val);
 588	return 0;
 589}
 590
 591static int snd_es1938_playback_trigger(struct snd_pcm_substream *substream,
 592				       int cmd)
 593{
 594	switch (substream->number) {
 595	case 0:
 596		return snd_es1938_playback1_trigger(substream, cmd);
 597	case 1:
 598		return snd_es1938_playback2_trigger(substream, cmd);
 599	}
 600	snd_BUG();
 601	return -EINVAL;
 602}
 603
 604/* --------------------------------------------------------------------
 605 * First channel for Extended Mode Audio 1 ADC Operation
 606 * --------------------------------------------------------------------*/
 607static int snd_es1938_capture_prepare(struct snd_pcm_substream *substream)
 608{
 609	struct es1938 *chip = snd_pcm_substream_chip(substream);
 610	struct snd_pcm_runtime *runtime = substream->runtime;
 611	int u, is8, mono;
 612	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
 613	unsigned int count = snd_pcm_lib_period_bytes(substream);
 614
 615	chip->dma1_size = size;
 616	chip->dma1_start = runtime->dma_addr;
 617
 618	mono = (runtime->channels > 1) ? 0 : 1;
 619	is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1;
 620	u = snd_pcm_format_unsigned(runtime->format);
 621
 622	chip->dma1_shift = 2 - mono - is8;
 623
 624	snd_es1938_reset_fifo(chip);
 625	
 626	/* program type */
 627	snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1));
 628
 629	/* set clock and counters */
 630        snd_es1938_rate_set(chip, substream, ADC1);
 631
 632	count = 0x10000 - count;
 633	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADL, count & 0xff);
 634	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADH, count >> 8);
 635
 636	/* initialize and configure ADC */
 637	snd_es1938_write(chip, ESS_CMD_SETFORMAT2, u ? 0x51 : 0x71);
 638	snd_es1938_write(chip, ESS_CMD_SETFORMAT2, 0x90 | 
 639		       (u ? 0x00 : 0x20) | 
 640		       (is8 ? 0x00 : 0x04) | 
 641		       (mono ? 0x40 : 0x08));
 642
 643	//	snd_es1938_reset_fifo(chip);	
 644
 645	/* 11. configure system interrupt controller and DMA controller */
 646	snd_es1938_capture_setdma(chip);
 647
 648	return 0;
 649}
 650
 651
 652/* ------------------------------------------------------------------------------
 653 * Second Audio channel DAC Operation
 654 * ------------------------------------------------------------------------------*/
 655static int snd_es1938_playback1_prepare(struct snd_pcm_substream *substream)
 656{
 657	struct es1938 *chip = snd_pcm_substream_chip(substream);
 658	struct snd_pcm_runtime *runtime = substream->runtime;
 659	int u, is8, mono;
 660	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
 661	unsigned int count = snd_pcm_lib_period_bytes(substream);
 662
 663	chip->dma2_size = size;
 664	chip->dma2_start = runtime->dma_addr;
 665
 666	mono = (runtime->channels > 1) ? 0 : 1;
 667	is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1;
 668	u = snd_pcm_format_unsigned(runtime->format);
 669
 670	chip->dma2_shift = 2 - mono - is8;
 671
 672        snd_es1938_reset_fifo(chip);
 673
 674	/* set clock and counters */
 675        snd_es1938_rate_set(chip, substream, DAC2);
 676
 677	count >>= 1;
 678	count = 0x10000 - count;
 679	snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2TCOUNTL, count & 0xff);
 680	snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2TCOUNTH, count >> 8);
 681
 682	/* initialize and configure Audio 2 DAC */
 683	snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x40 | (u ? 0 : 4) |
 684			       (mono ? 0 : 2) | (is8 ? 0 : 1));
 685
 686	/* program DMA */
 687	snd_es1938_playback1_setdma(chip);
 688	
 689	return 0;
 690}
 691
 692static int snd_es1938_playback2_prepare(struct snd_pcm_substream *substream)
 693{
 694	struct es1938 *chip = snd_pcm_substream_chip(substream);
 695	struct snd_pcm_runtime *runtime = substream->runtime;
 696	int u, is8, mono;
 697	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
 698	unsigned int count = snd_pcm_lib_period_bytes(substream);
 699
 700	chip->dma1_size = size;
 701	chip->dma1_start = runtime->dma_addr;
 702
 703	mono = (runtime->channels > 1) ? 0 : 1;
 704	is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1;
 705	u = snd_pcm_format_unsigned(runtime->format);
 706
 707	chip->dma1_shift = 2 - mono - is8;
 708
 709	count = 0x10000 - count;
 710 
 711	/* reset */
 712	snd_es1938_reset_fifo(chip);
 713	
 714	snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1));
 715
 716	/* set clock and counters */
 717        snd_es1938_rate_set(chip, substream, DAC1);
 718	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADL, count & 0xff);
 719	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADH, count >> 8);
 720
 721	/* initialized and configure DAC */
 722        snd_es1938_write(chip, ESS_CMD_SETFORMAT, u ? 0x80 : 0x00);
 723        snd_es1938_write(chip, ESS_CMD_SETFORMAT, u ? 0x51 : 0x71);
 724        snd_es1938_write(chip, ESS_CMD_SETFORMAT2, 
 725			 0x90 | (mono ? 0x40 : 0x08) |
 726			 (is8 ? 0x00 : 0x04) | (u ? 0x00 : 0x20));
 727
 728	/* program DMA */
 729	snd_es1938_playback2_setdma(chip);
 730	
 731	return 0;
 732}
 733
 734static int snd_es1938_playback_prepare(struct snd_pcm_substream *substream)
 735{
 736	switch (substream->number) {
 737	case 0:
 738		return snd_es1938_playback1_prepare(substream);
 739	case 1:
 740		return snd_es1938_playback2_prepare(substream);
 741	}
 742	snd_BUG();
 743	return -EINVAL;
 744}
 745
 746/* during the incrementing of dma counters the DMA register reads sometimes
 747   returns garbage. To ensure a valid hw pointer, the following checks which
 748   should be very unlikely to fail are used:
 749   - is the current DMA address in the valid DMA range ?
 750   - is the sum of DMA address and DMA counter pointing to the last DMA byte ?
 751   One can argue this could differ by one byte depending on which register is
 752   updated first, so the implementation below allows for that.
 753*/
 754static snd_pcm_uframes_t snd_es1938_capture_pointer(struct snd_pcm_substream *substream)
 755{
 756	struct es1938 *chip = snd_pcm_substream_chip(substream);
 757	size_t ptr;
 758#if 0
 759	size_t old, new;
 760	/* This stuff is *needed*, don't ask why - AB */
 761	old = inw(SLDM_REG(chip, DMACOUNT));
 762	while ((new = inw(SLDM_REG(chip, DMACOUNT))) != old)
 763		old = new;
 764	ptr = chip->dma1_size - 1 - new;
 765#else
 766	size_t count;
 767	unsigned int diff;
 768
 769	ptr = inl(SLDM_REG(chip, DMAADDR));
 770	count = inw(SLDM_REG(chip, DMACOUNT));
 771	diff = chip->dma1_start + chip->dma1_size - ptr - count;
 772
 773	if (diff > 3 || ptr < chip->dma1_start
 774	      || ptr >= chip->dma1_start+chip->dma1_size)
 775	  ptr = chip->last_capture_dmaaddr;            /* bad, use last saved */
 776	else
 777	  chip->last_capture_dmaaddr = ptr;            /* good, remember it */
 778
 779	ptr -= chip->dma1_start;
 780#endif
 781	return ptr >> chip->dma1_shift;
 782}
 783
 784static snd_pcm_uframes_t snd_es1938_playback1_pointer(struct snd_pcm_substream *substream)
 785{
 786	struct es1938 *chip = snd_pcm_substream_chip(substream);
 787	size_t ptr;
 788#if 1
 789	ptr = chip->dma2_size - inw(SLIO_REG(chip, AUDIO2DMACOUNT));
 790#else
 791	ptr = inl(SLIO_REG(chip, AUDIO2DMAADDR)) - chip->dma2_start;
 792#endif
 793	return ptr >> chip->dma2_shift;
 794}
 795
 796static snd_pcm_uframes_t snd_es1938_playback2_pointer(struct snd_pcm_substream *substream)
 797{
 798	struct es1938 *chip = snd_pcm_substream_chip(substream);
 799	size_t ptr;
 800	size_t old, new;
 801#if 1
 802	/* This stuff is *needed*, don't ask why - AB */
 803	old = inw(SLDM_REG(chip, DMACOUNT));
 804	while ((new = inw(SLDM_REG(chip, DMACOUNT))) != old)
 805		old = new;
 806	ptr = chip->dma1_size - 1 - new;
 807#else
 808	ptr = inl(SLDM_REG(chip, DMAADDR)) - chip->dma1_start;
 809#endif
 810	return ptr >> chip->dma1_shift;
 811}
 812
 813static snd_pcm_uframes_t snd_es1938_playback_pointer(struct snd_pcm_substream *substream)
 814{
 815	switch (substream->number) {
 816	case 0:
 817		return snd_es1938_playback1_pointer(substream);
 818	case 1:
 819		return snd_es1938_playback2_pointer(substream);
 820	}
 821	snd_BUG();
 822	return -EINVAL;
 823}
 824
 825static int snd_es1938_capture_copy(struct snd_pcm_substream *substream,
 826				   int channel, unsigned long pos,
 827				   struct iov_iter *dst, unsigned long count)
 
 
 828{
 829	struct snd_pcm_runtime *runtime = substream->runtime;
 830	struct es1938 *chip = snd_pcm_substream_chip(substream);
 831
 
 832	if (snd_BUG_ON(pos + count > chip->dma1_size))
 833		return -EINVAL;
 834	if (pos + count < chip->dma1_size) {
 835		if (copy_to_iter(runtime->dma_area + pos + 1, count, dst) != count)
 836			return -EFAULT;
 837	} else {
 838		if (copy_to_iter(runtime->dma_area + pos + 1, count - 1, dst) != count - 1)
 839			return -EFAULT;
 840		if (copy_to_iter(runtime->dma_area, 1, dst) != 1)
 841			return -EFAULT;
 842	}
 843	return 0;
 844}
 845
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 846/* ----------------------------------------------------------------------
 847 * Audio1 Capture (ADC)
 848 * ----------------------------------------------------------------------*/
 849static const struct snd_pcm_hardware snd_es1938_capture =
 850{
 851	.info =			(SNDRV_PCM_INFO_INTERLEAVED |
 852				SNDRV_PCM_INFO_BLOCK_TRANSFER),
 853	.formats =		(SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE |
 854				 SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE),
 855	.rates =		SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
 856	.rate_min =		6000,
 857	.rate_max =		48000,
 858	.channels_min =		1,
 859	.channels_max =		2,
 860        .buffer_bytes_max =	0x8000,       /* DMA controller screws on higher values */
 861	.period_bytes_min =	64,
 862	.period_bytes_max =	0x8000,
 863	.periods_min =		1,
 864	.periods_max =		1024,
 865	.fifo_size =		256,
 866};
 867
 868/* -----------------------------------------------------------------------
 869 * Audio2 Playback (DAC)
 870 * -----------------------------------------------------------------------*/
 871static const struct snd_pcm_hardware snd_es1938_playback =
 872{
 873	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
 874				 SNDRV_PCM_INFO_BLOCK_TRANSFER |
 875				 SNDRV_PCM_INFO_MMAP_VALID),
 876	.formats =		(SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE |
 877				 SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE),
 878	.rates =		SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
 879	.rate_min =		6000,
 880	.rate_max =		48000,
 881	.channels_min =		1,
 882	.channels_max =		2,
 883        .buffer_bytes_max =	0x8000,       /* DMA controller screws on higher values */
 884	.period_bytes_min =	64,
 885	.period_bytes_max =	0x8000,
 886	.periods_min =		1,
 887	.periods_max =		1024,
 888	.fifo_size =		256,
 889};
 890
 891static int snd_es1938_capture_open(struct snd_pcm_substream *substream)
 892{
 893	struct es1938 *chip = snd_pcm_substream_chip(substream);
 894	struct snd_pcm_runtime *runtime = substream->runtime;
 895
 896	if (chip->playback2_substream)
 897		return -EAGAIN;
 898	chip->capture_substream = substream;
 899	runtime->hw = snd_es1938_capture;
 900	snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
 901				      &hw_constraints_clocks);
 902	snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 0, 0xff00);
 903	return 0;
 904}
 905
 906static int snd_es1938_playback_open(struct snd_pcm_substream *substream)
 907{
 908	struct es1938 *chip = snd_pcm_substream_chip(substream);
 909	struct snd_pcm_runtime *runtime = substream->runtime;
 910
 911	switch (substream->number) {
 912	case 0:
 913		chip->playback1_substream = substream;
 914		break;
 915	case 1:
 916		if (chip->capture_substream)
 917			return -EAGAIN;
 918		chip->playback2_substream = substream;
 919		break;
 920	default:
 921		snd_BUG();
 922		return -EINVAL;
 923	}
 924	runtime->hw = snd_es1938_playback;
 925	snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
 926				      &hw_constraints_clocks);
 927	snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 0, 0xff00);
 928	return 0;
 929}
 930
 931static int snd_es1938_capture_close(struct snd_pcm_substream *substream)
 932{
 933	struct es1938 *chip = snd_pcm_substream_chip(substream);
 934
 935	chip->capture_substream = NULL;
 936	return 0;
 937}
 938
 939static int snd_es1938_playback_close(struct snd_pcm_substream *substream)
 940{
 941	struct es1938 *chip = snd_pcm_substream_chip(substream);
 942
 943	switch (substream->number) {
 944	case 0:
 945		chip->playback1_substream = NULL;
 946		break;
 947	case 1:
 948		chip->playback2_substream = NULL;
 949		break;
 950	default:
 951		snd_BUG();
 952		return -EINVAL;
 953	}
 954	return 0;
 955}
 956
 957static const struct snd_pcm_ops snd_es1938_playback_ops = {
 958	.open =		snd_es1938_playback_open,
 959	.close =	snd_es1938_playback_close,
 
 
 
 960	.prepare =	snd_es1938_playback_prepare,
 961	.trigger =	snd_es1938_playback_trigger,
 962	.pointer =	snd_es1938_playback_pointer,
 963};
 964
 965static const struct snd_pcm_ops snd_es1938_capture_ops = {
 966	.open =		snd_es1938_capture_open,
 967	.close =	snd_es1938_capture_close,
 
 
 
 968	.prepare =	snd_es1938_capture_prepare,
 969	.trigger =	snd_es1938_capture_trigger,
 970	.pointer =	snd_es1938_capture_pointer,
 971	.copy =		snd_es1938_capture_copy,
 972};
 973
 974static int snd_es1938_new_pcm(struct es1938 *chip, int device)
 975{
 976	struct snd_pcm *pcm;
 977	int err;
 978
 979	err = snd_pcm_new(chip->card, "es-1938-1946", device, 2, 1, &pcm);
 980	if (err < 0)
 981		return err;
 982	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_es1938_playback_ops);
 983	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_es1938_capture_ops);
 984	
 985	pcm->private_data = chip;
 986	pcm->info_flags = 0;
 987	strcpy(pcm->name, "ESS Solo-1");
 988
 989	snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
 990				       &chip->pci->dev, 64*1024, 64*1024);
 991
 992	chip->pcm = pcm;
 993	return 0;
 994}
 995
 996/* -------------------------------------------------------------------
 997 * 
 998 *                       *** Mixer part ***
 999 */
1000
1001static int snd_es1938_info_mux(struct snd_kcontrol *kcontrol,
1002			       struct snd_ctl_elem_info *uinfo)
1003{
1004	static const char * const texts[8] = {
1005		"Mic", "Mic Master", "CD", "AOUT",
1006		"Mic1", "Mix", "Line", "Master"
1007	};
1008
1009	return snd_ctl_enum_info(uinfo, 1, 8, texts);
 
 
 
 
 
 
1010}
1011
1012static int snd_es1938_get_mux(struct snd_kcontrol *kcontrol,
1013			      struct snd_ctl_elem_value *ucontrol)
1014{
1015	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1016	ucontrol->value.enumerated.item[0] = snd_es1938_mixer_read(chip, 0x1c) & 0x07;
1017	return 0;
1018}
1019
1020static int snd_es1938_put_mux(struct snd_kcontrol *kcontrol,
1021			      struct snd_ctl_elem_value *ucontrol)
1022{
1023	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1024	unsigned char val = ucontrol->value.enumerated.item[0];
1025	
1026	if (val > 7)
1027		return -EINVAL;
1028	return snd_es1938_mixer_bits(chip, 0x1c, 0x07, val) != val;
1029}
1030
1031#define snd_es1938_info_spatializer_enable	snd_ctl_boolean_mono_info
1032
1033static int snd_es1938_get_spatializer_enable(struct snd_kcontrol *kcontrol,
1034					     struct snd_ctl_elem_value *ucontrol)
1035{
1036	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1037	unsigned char val = snd_es1938_mixer_read(chip, 0x50);
1038	ucontrol->value.integer.value[0] = !!(val & 8);
1039	return 0;
1040}
1041
1042static int snd_es1938_put_spatializer_enable(struct snd_kcontrol *kcontrol,
1043					     struct snd_ctl_elem_value *ucontrol)
1044{
1045	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1046	unsigned char oval, nval;
1047	int change;
1048	nval = ucontrol->value.integer.value[0] ? 0x0c : 0x04;
1049	oval = snd_es1938_mixer_read(chip, 0x50) & 0x0c;
1050	change = nval != oval;
1051	if (change) {
1052		snd_es1938_mixer_write(chip, 0x50, nval & ~0x04);
1053		snd_es1938_mixer_write(chip, 0x50, nval);
1054	}
1055	return change;
1056}
1057
1058static int snd_es1938_info_hw_volume(struct snd_kcontrol *kcontrol,
1059				     struct snd_ctl_elem_info *uinfo)
1060{
1061	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1062	uinfo->count = 2;
1063	uinfo->value.integer.min = 0;
1064	uinfo->value.integer.max = 63;
1065	return 0;
1066}
1067
1068static int snd_es1938_get_hw_volume(struct snd_kcontrol *kcontrol,
1069				    struct snd_ctl_elem_value *ucontrol)
1070{
1071	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1072	ucontrol->value.integer.value[0] = snd_es1938_mixer_read(chip, 0x61) & 0x3f;
1073	ucontrol->value.integer.value[1] = snd_es1938_mixer_read(chip, 0x63) & 0x3f;
1074	return 0;
1075}
1076
1077#define snd_es1938_info_hw_switch		snd_ctl_boolean_stereo_info
1078
1079static int snd_es1938_get_hw_switch(struct snd_kcontrol *kcontrol,
1080				    struct snd_ctl_elem_value *ucontrol)
1081{
1082	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1083	ucontrol->value.integer.value[0] = !(snd_es1938_mixer_read(chip, 0x61) & 0x40);
1084	ucontrol->value.integer.value[1] = !(snd_es1938_mixer_read(chip, 0x63) & 0x40);
1085	return 0;
1086}
1087
1088static void snd_es1938_hwv_free(struct snd_kcontrol *kcontrol)
1089{
1090	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1091	chip->master_volume = NULL;
1092	chip->master_switch = NULL;
1093	chip->hw_volume = NULL;
1094	chip->hw_switch = NULL;
1095}
1096
1097static int snd_es1938_reg_bits(struct es1938 *chip, unsigned char reg,
1098			       unsigned char mask, unsigned char val)
1099{
1100	if (reg < 0xa0)
1101		return snd_es1938_mixer_bits(chip, reg, mask, val);
1102	else
1103		return snd_es1938_bits(chip, reg, mask, val);
1104}
1105
1106static int snd_es1938_reg_read(struct es1938 *chip, unsigned char reg)
1107{
1108	if (reg < 0xa0)
1109		return snd_es1938_mixer_read(chip, reg);
1110	else
1111		return snd_es1938_read(chip, reg);
1112}
1113
1114#define ES1938_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv)    \
1115{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1116  .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,\
1117  .name = xname, .index = xindex, \
1118  .info = snd_es1938_info_single, \
1119  .get = snd_es1938_get_single, .put = snd_es1938_put_single, \
1120  .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24), \
1121  .tlv = { .p = xtlv } }
1122#define ES1938_SINGLE(xname, xindex, reg, shift, mask, invert) \
1123{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1124  .info = snd_es1938_info_single, \
1125  .get = snd_es1938_get_single, .put = snd_es1938_put_single, \
1126  .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24) }
1127
1128static int snd_es1938_info_single(struct snd_kcontrol *kcontrol,
1129				  struct snd_ctl_elem_info *uinfo)
1130{
1131	int mask = (kcontrol->private_value >> 16) & 0xff;
1132
1133	uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1134	uinfo->count = 1;
1135	uinfo->value.integer.min = 0;
1136	uinfo->value.integer.max = mask;
1137	return 0;
1138}
1139
1140static int snd_es1938_get_single(struct snd_kcontrol *kcontrol,
1141				 struct snd_ctl_elem_value *ucontrol)
1142{
1143	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1144	int reg = kcontrol->private_value & 0xff;
1145	int shift = (kcontrol->private_value >> 8) & 0xff;
1146	int mask = (kcontrol->private_value >> 16) & 0xff;
1147	int invert = (kcontrol->private_value >> 24) & 0xff;
1148	int val;
1149	
1150	val = snd_es1938_reg_read(chip, reg);
1151	ucontrol->value.integer.value[0] = (val >> shift) & mask;
1152	if (invert)
1153		ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1154	return 0;
1155}
1156
1157static int snd_es1938_put_single(struct snd_kcontrol *kcontrol,
1158				 struct snd_ctl_elem_value *ucontrol)
1159{
1160	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1161	int reg = kcontrol->private_value & 0xff;
1162	int shift = (kcontrol->private_value >> 8) & 0xff;
1163	int mask = (kcontrol->private_value >> 16) & 0xff;
1164	int invert = (kcontrol->private_value >> 24) & 0xff;
1165	unsigned char val;
1166	
1167	val = (ucontrol->value.integer.value[0] & mask);
1168	if (invert)
1169		val = mask - val;
1170	mask <<= shift;
1171	val <<= shift;
1172	return snd_es1938_reg_bits(chip, reg, mask, val) != val;
1173}
1174
1175#define ES1938_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert, xtlv) \
1176{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1177  .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,\
1178  .name = xname, .index = xindex, \
1179  .info = snd_es1938_info_double, \
1180  .get = snd_es1938_get_double, .put = snd_es1938_put_double, \
1181  .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22), \
1182  .tlv = { .p = xtlv } }
1183#define ES1938_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
1184{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1185  .info = snd_es1938_info_double, \
1186  .get = snd_es1938_get_double, .put = snd_es1938_put_double, \
1187  .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) }
1188
1189static int snd_es1938_info_double(struct snd_kcontrol *kcontrol,
1190				  struct snd_ctl_elem_info *uinfo)
1191{
1192	int mask = (kcontrol->private_value >> 24) & 0xff;
1193
1194	uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1195	uinfo->count = 2;
1196	uinfo->value.integer.min = 0;
1197	uinfo->value.integer.max = mask;
1198	return 0;
1199}
1200
1201static int snd_es1938_get_double(struct snd_kcontrol *kcontrol,
1202				 struct snd_ctl_elem_value *ucontrol)
1203{
1204	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1205	int left_reg = kcontrol->private_value & 0xff;
1206	int right_reg = (kcontrol->private_value >> 8) & 0xff;
1207	int shift_left = (kcontrol->private_value >> 16) & 0x07;
1208	int shift_right = (kcontrol->private_value >> 19) & 0x07;
1209	int mask = (kcontrol->private_value >> 24) & 0xff;
1210	int invert = (kcontrol->private_value >> 22) & 1;
1211	unsigned char left, right;
1212	
1213	left = snd_es1938_reg_read(chip, left_reg);
1214	if (left_reg != right_reg)
1215		right = snd_es1938_reg_read(chip, right_reg);
1216	else
1217		right = left;
1218	ucontrol->value.integer.value[0] = (left >> shift_left) & mask;
1219	ucontrol->value.integer.value[1] = (right >> shift_right) & mask;
1220	if (invert) {
1221		ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1222		ucontrol->value.integer.value[1] = mask - ucontrol->value.integer.value[1];
1223	}
1224	return 0;
1225}
1226
1227static int snd_es1938_put_double(struct snd_kcontrol *kcontrol,
1228				 struct snd_ctl_elem_value *ucontrol)
1229{
1230	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1231	int left_reg = kcontrol->private_value & 0xff;
1232	int right_reg = (kcontrol->private_value >> 8) & 0xff;
1233	int shift_left = (kcontrol->private_value >> 16) & 0x07;
1234	int shift_right = (kcontrol->private_value >> 19) & 0x07;
1235	int mask = (kcontrol->private_value >> 24) & 0xff;
1236	int invert = (kcontrol->private_value >> 22) & 1;
1237	int change;
1238	unsigned char val1, val2, mask1, mask2;
1239	
1240	val1 = ucontrol->value.integer.value[0] & mask;
1241	val2 = ucontrol->value.integer.value[1] & mask;
1242	if (invert) {
1243		val1 = mask - val1;
1244		val2 = mask - val2;
1245	}
1246	val1 <<= shift_left;
1247	val2 <<= shift_right;
1248	mask1 = mask << shift_left;
1249	mask2 = mask << shift_right;
1250	if (left_reg != right_reg) {
1251		change = 0;
1252		if (snd_es1938_reg_bits(chip, left_reg, mask1, val1) != val1)
1253			change = 1;
1254		if (snd_es1938_reg_bits(chip, right_reg, mask2, val2) != val2)
1255			change = 1;
1256	} else {
1257		change = (snd_es1938_reg_bits(chip, left_reg, mask1 | mask2, 
1258					      val1 | val2) != (val1 | val2));
1259	}
1260	return change;
1261}
1262
1263static const DECLARE_TLV_DB_RANGE(db_scale_master,
 
1264	0, 54, TLV_DB_SCALE_ITEM(-3600, 50, 1),
1265	54, 63, TLV_DB_SCALE_ITEM(-900, 100, 0),
1266);
1267
1268static const DECLARE_TLV_DB_RANGE(db_scale_audio1,
 
1269	0, 8, TLV_DB_SCALE_ITEM(-3300, 300, 1),
1270	8, 15, TLV_DB_SCALE_ITEM(-900, 150, 0),
1271);
1272
1273static const DECLARE_TLV_DB_RANGE(db_scale_audio2,
 
1274	0, 8, TLV_DB_SCALE_ITEM(-3450, 300, 1),
1275	8, 15, TLV_DB_SCALE_ITEM(-1050, 150, 0),
1276);
1277
1278static const DECLARE_TLV_DB_RANGE(db_scale_mic,
 
1279	0, 8, TLV_DB_SCALE_ITEM(-2400, 300, 1),
1280	8, 15, TLV_DB_SCALE_ITEM(0, 150, 0),
1281);
1282
1283static const DECLARE_TLV_DB_RANGE(db_scale_line,
 
1284	0, 8, TLV_DB_SCALE_ITEM(-3150, 300, 1),
1285	8, 15, TLV_DB_SCALE_ITEM(-750, 150, 0),
1286);
1287
1288static const DECLARE_TLV_DB_SCALE(db_scale_capture, 0, 150, 0);
1289
1290static const struct snd_kcontrol_new snd_es1938_controls[] = {
1291ES1938_DOUBLE_TLV("Master Playback Volume", 0, 0x60, 0x62, 0, 0, 63, 0,
1292		  db_scale_master),
1293ES1938_DOUBLE("Master Playback Switch", 0, 0x60, 0x62, 6, 6, 1, 1),
1294{
1295	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1296	.name = "Hardware Master Playback Volume",
1297	.access = SNDRV_CTL_ELEM_ACCESS_READ,
1298	.info = snd_es1938_info_hw_volume,
1299	.get = snd_es1938_get_hw_volume,
1300},
1301{
1302	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1303	.access = (SNDRV_CTL_ELEM_ACCESS_READ |
1304		   SNDRV_CTL_ELEM_ACCESS_TLV_READ),
1305	.name = "Hardware Master Playback Switch",
1306	.info = snd_es1938_info_hw_switch,
1307	.get = snd_es1938_get_hw_switch,
1308	.tlv = { .p = db_scale_master },
1309},
1310ES1938_SINGLE("Hardware Volume Split", 0, 0x64, 7, 1, 0),
1311ES1938_DOUBLE_TLV("Line Playback Volume", 0, 0x3e, 0x3e, 4, 0, 15, 0,
1312		  db_scale_line),
1313ES1938_DOUBLE("CD Playback Volume", 0, 0x38, 0x38, 4, 0, 15, 0),
1314ES1938_DOUBLE_TLV("FM Playback Volume", 0, 0x36, 0x36, 4, 0, 15, 0,
1315		  db_scale_mic),
1316ES1938_DOUBLE_TLV("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0,
1317		  db_scale_line),
1318ES1938_DOUBLE_TLV("Mic Playback Volume", 0, 0x1a, 0x1a, 4, 0, 15, 0,
1319		  db_scale_mic),
1320ES1938_DOUBLE_TLV("Aux Playback Volume", 0, 0x3a, 0x3a, 4, 0, 15, 0,
1321		  db_scale_line),
1322ES1938_DOUBLE_TLV("Capture Volume", 0, 0xb4, 0xb4, 4, 0, 15, 0,
1323		  db_scale_capture),
1324ES1938_SINGLE("Beep Volume", 0, 0x3c, 0, 7, 0),
1325ES1938_SINGLE("Record Monitor", 0, 0xa8, 3, 1, 0),
1326ES1938_SINGLE("Capture Switch", 0, 0x1c, 4, 1, 1),
1327{
1328	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1329	.name = "Capture Source",
1330	.info = snd_es1938_info_mux,
1331	.get = snd_es1938_get_mux,
1332	.put = snd_es1938_put_mux,
1333},
1334ES1938_DOUBLE_TLV("Mono Input Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0,
1335		  db_scale_line),
1336ES1938_DOUBLE_TLV("PCM Capture Volume", 0, 0x69, 0x69, 4, 0, 15, 0,
1337		  db_scale_audio2),
1338ES1938_DOUBLE_TLV("Mic Capture Volume", 0, 0x68, 0x68, 4, 0, 15, 0,
1339		  db_scale_mic),
1340ES1938_DOUBLE_TLV("Line Capture Volume", 0, 0x6e, 0x6e, 4, 0, 15, 0,
1341		  db_scale_line),
1342ES1938_DOUBLE_TLV("FM Capture Volume", 0, 0x6b, 0x6b, 4, 0, 15, 0,
1343		  db_scale_mic),
1344ES1938_DOUBLE_TLV("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0,
1345		  db_scale_line),
1346ES1938_DOUBLE_TLV("CD Capture Volume", 0, 0x6a, 0x6a, 4, 0, 15, 0,
1347		  db_scale_line),
1348ES1938_DOUBLE_TLV("Aux Capture Volume", 0, 0x6c, 0x6c, 4, 0, 15, 0,
1349		  db_scale_line),
1350ES1938_DOUBLE_TLV("PCM Playback Volume", 0, 0x7c, 0x7c, 4, 0, 15, 0,
1351		  db_scale_audio2),
1352ES1938_DOUBLE_TLV("PCM Playback Volume", 1, 0x14, 0x14, 4, 0, 15, 0,
1353		  db_scale_audio1),
1354ES1938_SINGLE("3D Control - Level", 0, 0x52, 0, 63, 0),
1355{
1356	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1357	.name = "3D Control - Switch",
1358	.info = snd_es1938_info_spatializer_enable,
1359	.get = snd_es1938_get_spatializer_enable,
1360	.put = snd_es1938_put_spatializer_enable,
1361},
1362ES1938_SINGLE("Mic Boost (+26dB)", 0, 0x7d, 3, 1, 0)
1363};
1364
1365
1366/* ---------------------------------------------------------------------------- */
1367/* ---------------------------------------------------------------------------- */
1368
1369/*
1370 * initialize the chip - used by resume callback, too
1371 */
1372static void snd_es1938_chip_init(struct es1938 *chip)
1373{
1374	/* reset chip */
1375	snd_es1938_reset(chip);
1376
1377	/* configure native mode */
1378
1379	/* enable bus master */
1380	pci_set_master(chip->pci);
1381
1382	/* disable legacy audio */
1383	pci_write_config_word(chip->pci, SL_PCI_LEGACYCONTROL, 0x805f);
1384
1385	/* set DDMA base */
1386	pci_write_config_word(chip->pci, SL_PCI_DDMACONTROL, chip->ddma_port | 1);
1387
1388	/* set DMA/IRQ policy */
1389	pci_write_config_dword(chip->pci, SL_PCI_CONFIG, 0);
1390
1391	/* enable Audio 1, Audio 2, MPU401 IRQ and HW volume IRQ*/
1392	outb(0xf0, SLIO_REG(chip, IRQCONTROL));
1393
1394	/* reset DMA */
1395	outb(0, SLDM_REG(chip, DMACLEAR));
1396}
1397
1398#ifdef CONFIG_PM_SLEEP
1399/*
1400 * PM support
1401 */
1402
1403static const unsigned char saved_regs[SAVED_REG_SIZE+1] = {
1404	0x14, 0x1a, 0x1c, 0x3a, 0x3c, 0x3e, 0x36, 0x38,
1405	0x50, 0x52, 0x60, 0x61, 0x62, 0x63, 0x64, 0x68,
1406	0x69, 0x6a, 0x6b, 0x6d, 0x6e, 0x6f, 0x7c, 0x7d,
1407	0xa8, 0xb4,
1408};
1409
1410
1411static int es1938_suspend(struct device *dev)
1412{
1413	struct snd_card *card = dev_get_drvdata(dev);
1414	struct es1938 *chip = card->private_data;
1415	const unsigned char *s;
1416	unsigned char *d;
1417
1418	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
 
1419
1420	/* save mixer-related registers */
1421	for (s = saved_regs, d = chip->saved_regs; *s; s++, d++)
1422		*d = snd_es1938_reg_read(chip, *s);
1423
1424	outb(0x00, SLIO_REG(chip, IRQCONTROL)); /* disable irqs */
1425	if (chip->irq >= 0) {
1426		free_irq(chip->irq, chip);
1427		chip->irq = -1;
1428		card->sync_irq = -1;
1429	}
 
 
 
1430	return 0;
1431}
1432
1433static int es1938_resume(struct device *dev)
1434{
1435	struct pci_dev *pci = to_pci_dev(dev);
1436	struct snd_card *card = dev_get_drvdata(dev);
1437	struct es1938 *chip = card->private_data;
1438	const unsigned char *s;
1439	unsigned char *d;
 
 
 
 
 
 
 
 
1440
1441	if (request_irq(pci->irq, snd_es1938_interrupt,
1442			IRQF_SHARED, KBUILD_MODNAME, chip)) {
1443		dev_err(dev, "unable to grab IRQ %d, disabling device\n",
1444			pci->irq);
1445		snd_card_disconnect(card);
1446		return -EIO;
1447	}
1448	chip->irq = pci->irq;
1449	card->sync_irq = chip->irq;
1450	snd_es1938_chip_init(chip);
1451
1452	/* restore mixer-related registers */
1453	for (s = saved_regs, d = chip->saved_regs; *s; s++, d++) {
1454		if (*s < 0xa0)
1455			snd_es1938_mixer_write(chip, *s, *d);
1456		else
1457			snd_es1938_write(chip, *s, *d);
1458	}
1459
1460	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
1461	return 0;
1462}
1463
1464static SIMPLE_DEV_PM_OPS(es1938_pm, es1938_suspend, es1938_resume);
1465#define ES1938_PM_OPS	&es1938_pm
1466#else
1467#define ES1938_PM_OPS	NULL
1468#endif /* CONFIG_PM_SLEEP */
1469
1470#ifdef SUPPORT_JOYSTICK
1471static int snd_es1938_create_gameport(struct es1938 *chip)
1472{
1473	struct gameport *gp;
1474
1475	chip->gameport = gp = gameport_allocate_port();
1476	if (!gp) {
1477		dev_err(chip->card->dev,
1478			"cannot allocate memory for gameport\n");
1479		return -ENOMEM;
1480	}
1481
1482	gameport_set_name(gp, "ES1938");
1483	gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci));
1484	gameport_set_dev_parent(gp, &chip->pci->dev);
1485	gp->io = chip->game_port;
1486
1487	gameport_register_port(gp);
1488
1489	return 0;
1490}
1491
1492static void snd_es1938_free_gameport(struct es1938 *chip)
1493{
1494	if (chip->gameport) {
1495		gameport_unregister_port(chip->gameport);
1496		chip->gameport = NULL;
1497	}
1498}
1499#else
1500static inline int snd_es1938_create_gameport(struct es1938 *chip) { return -ENOSYS; }
1501static inline void snd_es1938_free_gameport(struct es1938 *chip) { }
1502#endif /* SUPPORT_JOYSTICK */
1503
1504static void snd_es1938_free(struct snd_card *card)
1505{
1506	struct es1938 *chip = card->private_data;
1507
1508	/* disable irqs */
1509	outb(0x00, SLIO_REG(chip, IRQCONTROL));
1510	if (chip->rmidi)
1511		snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0);
1512
1513	snd_es1938_free_gameport(chip);
1514
1515	if (chip->irq >= 0)
1516		free_irq(chip->irq, chip);
 
 
 
 
 
 
 
 
 
 
1517}
1518
1519static int snd_es1938_create(struct snd_card *card,
1520			     struct pci_dev *pci)
 
1521{
1522	struct es1938 *chip = card->private_data;
1523	int err;
 
 
 
 
 
1524
1525	/* enable PCI device */
1526	err = pcim_enable_device(pci);
1527	if (err < 0)
1528		return err;
1529        /* check, if we can restrict PCI DMA transfers to 24 bits */
1530	if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(24))) {
1531		dev_err(card->dev,
1532			"architecture does not support 24bit PCI busmaster DMA\n");
 
1533                return -ENXIO;
1534        }
1535
 
 
 
 
 
1536	spin_lock_init(&chip->reg_lock);
1537	spin_lock_init(&chip->mixer_lock);
1538	chip->card = card;
1539	chip->pci = pci;
1540	chip->irq = -1;
1541	err = pci_request_regions(pci, "ESS Solo-1");
1542	if (err < 0)
 
1543		return err;
 
1544	chip->io_port = pci_resource_start(pci, 0);
1545	chip->sb_port = pci_resource_start(pci, 1);
1546	chip->vc_port = pci_resource_start(pci, 2);
1547	chip->mpu_port = pci_resource_start(pci, 3);
1548	chip->game_port = pci_resource_start(pci, 4);
1549	/* still use non-managed irq handler as it's re-acquired at PM resume */
1550	if (request_irq(pci->irq, snd_es1938_interrupt, IRQF_SHARED,
1551			KBUILD_MODNAME, chip)) {
1552		dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
 
1553		return -EBUSY;
1554	}
1555	chip->irq = pci->irq;
1556	card->sync_irq = chip->irq;
1557	card->private_free = snd_es1938_free;
1558	dev_dbg(card->dev,
1559		"create: io: 0x%lx, sb: 0x%lx, vc: 0x%lx, mpu: 0x%lx, game: 0x%lx\n",
1560		   chip->io_port, chip->sb_port, chip->vc_port, chip->mpu_port, chip->game_port);
 
1561
1562	chip->ddma_port = chip->vc_port + 0x00;		/* fix from Thomas Sailer */
1563
1564	snd_es1938_chip_init(chip);
 
 
 
 
 
 
 
 
 
1565	return 0;
1566}
1567
1568/* --------------------------------------------------------------------
1569 * Interrupt handler
1570 * -------------------------------------------------------------------- */
1571static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id)
1572{
1573	struct es1938 *chip = dev_id;
1574	unsigned char status;
1575	__always_unused unsigned char audiostatus;
1576	int handled = 0;
1577
1578	status = inb(SLIO_REG(chip, IRQCONTROL));
1579#if 0
1580	dev_dbg(chip->card->dev,
1581		"Es1938debug - interrupt status: =0x%x\n", status);
1582#endif
1583	
1584	/* AUDIO 1 */
1585	if (status & 0x10) {
1586#if 0
1587		dev_dbg(chip->card->dev,
1588		       "Es1938debug - AUDIO channel 1 interrupt\n");
1589		dev_dbg(chip->card->dev,
1590		       "Es1938debug - AUDIO channel 1 DMAC DMA count: %u\n",
1591		       inw(SLDM_REG(chip, DMACOUNT)));
1592		dev_dbg(chip->card->dev,
1593		       "Es1938debug - AUDIO channel 1 DMAC DMA base: %u\n",
1594		       inl(SLDM_REG(chip, DMAADDR)));
1595		dev_dbg(chip->card->dev,
1596		       "Es1938debug - AUDIO channel 1 DMAC DMA status: 0x%x\n",
1597		       inl(SLDM_REG(chip, DMASTATUS)));
1598#endif
1599		/* clear irq */
1600		handled = 1;
1601		audiostatus = inb(SLSB_REG(chip, STATUS));
1602		if (chip->active & ADC1)
1603			snd_pcm_period_elapsed(chip->capture_substream);
1604		else if (chip->active & DAC1)
1605			snd_pcm_period_elapsed(chip->playback2_substream);
1606	}
1607	
1608	/* AUDIO 2 */
1609	if (status & 0x20) {
1610#if 0
1611		dev_dbg(chip->card->dev,
1612		       "Es1938debug - AUDIO channel 2 interrupt\n");
1613		dev_dbg(chip->card->dev,
1614		       "Es1938debug - AUDIO channel 2 DMAC DMA count: %u\n",
1615		       inw(SLIO_REG(chip, AUDIO2DMACOUNT)));
1616		dev_dbg(chip->card->dev,
1617		       "Es1938debug - AUDIO channel 2 DMAC DMA base: %u\n",
1618		       inl(SLIO_REG(chip, AUDIO2DMAADDR)));
1619
1620#endif
1621		/* clear irq */
1622		handled = 1;
1623		snd_es1938_mixer_bits(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x80, 0);
1624		if (chip->active & DAC2)
1625			snd_pcm_period_elapsed(chip->playback1_substream);
1626	}
1627
1628	/* Hardware volume */
1629	if (status & 0x40) {
1630		int split = snd_es1938_mixer_read(chip, 0x64) & 0x80;
1631		handled = 1;
1632		snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_switch->id);
1633		snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_volume->id);
1634		if (!split) {
1635			snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1636				       &chip->master_switch->id);
1637			snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1638				       &chip->master_volume->id);
1639		}
1640		/* ack interrupt */
1641		snd_es1938_mixer_write(chip, 0x66, 0x00);
1642	}
1643
1644	/* MPU401 */
1645	if (status & 0x80) {
1646		// the following line is evil! It switches off MIDI interrupt handling after the first interrupt received.
1647		// replacing the last 0 by 0x40 works for ESS-Solo1, but just doing nothing works as well!
1648		// andreas@flying-snail.de
1649		// snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0); /* ack? */
1650		if (chip->rmidi) {
1651			handled = 1;
1652			snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data);
1653		}
1654	}
1655	return IRQ_RETVAL(handled);
1656}
1657
1658#define ES1938_DMA_SIZE 64
1659
1660static int snd_es1938_mixer(struct es1938 *chip)
1661{
1662	struct snd_card *card;
1663	unsigned int idx;
1664	int err;
1665
1666	card = chip->card;
1667
1668	strcpy(card->mixername, "ESS Solo-1");
1669
1670	for (idx = 0; idx < ARRAY_SIZE(snd_es1938_controls); idx++) {
1671		struct snd_kcontrol *kctl;
1672		kctl = snd_ctl_new1(&snd_es1938_controls[idx], chip);
1673		switch (idx) {
1674			case 0:
1675				chip->master_volume = kctl;
1676				kctl->private_free = snd_es1938_hwv_free;
1677				break;
1678			case 1:
1679				chip->master_switch = kctl;
1680				kctl->private_free = snd_es1938_hwv_free;
1681				break;
1682			case 2:
1683				chip->hw_volume = kctl;
1684				kctl->private_free = snd_es1938_hwv_free;
1685				break;
1686			case 3:
1687				chip->hw_switch = kctl;
1688				kctl->private_free = snd_es1938_hwv_free;
1689				break;
1690			}
1691		err = snd_ctl_add(card, kctl);
1692		if (err < 0)
1693			return err;
1694	}
1695	return 0;
1696}
1697       
1698
1699static int __snd_es1938_probe(struct pci_dev *pci,
1700			      const struct pci_device_id *pci_id)
1701{
1702	static int dev;
1703	struct snd_card *card;
1704	struct es1938 *chip;
1705	struct snd_opl3 *opl3;
1706	int idx, err;
1707
1708	if (dev >= SNDRV_CARDS)
1709		return -ENODEV;
1710	if (!enable[dev]) {
1711		dev++;
1712		return -ENOENT;
1713	}
1714
1715	err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
1716				sizeof(*chip), &card);
1717	if (err < 0)
1718		return err;
1719	chip = card->private_data;
1720
1721	for (idx = 0; idx < 5; idx++)
1722		if (pci_resource_start(pci, idx) == 0 ||
1723		    !(pci_resource_flags(pci, idx) & IORESOURCE_IO))
1724			return -ENODEV;
1725
1726	err = snd_es1938_create(card, pci);
1727	if (err < 0)
 
 
1728		return err;
 
 
1729
1730	strcpy(card->driver, "ES1938");
1731	strcpy(card->shortname, "ESS ES1938 (Solo-1)");
1732	sprintf(card->longname, "%s rev %i, irq %i",
1733		card->shortname,
1734		chip->revision,
1735		chip->irq);
1736
1737	err = snd_es1938_new_pcm(chip, 0);
1738	if (err < 0)
1739		return err;
1740	err = snd_es1938_mixer(chip);
1741	if (err < 0)
 
1742		return err;
 
1743	if (snd_opl3_create(card,
1744			    SLSB_REG(chip, FMLOWADDR),
1745			    SLSB_REG(chip, FMHIGHADDR),
1746			    OPL3_HW_OPL3, 1, &opl3) < 0) {
1747		dev_err(card->dev, "OPL3 not detected at 0x%lx\n",
1748			   SLSB_REG(chip, FMLOWADDR));
1749	} else {
1750		err = snd_opl3_timer_new(opl3, 0, 1);
1751		if (err < 0)
1752	                return err;
1753		err = snd_opl3_hwdep_new(opl3, 0, 1, NULL);
1754		if (err < 0)
 
1755	                return err;
 
1756	}
1757	if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
1758				chip->mpu_port,
1759				MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK,
1760				-1, &chip->rmidi) < 0) {
1761		dev_err(card->dev, "unable to initialize MPU-401\n");
1762	} else {
1763		// this line is vital for MIDI interrupt handling on ess-solo1
1764		// andreas@flying-snail.de
1765		snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0x40);
1766	}
1767
1768	snd_es1938_create_gameport(chip);
1769
1770	err = snd_card_register(card);
1771	if (err < 0)
1772		return err;
 
1773
1774	pci_set_drvdata(pci, card);
1775	dev++;
1776	return 0;
1777}
1778
1779static int snd_es1938_probe(struct pci_dev *pci,
1780			    const struct pci_device_id *pci_id)
1781{
1782	return snd_card_free_on_error(&pci->dev, __snd_es1938_probe(pci, pci_id));
 
1783}
1784
1785static struct pci_driver es1938_driver = {
1786	.name = KBUILD_MODNAME,
1787	.id_table = snd_es1938_ids,
1788	.probe = snd_es1938_probe,
1789	.driver = {
1790		.pm = ES1938_PM_OPS,
1791	},
 
 
1792};
1793
1794module_pci_driver(es1938_driver);