1 // SPDX-License-Identifier: GPL-2.0-or-later
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>
10 * Rewritten from sonicvibes.c source.
13 * Rewrite better spinlocks
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
28 I've seen that using small period sizes.
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>
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>
52 MODULE_AUTHOR("Jaromir Koutek <miri@punknet.cz>");
53 MODULE_DESCRIPTION("ESS Solo-1");
54 MODULE_LICENSE("GPL");
56 #if IS_REACHABLE(CONFIG_GAMEPORT)
57 #define SUPPORT_JOYSTICK 1
60 static int index
[SNDRV_CARDS
] = SNDRV_DEFAULT_IDX
; /* Index 0-MAX */
61 static char *id
[SNDRV_CARDS
] = SNDRV_DEFAULT_STR
; /* ID for this card */
62 static bool enable
[SNDRV_CARDS
] = SNDRV_DEFAULT_ENABLE_PNP
; /* Enable this card */
64 module_param_array(index
, int, NULL
, 0444);
65 MODULE_PARM_DESC(index
, "Index value for ESS Solo-1 soundcard.");
66 module_param_array(id
, charp
, NULL
, 0444);
67 MODULE_PARM_DESC(id
, "ID string for ESS Solo-1 soundcard.");
68 module_param_array(enable
, bool, NULL
, 0444);
69 MODULE_PARM_DESC(enable
, "Enable ESS Solo-1 soundcard.");
71 #define SLIO_REG(chip, x) ((chip)->io_port + ESSIO_REG_##x)
73 #define SLDM_REG(chip, x) ((chip)->ddma_port + ESSDM_REG_##x)
75 #define SLSB_REG(chip, x) ((chip)->sb_port + ESSSB_REG_##x)
77 #define SL_PCI_LEGACYCONTROL 0x40
78 #define SL_PCI_CONFIG 0x50
79 #define SL_PCI_DDMACONTROL 0x60
81 #define ESSIO_REG_AUDIO2DMAADDR 0
82 #define ESSIO_REG_AUDIO2DMACOUNT 4
83 #define ESSIO_REG_AUDIO2MODE 6
84 #define ESSIO_REG_IRQCONTROL 7
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
94 #define ESSSB_REG_FMLOWADDR 0x00
95 #define ESSSB_REG_FMHIGHADDR 0x02
96 #define ESSSB_REG_MIXERADDR 0x04
97 #define ESSSB_REG_MIXERDATA 0x05
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
130 #define ESSSB_REG_RESET 0x06
132 #define ESSSB_REG_READDATA 0x0a
133 #define ESSSB_REG_WRITEDATA 0x0c
134 #define ESSSB_REG_READSTATUS 0x0c
136 #define ESSSB_REG_STATUS 0x0e
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
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
175 #define SAVED_REG_SIZE 32 /* max. number of registers to save */
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
;
187 unsigned char irqmask
;
188 unsigned char revision
;
190 struct snd_kcontrol
*hw_volume
;
191 struct snd_kcontrol
*hw_switch
;
192 struct snd_kcontrol
*master_volume
;
193 struct snd_kcontrol
*master_switch
;
196 struct snd_card
*card
;
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
;
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
;
213 spinlock_t mixer_lock
;
214 struct snd_info_entry
*proc_entry
;
216 #ifdef SUPPORT_JOYSTICK
217 struct gameport
*gameport
;
219 unsigned char saved_regs
[SAVED_REG_SIZE
];
222 static irqreturn_t
snd_es1938_interrupt(int irq
, void *dev_id
);
224 static const struct pci_device_id snd_es1938_ids
[] = {
225 { PCI_VDEVICE(ESS
, 0x1969), 0, }, /* Solo-1 */
229 MODULE_DEVICE_TABLE(pci
, snd_es1938_ids
);
231 #define RESET_LOOP_TIMEOUT 0x10000
232 #define WRITE_LOOP_TIMEOUT 0x10000
233 #define GET_LOOP_TIMEOUT 0x01000
235 /* -----------------------------------------------------------------
236 * Write to a mixer register
237 * -----------------------------------------------------------------*/
238 static void snd_es1938_mixer_write(struct es1938
*chip
, unsigned char reg
, unsigned char val
)
241 spin_lock_irqsave(&chip
->mixer_lock
, flags
);
242 outb(reg
, SLSB_REG(chip
, MIXERADDR
));
243 outb(val
, SLSB_REG(chip
, MIXERDATA
));
244 spin_unlock_irqrestore(&chip
->mixer_lock
, flags
);
245 dev_dbg(chip
->card
->dev
, "Mixer reg %02x set to %02x\n", reg
, val
);
248 /* -----------------------------------------------------------------
249 * Read from a mixer register
250 * -----------------------------------------------------------------*/
251 static int snd_es1938_mixer_read(struct es1938
*chip
, unsigned char reg
)
255 spin_lock_irqsave(&chip
->mixer_lock
, flags
);
256 outb(reg
, SLSB_REG(chip
, MIXERADDR
));
257 data
= inb(SLSB_REG(chip
, MIXERDATA
));
258 spin_unlock_irqrestore(&chip
->mixer_lock
, flags
);
259 dev_dbg(chip
->card
->dev
, "Mixer reg %02x now is %02x\n", reg
, data
);
263 /* -----------------------------------------------------------------
264 * Write to some bits of a mixer register (return old value)
265 * -----------------------------------------------------------------*/
266 static int snd_es1938_mixer_bits(struct es1938
*chip
, unsigned char reg
,
267 unsigned char mask
, unsigned char val
)
270 unsigned char old
, new, oval
;
271 spin_lock_irqsave(&chip
->mixer_lock
, flags
);
272 outb(reg
, SLSB_REG(chip
, MIXERADDR
));
273 old
= inb(SLSB_REG(chip
, MIXERDATA
));
276 new = (old
& ~mask
) | (val
& mask
);
277 outb(new, SLSB_REG(chip
, MIXERDATA
));
278 dev_dbg(chip
->card
->dev
,
279 "Mixer reg %02x was %02x, set to %02x\n",
282 spin_unlock_irqrestore(&chip
->mixer_lock
, flags
);
286 /* -----------------------------------------------------------------
287 * Write command to Controller Registers
288 * -----------------------------------------------------------------*/
289 static void snd_es1938_write_cmd(struct es1938
*chip
, unsigned char cmd
)
293 for (i
= 0; i
< WRITE_LOOP_TIMEOUT
; i
++) {
294 v
= inb(SLSB_REG(chip
, READSTATUS
));
296 outb(cmd
, SLSB_REG(chip
, WRITEDATA
));
300 dev_err(chip
->card
->dev
,
301 "snd_es1938_write_cmd timeout (0x02%x/0x02%x)\n", cmd
, v
);
304 /* -----------------------------------------------------------------
305 * Read the Read Data Buffer
306 * -----------------------------------------------------------------*/
307 static int snd_es1938_get_byte(struct es1938
*chip
)
311 for (i
= GET_LOOP_TIMEOUT
; i
; i
--) {
312 v
= inb(SLSB_REG(chip
, STATUS
));
314 return inb(SLSB_REG(chip
, READDATA
));
316 dev_err(chip
->card
->dev
, "get_byte timeout: status 0x02%x\n", v
);
320 /* -----------------------------------------------------------------
321 * Write value cmd register
322 * -----------------------------------------------------------------*/
323 static void snd_es1938_write(struct es1938
*chip
, unsigned char reg
, unsigned char val
)
326 spin_lock_irqsave(&chip
->reg_lock
, flags
);
327 snd_es1938_write_cmd(chip
, reg
);
328 snd_es1938_write_cmd(chip
, val
);
329 spin_unlock_irqrestore(&chip
->reg_lock
, flags
);
330 dev_dbg(chip
->card
->dev
, "Reg %02x set to %02x\n", reg
, val
);
333 /* -----------------------------------------------------------------
334 * Read data from cmd register and return it
335 * -----------------------------------------------------------------*/
336 static unsigned char snd_es1938_read(struct es1938
*chip
, unsigned char reg
)
340 spin_lock_irqsave(&chip
->reg_lock
, flags
);
341 snd_es1938_write_cmd(chip
, ESS_CMD_READREG
);
342 snd_es1938_write_cmd(chip
, reg
);
343 val
= snd_es1938_get_byte(chip
);
344 spin_unlock_irqrestore(&chip
->reg_lock
, flags
);
345 dev_dbg(chip
->card
->dev
, "Reg %02x now is %02x\n", reg
, val
);
349 /* -----------------------------------------------------------------
350 * Write data to cmd register and return old value
351 * -----------------------------------------------------------------*/
352 static int snd_es1938_bits(struct es1938
*chip
, unsigned char reg
, unsigned char mask
,
356 unsigned char old
, new, oval
;
357 spin_lock_irqsave(&chip
->reg_lock
, flags
);
358 snd_es1938_write_cmd(chip
, ESS_CMD_READREG
);
359 snd_es1938_write_cmd(chip
, reg
);
360 old
= snd_es1938_get_byte(chip
);
363 snd_es1938_write_cmd(chip
, reg
);
364 new = (old
& ~mask
) | (val
& mask
);
365 snd_es1938_write_cmd(chip
, new);
366 dev_dbg(chip
->card
->dev
, "Reg %02x was %02x, set to %02x\n",
369 spin_unlock_irqrestore(&chip
->reg_lock
, flags
);
373 /* --------------------------------------------------------------------
375 * --------------------------------------------------------------------*/
376 static void snd_es1938_reset(struct es1938
*chip
)
380 outb(3, SLSB_REG(chip
, RESET
));
381 inb(SLSB_REG(chip
, RESET
));
382 outb(0, SLSB_REG(chip
, RESET
));
383 for (i
= 0; i
< RESET_LOOP_TIMEOUT
; i
++) {
384 if (inb(SLSB_REG(chip
, STATUS
)) & 0x80) {
385 if (inb(SLSB_REG(chip
, READDATA
)) == 0xaa)
389 dev_err(chip
->card
->dev
, "ESS Solo-1 reset failed\n");
392 snd_es1938_write_cmd(chip
, ESS_CMD_ENABLEEXT
);
394 /* Demand transfer DMA: 4 bytes per DMA request */
395 snd_es1938_write(chip
, ESS_CMD_DMATYPE
, 2);
397 /* Change behaviour of register A1
399 2nd channel DAC asynchronous */
400 snd_es1938_mixer_write(chip
, ESSSB_IREG_AUDIO2MODE
, 0x32);
401 /* enable/select DMA channel and IRQ channel */
402 snd_es1938_bits(chip
, ESS_CMD_IRQCONTROL
, 0xf0, 0x50);
403 snd_es1938_bits(chip
, ESS_CMD_DRQCONTROL
, 0xf0, 0x50);
404 snd_es1938_write_cmd(chip
, ESS_CMD_ENABLEAUDIO1
);
405 /* Set spatializer parameters to recommended values */
406 snd_es1938_mixer_write(chip
, 0x54, 0x8f);
407 snd_es1938_mixer_write(chip
, 0x56, 0x95);
408 snd_es1938_mixer_write(chip
, 0x58, 0x94);
409 snd_es1938_mixer_write(chip
, 0x5a, 0x80);
412 /* --------------------------------------------------------------------
414 * --------------------------------------------------------------------*/
415 static void snd_es1938_reset_fifo(struct es1938
*chip
)
417 outb(2, SLSB_REG(chip
, RESET
));
418 outb(0, SLSB_REG(chip
, RESET
));
421 static const struct snd_ratnum clocks
[2] = {
436 static const struct snd_pcm_hw_constraint_ratnums hw_constraints_clocks
= {
442 static void snd_es1938_rate_set(struct es1938
*chip
,
443 struct snd_pcm_substream
*substream
,
446 unsigned int bits
, div0
;
447 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
448 if (runtime
->rate_num
== clocks
[0].num
)
449 bits
= 128 - runtime
->rate_den
;
451 bits
= 256 - runtime
->rate_den
;
453 /* set filter register */
454 div0
= 256 - 7160000*20/(8*82*runtime
->rate
);
457 snd_es1938_mixer_write(chip
, 0x70, bits
);
458 snd_es1938_mixer_write(chip
, 0x72, div0
);
460 snd_es1938_write(chip
, 0xA1, bits
);
461 snd_es1938_write(chip
, 0xA2, div0
);
465 /* --------------------------------------------------------------------
466 * Configure Solo1 builtin DMA Controller
467 * --------------------------------------------------------------------*/
469 static void snd_es1938_playback1_setdma(struct es1938
*chip
)
471 outb(0x00, SLIO_REG(chip
, AUDIO2MODE
));
472 outl(chip
->dma2_start
, SLIO_REG(chip
, AUDIO2DMAADDR
));
473 outw(0, SLIO_REG(chip
, AUDIO2DMACOUNT
));
474 outw(chip
->dma2_size
, SLIO_REG(chip
, AUDIO2DMACOUNT
));
477 static void snd_es1938_playback2_setdma(struct es1938
*chip
)
479 /* Enable DMA controller */
480 outb(0xc4, SLDM_REG(chip
, DMACOMMAND
));
481 /* 1. Master reset */
482 outb(0, SLDM_REG(chip
, DMACLEAR
));
484 outb(1, SLDM_REG(chip
, DMAMASK
));
485 outb(0x18, SLDM_REG(chip
, DMAMODE
));
486 outl(chip
->dma1_start
, SLDM_REG(chip
, DMAADDR
));
487 outw(chip
->dma1_size
- 1, SLDM_REG(chip
, DMACOUNT
));
489 outb(0, SLDM_REG(chip
, DMAMASK
));
492 static void snd_es1938_capture_setdma(struct es1938
*chip
)
494 /* Enable DMA controller */
495 outb(0xc4, SLDM_REG(chip
, DMACOMMAND
));
496 /* 1. Master reset */
497 outb(0, SLDM_REG(chip
, DMACLEAR
));
499 outb(1, SLDM_REG(chip
, DMAMASK
));
500 outb(0x14, SLDM_REG(chip
, DMAMODE
));
501 outl(chip
->dma1_start
, SLDM_REG(chip
, DMAADDR
));
502 chip
->last_capture_dmaaddr
= chip
->dma1_start
;
503 outw(chip
->dma1_size
- 1, SLDM_REG(chip
, DMACOUNT
));
505 outb(0, SLDM_REG(chip
, DMAMASK
));
508 /* ----------------------------------------------------------------------
513 static int snd_es1938_capture_trigger(struct snd_pcm_substream
*substream
,
516 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
519 case SNDRV_PCM_TRIGGER_START
:
520 case SNDRV_PCM_TRIGGER_RESUME
:
522 chip
->active
|= ADC1
;
524 case SNDRV_PCM_TRIGGER_STOP
:
525 case SNDRV_PCM_TRIGGER_SUSPEND
:
527 chip
->active
&= ~ADC1
;
532 snd_es1938_write(chip
, ESS_CMD_DMACONTROL
, val
);
536 static int snd_es1938_playback1_trigger(struct snd_pcm_substream
*substream
,
539 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
541 case SNDRV_PCM_TRIGGER_START
:
542 case SNDRV_PCM_TRIGGER_RESUME
:
543 /* According to the documentation this should be:
544 0x13 but that value may randomly swap stereo channels */
545 snd_es1938_mixer_write(chip
, ESSSB_IREG_AUDIO2CONTROL1
, 0x92);
547 snd_es1938_mixer_write(chip
, ESSSB_IREG_AUDIO2CONTROL1
, 0x93);
548 /* This two stage init gives the FIFO -> DAC connection time to
549 * settle before first data from DMA flows in. This should ensure
550 * no swapping of stereo channels. Report a bug if otherwise :-) */
551 outb(0x0a, SLIO_REG(chip
, AUDIO2MODE
));
552 chip
->active
|= DAC2
;
554 case SNDRV_PCM_TRIGGER_STOP
:
555 case SNDRV_PCM_TRIGGER_SUSPEND
:
556 outb(0, SLIO_REG(chip
, AUDIO2MODE
));
557 snd_es1938_mixer_write(chip
, ESSSB_IREG_AUDIO2CONTROL1
, 0);
558 chip
->active
&= ~DAC2
;
566 static int snd_es1938_playback2_trigger(struct snd_pcm_substream
*substream
,
569 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
572 case SNDRV_PCM_TRIGGER_START
:
573 case SNDRV_PCM_TRIGGER_RESUME
:
575 chip
->active
|= DAC1
;
577 case SNDRV_PCM_TRIGGER_STOP
:
578 case SNDRV_PCM_TRIGGER_SUSPEND
:
580 chip
->active
&= ~DAC1
;
585 snd_es1938_write(chip
, ESS_CMD_DMACONTROL
, val
);
589 static int snd_es1938_playback_trigger(struct snd_pcm_substream
*substream
,
592 switch (substream
->number
) {
594 return snd_es1938_playback1_trigger(substream
, cmd
);
596 return snd_es1938_playback2_trigger(substream
, cmd
);
602 /* --------------------------------------------------------------------
603 * First channel for Extended Mode Audio 1 ADC Operation
604 * --------------------------------------------------------------------*/
605 static int snd_es1938_capture_prepare(struct snd_pcm_substream
*substream
)
607 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
608 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
610 unsigned int size
= snd_pcm_lib_buffer_bytes(substream
);
611 unsigned int count
= snd_pcm_lib_period_bytes(substream
);
613 chip
->dma1_size
= size
;
614 chip
->dma1_start
= runtime
->dma_addr
;
616 mono
= (runtime
->channels
> 1) ? 0 : 1;
617 is8
= snd_pcm_format_width(runtime
->format
) == 16 ? 0 : 1;
618 u
= snd_pcm_format_unsigned(runtime
->format
);
620 chip
->dma1_shift
= 2 - mono
- is8
;
622 snd_es1938_reset_fifo(chip
);
625 snd_es1938_bits(chip
, ESS_CMD_ANALOGCONTROL
, 0x03, (mono
? 2 : 1));
627 /* set clock and counters */
628 snd_es1938_rate_set(chip
, substream
, ADC1
);
630 count
= 0x10000 - count
;
631 snd_es1938_write(chip
, ESS_CMD_DMACNTRELOADL
, count
& 0xff);
632 snd_es1938_write(chip
, ESS_CMD_DMACNTRELOADH
, count
>> 8);
634 /* initialize and configure ADC */
635 snd_es1938_write(chip
, ESS_CMD_SETFORMAT2
, u
? 0x51 : 0x71);
636 snd_es1938_write(chip
, ESS_CMD_SETFORMAT2
, 0x90 |
638 (is8
? 0x00 : 0x04) |
639 (mono
? 0x40 : 0x08));
641 // snd_es1938_reset_fifo(chip);
643 /* 11. configure system interrupt controller and DMA controller */
644 snd_es1938_capture_setdma(chip
);
650 /* ------------------------------------------------------------------------------
651 * Second Audio channel DAC Operation
652 * ------------------------------------------------------------------------------*/
653 static int snd_es1938_playback1_prepare(struct snd_pcm_substream
*substream
)
655 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
656 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
658 unsigned int size
= snd_pcm_lib_buffer_bytes(substream
);
659 unsigned int count
= snd_pcm_lib_period_bytes(substream
);
661 chip
->dma2_size
= size
;
662 chip
->dma2_start
= runtime
->dma_addr
;
664 mono
= (runtime
->channels
> 1) ? 0 : 1;
665 is8
= snd_pcm_format_width(runtime
->format
) == 16 ? 0 : 1;
666 u
= snd_pcm_format_unsigned(runtime
->format
);
668 chip
->dma2_shift
= 2 - mono
- is8
;
670 snd_es1938_reset_fifo(chip
);
672 /* set clock and counters */
673 snd_es1938_rate_set(chip
, substream
, DAC2
);
676 count
= 0x10000 - count
;
677 snd_es1938_mixer_write(chip
, ESSSB_IREG_AUDIO2TCOUNTL
, count
& 0xff);
678 snd_es1938_mixer_write(chip
, ESSSB_IREG_AUDIO2TCOUNTH
, count
>> 8);
680 /* initialize and configure Audio 2 DAC */
681 snd_es1938_mixer_write(chip
, ESSSB_IREG_AUDIO2CONTROL2
, 0x40 | (u
? 0 : 4) |
682 (mono
? 0 : 2) | (is8
? 0 : 1));
685 snd_es1938_playback1_setdma(chip
);
690 static int snd_es1938_playback2_prepare(struct snd_pcm_substream
*substream
)
692 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
693 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
695 unsigned int size
= snd_pcm_lib_buffer_bytes(substream
);
696 unsigned int count
= snd_pcm_lib_period_bytes(substream
);
698 chip
->dma1_size
= size
;
699 chip
->dma1_start
= runtime
->dma_addr
;
701 mono
= (runtime
->channels
> 1) ? 0 : 1;
702 is8
= snd_pcm_format_width(runtime
->format
) == 16 ? 0 : 1;
703 u
= snd_pcm_format_unsigned(runtime
->format
);
705 chip
->dma1_shift
= 2 - mono
- is8
;
707 count
= 0x10000 - count
;
710 snd_es1938_reset_fifo(chip
);
712 snd_es1938_bits(chip
, ESS_CMD_ANALOGCONTROL
, 0x03, (mono
? 2 : 1));
714 /* set clock and counters */
715 snd_es1938_rate_set(chip
, substream
, DAC1
);
716 snd_es1938_write(chip
, ESS_CMD_DMACNTRELOADL
, count
& 0xff);
717 snd_es1938_write(chip
, ESS_CMD_DMACNTRELOADH
, count
>> 8);
719 /* initialized and configure DAC */
720 snd_es1938_write(chip
, ESS_CMD_SETFORMAT
, u
? 0x80 : 0x00);
721 snd_es1938_write(chip
, ESS_CMD_SETFORMAT
, u
? 0x51 : 0x71);
722 snd_es1938_write(chip
, ESS_CMD_SETFORMAT2
,
723 0x90 | (mono
? 0x40 : 0x08) |
724 (is8
? 0x00 : 0x04) | (u
? 0x00 : 0x20));
727 snd_es1938_playback2_setdma(chip
);
732 static int snd_es1938_playback_prepare(struct snd_pcm_substream
*substream
)
734 switch (substream
->number
) {
736 return snd_es1938_playback1_prepare(substream
);
738 return snd_es1938_playback2_prepare(substream
);
744 /* during the incrementing of dma counters the DMA register reads sometimes
745 returns garbage. To ensure a valid hw pointer, the following checks which
746 should be very unlikely to fail are used:
747 - is the current DMA address in the valid DMA range ?
748 - is the sum of DMA address and DMA counter pointing to the last DMA byte ?
749 One can argue this could differ by one byte depending on which register is
750 updated first, so the implementation below allows for that.
752 static snd_pcm_uframes_t
snd_es1938_capture_pointer(struct snd_pcm_substream
*substream
)
754 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
758 /* This stuff is *needed*, don't ask why - AB */
759 old
= inw(SLDM_REG(chip
, DMACOUNT
));
760 while ((new = inw(SLDM_REG(chip
, DMACOUNT
))) != old
)
762 ptr
= chip
->dma1_size
- 1 - new;
767 ptr
= inl(SLDM_REG(chip
, DMAADDR
));
768 count
= inw(SLDM_REG(chip
, DMACOUNT
));
769 diff
= chip
->dma1_start
+ chip
->dma1_size
- ptr
- count
;
771 if (diff
> 3 || ptr
< chip
->dma1_start
772 || ptr
>= chip
->dma1_start
+chip
->dma1_size
)
773 ptr
= chip
->last_capture_dmaaddr
; /* bad, use last saved */
775 chip
->last_capture_dmaaddr
= ptr
; /* good, remember it */
777 ptr
-= chip
->dma1_start
;
779 return ptr
>> chip
->dma1_shift
;
782 static snd_pcm_uframes_t
snd_es1938_playback1_pointer(struct snd_pcm_substream
*substream
)
784 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
787 ptr
= chip
->dma2_size
- inw(SLIO_REG(chip
, AUDIO2DMACOUNT
));
789 ptr
= inl(SLIO_REG(chip
, AUDIO2DMAADDR
)) - chip
->dma2_start
;
791 return ptr
>> chip
->dma2_shift
;
794 static snd_pcm_uframes_t
snd_es1938_playback2_pointer(struct snd_pcm_substream
*substream
)
796 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
800 /* This stuff is *needed*, don't ask why - AB */
801 old
= inw(SLDM_REG(chip
, DMACOUNT
));
802 while ((new = inw(SLDM_REG(chip
, DMACOUNT
))) != old
)
804 ptr
= chip
->dma1_size
- 1 - new;
806 ptr
= inl(SLDM_REG(chip
, DMAADDR
)) - chip
->dma1_start
;
808 return ptr
>> chip
->dma1_shift
;
811 static snd_pcm_uframes_t
snd_es1938_playback_pointer(struct snd_pcm_substream
*substream
)
813 switch (substream
->number
) {
815 return snd_es1938_playback1_pointer(substream
);
817 return snd_es1938_playback2_pointer(substream
);
823 static int snd_es1938_capture_copy(struct snd_pcm_substream
*substream
,
824 int channel
, unsigned long pos
,
825 struct iov_iter
*dst
, unsigned long count
)
827 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
828 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
830 if (snd_BUG_ON(pos
+ count
> chip
->dma1_size
))
832 if (pos
+ count
< chip
->dma1_size
) {
833 if (copy_to_iter(runtime
->dma_area
+ pos
+ 1, count
, dst
) != count
)
836 if (copy_to_iter(runtime
->dma_area
+ pos
+ 1, count
- 1, dst
) != count
- 1)
838 if (copy_to_iter(runtime
->dma_area
, 1, dst
) != 1)
844 /* ----------------------------------------------------------------------
845 * Audio1 Capture (ADC)
846 * ----------------------------------------------------------------------*/
847 static const struct snd_pcm_hardware snd_es1938_capture
=
849 .info
= (SNDRV_PCM_INFO_INTERLEAVED
|
850 SNDRV_PCM_INFO_BLOCK_TRANSFER
),
851 .formats
= (SNDRV_PCM_FMTBIT_U8
| SNDRV_PCM_FMTBIT_S16_LE
|
852 SNDRV_PCM_FMTBIT_S8
| SNDRV_PCM_FMTBIT_U16_LE
),
853 .rates
= SNDRV_PCM_RATE_CONTINUOUS
| SNDRV_PCM_RATE_8000_48000
,
858 .buffer_bytes_max
= 0x8000, /* DMA controller screws on higher values */
859 .period_bytes_min
= 64,
860 .period_bytes_max
= 0x8000,
866 /* -----------------------------------------------------------------------
867 * Audio2 Playback (DAC)
868 * -----------------------------------------------------------------------*/
869 static const struct snd_pcm_hardware snd_es1938_playback
=
871 .info
= (SNDRV_PCM_INFO_MMAP
| SNDRV_PCM_INFO_INTERLEAVED
|
872 SNDRV_PCM_INFO_BLOCK_TRANSFER
|
873 SNDRV_PCM_INFO_MMAP_VALID
),
874 .formats
= (SNDRV_PCM_FMTBIT_U8
| SNDRV_PCM_FMTBIT_S16_LE
|
875 SNDRV_PCM_FMTBIT_S8
| SNDRV_PCM_FMTBIT_U16_LE
),
876 .rates
= SNDRV_PCM_RATE_CONTINUOUS
| SNDRV_PCM_RATE_8000_48000
,
881 .buffer_bytes_max
= 0x8000, /* DMA controller screws on higher values */
882 .period_bytes_min
= 64,
883 .period_bytes_max
= 0x8000,
889 static int snd_es1938_capture_open(struct snd_pcm_substream
*substream
)
891 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
892 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
894 if (chip
->playback2_substream
)
896 chip
->capture_substream
= substream
;
897 runtime
->hw
= snd_es1938_capture
;
898 snd_pcm_hw_constraint_ratnums(runtime
, 0, SNDRV_PCM_HW_PARAM_RATE
,
899 &hw_constraints_clocks
);
900 snd_pcm_hw_constraint_minmax(runtime
, SNDRV_PCM_HW_PARAM_BUFFER_BYTES
, 0, 0xff00);
904 static int snd_es1938_playback_open(struct snd_pcm_substream
*substream
)
906 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
907 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
909 switch (substream
->number
) {
911 chip
->playback1_substream
= substream
;
914 if (chip
->capture_substream
)
916 chip
->playback2_substream
= substream
;
922 runtime
->hw
= snd_es1938_playback
;
923 snd_pcm_hw_constraint_ratnums(runtime
, 0, SNDRV_PCM_HW_PARAM_RATE
,
924 &hw_constraints_clocks
);
925 snd_pcm_hw_constraint_minmax(runtime
, SNDRV_PCM_HW_PARAM_BUFFER_BYTES
, 0, 0xff00);
929 static int snd_es1938_capture_close(struct snd_pcm_substream
*substream
)
931 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
933 chip
->capture_substream
= NULL
;
937 static int snd_es1938_playback_close(struct snd_pcm_substream
*substream
)
939 struct es1938
*chip
= snd_pcm_substream_chip(substream
);
941 switch (substream
->number
) {
943 chip
->playback1_substream
= NULL
;
946 chip
->playback2_substream
= NULL
;
955 static const struct snd_pcm_ops snd_es1938_playback_ops
= {
956 .open
= snd_es1938_playback_open
,
957 .close
= snd_es1938_playback_close
,
958 .prepare
= snd_es1938_playback_prepare
,
959 .trigger
= snd_es1938_playback_trigger
,
960 .pointer
= snd_es1938_playback_pointer
,
963 static const struct snd_pcm_ops snd_es1938_capture_ops
= {
964 .open
= snd_es1938_capture_open
,
965 .close
= snd_es1938_capture_close
,
966 .prepare
= snd_es1938_capture_prepare
,
967 .trigger
= snd_es1938_capture_trigger
,
968 .pointer
= snd_es1938_capture_pointer
,
969 .copy
= snd_es1938_capture_copy
,
972 static int snd_es1938_new_pcm(struct es1938
*chip
, int device
)
977 err
= snd_pcm_new(chip
->card
, "es-1938-1946", device
, 2, 1, &pcm
);
980 snd_pcm_set_ops(pcm
, SNDRV_PCM_STREAM_PLAYBACK
, &snd_es1938_playback_ops
);
981 snd_pcm_set_ops(pcm
, SNDRV_PCM_STREAM_CAPTURE
, &snd_es1938_capture_ops
);
983 pcm
->private_data
= chip
;
985 strcpy(pcm
->name
, "ESS Solo-1");
987 snd_pcm_set_managed_buffer_all(pcm
, SNDRV_DMA_TYPE_DEV
,
988 &chip
->pci
->dev
, 64*1024, 64*1024);
994 /* -------------------------------------------------------------------
999 static int snd_es1938_info_mux(struct snd_kcontrol
*kcontrol
,
1000 struct snd_ctl_elem_info
*uinfo
)
1002 static const char * const texts
[8] = {
1003 "Mic", "Mic Master", "CD", "AOUT",
1004 "Mic1", "Mix", "Line", "Master"
1007 return snd_ctl_enum_info(uinfo
, 1, 8, texts
);
1010 static int snd_es1938_get_mux(struct snd_kcontrol
*kcontrol
,
1011 struct snd_ctl_elem_value
*ucontrol
)
1013 struct es1938
*chip
= snd_kcontrol_chip(kcontrol
);
1014 ucontrol
->value
.enumerated
.item
[0] = snd_es1938_mixer_read(chip
, 0x1c) & 0x07;
1018 static int snd_es1938_put_mux(struct snd_kcontrol
*kcontrol
,
1019 struct snd_ctl_elem_value
*ucontrol
)
1021 struct es1938
*chip
= snd_kcontrol_chip(kcontrol
);
1022 unsigned char val
= ucontrol
->value
.enumerated
.item
[0];
1026 return snd_es1938_mixer_bits(chip
, 0x1c, 0x07, val
) != val
;
1029 #define snd_es1938_info_spatializer_enable snd_ctl_boolean_mono_info
1031 static int snd_es1938_get_spatializer_enable(struct snd_kcontrol
*kcontrol
,
1032 struct snd_ctl_elem_value
*ucontrol
)
1034 struct es1938
*chip
= snd_kcontrol_chip(kcontrol
);
1035 unsigned char val
= snd_es1938_mixer_read(chip
, 0x50);
1036 ucontrol
->value
.integer
.value
[0] = !!(val
& 8);
1040 static int snd_es1938_put_spatializer_enable(struct snd_kcontrol
*kcontrol
,
1041 struct snd_ctl_elem_value
*ucontrol
)
1043 struct es1938
*chip
= snd_kcontrol_chip(kcontrol
);
1044 unsigned char oval
, nval
;
1046 nval
= ucontrol
->value
.integer
.value
[0] ? 0x0c : 0x04;
1047 oval
= snd_es1938_mixer_read(chip
, 0x50) & 0x0c;
1048 change
= nval
!= oval
;
1050 snd_es1938_mixer_write(chip
, 0x50, nval
& ~0x04);
1051 snd_es1938_mixer_write(chip
, 0x50, nval
);
1056 static int snd_es1938_info_hw_volume(struct snd_kcontrol
*kcontrol
,
1057 struct snd_ctl_elem_info
*uinfo
)
1059 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
1061 uinfo
->value
.integer
.min
= 0;
1062 uinfo
->value
.integer
.max
= 63;
1066 static int snd_es1938_get_hw_volume(struct snd_kcontrol
*kcontrol
,
1067 struct snd_ctl_elem_value
*ucontrol
)
1069 struct es1938
*chip
= snd_kcontrol_chip(kcontrol
);
1070 ucontrol
->value
.integer
.value
[0] = snd_es1938_mixer_read(chip
, 0x61) & 0x3f;
1071 ucontrol
->value
.integer
.value
[1] = snd_es1938_mixer_read(chip
, 0x63) & 0x3f;
1075 #define snd_es1938_info_hw_switch snd_ctl_boolean_stereo_info
1077 static int snd_es1938_get_hw_switch(struct snd_kcontrol
*kcontrol
,
1078 struct snd_ctl_elem_value
*ucontrol
)
1080 struct es1938
*chip
= snd_kcontrol_chip(kcontrol
);
1081 ucontrol
->value
.integer
.value
[0] = !(snd_es1938_mixer_read(chip
, 0x61) & 0x40);
1082 ucontrol
->value
.integer
.value
[1] = !(snd_es1938_mixer_read(chip
, 0x63) & 0x40);
1086 static void snd_es1938_hwv_free(struct snd_kcontrol
*kcontrol
)
1088 struct es1938
*chip
= snd_kcontrol_chip(kcontrol
);
1089 chip
->master_volume
= NULL
;
1090 chip
->master_switch
= NULL
;
1091 chip
->hw_volume
= NULL
;
1092 chip
->hw_switch
= NULL
;
1095 static int snd_es1938_reg_bits(struct es1938
*chip
, unsigned char reg
,
1096 unsigned char mask
, unsigned char val
)
1099 return snd_es1938_mixer_bits(chip
, reg
, mask
, val
);
1101 return snd_es1938_bits(chip
, reg
, mask
, val
);
1104 static int snd_es1938_reg_read(struct es1938
*chip
, unsigned char reg
)
1107 return snd_es1938_mixer_read(chip
, reg
);
1109 return snd_es1938_read(chip
, reg
);
1112 #define ES1938_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv) \
1113 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1114 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,\
1115 .name = xname, .index = xindex, \
1116 .info = snd_es1938_info_single, \
1117 .get = snd_es1938_get_single, .put = snd_es1938_put_single, \
1118 .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24), \
1119 .tlv = { .p = xtlv } }
1120 #define ES1938_SINGLE(xname, xindex, reg, shift, mask, invert) \
1121 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1122 .info = snd_es1938_info_single, \
1123 .get = snd_es1938_get_single, .put = snd_es1938_put_single, \
1124 .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24) }
1126 static int snd_es1938_info_single(struct snd_kcontrol
*kcontrol
,
1127 struct snd_ctl_elem_info
*uinfo
)
1129 int mask
= (kcontrol
->private_value
>> 16) & 0xff;
1131 uinfo
->type
= mask
== 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN
: SNDRV_CTL_ELEM_TYPE_INTEGER
;
1133 uinfo
->value
.integer
.min
= 0;
1134 uinfo
->value
.integer
.max
= mask
;
1138 static int snd_es1938_get_single(struct snd_kcontrol
*kcontrol
,
1139 struct snd_ctl_elem_value
*ucontrol
)
1141 struct es1938
*chip
= snd_kcontrol_chip(kcontrol
);
1142 int reg
= kcontrol
->private_value
& 0xff;
1143 int shift
= (kcontrol
->private_value
>> 8) & 0xff;
1144 int mask
= (kcontrol
->private_value
>> 16) & 0xff;
1145 int invert
= (kcontrol
->private_value
>> 24) & 0xff;
1148 val
= snd_es1938_reg_read(chip
, reg
);
1149 ucontrol
->value
.integer
.value
[0] = (val
>> shift
) & mask
;
1151 ucontrol
->value
.integer
.value
[0] = mask
- ucontrol
->value
.integer
.value
[0];
1155 static int snd_es1938_put_single(struct snd_kcontrol
*kcontrol
,
1156 struct snd_ctl_elem_value
*ucontrol
)
1158 struct es1938
*chip
= snd_kcontrol_chip(kcontrol
);
1159 int reg
= kcontrol
->private_value
& 0xff;
1160 int shift
= (kcontrol
->private_value
>> 8) & 0xff;
1161 int mask
= (kcontrol
->private_value
>> 16) & 0xff;
1162 int invert
= (kcontrol
->private_value
>> 24) & 0xff;
1165 val
= (ucontrol
->value
.integer
.value
[0] & mask
);
1170 return snd_es1938_reg_bits(chip
, reg
, mask
, val
) != val
;
1173 #define ES1938_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert, xtlv) \
1174 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1175 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,\
1176 .name = xname, .index = xindex, \
1177 .info = snd_es1938_info_double, \
1178 .get = snd_es1938_get_double, .put = snd_es1938_put_double, \
1179 .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22), \
1180 .tlv = { .p = xtlv } }
1181 #define ES1938_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
1182 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1183 .info = snd_es1938_info_double, \
1184 .get = snd_es1938_get_double, .put = snd_es1938_put_double, \
1185 .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) }
1187 static int snd_es1938_info_double(struct snd_kcontrol
*kcontrol
,
1188 struct snd_ctl_elem_info
*uinfo
)
1190 int mask
= (kcontrol
->private_value
>> 24) & 0xff;
1192 uinfo
->type
= mask
== 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN
: SNDRV_CTL_ELEM_TYPE_INTEGER
;
1194 uinfo
->value
.integer
.min
= 0;
1195 uinfo
->value
.integer
.max
= mask
;
1199 static int snd_es1938_get_double(struct snd_kcontrol
*kcontrol
,
1200 struct snd_ctl_elem_value
*ucontrol
)
1202 struct es1938
*chip
= snd_kcontrol_chip(kcontrol
);
1203 int left_reg
= kcontrol
->private_value
& 0xff;
1204 int right_reg
= (kcontrol
->private_value
>> 8) & 0xff;
1205 int shift_left
= (kcontrol
->private_value
>> 16) & 0x07;
1206 int shift_right
= (kcontrol
->private_value
>> 19) & 0x07;
1207 int mask
= (kcontrol
->private_value
>> 24) & 0xff;
1208 int invert
= (kcontrol
->private_value
>> 22) & 1;
1209 unsigned char left
, right
;
1211 left
= snd_es1938_reg_read(chip
, left_reg
);
1212 if (left_reg
!= right_reg
)
1213 right
= snd_es1938_reg_read(chip
, right_reg
);
1216 ucontrol
->value
.integer
.value
[0] = (left
>> shift_left
) & mask
;
1217 ucontrol
->value
.integer
.value
[1] = (right
>> shift_right
) & mask
;
1219 ucontrol
->value
.integer
.value
[0] = mask
- ucontrol
->value
.integer
.value
[0];
1220 ucontrol
->value
.integer
.value
[1] = mask
- ucontrol
->value
.integer
.value
[1];
1225 static int snd_es1938_put_double(struct snd_kcontrol
*kcontrol
,
1226 struct snd_ctl_elem_value
*ucontrol
)
1228 struct es1938
*chip
= snd_kcontrol_chip(kcontrol
);
1229 int left_reg
= kcontrol
->private_value
& 0xff;
1230 int right_reg
= (kcontrol
->private_value
>> 8) & 0xff;
1231 int shift_left
= (kcontrol
->private_value
>> 16) & 0x07;
1232 int shift_right
= (kcontrol
->private_value
>> 19) & 0x07;
1233 int mask
= (kcontrol
->private_value
>> 24) & 0xff;
1234 int invert
= (kcontrol
->private_value
>> 22) & 1;
1236 unsigned char val1
, val2
, mask1
, mask2
;
1238 val1
= ucontrol
->value
.integer
.value
[0] & mask
;
1239 val2
= ucontrol
->value
.integer
.value
[1] & mask
;
1244 val1
<<= shift_left
;
1245 val2
<<= shift_right
;
1246 mask1
= mask
<< shift_left
;
1247 mask2
= mask
<< shift_right
;
1248 if (left_reg
!= right_reg
) {
1250 if (snd_es1938_reg_bits(chip
, left_reg
, mask1
, val1
) != val1
)
1252 if (snd_es1938_reg_bits(chip
, right_reg
, mask2
, val2
) != val2
)
1255 change
= (snd_es1938_reg_bits(chip
, left_reg
, mask1
| mask2
,
1256 val1
| val2
) != (val1
| val2
));
1261 static const DECLARE_TLV_DB_RANGE(db_scale_master
,
1262 0, 54, TLV_DB_SCALE_ITEM(-3600, 50, 1),
1263 54, 63, TLV_DB_SCALE_ITEM(-900, 100, 0),
1266 static const DECLARE_TLV_DB_RANGE(db_scale_audio1
,
1267 0, 8, TLV_DB_SCALE_ITEM(-3300, 300, 1),
1268 8, 15, TLV_DB_SCALE_ITEM(-900, 150, 0),
1271 static const DECLARE_TLV_DB_RANGE(db_scale_audio2
,
1272 0, 8, TLV_DB_SCALE_ITEM(-3450, 300, 1),
1273 8, 15, TLV_DB_SCALE_ITEM(-1050, 150, 0),
1276 static const DECLARE_TLV_DB_RANGE(db_scale_mic
,
1277 0, 8, TLV_DB_SCALE_ITEM(-2400, 300, 1),
1278 8, 15, TLV_DB_SCALE_ITEM(0, 150, 0),
1281 static const DECLARE_TLV_DB_RANGE(db_scale_line
,
1282 0, 8, TLV_DB_SCALE_ITEM(-3150, 300, 1),
1283 8, 15, TLV_DB_SCALE_ITEM(-750, 150, 0),
1286 static const DECLARE_TLV_DB_SCALE(db_scale_capture
, 0, 150, 0);
1288 static const struct snd_kcontrol_new snd_es1938_controls
[] = {
1289 ES1938_DOUBLE_TLV("Master Playback Volume", 0, 0x60, 0x62, 0, 0, 63, 0,
1291 ES1938_DOUBLE("Master Playback Switch", 0, 0x60, 0x62, 6, 6, 1, 1),
1293 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
1294 .name
= "Hardware Master Playback Volume",
1295 .access
= SNDRV_CTL_ELEM_ACCESS_READ
,
1296 .info
= snd_es1938_info_hw_volume
,
1297 .get
= snd_es1938_get_hw_volume
,
1300 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
1301 .access
= (SNDRV_CTL_ELEM_ACCESS_READ
|
1302 SNDRV_CTL_ELEM_ACCESS_TLV_READ
),
1303 .name
= "Hardware Master Playback Switch",
1304 .info
= snd_es1938_info_hw_switch
,
1305 .get
= snd_es1938_get_hw_switch
,
1306 .tlv
= { .p
= db_scale_master
},
1308 ES1938_SINGLE("Hardware Volume Split", 0, 0x64, 7, 1, 0),
1309 ES1938_DOUBLE_TLV("Line Playback Volume", 0, 0x3e, 0x3e, 4, 0, 15, 0,
1311 ES1938_DOUBLE("CD Playback Volume", 0, 0x38, 0x38, 4, 0, 15, 0),
1312 ES1938_DOUBLE_TLV("FM Playback Volume", 0, 0x36, 0x36, 4, 0, 15, 0,
1314 ES1938_DOUBLE_TLV("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0,
1316 ES1938_DOUBLE_TLV("Mic Playback Volume", 0, 0x1a, 0x1a, 4, 0, 15, 0,
1318 ES1938_DOUBLE_TLV("Aux Playback Volume", 0, 0x3a, 0x3a, 4, 0, 15, 0,
1320 ES1938_DOUBLE_TLV("Capture Volume", 0, 0xb4, 0xb4, 4, 0, 15, 0,
1322 ES1938_SINGLE("Beep Volume", 0, 0x3c, 0, 7, 0),
1323 ES1938_SINGLE("Record Monitor", 0, 0xa8, 3, 1, 0),
1324 ES1938_SINGLE("Capture Switch", 0, 0x1c, 4, 1, 1),
1326 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
1327 .name
= "Capture Source",
1328 .info
= snd_es1938_info_mux
,
1329 .get
= snd_es1938_get_mux
,
1330 .put
= snd_es1938_put_mux
,
1332 ES1938_DOUBLE_TLV("Mono Input Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0,
1334 ES1938_DOUBLE_TLV("PCM Capture Volume", 0, 0x69, 0x69, 4, 0, 15, 0,
1336 ES1938_DOUBLE_TLV("Mic Capture Volume", 0, 0x68, 0x68, 4, 0, 15, 0,
1338 ES1938_DOUBLE_TLV("Line Capture Volume", 0, 0x6e, 0x6e, 4, 0, 15, 0,
1340 ES1938_DOUBLE_TLV("FM Capture Volume", 0, 0x6b, 0x6b, 4, 0, 15, 0,
1342 ES1938_DOUBLE_TLV("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0,
1344 ES1938_DOUBLE_TLV("CD Capture Volume", 0, 0x6a, 0x6a, 4, 0, 15, 0,
1346 ES1938_DOUBLE_TLV("Aux Capture Volume", 0, 0x6c, 0x6c, 4, 0, 15, 0,
1348 ES1938_DOUBLE_TLV("PCM Playback Volume", 0, 0x7c, 0x7c, 4, 0, 15, 0,
1350 ES1938_DOUBLE_TLV("PCM Playback Volume", 1, 0x14, 0x14, 4, 0, 15, 0,
1352 ES1938_SINGLE("3D Control - Level", 0, 0x52, 0, 63, 0),
1354 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
1355 .name
= "3D Control - Switch",
1356 .info
= snd_es1938_info_spatializer_enable
,
1357 .get
= snd_es1938_get_spatializer_enable
,
1358 .put
= snd_es1938_put_spatializer_enable
,
1360 ES1938_SINGLE("Mic Boost (+26dB)", 0, 0x7d, 3, 1, 0)
1364 /* ---------------------------------------------------------------------------- */
1365 /* ---------------------------------------------------------------------------- */
1368 * initialize the chip - used by resume callback, too
1370 static void snd_es1938_chip_init(struct es1938
*chip
)
1373 snd_es1938_reset(chip
);
1375 /* configure native mode */
1377 /* enable bus master */
1378 pci_set_master(chip
->pci
);
1380 /* disable legacy audio */
1381 pci_write_config_word(chip
->pci
, SL_PCI_LEGACYCONTROL
, 0x805f);
1384 pci_write_config_word(chip
->pci
, SL_PCI_DDMACONTROL
, chip
->ddma_port
| 1);
1386 /* set DMA/IRQ policy */
1387 pci_write_config_dword(chip
->pci
, SL_PCI_CONFIG
, 0);
1389 /* enable Audio 1, Audio 2, MPU401 IRQ and HW volume IRQ*/
1390 outb(0xf0, SLIO_REG(chip
, IRQCONTROL
));
1393 outb(0, SLDM_REG(chip
, DMACLEAR
));
1400 static const unsigned char saved_regs
[SAVED_REG_SIZE
+1] = {
1401 0x14, 0x1a, 0x1c, 0x3a, 0x3c, 0x3e, 0x36, 0x38,
1402 0x50, 0x52, 0x60, 0x61, 0x62, 0x63, 0x64, 0x68,
1403 0x69, 0x6a, 0x6b, 0x6d, 0x6e, 0x6f, 0x7c, 0x7d,
1408 static int es1938_suspend(struct device
*dev
)
1410 struct snd_card
*card
= dev_get_drvdata(dev
);
1411 struct es1938
*chip
= card
->private_data
;
1412 const unsigned char *s
;
1415 snd_power_change_state(card
, SNDRV_CTL_POWER_D3hot
);
1417 /* save mixer-related registers */
1418 for (s
= saved_regs
, d
= chip
->saved_regs
; *s
; s
++, d
++)
1419 *d
= snd_es1938_reg_read(chip
, *s
);
1421 outb(0x00, SLIO_REG(chip
, IRQCONTROL
)); /* disable irqs */
1422 if (chip
->irq
>= 0) {
1423 free_irq(chip
->irq
, chip
);
1425 card
->sync_irq
= -1;
1430 static int es1938_resume(struct device
*dev
)
1432 struct pci_dev
*pci
= to_pci_dev(dev
);
1433 struct snd_card
*card
= dev_get_drvdata(dev
);
1434 struct es1938
*chip
= card
->private_data
;
1435 const unsigned char *s
;
1438 if (request_irq(pci
->irq
, snd_es1938_interrupt
,
1439 IRQF_SHARED
, KBUILD_MODNAME
, chip
)) {
1440 dev_err(dev
, "unable to grab IRQ %d, disabling device\n",
1442 snd_card_disconnect(card
);
1445 chip
->irq
= pci
->irq
;
1446 card
->sync_irq
= chip
->irq
;
1447 snd_es1938_chip_init(chip
);
1449 /* restore mixer-related registers */
1450 for (s
= saved_regs
, d
= chip
->saved_regs
; *s
; s
++, d
++) {
1452 snd_es1938_mixer_write(chip
, *s
, *d
);
1454 snd_es1938_write(chip
, *s
, *d
);
1457 snd_power_change_state(card
, SNDRV_CTL_POWER_D0
);
1461 static DEFINE_SIMPLE_DEV_PM_OPS(es1938_pm
, es1938_suspend
, es1938_resume
);
1463 #ifdef SUPPORT_JOYSTICK
1464 static int snd_es1938_create_gameport(struct es1938
*chip
)
1466 struct gameport
*gp
;
1468 chip
->gameport
= gp
= gameport_allocate_port();
1470 dev_err(chip
->card
->dev
,
1471 "cannot allocate memory for gameport\n");
1475 gameport_set_name(gp
, "ES1938");
1476 gameport_set_phys(gp
, "pci%s/gameport0", pci_name(chip
->pci
));
1477 gameport_set_dev_parent(gp
, &chip
->pci
->dev
);
1478 gp
->io
= chip
->game_port
;
1480 gameport_register_port(gp
);
1485 static void snd_es1938_free_gameport(struct es1938
*chip
)
1487 if (chip
->gameport
) {
1488 gameport_unregister_port(chip
->gameport
);
1489 chip
->gameport
= NULL
;
1493 static inline int snd_es1938_create_gameport(struct es1938
*chip
) { return -ENOSYS
; }
1494 static inline void snd_es1938_free_gameport(struct es1938
*chip
) { }
1495 #endif /* SUPPORT_JOYSTICK */
1497 static void snd_es1938_free(struct snd_card
*card
)
1499 struct es1938
*chip
= card
->private_data
;
1502 outb(0x00, SLIO_REG(chip
, IRQCONTROL
));
1504 snd_es1938_mixer_bits(chip
, ESSSB_IREG_MPU401CONTROL
, 0x40, 0);
1506 snd_es1938_free_gameport(chip
);
1509 free_irq(chip
->irq
, chip
);
1512 static int snd_es1938_create(struct snd_card
*card
,
1513 struct pci_dev
*pci
)
1515 struct es1938
*chip
= card
->private_data
;
1518 /* enable PCI device */
1519 err
= pcim_enable_device(pci
);
1522 /* check, if we can restrict PCI DMA transfers to 24 bits */
1523 if (dma_set_mask_and_coherent(&pci
->dev
, DMA_BIT_MASK(24))) {
1525 "architecture does not support 24bit PCI busmaster DMA\n");
1529 spin_lock_init(&chip
->reg_lock
);
1530 spin_lock_init(&chip
->mixer_lock
);
1534 err
= pci_request_regions(pci
, "ESS Solo-1");
1537 chip
->io_port
= pci_resource_start(pci
, 0);
1538 chip
->sb_port
= pci_resource_start(pci
, 1);
1539 chip
->vc_port
= pci_resource_start(pci
, 2);
1540 chip
->mpu_port
= pci_resource_start(pci
, 3);
1541 chip
->game_port
= pci_resource_start(pci
, 4);
1542 /* still use non-managed irq handler as it's re-acquired at PM resume */
1543 if (request_irq(pci
->irq
, snd_es1938_interrupt
, IRQF_SHARED
,
1544 KBUILD_MODNAME
, chip
)) {
1545 dev_err(card
->dev
, "unable to grab IRQ %d\n", pci
->irq
);
1548 chip
->irq
= pci
->irq
;
1549 card
->sync_irq
= chip
->irq
;
1550 card
->private_free
= snd_es1938_free
;
1552 "create: io: 0x%lx, sb: 0x%lx, vc: 0x%lx, mpu: 0x%lx, game: 0x%lx\n",
1553 chip
->io_port
, chip
->sb_port
, chip
->vc_port
, chip
->mpu_port
, chip
->game_port
);
1555 chip
->ddma_port
= chip
->vc_port
+ 0x00; /* fix from Thomas Sailer */
1557 snd_es1938_chip_init(chip
);
1561 /* --------------------------------------------------------------------
1563 * -------------------------------------------------------------------- */
1564 static irqreturn_t
snd_es1938_interrupt(int irq
, void *dev_id
)
1566 struct es1938
*chip
= dev_id
;
1567 unsigned char status
;
1568 __always_unused
unsigned char audiostatus
;
1571 status
= inb(SLIO_REG(chip
, IRQCONTROL
));
1573 dev_dbg(chip
->card
->dev
,
1574 "Es1938debug - interrupt status: =0x%x\n", status
);
1578 if (status
& 0x10) {
1580 dev_dbg(chip
->card
->dev
,
1581 "Es1938debug - AUDIO channel 1 interrupt\n");
1582 dev_dbg(chip
->card
->dev
,
1583 "Es1938debug - AUDIO channel 1 DMAC DMA count: %u\n",
1584 inw(SLDM_REG(chip
, DMACOUNT
)));
1585 dev_dbg(chip
->card
->dev
,
1586 "Es1938debug - AUDIO channel 1 DMAC DMA base: %u\n",
1587 inl(SLDM_REG(chip
, DMAADDR
)));
1588 dev_dbg(chip
->card
->dev
,
1589 "Es1938debug - AUDIO channel 1 DMAC DMA status: 0x%x\n",
1590 inl(SLDM_REG(chip
, DMASTATUS
)));
1594 audiostatus
= inb(SLSB_REG(chip
, STATUS
));
1595 if (chip
->active
& ADC1
)
1596 snd_pcm_period_elapsed(chip
->capture_substream
);
1597 else if (chip
->active
& DAC1
)
1598 snd_pcm_period_elapsed(chip
->playback2_substream
);
1602 if (status
& 0x20) {
1604 dev_dbg(chip
->card
->dev
,
1605 "Es1938debug - AUDIO channel 2 interrupt\n");
1606 dev_dbg(chip
->card
->dev
,
1607 "Es1938debug - AUDIO channel 2 DMAC DMA count: %u\n",
1608 inw(SLIO_REG(chip
, AUDIO2DMACOUNT
)));
1609 dev_dbg(chip
->card
->dev
,
1610 "Es1938debug - AUDIO channel 2 DMAC DMA base: %u\n",
1611 inl(SLIO_REG(chip
, AUDIO2DMAADDR
)));
1616 snd_es1938_mixer_bits(chip
, ESSSB_IREG_AUDIO2CONTROL2
, 0x80, 0);
1617 if (chip
->active
& DAC2
)
1618 snd_pcm_period_elapsed(chip
->playback1_substream
);
1621 /* Hardware volume */
1622 if (status
& 0x40) {
1623 int split
= snd_es1938_mixer_read(chip
, 0x64) & 0x80;
1625 snd_ctl_notify(chip
->card
, SNDRV_CTL_EVENT_MASK_VALUE
, &chip
->hw_switch
->id
);
1626 snd_ctl_notify(chip
->card
, SNDRV_CTL_EVENT_MASK_VALUE
, &chip
->hw_volume
->id
);
1628 snd_ctl_notify(chip
->card
, SNDRV_CTL_EVENT_MASK_VALUE
,
1629 &chip
->master_switch
->id
);
1630 snd_ctl_notify(chip
->card
, SNDRV_CTL_EVENT_MASK_VALUE
,
1631 &chip
->master_volume
->id
);
1634 snd_es1938_mixer_write(chip
, 0x66, 0x00);
1638 if (status
& 0x80) {
1639 // the following line is evil! It switches off MIDI interrupt handling after the first interrupt received.
1640 // replacing the last 0 by 0x40 works for ESS-Solo1, but just doing nothing works as well!
1641 // andreas@flying-snail.de
1642 // snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0); /* ack? */
1645 snd_mpu401_uart_interrupt(irq
, chip
->rmidi
->private_data
);
1648 return IRQ_RETVAL(handled
);
1651 #define ES1938_DMA_SIZE 64
1653 static int snd_es1938_mixer(struct es1938
*chip
)
1655 struct snd_card
*card
;
1661 strcpy(card
->mixername
, "ESS Solo-1");
1663 for (idx
= 0; idx
< ARRAY_SIZE(snd_es1938_controls
); idx
++) {
1664 struct snd_kcontrol
*kctl
;
1665 kctl
= snd_ctl_new1(&snd_es1938_controls
[idx
], chip
);
1668 chip
->master_volume
= kctl
;
1669 kctl
->private_free
= snd_es1938_hwv_free
;
1672 chip
->master_switch
= kctl
;
1673 kctl
->private_free
= snd_es1938_hwv_free
;
1676 chip
->hw_volume
= kctl
;
1677 kctl
->private_free
= snd_es1938_hwv_free
;
1680 chip
->hw_switch
= kctl
;
1681 kctl
->private_free
= snd_es1938_hwv_free
;
1684 err
= snd_ctl_add(card
, kctl
);
1692 static int __snd_es1938_probe(struct pci_dev
*pci
,
1693 const struct pci_device_id
*pci_id
)
1696 struct snd_card
*card
;
1697 struct es1938
*chip
;
1698 struct snd_opl3
*opl3
;
1701 if (dev
>= SNDRV_CARDS
)
1708 err
= snd_devm_card_new(&pci
->dev
, index
[dev
], id
[dev
], THIS_MODULE
,
1709 sizeof(*chip
), &card
);
1712 chip
= card
->private_data
;
1714 for (idx
= 0; idx
< 5; idx
++)
1715 if (pci_resource_start(pci
, idx
) == 0 ||
1716 !(pci_resource_flags(pci
, idx
) & IORESOURCE_IO
))
1719 err
= snd_es1938_create(card
, pci
);
1723 strcpy(card
->driver
, "ES1938");
1724 strcpy(card
->shortname
, "ESS ES1938 (Solo-1)");
1725 sprintf(card
->longname
, "%s rev %i, irq %i",
1730 err
= snd_es1938_new_pcm(chip
, 0);
1733 err
= snd_es1938_mixer(chip
);
1736 if (snd_opl3_create(card
,
1737 SLSB_REG(chip
, FMLOWADDR
),
1738 SLSB_REG(chip
, FMHIGHADDR
),
1739 OPL3_HW_OPL3
, 1, &opl3
) < 0) {
1740 dev_err(card
->dev
, "OPL3 not detected at 0x%lx\n",
1741 SLSB_REG(chip
, FMLOWADDR
));
1743 err
= snd_opl3_timer_new(opl3
, 0, 1);
1746 err
= snd_opl3_hwdep_new(opl3
, 0, 1, NULL
);
1750 if (snd_mpu401_uart_new(card
, 0, MPU401_HW_MPU401
,
1752 MPU401_INFO_INTEGRATED
| MPU401_INFO_IRQ_HOOK
,
1753 -1, &chip
->rmidi
) < 0) {
1754 dev_err(card
->dev
, "unable to initialize MPU-401\n");
1756 // this line is vital for MIDI interrupt handling on ess-solo1
1757 // andreas@flying-snail.de
1758 snd_es1938_mixer_bits(chip
, ESSSB_IREG_MPU401CONTROL
, 0x40, 0x40);
1761 snd_es1938_create_gameport(chip
);
1763 err
= snd_card_register(card
);
1767 pci_set_drvdata(pci
, card
);
1772 static int snd_es1938_probe(struct pci_dev
*pci
,
1773 const struct pci_device_id
*pci_id
)
1775 return snd_card_free_on_error(&pci
->dev
, __snd_es1938_probe(pci
, pci_id
));
1778 static struct pci_driver es1938_driver
= {
1779 .name
= KBUILD_MODNAME
,
1780 .id_table
= snd_es1938_ids
,
1781 .probe
= snd_es1938_probe
,
1787 module_pci_driver(es1938_driver
);