Merge tag 'gfs2-nopid-for-v6.1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[platform/kernel/linux-starfive.git] / sound / pci / es1938.c
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
52 MODULE_AUTHOR("Jaromir Koutek <miri@punknet.cz>");
53 MODULE_DESCRIPTION("ESS Solo-1");
54 MODULE_LICENSE("GPL");
55
56 #if IS_REACHABLE(CONFIG_GAMEPORT)
57 #define SUPPORT_JOYSTICK 1
58 #endif
59
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 */
63
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.");
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
177 struct 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
224 static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id);
225
226 static const struct pci_device_id snd_es1938_ids[] = {
227         { PCI_VDEVICE(ESS, 0x1969), 0, },   /* Solo-1 */
228         { 0, }
229 };
230
231 MODULE_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  * -----------------------------------------------------------------*/
240 static 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  * -----------------------------------------------------------------*/
253 static 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  * -----------------------------------------------------------------*/
268 static 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  * -----------------------------------------------------------------*/
291 static 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  * -----------------------------------------------------------------*/
309 static 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  * -----------------------------------------------------------------*/
325 static 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  * -----------------------------------------------------------------*/
338 static 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  * -----------------------------------------------------------------*/
354 static 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  * --------------------------------------------------------------------*/
378 static 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  * --------------------------------------------------------------------*/
417 static 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
423 static 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
438 static const struct snd_pcm_hw_constraint_ratnums hw_constraints_clocks = {
439         .nrats = 2,
440         .rats = clocks,
441 };
442
443
444 static 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
471 static 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
479 static 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
494 static 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
515 static 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
538 static 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
568 static 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
591 static 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  * --------------------------------------------------------------------*/
607 static 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  * ------------------------------------------------------------------------------*/
655 static 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
692 static 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
734 static 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 */
754 static 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
784 static 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
796 static 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
813 static 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
825 static int snd_es1938_capture_copy(struct snd_pcm_substream *substream,
826                                    int channel, unsigned long pos,
827                                    void __user *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_user(dst, runtime->dma_area + pos + 1, count))
836                         return -EFAULT;
837         } else {
838                 if (copy_to_user(dst, runtime->dma_area + pos + 1, count - 1))
839                         return -EFAULT;
840                 if (put_user(runtime->dma_area[0],
841                              ((unsigned char __user *)dst) + count - 1))
842                         return -EFAULT;
843         }
844         return 0;
845 }
846
847 static int snd_es1938_capture_copy_kernel(struct snd_pcm_substream *substream,
848                                           int channel, unsigned long pos,
849                                           void *dst, unsigned long count)
850 {
851         struct snd_pcm_runtime *runtime = substream->runtime;
852         struct es1938 *chip = snd_pcm_substream_chip(substream);
853
854         if (snd_BUG_ON(pos + count > chip->dma1_size))
855                 return -EINVAL;
856         if (pos + count < chip->dma1_size) {
857                 memcpy(dst, runtime->dma_area + pos + 1, count);
858         } else {
859                 memcpy(dst, runtime->dma_area + pos + 1, count - 1);
860                 runtime->dma_area[0] = *((unsigned char *)dst + count - 1);
861         }
862         return 0;
863 }
864
865 /* ----------------------------------------------------------------------
866  * Audio1 Capture (ADC)
867  * ----------------------------------------------------------------------*/
868 static const struct snd_pcm_hardware snd_es1938_capture =
869 {
870         .info =                 (SNDRV_PCM_INFO_INTERLEAVED |
871                                 SNDRV_PCM_INFO_BLOCK_TRANSFER),
872         .formats =              (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE |
873                                  SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE),
874         .rates =                SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
875         .rate_min =             6000,
876         .rate_max =             48000,
877         .channels_min =         1,
878         .channels_max =         2,
879         .buffer_bytes_max =     0x8000,       /* DMA controller screws on higher values */
880         .period_bytes_min =     64,
881         .period_bytes_max =     0x8000,
882         .periods_min =          1,
883         .periods_max =          1024,
884         .fifo_size =            256,
885 };
886
887 /* -----------------------------------------------------------------------
888  * Audio2 Playback (DAC)
889  * -----------------------------------------------------------------------*/
890 static const struct snd_pcm_hardware snd_es1938_playback =
891 {
892         .info =                 (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
893                                  SNDRV_PCM_INFO_BLOCK_TRANSFER |
894                                  SNDRV_PCM_INFO_MMAP_VALID),
895         .formats =              (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE |
896                                  SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE),
897         .rates =                SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
898         .rate_min =             6000,
899         .rate_max =             48000,
900         .channels_min =         1,
901         .channels_max =         2,
902         .buffer_bytes_max =     0x8000,       /* DMA controller screws on higher values */
903         .period_bytes_min =     64,
904         .period_bytes_max =     0x8000,
905         .periods_min =          1,
906         .periods_max =          1024,
907         .fifo_size =            256,
908 };
909
910 static int snd_es1938_capture_open(struct snd_pcm_substream *substream)
911 {
912         struct es1938 *chip = snd_pcm_substream_chip(substream);
913         struct snd_pcm_runtime *runtime = substream->runtime;
914
915         if (chip->playback2_substream)
916                 return -EAGAIN;
917         chip->capture_substream = substream;
918         runtime->hw = snd_es1938_capture;
919         snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
920                                       &hw_constraints_clocks);
921         snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 0, 0xff00);
922         return 0;
923 }
924
925 static int snd_es1938_playback_open(struct snd_pcm_substream *substream)
926 {
927         struct es1938 *chip = snd_pcm_substream_chip(substream);
928         struct snd_pcm_runtime *runtime = substream->runtime;
929
930         switch (substream->number) {
931         case 0:
932                 chip->playback1_substream = substream;
933                 break;
934         case 1:
935                 if (chip->capture_substream)
936                         return -EAGAIN;
937                 chip->playback2_substream = substream;
938                 break;
939         default:
940                 snd_BUG();
941                 return -EINVAL;
942         }
943         runtime->hw = snd_es1938_playback;
944         snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
945                                       &hw_constraints_clocks);
946         snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 0, 0xff00);
947         return 0;
948 }
949
950 static int snd_es1938_capture_close(struct snd_pcm_substream *substream)
951 {
952         struct es1938 *chip = snd_pcm_substream_chip(substream);
953
954         chip->capture_substream = NULL;
955         return 0;
956 }
957
958 static int snd_es1938_playback_close(struct snd_pcm_substream *substream)
959 {
960         struct es1938 *chip = snd_pcm_substream_chip(substream);
961
962         switch (substream->number) {
963         case 0:
964                 chip->playback1_substream = NULL;
965                 break;
966         case 1:
967                 chip->playback2_substream = NULL;
968                 break;
969         default:
970                 snd_BUG();
971                 return -EINVAL;
972         }
973         return 0;
974 }
975
976 static const struct snd_pcm_ops snd_es1938_playback_ops = {
977         .open =         snd_es1938_playback_open,
978         .close =        snd_es1938_playback_close,
979         .prepare =      snd_es1938_playback_prepare,
980         .trigger =      snd_es1938_playback_trigger,
981         .pointer =      snd_es1938_playback_pointer,
982 };
983
984 static const struct snd_pcm_ops snd_es1938_capture_ops = {
985         .open =         snd_es1938_capture_open,
986         .close =        snd_es1938_capture_close,
987         .prepare =      snd_es1938_capture_prepare,
988         .trigger =      snd_es1938_capture_trigger,
989         .pointer =      snd_es1938_capture_pointer,
990         .copy_user =    snd_es1938_capture_copy,
991         .copy_kernel =  snd_es1938_capture_copy_kernel,
992 };
993
994 static int snd_es1938_new_pcm(struct es1938 *chip, int device)
995 {
996         struct snd_pcm *pcm;
997         int err;
998
999         err = snd_pcm_new(chip->card, "es-1938-1946", device, 2, 1, &pcm);
1000         if (err < 0)
1001                 return err;
1002         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_es1938_playback_ops);
1003         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_es1938_capture_ops);
1004         
1005         pcm->private_data = chip;
1006         pcm->info_flags = 0;
1007         strcpy(pcm->name, "ESS Solo-1");
1008
1009         snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
1010                                        &chip->pci->dev, 64*1024, 64*1024);
1011
1012         chip->pcm = pcm;
1013         return 0;
1014 }
1015
1016 /* -------------------------------------------------------------------
1017  * 
1018  *                       *** Mixer part ***
1019  */
1020
1021 static int snd_es1938_info_mux(struct snd_kcontrol *kcontrol,
1022                                struct snd_ctl_elem_info *uinfo)
1023 {
1024         static const char * const texts[8] = {
1025                 "Mic", "Mic Master", "CD", "AOUT",
1026                 "Mic1", "Mix", "Line", "Master"
1027         };
1028
1029         return snd_ctl_enum_info(uinfo, 1, 8, texts);
1030 }
1031
1032 static int snd_es1938_get_mux(struct snd_kcontrol *kcontrol,
1033                               struct snd_ctl_elem_value *ucontrol)
1034 {
1035         struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1036         ucontrol->value.enumerated.item[0] = snd_es1938_mixer_read(chip, 0x1c) & 0x07;
1037         return 0;
1038 }
1039
1040 static int snd_es1938_put_mux(struct snd_kcontrol *kcontrol,
1041                               struct snd_ctl_elem_value *ucontrol)
1042 {
1043         struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1044         unsigned char val = ucontrol->value.enumerated.item[0];
1045         
1046         if (val > 7)
1047                 return -EINVAL;
1048         return snd_es1938_mixer_bits(chip, 0x1c, 0x07, val) != val;
1049 }
1050
1051 #define snd_es1938_info_spatializer_enable      snd_ctl_boolean_mono_info
1052
1053 static int snd_es1938_get_spatializer_enable(struct snd_kcontrol *kcontrol,
1054                                              struct snd_ctl_elem_value *ucontrol)
1055 {
1056         struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1057         unsigned char val = snd_es1938_mixer_read(chip, 0x50);
1058         ucontrol->value.integer.value[0] = !!(val & 8);
1059         return 0;
1060 }
1061
1062 static int snd_es1938_put_spatializer_enable(struct snd_kcontrol *kcontrol,
1063                                              struct snd_ctl_elem_value *ucontrol)
1064 {
1065         struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1066         unsigned char oval, nval;
1067         int change;
1068         nval = ucontrol->value.integer.value[0] ? 0x0c : 0x04;
1069         oval = snd_es1938_mixer_read(chip, 0x50) & 0x0c;
1070         change = nval != oval;
1071         if (change) {
1072                 snd_es1938_mixer_write(chip, 0x50, nval & ~0x04);
1073                 snd_es1938_mixer_write(chip, 0x50, nval);
1074         }
1075         return change;
1076 }
1077
1078 static int snd_es1938_info_hw_volume(struct snd_kcontrol *kcontrol,
1079                                      struct snd_ctl_elem_info *uinfo)
1080 {
1081         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1082         uinfo->count = 2;
1083         uinfo->value.integer.min = 0;
1084         uinfo->value.integer.max = 63;
1085         return 0;
1086 }
1087
1088 static int snd_es1938_get_hw_volume(struct snd_kcontrol *kcontrol,
1089                                     struct snd_ctl_elem_value *ucontrol)
1090 {
1091         struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1092         ucontrol->value.integer.value[0] = snd_es1938_mixer_read(chip, 0x61) & 0x3f;
1093         ucontrol->value.integer.value[1] = snd_es1938_mixer_read(chip, 0x63) & 0x3f;
1094         return 0;
1095 }
1096
1097 #define snd_es1938_info_hw_switch               snd_ctl_boolean_stereo_info
1098
1099 static int snd_es1938_get_hw_switch(struct snd_kcontrol *kcontrol,
1100                                     struct snd_ctl_elem_value *ucontrol)
1101 {
1102         struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1103         ucontrol->value.integer.value[0] = !(snd_es1938_mixer_read(chip, 0x61) & 0x40);
1104         ucontrol->value.integer.value[1] = !(snd_es1938_mixer_read(chip, 0x63) & 0x40);
1105         return 0;
1106 }
1107
1108 static void snd_es1938_hwv_free(struct snd_kcontrol *kcontrol)
1109 {
1110         struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1111         chip->master_volume = NULL;
1112         chip->master_switch = NULL;
1113         chip->hw_volume = NULL;
1114         chip->hw_switch = NULL;
1115 }
1116
1117 static int snd_es1938_reg_bits(struct es1938 *chip, unsigned char reg,
1118                                unsigned char mask, unsigned char val)
1119 {
1120         if (reg < 0xa0)
1121                 return snd_es1938_mixer_bits(chip, reg, mask, val);
1122         else
1123                 return snd_es1938_bits(chip, reg, mask, val);
1124 }
1125
1126 static int snd_es1938_reg_read(struct es1938 *chip, unsigned char reg)
1127 {
1128         if (reg < 0xa0)
1129                 return snd_es1938_mixer_read(chip, reg);
1130         else
1131                 return snd_es1938_read(chip, reg);
1132 }
1133
1134 #define ES1938_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv)    \
1135 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1136   .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,\
1137   .name = xname, .index = xindex, \
1138   .info = snd_es1938_info_single, \
1139   .get = snd_es1938_get_single, .put = snd_es1938_put_single, \
1140   .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24), \
1141   .tlv = { .p = xtlv } }
1142 #define ES1938_SINGLE(xname, xindex, reg, shift, mask, invert) \
1143 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1144   .info = snd_es1938_info_single, \
1145   .get = snd_es1938_get_single, .put = snd_es1938_put_single, \
1146   .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24) }
1147
1148 static int snd_es1938_info_single(struct snd_kcontrol *kcontrol,
1149                                   struct snd_ctl_elem_info *uinfo)
1150 {
1151         int mask = (kcontrol->private_value >> 16) & 0xff;
1152
1153         uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1154         uinfo->count = 1;
1155         uinfo->value.integer.min = 0;
1156         uinfo->value.integer.max = mask;
1157         return 0;
1158 }
1159
1160 static int snd_es1938_get_single(struct snd_kcontrol *kcontrol,
1161                                  struct snd_ctl_elem_value *ucontrol)
1162 {
1163         struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1164         int reg = kcontrol->private_value & 0xff;
1165         int shift = (kcontrol->private_value >> 8) & 0xff;
1166         int mask = (kcontrol->private_value >> 16) & 0xff;
1167         int invert = (kcontrol->private_value >> 24) & 0xff;
1168         int val;
1169         
1170         val = snd_es1938_reg_read(chip, reg);
1171         ucontrol->value.integer.value[0] = (val >> shift) & mask;
1172         if (invert)
1173                 ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1174         return 0;
1175 }
1176
1177 static int snd_es1938_put_single(struct snd_kcontrol *kcontrol,
1178                                  struct snd_ctl_elem_value *ucontrol)
1179 {
1180         struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1181         int reg = kcontrol->private_value & 0xff;
1182         int shift = (kcontrol->private_value >> 8) & 0xff;
1183         int mask = (kcontrol->private_value >> 16) & 0xff;
1184         int invert = (kcontrol->private_value >> 24) & 0xff;
1185         unsigned char val;
1186         
1187         val = (ucontrol->value.integer.value[0] & mask);
1188         if (invert)
1189                 val = mask - val;
1190         mask <<= shift;
1191         val <<= shift;
1192         return snd_es1938_reg_bits(chip, reg, mask, val) != val;
1193 }
1194
1195 #define ES1938_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert, xtlv) \
1196 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1197   .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,\
1198   .name = xname, .index = xindex, \
1199   .info = snd_es1938_info_double, \
1200   .get = snd_es1938_get_double, .put = snd_es1938_put_double, \
1201   .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22), \
1202   .tlv = { .p = xtlv } }
1203 #define ES1938_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
1204 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1205   .info = snd_es1938_info_double, \
1206   .get = snd_es1938_get_double, .put = snd_es1938_put_double, \
1207   .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) }
1208
1209 static int snd_es1938_info_double(struct snd_kcontrol *kcontrol,
1210                                   struct snd_ctl_elem_info *uinfo)
1211 {
1212         int mask = (kcontrol->private_value >> 24) & 0xff;
1213
1214         uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1215         uinfo->count = 2;
1216         uinfo->value.integer.min = 0;
1217         uinfo->value.integer.max = mask;
1218         return 0;
1219 }
1220
1221 static int snd_es1938_get_double(struct snd_kcontrol *kcontrol,
1222                                  struct snd_ctl_elem_value *ucontrol)
1223 {
1224         struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1225         int left_reg = kcontrol->private_value & 0xff;
1226         int right_reg = (kcontrol->private_value >> 8) & 0xff;
1227         int shift_left = (kcontrol->private_value >> 16) & 0x07;
1228         int shift_right = (kcontrol->private_value >> 19) & 0x07;
1229         int mask = (kcontrol->private_value >> 24) & 0xff;
1230         int invert = (kcontrol->private_value >> 22) & 1;
1231         unsigned char left, right;
1232         
1233         left = snd_es1938_reg_read(chip, left_reg);
1234         if (left_reg != right_reg)
1235                 right = snd_es1938_reg_read(chip, right_reg);
1236         else
1237                 right = left;
1238         ucontrol->value.integer.value[0] = (left >> shift_left) & mask;
1239         ucontrol->value.integer.value[1] = (right >> shift_right) & mask;
1240         if (invert) {
1241                 ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1242                 ucontrol->value.integer.value[1] = mask - ucontrol->value.integer.value[1];
1243         }
1244         return 0;
1245 }
1246
1247 static int snd_es1938_put_double(struct snd_kcontrol *kcontrol,
1248                                  struct snd_ctl_elem_value *ucontrol)
1249 {
1250         struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1251         int left_reg = kcontrol->private_value & 0xff;
1252         int right_reg = (kcontrol->private_value >> 8) & 0xff;
1253         int shift_left = (kcontrol->private_value >> 16) & 0x07;
1254         int shift_right = (kcontrol->private_value >> 19) & 0x07;
1255         int mask = (kcontrol->private_value >> 24) & 0xff;
1256         int invert = (kcontrol->private_value >> 22) & 1;
1257         int change;
1258         unsigned char val1, val2, mask1, mask2;
1259         
1260         val1 = ucontrol->value.integer.value[0] & mask;
1261         val2 = ucontrol->value.integer.value[1] & mask;
1262         if (invert) {
1263                 val1 = mask - val1;
1264                 val2 = mask - val2;
1265         }
1266         val1 <<= shift_left;
1267         val2 <<= shift_right;
1268         mask1 = mask << shift_left;
1269         mask2 = mask << shift_right;
1270         if (left_reg != right_reg) {
1271                 change = 0;
1272                 if (snd_es1938_reg_bits(chip, left_reg, mask1, val1) != val1)
1273                         change = 1;
1274                 if (snd_es1938_reg_bits(chip, right_reg, mask2, val2) != val2)
1275                         change = 1;
1276         } else {
1277                 change = (snd_es1938_reg_bits(chip, left_reg, mask1 | mask2, 
1278                                               val1 | val2) != (val1 | val2));
1279         }
1280         return change;
1281 }
1282
1283 static const DECLARE_TLV_DB_RANGE(db_scale_master,
1284         0, 54, TLV_DB_SCALE_ITEM(-3600, 50, 1),
1285         54, 63, TLV_DB_SCALE_ITEM(-900, 100, 0),
1286 );
1287
1288 static const DECLARE_TLV_DB_RANGE(db_scale_audio1,
1289         0, 8, TLV_DB_SCALE_ITEM(-3300, 300, 1),
1290         8, 15, TLV_DB_SCALE_ITEM(-900, 150, 0),
1291 );
1292
1293 static const DECLARE_TLV_DB_RANGE(db_scale_audio2,
1294         0, 8, TLV_DB_SCALE_ITEM(-3450, 300, 1),
1295         8, 15, TLV_DB_SCALE_ITEM(-1050, 150, 0),
1296 );
1297
1298 static const DECLARE_TLV_DB_RANGE(db_scale_mic,
1299         0, 8, TLV_DB_SCALE_ITEM(-2400, 300, 1),
1300         8, 15, TLV_DB_SCALE_ITEM(0, 150, 0),
1301 );
1302
1303 static const DECLARE_TLV_DB_RANGE(db_scale_line,
1304         0, 8, TLV_DB_SCALE_ITEM(-3150, 300, 1),
1305         8, 15, TLV_DB_SCALE_ITEM(-750, 150, 0),
1306 );
1307
1308 static const DECLARE_TLV_DB_SCALE(db_scale_capture, 0, 150, 0);
1309
1310 static const struct snd_kcontrol_new snd_es1938_controls[] = {
1311 ES1938_DOUBLE_TLV("Master Playback Volume", 0, 0x60, 0x62, 0, 0, 63, 0,
1312                   db_scale_master),
1313 ES1938_DOUBLE("Master Playback Switch", 0, 0x60, 0x62, 6, 6, 1, 1),
1314 {
1315         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1316         .name = "Hardware Master Playback Volume",
1317         .access = SNDRV_CTL_ELEM_ACCESS_READ,
1318         .info = snd_es1938_info_hw_volume,
1319         .get = snd_es1938_get_hw_volume,
1320 },
1321 {
1322         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1323         .access = (SNDRV_CTL_ELEM_ACCESS_READ |
1324                    SNDRV_CTL_ELEM_ACCESS_TLV_READ),
1325         .name = "Hardware Master Playback Switch",
1326         .info = snd_es1938_info_hw_switch,
1327         .get = snd_es1938_get_hw_switch,
1328         .tlv = { .p = db_scale_master },
1329 },
1330 ES1938_SINGLE("Hardware Volume Split", 0, 0x64, 7, 1, 0),
1331 ES1938_DOUBLE_TLV("Line Playback Volume", 0, 0x3e, 0x3e, 4, 0, 15, 0,
1332                   db_scale_line),
1333 ES1938_DOUBLE("CD Playback Volume", 0, 0x38, 0x38, 4, 0, 15, 0),
1334 ES1938_DOUBLE_TLV("FM Playback Volume", 0, 0x36, 0x36, 4, 0, 15, 0,
1335                   db_scale_mic),
1336 ES1938_DOUBLE_TLV("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0,
1337                   db_scale_line),
1338 ES1938_DOUBLE_TLV("Mic Playback Volume", 0, 0x1a, 0x1a, 4, 0, 15, 0,
1339                   db_scale_mic),
1340 ES1938_DOUBLE_TLV("Aux Playback Volume", 0, 0x3a, 0x3a, 4, 0, 15, 0,
1341                   db_scale_line),
1342 ES1938_DOUBLE_TLV("Capture Volume", 0, 0xb4, 0xb4, 4, 0, 15, 0,
1343                   db_scale_capture),
1344 ES1938_SINGLE("Beep Volume", 0, 0x3c, 0, 7, 0),
1345 ES1938_SINGLE("Record Monitor", 0, 0xa8, 3, 1, 0),
1346 ES1938_SINGLE("Capture Switch", 0, 0x1c, 4, 1, 1),
1347 {
1348         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1349         .name = "Capture Source",
1350         .info = snd_es1938_info_mux,
1351         .get = snd_es1938_get_mux,
1352         .put = snd_es1938_put_mux,
1353 },
1354 ES1938_DOUBLE_TLV("Mono Input Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0,
1355                   db_scale_line),
1356 ES1938_DOUBLE_TLV("PCM Capture Volume", 0, 0x69, 0x69, 4, 0, 15, 0,
1357                   db_scale_audio2),
1358 ES1938_DOUBLE_TLV("Mic Capture Volume", 0, 0x68, 0x68, 4, 0, 15, 0,
1359                   db_scale_mic),
1360 ES1938_DOUBLE_TLV("Line Capture Volume", 0, 0x6e, 0x6e, 4, 0, 15, 0,
1361                   db_scale_line),
1362 ES1938_DOUBLE_TLV("FM Capture Volume", 0, 0x6b, 0x6b, 4, 0, 15, 0,
1363                   db_scale_mic),
1364 ES1938_DOUBLE_TLV("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0,
1365                   db_scale_line),
1366 ES1938_DOUBLE_TLV("CD Capture Volume", 0, 0x6a, 0x6a, 4, 0, 15, 0,
1367                   db_scale_line),
1368 ES1938_DOUBLE_TLV("Aux Capture Volume", 0, 0x6c, 0x6c, 4, 0, 15, 0,
1369                   db_scale_line),
1370 ES1938_DOUBLE_TLV("PCM Playback Volume", 0, 0x7c, 0x7c, 4, 0, 15, 0,
1371                   db_scale_audio2),
1372 ES1938_DOUBLE_TLV("PCM Playback Volume", 1, 0x14, 0x14, 4, 0, 15, 0,
1373                   db_scale_audio1),
1374 ES1938_SINGLE("3D Control - Level", 0, 0x52, 0, 63, 0),
1375 {
1376         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1377         .name = "3D Control - Switch",
1378         .info = snd_es1938_info_spatializer_enable,
1379         .get = snd_es1938_get_spatializer_enable,
1380         .put = snd_es1938_put_spatializer_enable,
1381 },
1382 ES1938_SINGLE("Mic Boost (+26dB)", 0, 0x7d, 3, 1, 0)
1383 };
1384
1385
1386 /* ---------------------------------------------------------------------------- */
1387 /* ---------------------------------------------------------------------------- */
1388
1389 /*
1390  * initialize the chip - used by resume callback, too
1391  */
1392 static void snd_es1938_chip_init(struct es1938 *chip)
1393 {
1394         /* reset chip */
1395         snd_es1938_reset(chip);
1396
1397         /* configure native mode */
1398
1399         /* enable bus master */
1400         pci_set_master(chip->pci);
1401
1402         /* disable legacy audio */
1403         pci_write_config_word(chip->pci, SL_PCI_LEGACYCONTROL, 0x805f);
1404
1405         /* set DDMA base */
1406         pci_write_config_word(chip->pci, SL_PCI_DDMACONTROL, chip->ddma_port | 1);
1407
1408         /* set DMA/IRQ policy */
1409         pci_write_config_dword(chip->pci, SL_PCI_CONFIG, 0);
1410
1411         /* enable Audio 1, Audio 2, MPU401 IRQ and HW volume IRQ*/
1412         outb(0xf0, SLIO_REG(chip, IRQCONTROL));
1413
1414         /* reset DMA */
1415         outb(0, SLDM_REG(chip, DMACLEAR));
1416 }
1417
1418 #ifdef CONFIG_PM_SLEEP
1419 /*
1420  * PM support
1421  */
1422
1423 static const unsigned char saved_regs[SAVED_REG_SIZE+1] = {
1424         0x14, 0x1a, 0x1c, 0x3a, 0x3c, 0x3e, 0x36, 0x38,
1425         0x50, 0x52, 0x60, 0x61, 0x62, 0x63, 0x64, 0x68,
1426         0x69, 0x6a, 0x6b, 0x6d, 0x6e, 0x6f, 0x7c, 0x7d,
1427         0xa8, 0xb4,
1428 };
1429
1430
1431 static int es1938_suspend(struct device *dev)
1432 {
1433         struct snd_card *card = dev_get_drvdata(dev);
1434         struct es1938 *chip = card->private_data;
1435         const unsigned char *s;
1436         unsigned char *d;
1437
1438         snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
1439
1440         /* save mixer-related registers */
1441         for (s = saved_regs, d = chip->saved_regs; *s; s++, d++)
1442                 *d = snd_es1938_reg_read(chip, *s);
1443
1444         outb(0x00, SLIO_REG(chip, IRQCONTROL)); /* disable irqs */
1445         if (chip->irq >= 0) {
1446                 free_irq(chip->irq, chip);
1447                 chip->irq = -1;
1448                 card->sync_irq = -1;
1449         }
1450         return 0;
1451 }
1452
1453 static int es1938_resume(struct device *dev)
1454 {
1455         struct pci_dev *pci = to_pci_dev(dev);
1456         struct snd_card *card = dev_get_drvdata(dev);
1457         struct es1938 *chip = card->private_data;
1458         const unsigned char *s;
1459         unsigned char *d;
1460
1461         if (request_irq(pci->irq, snd_es1938_interrupt,
1462                         IRQF_SHARED, KBUILD_MODNAME, chip)) {
1463                 dev_err(dev, "unable to grab IRQ %d, disabling device\n",
1464                         pci->irq);
1465                 snd_card_disconnect(card);
1466                 return -EIO;
1467         }
1468         chip->irq = pci->irq;
1469         card->sync_irq = chip->irq;
1470         snd_es1938_chip_init(chip);
1471
1472         /* restore mixer-related registers */
1473         for (s = saved_regs, d = chip->saved_regs; *s; s++, d++) {
1474                 if (*s < 0xa0)
1475                         snd_es1938_mixer_write(chip, *s, *d);
1476                 else
1477                         snd_es1938_write(chip, *s, *d);
1478         }
1479
1480         snd_power_change_state(card, SNDRV_CTL_POWER_D0);
1481         return 0;
1482 }
1483
1484 static SIMPLE_DEV_PM_OPS(es1938_pm, es1938_suspend, es1938_resume);
1485 #define ES1938_PM_OPS   &es1938_pm
1486 #else
1487 #define ES1938_PM_OPS   NULL
1488 #endif /* CONFIG_PM_SLEEP */
1489
1490 #ifdef SUPPORT_JOYSTICK
1491 static int snd_es1938_create_gameport(struct es1938 *chip)
1492 {
1493         struct gameport *gp;
1494
1495         chip->gameport = gp = gameport_allocate_port();
1496         if (!gp) {
1497                 dev_err(chip->card->dev,
1498                         "cannot allocate memory for gameport\n");
1499                 return -ENOMEM;
1500         }
1501
1502         gameport_set_name(gp, "ES1938");
1503         gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci));
1504         gameport_set_dev_parent(gp, &chip->pci->dev);
1505         gp->io = chip->game_port;
1506
1507         gameport_register_port(gp);
1508
1509         return 0;
1510 }
1511
1512 static void snd_es1938_free_gameport(struct es1938 *chip)
1513 {
1514         if (chip->gameport) {
1515                 gameport_unregister_port(chip->gameport);
1516                 chip->gameport = NULL;
1517         }
1518 }
1519 #else
1520 static inline int snd_es1938_create_gameport(struct es1938 *chip) { return -ENOSYS; }
1521 static inline void snd_es1938_free_gameport(struct es1938 *chip) { }
1522 #endif /* SUPPORT_JOYSTICK */
1523
1524 static void snd_es1938_free(struct snd_card *card)
1525 {
1526         struct es1938 *chip = card->private_data;
1527
1528         /* disable irqs */
1529         outb(0x00, SLIO_REG(chip, IRQCONTROL));
1530         if (chip->rmidi)
1531                 snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0);
1532
1533         snd_es1938_free_gameport(chip);
1534
1535         if (chip->irq >= 0)
1536                 free_irq(chip->irq, chip);
1537 }
1538
1539 static int snd_es1938_create(struct snd_card *card,
1540                              struct pci_dev *pci)
1541 {
1542         struct es1938 *chip = card->private_data;
1543         int err;
1544
1545         /* enable PCI device */
1546         err = pcim_enable_device(pci);
1547         if (err < 0)
1548                 return err;
1549         /* check, if we can restrict PCI DMA transfers to 24 bits */
1550         if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(24))) {
1551                 dev_err(card->dev,
1552                         "architecture does not support 24bit PCI busmaster DMA\n");
1553                 return -ENXIO;
1554         }
1555
1556         spin_lock_init(&chip->reg_lock);
1557         spin_lock_init(&chip->mixer_lock);
1558         chip->card = card;
1559         chip->pci = pci;
1560         chip->irq = -1;
1561         err = pci_request_regions(pci, "ESS Solo-1");
1562         if (err < 0)
1563                 return err;
1564         chip->io_port = pci_resource_start(pci, 0);
1565         chip->sb_port = pci_resource_start(pci, 1);
1566         chip->vc_port = pci_resource_start(pci, 2);
1567         chip->mpu_port = pci_resource_start(pci, 3);
1568         chip->game_port = pci_resource_start(pci, 4);
1569         /* still use non-managed irq handler as it's re-acquired at PM resume */
1570         if (request_irq(pci->irq, snd_es1938_interrupt, IRQF_SHARED,
1571                         KBUILD_MODNAME, chip)) {
1572                 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
1573                 return -EBUSY;
1574         }
1575         chip->irq = pci->irq;
1576         card->sync_irq = chip->irq;
1577         card->private_free = snd_es1938_free;
1578         dev_dbg(card->dev,
1579                 "create: io: 0x%lx, sb: 0x%lx, vc: 0x%lx, mpu: 0x%lx, game: 0x%lx\n",
1580                    chip->io_port, chip->sb_port, chip->vc_port, chip->mpu_port, chip->game_port);
1581
1582         chip->ddma_port = chip->vc_port + 0x00;         /* fix from Thomas Sailer */
1583
1584         snd_es1938_chip_init(chip);
1585         return 0;
1586 }
1587
1588 /* --------------------------------------------------------------------
1589  * Interrupt handler
1590  * -------------------------------------------------------------------- */
1591 static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id)
1592 {
1593         struct es1938 *chip = dev_id;
1594         unsigned char status;
1595         __always_unused unsigned char audiostatus;
1596         int handled = 0;
1597
1598         status = inb(SLIO_REG(chip, IRQCONTROL));
1599 #if 0
1600         dev_dbg(chip->card->dev,
1601                 "Es1938debug - interrupt status: =0x%x\n", status);
1602 #endif
1603         
1604         /* AUDIO 1 */
1605         if (status & 0x10) {
1606 #if 0
1607                 dev_dbg(chip->card->dev,
1608                        "Es1938debug - AUDIO channel 1 interrupt\n");
1609                 dev_dbg(chip->card->dev,
1610                        "Es1938debug - AUDIO channel 1 DMAC DMA count: %u\n",
1611                        inw(SLDM_REG(chip, DMACOUNT)));
1612                 dev_dbg(chip->card->dev,
1613                        "Es1938debug - AUDIO channel 1 DMAC DMA base: %u\n",
1614                        inl(SLDM_REG(chip, DMAADDR)));
1615                 dev_dbg(chip->card->dev,
1616                        "Es1938debug - AUDIO channel 1 DMAC DMA status: 0x%x\n",
1617                        inl(SLDM_REG(chip, DMASTATUS)));
1618 #endif
1619                 /* clear irq */
1620                 handled = 1;
1621                 audiostatus = inb(SLSB_REG(chip, STATUS));
1622                 if (chip->active & ADC1)
1623                         snd_pcm_period_elapsed(chip->capture_substream);
1624                 else if (chip->active & DAC1)
1625                         snd_pcm_period_elapsed(chip->playback2_substream);
1626         }
1627         
1628         /* AUDIO 2 */
1629         if (status & 0x20) {
1630 #if 0
1631                 dev_dbg(chip->card->dev,
1632                        "Es1938debug - AUDIO channel 2 interrupt\n");
1633                 dev_dbg(chip->card->dev,
1634                        "Es1938debug - AUDIO channel 2 DMAC DMA count: %u\n",
1635                        inw(SLIO_REG(chip, AUDIO2DMACOUNT)));
1636                 dev_dbg(chip->card->dev,
1637                        "Es1938debug - AUDIO channel 2 DMAC DMA base: %u\n",
1638                        inl(SLIO_REG(chip, AUDIO2DMAADDR)));
1639
1640 #endif
1641                 /* clear irq */
1642                 handled = 1;
1643                 snd_es1938_mixer_bits(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x80, 0);
1644                 if (chip->active & DAC2)
1645                         snd_pcm_period_elapsed(chip->playback1_substream);
1646         }
1647
1648         /* Hardware volume */
1649         if (status & 0x40) {
1650                 int split = snd_es1938_mixer_read(chip, 0x64) & 0x80;
1651                 handled = 1;
1652                 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_switch->id);
1653                 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_volume->id);
1654                 if (!split) {
1655                         snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1656                                        &chip->master_switch->id);
1657                         snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1658                                        &chip->master_volume->id);
1659                 }
1660                 /* ack interrupt */
1661                 snd_es1938_mixer_write(chip, 0x66, 0x00);
1662         }
1663
1664         /* MPU401 */
1665         if (status & 0x80) {
1666                 // the following line is evil! It switches off MIDI interrupt handling after the first interrupt received.
1667                 // replacing the last 0 by 0x40 works for ESS-Solo1, but just doing nothing works as well!
1668                 // andreas@flying-snail.de
1669                 // snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0); /* ack? */
1670                 if (chip->rmidi) {
1671                         handled = 1;
1672                         snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data);
1673                 }
1674         }
1675         return IRQ_RETVAL(handled);
1676 }
1677
1678 #define ES1938_DMA_SIZE 64
1679
1680 static int snd_es1938_mixer(struct es1938 *chip)
1681 {
1682         struct snd_card *card;
1683         unsigned int idx;
1684         int err;
1685
1686         card = chip->card;
1687
1688         strcpy(card->mixername, "ESS Solo-1");
1689
1690         for (idx = 0; idx < ARRAY_SIZE(snd_es1938_controls); idx++) {
1691                 struct snd_kcontrol *kctl;
1692                 kctl = snd_ctl_new1(&snd_es1938_controls[idx], chip);
1693                 switch (idx) {
1694                         case 0:
1695                                 chip->master_volume = kctl;
1696                                 kctl->private_free = snd_es1938_hwv_free;
1697                                 break;
1698                         case 1:
1699                                 chip->master_switch = kctl;
1700                                 kctl->private_free = snd_es1938_hwv_free;
1701                                 break;
1702                         case 2:
1703                                 chip->hw_volume = kctl;
1704                                 kctl->private_free = snd_es1938_hwv_free;
1705                                 break;
1706                         case 3:
1707                                 chip->hw_switch = kctl;
1708                                 kctl->private_free = snd_es1938_hwv_free;
1709                                 break;
1710                         }
1711                 err = snd_ctl_add(card, kctl);
1712                 if (err < 0)
1713                         return err;
1714         }
1715         return 0;
1716 }
1717        
1718
1719 static int __snd_es1938_probe(struct pci_dev *pci,
1720                               const struct pci_device_id *pci_id)
1721 {
1722         static int dev;
1723         struct snd_card *card;
1724         struct es1938 *chip;
1725         struct snd_opl3 *opl3;
1726         int idx, err;
1727
1728         if (dev >= SNDRV_CARDS)
1729                 return -ENODEV;
1730         if (!enable[dev]) {
1731                 dev++;
1732                 return -ENOENT;
1733         }
1734
1735         err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
1736                                 sizeof(*chip), &card);
1737         if (err < 0)
1738                 return err;
1739         chip = card->private_data;
1740
1741         for (idx = 0; idx < 5; idx++)
1742                 if (pci_resource_start(pci, idx) == 0 ||
1743                     !(pci_resource_flags(pci, idx) & IORESOURCE_IO))
1744                         return -ENODEV;
1745
1746         err = snd_es1938_create(card, pci);
1747         if (err < 0)
1748                 return err;
1749
1750         strcpy(card->driver, "ES1938");
1751         strcpy(card->shortname, "ESS ES1938 (Solo-1)");
1752         sprintf(card->longname, "%s rev %i, irq %i",
1753                 card->shortname,
1754                 chip->revision,
1755                 chip->irq);
1756
1757         err = snd_es1938_new_pcm(chip, 0);
1758         if (err < 0)
1759                 return err;
1760         err = snd_es1938_mixer(chip);
1761         if (err < 0)
1762                 return err;
1763         if (snd_opl3_create(card,
1764                             SLSB_REG(chip, FMLOWADDR),
1765                             SLSB_REG(chip, FMHIGHADDR),
1766                             OPL3_HW_OPL3, 1, &opl3) < 0) {
1767                 dev_err(card->dev, "OPL3 not detected at 0x%lx\n",
1768                            SLSB_REG(chip, FMLOWADDR));
1769         } else {
1770                 err = snd_opl3_timer_new(opl3, 0, 1);
1771                 if (err < 0)
1772                         return err;
1773                 err = snd_opl3_hwdep_new(opl3, 0, 1, NULL);
1774                 if (err < 0)
1775                         return err;
1776         }
1777         if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
1778                                 chip->mpu_port,
1779                                 MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK,
1780                                 -1, &chip->rmidi) < 0) {
1781                 dev_err(card->dev, "unable to initialize MPU-401\n");
1782         } else {
1783                 // this line is vital for MIDI interrupt handling on ess-solo1
1784                 // andreas@flying-snail.de
1785                 snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0x40);
1786         }
1787
1788         snd_es1938_create_gameport(chip);
1789
1790         err = snd_card_register(card);
1791         if (err < 0)
1792                 return err;
1793
1794         pci_set_drvdata(pci, card);
1795         dev++;
1796         return 0;
1797 }
1798
1799 static int snd_es1938_probe(struct pci_dev *pci,
1800                             const struct pci_device_id *pci_id)
1801 {
1802         return snd_card_free_on_error(&pci->dev, __snd_es1938_probe(pci, pci_id));
1803 }
1804
1805 static struct pci_driver es1938_driver = {
1806         .name = KBUILD_MODNAME,
1807         .id_table = snd_es1938_ids,
1808         .probe = snd_es1938_probe,
1809         .driver = {
1810                 .pm = ES1938_PM_OPS,
1811         },
1812 };
1813
1814 module_pci_driver(es1938_driver);