Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/isa/msnd/msnd_pinnacle.c
26451 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*********************************************************************
3
*
4
* Linux multisound pinnacle/fiji driver for ALSA.
5
*
6
* 2002/06/30 Karsten Wiese:
7
* for now this is only used to build a pinnacle / fiji driver.
8
* the OSS parent of this code is designed to also support
9
* the multisound classic via the file msnd_classic.c.
10
* to make it easier for some brave heart to implemt classic
11
* support in alsa, i left all the MSND_CLASSIC tokens in this file.
12
* but for now this untested & undone.
13
*
14
* ripped from linux kernel 2.4.18 by Karsten Wiese.
15
*
16
* the following is a copy of the 2.4.18 OSS FREE file-heading comment:
17
*
18
* Turtle Beach MultiSound Sound Card Driver for Linux
19
* msnd_pinnacle.c / msnd_classic.c
20
*
21
* -- If MSND_CLASSIC is defined:
22
*
23
* -> driver for Turtle Beach Classic/Monterey/Tahiti
24
*
25
* -- Else
26
*
27
* -> driver for Turtle Beach Pinnacle/Fiji
28
*
29
* 12-3-2000 Modified IO port validation Steve Sycamore
30
*
31
* Copyright (C) 1998 Andrew Veliath
32
*
33
********************************************************************/
34
35
#include <linux/kernel.h>
36
#include <linux/module.h>
37
#include <linux/interrupt.h>
38
#include <linux/types.h>
39
#include <linux/delay.h>
40
#include <linux/ioport.h>
41
#include <linux/firmware.h>
42
#include <linux/isa.h>
43
#include <linux/isapnp.h>
44
#include <linux/irq.h>
45
#include <linux/io.h>
46
47
#include <sound/core.h>
48
#include <sound/initval.h>
49
#include <sound/asound.h>
50
#include <sound/pcm.h>
51
#include <sound/mpu401.h>
52
53
#ifdef MSND_CLASSIC
54
# ifndef __alpha__
55
# define SLOWIO
56
# endif
57
#endif
58
#include "msnd.h"
59
#ifdef MSND_CLASSIC
60
# include "msnd_classic.h"
61
# define LOGNAME "msnd_classic"
62
# define DEV_NAME "msnd-classic"
63
#else
64
# include "msnd_pinnacle.h"
65
# define LOGNAME "snd_msnd_pinnacle"
66
# define DEV_NAME "msnd-pinnacle"
67
#endif
68
69
static void set_default_audio_parameters(struct snd_msnd *chip)
70
{
71
chip->play_sample_size = snd_pcm_format_width(DEFSAMPLESIZE);
72
chip->play_sample_rate = DEFSAMPLERATE;
73
chip->play_channels = DEFCHANNELS;
74
chip->capture_sample_size = snd_pcm_format_width(DEFSAMPLESIZE);
75
chip->capture_sample_rate = DEFSAMPLERATE;
76
chip->capture_channels = DEFCHANNELS;
77
}
78
79
static void snd_msnd_eval_dsp_msg(struct snd_msnd *chip, u16 wMessage)
80
{
81
switch (HIBYTE(wMessage)) {
82
case HIMT_PLAY_DONE: {
83
if (chip->banksPlayed < 3)
84
dev_dbg(chip->card->dev, "%08X: HIMT_PLAY_DONE: %i\n",
85
(unsigned)jiffies, LOBYTE(wMessage));
86
87
if (chip->last_playbank == LOBYTE(wMessage)) {
88
dev_dbg(chip->card->dev,
89
"chip.last_playbank == LOBYTE(wMessage)\n");
90
break;
91
}
92
chip->banksPlayed++;
93
94
if (test_bit(F_WRITING, &chip->flags))
95
snd_msnd_DAPQ(chip, 0);
96
97
chip->last_playbank = LOBYTE(wMessage);
98
chip->playDMAPos += chip->play_period_bytes;
99
if (chip->playDMAPos > chip->playLimit)
100
chip->playDMAPos = 0;
101
snd_pcm_period_elapsed(chip->playback_substream);
102
103
break;
104
}
105
case HIMT_RECORD_DONE:
106
if (chip->last_recbank == LOBYTE(wMessage))
107
break;
108
chip->last_recbank = LOBYTE(wMessage);
109
chip->captureDMAPos += chip->capturePeriodBytes;
110
if (chip->captureDMAPos > (chip->captureLimit))
111
chip->captureDMAPos = 0;
112
113
if (test_bit(F_READING, &chip->flags))
114
snd_msnd_DARQ(chip, chip->last_recbank);
115
116
snd_pcm_period_elapsed(chip->capture_substream);
117
break;
118
119
case HIMT_DSP:
120
switch (LOBYTE(wMessage)) {
121
#ifndef MSND_CLASSIC
122
case HIDSP_PLAY_UNDER:
123
#endif
124
case HIDSP_INT_PLAY_UNDER:
125
dev_dbg(chip->card->dev,
126
LOGNAME ": Play underflow %i\n",
127
chip->banksPlayed);
128
if (chip->banksPlayed > 2)
129
clear_bit(F_WRITING, &chip->flags);
130
break;
131
132
case HIDSP_INT_RECORD_OVER:
133
dev_dbg(chip->card->dev, LOGNAME ": Record overflow\n");
134
clear_bit(F_READING, &chip->flags);
135
break;
136
137
default:
138
dev_dbg(chip->card->dev, LOGNAME
139
": DSP message %d 0x%02x\n",
140
LOBYTE(wMessage), LOBYTE(wMessage));
141
break;
142
}
143
break;
144
145
default:
146
dev_dbg(chip->card->dev, LOGNAME ": HIMT message %d 0x%02x\n",
147
HIBYTE(wMessage), HIBYTE(wMessage));
148
break;
149
}
150
}
151
152
static irqreturn_t snd_msnd_interrupt(int irq, void *dev_id)
153
{
154
struct snd_msnd *chip = dev_id;
155
void __iomem *pwDSPQData = chip->mappedbase + DSPQ_DATA_BUFF;
156
u16 head, tail, size;
157
158
/* Send ack to DSP */
159
/* inb(chip->io + HP_RXL); */
160
161
/* Evaluate queued DSP messages */
162
head = readw(chip->DSPQ + JQS_wHead);
163
tail = readw(chip->DSPQ + JQS_wTail);
164
size = readw(chip->DSPQ + JQS_wSize);
165
if (head > size || tail > size)
166
goto out;
167
while (head != tail) {
168
snd_msnd_eval_dsp_msg(chip, readw(pwDSPQData + 2 * head));
169
if (++head > size)
170
head = 0;
171
writew(head, chip->DSPQ + JQS_wHead);
172
}
173
out:
174
/* Send ack to DSP */
175
inb(chip->io + HP_RXL);
176
return IRQ_HANDLED;
177
}
178
179
180
static int snd_msnd_reset_dsp(struct snd_msnd *chip, unsigned char *info)
181
{
182
long io = chip->io;
183
int timeout = 100;
184
185
outb(HPDSPRESET_ON, io + HP_DSPR);
186
msleep(1);
187
#ifndef MSND_CLASSIC
188
if (info)
189
*info = inb(io + HP_INFO);
190
#endif
191
outb(HPDSPRESET_OFF, io + HP_DSPR);
192
msleep(1);
193
while (timeout-- > 0) {
194
if (inb(io + HP_CVR) == HP_CVR_DEF)
195
return 0;
196
msleep(1);
197
}
198
dev_err(chip->card->dev, LOGNAME ": Cannot reset DSP\n");
199
200
return -EIO;
201
}
202
203
static int snd_msnd_probe(struct snd_card *card)
204
{
205
struct snd_msnd *chip = card->private_data;
206
unsigned char info;
207
#ifndef MSND_CLASSIC
208
char *xv, *rev = NULL;
209
char *pin = "TB Pinnacle", *fiji = "TB Fiji";
210
char *pinfiji = "TB Pinnacle/Fiji";
211
#endif
212
213
if (!request_region(chip->io, DSP_NUMIO, "probing")) {
214
dev_err(card->dev, LOGNAME ": I/O port conflict\n");
215
return -ENODEV;
216
}
217
218
if (snd_msnd_reset_dsp(chip, &info) < 0) {
219
release_region(chip->io, DSP_NUMIO);
220
return -ENODEV;
221
}
222
223
#ifdef MSND_CLASSIC
224
strscpy(card->shortname, "Classic/Tahiti/Monterey");
225
strscpy(card->longname, "Turtle Beach Multisound");
226
dev_info(card->dev, LOGNAME ": %s, "
227
"I/O 0x%lx-0x%lx, IRQ %d, memory mapped to 0x%lX-0x%lX\n",
228
card->shortname,
229
chip->io, chip->io + DSP_NUMIO - 1,
230
chip->irq,
231
chip->base, chip->base + 0x7fff);
232
#else
233
switch (info >> 4) {
234
case 0xf:
235
xv = "<= 1.15";
236
break;
237
case 0x1:
238
xv = "1.18/1.2";
239
break;
240
case 0x2:
241
xv = "1.3";
242
break;
243
case 0x3:
244
xv = "1.4";
245
break;
246
default:
247
xv = "unknown";
248
break;
249
}
250
251
switch (info & 0x7) {
252
case 0x0:
253
rev = "I";
254
strscpy(card->shortname, pin);
255
break;
256
case 0x1:
257
rev = "F";
258
strscpy(card->shortname, pin);
259
break;
260
case 0x2:
261
rev = "G";
262
strscpy(card->shortname, pin);
263
break;
264
case 0x3:
265
rev = "H";
266
strscpy(card->shortname, pin);
267
break;
268
case 0x4:
269
rev = "E";
270
strscpy(card->shortname, fiji);
271
break;
272
case 0x5:
273
rev = "C";
274
strscpy(card->shortname, fiji);
275
break;
276
case 0x6:
277
rev = "D";
278
strscpy(card->shortname, fiji);
279
break;
280
case 0x7:
281
rev = "A-B (Fiji) or A-E (Pinnacle)";
282
strscpy(card->shortname, pinfiji);
283
break;
284
}
285
strscpy(card->longname, "Turtle Beach Multisound Pinnacle");
286
dev_info(card->dev, LOGNAME ": %s revision %s, Xilinx version %s, "
287
"I/O 0x%lx-0x%lx, IRQ %d, memory mapped to 0x%lX-0x%lX\n",
288
card->shortname,
289
rev, xv,
290
chip->io, chip->io + DSP_NUMIO - 1,
291
chip->irq,
292
chip->base, chip->base + 0x7fff);
293
#endif
294
295
release_region(chip->io, DSP_NUMIO);
296
return 0;
297
}
298
299
static int snd_msnd_init_sma(struct snd_msnd *chip)
300
{
301
static int initted;
302
u16 mastVolLeft, mastVolRight;
303
unsigned long flags;
304
305
#ifdef MSND_CLASSIC
306
outb(chip->memid, chip->io + HP_MEMM);
307
#endif
308
outb(HPBLKSEL_0, chip->io + HP_BLKS);
309
/* Motorola 56k shared memory base */
310
chip->SMA = chip->mappedbase + SMA_STRUCT_START;
311
312
if (initted) {
313
mastVolLeft = readw(chip->SMA + SMA_wCurrMastVolLeft);
314
mastVolRight = readw(chip->SMA + SMA_wCurrMastVolRight);
315
} else
316
mastVolLeft = mastVolRight = 0;
317
memset_io(chip->mappedbase, 0, 0x8000);
318
319
/* Critical section: bank 1 access */
320
spin_lock_irqsave(&chip->lock, flags);
321
outb(HPBLKSEL_1, chip->io + HP_BLKS);
322
memset_io(chip->mappedbase, 0, 0x8000);
323
outb(HPBLKSEL_0, chip->io + HP_BLKS);
324
spin_unlock_irqrestore(&chip->lock, flags);
325
326
/* Digital audio play queue */
327
chip->DAPQ = chip->mappedbase + DAPQ_OFFSET;
328
snd_msnd_init_queue(chip->DAPQ, DAPQ_DATA_BUFF, DAPQ_BUFF_SIZE);
329
330
/* Digital audio record queue */
331
chip->DARQ = chip->mappedbase + DARQ_OFFSET;
332
snd_msnd_init_queue(chip->DARQ, DARQ_DATA_BUFF, DARQ_BUFF_SIZE);
333
334
/* MIDI out queue */
335
chip->MODQ = chip->mappedbase + MODQ_OFFSET;
336
snd_msnd_init_queue(chip->MODQ, MODQ_DATA_BUFF, MODQ_BUFF_SIZE);
337
338
/* MIDI in queue */
339
chip->MIDQ = chip->mappedbase + MIDQ_OFFSET;
340
snd_msnd_init_queue(chip->MIDQ, MIDQ_DATA_BUFF, MIDQ_BUFF_SIZE);
341
342
/* DSP -> host message queue */
343
chip->DSPQ = chip->mappedbase + DSPQ_OFFSET;
344
snd_msnd_init_queue(chip->DSPQ, DSPQ_DATA_BUFF, DSPQ_BUFF_SIZE);
345
346
/* Setup some DSP values */
347
#ifndef MSND_CLASSIC
348
writew(1, chip->SMA + SMA_wCurrPlayFormat);
349
writew(chip->play_sample_size, chip->SMA + SMA_wCurrPlaySampleSize);
350
writew(chip->play_channels, chip->SMA + SMA_wCurrPlayChannels);
351
writew(chip->play_sample_rate, chip->SMA + SMA_wCurrPlaySampleRate);
352
#endif
353
writew(chip->play_sample_rate, chip->SMA + SMA_wCalFreqAtoD);
354
writew(mastVolLeft, chip->SMA + SMA_wCurrMastVolLeft);
355
writew(mastVolRight, chip->SMA + SMA_wCurrMastVolRight);
356
#ifndef MSND_CLASSIC
357
writel(0x00010000, chip->SMA + SMA_dwCurrPlayPitch);
358
writel(0x00000001, chip->SMA + SMA_dwCurrPlayRate);
359
#endif
360
writew(0x303, chip->SMA + SMA_wCurrInputTagBits);
361
362
initted = 1;
363
364
return 0;
365
}
366
367
368
static int upload_dsp_code(struct snd_card *card)
369
{
370
struct snd_msnd *chip = card->private_data;
371
const struct firmware *init_fw = NULL, *perm_fw = NULL;
372
int err;
373
374
outb(HPBLKSEL_0, chip->io + HP_BLKS);
375
376
err = request_firmware(&init_fw, INITCODEFILE, card->dev);
377
if (err < 0) {
378
dev_err(card->dev, LOGNAME ": Error loading " INITCODEFILE);
379
goto cleanup1;
380
}
381
err = request_firmware(&perm_fw, PERMCODEFILE, card->dev);
382
if (err < 0) {
383
dev_err(card->dev, LOGNAME ": Error loading " PERMCODEFILE);
384
goto cleanup;
385
}
386
387
memcpy_toio(chip->mappedbase, perm_fw->data, perm_fw->size);
388
if (snd_msnd_upload_host(chip, init_fw->data, init_fw->size) < 0) {
389
dev_warn(card->dev, LOGNAME ": Error uploading to DSP\n");
390
err = -ENODEV;
391
goto cleanup;
392
}
393
dev_info(card->dev, LOGNAME ": DSP firmware uploaded\n");
394
err = 0;
395
396
cleanup:
397
release_firmware(perm_fw);
398
cleanup1:
399
release_firmware(init_fw);
400
return err;
401
}
402
403
#ifdef MSND_CLASSIC
404
static void reset_proteus(struct snd_msnd *chip)
405
{
406
outb(HPPRORESET_ON, chip->io + HP_PROR);
407
msleep(TIME_PRO_RESET);
408
outb(HPPRORESET_OFF, chip->io + HP_PROR);
409
msleep(TIME_PRO_RESET_DONE);
410
}
411
#endif
412
413
static int snd_msnd_initialize(struct snd_card *card)
414
{
415
struct snd_msnd *chip = card->private_data;
416
int err, timeout;
417
418
#ifdef MSND_CLASSIC
419
outb(HPWAITSTATE_0, chip->io + HP_WAIT);
420
outb(HPBITMODE_16, chip->io + HP_BITM);
421
422
reset_proteus(chip);
423
#endif
424
err = snd_msnd_init_sma(chip);
425
if (err < 0) {
426
dev_warn(card->dev, LOGNAME ": Cannot initialize SMA\n");
427
return err;
428
}
429
430
err = snd_msnd_reset_dsp(chip, NULL);
431
if (err < 0)
432
return err;
433
434
err = upload_dsp_code(card);
435
if (err < 0) {
436
dev_warn(card->dev, LOGNAME ": Cannot upload DSP code\n");
437
return err;
438
}
439
440
timeout = 200;
441
442
while (readw(chip->mappedbase)) {
443
msleep(1);
444
if (!timeout--) {
445
dev_err(card->dev, LOGNAME ": DSP reset timeout\n");
446
return -EIO;
447
}
448
}
449
450
snd_msndmix_setup(chip);
451
return 0;
452
}
453
454
static int snd_msnd_dsp_full_reset(struct snd_card *card)
455
{
456
struct snd_msnd *chip = card->private_data;
457
int rv;
458
459
if (test_bit(F_RESETTING, &chip->flags) || ++chip->nresets > 10)
460
return 0;
461
462
set_bit(F_RESETTING, &chip->flags);
463
snd_msnd_dsp_halt(chip, NULL); /* Unconditionally halt */
464
465
rv = snd_msnd_initialize(card);
466
if (rv)
467
dev_warn(card->dev, LOGNAME ": DSP reset failed\n");
468
snd_msndmix_force_recsrc(chip, 0);
469
clear_bit(F_RESETTING, &chip->flags);
470
return rv;
471
}
472
473
474
static int snd_msnd_send_dsp_cmd_chk(struct snd_msnd *chip, u8 cmd)
475
{
476
if (snd_msnd_send_dsp_cmd(chip, cmd) == 0)
477
return 0;
478
snd_msnd_dsp_full_reset(chip->card);
479
return snd_msnd_send_dsp_cmd(chip, cmd);
480
}
481
482
static int snd_msnd_calibrate_adc(struct snd_msnd *chip, u16 srate)
483
{
484
dev_dbg(chip->card->dev, "snd_msnd_calibrate_adc(%i)\n", srate);
485
writew(srate, chip->SMA + SMA_wCalFreqAtoD);
486
if (chip->calibrate_signal == 0)
487
writew(readw(chip->SMA + SMA_wCurrHostStatusFlags)
488
| 0x0001, chip->SMA + SMA_wCurrHostStatusFlags);
489
else
490
writew(readw(chip->SMA + SMA_wCurrHostStatusFlags)
491
& ~0x0001, chip->SMA + SMA_wCurrHostStatusFlags);
492
if (snd_msnd_send_word(chip, 0, 0, HDEXAR_CAL_A_TO_D) == 0 &&
493
snd_msnd_send_dsp_cmd_chk(chip, HDEX_AUX_REQ) == 0) {
494
schedule_timeout_interruptible(msecs_to_jiffies(333));
495
return 0;
496
}
497
dev_warn(chip->card->dev, LOGNAME ": ADC calibration failed\n");
498
return -EIO;
499
}
500
501
/*
502
* ALSA callback function, called when attempting to open the MIDI device.
503
*/
504
static int snd_msnd_mpu401_open(struct snd_mpu401 *mpu)
505
{
506
snd_msnd_enable_irq(mpu->private_data);
507
snd_msnd_send_dsp_cmd(mpu->private_data, HDEX_MIDI_IN_START);
508
return 0;
509
}
510
511
static void snd_msnd_mpu401_close(struct snd_mpu401 *mpu)
512
{
513
snd_msnd_send_dsp_cmd(mpu->private_data, HDEX_MIDI_IN_STOP);
514
snd_msnd_disable_irq(mpu->private_data);
515
}
516
517
static long mpu_io[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
518
static int mpu_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
519
520
static int snd_msnd_attach(struct snd_card *card)
521
{
522
struct snd_msnd *chip = card->private_data;
523
int err;
524
525
err = devm_request_irq(card->dev, chip->irq, snd_msnd_interrupt, 0,
526
card->shortname, chip);
527
if (err < 0) {
528
dev_err(card->dev, LOGNAME ": Couldn't grab IRQ %d\n", chip->irq);
529
return err;
530
}
531
card->sync_irq = chip->irq;
532
if (!devm_request_region(card->dev, chip->io, DSP_NUMIO,
533
card->shortname))
534
return -EBUSY;
535
536
if (!devm_request_mem_region(card->dev, chip->base, BUFFSIZE,
537
card->shortname)) {
538
dev_err(card->dev, LOGNAME
539
": unable to grab memory region 0x%lx-0x%lx\n",
540
chip->base, chip->base + BUFFSIZE - 1);
541
return -EBUSY;
542
}
543
chip->mappedbase = devm_ioremap(card->dev, chip->base, 0x8000);
544
if (!chip->mappedbase) {
545
dev_err(card->dev, LOGNAME
546
": unable to map memory region 0x%lx-0x%lx\n",
547
chip->base, chip->base + BUFFSIZE - 1);
548
return -EIO;
549
}
550
551
err = snd_msnd_dsp_full_reset(card);
552
if (err < 0)
553
return err;
554
555
err = snd_msnd_pcm(card, 0);
556
if (err < 0) {
557
dev_err(card->dev, LOGNAME ": error creating new PCM device\n");
558
return err;
559
}
560
561
err = snd_msndmix_new(card);
562
if (err < 0) {
563
dev_err(card->dev, LOGNAME ": error creating new Mixer device\n");
564
return err;
565
}
566
567
568
if (mpu_io[0] != SNDRV_AUTO_PORT) {
569
struct snd_mpu401 *mpu;
570
571
err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
572
mpu_io[0],
573
MPU401_MODE_INPUT |
574
MPU401_MODE_OUTPUT,
575
mpu_irq[0],
576
&chip->rmidi);
577
if (err < 0) {
578
dev_err(card->dev, LOGNAME
579
": error creating new Midi device\n");
580
return err;
581
}
582
mpu = chip->rmidi->private_data;
583
584
mpu->open_input = snd_msnd_mpu401_open;
585
mpu->close_input = snd_msnd_mpu401_close;
586
mpu->private_data = chip;
587
}
588
589
disable_irq(chip->irq);
590
snd_msnd_calibrate_adc(chip, chip->play_sample_rate);
591
snd_msndmix_force_recsrc(chip, 0);
592
593
err = snd_card_register(card);
594
if (err < 0)
595
return err;
596
597
return 0;
598
}
599
600
601
#ifndef MSND_CLASSIC
602
603
/* Pinnacle/Fiji Logical Device Configuration */
604
605
static int snd_msnd_write_cfg(struct snd_msnd *chip, int cfg, int reg, int value)
606
{
607
outb(reg, cfg);
608
outb(value, cfg + 1);
609
if (value != inb(cfg + 1)) {
610
dev_err(chip->card->dev, LOGNAME ": %s: I/O error\n", __func__);
611
return -EIO;
612
}
613
return 0;
614
}
615
616
static int snd_msnd_write_cfg_io0(struct snd_msnd *chip, int cfg, int num, u16 io)
617
{
618
if (snd_msnd_write_cfg(chip, cfg, IREG_LOGDEVICE, num))
619
return -EIO;
620
if (snd_msnd_write_cfg(chip, cfg, IREG_IO0_BASEHI, HIBYTE(io)))
621
return -EIO;
622
if (snd_msnd_write_cfg(chip, cfg, IREG_IO0_BASELO, LOBYTE(io)))
623
return -EIO;
624
return 0;
625
}
626
627
static int snd_msnd_write_cfg_io1(struct snd_msnd *chip, int cfg, int num, u16 io)
628
{
629
if (snd_msnd_write_cfg(chip, cfg, IREG_LOGDEVICE, num))
630
return -EIO;
631
if (snd_msnd_write_cfg(chip, cfg, IREG_IO1_BASEHI, HIBYTE(io)))
632
return -EIO;
633
if (snd_msnd_write_cfg(chip, cfg, IREG_IO1_BASELO, LOBYTE(io)))
634
return -EIO;
635
return 0;
636
}
637
638
static int snd_msnd_write_cfg_irq(struct snd_msnd *chip, int cfg, int num, u16 irq)
639
{
640
if (snd_msnd_write_cfg(chip, cfg, IREG_LOGDEVICE, num))
641
return -EIO;
642
if (snd_msnd_write_cfg(chip, cfg, IREG_IRQ_NUMBER, LOBYTE(irq)))
643
return -EIO;
644
if (snd_msnd_write_cfg(chip, cfg, IREG_IRQ_TYPE, IRQTYPE_EDGE))
645
return -EIO;
646
return 0;
647
}
648
649
static int snd_msnd_write_cfg_mem(struct snd_msnd *chip, int cfg, int num, int mem)
650
{
651
u16 wmem;
652
653
mem >>= 8;
654
wmem = (u16)(mem & 0xfff);
655
if (snd_msnd_write_cfg(chip, cfg, IREG_LOGDEVICE, num))
656
return -EIO;
657
if (snd_msnd_write_cfg(chip, cfg, IREG_MEMBASEHI, HIBYTE(wmem)))
658
return -EIO;
659
if (snd_msnd_write_cfg(chip, cfg, IREG_MEMBASELO, LOBYTE(wmem)))
660
return -EIO;
661
if (wmem && snd_msnd_write_cfg(chip, cfg, IREG_MEMCONTROL,
662
MEMTYPE_HIADDR | MEMTYPE_16BIT))
663
return -EIO;
664
return 0;
665
}
666
667
static int snd_msnd_activate_logical(struct snd_msnd *chip, int cfg, int num)
668
{
669
if (snd_msnd_write_cfg(chip, cfg, IREG_LOGDEVICE, num))
670
return -EIO;
671
if (snd_msnd_write_cfg(chip, cfg, IREG_ACTIVATE, LD_ACTIVATE))
672
return -EIO;
673
return 0;
674
}
675
676
static int snd_msnd_write_cfg_logical(struct snd_msnd *chip,
677
int cfg, int num, u16 io0,
678
u16 io1, u16 irq, int mem)
679
{
680
if (snd_msnd_write_cfg(chip, cfg, IREG_LOGDEVICE, num))
681
return -EIO;
682
if (snd_msnd_write_cfg_io0(chip, cfg, num, io0))
683
return -EIO;
684
if (snd_msnd_write_cfg_io1(chip, cfg, num, io1))
685
return -EIO;
686
if (snd_msnd_write_cfg_irq(chip, cfg, num, irq))
687
return -EIO;
688
if (snd_msnd_write_cfg_mem(chip, cfg, num, mem))
689
return -EIO;
690
if (snd_msnd_activate_logical(chip, cfg, num))
691
return -EIO;
692
return 0;
693
}
694
695
static int snd_msnd_pinnacle_cfg_reset(struct snd_msnd *chip, int cfg)
696
{
697
int i;
698
699
/* Reset devices if told to */
700
dev_info(chip->card->dev, LOGNAME ": Resetting all devices\n");
701
for (i = 0; i < 4; ++i)
702
if (snd_msnd_write_cfg_logical(chip, cfg, i, 0, 0, 0, 0))
703
return -EIO;
704
705
return 0;
706
}
707
#endif
708
709
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
710
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
711
712
module_param_array(index, int, NULL, 0444);
713
MODULE_PARM_DESC(index, "Index value for msnd_pinnacle soundcard.");
714
module_param_array(id, charp, NULL, 0444);
715
MODULE_PARM_DESC(id, "ID string for msnd_pinnacle soundcard.");
716
717
static long io[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
718
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
719
static long mem[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
720
721
#ifndef MSND_CLASSIC
722
static long cfg[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
723
724
/* Extra Peripheral Configuration (Default: Disable) */
725
static long ide_io0[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
726
static long ide_io1[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
727
static int ide_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
728
729
static long joystick_io[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
730
/* If we have the digital daugherboard... */
731
static int digital[SNDRV_CARDS];
732
733
/* Extra Peripheral Configuration */
734
static int reset[SNDRV_CARDS];
735
#endif
736
737
static int write_ndelay[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 1 };
738
739
static int calibrate_signal;
740
741
#ifdef CONFIG_PNP
742
static bool isapnp[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
743
module_param_array(isapnp, bool, NULL, 0444);
744
MODULE_PARM_DESC(isapnp, "ISA PnP detection for specified soundcard.");
745
#define has_isapnp(x) isapnp[x]
746
#else
747
#define has_isapnp(x) 0
748
#endif
749
750
MODULE_AUTHOR("Karsten Wiese <[email protected]>");
751
MODULE_DESCRIPTION("Turtle Beach " LONGNAME " Linux Driver");
752
MODULE_LICENSE("GPL");
753
MODULE_FIRMWARE(INITCODEFILE);
754
MODULE_FIRMWARE(PERMCODEFILE);
755
756
module_param_hw_array(io, long, ioport, NULL, 0444);
757
MODULE_PARM_DESC(io, "IO port #");
758
module_param_hw_array(irq, int, irq, NULL, 0444);
759
module_param_hw_array(mem, long, iomem, NULL, 0444);
760
module_param_array(write_ndelay, int, NULL, 0444);
761
module_param(calibrate_signal, int, 0444);
762
#ifndef MSND_CLASSIC
763
module_param_array(digital, int, NULL, 0444);
764
module_param_hw_array(cfg, long, ioport, NULL, 0444);
765
module_param_array(reset, int, NULL, 0444);
766
module_param_hw_array(mpu_io, long, ioport, NULL, 0444);
767
module_param_hw_array(mpu_irq, int, irq, NULL, 0444);
768
module_param_hw_array(ide_io0, long, ioport, NULL, 0444);
769
module_param_hw_array(ide_io1, long, ioport, NULL, 0444);
770
module_param_hw_array(ide_irq, int, irq, NULL, 0444);
771
module_param_hw_array(joystick_io, long, ioport, NULL, 0444);
772
#endif
773
774
775
static int snd_msnd_isa_match(struct device *pdev, unsigned int i)
776
{
777
if (io[i] == SNDRV_AUTO_PORT)
778
return 0;
779
780
if (irq[i] == SNDRV_AUTO_PORT || mem[i] == SNDRV_AUTO_PORT) {
781
dev_warn(pdev, LOGNAME ": io, irq and mem must be set\n");
782
return 0;
783
}
784
785
#ifdef MSND_CLASSIC
786
if (!(io[i] == 0x290 ||
787
io[i] == 0x260 ||
788
io[i] == 0x250 ||
789
io[i] == 0x240 ||
790
io[i] == 0x230 ||
791
io[i] == 0x220 ||
792
io[i] == 0x210 ||
793
io[i] == 0x3e0)) {
794
dev_err(pdev, LOGNAME ": \"io\" - DSP I/O base must be set "
795
" to 0x210, 0x220, 0x230, 0x240, 0x250, 0x260, 0x290, "
796
"or 0x3E0\n");
797
return 0;
798
}
799
#else
800
if (io[i] < 0x100 || io[i] > 0x3e0 || (io[i] % 0x10) != 0) {
801
dev_err(pdev, LOGNAME
802
": \"io\" - DSP I/O base must within the range 0x100 "
803
"to 0x3E0 and must be evenly divisible by 0x10\n");
804
return 0;
805
}
806
#endif /* MSND_CLASSIC */
807
808
if (!(irq[i] == 5 ||
809
irq[i] == 7 ||
810
irq[i] == 9 ||
811
irq[i] == 10 ||
812
irq[i] == 11 ||
813
irq[i] == 12)) {
814
dev_err(pdev, LOGNAME
815
": \"irq\" - must be set to 5, 7, 9, 10, 11 or 12\n");
816
return 0;
817
}
818
819
if (!(mem[i] == 0xb0000 ||
820
mem[i] == 0xc8000 ||
821
mem[i] == 0xd0000 ||
822
mem[i] == 0xd8000 ||
823
mem[i] == 0xe0000 ||
824
mem[i] == 0xe8000)) {
825
dev_err(pdev, LOGNAME ": \"mem\" - must be set to "
826
"0xb0000, 0xc8000, 0xd0000, 0xd8000, 0xe0000 or "
827
"0xe8000\n");
828
return 0;
829
}
830
831
#ifndef MSND_CLASSIC
832
if (cfg[i] == SNDRV_AUTO_PORT) {
833
dev_info(pdev, LOGNAME ": Assuming PnP mode\n");
834
} else if (cfg[i] != 0x250 && cfg[i] != 0x260 && cfg[i] != 0x270) {
835
dev_info(pdev, LOGNAME
836
": Config port must be 0x250, 0x260 or 0x270 "
837
"(or unspecified for PnP mode)\n");
838
return 0;
839
}
840
#endif /* MSND_CLASSIC */
841
842
return 1;
843
}
844
845
static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx)
846
{
847
int err;
848
struct snd_card *card;
849
struct snd_msnd *chip;
850
851
if (has_isapnp(idx)
852
#ifndef MSND_CLASSIC
853
|| cfg[idx] == SNDRV_AUTO_PORT
854
#endif
855
) {
856
dev_info(pdev, LOGNAME ": Assuming PnP mode\n");
857
return -ENODEV;
858
}
859
860
err = snd_devm_card_new(pdev, index[idx], id[idx], THIS_MODULE,
861
sizeof(struct snd_msnd), &card);
862
if (err < 0)
863
return err;
864
865
chip = card->private_data;
866
chip->card = card;
867
868
#ifdef MSND_CLASSIC
869
switch (irq[idx]) {
870
case 5:
871
chip->irqid = HPIRQ_5; break;
872
case 7:
873
chip->irqid = HPIRQ_7; break;
874
case 9:
875
chip->irqid = HPIRQ_9; break;
876
case 10:
877
chip->irqid = HPIRQ_10; break;
878
case 11:
879
chip->irqid = HPIRQ_11; break;
880
case 12:
881
chip->irqid = HPIRQ_12; break;
882
}
883
884
switch (mem[idx]) {
885
case 0xb0000:
886
chip->memid = HPMEM_B000; break;
887
case 0xc8000:
888
chip->memid = HPMEM_C800; break;
889
case 0xd0000:
890
chip->memid = HPMEM_D000; break;
891
case 0xd8000:
892
chip->memid = HPMEM_D800; break;
893
case 0xe0000:
894
chip->memid = HPMEM_E000; break;
895
case 0xe8000:
896
chip->memid = HPMEM_E800; break;
897
}
898
#else
899
dev_info(pdev, LOGNAME ": Non-PnP mode: configuring at port 0x%lx\n",
900
cfg[idx]);
901
902
if (!devm_request_region(card->dev, cfg[idx], 2,
903
"Pinnacle/Fiji Config")) {
904
dev_err(pdev, LOGNAME ": Config port 0x%lx conflict\n",
905
cfg[idx]);
906
return -EIO;
907
}
908
if (reset[idx])
909
if (snd_msnd_pinnacle_cfg_reset(chip, cfg[idx]))
910
return -EIO;
911
912
/* DSP */
913
err = snd_msnd_write_cfg_logical(chip, cfg[idx], 0,
914
io[idx], 0,
915
irq[idx], mem[idx]);
916
917
if (err)
918
return err;
919
920
/* The following are Pinnacle specific */
921
922
/* MPU */
923
if (mpu_io[idx] != SNDRV_AUTO_PORT
924
&& mpu_irq[idx] != SNDRV_AUTO_IRQ) {
925
dev_info(pdev, LOGNAME
926
": Configuring MPU to I/O 0x%lx IRQ %d\n",
927
mpu_io[idx], mpu_irq[idx]);
928
err = snd_msnd_write_cfg_logical(chip, cfg[idx], 1,
929
mpu_io[idx], 0,
930
mpu_irq[idx], 0);
931
932
if (err)
933
return err;
934
}
935
936
/* IDE */
937
if (ide_io0[idx] != SNDRV_AUTO_PORT
938
&& ide_io1[idx] != SNDRV_AUTO_PORT
939
&& ide_irq[idx] != SNDRV_AUTO_IRQ) {
940
dev_info(pdev, LOGNAME
941
": Configuring IDE to I/O 0x%lx, 0x%lx IRQ %d\n",
942
ide_io0[idx], ide_io1[idx], ide_irq[idx]);
943
err = snd_msnd_write_cfg_logical(chip, cfg[idx], 2,
944
ide_io0[idx], ide_io1[idx],
945
ide_irq[idx], 0);
946
947
if (err)
948
return err;
949
}
950
951
/* Joystick */
952
if (joystick_io[idx] != SNDRV_AUTO_PORT) {
953
dev_info(pdev, LOGNAME
954
": Configuring joystick to I/O 0x%lx\n",
955
joystick_io[idx]);
956
err = snd_msnd_write_cfg_logical(chip, cfg[idx], 3,
957
joystick_io[idx], 0,
958
0, 0);
959
960
if (err)
961
return err;
962
}
963
964
#endif /* MSND_CLASSIC */
965
966
set_default_audio_parameters(chip);
967
#ifdef MSND_CLASSIC
968
chip->type = msndClassic;
969
#else
970
chip->type = msndPinnacle;
971
#endif
972
chip->io = io[idx];
973
chip->irq = irq[idx];
974
chip->base = mem[idx];
975
976
chip->calibrate_signal = calibrate_signal ? 1 : 0;
977
chip->recsrc = 0;
978
chip->dspq_data_buff = DSPQ_DATA_BUFF;
979
chip->dspq_buff_size = DSPQ_BUFF_SIZE;
980
if (write_ndelay[idx])
981
clear_bit(F_DISABLE_WRITE_NDELAY, &chip->flags);
982
else
983
set_bit(F_DISABLE_WRITE_NDELAY, &chip->flags);
984
#ifndef MSND_CLASSIC
985
if (digital[idx])
986
set_bit(F_HAVEDIGITAL, &chip->flags);
987
#endif
988
spin_lock_init(&chip->lock);
989
err = snd_msnd_probe(card);
990
if (err < 0) {
991
dev_err(pdev, LOGNAME ": Probe failed\n");
992
return err;
993
}
994
995
err = snd_msnd_attach(card);
996
if (err < 0) {
997
dev_err(pdev, LOGNAME ": Attach failed\n");
998
return err;
999
}
1000
dev_set_drvdata(pdev, card);
1001
1002
return 0;
1003
}
1004
1005
static struct isa_driver snd_msnd_driver = {
1006
.match = snd_msnd_isa_match,
1007
.probe = snd_msnd_isa_probe,
1008
/* FIXME: suspend, resume */
1009
.driver = {
1010
.name = DEV_NAME
1011
},
1012
};
1013
1014
#ifdef CONFIG_PNP
1015
static int snd_msnd_pnp_detect(struct pnp_card_link *pcard,
1016
const struct pnp_card_device_id *pid)
1017
{
1018
static int idx;
1019
struct pnp_dev *pnp_dev;
1020
struct pnp_dev *mpu_dev;
1021
struct snd_card *card;
1022
struct snd_msnd *chip;
1023
int ret;
1024
1025
for ( ; idx < SNDRV_CARDS; idx++) {
1026
if (has_isapnp(idx))
1027
break;
1028
}
1029
if (idx >= SNDRV_CARDS)
1030
return -ENODEV;
1031
1032
/*
1033
* Check that we still have room for another sound card ...
1034
*/
1035
pnp_dev = pnp_request_card_device(pcard, pid->devs[0].id, NULL);
1036
if (!pnp_dev)
1037
return -ENODEV;
1038
1039
mpu_dev = pnp_request_card_device(pcard, pid->devs[1].id, NULL);
1040
if (!mpu_dev)
1041
return -ENODEV;
1042
1043
if (!pnp_is_active(pnp_dev) && pnp_activate_dev(pnp_dev) < 0) {
1044
dev_info(&pcard->card->dev, "msnd_pinnacle: device is inactive\n");
1045
return -EBUSY;
1046
}
1047
1048
if (!pnp_is_active(mpu_dev) && pnp_activate_dev(mpu_dev) < 0) {
1049
dev_info(&pcard->card->dev, "msnd_pinnacle: MPU device is inactive\n");
1050
return -EBUSY;
1051
}
1052
1053
/*
1054
* Create a new ALSA sound card entry, in anticipation
1055
* of detecting our hardware ...
1056
*/
1057
ret = snd_devm_card_new(&pcard->card->dev,
1058
index[idx], id[idx], THIS_MODULE,
1059
sizeof(struct snd_msnd), &card);
1060
if (ret < 0)
1061
return ret;
1062
1063
chip = card->private_data;
1064
chip->card = card;
1065
1066
/*
1067
* Read the correct parameters off the ISA PnP bus ...
1068
*/
1069
io[idx] = pnp_port_start(pnp_dev, 0);
1070
irq[idx] = pnp_irq(pnp_dev, 0);
1071
mem[idx] = pnp_mem_start(pnp_dev, 0);
1072
mpu_io[idx] = pnp_port_start(mpu_dev, 0);
1073
mpu_irq[idx] = pnp_irq(mpu_dev, 0);
1074
1075
set_default_audio_parameters(chip);
1076
#ifdef MSND_CLASSIC
1077
chip->type = msndClassic;
1078
#else
1079
chip->type = msndPinnacle;
1080
#endif
1081
chip->io = io[idx];
1082
chip->irq = irq[idx];
1083
chip->base = mem[idx];
1084
1085
chip->calibrate_signal = calibrate_signal ? 1 : 0;
1086
chip->recsrc = 0;
1087
chip->dspq_data_buff = DSPQ_DATA_BUFF;
1088
chip->dspq_buff_size = DSPQ_BUFF_SIZE;
1089
if (write_ndelay[idx])
1090
clear_bit(F_DISABLE_WRITE_NDELAY, &chip->flags);
1091
else
1092
set_bit(F_DISABLE_WRITE_NDELAY, &chip->flags);
1093
#ifndef MSND_CLASSIC
1094
if (digital[idx])
1095
set_bit(F_HAVEDIGITAL, &chip->flags);
1096
#endif
1097
spin_lock_init(&chip->lock);
1098
ret = snd_msnd_probe(card);
1099
if (ret < 0) {
1100
dev_err(&pcard->card->dev, LOGNAME ": Probe failed\n");
1101
return ret;
1102
}
1103
1104
ret = snd_msnd_attach(card);
1105
if (ret < 0) {
1106
dev_err(&pcard->card->dev, LOGNAME ": Attach failed\n");
1107
return ret;
1108
}
1109
1110
pnp_set_card_drvdata(pcard, card);
1111
++idx;
1112
return 0;
1113
}
1114
1115
static int isa_registered;
1116
static int pnp_registered;
1117
1118
static const struct pnp_card_device_id msnd_pnpids[] = {
1119
/* Pinnacle PnP */
1120
{ .id = "BVJ0440", .devs = { { "TBS0000" }, { "TBS0001" } } },
1121
{ .id = "" } /* end */
1122
};
1123
1124
MODULE_DEVICE_TABLE(pnp_card, msnd_pnpids);
1125
1126
static struct pnp_card_driver msnd_pnpc_driver = {
1127
.flags = PNP_DRIVER_RES_DO_NOT_CHANGE,
1128
.name = "msnd_pinnacle",
1129
.id_table = msnd_pnpids,
1130
.probe = snd_msnd_pnp_detect,
1131
};
1132
#endif /* CONFIG_PNP */
1133
1134
static int __init snd_msnd_init(void)
1135
{
1136
int err;
1137
1138
err = isa_register_driver(&snd_msnd_driver, SNDRV_CARDS);
1139
#ifdef CONFIG_PNP
1140
if (!err)
1141
isa_registered = 1;
1142
1143
err = pnp_register_card_driver(&msnd_pnpc_driver);
1144
if (!err)
1145
pnp_registered = 1;
1146
1147
if (isa_registered)
1148
err = 0;
1149
#endif
1150
return err;
1151
}
1152
1153
static void __exit snd_msnd_exit(void)
1154
{
1155
#ifdef CONFIG_PNP
1156
if (pnp_registered)
1157
pnp_unregister_card_driver(&msnd_pnpc_driver);
1158
if (isa_registered)
1159
#endif
1160
isa_unregister_driver(&snd_msnd_driver);
1161
}
1162
1163
module_init(snd_msnd_init);
1164
module_exit(snd_msnd_exit);
1165
1166
1167