Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/isa/sscape.c
26378 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
* Low-level ALSA driver for the ENSONIQ SoundScape
4
* Copyright (c) by Chris Rankin
5
*
6
* This driver was written in part using information obtained from
7
* the OSS/Free SoundScape driver, written by Hannu Savolainen.
8
*/
9
10
#include <linux/init.h>
11
#include <linux/err.h>
12
#include <linux/io.h>
13
#include <linux/isa.h>
14
#include <linux/delay.h>
15
#include <linux/firmware.h>
16
#include <linux/pnp.h>
17
#include <linux/spinlock.h>
18
#include <linux/module.h>
19
#include <asm/dma.h>
20
#include <sound/core.h>
21
#include <sound/wss.h>
22
#include <sound/mpu401.h>
23
#include <sound/initval.h>
24
25
26
MODULE_AUTHOR("Chris Rankin");
27
MODULE_DESCRIPTION("ENSONIQ SoundScape driver");
28
MODULE_LICENSE("GPL");
29
MODULE_FIRMWARE("sndscape.co0");
30
MODULE_FIRMWARE("sndscape.co1");
31
MODULE_FIRMWARE("sndscape.co2");
32
MODULE_FIRMWARE("sndscape.co3");
33
MODULE_FIRMWARE("sndscape.co4");
34
MODULE_FIRMWARE("scope.cod");
35
36
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
37
static char* id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
38
static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
39
static long wss_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
40
static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
41
static int mpu_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
42
static int dma[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
43
static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
44
static bool joystick[SNDRV_CARDS];
45
46
module_param_array(index, int, NULL, 0444);
47
MODULE_PARM_DESC(index, "Index number for SoundScape soundcard");
48
49
module_param_array(id, charp, NULL, 0444);
50
MODULE_PARM_DESC(id, "Description for SoundScape card");
51
52
module_param_hw_array(port, long, ioport, NULL, 0444);
53
MODULE_PARM_DESC(port, "Port # for SoundScape driver.");
54
55
module_param_hw_array(wss_port, long, ioport, NULL, 0444);
56
MODULE_PARM_DESC(wss_port, "WSS Port # for SoundScape driver.");
57
58
module_param_hw_array(irq, int, irq, NULL, 0444);
59
MODULE_PARM_DESC(irq, "IRQ # for SoundScape driver.");
60
61
module_param_hw_array(mpu_irq, int, irq, NULL, 0444);
62
MODULE_PARM_DESC(mpu_irq, "MPU401 IRQ # for SoundScape driver.");
63
64
module_param_hw_array(dma, int, dma, NULL, 0444);
65
MODULE_PARM_DESC(dma, "DMA # for SoundScape driver.");
66
67
module_param_hw_array(dma2, int, dma, NULL, 0444);
68
MODULE_PARM_DESC(dma2, "DMA2 # for SoundScape driver.");
69
70
module_param_array(joystick, bool, NULL, 0444);
71
MODULE_PARM_DESC(joystick, "Enable gameport.");
72
73
#ifdef CONFIG_PNP
74
static int isa_registered;
75
static int pnp_registered;
76
77
static const struct pnp_card_device_id sscape_pnpids[] = {
78
{ .id = "ENS3081", .devs = { { "ENS0000" } } }, /* Soundscape PnP */
79
{ .id = "ENS4081", .devs = { { "ENS1011" } } }, /* VIVO90 */
80
{ .id = "" } /* end */
81
};
82
83
MODULE_DEVICE_TABLE(pnp_card, sscape_pnpids);
84
#endif
85
86
87
#define HOST_CTRL_IO(i) ((i) + 2)
88
#define HOST_DATA_IO(i) ((i) + 3)
89
#define ODIE_ADDR_IO(i) ((i) + 4)
90
#define ODIE_DATA_IO(i) ((i) + 5)
91
#define CODEC_IO(i) ((i) + 8)
92
93
#define IC_ODIE 1
94
#define IC_OPUS 2
95
96
#define RX_READY 0x01
97
#define TX_READY 0x02
98
99
#define CMD_ACK 0x80
100
#define CMD_SET_MIDI_VOL 0x84
101
#define CMD_GET_MIDI_VOL 0x85
102
#define CMD_XXX_MIDI_VOL 0x86
103
#define CMD_SET_EXTMIDI 0x8a
104
#define CMD_GET_EXTMIDI 0x8b
105
#define CMD_SET_MT32 0x8c
106
#define CMD_GET_MT32 0x8d
107
108
enum GA_REG {
109
GA_INTSTAT_REG = 0,
110
GA_INTENA_REG,
111
GA_DMAA_REG,
112
GA_DMAB_REG,
113
GA_INTCFG_REG,
114
GA_DMACFG_REG,
115
GA_CDCFG_REG,
116
GA_SMCFGA_REG,
117
GA_SMCFGB_REG,
118
GA_HMCTL_REG
119
};
120
121
#define DMA_8BIT 0x80
122
123
124
enum card_type {
125
MEDIA_FX, /* Sequoia S-1000 */
126
SSCAPE, /* Sequoia S-2000 */
127
SSCAPE_PNP,
128
SSCAPE_VIVO,
129
};
130
131
struct soundscape {
132
spinlock_t lock;
133
unsigned io_base;
134
int ic_type;
135
enum card_type type;
136
struct resource *io_res;
137
struct resource *wss_res;
138
struct snd_wss *chip;
139
140
unsigned char midi_vol;
141
struct device *dev;
142
};
143
144
#define INVALID_IRQ ((unsigned)-1)
145
146
147
static inline struct soundscape *get_card_soundscape(struct snd_card *c)
148
{
149
return (struct soundscape *) (c->private_data);
150
}
151
152
/*
153
* Allocates some kernel memory that we can use for DMA.
154
* I think this means that the memory has to map to
155
* contiguous pages of physical memory.
156
*/
157
static struct snd_dma_buffer *get_dmabuf(struct soundscape *s,
158
struct snd_dma_buffer *buf,
159
unsigned long size)
160
{
161
if (buf) {
162
if (snd_dma_alloc_pages_fallback(SNDRV_DMA_TYPE_DEV,
163
s->chip->card->dev,
164
size, buf) < 0) {
165
dev_err(s->dev,
166
"sscape: Failed to allocate %lu bytes for DMA\n",
167
size);
168
return NULL;
169
}
170
}
171
172
return buf;
173
}
174
175
/*
176
* Release the DMA-able kernel memory ...
177
*/
178
static void free_dmabuf(struct snd_dma_buffer *buf)
179
{
180
if (buf && buf->area)
181
snd_dma_free_pages(buf);
182
}
183
184
/*
185
* This function writes to the SoundScape's control registers,
186
* but doesn't do any locking. It's up to the caller to do that.
187
* This is why this function is "unsafe" ...
188
*/
189
static inline void sscape_write_unsafe(unsigned io_base, enum GA_REG reg,
190
unsigned char val)
191
{
192
outb(reg, ODIE_ADDR_IO(io_base));
193
outb(val, ODIE_DATA_IO(io_base));
194
}
195
196
/*
197
* Write to the SoundScape's control registers, and do the
198
* necessary locking ...
199
*/
200
static void sscape_write(struct soundscape *s, enum GA_REG reg,
201
unsigned char val)
202
{
203
unsigned long flags;
204
205
spin_lock_irqsave(&s->lock, flags);
206
sscape_write_unsafe(s->io_base, reg, val);
207
spin_unlock_irqrestore(&s->lock, flags);
208
}
209
210
/*
211
* Read from the SoundScape's control registers, but leave any
212
* locking to the caller. This is why the function is "unsafe" ...
213
*/
214
static inline unsigned char sscape_read_unsafe(unsigned io_base,
215
enum GA_REG reg)
216
{
217
outb(reg, ODIE_ADDR_IO(io_base));
218
return inb(ODIE_DATA_IO(io_base));
219
}
220
221
/*
222
* Puts the SoundScape into "host" mode, as compared to "MIDI" mode
223
*/
224
static inline void set_host_mode_unsafe(unsigned io_base)
225
{
226
outb(0x0, HOST_CTRL_IO(io_base));
227
}
228
229
/*
230
* Puts the SoundScape into "MIDI" mode, as compared to "host" mode
231
*/
232
static inline void set_midi_mode_unsafe(unsigned io_base)
233
{
234
outb(0x3, HOST_CTRL_IO(io_base));
235
}
236
237
/*
238
* Read the SoundScape's host-mode control register, but leave
239
* any locking issues to the caller ...
240
*/
241
static inline int host_read_unsafe(unsigned io_base)
242
{
243
int data = -1;
244
if ((inb(HOST_CTRL_IO(io_base)) & RX_READY) != 0)
245
data = inb(HOST_DATA_IO(io_base));
246
247
return data;
248
}
249
250
/*
251
* Read the SoundScape's host-mode control register, performing
252
* a limited amount of busy-waiting if the register isn't ready.
253
* Also leaves all locking-issues to the caller ...
254
*/
255
static int host_read_ctrl_unsafe(unsigned io_base, unsigned timeout)
256
{
257
int data;
258
259
while (((data = host_read_unsafe(io_base)) < 0) && (timeout != 0)) {
260
udelay(100);
261
--timeout;
262
} /* while */
263
264
return data;
265
}
266
267
/*
268
* Write to the SoundScape's host-mode control registers, but
269
* leave any locking issues to the caller ...
270
*/
271
static inline int host_write_unsafe(unsigned io_base, unsigned char data)
272
{
273
if ((inb(HOST_CTRL_IO(io_base)) & TX_READY) != 0) {
274
outb(data, HOST_DATA_IO(io_base));
275
return 1;
276
}
277
278
return 0;
279
}
280
281
/*
282
* Write to the SoundScape's host-mode control registers, performing
283
* a limited amount of busy-waiting if the register isn't ready.
284
* Also leaves all locking-issues to the caller ...
285
*/
286
static int host_write_ctrl_unsafe(unsigned io_base, unsigned char data,
287
unsigned timeout)
288
{
289
int err;
290
291
while (!(err = host_write_unsafe(io_base, data)) && (timeout != 0)) {
292
udelay(100);
293
--timeout;
294
} /* while */
295
296
return err;
297
}
298
299
300
/*
301
* Check that the MIDI subsystem is operational. If it isn't,
302
* then we will hang the computer if we try to use it ...
303
*
304
* NOTE: This check is based upon observation, not documentation.
305
*/
306
static inline int verify_mpu401(const struct snd_mpu401 *mpu)
307
{
308
return ((inb(MPU401C(mpu)) & 0xc0) == 0x80);
309
}
310
311
/*
312
* This is apparently the standard way to initialise an MPU-401
313
*/
314
static inline void initialise_mpu401(const struct snd_mpu401 *mpu)
315
{
316
outb(0, MPU401D(mpu));
317
}
318
319
/*
320
* Tell the SoundScape to activate the AD1845 chip (I think).
321
* The AD1845 detection fails if we *don't* do this, so I
322
* think that this is a good idea ...
323
*/
324
static void activate_ad1845_unsafe(unsigned io_base)
325
{
326
unsigned char val = sscape_read_unsafe(io_base, GA_HMCTL_REG);
327
sscape_write_unsafe(io_base, GA_HMCTL_REG, (val & 0xcf) | 0x10);
328
sscape_write_unsafe(io_base, GA_CDCFG_REG, 0x80);
329
}
330
331
/*
332
* Tell the SoundScape to begin a DMA transfer using the given channel.
333
* All locking issues are left to the caller.
334
*/
335
static void sscape_start_dma_unsafe(unsigned io_base, enum GA_REG reg)
336
{
337
sscape_write_unsafe(io_base, reg,
338
sscape_read_unsafe(io_base, reg) | 0x01);
339
sscape_write_unsafe(io_base, reg,
340
sscape_read_unsafe(io_base, reg) & 0xfe);
341
}
342
343
/*
344
* Wait for a DMA transfer to complete. This is a "limited busy-wait",
345
* and all locking issues are left to the caller.
346
*/
347
static int sscape_wait_dma_unsafe(unsigned io_base, enum GA_REG reg,
348
unsigned timeout)
349
{
350
while (!(sscape_read_unsafe(io_base, reg) & 0x01) && (timeout != 0)) {
351
udelay(100);
352
--timeout;
353
} /* while */
354
355
return sscape_read_unsafe(io_base, reg) & 0x01;
356
}
357
358
/*
359
* Wait for the On-Board Processor to return its start-up
360
* acknowledgement sequence. This wait is too long for
361
* us to perform "busy-waiting", and so we must sleep.
362
* This in turn means that we must not be holding any
363
* spinlocks when we call this function.
364
*/
365
static int obp_startup_ack(struct soundscape *s, unsigned timeout)
366
{
367
unsigned long end_time = jiffies + msecs_to_jiffies(timeout);
368
369
do {
370
unsigned long flags;
371
int x;
372
373
spin_lock_irqsave(&s->lock, flags);
374
x = host_read_unsafe(s->io_base);
375
spin_unlock_irqrestore(&s->lock, flags);
376
if (x == 0xfe || x == 0xff)
377
return 1;
378
379
msleep(10);
380
} while (time_before(jiffies, end_time));
381
382
return 0;
383
}
384
385
/*
386
* Wait for the host to return its start-up acknowledgement
387
* sequence. This wait is too long for us to perform
388
* "busy-waiting", and so we must sleep. This in turn means
389
* that we must not be holding any spinlocks when we call
390
* this function.
391
*/
392
static int host_startup_ack(struct soundscape *s, unsigned timeout)
393
{
394
unsigned long end_time = jiffies + msecs_to_jiffies(timeout);
395
396
do {
397
unsigned long flags;
398
int x;
399
400
spin_lock_irqsave(&s->lock, flags);
401
x = host_read_unsafe(s->io_base);
402
spin_unlock_irqrestore(&s->lock, flags);
403
if (x == 0xfe)
404
return 1;
405
406
msleep(10);
407
} while (time_before(jiffies, end_time));
408
409
return 0;
410
}
411
412
/*
413
* Upload a byte-stream into the SoundScape using DMA channel A.
414
*/
415
static int upload_dma_data(struct soundscape *s, const unsigned char *data,
416
size_t size)
417
{
418
unsigned long flags;
419
struct snd_dma_buffer dma;
420
int ret;
421
unsigned char val;
422
423
if (!get_dmabuf(s, &dma, PAGE_ALIGN(32 * 1024)))
424
return -ENOMEM;
425
426
spin_lock_irqsave(&s->lock, flags);
427
428
/*
429
* Reset the board ...
430
*/
431
val = sscape_read_unsafe(s->io_base, GA_HMCTL_REG);
432
sscape_write_unsafe(s->io_base, GA_HMCTL_REG, val & 0x3f);
433
434
/*
435
* Enable the DMA channels and configure them ...
436
*/
437
val = (s->chip->dma1 << 4) | DMA_8BIT;
438
sscape_write_unsafe(s->io_base, GA_DMAA_REG, val);
439
sscape_write_unsafe(s->io_base, GA_DMAB_REG, 0x20);
440
441
/*
442
* Take the board out of reset ...
443
*/
444
val = sscape_read_unsafe(s->io_base, GA_HMCTL_REG);
445
sscape_write_unsafe(s->io_base, GA_HMCTL_REG, val | 0x80);
446
447
/*
448
* Upload the firmware to the SoundScape
449
* board through the DMA channel ...
450
*/
451
while (size != 0) {
452
unsigned long len;
453
454
len = min(size, dma.bytes);
455
memcpy(dma.area, data, len);
456
data += len;
457
size -= len;
458
459
snd_dma_program(s->chip->dma1, dma.addr, len, DMA_MODE_WRITE);
460
sscape_start_dma_unsafe(s->io_base, GA_DMAA_REG);
461
if (!sscape_wait_dma_unsafe(s->io_base, GA_DMAA_REG, 5000)) {
462
/*
463
* Don't forget to release this spinlock we're holding
464
*/
465
spin_unlock_irqrestore(&s->lock, flags);
466
467
dev_err(s->dev, "sscape: DMA upload has timed out\n");
468
ret = -EAGAIN;
469
goto _release_dma;
470
}
471
} /* while */
472
473
set_host_mode_unsafe(s->io_base);
474
outb(0x0, s->io_base);
475
476
/*
477
* Boot the board ... (I think)
478
*/
479
val = sscape_read_unsafe(s->io_base, GA_HMCTL_REG);
480
sscape_write_unsafe(s->io_base, GA_HMCTL_REG, val | 0x40);
481
spin_unlock_irqrestore(&s->lock, flags);
482
483
/*
484
* If all has gone well, then the board should acknowledge
485
* the new upload and tell us that it has rebooted OK. We
486
* give it 5 seconds (max) ...
487
*/
488
ret = 0;
489
if (!obp_startup_ack(s, 5000)) {
490
dev_err(s->dev,
491
"sscape: No response from on-board processor after upload\n");
492
ret = -EAGAIN;
493
} else if (!host_startup_ack(s, 5000)) {
494
dev_err(s->dev, "sscape: SoundScape failed to initialise\n");
495
ret = -EAGAIN;
496
}
497
498
_release_dma:
499
/*
500
* NOTE!!! We are NOT holding any spinlocks at this point !!!
501
*/
502
sscape_write(s, GA_DMAA_REG, (s->ic_type == IC_OPUS ? 0x40 : 0x70));
503
free_dmabuf(&dma);
504
505
return ret;
506
}
507
508
/*
509
* Upload the bootblock(?) into the SoundScape. The only
510
* purpose of this block of code seems to be to tell
511
* us which version of the microcode we should be using.
512
*/
513
static int sscape_upload_bootblock(struct snd_card *card)
514
{
515
struct soundscape *sscape = get_card_soundscape(card);
516
unsigned long flags;
517
const struct firmware *init_fw = NULL;
518
int data = 0;
519
int ret;
520
521
ret = request_firmware(&init_fw, "scope.cod", card->dev);
522
if (ret < 0) {
523
dev_err(card->dev, "sscape: Error loading scope.cod");
524
return ret;
525
}
526
ret = upload_dma_data(sscape, init_fw->data, init_fw->size);
527
528
release_firmware(init_fw);
529
530
spin_lock_irqsave(&sscape->lock, flags);
531
if (ret == 0)
532
data = host_read_ctrl_unsafe(sscape->io_base, 100);
533
534
if (data & 0x10)
535
sscape_write_unsafe(sscape->io_base, GA_SMCFGA_REG, 0x2f);
536
537
spin_unlock_irqrestore(&sscape->lock, flags);
538
539
data &= 0xf;
540
if (ret == 0 && data > 7) {
541
dev_err(card->dev,
542
"sscape: timeout reading firmware version\n");
543
ret = -EAGAIN;
544
}
545
546
return (ret == 0) ? data : ret;
547
}
548
549
/*
550
* Upload the microcode into the SoundScape.
551
*/
552
static int sscape_upload_microcode(struct snd_card *card, int version)
553
{
554
struct soundscape *sscape = get_card_soundscape(card);
555
const struct firmware *init_fw = NULL;
556
char name[14];
557
int err;
558
559
scnprintf(name, sizeof(name), "sndscape.co%d", version);
560
561
err = request_firmware(&init_fw, name, card->dev);
562
if (err < 0) {
563
dev_err(card->dev, "sscape: Error loading sndscape.co%d",
564
version);
565
return err;
566
}
567
err = upload_dma_data(sscape, init_fw->data, init_fw->size);
568
if (err == 0)
569
dev_info(card->dev, "sscape: MIDI firmware loaded %zu KBs\n",
570
init_fw->size >> 10);
571
572
release_firmware(init_fw);
573
574
return err;
575
}
576
577
/*
578
* Mixer control for the SoundScape's MIDI device.
579
*/
580
static int sscape_midi_info(struct snd_kcontrol *ctl,
581
struct snd_ctl_elem_info *uinfo)
582
{
583
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
584
uinfo->count = 1;
585
uinfo->value.integer.min = 0;
586
uinfo->value.integer.max = 127;
587
return 0;
588
}
589
590
static int sscape_midi_get(struct snd_kcontrol *kctl,
591
struct snd_ctl_elem_value *uctl)
592
{
593
struct snd_wss *chip = snd_kcontrol_chip(kctl);
594
struct snd_card *card = chip->card;
595
register struct soundscape *s = get_card_soundscape(card);
596
unsigned long flags;
597
598
spin_lock_irqsave(&s->lock, flags);
599
uctl->value.integer.value[0] = s->midi_vol;
600
spin_unlock_irqrestore(&s->lock, flags);
601
return 0;
602
}
603
604
static int sscape_midi_put(struct snd_kcontrol *kctl,
605
struct snd_ctl_elem_value *uctl)
606
{
607
struct snd_wss *chip = snd_kcontrol_chip(kctl);
608
struct snd_card *card = chip->card;
609
struct soundscape *s = get_card_soundscape(card);
610
unsigned long flags;
611
int change;
612
unsigned char new_val;
613
614
spin_lock_irqsave(&s->lock, flags);
615
616
new_val = uctl->value.integer.value[0] & 127;
617
/*
618
* We need to put the board into HOST mode before we
619
* can send any volume-changing HOST commands ...
620
*/
621
set_host_mode_unsafe(s->io_base);
622
623
/*
624
* To successfully change the MIDI volume setting, you seem to
625
* have to write a volume command, write the new volume value,
626
* and then perform another volume-related command. Perhaps the
627
* first command is an "open" and the second command is a "close"?
628
*/
629
if (s->midi_vol == new_val) {
630
change = 0;
631
goto __skip_change;
632
}
633
change = host_write_ctrl_unsafe(s->io_base, CMD_SET_MIDI_VOL, 100)
634
&& host_write_ctrl_unsafe(s->io_base, new_val, 100)
635
&& host_write_ctrl_unsafe(s->io_base, CMD_XXX_MIDI_VOL, 100)
636
&& host_write_ctrl_unsafe(s->io_base, new_val, 100);
637
s->midi_vol = new_val;
638
__skip_change:
639
640
/*
641
* Take the board out of HOST mode and back into MIDI mode ...
642
*/
643
set_midi_mode_unsafe(s->io_base);
644
645
spin_unlock_irqrestore(&s->lock, flags);
646
return change;
647
}
648
649
static const struct snd_kcontrol_new midi_mixer_ctl = {
650
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
651
.name = "MIDI",
652
.info = sscape_midi_info,
653
.get = sscape_midi_get,
654
.put = sscape_midi_put
655
};
656
657
/*
658
* The SoundScape can use two IRQs from a possible set of four.
659
* These IRQs are encoded as bit patterns so that they can be
660
* written to the control registers.
661
*/
662
static unsigned get_irq_config(int sscape_type, int irq)
663
{
664
static const int valid_irq[] = { 9, 5, 7, 10 };
665
static const int old_irq[] = { 9, 7, 5, 15 };
666
unsigned cfg;
667
668
if (sscape_type == MEDIA_FX) {
669
for (cfg = 0; cfg < ARRAY_SIZE(old_irq); ++cfg)
670
if (irq == old_irq[cfg])
671
return cfg;
672
} else {
673
for (cfg = 0; cfg < ARRAY_SIZE(valid_irq); ++cfg)
674
if (irq == valid_irq[cfg])
675
return cfg;
676
}
677
678
return INVALID_IRQ;
679
}
680
681
/*
682
* Perform certain arcane port-checks to see whether there
683
* is a SoundScape board lurking behind the given ports.
684
*/
685
static int detect_sscape(struct soundscape *s, long wss_io)
686
{
687
unsigned long flags;
688
unsigned d;
689
int retval = 0;
690
691
spin_lock_irqsave(&s->lock, flags);
692
693
/*
694
* The following code is lifted from the original OSS driver,
695
* and as I don't have a datasheet I cannot really comment
696
* on what it is doing...
697
*/
698
if ((inb(HOST_CTRL_IO(s->io_base)) & 0x78) != 0)
699
goto _done;
700
701
d = inb(ODIE_ADDR_IO(s->io_base)) & 0xf0;
702
if ((d & 0x80) != 0)
703
goto _done;
704
705
if (d == 0)
706
s->ic_type = IC_ODIE;
707
else if ((d & 0x60) != 0)
708
s->ic_type = IC_OPUS;
709
else
710
goto _done;
711
712
outb(0xfa, ODIE_ADDR_IO(s->io_base));
713
if ((inb(ODIE_ADDR_IO(s->io_base)) & 0x9f) != 0x0a)
714
goto _done;
715
716
outb(0xfe, ODIE_ADDR_IO(s->io_base));
717
if ((inb(ODIE_ADDR_IO(s->io_base)) & 0x9f) != 0x0e)
718
goto _done;
719
720
outb(0xfe, ODIE_ADDR_IO(s->io_base));
721
d = inb(ODIE_DATA_IO(s->io_base));
722
if (s->type != SSCAPE_VIVO && (d & 0x9f) != 0x0e)
723
goto _done;
724
725
if (s->ic_type == IC_OPUS)
726
activate_ad1845_unsafe(s->io_base);
727
728
if (s->type == SSCAPE_VIVO)
729
wss_io += 4;
730
731
d = sscape_read_unsafe(s->io_base, GA_HMCTL_REG);
732
sscape_write_unsafe(s->io_base, GA_HMCTL_REG, d | 0xc0);
733
734
/* wait for WSS codec */
735
for (d = 0; d < 500; d++) {
736
if ((inb(wss_io) & 0x80) == 0)
737
break;
738
spin_unlock_irqrestore(&s->lock, flags);
739
msleep(1);
740
spin_lock_irqsave(&s->lock, flags);
741
}
742
743
if ((inb(wss_io) & 0x80) != 0)
744
goto _done;
745
746
if (inb(wss_io + 2) == 0xff)
747
goto _done;
748
749
d = sscape_read_unsafe(s->io_base, GA_HMCTL_REG) & 0x3f;
750
sscape_write_unsafe(s->io_base, GA_HMCTL_REG, d);
751
752
if ((inb(wss_io) & 0x80) != 0)
753
s->type = MEDIA_FX;
754
755
d = sscape_read_unsafe(s->io_base, GA_HMCTL_REG);
756
sscape_write_unsafe(s->io_base, GA_HMCTL_REG, d | 0xc0);
757
/* wait for WSS codec */
758
for (d = 0; d < 500; d++) {
759
if ((inb(wss_io) & 0x80) == 0)
760
break;
761
spin_unlock_irqrestore(&s->lock, flags);
762
msleep(1);
763
spin_lock_irqsave(&s->lock, flags);
764
}
765
766
/*
767
* SoundScape successfully detected!
768
*/
769
retval = 1;
770
771
_done:
772
spin_unlock_irqrestore(&s->lock, flags);
773
return retval;
774
}
775
776
/*
777
* ALSA callback function, called when attempting to open the MIDI device.
778
* Check that the MIDI firmware has been loaded, because we don't want
779
* to crash the machine. Also check that someone isn't using the hardware
780
* IOCTL device.
781
*/
782
static int mpu401_open(struct snd_mpu401 *mpu)
783
{
784
if (!verify_mpu401(mpu)) {
785
dev_err(mpu->rmidi->card->dev,
786
"sscape: MIDI disabled, please load firmware\n");
787
return -ENODEV;
788
}
789
790
return 0;
791
}
792
793
/*
794
* Initialise an MPU-401 subdevice for MIDI support on the SoundScape.
795
*/
796
static int create_mpu401(struct snd_card *card, int devnum,
797
unsigned long port, int irq)
798
{
799
struct soundscape *sscape = get_card_soundscape(card);
800
struct snd_rawmidi *rawmidi;
801
int err;
802
803
err = snd_mpu401_uart_new(card, devnum, MPU401_HW_MPU401, port,
804
MPU401_INFO_INTEGRATED, irq, &rawmidi);
805
if (err == 0) {
806
struct snd_mpu401 *mpu = rawmidi->private_data;
807
mpu->open_input = mpu401_open;
808
mpu->open_output = mpu401_open;
809
mpu->private_data = sscape;
810
811
initialise_mpu401(mpu);
812
}
813
814
return err;
815
}
816
817
818
/*
819
* Create an AD1845 PCM subdevice on the SoundScape. The AD1845
820
* is very much like a CS4231, with a few extra bits. We will
821
* try to support at least some of the extra bits by overriding
822
* some of the CS4231 callback.
823
*/
824
static int create_ad1845(struct snd_card *card, unsigned port,
825
int irq, int dma1, int dma2)
826
{
827
register struct soundscape *sscape = get_card_soundscape(card);
828
struct snd_wss *chip;
829
int err;
830
int codec_type = WSS_HW_DETECT;
831
832
switch (sscape->type) {
833
case MEDIA_FX:
834
case SSCAPE:
835
/*
836
* There are some freak examples of early Soundscape cards
837
* with CS4231 instead of AD1848/CS4248. Unfortunately, the
838
* CS4231 works only in CS4248 compatibility mode on
839
* these cards so force it.
840
*/
841
if (sscape->ic_type != IC_OPUS)
842
codec_type = WSS_HW_AD1848;
843
break;
844
845
case SSCAPE_VIVO:
846
port += 4;
847
break;
848
default:
849
break;
850
}
851
852
err = snd_wss_create(card, port, -1, irq, dma1, dma2,
853
codec_type, WSS_HWSHARE_DMA1, &chip);
854
if (!err) {
855
unsigned long flags;
856
857
if (sscape->type != SSCAPE_VIVO) {
858
/*
859
* The input clock frequency on the SoundScape must
860
* be 14.31818 MHz, because we must set this register
861
* to get the playback to sound correct ...
862
*/
863
snd_wss_mce_up(chip);
864
spin_lock_irqsave(&chip->reg_lock, flags);
865
snd_wss_out(chip, AD1845_CLOCK, 0x20);
866
spin_unlock_irqrestore(&chip->reg_lock, flags);
867
snd_wss_mce_down(chip);
868
869
}
870
871
err = snd_wss_pcm(chip, 0);
872
if (err < 0) {
873
dev_err(card->dev,
874
"sscape: No PCM device for AD1845 chip\n");
875
goto _error;
876
}
877
878
err = snd_wss_mixer(chip);
879
if (err < 0) {
880
dev_err(card->dev,
881
"sscape: No mixer device for AD1845 chip\n");
882
goto _error;
883
}
884
if (chip->hardware != WSS_HW_AD1848) {
885
err = snd_wss_timer(chip, 0);
886
if (err < 0) {
887
dev_err(card->dev,
888
"sscape: No timer device for AD1845 chip\n");
889
goto _error;
890
}
891
}
892
893
if (sscape->type != SSCAPE_VIVO) {
894
err = snd_ctl_add(card,
895
snd_ctl_new1(&midi_mixer_ctl, chip));
896
if (err < 0) {
897
dev_err(card->dev,
898
"sscape: Could not create MIDI mixer control\n");
899
goto _error;
900
}
901
}
902
903
sscape->chip = chip;
904
}
905
906
_error:
907
return err;
908
}
909
910
911
/*
912
* Create an ALSA soundcard entry for the SoundScape, using
913
* the given list of port, IRQ and DMA resources.
914
*/
915
static int create_sscape(int dev, struct snd_card *card)
916
{
917
struct soundscape *sscape = get_card_soundscape(card);
918
unsigned dma_cfg;
919
unsigned irq_cfg;
920
unsigned mpu_irq_cfg;
921
struct resource *io_res;
922
struct resource *wss_res;
923
unsigned long flags;
924
int err;
925
int val;
926
const char *name;
927
928
/*
929
* Grab IO ports that we will need to probe so that we
930
* can detect and control this hardware ...
931
*/
932
io_res = devm_request_region(card->dev, port[dev], 8, "SoundScape");
933
if (!io_res) {
934
dev_err(card->dev,
935
"sscape: can't grab port 0x%lx\n", port[dev]);
936
return -EBUSY;
937
}
938
wss_res = NULL;
939
if (sscape->type == SSCAPE_VIVO) {
940
wss_res = devm_request_region(card->dev, wss_port[dev], 4,
941
"SoundScape");
942
if (!wss_res) {
943
dev_err(card->dev, "sscape: can't grab port 0x%lx\n",
944
wss_port[dev]);
945
return -EBUSY;
946
}
947
}
948
949
/*
950
* Grab one DMA channel ...
951
*/
952
err = snd_devm_request_dma(card->dev, dma[dev], "SoundScape");
953
if (err < 0) {
954
dev_err(card->dev, "sscape: can't grab DMA %d\n", dma[dev]);
955
return err;
956
}
957
958
spin_lock_init(&sscape->lock);
959
sscape->io_res = io_res;
960
sscape->wss_res = wss_res;
961
sscape->io_base = port[dev];
962
963
if (!detect_sscape(sscape, wss_port[dev])) {
964
dev_err(card->dev, "sscape: hardware not detected at 0x%x\n",
965
sscape->io_base);
966
return -ENODEV;
967
}
968
969
switch (sscape->type) {
970
case MEDIA_FX:
971
name = "MediaFX/SoundFX";
972
break;
973
case SSCAPE:
974
name = "Soundscape";
975
break;
976
case SSCAPE_PNP:
977
name = "Soundscape PnP";
978
break;
979
case SSCAPE_VIVO:
980
name = "Soundscape VIVO";
981
break;
982
default:
983
name = "unknown Soundscape";
984
break;
985
}
986
987
dev_info(card->dev, "sscape: %s card detected at 0x%x, using IRQ %d, DMA %d\n",
988
name, sscape->io_base, irq[dev], dma[dev]);
989
990
/*
991
* Check that the user didn't pass us garbage data ...
992
*/
993
irq_cfg = get_irq_config(sscape->type, irq[dev]);
994
if (irq_cfg == INVALID_IRQ) {
995
dev_err(card->dev, "sscape: Invalid IRQ %d\n", irq[dev]);
996
return -ENXIO;
997
}
998
999
mpu_irq_cfg = get_irq_config(sscape->type, mpu_irq[dev]);
1000
if (mpu_irq_cfg == INVALID_IRQ) {
1001
dev_err(card->dev, "sscape: Invalid IRQ %d\n", mpu_irq[dev]);
1002
return -ENXIO;
1003
}
1004
1005
/*
1006
* Tell the on-board devices where their resources are (I think -
1007
* I can't be sure without a datasheet ... So many magic values!)
1008
*/
1009
spin_lock_irqsave(&sscape->lock, flags);
1010
1011
sscape_write_unsafe(sscape->io_base, GA_SMCFGA_REG, 0x2e);
1012
sscape_write_unsafe(sscape->io_base, GA_SMCFGB_REG, 0x00);
1013
1014
/*
1015
* Enable and configure the DMA channels ...
1016
*/
1017
sscape_write_unsafe(sscape->io_base, GA_DMACFG_REG, 0x50);
1018
dma_cfg = (sscape->ic_type == IC_OPUS ? 0x40 : 0x70);
1019
sscape_write_unsafe(sscape->io_base, GA_DMAA_REG, dma_cfg);
1020
sscape_write_unsafe(sscape->io_base, GA_DMAB_REG, 0x20);
1021
1022
mpu_irq_cfg |= mpu_irq_cfg << 2;
1023
val = sscape_read_unsafe(sscape->io_base, GA_HMCTL_REG) & 0xF7;
1024
if (joystick[dev])
1025
val |= 8;
1026
sscape_write_unsafe(sscape->io_base, GA_HMCTL_REG, val | 0x10);
1027
sscape_write_unsafe(sscape->io_base, GA_INTCFG_REG, 0xf0 | mpu_irq_cfg);
1028
sscape_write_unsafe(sscape->io_base,
1029
GA_CDCFG_REG, 0x09 | DMA_8BIT
1030
| (dma[dev] << 4) | (irq_cfg << 1));
1031
/*
1032
* Enable the master IRQ ...
1033
*/
1034
sscape_write_unsafe(sscape->io_base, GA_INTENA_REG, 0x80);
1035
1036
spin_unlock_irqrestore(&sscape->lock, flags);
1037
1038
/*
1039
* We have now enabled the codec chip, and so we should
1040
* detect the AD1845 device ...
1041
*/
1042
err = create_ad1845(card, wss_port[dev], irq[dev],
1043
dma[dev], dma2[dev]);
1044
if (err < 0) {
1045
dev_err(card->dev,
1046
"sscape: No AD1845 device at 0x%lx, IRQ %d\n",
1047
wss_port[dev], irq[dev]);
1048
return err;
1049
}
1050
strscpy(card->driver, "SoundScape");
1051
strscpy(card->shortname, name);
1052
snprintf(card->longname, sizeof(card->longname),
1053
"%s at 0x%lx, IRQ %d, DMA1 %d, DMA2 %d\n",
1054
name, sscape->chip->port, sscape->chip->irq,
1055
sscape->chip->dma1, sscape->chip->dma2);
1056
1057
#define MIDI_DEVNUM 0
1058
if (sscape->type != SSCAPE_VIVO) {
1059
err = sscape_upload_bootblock(card);
1060
if (err >= 0)
1061
err = sscape_upload_microcode(card, err);
1062
1063
if (err == 0) {
1064
err = create_mpu401(card, MIDI_DEVNUM, port[dev],
1065
mpu_irq[dev]);
1066
if (err < 0) {
1067
dev_err(card->dev,
1068
"sscape: Failed to create MPU-401 device at 0x%lx\n",
1069
port[dev]);
1070
return err;
1071
}
1072
1073
/*
1074
* Initialize mixer
1075
*/
1076
spin_lock_irqsave(&sscape->lock, flags);
1077
sscape->midi_vol = 0;
1078
host_write_ctrl_unsafe(sscape->io_base,
1079
CMD_SET_MIDI_VOL, 100);
1080
host_write_ctrl_unsafe(sscape->io_base,
1081
sscape->midi_vol, 100);
1082
host_write_ctrl_unsafe(sscape->io_base,
1083
CMD_XXX_MIDI_VOL, 100);
1084
host_write_ctrl_unsafe(sscape->io_base,
1085
sscape->midi_vol, 100);
1086
host_write_ctrl_unsafe(sscape->io_base,
1087
CMD_SET_EXTMIDI, 100);
1088
host_write_ctrl_unsafe(sscape->io_base,
1089
0, 100);
1090
host_write_ctrl_unsafe(sscape->io_base, CMD_ACK, 100);
1091
1092
set_midi_mode_unsafe(sscape->io_base);
1093
spin_unlock_irqrestore(&sscape->lock, flags);
1094
}
1095
}
1096
1097
return 0;
1098
}
1099
1100
1101
static int snd_sscape_match(struct device *pdev, unsigned int i)
1102
{
1103
/*
1104
* Make sure we were given ALL of the other parameters.
1105
*/
1106
if (port[i] == SNDRV_AUTO_PORT)
1107
return 0;
1108
1109
if (irq[i] == SNDRV_AUTO_IRQ ||
1110
mpu_irq[i] == SNDRV_AUTO_IRQ ||
1111
dma[i] == SNDRV_AUTO_DMA) {
1112
dev_info(pdev,
1113
"sscape: insufficient parameters, need IO, IRQ, MPU-IRQ and DMA\n");
1114
return 0;
1115
}
1116
1117
return 1;
1118
}
1119
1120
static int snd_sscape_probe(struct device *pdev, unsigned int dev)
1121
{
1122
struct snd_card *card;
1123
struct soundscape *sscape;
1124
int ret;
1125
1126
ret = snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE,
1127
sizeof(struct soundscape), &card);
1128
if (ret < 0)
1129
return ret;
1130
1131
sscape = get_card_soundscape(card);
1132
sscape->dev = pdev;
1133
sscape->type = SSCAPE;
1134
1135
dma[dev] &= 0x03;
1136
1137
ret = create_sscape(dev, card);
1138
if (ret < 0)
1139
return ret;
1140
1141
ret = snd_card_register(card);
1142
if (ret < 0) {
1143
dev_err(pdev, "sscape: Failed to register sound card\n");
1144
return ret;
1145
}
1146
dev_set_drvdata(pdev, card);
1147
return 0;
1148
}
1149
1150
#define DEV_NAME "sscape"
1151
1152
static struct isa_driver snd_sscape_driver = {
1153
.match = snd_sscape_match,
1154
.probe = snd_sscape_probe,
1155
/* FIXME: suspend/resume */
1156
.driver = {
1157
.name = DEV_NAME
1158
},
1159
};
1160
1161
#ifdef CONFIG_PNP
1162
static inline int get_next_autoindex(int i)
1163
{
1164
while (i < SNDRV_CARDS && port[i] != SNDRV_AUTO_PORT)
1165
++i;
1166
return i;
1167
}
1168
1169
1170
static int sscape_pnp_detect(struct pnp_card_link *pcard,
1171
const struct pnp_card_device_id *pid)
1172
{
1173
static int idx = 0;
1174
struct pnp_dev *dev;
1175
struct snd_card *card;
1176
struct soundscape *sscape;
1177
int ret;
1178
1179
/*
1180
* Allow this function to fail *quietly* if all the ISA PnP
1181
* devices were configured using module parameters instead.
1182
*/
1183
idx = get_next_autoindex(idx);
1184
if (idx >= SNDRV_CARDS)
1185
return -ENOSPC;
1186
1187
/*
1188
* Check that we still have room for another sound card ...
1189
*/
1190
dev = pnp_request_card_device(pcard, pid->devs[0].id, NULL);
1191
if (!dev)
1192
return -ENODEV;
1193
1194
if (!pnp_is_active(dev)) {
1195
if (pnp_activate_dev(dev) < 0) {
1196
dev_info(&dev->dev, "sscape: device is inactive\n");
1197
return -EBUSY;
1198
}
1199
}
1200
1201
/*
1202
* Create a new ALSA sound card entry, in anticipation
1203
* of detecting our hardware ...
1204
*/
1205
ret = snd_devm_card_new(&pcard->card->dev,
1206
index[idx], id[idx], THIS_MODULE,
1207
sizeof(struct soundscape), &card);
1208
if (ret < 0)
1209
return ret;
1210
1211
sscape = get_card_soundscape(card);
1212
sscape->dev = card->dev;
1213
1214
/*
1215
* Identify card model ...
1216
*/
1217
if (!strncmp("ENS4081", pid->id, 7))
1218
sscape->type = SSCAPE_VIVO;
1219
else
1220
sscape->type = SSCAPE_PNP;
1221
1222
/*
1223
* Read the correct parameters off the ISA PnP bus ...
1224
*/
1225
port[idx] = pnp_port_start(dev, 0);
1226
irq[idx] = pnp_irq(dev, 0);
1227
mpu_irq[idx] = pnp_irq(dev, 1);
1228
dma[idx] = pnp_dma(dev, 0) & 0x03;
1229
if (sscape->type == SSCAPE_PNP) {
1230
dma2[idx] = dma[idx];
1231
wss_port[idx] = CODEC_IO(port[idx]);
1232
} else {
1233
wss_port[idx] = pnp_port_start(dev, 1);
1234
dma2[idx] = pnp_dma(dev, 1);
1235
}
1236
1237
ret = create_sscape(idx, card);
1238
if (ret < 0)
1239
return ret;
1240
1241
ret = snd_card_register(card);
1242
if (ret < 0) {
1243
dev_err(card->dev, "sscape: Failed to register sound card\n");
1244
return ret;
1245
}
1246
1247
pnp_set_card_drvdata(pcard, card);
1248
++idx;
1249
return 0;
1250
}
1251
1252
static struct pnp_card_driver sscape_pnpc_driver = {
1253
.flags = PNP_DRIVER_RES_DO_NOT_CHANGE,
1254
.name = "sscape",
1255
.id_table = sscape_pnpids,
1256
.probe = sscape_pnp_detect,
1257
};
1258
1259
#endif /* CONFIG_PNP */
1260
1261
static int __init sscape_init(void)
1262
{
1263
int err;
1264
1265
err = isa_register_driver(&snd_sscape_driver, SNDRV_CARDS);
1266
#ifdef CONFIG_PNP
1267
if (!err)
1268
isa_registered = 1;
1269
1270
err = pnp_register_card_driver(&sscape_pnpc_driver);
1271
if (!err)
1272
pnp_registered = 1;
1273
1274
if (isa_registered)
1275
err = 0;
1276
#endif
1277
return err;
1278
}
1279
1280
static void __exit sscape_exit(void)
1281
{
1282
#ifdef CONFIG_PNP
1283
if (pnp_registered)
1284
pnp_unregister_card_driver(&sscape_pnpc_driver);
1285
if (isa_registered)
1286
#endif
1287
isa_unregister_driver(&snd_sscape_driver);
1288
}
1289
1290
module_init(sscape_init);
1291
module_exit(sscape_exit);
1292
1293