OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [sound/] [pci/] [es1938.c] - Blame information for rev 62

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.